Repository navigation
finding(types): StackSchema, declared as Omit-of-FlexSchema-minus-type, erases every named member — it ships declaring only type, because Omit collapses under BaseSchema's index signature #6151
Description
extends Omit-of-FlexSchema-minus-type was rendered as extends Omit). Angle-bracket generics are therefore written in words throughout. The sanitizer strips a fragment that opens with an identifier in angle brackets, because it parses as an HTML tag; the escaped and elided spellings survive. Same hazard as AGENTS.md's "GitHub mutates body BYTES" clause.
Measured while sweeping #6143. Filed unassigned, not fixed there.
The fact
packages/types/dist/layout.d.ts:215 declares StackSchema as extending Omit of FlexSchema minus the key type, then redeclaring type: 'stack'. In words, because the literal spelling does not survive here:
export interface StackSchema extends Omit<FlexSchema, 'type'> { type: 'stack'; }
FlexSchema declares 25 members — gap, children, align, justify, direction, wrap, plus everything inherited from BaseSchema. StackSchema is intended to be all of them minus type.
It is not. Measured against the built dist through the gate's own derivePackageTypePaths():
FlexSchema -> 25 declared properties: align ariaLabel body children className data
description direction disabled disabledOn gap hidden hiddenOn id justify
label name placeholder style testId type visible visibleOn visibleWhen wrap
StackSchema -> 1 declared property: type
checker.getPropertyOfType(StackSchema, 'gap') returns false. Same for children, align, justify.
Why
FlexSchema inherits BaseSchema's [key: string]: any (#5155).
Omit of T minus K is defined as Pick of T over Exclude of keyof T minus K. And keyof T, on a type carrying a string index signature, is string | number — the literal member names are absorbed. So excluding 'type' from string | number still leaves string | number, and the Pick reconstructs a type that has the index signature and none of the named members.
This is the same absorption #5155's clarification comment measures, in its REJECT half — but here it does not merely fail to reject an unknown key, it deletes known ones from the shipped declaration.
What it costs
Nothing at runtime, and nothing that produces an error — which is why it has survived. What it costs is every tool that reads the declaration:
- Editor completion on
StackSchemaofferstypeand nothing else. An author writing a stack gets nogap, noalign, nojustify. - Any "check the docs against the shipped type" pass reads
stack.mdxas documenting keys that do not exist. finding(docs): component reference pages declare their owninterface, so the doc-snippet gate can never see the props they invent — 4 measured on the 5 pages #6122 PR 2 touched alone #6143's sweep flaggedgap,childrenandclassNameon that page as divergences; they are not — the docs are right and the type is wrong. Correcting the page to match its type, which is what that card would otherwise have done, would have deleted three correct entries. This card exists so the next sweep does not. StackSchemais a member of theLayoutSchemaunion (layout.d.ts:687), so the erasure propagates into anything narrowing that union.
Scope
StackSchema is the one measured. extends Omit and extends Pick across packages/*/src/**/*.ts would bound it.
Candidate directions, none ruled here
- Restate the members on
StackSchemainstead of deriving them — honest and immediate, but a duplicate to keep in sync. - Drop the Omit and let
StackSchemaextendFlexSchemadirectly, narrowingtype. An interface may narrow an inherited property only to a compatible subtype, and'stack'is not a subtype ofFlexSchema'stypeunless that is widened — so this needs checking rather than assuming. - Fix it at the root by removing the index signature from
BaseSchema— which is finding(types): BaseSchema's[key: string]: anyleaves every component schema open, so a "declare the surface" fix can never reject a misspelled TOP-LEVEL key #5155, already ruled (option C, phased zod.strict()). That ruling targets the rejection layer, not this erasure, so it is worth confirming whether its program incidentally closes this or leaves it standing.
The third is why this is filed rather than fixed: it may want sequencing behind #5155 rather than a local patch.
Refs: #5155 (the index signature, and the keyof absorption its clarification comment measures) · #6143 (where this surfaced) · #6150 (sibling finding from the same sweep, different mechanism).
Generated by Claude Code
Activity
[-]finding(types): `StackSchema = Omit<FlexSchema, 'type'>` erases every named member — the interface ships declaring only `type`, because `Omit` collapses under `BaseSchema`'s index signature[/-][+]finding(types): `StackSchema`, declared as Omit-of-FlexSchema-minus-type, erases every named member — it ships declaring only `type`, because Omit collapses under `BaseSchema`'s index signature[/+]claude commentedon Aug 25, 2026
Concentrated triage batch:
finding→pm:queue+domain:ui, Bug, M — a published type that ships EMPTY of its named members:StackSchema's Omit-of-FlexSchema collapses underBaseSchema's index signature, so the shipped declaration carries onlytype. Fix at the mechanism (restructure so the Omit survives — explicit member interface, or lift the index signature out of the inheritance path the Omit crosses), and add the emitted-dts pin the card's measurement used so a future collapse reds. Note the body's sanitizer warning: re-derive the exact spellings from the repo, not from this card's prose.Generated by Claude Code
yinlianghui commentedon Aug 25, 2026
Claimed + dispatched —
domain:ui@ objectui execution seatPM session
session_01CSoz9uGhaaSgiq3hshtN7L, branchclaude/issue-6151-stackschema-omit-collapse.The assignee field does not establish whose claim this is — this comment's session ID does. No earlier claim comment exists.
裁决 (binding)
Fix at the mechanism, not at the symptom.
StackSchemais a published type that ships EMPTY of its named members — itsOmit-of-FlexSchemacollapses underBaseSchema's index signature, so the shipped declaration carries onlytype.Restructure so the
Omitsurvives: either an explicit member interface, or lift the index signature out of the inheritance path theOmitcrosses. ⛔ Do not paper over it by re-declaring the members somewhere the collapse still happens downstream.Add the emitted-⚠️ That pin is the deliverable as much as the fix — this defect was invisible precisely because nothing looked at the emitted declaration.
.d.tspin the card's measurement used, so a future collapse goes red.Triage: "Note the body's sanitizer warning: re-derive the exact spellings from the repo, not from this card's prose." GitHub's comment sanitizer eats angle-bracket fragments, so generic parameters and
Omit<…>spellings in the card text may be mangled. Read the source.Also confirm: the collapse still reproduces on today's
main; which members are supposed to survive; and thatBaseSchema's index signature is the actual cause (this repo'sBaseSchemais.passthrough()with[key: string]: any— the #5155 structural ceiling — and it has produced surprising results twice tonight, including a dev correctly predicting a TS error that did not fire for exactly this reason).Traps
.d.ts, not the source. A source-level type assertion can pass while the emitted declaration is empty — that gap is this bug. Build the package, then assert againstdist.tscresolves workspace deps throughdistwhilevitestaliases tosrc/— measured tonight. A type-check red can be unbuilt siblings, a real error, or both (a dev got 15 errors: 14 noise + 1 real). Build the closure first, then classify every remaining error by name.pnpm --filter <pkg> exec vitest/cd packages/x && pnpm exec vitesthit a guard (objectui#3378) — one form refuses loudly, another silently runsapps/console's 22 files and reports green. Always run vitest from the repo root.Standing rules
Predict direction before running; prove mutations on disk by grepping injected AND separately removed text; print the landing site; assert anchor uniqueness; restore under
trap … EXIT INT TERMwith a cwd-independent command and confirmgit diff HEAD --statempty. Derive gates by enumerating each CI job's own step list. A cached turbo green is not a measurement —--force. Commit before you ablate.Changeset: a published type gains its declared members — state it in words. ⛔ Never
major.Collision bounds
packages/typesis yours.z.never()tombstone.describe()text) is open in the same package and is not yours — different files expected; ⛔ report any same-file overlap rather than resolving it. Eight sibling agents are live elsewhere — ⛔ do not editpackages/components/**,packages/plugin-form/**,packages/plugin-list/**,packages/plugin-detail/**,packages/core/**,packages/plugin-kanban/**,packages/plugin-map/**,packages/app-shell/src/utils/**,examples/schema-catalog/**,apps/site/**.⛔ Leave the PR draft — the PM lands it.
Generated by Claude Code
fix(types): StackSchema ships its declared members instead of collaps…
yinlianghui commentedon Aug 25, 2026
{ "issue": 6151, "status": "done", "branch": "claude/issue-6151-stackschema-omit-collapse", "pr": "https://github.com/objectstack-ai/objectui/pull/6267", "premise_still_valid": true, "summary": "The card's measurement reproduces exactly on today's main: at ef2a3bd8d the built dist/layout.d.ts declared FlexSchema with 25 properties and StackSchema with 1 (type), with getPropertyOfType false for gap/children/align/justify/direction/wrap. BaseSchema's [key: string]: any is confirmed as the cause by an isolated probe holding everything else constant: an identical Omit over an index-signature-bearing interface yields 1 property, over an index-signature-free one yields 2. Fixed at the mechanism per the 裁决 — the six flex/stack members move into a new exported interface FlexLayoutProps that does NOT inherit BaseSchema, and FlexSchema and StackSchema each extend BaseSchema, FlexLayoutProps, so no Omit crosses the index signature and the members are declared once rather than duplicated. The card's second candidate (extend FlexSchema directly) was measured unavailable: TS2430, 'stack' is not a subtype of type: 'flex'. FlexSchema is unchanged — its six member declarations moved byte-identically (diff exit 0 against ef2a3bd8d) and its emitted member set is the same 25 names, so the only declaration whose shape changed is StackSchema, 1 -> 25. Changeset is minor (never major); it can newly error a consumer writing gap: 'large', which the renderer never honoured.", "tests": "All vitest runs from the REPO ROOT (objectui#3378 guard). Build: pnpm --filter @object-ui/types build exit 0. Type-check: pnpm --filter @object-ui/types type-check exit 0 (tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json). Package suite: pnpm test packages/types/ -> 'Test Files 59 passed (59) / Tests 645 passed (645)', which includes zod-mirror-parity.test.ts — its layout.zod.ts#StackSchema pair previously passed VACUOUSLY (every mirror key compared against any) and now compares against real declared types. Lint: exit 0, 0 errors. Gates run: check-control-bytes, check-type-check-coverage, check-changeset-presence, check-changeset-no-major, check-vi-mock-specifiers, check-package-self-import — all exit 0, each read from the gate's own printed verdict line, not a piped $?. check-readme-exports exits 1 and is NOT this change: all 53 findings read 'type entry ./dist/index.d.ts is not on disk -- run pnpm build first' for packages outside the closure I built; zero mention packages/types and zero are of the fabricated/wrong-path kind the gate exists to catch (verified by grep -c). NEW PIN: packages/types/src/__tests__/stack-schema-emitted-members.test.ts, 13 assertions, reads the EMITTED declaration and not the source — and does NOT read dist/, because this repo's per-PR test job runs pnpm test with no build step (turbo test dependsOn ^build only, and packages/types has no workspace deps), so a dist-reading guard would be vacuous on a cold CI cache; instead it runs the package's own tsconfig through the compiler API and emits declarations to a scratch dir under node_modules/. ABLATION: prediction written before running (9 red / 4 green); observed exactly 'Tests 9 failed | 4 passed (13)'. Mutation proven on disk by grepping BOTH directions — the reverted Omit declaration back at 1 occurrence, the FlexLayoutProps heritage clause at 0 — plus git diff --stat showing 31 insertions / 2 deletions. REBUILD: not required and deliberately so — this pin compiles declarations in-process from source at test time rather than reading dist/, so the unbuilt-dist false-green hazard does not apply to it; the mutated source is what the in-test emit consumed, which the red result confirms. Restored under trap '<restore>' EXIT INT TERM with a cwd-independent command (git -C /abs/path checkout HEAD -- <path>); trap fired, git diff HEAD --stat empty and git status clean afterwards. Restore leg re-run green: 13 passed (13). The class tripwire named the damage itself: 'member erasure in the emitted declaration: [{\"name\":\"StackSchema\",\"missing\":[\"ariaLabel\",\"body\",\"children\",...19 members]}]'. DOWNSTREAM (this is a tightening): narrowed with evidence rather than by guess — FlexSchema's emitted member set is identical before/after and its members moved byte-identically, so only code naming StackSchema can be affected; that population is 3 packages by grep over packages/*/src, apps/*/src and examples/, and @object-ui/core, @object-ui/components and examples/schema-catalog all type-check green with the script name echoed in each run (guarding the zero-match --filter exits-0 trap). packages/components' two stack/layout test files also pass (10 tests). All figures above measured at 7fe11e01a, the final commit and current branch head.", "open_questions": [], "out_of_scope_findings": [ "filed as #6269: ObjectViewSchema's `table` and `form` slots (objectql.ts:1480/1486) declare ZERO properties — the identical Omit-under-index-signature collapse in PROPERTY position rather than a heritage clause (ObjectGridSchema has 61 declared properties; the Omit of it has 0). Not fixed in #6267: unlike StackSchema the correct replacement shape is a design question (which of 61 members are configuration vs identity), and fixing it is itself a tightening needing its own downstream sweep. ⚠️ Duplicate search could NOT be run — the GitHub search/list API was rate-limited for this user at filing time — so please dedupe at triage.", "not filed, reported here only (another agent's collision bound): packages/components/src/__tests__/stack-spacing-alias-removed.test.tsx:12 carries a prose comment reading `StackSchema extends Omit< FlexSchema, 'type' >`, now stale after this PR. Left untouched because packages/components belongs to a sibling agent in this batch.", "not filed, noted for whoever takes #6269: packages/types/src/index.ts:900 has a generic `& Partial< Omit< T, 'type' > >` whose collapse behaviour depends on what T is instantiated with — not measured." ] }Notes not in the JSON
unspaced
Omit<FlexSchema, 'type'>in a review note and GitHub silently truncated it toOmit— the same mangling that forced this card's rewrite. Every generic in the PR body isnow written spaced (
Omit< T, K >), which survives. All spellings in the fix werere-derived from the repo, never from the card's prose.
time. No gate status is claimed here beyond the local runs listed above.
packages/typeswas edited (plus one.changesetfile). finding(types): the ADR-0049
z.never()retirement tombstones refuse by name but their.describe()remediation text never reaches the author — runtime message is zod's generic "expected never" #6105's ADR-0049z.never()tombstone work is in the same package but differentfiles — no overlap with
layout.ts,index.ts, or the new test. None of the eightsibling-agent paths were touched.
Generated by Claude Code
yinlianghui commentedon Aug 25, 2026
os-dev-report
os-dev-reportHTML-comment marker and GitHub's sanitizer ate it on write — exactly thehazard this card is about, hit on this card's own report. Re-posted here with the marker as
literal text so the PM's scan can see it. The JSON is otherwise identical, with two
angle-bracket spellings inside the
testsstring un-mangled (trap … EXIT INT TERMand thegit checkoutpath placeholder, both of which the sanitizer had emptied).{ "issue": 6151, "status": "done", "branch": "claude/issue-6151-stackschema-omit-collapse", "pr": "https://github.com/objectstack-ai/objectui/pull/6267", "premise_still_valid": true, "summary": "The card's measurement reproduces exactly on today's main: at ef2a3bd8d the built dist/layout.d.ts declared FlexSchema with 25 properties and StackSchema with 1 (type), with getPropertyOfType false for gap/children/align/justify/direction/wrap. BaseSchema's [key: string]: any is confirmed as the cause by an isolated probe holding everything else constant: an identical Omit over an index-signature-bearing interface yields 1 property, over an index-signature-free one yields 2. Fixed at the mechanism per the 裁决 — the six flex/stack members move into a new exported interface FlexLayoutProps that does NOT inherit BaseSchema, and FlexSchema and StackSchema each extend BaseSchema plus FlexLayoutProps, so no Omit crosses the index signature and the members are declared once rather than duplicated. The card's second candidate (extend FlexSchema directly) was measured unavailable: TS2430, 'stack' is not a subtype of type: 'flex'. FlexSchema is unchanged — its six member declarations moved byte-identically (diff exit 0 against ef2a3bd8d) and its emitted member set is the same 25 names, so the only declaration whose shape changed is StackSchema, 1 to 25. Changeset is minor (never major); it can newly error a consumer writing gap: 'large', which the renderer never honoured.", "tests": "All vitest runs from the REPO ROOT (objectui#3378 guard). Build: pnpm --filter @object-ui/types build exit 0. Type-check: pnpm --filter @object-ui/types type-check exit 0 (tsc --noEmit, then tsconfig.examples.json, then tsconfig.test.json). Package suite: pnpm test packages/types/ gave 'Test Files 59 passed (59) / Tests 645 passed (645)', which includes zod-mirror-parity.test.ts — its layout.zod.ts#StackSchema pair previously passed VACUOUSLY (every mirror key compared against any) and now compares against real declared types. Lint: exit 0, 0 errors. Gates run: check-control-bytes, check-type-check-coverage, check-changeset-presence, check-changeset-no-major, check-vi-mock-specifiers, check-package-self-import — all exit 0, each read from the gate's own printed verdict line, not a piped $?. check-readme-exports exits 1 and is NOT this change: all 53 findings read 'type entry ./dist/index.d.ts is not on disk -- run pnpm build first' for packages outside the closure I built; zero mention packages/types and zero are of the fabricated/wrong-path kind the gate exists to catch (verified by grep -c). NEW PIN: packages/types/src/__tests__/stack-schema-emitted-members.test.ts, 13 assertions, reads the EMITTED declaration and not the source — and deliberately does NOT read dist/, because this repo's per-PR test job runs pnpm test with no build step (turbo test dependsOn ^build only, and packages/types has no workspace deps), so a dist-reading guard would be vacuous on a cold CI cache; instead it runs the package's own tsconfig through the compiler API and emits declarations to a scratch dir under node_modules/. ABLATION: prediction written before running (9 red / 4 green); observed exactly 'Tests 9 failed | 4 passed (13)'. Mutation proven on disk by grepping BOTH directions — the reverted Omit declaration back at 1 occurrence, the FlexLayoutProps heritage clause at 0 — plus git diff --stat showing 31 insertions / 2 deletions. REBUILD: not required, and that is a property of this pin rather than a skipped step — it compiles declarations in-process from source at test time instead of reading dist/, so the unbuilt-dist false-green hazard cannot apply; the mutated source is what the in-test emit consumed, which the red result confirms. Restored under a trap on EXIT INT TERM with a cwd-independent command (git -C with an absolute worktree path, checkout HEAD -- the file); the trap fired, and git diff HEAD --stat plus git status were both empty afterwards. Restore leg re-run green: 13 passed (13). The class tripwire named the damage itself: member erasure in the emitted declaration, StackSchema missing ariaLabel, body, children, className, data, description, disabled, disabledOn, hidden, hiddenOn, id, label, name, placeholder, style, testId, visible, visibleOn, visibleWhen — 19 members. DOWNSTREAM (this is a tightening): narrowed with evidence rather than by guess — FlexSchema's emitted member set is identical before/after and its members moved byte-identically, so only code naming StackSchema can be affected; that population is 3 packages by grep over packages/*/src, apps/*/src and examples/, and @object-ui/core, @object-ui/components and examples/schema-catalog all type-check green with the script name echoed in each run (guarding the zero-match --filter exits-0 trap). packages/components' two stack/layout test files also pass (10 tests). All figures above measured at 7fe11e01a, the final commit and current branch head.", "open_questions": [], "out_of_scope_findings": [ "filed as #6269: ObjectViewSchema's `table` and `form` slots (objectql.ts:1480/1486) declare ZERO properties — the identical Omit-under-index-signature collapse in PROPERTY position rather than a heritage clause (ObjectGridSchema has 61 declared properties; the Omit of it has 0). Not fixed in #6267: unlike StackSchema the correct replacement shape is a design question (which of 61 members are configuration vs identity), and fixing it is itself a tightening needing its own downstream sweep. ⚠️ Duplicate search could NOT be run — the GitHub search/list API was rate-limited for this user at filing time — so please dedupe at triage.", "not filed, reported here only (another agent's collision bound): packages/components/src/__tests__/stack-spacing-alias-removed.test.tsx:12 carries a prose comment quoting StackSchema's old Omit-of-FlexSchema-minus-type spelling, now stale after this PR. Left untouched because packages/components belongs to a sibling agent in this batch.", "not filed, noted for whoever takes #6269: packages/types/src/index.ts:900 has a generic intersection with Partial-of-Omit-of-T-minus-type whose collapse behaviour depends on what T is instantiated with — not measured." ] }Notes not in the JSON
unspaced generic in a review note and GitHub silently truncated it; and this report's own
first comment lost its HTML-comment marker the same way. Every generic in the PR body is
now written spaced (
Omit< T, K >), which survives. All spellings in the fix itself werere-derived from the repo, never from the card's prose.
draft-PR time. No gate status is claimed beyond the local runs listed above.
packages/typeswas edited, plus one.changesetfile. finding(types): the ADR-0049
z.never()retirement tombstones refuse by name but their.describe()remediation text never reaches the author — runtime message is zod's generic "expected never" #6105's ADR-0049z.never()tombstone work is in the same package but differentfiles — no overlap with
layout.ts,index.ts, or the new test. None of the eightsibling-agent paths were touched.
Generated by Claude Code
os-litant commentedon Aug 25, 2026
⛔ Correction: this card was NOT orphaned — PR #6267 exists. + review of that PR.
domain:ui@ objectui execution seat, PM sessionsession_01Mn4BZ5AVDM81pvfij1WwM9(os-litant).What I got wrong, and how I caught it
I classified this as one of seven cards whose agent had died, and started opening a draft PR to rescue "unpushed work". The API refused it: a PR already exists for this branch. PR #6267, opened 06:05Z — and it had been sitting in the open-PR listing I read at 07:00Z, where I failed to connect it to this card.
The other six reclaims stand — those branches carry zero content delta and have no PR. This one is different in both respects.
This stroke: assignee → this seat,
pm:dispatchedretained. ⛔ Not a re-dispatch, ⛔ no new agent. The card is in review, not in flight.Review of PR #6267 — the work is excellent
⭐ The ablation is the strongest I have reviewed in this lane. Predicted 9 red / 4 green before running; observed exactly that. And the four survivors are the right four — three are non-vacuity guards that exist to prove the population was read at all, and the fourth pins union discrimination, which this defect never broke. ✅ That is honest evidence grading, not a green screenshot.
⭐ The pin reads the emitted declaration, and explains why it must. A source-level assertion passes on the broken code — the index signature answers for the missing key with
any, andanysatisfies everything. That gap is the bug, so a guard that never opens the.d.tscannot see it. It also declines to readdist/— because this repo'stestjob runs with no build step (turbo'stestonlydependsOn: ["^build"], andpackages/typeshas no workspace deps, so nothing builds it), which would make adist-reading guard vacuous exactly where it is needed. It compiles through the API into a scratch dir instead. That is the "degenerate control" trap identified and defended against by name.⭐ The scope check answers the class, not the instance. Every
Omitinpackages/types/srcmeasured against the builtdist: three other heritage clauses healthy (theyOmitover spec types carrying no index signature), and two property-positionOmits that DO collapse (objectql.ts:1480/:1486,ObjectGridSchema61 → 0) — ⛔ deliberately not fixed here, because the correct replacement shape is a design question rather than a mechanical move. ✅ Filed separately rather than smuggled in. That is exactly the right call.⭐ The downstream sweep was narrowed with evidence, not by guess:
FlexSchema's emitted member set is identical before and after and its members moved byte-identically, so only code namingStackSchemacan be affected — three packages, all type-check green with the script name echoed in each run (guarding the zero-match---filter-exits-0 trap).Gates read by name: 27 checks — 24
success, 3skipped, zero failures, allcompleted.⛔ Two blockers to landing — neither is a defect in the work
mergeable_state: unknown, and the base is stale. PR base isef2a3bd8d;mainhas moved well past it. ⛔unknownis notcleanand is not a verdict. Needs amainmerge and a re-read before any landing decision.gap: 'large'on a stack node used to type-check through the index signature and is now atscerror." That is the mechanical Clause-② trigger. But there is no claim comment on this card at all — so noClause-②declaration was ever recorded, and the tier the original dispatch ran at died with the previous session.⛔ Unknown tier is not the same as sufficient tier. Treating "I can't see it" as "it's fine" is the exact fallacy this PR's own methodology rejects. So I am not landing it on my own authority.
✅ The merits are not in question — I would ACCEPT this on the work. What it needs is a tier ruling, not rework. Routed to the maintainer in the round report; the PR stays draft meanwhile.
_Generated by Claude Code
Generated by Claude Code
os-litant commentedon Aug 25, 2026
⛔ Withdrawing my own hold — I over-escalated. Landing PR #6267.
domain:ui@ objectui execution seat, PM sessionsession_01Mn4BZ5AVDM81pvfij1WwM9(os-litant).Earlier on this card I wrote that a Clause-② tier call was owed and that I would not land on my own authority, because the original dispatch tier died with the previous session and "unknown tier is not the same as sufficient tier."
That reasoning was wrong, and I am reversing it explicitly rather than quietly.
Why — the question was already answered, in the record I maintain
Two standing maintainer orders, both carried on the seat post (objectui#5560) and both of which I had already transcribed there myself:
needs:contract-reviewdoes not exist in objectui, so the compensating-label route is unavailable by construction, and that is precisely the situation the order was given for.⇒ The chain is complete: fable unavailable → opus with the reason on the card → straight to the queue. There was no open question. I raised one that the record had already closed, and held finished work on it.
What actually makes this Clause-② card safe
The skill is explicit that it is not the tier — it is the compensating evidence: a verdict flip measured in both directions, pinned in tests, plus a downstream
tscsweep against the newdist/*.d.ts. This PR carries both, in full:StackSchema1 → 25 declared properties,FlexSchemaunchanged at 25 with its members moved byte-identically (diffexit 0). The pin reads the emitted.d.ts, never the source, and the PR explains why a source-level assertion would pass on the broken code.StackSchema's shape changed, so only code naming it can be affected; that population is three packages, all type-check green with the script name echoed to guard the zero-match---filter-exits-0 trap.Gates, read by name
27 checks — 24
success, 3skipped, zero failures, allcompleted, read ~50 minutes after the run started. Base merged up to currentmain; head nowe51f5ea93.Disposition
Flipping ready and enqueuing. Path face is
packages/types/**+.changeset/— ⛔ no governed surface.Omits also collapse —objectql.ts:1480/:1486, both measuring 0 declared properties (ObjectGridSchemaalone has 61). ⛔ Correctly not fixed here; the right replacement shape is a design question. Needs its own card.packages/components/src/__tests__/stack-spacing-alias-removed.test.tsx:12carries a now-stale prose comment describing the oldOmitspelling. Follow-up.Generated by Claude Code
fix(types): StackSchema ships its declared members instead of collaps…