Repository navigation
spec-shape-gate: red on main for 5 hourly runs since fbb42d900. objectui's type-check fails on PR #24970's addRecord mode / formView retirement and on PR #24778's widened DroppedFieldsEvent.reason, and neither is registered #25055
Description
Filed by domain:cli seat 2 (seat post #22648) · os-justin · session session_01LmjU2x1faLZ39DVTFyVca6. Routed to domain:spec after #24483, which was the same kind of red with the same remedy. ⛔ Not a claim. The producing cards, #24692 and #24690, are both domain:spec, and both closed with the spec half landed.
What is red
The hourly Spec Shape Gate on main has failed five runs in a row. The first red is run 39517829351 at fbb42d900 (2026-10-20 23:52 UTC). The last green is run 39511291581 at e4d604efd (2026-10-20 22:53 UTC). The newest red read here is run 39541247204 at dfe60e3a0. No open card or PR in either repository names it.
The gate's annotations on that run name five new diagnostics. None of them is in scripts/ci/spec-shape-retirements.json:
| objectui file | Diagnostic | Producing change |
|---|---|---|
packages/types/src/__tests__/p2-spec-exports.test.ts:143, :144 |
TS2322 Type 'string' is not assignable to type '{ '[REMOVED] Key retired: run \os validate` for its migration.': never; }'` |
PR #24970 (fde7456352, closes #24692). The test authors addRecord: { mode: 'inline', formView: … } |
packages/types/src/__tests__/p1-spec-alignment.test.ts:184, :185 |
the same TS2322 | PR #24970, the same addRecord.mode / formView keys |
packages/data-objectstack/src/spec-symbol-batch6.test.ts:253 |
TS2344 Type 'false' does not satisfy the constraint 'true' |
PR #24778 (7532ea3c08, closes #24690). _ReasonIsTheEnum pins DroppedFieldsEvent['reason'] to exactly 'readonly' | 'readonly_when' | 'primary_key' | 'computed', and the spec added stored_expression |
The attribution is this seat's reading of git log e4d604efd..fbb42d900 -- packages/spec: those are the only two spec commits in the window, and each diagnostic names a key or member only that commit changed. The gate's own report step names the lane in its log. That log was not readable from here, so confirm the attribution there.
Why it went unnoticed
- [Decision] A list view's
addRecorddefaults (enabled true, position bottom, mode inline) are not what the renderer does: enforce the spec, or make the spec say what renders (objectui#13099) #24692's landing comment (6303999400): it ruled the objectui hazard out because "no objectstack workflow runs objectui's vitest". This gate does not run objectui's vitest. It runs objectui'stype-check, which compiles these test files. - spec(data): once PR #24673 lands, a client value for a stored-expression field is overwritten with no report —
DroppedFieldsEvent.reasonhas no value for "written, but recomputed", soonFieldsDropped/droppedFieldsstay silent #24690's landing comment (6303791150): it held its order behind app-shell: writeWarningToast needs astored_expressionrow before objectstack#24778 widensDroppedFieldsEvent.reason, or the pin bump turns red objectui#13178 (writeWarningToast's row). That covered the app code but not the exact-union pin inspec-symbol-batch6.test.ts.
What the gate asks
The workflow header (.github/workflows/spec-shape-gate.yml, "Who owns a red") makes an hourly red a main-red and the first work of the lane the report names. For an intentional retirement, the accepting seat:
- files the downstream objectui card;
- registers the retirement in
scripts/ci/spec-shape-retirements.json, one entry per retirement, withmatchespatterns per file plus acodeormessage, in the same act (cross-repo rule 3).
The next run then reads the diagnostics as known (registered: <card>). Per #24424 and #24483, the release gate reads this run.
Done when
- Two registry entries land on
objectstackmain, one each for PR feat(spec)!: addRecord says what renders — enabled required, position top, mode/formView retired #24970 and PR feat(spec,objectql): report a caller value a stored expression replaced, as DroppedFieldsEvent reason stored_expression #24778. Each names its downstream objectui card, or the objectui tests are fixed and the pin bumped first. - The next hourly
Spec Shape Gateonmainconcludessuccess, with the five diagnostics readknownor gone.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 21, 2026
Claim: a p1 main-red the maintainer moved to the front of this seat's queue (「25055 插队,你负责派发」). The card is
domain:spec, and thisdomain:devxseat takes it on that order. Serial dispatch under the maintainer's 「串行派发」.Session:
session_01FM29ZqLTrnPNXxijioZwMpAccount:
os-warren(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-25055-spec-shape-registryWorktree:
objectstack-issue-25055Domain:
domain:devx(card lanedomain:spec, taken on the maintainer's order)Seat:
domain:devx#1File surface:
scripts/ci/spec-shape-retirements.json: two entries in the grammarparseRegistryreads (scripts/ci/spec-shape-gate.mjs, THE REGISTRY).fde7456352), the retiredaddRecord.mode/formView. Twomatchespatterns, one per file (packages/types/src/__tests__/p2-spec-exports.test.ts,p1-spec-alignment.test.ts), eachTS2322plus its message; together they cover the four diagnostics (:143,:144,:184,:185). A pattern carries no line.downstream_cardtypes: two spec-alignment tests still authoraddRecord.mode/formView, which objectstack PR #24970 retired, so the Spec Shape Gate compiles objectui main red objectui#13308.7532ea3c08), the widenedDroppedFieldsEvent.reason. Onematchesonpackages/data-objectstack/src/spec-symbol-batch6.test.ts,TS2344.downstream_carddata-objectstack: the batch-6 spec-symbol pin statesDroppedFieldsEvent['reason']as exactly four members, and objectstack PR #24778 addedstored_expression, so the Spec Shape Gate compiles objectui main red objectui#13309.The two downstream cards were filed by this seat before this claim (cross-repo rule 3, the same act). Each pattern is measured from the gate run
39565602478atc67f244f5a, file plus code plus message, and is not wider than the diagnostic it names.Container & model:
S (two registry entries, proved on the PR's own path-filtered Spec Shape Gate run),mode:subagent,model: TIER_DEFAULTClause-②: no
Responsibility:
the hourly Spec Shape Gate on main has failed since fbb42d900 on five unregistered diagnostics from PRs #24970 and #24778, and the release gate reads that run (#25055)|none: the gate's attribution table reads only the newest 40 pulls of a 51-commit range, so neither producing PR appears in it|the next release's publish lane (scripts/ci/scheduled-full-run.mjs --release-gate) and every lane whose hourly run the red masksThread-read: none
Serial constraints cleared: no open PR in objectstack touches
scripts/ci/spec-shape-retirements.jsonor the gate, and no open PR in objectui touches the three named test files. No liveClaim:on apm:dispatchedcard names the registry (read at 2026-10-21T08:41Z). No dev of this session is in flight: qa(checklist): no clause drives the fresh-install order #24827 fixed —os migrate applyfirst on an empty database writes the organization-ownership birth marker, so the firstos serveboots instead of refusing #25054's PR has landed.Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
os-dev-report
{
"issue": 25055,
"status": "done",
"branch": "claude/issue-25055-spec-shape-registry",
"pr": "#25091",
"session": "session_01FM29ZqLTrnPNXxijioZwMp (subagent: the parent seat session, the Claude-Session line of this run)",
"premise_still_valid": true,
"summary": "Two entries were appended to scripts/ci/spec-shape-retirements.json (head cff984e, +33 / -0, the only file touched). Entry A: PR #24970, fde7456, objectstack-ai/objectui#13308, two TS2322 patterns, one each on packages/types p2-spec-exports.test.ts and p1-spec-alignment.test.ts. Entry B: PR #24778, 7532ea3, objectstack-ai/objectui#13309, one TS2344 pattern on packages/data-objectstack spec-symbol-batch6.test.ts. Each pattern is file + code + the full first-line message, taken from scheduled run 39565602478's own annotation lines. The premise held. The newest scheduled runs 39565602478 (c67f244) and 39573264707 (4feccc2) both carry exactly the five diagnostics and no sixth. objectui main 2794254099 has not touched the three files. git log e4d604e..fbb42d9 -- packages/spec lists exactly the two producing commits. The live proof is green: this PR's own path-filtered Spec Shape Gate run 39573841309 (job 119134344165, merge ref a10774c onto 4feccc2, objectui 2794254099) concluded success, reading all five diagnostics as known. Hourly run 39573264707 is red on the same objectstack base without the registry.",
"tests": "At head cff984e. (1) node scripts/ci/spec-shape-gate.mjs --self-test: exit 0, 'spec-shape-gate --self-test: 60/60 passed across 7 batteries'. (2) The scripted editor (re-parses; BASE a39389e blob c93a0f3dac round-trips byte-identical; messages taken from the run's ##[error] lines and checked against the two identical messages already registered for objectui#12654 / objectui#12711; new text starts with BASE's 3809-byte prefix through the last existing entry; exactly 2 appended, six keys in order; parseRegistry reads 5): exit 0, 'OK: 3 existing entries + $comment byte-unchanged (prefix of 3809 bytes), 2 entries appended, parseRegistry reads 5'. (3) The offline report legs ran 'node scripts/ci/spec-shape-gate.mjs report --log LOG --sha cff984e --status 2 --downstream /home/user/objectui --registry REG', with no --event. LOG was built from the run's five annotation lines in the runner's grouped shape. Head registry (blob 3ab0be6ba2) + the five: exit 0, '#### known -- 5 diagnostic(s) covered by 2 registered retirement(s)', with :253 known (registered: objectstack-ai/objectui#13309, objectstack PR #24778 …) and :143/:144/:184/:185 known (registered: objectstack-ai/objectui#13308, objectstack PR #24970 …), and 'spec-shape-gate: 5 diagnostic(s), all registered retirements -- known, not red.' CONTROL, BASE registry + the five: exit 1, '⛔ 5 NEW diagnostic(s) in 3 objectui file(s)'. Its five ::error messages equal the scheduled run's five ##[error] lines byte for byte except the sha (diff exit 0). CONTROL, head registry + a sixth TS2305 at spec-symbol-batch6.test.ts(20,10): exit 1, '⛔ 1 NEW diagnostic(s) in 1 objectui file(s)', with the five still known. Extra breadth leg (the limit the PR body states), head registry + another TS2344 with the same message at spec-symbol-batch6.test.ts(256,7): exit 0, '6 diagnostic(s), all registered retirements -- known, not red.' (4) Live: PR run 39573841309, check-run 119134344165, 'Spec Shape Gate', conclusion success. Its log reads '✅ No new shape break: every diagnostic below is a REGISTERED retirement.', '#### known -- 5 diagnostic(s) covered by 2 registered retirement(s)', 5 rows (batch6 :253 TS2344 to objectui#13309; p1-spec-alignment :184 and :185 and p2-spec-exports :143 and :144 TS2322 to objectui#13308), and 'spec-shape-gate: 5 diagnostic(s), all registered retirements -- known, not red.' Its wait was polled in the foreground, one check-run read a minute, 15 minutes against the 40-minute stop. No ablation: the diff is registry data, and no tested behaviour changed.",
"gates": "Local, at cff984e (the final head). 'node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack' names the tree objectstack-ai/objectstack at cff984e, 1 path, +33 / -0. It derived 22 commands, and all 22 exited 0, each code captured before any pipe: check-ci-filter-parity, check-closing-keyword-parity (+ --self-test), check-comment-mask-corpus, check-position-name-fold-loaders (+ --self-test), check-scripts-symbol-anchors (+ --self-test), check:agent-test-spelling, check:bash32-floor, check:cli-command-ids, check:cross-package-test-inputs ('OK: 31 package(s) read outside themselves, all declared …'), check:driver-memory-census, check:entry-guard, check:gitlink-declared, check:nul-bytes ('OK (scanned 11643 text file(s) … no raw ASCII control bytes)'), check:parse-guard, check:pnpm-filter-targets, check:pnpm-flag-spellings, check:refd-timer-probe, check:spec-shape-gate ('60/60 passed across 7 batteries'), check:watch-hint-literal. '--ran' on the COMMAND :: exit CODE record: 'Run reconciliation — 22 derived, 22 run, 0 NOT-MEASURED, 0 UNRUN.', a derived zero. 'git merge-tree --write-tree origin/main HEAD' at origin/main 4feccc2: exit 0, tree b3ba654e64. No package is touched, so the build closure and package tests do not apply. CI, PR #25091 check-runs at head cff984e: 46 runs, all completed, 0 failure. Spec Shape Gate success; Lint & Repo Gates success; TypeScript Type Check success; Test Core success (1/6..6/6 success); Governed Surface Queue Guard success; Build Core skipped (path); Check Changeset success; Check PR Size success; Auto Label success; Dogfood Regression Gate success; Check Documentation Links success; Lint · ESLint / CI, release & engine gates / PM dispatch-gates / docs & code guards / repo & tooling gates / three scoped lanes success; Type Check · consumer gates / debt ledger / source gates / workspace success; the three claim / Part-of guards success; the rest skipped by their selectors. The derivation's NOT MEASURED rows (the two workflow-valued families, the Test Core job steps, the four type-check lanes) are answered by those CI check-runs, not by a local run.",
"dogfood_battery": "n/a — no
!in the PR title and no (narrowing) arm (Clause-②: no)","mcp_calls": "5 — mcp__github__get_job_logs x5, read only: job 119106999551 (scheduled run 39565602478), job 119134204410 (relay run 39573799641, for the label leg line), job 119134344165 x2 (this PR's gate run, two tail widths), job 119132441427 (scheduled run 39573264707). No MCP write tool.",
"api_writes": "2 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write as objectstack-fleet[bot]. (1) pr_create, relay run 39573799641: POST /repos/objectstack-ai/objectstack/pulls answered 201 #25091 (draft; body read back 10703 bytes sent, 10703 stored, identical), POST /repos//issues/25091/assignees answered 201 (os-warren), POST /repos//issues/25091/labels answered 200 (labels skip-changeset). (2) This os-dev-report comment, through scripts/pm/post-stamped.mjs: POST /repos//issues/25055/comments. Also two git pushes of the branch, which are not REST writes. There was no review request, no ready flip, no workflow_dispatch and no re-run.",
"cleanup": "The node_modules of /home/user/objectstack-issue-25055 was removed before this comment. The worktree itself is removed with git worktree remove, with no --force, right after this comment posts, because post-stamped.mjs runs from it. The tree is clean, and HEAD equals origin/claude/issue-25055-spec-shape-registry at cff984e. No dev server, watcher or background process was started. /home/user/objectui was only read and never written, fetched or switched.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed · The three existing registry entries (objectstack-ai/objectui#12654, objectstack-ai/objectui#12711, objectstack-ai/objectui#13022) match nothing in scheduled runs 39565602478 and 39573264707 or in this PR's run 39573841309. All three cards are closed as completed (2026-10-16, 2026-10-16, 2026-10-19). The registry $comment says an entry is deleted once its card is done, so the three are due for pruning. Ruling 2 kept them byte-unchanged here. In the PR body's Acceptance notes · dedupe words: spec-shape-retirements prune, registry entry matched nothing, objectui 12654 12711 13022",
"carrier: none · noted, not filed · On pr_create, the seat-side read-back of scripts/pm/fleet-write/dispatch.mjs prints the body byte count and the assignees, but no label list. The label verdict (POST …/issues/25091/labels, HTTP 200, '1 label(s) now on the pull · labels skip-changeset') appears only in the relay run's job log from execute.mjs. The role file says that leg's read-back is the line the relay reports, and that the line must list every label sent. Here it was read from the run log and confirmed by a REST read of the pull (labels: skip-changeset) · dedupe words: fleet-write read-back labels pr_create, dispatch.mjs label leg line"
],
"deviations": [
"The route read (node scripts/pm/fleet-write/dispatch.mjs --route) prints, in its own re-exec info line, the value of HTTPS_PROXY (a local proxy address). It was named here by variable only, and no environment dump was run.",
"The commit uses the model-free trailer pair AGENTS.md requires (Claude-Session + Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By line. The PR body ends with AGENTS.md's session-URL footer, not the harness's form. AGENTS.md outranks the reminder, and the reminder defers to repo instructions.",
"The role file was read from origin/main (it adds dogfood_battery). The shared checkout /home/user/objectstack holds an older os-dev.md on another branch.",
"Ruling 4 is a per-card exception to the role file's no-waiting-on-CI rule. It was executed in the foreground (a node poller, one check-run read a minute, no background watcher), and the report was delivered after the gate concluded.",
"The live proof is not in the PR body: the body is written once, at create, with no PATCH. The body says the live reading is in this comment. No body change is asked for.",
"The hand-built log uses the runner's grouped shape (##[group] PKG:type-check headers). Precedent #24485 used the turbo-prefixed shape. parseDiagnostics reads both. The breadth leg is an extra, informational leg beyond the two controls the ruling asked for."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
Landed ·
domain:devxseat 1 ·session_01FM29ZqLTrnPNXxijioZwMp· 2026-10-21T10:00Z8f59304ddc(ACCEPT6312585529; not governed;Refs #25055)origin/main, by contentscripts/ci/spec-shape-retirements.jsonis byte-identical to the headcff984e88d(blob3ab0be6ba2)State change: none yet. The card stays open and
pm:dispatched. Its second done-when clause is the next hourlySpec Shape Gateschedulerun onmainat or after8f59304ddc. The run already in progress (39580712387) is at1862d8d130, before this merge, so it does not count.This seat reads that run and acts on it:
success, this seat closes the cardcompletedand takespm:dispatchedoff;On
main, the gate's registry now carries:addRecord.mode/formView(PR feat(spec)!: addRecord says what renders — enabled required, position top, mode/formView retired #24970), with types: two spec-alignment tests still authoraddRecord.mode/formView, which objectstack PR #24970 retired, so the Spec Shape Gate compiles objectui main red objectui#13308 as its downstream card;DroppedFieldsEvent.reason(PR feat(spec,objectql): report a caller value a stored expression replaced, as DroppedFieldsEvent reason stored_expression #24778), with data-objectstack: the batch-6 spec-symbol pin statesDroppedFieldsEvent['reason']as exactly four members, and objectstack PR #24778 addedstored_expression, so the Spec Shape Gate compiles objectui main red objectui#13309.Each entry is deleted when its card closes.
Generated by Claude Code
objectstack-fleet commentedon Oct 21, 2026
Closed
completed·domain:devxseat 1 ·session_01FM29ZqLTrnPNXxijioZwMp· 2026-10-21T11:11ZBoth done-when clauses hold:
main8f59304ddc(landing record6313258205): PR #24970 → objectstack-ai/objectui#13308, PR #24778 → objectstack-ai/objectui#13309Spec Shape Gateonmainconcludessuccessschedulerun39588090692at5050442bb9(a descendant of8f59304ddc), objectuimain78bd6d732b:success,COMPILE_STATUS: 0, "✅ objectstack-ai/objectui type-checks against@objectstack/*at that commit."The five diagnostics are gone, not just read
known. objectui caught up within the hour:13c92e78d0) states the batch-6 pin withstored_expressionsubtracted, which closed data-objectstack: the batch-6 spec-symbol pin statesDroppedFieldsEvent['reason']as exactly four members, and objectstack PR #24778 addedstored_expression, so the Spec Shape Gate compiles objectui main red objectui#13309 at 2026-10-21T10:09Z.f5e42cad47) stops authoringaddRecord.mode/formView, which closed types: two spec-alignment tests still authoraddRecord.mode/formView, which objectstack PR #24970 retired, so the Spec Shape Gate compiles objectui main red objectui#13308 at 2026-10-21T10:21Z.The run lists all five registered entries as "matched nothing in this run". Per the registry's
$comment, each is now due for deletion, because each downstream card is closedcompleted: objectstack-ai/objectui#12654, #12711, #13022, #13308 and #13309. That pruning is carded as #25108 (p3).pm:dispatchedcomes off in this act.Generated by Claude Code