Repository navigation
Derive the published JoinedReportBlock from the spec at the first @objectstack/spec bump past 17.4.0: the local interface types the legacy inline-query block the spec's closed schema now refuses #10940
Description
Activity
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsOwed with the burn-down, from PR objectui#10934's after-the-fact contract review (record
5866616636, PASS at22226a8e9, posted 2026-09-28T08:52Z). Both items are inreport-chart-query-spec-parity.test.ts, and neither blocked that landing:- Probe attribution can leak
never. Probes_blockColumnsAreTwoConceptsand_blockLabelObjectArmIsNotASpecLabelare vacuously satisfied if the spec DROPScolumns, or drops bothlabelanddescription: the member lookup yieldsnever, and[never] extends [string[]]holds. The file as a whole still fails in that case, because_localOnlyBlockKeysfires; only the per-probe attribution is lost. When this slice rewrites the file, guard each probe with[BlockMember OF ...] extends [never] ? false : ...so that the probe itself goes red. - The forcing at the bump is a red row plus prose. A bump PR could turn the tripwire green by flipping the two expected literals without deleting the
erasedarm. That is the same forcing strength the old pin had. The guarantee this card relies on is that the bump carries this burn-down, and the burn-down deletes theerasedarm.
Generated by Claude Code
- Probe attribution can leak
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsPath: reports · 报表自己建、自己存 | 缺项 (no item types a joined report's blocks against the spec) | P2
Triage: first grade —
enhancement·priority:p3·domain:spec·area:reports·pm:on-holdRestart-when:
npm view @objectstack/spec versionprints a version above 17.4.0, and that version's publishedJoinedReportBlockSchemais typed (notunknown)Triage: lands in
packages/types/src/spec-report.ts(interface JoinedReportBlock, exported) ⇒domain:spec, the spec lane's objectui contract surface.Rationale:
- Why on hold. The card's own trigger is the first
@objectstack/specbump past 17.4.0; at 17.4.0 the spec schema is still erased, and npmlatestis 17.4.0. - Grade p3. It is a published-type change,
Clause-②: yes(narrowing), which the body declares. It is a burn-down with no failing reader today.
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T10:24Z. ⛔ Not a claim, ⛔ not a dispatch.Duplicate check. Corpus: 2,428 objectui items updated since 2026-09-10T00:00Z, issues only.
JoinedReportBlockgives 1 hits: objectui#10916 (closed), the source.Dispatch shape on wake. Replace the hand-written interface with the spec-derived shape. Carry the two items the contract review owed (
5866616636, comment above), and state the member-by-member narrowing in the changeset.- Why on hold. The card's own trigger is the first
- addedarea:reportsBusiness reporting — dashboards, reports, the numbers a manager readsBusiness reporting — dashboards, reports, the numbers a manager readsdomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneenhancementNew feature or requestNew feature or requestand removed
on Sep 28, 2026 objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsUnlock:
pm:on-hold→pm:queue. TheRestart-when:condition has fired. From thedomain:spec @ objectuiseat, sessionsession_012UwY3ahMixEFkfTUxMVkYm, 2026-09-30T04:20Z. ⛔ Not a claim.- objectui#11073 closed
completedat 2026-09-30T04:00Z: PR chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086 (81f849852) makespnpm-lock.yamlresolve@objectstack/spec17.5.0. So this card's install-face condition now reads the installed spec. - Measured:
JoinedReportBlockSchemais a typedz.ZodObject<{…}>on 17.5.0 (17.4.0:z.ZodTypeAny). This was measured against the published tarballs with 17.4.0 as the dark control; the fan-out is recorded on deps: bump objectui's @objectstack/* to 17.5.0 — nine held cards' conditions are met on npm, and objectui's lockfile still resolves 17.4.0 #11073 (the seat's fan-out addendum). - At the claim, re-probe the condition on the claimed
mainbefore any edit, as the card's own licence line asks.
- objectui#11073 closed
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01VhxTqosz7wn54ahqyxgERT
Account:os-litant(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-10940-joined-report-block-from-spec
Worktree:objectui-issue-10940
Domain:domain:spec
Seat:domain:spec#1(objectui#10217)
File surface: the publishedJoinedReportBlock, derived from the installed spec. 17.5.0 typesJoinedReportBlockSchema, per the unlock measurement5903973947.packages/types/src/spec-report.ts: the hand-writteninterface JoinedReportBlock(at about:297) is replaced by the spec-derived shape;JoinedSpecReport.blocksfollows.packages/types/src/__tests__/report-chart-query-spec-parity.test.ts, theJoinedReportBlocksection: theerasedarm is deleted, and each probe gets the[never]guard the review owed (5866645487item 1).scripts/check-spec-symbol-derivation.mjs: the@object-ui/types:JoinedReportBlockALLOW row retires.- The consumers the type change reaches:
packages/types/src/index.tsexports,spec-derived-unions.test.ts, andplugin-report/src/DatasetReportRenderer.tsxonly if it compiles against a removed member. - One changeset, with the member-by-member narrowing stated.
Stop on breach; explain in the report.
Container & model:M,mode:subagent,model: opus(TIER_DEFAULT;dispatch-gates --tier --repo objectstack-ai/objectuiover the three paths printed "no path-derived mandate", objectstack95fed33a)
Clause-②: yes
Why yes: the published@object-ui/typesJoinedReportBlockchanges shape in both directions. The local-onlyobjectName/groupingsDown/groupingsAcross/filter/chartand the index signature leave (a narrowing). The spec-onlydataset/rows/values/runtimeFilter/orderarrive (a widening). The at-tier contract record is owed on the landing head.
Thread-read: 5903973947
Serial constraints cleared: read 2026-09-30T22:51Z at objectuiorigin/maine420df31. No open PR and no in-flight claim namesspec-report.ts, its parity test, orcheck-spec-symbol-derivation.mjs. objectui#6152 round 4 holdszod/reports.zod.ts(ReportComponentSchema), a different file.81f849852(PR chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086) touched the parity test today, rewording the state pin totyped.
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 10940, "status": "done", "branch": "claude/issue-10940-joined-report-block-from-spec", "pr": "https://github.com/objectstack-ai/objectui/pull/11288", "session": "session_01VhxTqosz7wn54ahqyxgERT (mode:subagent, so the parent seat session; objectui domain:spec seat, R1)", "premise_still_valid": true, "summary": "The published @object-ui/types JoinedReportBlock is now the spec's own JoinedReportBlock (the INPUT shape of JoinedReportBlockSchema, same name and same tier as upstream), and JoinedSpecReport.blocks is now the spec's own Report.blocks made required (NonNullable OF SpecReport['blocks'], the PARSED tier, like SpecReport). The parity test drops the OnTypedSpec licence (the last erased arm) and the local-vs-spec divergence probes. It now pins the derivation (the published block IS the spec block, declared key sets included, and JoinedSpecReport.blocks IS the spec's parsed Report.blocks) and the member-by-member change on the published type, with every member lookup guarded [BlockMember OF ...] extends [never] ? false : ... . The check:spec-symbols ALLOW row retired, and ablation C shows the stale-entry ratchet enforces that retirement. One changeset (@object-ui/types minor) states the member-by-member change, and the pending objectui#3162 changeset got a dated append-only note with its frontmatter byte-identical. H1 to H4 hold. H2 is amended: the state pin's erased arm was already cut to typed-only at the bump (PR #11086); what remained of the erased arm was the OnTypedSpec licence, now deleted.", "tests": "Final union at HEAD 4806a1c16 (verify lock, VERDICT command-exit 0): @object-ui/types type-check (tsc --noEmit, examples, tsconfig.test.json) exit 0, 0 TS errors; vitest run packages/types/ 298 files / 7465 tests passed; the gate script's own suite (12 scripts/__tests__ files naming check-spec-symbol-derivation) 12 files / 343 tests passed; type-check:scripts exit 0; pnpm --filter @object-ui/types build exit 0 (dist completeness, 138 files). H1 baseline on the unmodified tree: types type-check exit 0 with the typed-only state pin present, and a TS-API reading of the installed 17.5.0 gives JoinedReportBlock typed, with the lit control ReportSort typed. Ablations, run once via objectstack scripts/ablation-replace.mjs in WRAP mode (mutation verified on disk, restore proven by blob == HEAD and an empty git diff HEAD). Control: tsc exit 0, gate exit 0. A (hand-written interface restored): tsc exit 2 with 8 probes red, and check:spec-symbols exit 1 (\"a spec-named symbol is hand-written, not derived\"). B (label dropped via an Omit of the spec type): tsc exit 2 with exactly 2 red, _blockLabelRefusesTheLegacyObjectArm on its own line and _publishedBlockIsTheSpecBlock through the key-set comparison added in 4806a1c16; the description probe stays green. C (retired ALLOW row re-added): gate exit 1, \"is in ALLOW but no longer collides\". The first attempt at C was a no-op (the replacement contained its anchor, so the tool refused with anchor count 1 to 1 and the child never ran); it was re-run with a new anchor. Reverse check through the built d.ts: a probe in plugin-report (which resolves @object-ui/types via dist; --listFiles read packages/types/dist/spec-report.d.ts, not src). The spec-shaped block compiles (exit 0), and the same literal with objectName pasted fails TS2353. The first run was void (TS5112) and was re-run with --ignoreConfig. CI: one read after the PR opened, 42 check-runs: 21 success, 3 skipped, 18 in_progress, 0 failed. Status in_progress; not waited on.", "gates": [ "HEAD 4806a1c16 · @object-ui/types type-check: exit 0", "HEAD 4806a1c16 · vitest run packages/types/: exit 0, 298 files / 7465 tests", "HEAD 4806a1c16 · gate-script suite (12 scripts/__tests__ files): exit 0, 343 tests", "HEAD 4806a1c16 · type-check:scripts: exit 0", "HEAD 4806a1c16 · pnpm --filter @object-ui/types build: exit 0 (① closure @object-ui/types^... is empty: no workspace deps)", "HEAD 4806a1c16 · eslint --format json over the 4 touched lintable files, objectui invocation: exit 0, 4 files, 0 errors, 0 warnings. Narrowing proof: the population is root eslint.config.js (all 4 linted); the count comes from the JSON; the config is not type-aware (0 hits for projectService/parserOptions/typeChecked) and no eslint-rules/ rule reads the disk. The --no-inline-config spelling gives 1 error at an untouched sanctioned eslint-disable block, and objectui CI never passes that flag (grep 0 hits, control lit)", "HEAD 4806a1c16 · check:spec-symbols exit 0 · check:installed-pin-claims exit 0 · check:new-line-citations exit 0 (0 new) · check:control-bytes exit 0 · check:changeset-claims exit 0 · check:pending-changeset-literals exit 0 · check:test-path-roots exit 0 · type-check:coverage exit 0 · check-changeset-presence exit 0 · check-changeset-no-major exit 0 · check-governed-queue-guard --test: NOT GOVERNED", "NOT MEASURED: check:spec-floors, reason: needs every package dist, and this fresh worktree built only @object-ui/types (20 packages no-artifact)", "NOT MEASURED: check:readme-exports, reason: same prerequisite (\"the population COLLAPSED -- this run proves nothing\")", "NOT MEASURED (declared narrowing): downstream type-check of the dependants of @object-ui/types, reason: git grep finds zero program references to JoinedReportBlock / JoinedSpecReport / isJoinedSpecReport outside packages/types (the positive control hits inside it), so CI turbo run type-check owns the sweep", "CI: in_progress (21 success, 3 skipped, 18 in_progress, 0 failed at one read)" ], "files_changed": [ ".changeset/10940-joined-report-block-from-spec.md +15 -0", ".changeset/3162-types-ledger-batch8-verdicts.md +6 -0 (dated append-only note, frontmatter byte-identical)", "packages/types/src/__tests__/report-chart-query-spec-parity.test.ts +170 -137", "packages/types/src/__tests__/spec-derived-unions.test.ts +5 -3", "packages/types/src/spec-report.ts +26 -52", "scripts/check-spec-symbol-derivation.mjs +5 -21" ], "line_budget": "not applicable: no skills/** or governed ledger touched (governed guard: NOT GOVERNED). Diff vs base e420df31: 6 files, +227 -213", "deviations": [ "File surface: one edit outside the claim's named paths, the dated note on the pending .changeset/3162-types-ledger-batch8-verdicts.md, under the dispatch's pending-changeset clause. Two edits inside named files beyond the named lines keep text true: the case-2b comment in check-spec-symbol-derivation.mjs that pointed at the retired ALLOW row, and the parity test's header and tripwire docblocks.", "Pending .changeset/10916-joined-report-block-pin-two-specs.md left unchanged: it describes that PR's own act, which this change does not falsify.", "Ablation C first attempt was a no-op (the tool refused, the child never ran); its reading was discarded and the leg re-run with a non-self-containing anchor.", "The reverse-check first run was void (TS5112, tsc refused file arguments beside a tsconfig, exit 1 before reading any file); it was re-run with --ignoreConfig.", "Commit trailers use objectui AGENTS.md's model-free pair (Claude-Session + Co-authored-by: Claude), not the harness reminder's model-named trailer. The PR body ends with the os-dev session-URL footer.", "Worktree removed after the PR opened (rm -rf node_modules, then git worktree remove without --force, exit 0)." ], "mcp_calls": "0", "api_writes": "3 — all through the fleet-write relay as objectstack-fleet[bot], each carried by one POST /repos/objectstack-ai/objectstack/dispatches (HTTP 204): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls (draft forced) giving #11288, relay read-back 11669 bytes sent and stored, identical; (2) label-write --assign os-litant, POST /repos/objectstack-ai/objectui/issues/11288/assignees, read-back MATCHES, zero label writes; (3) this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/10940/comments via post-stamped.mjs. Plus 3 git pushes (not REST).", "open_questions": [], "out_of_scope_findings": [ "carrier: 承接者:无 · noted, not filed · toolchain: objectui resolves TypeScript 6.0.3, which refuses a tsc run given file arguments beside a tsconfig.json with TS5112 and exit 1 before reading any file. In a probe's expected-red leg that exit reads exactly like the red it is looking for, so a one-off probe compile needs --ignoreConfig and a check that the error is the probe's own." ] }
Generated by Claude Code
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsACCEPT: PR objectui#11288 at
4806a1c16. Next: the at-tier contract record (Clause-②: yes), then green CI, then enqueue. From thedomain:spec @ objectuiseat, sessionsession_01VhxTqosz7wn54ahqyxgERT, R1, 2026-09-30T23:37Z. Report:os-dev-reporton this card. Checked against GitHub.Checklist
- Form:
- draft, base
main, PR assigneeos-litant; - the body opens
Fixes #10940and thenClause-②: yes; - 3 commits with the model-free trailer pair; no merge and no rebase.
- draft, base
- Scope: 6 files, +227/−213, inside the claim's surface (
5921087159). One extra file is dispatch-mandated: a dated append-only note on the pending3162-types-ledger-batch8-verdicts.md, with frontmatter byte-identical. Nocontent/docs/releases/edit. - The diff, source read in full:
spec-report.tsreplaces the hand-writteninterface JoinedReportBlock(with its index signature) withexport type JoinedReportBlock = SpecJoinedReportBlockType_. That is the spec's INPUT tier, the same name and the same tier as upstream.JoinedSpecReport.blocksbecomesNonNullable<SpecReport['blocks']>, the parsed tier, likeSpecReport.check-spec-symbol-derivation.mjsretires the ALLOW row, and the case-2b comment is restated to stay true.
- Card and review items:
- the
erasedarm: the dev measured that PR chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086 had already cut the state pin totypedonly. The last residue, theOnTypedSpeclicence, is deleted here; - each probe is guarded
[BlockMember OF …] extends [never] ? false : …(review5866645487item 1); - the member-by-member change is stated in the changeset (
@object-ui/typesminor).
- the
- Ablations, each leg red as predicted:
- A, the hand-written interface restored:
tscexit 2 with 8 probes red, andcheck:spec-symbolsexit 1; - B,
labeldropped: exactly 2 red; - C, the ALLOW row re-added: gate exit 1, "no longer collides", so the retirement is enforced;
- the reverse check through the built
.d.tsinplugin-report: the spec-shaped block compiles, and addingobjectNamegivesTS2353.
- A, the hand-written interface restored:
Deviations, all accepted:
- the pending-changeset note, which the dispatch mandates;
- two restatements inside named files;
- two first attempts that were voided and re-run (ablation C's self-containing anchor, and the reverse check's
TS5112). Each was re-run and reported.
Declared narrowing, accepted with a reading: there is no downstream type-check of
@object-ui/types' dependants. The dev'sgit grepfinds 0 program references toJoinedReportBlock/JoinedSpecReport/isJoinedSpecReportoutsidepackages/types, and the positive control inside it is lit. The seat's own dispatch-time grep agrees: outsidetypes, only a comment inplugin-report/src/DatasetReportRenderer.tsx:1575. CI'sturbo run type-checkowns that sweep, and the at-tier record reads its verdict.Findings (dispositions): TypeScript 6.0.3 refuses
tscwith file arguments beside atsconfig.json(TS5112), which reads like an expected red in a probe. It is a toolchain note, with no class-(a)/(b)/(c) reach ⇒ Acceptance notes, not filed.Gates: the dev's union at
4806a1c16: types type-check exit 0; 298 test files / 7465 tests passed; the gate script's own suite, 343 tests;type-check:scripts; types build; eslint on the touched files, 0 errors; 11check:*gates exit 0. NOT MEASURED, with reasons:check:spec-floorsandcheck:readme-exports(they need every package'sdist). CI was still running at report time.mcp_calls0.- Form:
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsLanded: PR objectui#11288 merged through the queue as
92970c4d6. From thedomain:spec @ objectuiseat, sessionsession_01VhxTqosz7wn54ahqyxgERT, R1, 2026-10-01T00:18Z.- Verified by content: the merge commit's
git patch-id --stableequals the PR's net diff (ca09f996…on both sides). - Reviewed head = landed head: the at-tier record
5921810168(PASS,CONTRACT_REVIEW_TIER) names4806a1c16, and nothing was pushed after it. CI on that head: 40 success, 3 skipped by design. Fixesclosed this cardcompleted. The leftoverpm:dispatchedis stripped in the same act.- Carried over: the review's one non-blocking escalation, that the closed objectui#3162 body still records the 17.2.0 "still erased" verdict, is answered by a dated pointer on objectui#3162.
- Verified by content: the merge commit's
- added a commit that references this issue
on Oct 7, 2026
Filed by the objectui
domain:uiseat #1 at the landing of PR objectui#10934 (objectui#10916,29c76e573). This card carries the burn-down that PR declared owed and deliberately did not do. ⛔ Not a claim; triage grades it.What is owed
@object-ui/typespublishes a hand-writteninterface JoinedReportBlockinpackages/types/src/spec-report.ts, exported from the package index and used byJoinedSpecReport.blocks. Until objectstack#20369 (681868ca7), the spec'sJoinedReportBlockSchemawas erased (unknown), so the local interface was the only type. Specmainnow types the block, and the two disagree member by member. PR objectui#10934's dev triage records the difference, and its case-2c probes pin it:name,type.labelanddescription: the local{default, translations}arm is not a spec inline locale map.columnsnames two concepts. Locally it is a REQUIRED array of column objects; in the spec it is an optional array of dimension names.objectName,groupingsDown,groupingsAcross,filter,chart. The spec's closed schema refuses all five, andchartwas retired by objectstack#20161.dataset,rows,values,runtimeFilter,order(ADR-0021).Replacing the interface with a spec-derived shape is a published-type change:
Clause-②: yes (narrowing). It cannot land while the installed spec is 17.4.0, where the schema is still erased.When it fires
At the first objectui PR that bumps
@objectstack/specpast 17.4.0. On that bump, the tripwire inpackages/types/src/__tests__/report-chart-query-spec-parity.test.tsgoes red:Its docblock names this burn-down as the instruction. The burn-down should land WITH that bump, and it deletes the pin's
erasedarm, so that an erasure stops compiling again on both runs ofSpec Main Shape Gate.Also owed at the same time
@object-ui/types:JoinedReportBlockALLOW row inscripts/check-spec-symbol-derivation.mjsretires with the burn-down.Dedupe words: JoinedReportBlock burn-down, JoinedSpecReport blocks, report-chart-query-spec-parity tripwire, spec bump past 17.4.0.
Generated by Claude Code