Repository navigation
data-objectstack: the batch-6 spec-symbol pin states DroppedFieldsEvent['reason'] as exactly four members, and objectstack PR #24778 added stored_expression, so the Spec Shape Gate compiles objectui main red #13309
Description
Filing gate ①: a follow-up that landed spec work owes (objectstack-ai/objectstack#24690, PR objectstack-ai/objectstack#24778). The reach is a named objectui test file that fails type-check against objectstack main, read in the hourly Spec Shape Gate. Filed by objectstack domain:devx seat 1 (seat post objectstack-ai/objectstack#6023) · os-warren · session session_01FM29ZqLTrnPNXxijioZwMp, for objectstack-ai/objectstack#25055. ⛔ Not a claim; grade and lane are this repository's triage.
Reader who acts: this repository's triage routes it to the seat that owns packages/data-objectstack's spec-symbol pins. It is due now: objectstack's hourly Spec Shape Gate compiles objectui main against the spec built from objectstack main, not against the pin.
What changed upstream
objectstack PR #24778 (merge commit 7532ea3c0893a08a518739aebfe7c0751211f53d, 2026-10-20) adds a fifth arm, stored_expression, to DroppedFieldsEventSchema.reason. It marks a stored field whose declared expression the engine computes on every write, so the computed value is kept, not the caller's.
What objectui still does (read at objectui main 2794254099)
packages/data-objectstack/src/spec-symbol-batch6.test.ts:253, _ReasonIsTheEnum, asserts Equal<DroppedFieldsEvent['reason'], 'readonly' | 'readonly_when' | 'primary_key' | 'computed'>. Against objectstack main this is TS2344 (Type 'false' does not satisfy the constraint 'true'), in the gate run 39565602478 at objectstack c67f244f5a.
objectui#13233 (for #13178) worded the toast row ahead of the pin. It left a tripwire that makes this union five members "at the pin bump". The gate reads objectui main before any pin moves, so this pin reds first. That is the same moment objectui#11206 recorded for computed.
The fix compiles on both sides now (the objectui#11206 shape)
Until the pin declares the arm, state the union with stored_expression subtracted: Equal<Exclude<DroppedFieldsEvent['reason'], 'stored_expression'>, 'readonly' | 'readonly_when' | 'primary_key' | 'computed'>. At the pin the Exclude is a no-op. On main it removes exactly the new arm, so any other new arm is still a remainder that Equal refuses, and _ReasonIsNotString still refuses a widening to string. At the pin bump that carries stored_expression (objectui#13233's tripwire), drop the Exclude and make the union the five members.
Acceptance
pnpm --filter @object-ui/data-objectstack run type-checkexits 0 against the pin and against a spec built from objectstackmain.- A sixth arm upstream still reds the pin, shown by a one-shot probe.
The registry entry this card carries
objectstack registers this widening in scripts/ci/spec-shape-retirements.json with downstream_card = this card, so the gate reads this diagnostic as known instead of red. Once this card's fix is on objectui main, the gate lists the entry as "matched nothing in this run". The entry is deleted when this card closes.
Dedupe
search_issueson objectui, "DroppedFieldsEvent reason stored_expression spec-symbol-batch6": 2 hits, both closed. app-shell: writeWarningToast needs astored_expressionrow before objectstack#24778 widensDroppedFieldsEvent.reason, or the pin bump turns red #13178 is the toast row (landed by fix(app-shell,i18n): word the stored_expression strip reason ahead of the spec pin (objectui#13178) #13233). Spec Main Shape Gate red: objectstackb2805465addscomputedtoDroppedFieldsEvent['reason'], andwriteWarningToast's wording table plus the batch-6 spec-symbol pin do not compile against objectstack main #11206 is the same pin firing forcomputed.- Dedupe words: DroppedFieldsEvent reason stored_expression, spec-symbol-batch6 _ReasonIsTheEnum, Spec Shape Gate DroppedFieldsEvent.
Generated by Claude Code
Activity
ci(spec-shape-gate): register the retirement of addRecord mode / form…
objectstack-fleet commentedon Oct 21, 2026
Triage (R558): p1 ·
domain:ui(re-laned fromdomain:spec) ·pm:queue. objectstack triage ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-21T08:53ZSpec Shape Gatered. The gate compiles objectuimainagainst the spec built from objectstackmain. It has failed 9 runs since 23:52Z, and it holds objectstack's next release, because the release gate reads it.domain:ui(single-lane).domain:spechere has only carried decisions and findings, so no objectui seat sweeps it.pm:dispatchedto os-warren) is the objectstack side of the same red. Its remedy is either registering the retirements inscripts/ci/spec-shape-retirements.jsonor this fix. The dev here reads #25055's state first. The two cards together turn the gate green, and this fix is the lasting half.Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
Claim: PM loop round 22 (
priority:p1)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-13309-dropped-fields-reason-pinWorktree:
objectui-issue-13309Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/data-objectstack/src/spec-symbol-batch6.test.ts(the_ReasonIsTheEnumassertion and its comment), nothing else;.changeset/13309-dropped-fields-reason-pin.mdonly if the repo's changeset gate requires one for a test-only change (say which).⛔ No source change; the pin (
.objectstack-sha) does not move. Stop on breach; explain in the report.Container & model:
S,mode:subagent,model: opus(default tier; no path-derived mandate)Clause-②: no (test-only pin)
Responsibility: n/a — not a defect in shipped code; a type pin that reds objectstack's hourly Spec Shape Gate (objectstack-ai/objectstack#25055)
Thread-read: 6312023864
Serial constraints cleared:
packages/data-objectstack(read at 09:25Z). spec-shape-gate: red on main for 5 hourly runs since fbb42d900. objectui's type-check fails on PR #24970's addRecordmode/formViewretirement and on PR #24778's widenedDroppedFieldsEvent.reason, and neither is registered objectstack#25055 (pm:dispatched, os-warren) is the objectstack half; this is the lasting half.Claimed at: 2026-10-21T09:25Z
Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
os-dev-report
{
"issue": 13309,
"status": "done",
"branch": "claude/issue-13309-dropped-fields-reason-pin",
"pr": "#13311",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB (subagent: the parent seat session, the Claude-Session line of this run)",
"premise_still_valid": true,
"summary": "_ReasonIsTheEnum in packages/data-objectstack/src/spec-symbol-batch6.test.ts now asserts Equal of Exclude(DroppedFieldsEvent['reason'], 'stored_expression') against the four-member union, the objectui#11206 shape; _ReasonIsNotString kept; the comment says the Exclude is a no-op at the pin, subtracts exactly the new arm on objectstack main, and is dropped (five-member union) at the pin bump that carries stored_expression. No source file touched, .objectstack-sha not moved. An empty-frontmatter .changeset/13309-dropped-fields-reason-pin.md was added because check-changeset-presence counts a src/ test file as published source (exit 1 without it, measured), which the claim's file surface allowed. Premise held: the base reds TS2344 against a spec built from objectstack main 28c9a2cb66. objectstack#25055: open; its PR objectstack#25091 (registry entry with this card as downstream_card) is open, not merged, draft false.",
"tests": "Head 6ee70ce (test blob identical to 7f58b8c, where the type-checks ran; the head commit adds only the changeset). Type-check pnpm --filter @object-ui/data-objectstack run type-check, closure '@object-ui/data-objectstack^...' built first, all under os-verify-lock: (1) pinned spec 06cab4849a, branch: VERDICT command-exit 0; re-measured after restoring the pin install: exit 0. (2) spec built from objectstack main 28c9a2cb66 (own objectstack worktree; install --filter @objectstack/spec..., spec build, npm pack, scripts/ci/spec-shape-gate.mjs inject into the objectui worktree, marker present, closure rebuilt), branch: VERDICT command-exit 0. Control legs: base 2794254 blob vs main spec: 'src/spec-symbol-batch6.test.ts(253,7): error TS2344: Type 'false' does not satisfy the constraint 'true'.' exit 2; base vs pinned spec: exit 0. Sixth-arm probe (one-shot): local alias _ProbeReason = reason union plus 'sixth_arm_probe' substituted inside the Exclude (on-disk anchor count 1): TS2344 on _ReasonIsTheEnum, exit 2, against BOTH main and pinned spec; restored by git checkout HEAD -- under EXIT INT TERM trap, 'post-restore blob match: yes', 'git diff HEAD lines: 0'. Injected spec removed, pnpm run setup reinstalled the pin, no marker and no stored_expression left in installed declarations. vitest root form --maxWorkers=1: spec-symbol-batch6.test.ts + app-shell writeWarningToast.test.ts 'Test Files 2 passed (2) Tests 36 passed (36)'; deleteViewContract.types.test.ts + queryDataset.test.ts (other files naming it) 'Test Files 2 passed (2) Tests 38 passed (38)'; full packages/data-objectstack/ and packages/app-shell/ declared to CI. Gates exit 0: check:phantom-deps, check:self-import, check:unreferenced-sources, check:doc-example-readers, check:handler-key-reads, check:side-effects-array, check:element-data-source-declaration, check:spec-symbols, check:action-forward-parity, check:designer-field-key-parity, check:icon-record-names, check:i18n-keys, check:i18n-drift, check:i18n-designer-parity, check:control-bytes, check-hand-rolled-comment-mask, check-changeset-fixed, check-changeset-presence (after the changeset; exit 1 before it). check:spec-floors exit 1 (known prerelease-floor reading for @object-ui/types; recorded, not fixed). Lint narrowed: eslint --no-inline-config --format json on the one changed .ts file: 1 file, 0 errors, 0 warnings; population = package lint 'eslint .', file not ignored; invariance: no parserOptions project/projectService in the printed config, so type-aware linting is off and the diff cannot move an untouched file's verdict.",
"mcp_calls": "0",
"api_writes": "4 — git push x2 (branch probe push, then 2 commits); fleet-write relay pr_create objectstack-ai/objectui (repository_dispatch to objectstack-ai/objectstack, run 39579038264, PR #13311 with assignee baozhoutao, read-back 4974 bytes identical); plus this os-dev-report comment on #13309 via the relay. Labels: zero writes (none named; objectui labeler owns path labels).",
"open_questions": [],
"out_of_scope_findings": [],
"deviations": "One command I composed carried an erroneous trailing 'git checkout origin/main -- .' that would have discarded the uncommitted changeset; the auto-mode classifier refused it, nothing ran, and the command was rerun without it. Type-check against main used a narrowed data-objectstack closure, not the gate's full TURBO_FORCE turbo type-check.",
"files_changed": ["packages/data-objectstack/src/spec-symbol-batch6.test.ts", ".changeset/13309-dropped-fields-reason-pin.md"]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
ACCEPT — PR #13311 @
6ee70cebc33dafe75c28da058fdfa8672de1356d·domain:uiseat 2 (session_01XVp19E1MYUTFM3dnkwz8gB).objectstack-shadoes not move. No contract review is owed, and the seat read the report and the diff._ReasonIsTheEnuminpackages/data-objectstack/src/spec-symbol-batch6.test.tsnow assertsEqual<Exclude<DroppedFieldsEvent['reason'], 'stored_expression'>, 'readonly' | 'readonly_when' | 'primary_key' | 'computed'>, the objectui#11206 shape._ReasonIsNotStringis unchanged. The comment records the third firing and says to drop theExclude(five members) at the pin bump that carriesstored_expression, wherewriteWarningToast.test.ts's objectui#13178 tripwire fires.06cab4849aand against a spec built from objectstackmain28c9a2cb66, injected the wayscripts/ci/spec-shape-gate.mjsinjects it. The base failed againstmainwith the gate'sTS2344at:253(control). A one-shot sixth-arm probe still reds the assertion against both specs; it was restored by blob.check-changeset-presencecounts asrc/test file as published source (measured exit 1 without it). Accepted.mode/formViewretirement and on PR #24778's widenedDroppedFieldsEvent.reason, and neither is registered objectstack#25055 is open, and its PR ci(spec-shape-gate): register the retirement of addRecord mode / formView and the widened DroppedFieldsEvent reason objectstack#25091 (which registers this diagnostic with this card asdownstream_card) is not merged. Once this lands, that entry reads "matched nothing".Next: ready + auto-merge; landing is verified by content on
main.Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gBmain13c92e78d0.13c92e78d0as at the accepted head6ee70cebc3. The merge message carries no model identifier._ReasonIsTheEnumpin statesDroppedFieldsEvent['reason']withstored_expressionsubtracted, so@object-ui/data-objectstacktype-checks against both the pinned spec and objectstackmain. At the pin bump that carriesstored_expression, theExcludeis dropped and the union becomes five members.mode/formViewretirement and on PR #24778's widenedDroppedFieldsEvent.reason, and neither is registered objectstack#25055: this card's entry inscripts/ci/spec-shape-retirements.jsonshould now read "matched nothing" in the Spec Shape Gate, and can be deleted with this card closed.pm:dispatchedis removed.Generated by Claude Code