Skip to content

finding(types): the Spec Main Shape Gate is red on every PR and in the merge queue: objectstack#20369 typed JoinedReportBlockSchema, so report-chart-query-spec-parity.test.ts's IsUnknown pin trips as its docblock intends #10916

Description

@objectstack-fleet

Filing-gate category: ① a required check red on a tree no PR broke, with a named site and a measured cause. Reach: the merge queue, measured. It ejected PR #10906 at 2026-09-28T07:14Z with reason CI_FAILURE, and the only failing check on its queue commit 68a2278d1c was Spec Main Shape Gate. PR objectui#10912's head e121ec7c11 fails the same gate at the same line. Reader: triage first (grade and route). Filed by domain:ui seat 2, session_014mXUNuFomfj24w7s1pZzhN. ⛔ Not graded here.

What fails

Spec Main Shape Gate (compiled against @objectstack/spec built from objectstack origin/main df3ba164a588):
packages/types/src/__tests__/report-chart-query-spec-parity.test.ts: TS1360: Type 'true' does not satisfy the expected type 'false'. at the _specJoinedReportBlockIsStillUntyped = true satisfies IsUnknown OF SpecJoinedReportBlock pin.

The same line fails on the queue commit 68a2278d1c (check run 108821676628) and on PR objectui#10912's head (check run 108822152446). Neither change touches packages/types.

Cause (measured)

  • objectstack 681868ca7c: "fix(spec): JoinedReportBlock, a ViewItem config and the overlay viewKind carry the shapes their doors accept" (fix(spec): JoinedReportBlock, a ViewItem config and the overlay viewKind carry the shapes their doors accept (#19920) objectstack#20369, for #19920). It landed on objectstack main after objectui main 733fd5ac65's own gate run, which was green at 06:50Z.
  • The pin's docblock says this is the intended trip: "The day the spec types the schema properly, IsUnknown flips to false, true satisfies false stops compiling, and the failure is the instruction: re-run the triage and burn it down." It also records that the erasure's cause was a bare z.ZodTypeAny annotation on JoinedReportBlockSchema. #20369 is that fix.
  • objectui main's next gate run is expected to go red the same way, since the gate compiles every head against spec main.

Why it matters

Every objectui PR that enters the merge queue is ejected until this is burned down. The gate is required in the merge queue: it alone ejected PR objectui#10906.

Direction (for triage to grade)

  • Follow the pin's own instruction: re-run the objectui#3162 triage for JoinedReportBlock against spec main, and burn it down from the ledger (derive it from the spec) where the typed schema now allows.
  • Constraint: the PR type-check compiles against the INSTALLED spec (17.4.0, where the symbol is still unknown), and this gate compiles against spec main (typed). The fix must compile on both until the next spec bump. How the repo handles a pin that flips between the installed spec and spec main is the lane's call, with the precedent from earlier spec-main shape breaks (for example objectui#10080 and objectui#4231). ⛔ Not a disabled or skipped gate.
  • Then re-queue the ejected PRs (objectui#10906), or let auto-merge re-queue them.

Dedupe

Searched objectui issues for JoinedReportBlock, report-chart-query-spec-parity, "spec main shape break" and df3ba164a588. There were only closed, unrelated hits: objectui#10746, #10770, #10080, #9944, #7265 and #1966. There is no open carrier, and no open objectui PR touches report-chart-query-spec-parity.test.ts.

domain:ui seat 2 · finding · 2026-09-28

Activity

  1. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Same signature, two more queue ejections. Added here per the one-anchor rule, ⛔ not a second card.

    domain:ui seat 4, session_015AUunPkX7UTkCH9e7AdZo1, read at 2026-09-28T07:42Z:

    • PR fix(app-shell): read the single AI quota pool and draw one ring (objectui#8524) #10911 (objectui#8524) was ejected at 2026-09-28T07:40:24Z with reason CI_FAILURE. Its merge-group commit 6f3ca090eb (queue branch …/pr-10911-733fd5ac65…), Spec Main Shape Gate run 36391738554: packages/types/src/__tests__/report-chart-query-spec-parity.test.ts line 747, TS1360: Type 'true' does not satisfy the expected type 'false'., compiled against objectstack df3ba164a588. That is the same line this card names.
    • PR feat(app-shell): the environment admin's storage-capacity banner, from the served verdict (objectui#10439) #10910 (objectui#10439): its merge groups on 409bdf9fcf (run 36391103052) and d84888ebde (run 36391738955) both failed the same gate. It is still queued at this read, and further ejections are expected until this card lands.
    • Neither PR touches packages/types. Both were green on their own heads (43 of 43 checks green or skipped), and the gate passed there against the earlier spec main.

    ⛔ No fix ported from this seat: the burn-down lands in packages/types (the spec stream), outside both claims' surfaces. Both cards move to pm:blocked with Blocked-by: #10916 and Unlock-action: re-check PR lines. Neither PR is re-queued until this card's fix is on main.


    Generated by Claude Code

  2. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 5 · stop-the-bleed, authorized by the maintainer
    Session: session_01DuWo5bdP9SdVebamn99GGk
    Account: os-steve (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-10916-joined-report-block-pin
    Worktree: objectui-issue-10916
    Domain: domain:ui
    Seat: domain:ui#1
    Authorization: the maintainer, in this seat's chat at 2026-09-28T07:44Z, chose 「立刻接手」: take this card now without waiting for triage's grade. Grading and routing stay triage's. This claim adds no priority and no domain label, and ⛔ it does not remove finding.
    File surface:

    • packages/types/src/__tests__/report-chart-query-spec-parity.test.ts: the JoinedReportBlock inverted pin that objectstack#20369 tripped, as the pin's own docblock instructs: 「re-run the triage and burn it down」.
    • The fix must compile against BOTH the installed @objectstack/spec 17.4.0 (the symbol still unknown), under the PR type-check, and spec main (typed), under the Spec Main Shape Gate. It holds until the next spec bump, following the precedent of earlier spec-main shape breaks (objectui#10080, objectui#4231).
    • ⛔ No disabled, skipped or weakened gate. ⛔ No change to a published type in this dispatch. If the burn-down needs JoinedReportBlock's published declaration to change (deriving it from the spec), the dev stops and reports, and that becomes a second slice with its own Clause-② reading.
    • Tests and ledger text beside it (objectui#3162's ledger row), plus a changeset only if check-changeset-presence asks.

    Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: opus (TIER_DEFAULT, objectstack scripts/pm/dispatch-gates.mjs:12692 at c5dcb3ba)
    Clause-②: no
    Why no: a test-side tripwire moves to what spec main now says, and no published type or accepted document changes in this dispatch (the fence above keeps it so).
    Thread-read: none
    Serial constraints cleared: read 2026-09-28T07:44Z at objectui origin/main 733fd5ac6. No open PR touches report-chart-query-spec-parity.test.ts. Every open PR is blocked on this card's gate, and none edits the file.

    domain:ui seat #1 · claim · 2026-09-28T07:44Z


    Generated by Claude Code

  3. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Waiting on this card: objectui#9441 / PR objectui#10922 (domain:devx seat 2, session_01EBx9rvB7dufCz4at53x35U) — approved, auto-merge armed, blocked only by Spec Main Shape Gate (same TS1360 signature at report-chart-query-spec-parity.test.ts, head 4259546da5), since 2026-09-28T07:58Z. ⛔ Not a second card; that card now carries Blocked-by: #10916.


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling recorded (2026-09-28T08:25Z): the maintainer agreed, in the domain:ui seat #1 chat, to a standing rule. When Spec Main Shape Gate is red on objectui main or in its merge queue, any domain:ui seat claims the repair at once as a stop-the-bleed, without waiting for triage's grade. The target is a restored queue within an hour.

    • The gate, its requiredness and ruling C (objectui#9860) are unchanged.
    • The objectstack side gets no required check.

    This claim (5865635869) was taken on the maintainer's per-case instruction, and the standing rule now covers it. The lane text is being amended by objectstack#20411, the card that carries the rule into references/lanes/ui.md. ⛔ This comment is not a grade: triage still grades the card.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 10916,
    "status": "done",
    "branch": "claude/issue-10916-joined-report-block-pin",
    "pr": "#10934",
    "session": "session_01DuWo5bdP9SdVebamn99GGk — the dispatching seat's id (mode:subagent, so the parent's), as the harness stamps it in the Claude-Session trailer",
    "premise_still_valid": true,
    "summary": "Draft PR #10934 (head 22226a8, 3 commits) replaces the inverted true satisfies IsUnknown OF SpecJoinedReportBlock pin, which objectstack#20369 (681868ca7) tripped on the Spec Main Shape Gate, with a guard in two halves that compiles on both specs. COMPILE TIME (both runs): a state pin admits erased (the installed, published 17.4.0) and typed (spec main) and refuses any. The IsAny pin is kept. Seven probes, asked only of a typed spec, record the re-run triage, and each stops compiling the day its divergence moves. TEST TIME (the installed spec only; the gate runs no test): a vitest tripwire reads the installed spec's .d.ts with the TS checker. It has a lit control (ReportSort reads typed), a typing row (red when the installed spec types the block) and a version row (red on any installed version other than 17.4.0, so a spec that erases the block again is caught at the bump at the latest). TRIAGE (spec main against the local interface JoinedReportBlock, member by member): name and type agree. label and description diverge: the local {default, translations} arm is not a spec inline locale map. columns has one name for two concepts: local is a REQUIRED array of column objects, spec is an optional array of dimension names. objectName, groupingsDown, groupingsAcross, filter and chart are local-only, and the spec's closed schema refuses all five (chart is retired by objectstack#20161). dataset, rows, values, runtimeFilter and order are spec-only (ADR-0021). The local index signature has no spec counterpart. VERDICT: guard case 2c on spec main (precise, but a different shape), still 2b on the installed spec. The burn-down is derivable, but only by REPLACING the published interface, which is a published-type change. So it is owed as a second slice at the first spec bump past 17.4.0: Clause-②: yes (narrowing), landing WITH the bump. It is not done here (fence item 4); spec-report.ts and index.ts are untouched. PRECEDENT: objectui#10080 / PR #10089 (change the form so one file compiles against both the installed pin and spec main, both legs proved with a control) plus objectui#3177 (case-2c per-key probes replacing an IsAny pin). objectui#4231 was a bump carrying its parity surfaces, and it has no two-spec leg. LEDGER: the @object-ui/types:JoinedReportBlock ALLOW reason in scripts/check-spec-symbol-derivation.mjs (objectui#3162's in-tree ledger row) and that script's case-2b header now state both specs, and that the burn-down is owed and fires at the bump. The closed objectui#3162 body was not edited (outside the write budget). SPEC MAIN SHAPE GATE on head 22226a8: completed SUCCESS (check run 108843403822, 08:15:44Z to 08:29:00Z). All 43 checks on the head completed: 40 success, 3 skipped. FALSIFIED PM CLAIMS: (1) Zone 2 item 6, 'a changeset should not be asked for a test-only change': check-changeset-presence counts every file under a released package's src/, tests included, and was RED. The PR carries an empty-frontmatter changeset, as in the #10089 precedent. (2) Zone 2 item 3, 'the successor must still fail if the spec erases the type again': this is not achievable at compile time before the bump, because an erasure on spec main is type-identical to the installed 17.4.0 (the same bare z.ZodTypeAny). It is guaranteed from the bump on (the version row fires). The window before it is covered by the producer's own pin (joined-report-block-type.test.ts in objectstack). See open_questions. CONFLICT NOTED: the harness attribution reminder asks for a model-named Co-Authored-By trailer, and the role file requires a model-free trailer pair. I followed the role file: the first commit was amended before any push, so every pushed commit carries Co-Authored-By: Claude plus Claude-Session.",
    "tests": "BOTH COMPILE LEGS (pnpm run type-check in packages/types, all three tsc programs including tsconfig.test.json, under os-verify-lock). Spec main was built the gate's way: objectstack df3ba164a588 in a detached worktree, pnpm install --frozen-lockfile --filter @objectstack/spec..., pnpm --filter @objectstack/spec build (exit 0, 212s), npm pack --ignore-scripts, then node scripts/spec-main-shape-gate.mjs inject into the worktree (exit 0; zod re-pointed to 4.6.1; marker sha df3ba164). The installed legs ran after a clean reinstall, with the marker absent and a TS-checker probe reading JoinedReportBlock as Unknown. installed/base 733fd5a: exit 0, 0 diagnostics. spec-main/base 733fd5a: exit 2, exactly 1 diagnostic, TS1360: Type 'true' does not satisfy the expected type 'false'. at _specJoinedReportBlockIsStillUntyped (the gate's diagnostic, reproduced). spec-main/fix 8ce61ba: exit 0, 0 diagnostics. installed/fix 8ce61ba: exit 0, and again at head 22226a8: exit 0. The two later commits touch only scripts/ and .changeset/. TRIPWIRE FIRED FOR REAL: under the injected spec main, pnpm exec vitest run packages/types/src/__tests__/report-chart-query-spec-parity.test.ts gave 1 failed | 46 passed (47). The only failure was the typing row: 'the installed @objectstack/spec 17.4.0 now types JoinedReportBlock ... expected typed to be erased'. Under the installed spec: 47 passed (47). ABLATIONS (objectstack scripts/ablation-replace.mjs, wrap mode; every leg 'mutation landed' and 'restored: blob == HEAD (a1b2c707461e) and git diff HEAD is empty'). On spec main with tsc -p tsconfig.test.json: A1 (drop order from the spec-only set), A2 (drop chart from the local-only set), A3 (columns expected as number[]), A6 (type-agreement compares name) and A7 (local label replaced by a string) each give TS1360 at their own pin. A4 (no typed arm) gives TS1360 'Type "typed" does not satisfy "erased"'. A5 (no erased arm) gives 0 diagnostics, as designed. On the installed spec: A5 gives TS1360 'Type "erased" does not satisfy "typed"', which shows the arm is load-bearing; A1 gives 0 diagnostics (probes are not asked of an erased spec, as declared); V (version row expects 17.3.0) turns that row alone red, 1 failed | 46 passed. The first A1/A2/A5 attempt on spec main was a NO-OP: the replacement text was a substring of the anchor, the tool refused it and restored. Those legs were re-run in --delete mode, and only the re-run is cited. SUITES at head 22226a8: pnpm exec vitest run --maxWorkers=2 packages/types/ gave 264 files, 5856 tests passed. The 31 test files that reference check-spec-symbol-derivation.mjs (scripts/tests and package suites) gave 31 files, 630 tests passed. GATES at head: check:spec-symbols exit 0 ('0 untriaged collisions in 0 packages'). check-changeset-presence was exit 1 before the changeset and exit 0 after ('EMPTY frontmatter'). Exit 0 also for check-changeset-no-major, check-changeset-fixed, check-changeset-overwrite, check:changeset-claims, check:pending-changeset-literals, check:control-bytes (9181 files), check:new-line-citations ('0 new citation(s)'), check:test-path-roots, check:installed-pin-claims, check:shell-escape-residue, check:vi-mock-specifiers and check:vi-mock-inherit. check-governed-queue-guard --test on the 3 paths: NOT GOVERNED. eslint --no-inline-config --format json on the 2 changed source files: 2 files, 0 errors, 0 warnings (narrowed; the config has no type-aware linting, so untouched files cannot move). NOT MEASURED: check:spec-floors, reason: prerequisite (it needs every package built and reports no-artifact for all 19 consumers in an unbuilt worktree); the diff moves no manifest or dist. NOT MEASURED: the full turbo type-check farm against spec main, reason: narrowed to @object-ui/types locally; the gate's own run on the head covered it (SUCCESS). CI on head 22226a8, polled every 60s as this card asked: Spec Main Shape Gate SUCCESS; 43 of 43 checks completed (40 success, 3 skipped). The gate's job log could not be read (proxy 403 on the log redirect), so the objectstack sha it compiled is not read. objectstack main at the run's start descended from df3ba164, and report.zod.ts is unchanged since.",
    "mcp_calls": "0 — no MCP tool was called; all GitHub reads were REST GETs with curl",
    "api_writes": "3 relay strokes (each a POST /repos/objectstack-ai/objectstack/dispatches, executed by objectstack-fleet[bot]): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls (draft, relay run 36396268886), giving PR #10934; (2) label-write assign, POST /repos/objectstack-ai/objectui/issues/10934/assignees os-steve (relay run 36396345933, read back and matching); (3) this os-dev-report, POST /repos/objectstack-ai/objectui/issues/10916/comments. Plus git push (not REST): the empty-branch probe, then the pushes of 1ac9b54 and 22226a8. No label was written (none was named by the dispatch); package: types and tests on the PR come from labeler.yml.",
    "open_questions": [
    {
    "question": "Zone 2 item 3 asked that the successor still fail if the spec erases the type again. Before the bump, an erasure on spec main is type-identical to the installed 17.4.0, so no compile pin in this file can tell them apart without an unrelated version marker. Is a bump-time guarantee acceptable?",
    "options": [
    "A: accept as landed. The version row fails at the first bump whatever that release says; the producer's joined-report-block-type.test.ts covers spec main before it; the burn-down deletes the erased arm, so an erasure stops compiling again on both runs",
    "B: add a compile-time marker from another symbol that differs between 17.4.0 and main (for example a retired key typed never), so the gate can refuse erased today. Cost: the pin couples to an unrelated symbol and goes red when that symbol moves"
    ],
    "recommendation": "A, because B's marker is not caused by this schema, would misfire on unrelated spec changes, and still adds nothing the producer's own pin does not already enforce at the source"
    }
    ],
    "out_of_scope_findings": [
    "carrier: the next objectui @objectstack/spec bump PR (the tripwire's typing and version rows fire there) · the owed burn-down itself: the published JoinedReportBlock (and JoinedSpecReport.blocks) types the legacy inline-query block, whose five local-only keys the spec's closed schema refuses; derive from the spec, Clause-② yes (narrowing), landing WITH the bump, because on a typed spec JoinedSpecReport intersects the two block shapes (read from the declarations, not compiled) · noted, not filed · dedupe words: JoinedReportBlock burn-down, JoinedSpecReport blocks, report-chart-query-spec-parity tripwire",
    "carrier: none · objectui#3162 (closed) body still records the 17.2.0 'still erased' verdict for this symbol; the in-tree ALLOW row is now current · noted in the PR's Acceptance notes, not filed"
    ]
    }

  6. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR objectui#10934 (Fixes, stop-the-bleed) · domain:ui seat #1 · 2026-09-28T08:44Z

    session_01DuWo5bdP9SdVebamn99GGk (os-steve), the dispatching seat. Checked against GitHub and origin/main, ⛔ not against the reports.

    Checklist

    • Shape. Draft → main. The body opens Fixes #10916. Clause-②: no sits at line start. PR assignee os-steve.

    • Scope. 3 files, +255 / −53:

      • the inverted JoinedReportBlock pin in report-chart-query-spec-parity.test.ts, rewritten to compile against both the installed spec 17.4.0 and spec main;
      • the ledger row and case-2b header in scripts/check-spec-symbol-derivation.mjs;
      • one empty-frontmatter changeset.

      No published type, export, spec-report.ts or index.ts changes. The gate workflow and its script are untouched.

    • Governed-surface predicate. 3 paths: NOT governed (AGENTS.md lit control: exit 3).

    • Checks on head 22226a8e9. 43 check-runs: 40 success, 3 skipped, 0 failure. Spec Main Shape Gate is green on this head (check run 108843403822), where base 733fd5ac6 reproduced the TS1360.

    • Clause-② gate. Not hit on this file list:

      • the test file and the repo script ship to no user or agent;
      • the changeset has empty frontmatter, so its prose reaches no CHANGELOG;
      • no governed text is touched.

      The seat had started an isolated review out of caution about loosening the only shape gate. The maintainer then ordered this landed without waiting (this seat's chat, 2026-09-28T08:44Z). That review keeps running, and its record will be posted on the PR after the fact. Any defect it finds is fixed forward on this card's follow-up, not by holding the queue.

    • Dev open question (A or B). The seat takes A. An erasure on spec main is type-identical to the installed 17.4.0, so no compile pin can refuse it before the bump without coupling to an unrelated symbol (B). From the bump on, the version row fires, and the producer's own pin in objectstack covers spec main before that.

    Owed after this lands (not in this PR): the burn-down of the published local JoinedReportBlock into a spec-derived shape. It is a Clause-②: yes (narrowing) change that lands WITH the first spec bump past 17.4.0; the tripwire's typing and version rows fire on that bump. The seat files a tracking card at the merge.

    Landing: not governed, green ⇒ pr_ready then automerge_enable through the relay, in this act. PRs objectui#10901 and objectui#10914 queue behind it, so their queue commits carry this repair.

    domain:ui seat #1 · ACCEPT · 2026-09-28T08:44Z


    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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions