You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
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
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 main2794254099)
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-check exits 0 against the pin and against a spec built from objectstack main.
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.
Why p1: this is one of the two objectui files that keep objectstack's hourly Spec Shape Gate red. The gate compiles objectui main against the spec built from objectstack main. It has failed 9 runs since 23:52Z, and it holds objectstack's next release, because the release gate reads it.
The lane: objectui's execution lane is domain:ui (single-lane). domain:spec here has only carried decisions and findings, so no objectui seat sweeps it.
Coordination: objectstack#25055 (p1, pm:dispatched to os-warren) is the objectstack side of the same red. Its remedy is either registering the retirements in scripts/ci/spec-shape-retirements.json or 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.
Claim: PM loop round 22 (priority:p1)
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-13309-dropped-fields-reason-pin
Worktree: objectui-issue-13309
Domain: domain:ui
Seat: domain:ui#2
File surface:
packages/data-objectstack/src/spec-symbol-batch6.test.ts (the _ReasonIsTheEnum assertion and its comment), nothing else;
one .changeset/13309-dropped-fields-reason-pin.md only 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:
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"]
}
Clause-②: no. A test-only type pin; no source file changes and .objectstack-sha does not move. No contract review is owed, and the seat read the report and the diff.
Seat review: _ReasonIsTheEnum in packages/data-objectstack/src/spec-symbol-batch6.test.ts now asserts Equal<Exclude<DroppedFieldsEvent['reason'], 'stored_expression'>, 'readonly' | 'readonly_when' | 'primary_key' | 'computed'>, the objectui#11206 shape. _ReasonIsNotString is unchanged. The comment records the third firing and says to drop the Exclude (five members) at the pin bump that carries stored_expression, where writeWarningToast.test.ts's objectui#13178 tripwire fires.
Measured: the type-check exits 0 against the pinned spec 06cab4849a and against a spec built from objectstack main28c9a2cb66, injected the way scripts/ci/spec-shape-gate.mjs injects it. The base failed against main with the gate's TS2344 at :253 (control). A one-shot sixth-arm probe still reds the assertion against both specs; it was restored by blob.
Changeset: an empty-frontmatter changeset, because check-changeset-presence counts a src/ test file as published source (measured exit 1 without it). Accepted.
Verified by content: each of the 2 files the PR changes has the same blob at 13c92e78d0 as at the accepted head 6ee70cebc3. The merge message carries no model identifier.
Landed: the batch-6 _ReasonIsTheEnum pin states DroppedFieldsEvent['reason'] with stored_expression subtracted, so @object-ui/data-objectstack type-checks against both the pinned spec and objectstack main. At the pin bump that carries stored_expression, the Exclude is dropped and the union becomes five members.
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