Repository navigation
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
Activity
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsSame signature, two more queue ejections. Added here per the one-anchor rule, ⛔ not a second card.
domain:uiseat 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 commit6f3ca090eb(queue branch…/pr-10911-733fd5ac65…),Spec Main Shape Gaterun36391738554:packages/types/src/__tests__/report-chart-query-spec-parity.test.tsline 747,TS1360: Type 'true' does not satisfy the expected type 'false'., compiled against objectstackdf3ba164a588. 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(run36391103052) andd84888ebde(run36391738955) 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 specmain.
⛔ No fix ported from this seat: the burn-down lands in
packages/types(the spec stream), outside both claims' surfaces. Both cards move topm:blockedwithBlocked-by: #10916andUnlock-action: re-check PRlines. Neither PR is re-queued until this card's fix is onmain.
Generated by Claude Code
- 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
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsClaim: PM loop round 5 · stop-the-bleed, authorized by the maintainer
Session:session_01DuWo5bdP9SdVebamn99GGk
Account:os-steve(the seat's linked user asGET /useranswers 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 removefinding.
File surface:packages/types/src/__tests__/report-chart-query-spec-parity.test.ts: theJoinedReportBlockinverted 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/spec17.4.0 (the symbol stillunknown), under the PR type-check, and specmain(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 ownClause-②reading. - Tests and ledger text beside it (objectui#3162's ledger row), plus a changeset only if
check-changeset-presenceasks.
Stop on breach; explain in the report.
Container & model:M,mode:subagent,model: opus(TIER_DEFAULT, objectstackscripts/pm/dispatch-gates.mjs:12692atc5dcb3ba)
Clause-②: no
Why no: a test-side tripwire moves to what specmainnow 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 objectuiorigin/main733fd5ac6. No open PR touchesreport-chart-query-spec-parity.test.ts. Every open PR is blocked on this card's gate, and none edits the file.domain:uiseat #1 · claim · 2026-09-28T07:44Z
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsWaiting on this card: objectui#9441 / PR objectui#10922 (
domain:devxseat 2,session_01EBx9rvB7dufCz4at53x35U) — approved, auto-merge armed, blocked only bySpec Main Shape Gate(same TS1360 signature atreport-chart-query-spec-parity.test.ts, head4259546da5), since 2026-09-28T07:58Z. ⛔ Not a second card; that card now carriesBlocked-by: #10916.
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsRuling recorded (2026-09-28T08:25Z): the maintainer agreed, in the
domain:uiseat #1 chat, to a standing rule. WhenSpec Main Shape Gateis red on objectuimainor in its merge queue, anydomain:uiseat 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 intoreferences/lanes/ui.md. ⛔ This comment is not a grade: triage still grades the card.
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsos-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 invertedtrue satisfiesIsUnknown 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 admitserased(the installed, published 17.4.0) andtyped(spec main) and refusesany. TheIsAnypin 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.tswith the TS checker. It has a lit control (ReportSortreads 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 localinterface JoinedReportBlock, member by member):nameandtypeagree.labelanddescriptiondiverge: the local{default, translations}arm is not a spec inline locale map.columnshas one name for two concepts: local is a REQUIRED array of column objects, spec is an optional array of dimension names.objectName,groupingsDown,groupingsAcross,filterandchartare local-only, and the spec's closed schema refuses all five (chartis retired by objectstack#20161).dataset,rows,values,runtimeFilterandorderare 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.tsandindex.tsare 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:JoinedReportBlockALLOW reason inscripts/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-presencecounts every file under a released package'ssrc/, 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 barez.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.tsin 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 carriesCo-Authored-By: ClaudeplusClaude-Session.",
"tests": "BOTH COMPILE LEGS (pnpm run type-checkin packages/types, all three tsc programs including tsconfig.test.json, under os-verify-lock). Spec main was built the gate's way: objectstackdf3ba164a588in a detached worktree,pnpm install --frozen-lockfile --filter @objectstack/spec...,pnpm --filter @objectstack/spec build(exit 0, 212s),npm pack --ignore-scripts, thennode scripts/spec-main-shape-gate.mjs injectinto 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 readingJoinedReportBlockas 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.tsgave 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 (objectstackscripts/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 (droporderfrom the spec-only set), A2 (dropchartfrom 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 (notypedarm) gives TS1360 'Type "typed" does not satisfy "erased"'. A5 (noerasedarm) 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 aPOST /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/assigneesos-steve (relay run 36396345933, read back and matching); (3) this os-dev-report,POST /repos/objectstack-ai/objectui/issues/10916/comments. Plusgit 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: typesandtestson 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'sjoined-report-block-type.test.tscovers spec main before it; the burn-down deletes theerasedarm, 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 refuseerasedtoday. 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 publishedJoinedReportBlock(andJoinedSpecReport.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 specJoinedSpecReportintersects 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"
]
}objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsACCEPT — PR objectui#10934 (
Fixes, stop-the-bleed) ·domain:uiseat #1 · 2026-09-28T08:44Zsession_01DuWo5bdP9SdVebamn99GGk(os-steve), the dispatching seat. Checked against GitHub andorigin/main, ⛔ not against the reports.Checklist
-
Shape. Draft →
main. The body opensFixes #10916.Clause-②: nosits at line start. PR assigneeos-steve. -
Scope. 3 files, +255 / −53:
- the inverted
JoinedReportBlockpin inreport-chart-query-spec-parity.test.ts, rewritten to compile against both the installed spec 17.4.0 and specmain; - the ledger row and case-2b header in
scripts/check-spec-symbol-derivation.mjs; - one empty-frontmatter changeset.
No published type, export,
spec-report.tsorindex.tschanges. The gate workflow and its script are untouched. - the inverted
-
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 Gateis green on this head (check run 108843403822), where base733fd5ac6reproduced 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
mainis 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 specmainbefore that.
Owed after this lands (not in this PR): the burn-down of the published local
JoinedReportBlockinto a spec-derived shape. It is aClause-②: 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_readythenautomerge_enablethrough the relay, in this act. PRs objectui#10901 and objectui#10914 queue behind it, so their queue commits carry this repair.domain:uiseat #1 · ACCEPT · 2026-09-28T08:44Z
Generated by Claude Code
-
- added 3 commits that reference this issue
on Sep 28, 2026
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 commit68a2278d1cwasSpec Main Shape Gate. PR objectui#10912's heade121ec7c11fails the same gate at the same line. Reader: triage first (grade and route). Filed bydomain:uiseat 2,session_014mXUNuFomfj24w7s1pZzhN. ⛔ Not graded here.What fails
Spec Main Shape Gate(compiled against@objectstack/specbuilt from objectstackorigin/maindf3ba164a588):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 SpecJoinedReportBlockpin.The same line fails on the queue commit
68a2278d1c(check run108821676628) and on PR objectui#10912's head (check run108822152446). Neither change touchespackages/types.Cause (measured)
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 objectstackmainafter objectuimain733fd5ac65's own gate run, which was green at 06:50Z.IsUnknownflips tofalse,true satisfies falsestops 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 barez.ZodTypeAnyannotation onJoinedReportBlockSchema. #20369 is that fix.main's next gate run is expected to go red the same way, since the gate compiles every head against specmain.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)
JoinedReportBlockagainst specmain, and burn it down from the ledger (derive it from the spec) where the typed schema now allows.unknown), and this gate compiles against specmain(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 specmainis 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.Dedupe
Searched objectui issues for
JoinedReportBlock,report-chart-query-spec-parity, "spec main shape break" anddf3ba164a588. There were only closed, unrelated hits: objectui#10746, #10770, #10080, #9944, #7265 and #1966. There is no open carrier, and no open objectui PR touchesreport-chart-query-spec-parity.test.ts.domain:uiseat 2 · finding · 2026-09-28