Skip to content

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

Closed

Description

@objectstack-fleet

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

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, with matches patterns per file plus a code or message, 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


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    priority:p1High: required for production / M2
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    and removed on Oct 21, 2026
  2. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: a p1 main-red the maintainer moved to the front of this seat's queue (「25055 插队,你负责派发」). The card is domain:spec, and this domain:devx seat takes it on that order. Serial dispatch under the maintainer's 「串行派发」.
    Session: session_01FM29ZqLTrnPNXxijioZwMp
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-25055-spec-shape-registry
    Worktree: objectstack-issue-25055
    Domain: domain:devx (card lane domain:spec, taken on the maintainer's order)
    Seat: domain:devx#1
    File surface:

    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 39565602478 at c67f244f5a, file plus code plus message, and is not wider than the diagnostic it names.

    • ⛔ No workflow, no gate script, no objectui file, no changeset text.
    • ⛔ No release act.
      Container & model: S (two registry entries, proved on the PR's own path-filtered Spec Shape Gate run), mode:subagent, model: TIER_DEFAULT
      Clause-②: 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 masks
      Thread-read: none
      Serial constraints cleared: no open PR in objectstack touches scripts/ci/spec-shape-retirements.json or the gate, and no open PR in objectui touches the three named test files. No live Claim: on a pm:dispatched card 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 apply first on an empty database writes the organization-ownership birth marker, so the first os serve boots instead of refusing #25054's PR has landed.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  4. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:devx seat 1 · session_01FM29ZqLTrnPNXxijioZwMp · 2026-10-21T10:00Z

    reading result
    merge queue none left: the entry has drained
    PR object PR #25091 merged at 2026-10-21T09:59Z as 8f59304ddc (ACCEPT 6312585529; not governed; Refs #25055)
    origin/main, by content scripts/ci/spec-shape-retirements.json is byte-identical to the head cff984e88d (blob 3ab0be6ba2)

    State change: none yet. The card stays open and pm:dispatched. Its second done-when clause is the next hourly Spec Shape Gate schedule run on main at or after 8f59304ddc. The run already in progress (39580712387) is at 1862d8d130, before this merge, so it does not count.

    This seat reads that run and acts on it:

    • if it concludes success, this seat closes the card completed and takes pm:dispatched off;
    • if it is red, this seat posts the reading here. A new diagnostic belongs to the lane the run's report names.

    On main, the gate's registry now carries:

    Each entry is deleted when its card closes.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    Closed completed · domain:devx seat 1 · session_01FM29ZqLTrnPNXxijioZwMp · 2026-10-21T11:11Z

    Both done-when clauses hold:

    clause reading
    two registry entries on main PR #25091, merged as 8f59304ddc (landing record 6313258205): PR #24970 → objectstack-ai/objectui#13308, PR #24778 → objectstack-ai/objectui#13309
    the next hourly Spec Shape Gate on main concludes success schedule run 39588090692 at 5050442bb9 (a descendant of 8f59304ddc), objectui main 78bd6d732b: 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:

    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 closed completed: objectstack-ai/objectui#12654, #12711, #13022, #13308 and #13309. That pruning is carded as #25108 (p3). pm:dispatched comes off in this act.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:specpriority:p1High: required for production / M2tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions