Repository navigation
decision(dashboard): options.description, the metric sub-caption the platform writes and the renderer reads but the spec does not declare: declare it, rehome it, or retire both ends (objectstack#5428 item 4)? (objectui#11070) #11389
Description
Activity
- addeddomain: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 lane
on Oct 1, 2026 objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsRuling: batch #264 item 5 · letter C · maintainer 「同意264」 2026-10-01T23:07Z
Director seat, summon #32, objectstack-ai/objectstack
session_016tKoy8NJa35Yih1FdzrVmn. Written asobjectstack-fleet[bot]through the relay.- How it was ruled. Batch Integrate MSW plugin runtime mode into Storybook #264 was presented in the live director chat with this card's options A–D. The director recommended C, fallback B, and said explicitly that C reverses objectstack#5428 item 4. The maintainer answered the batch as presented: 「同意264」.
- Freshness gate: no comment on this card.
The ruling
C: retire the metric sub-caption at both ends, objectstack first.
- This reverses objectstack#5428 item 4 (2026-08-06, 「two authored fields, two keys」).
- A widget keeps one authored description,
widget.description, still rendered as the card-header subtitle. - If a named user later asks for a caption under a metric's value, it returns as a declared widget-level key outside
options(B). It never returns asoptions.description. - Not taken:
- A: declare
options.description, which leaves two authorabledescriptions on one widget. - B: a new declared home, which changes the spec for a capability with zero producers.
- D: the status quo, where the platform's own output fails its strict face.
- A: declare
Readings
- Zero authored writers of
options.description, and zerosubCaptionbundle entries, in either repository (objectui#11070 round 11, dev report 5934110109). - The only writer is objectstack's own
translateDashboard(packages/spec/src/system/i18n-resolver.ts:1590–:1593atmain434c6c7cab). - Prior rulings read: objectstack#5428 item 4 (reversed here); objectstack#7862; objectui#11228 ruling C.
四棱(本裁决新记录)
- ① 长远:一个卡片一个
description,特例最少;将来真有拉动,以 B 的形态(options之外的声明键)回来。 - ② 拉动:零作者写入、零翻译条目(实测)。
- ③ 防 AI:两个
description正是 AI 易混处,C 最紧。 - ④ 不扩散:已发布零消费能力,不因沉没成本豁免。
- 只看①选 C;②③④ 是否翻转:否。
Execution parameters (ruled here; no further decision card)
- objectstack first: spec(i18n,dashboard): retire the metric sub-caption — the
subCaptionwidget translation member andtranslateDashboard'soptions.descriptionoverlay (ruling C on objectui#11389; reverses #5428 item 4) objectstack#21257 (domain:spec,pm:queue).- It retires the
subCaptiontranslation member (a tombstone, plus the alias removed). - It removes
translateDashboard'soptions.descriptionoverlay and drops the census row. - Changeset
minorwith BREAKING,Clause-②: yes (narrowing); contract review at tier.
- It retires the
- This card becomes the objectui half:
needs-user-decision→pm:blockedon objectstack#21257 in this act.- Its scope: drop every read of
options.descriptionas a sub-caption, inDatasetWidget,widgetSubCaptionlimb 1, andDashboardRenderer's inline arms. - Pins: a metric tile renders no sub-caption from
options, andwidget.descriptionstill renders as the header subtitle. - The unlock: objectstack#21257 closing, read by its content on objectstack
main. The objectui change does not need the new spec installed, because it only stops reading a key. The unlock-time check states whether the pin moved anyway.
- Its scope: drop every read of
Generated by Claude Code
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsUpstream landed: objectstack-ai/objectstack#21257 →
99e1912afc. The unlock criterion is an installable release, not the mergeobjectstack
domain:specseat 1 (session_01UtnxvdiN376GF3sgXwAw4d, seat post objectstack-ai/objectstack#6017), holder of #21257's claim · 2026-10-02T06:48Z · ⛔ Not a claim, ⛔ not a state change on this card. This card's lane owns its transitions.- What landed (PR feat(spec): retire the metric sub-caption — the widget translation subCaption key and translateDashboard's options.description overlay objectstack#21342, landing record spec(i18n,dashboard): retire the metric sub-caption — the
subCaptionwidget translation member andtranslateDashboard'soptions.descriptionoverlay (ruling C on objectui#11389; reverses #5428 item 4) objectstack#212575946908632):- the widget translation key
subCaptionis aretiredKey()tombstone, andsubtitleis refused, naming both readings; translateDashboardno longer writesoptions.description;@objectstack/sdui-parser'sCONSUMED_WIDGET_OPTION_KEYSdropsdescription, and the census ledgerNON_DECLARED_MEMBERSis empty.
This ships asminorwith a BREAKING banner, and the change is not yet in a published@objectstack/spec.
- the widget translation key
- The unlock criterion for this card's
Blocked-by:: the first published@objectstack/spec(and@objectstack/sdui-parser) release after 17.6.0 that carries99e1912afc, installed where objectui resolves it. Probe it on the install surface: the installed translation schema refusesdashboards.D.widgets.W.subCaption. The merge to objectstackmainalone does not meet it. - Positions the contract review of PR feat(spec): retire the metric sub-caption — the widget translation subCaption key and translateDashboard's options.description overlay objectstack#21342 (
5946445139, ③) named for this card's reader half, at objectui pin31971ff1e28f:- objectui's own
sdui-parserCONSUMED_WIDGET_OPTION_KEYSand its census test (the "subCaption channel still reads options.description" case); content/docs/plugins/plugin-dashboard.mdx(about:337and:369), which still describe the sub-caption;widgetSubCaption.ts, which still renders an authoredoptions.description.
- objectui's own
- Recorded on objectstack's side: two objectstack example comments, in
examples/app-crm/src/dashboards/pipeline.dashboard.ts:41andexamples/app-todo/src/dashboards/task.dashboard.ts:22("plus the description sub-caption"), become stale when this card lands. objectstack seat post finding: two follow-on questions record:path's one-classification fix deliberately did not settle — a declared mid-pathterminal: 'won', and whether the lost alt-group slice should be classification-driven #6017 carries them for the.objectui-shabump that follows.
- What landed (PR feat(spec): retire the metric sub-caption — the widget translation subCaption key and translateDashboard's options.description overlay objectstack#21342, landing record spec(i18n,dashboard): retire the metric sub-caption — the
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsTriage:
pm:blocked→pm:on-hold. The upstream half landed, but it is not installable yetTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-02T07:02Z. ⛔ Not a claim, ⛔ not a dispatch.Restart-when: an
@objectstack/specrelease that carries99e1912afc(PR objectstack-ai/objectstack#21342) is published on npm, and objectui resolves it. 17.6.0 does not (read at this write).- spec(i18n,dashboard): retire the metric sub-caption — the
subCaptionwidget translation member andtranslateDashboard'soptions.descriptionoverlay (ruling C on objectui#11389; reverses #5428 item 4) objectstack#21257 closedcompletedat 2026-10-02T06:45Z, landed by PR feat(spec): retire the metric sub-caption — the widget translation subCaption key and translateDashboard's options.description overlay objectstack#21342 as99e1912afc. The cross-repo unlock keys on the install face, as the holder's pointer above (5946940099) says. 99e1912afclanded after the 17.6.0 tag (617f25f8a4), so the next spec release carries it. objectui#11438, the 17.6.0 bump, does not.- At the restart, the pointer's probe runs first: the installed spec refuses the retired key by name, and the sdui-parser consumed-keys set has no
description.
Generated by Claude Code
- spec(i18n,dashboard): retire the metric sub-caption — the
objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsTriage:
pm:on-hold→pm:queue. Both halves of this card'sRestart-when:are met: a published@objectstack/*release carries99e1912afc, and objectui now resolves itTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T02:00Z. ⛔ Not a claim, ⛔ not a dispatch.Read at this write:
- The release half:
99e1912afc(PR feat(spec): retire the metric sub-caption — the widget translation subCaption key and translateDashboard's options.description overlay objectstack#21342) is an ancestor of the 17.7.0 tag4e4e881427(git merge-base --is-ancestor). 17.7.0 has been on npm since 2026-10-06. - The resolve half: objectui#11717 landed through PR objectui#11742, merged as
c0862c1ccd, an ancestor of objectuiorigin/main.pnpm-lock.yamlresolves@objectstack/spec@17.7.0;packages/types/package.jsondeclares^17.7.0.
- The bump did not do this card's work. PR objectui#11742's own account (its A4) says the held cards "are only mentioned", and no comment here since the hold changes the scope.
The card's grade and its scope stand as written. The claimant re-reads the hold comment and builds against 17.7.0. Where a package needs a 17.7.0-only export, its floor is already
^17.7.0in@object-ui/types; any other importer raises its own floor, and the PR says so.- The release half:
- added a commit that references this issue
on Oct 7, 2026 objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01DBZ9bntPZ7VKyQNtJeNsgw
Account:huangyiirene(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-11389-retire-subcaption-reads
Worktree:objectui-issue-11389
Domain:domain:spec
Seat:domain:spec#1
Ruling-ref:5942430353(ruling C, read in this pass)
File surface:packages/plugin-dashboard/src/(DatasetWidget.tsx,widgetSubCaption.ts,DashboardRenderer.tsx,DashboardGridLayout.tsxand their sub-caption tests),packages/sdui-parser/src/(dashboard-widget-options.tsand its census and options tests),packages/i18n/src/useObjectLabel.ts(only if the measurement in the dispatch retires the bundle limb too),packages/app-shell/src/views/DashboardView.servedLocalized-11295.test.tsx(only where it pins the sub-caption),content/docs/plugins/plugin-dashboard.mdx, the plugin-dashboard README where it names the sub-caption, one new.changeset/11389-*.md(stop on breach; explain in the report)
Container & model:M,mode:subagent,model: default(dispatch-gates --tier --repo objectstack-ai/objectuion the surface: "no path-derived mandate: the surface hits none of the 3 declared glob(s)"). The contract review is owed atCONTRACT_REVIEW_TIER, by an isolated subagent, because this seat is not serving at that tier.
Clause-②: no
Responsibility: n/a — not a defect card
Thread-read: 6029294789
Serial constraints cleared: none. Read at 2026-10-08T08:42Z on objectuimainf1781be: no open objectui PR touches the surface (6 open PRs, file lists read); none of the 11 openpm:dispatchedclaims in other lanes names it; this seat's hot-file queue is clear. objectui#11070 ispm:blockedon this card and is not claimed.Clause-② reads
nobecause this card narrows: the renderers stop readingoptions.description, and the parser's consumed-key set dropsdescription. Nothing is published or widened. Per the lane charter, it owes one contract review atCONTRACT_REVIEW_TIERbefore the queue.objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11389,
"status": "done",
"branch": "claude/issue-11389-retire-subcaption-reads",
"pr": "#11957",
"session": "session_01DBZ9bntPZ7VKyQNtJeNsgw (mode subagent; the seat's id)",
"premise_still_valid": true,
"summary": "Ruling C's reader half is done in draft PR objectui#11957 (head 0916a26). No metric tile draws a sub-caption on either dashboard surface, whether dataset-bound or a stored inline metric, and widget.description still draws as the card-header subtitle on DashboardRenderer. Concretely: DatasetWidget loses its subCaption prop and its options read; widgetSubCaption.ts (both limbs) is deleted; both inline metric arms drop the key through one helper (withoutRetiredSubCaption); useObjectLabel() loses widgetSubCaption; sdui-parser's CONSUMED_WIDGET_OPTION_KEYS drops description. The restart probe passed first: installed @objectstack/spec 17.7.0 refuses dashboards.D.widgets.W.subCaption by name (the lit control widgets.W.title parses), and the installed @objectstack/sdui-parser 17.7.0 consumed set has no description. H1 confirmed, plus one read site the dispatch did not list: DashboardGridLayout's inline metric arm, whose ...options spread carried the key into MetricWidget's caption. H2 holds: 0 subCaption producers in objectui or in objectstack origin/main f4bed583, and a 17.7.0 server refuses a stored one at load. Three schema-less doors still accept the key (a host I18nProvider config.resources; a host loadLanguage, whose transformSpecTranslations copies dashboards verbatim; a pre-17.7 server), but each carries only a key the spec refuses by name, so the PM's full route was taken. H3 narrows: the accepted set goes from 6 to 5, and an authored options.description goes from 0 diagnostics to 1 warning, code unconsumed-widget-option. Assignee: the card's assignee was huangyiirene at dispatch, and the card was not touched.",
"tests": "Restart probe (before any edit): TranslationDataSchema and TranslationBundleSchema give invalid_type at dashboards.D.widgets.W.subCaption, with a message naming the key as removed in 17.7.0; the widgets.W.title control parses. Baseline at 19a7348 (pnpm exec vitest run packages/plugin-dashboard/ packages/sdui-parser/): 195 files, 2030 passed, 6 skipped. Final union: packages/plugin-dashboard/ gives 174 files, 1725 passed, 6 skipped @344f8cea. Part two @b8b7d515 gives 117 files, 2304 passed, 13 skipped; it covered packages/sdui-parser/, packages/i18n/, the app-shell DashboardView.servedLocalized-11295 test and 13 outside tests that read the changed files or symbols. The first part-two run @344f8cea had 1 failure, the i18n member-count pin (28 vs 27), fixed in b8b7d51. packages/i18n/ plus packages/sdui-parser/ again @0916a26d: 103 files, 1617 passed, 13 skipped. type-check (script name echoed): plugin-dashboard, sdui-parser, i18n and app-shell green @344f8cea, i18n green again @0916a26d; tsconfig.test.json --listFilesOnly lists the 4 changed plugin-dashboard tests and the 2 changed sdui-parser tests. Reverse verification ran from committed 344f8ce via objectstack scripts/ablation-replace.mjs: anchor count and blob change verified on disk, each restore proven (blob == HEAD, git diff HEAD empty). There is no dist leg, because the root vitest aliases point @object-ui/* at src and the tests import their subjects relatively. A, description put back into CONSUMED: 4 failed, 27 passed (the two H3 cases, census leg 1, census leg 2's accepted-has-read-site); the H3 control stayed green; it reads the old verdict as 'expected [] to have a length of 1 but got +0'. B, withoutRetiredSubCaption returning options unchanged: 18 failed, 19 passed, all inline-arm pins (both surfaces, both servedLocalized files); the dataset-tile files stayed green. C, a string-only options.description caption re-injected into DatasetWidget: 11 failed, 29 passed (census legs 2 and 3, R1, R3-beside, L2, the direct-mount string, overlay and repro cases); the map cases (string-only injection) and the inline-arm file stayed green, as expected. C's first attempt was refused by the tool (the replacement contained the anchor): it held the lock 0s, ran no test, and the restore was proven.",
"mcp_calls": "0 GitHub MCP calls. 1 non-GitHub MCP call: mcp__claude-code-remote__add_repo(objectstack-ai/duly, access read), denied by the permission classifier; nothing was attached and it was not retried.",
"api_writes": "3 REST writes, all through the fleet-write relay (each is a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls, giving draft #11957, read back as 13334 bytes stored, identical; (2) label-write.mjs --issue 11957 --assign huangyiirene, POST /repos//issues/11957/assignees, read back MATCHES; (3) this os-dev-report comment, POST /repos//issues/11389/comments. Plus git push (not REST): the empty-branch probe and 3 commits.",
"open_questions": [
{
"question": "objectui#7293, the card that made DatasetWidget draw options.description, was filed from objectstack-ai/duly (duly#109), which asked for a caption under a KPI value. The ruling's producer count covered objectui and objectstack only. Whether duly authors options.description today is NOT MEASURED: REST answered 403, and add_repo was denied. Should the seat measure duly before #11957 leaves draft?",
"options": [
"A: the seat reads duly's dashboards for options.description before queueing. If any are found, the named-user path the ruling already gives (B: a declared widget-level key outside options) gets a card. #11957 lands either way.",
"B: land #11957 without reading duly. The ruling stands, and duly sees the new unconsumed-widget-option warning at authoring time."
],
"recommendation": "A, because it is a single read and keeps a named external app from losing a caption with no notice beyond a warning. It neither reopens nor delays ruling C."
}
],
"out_of_scope_findings": [
"carrier: 承接者:无 · DashboardGridLayout's card header draws the title only, never widget.description, while DashboardRenderer draws both. Pre-existing and dormant: no in-repo surface mounts DashboardGridLayout. Noted in the PR's Acceptance notes, not filed.",
"carrier: objectstack seat post objectstack-ai/objectstack#6017 (.objectui-sha bump), per the holder's pointer 5946940099 · two objectstack example comments ('plus the description sub-caption', in the app-crm pipeline and app-todo task dashboards) go stale when #11957 lands · noted, not filed",
"carrier: the dispatching seat · the duly producer question above is NOT MEASURED (no access), so no class or reach can be stated · raised as open_questions[0], not filed"
],
"gates": {
"head": "0916a26d",
"green_at_0916a26d": [
"check-changeset-presence (1 changeset, 4 released packages)",
"check:changeset-claims",
"check:new-line-citations (0 new)",
"check:control-bytes",
"check:i18n-keys",
"@object-ui/i18n type-check"
],
"green_at_b8b7d515": [
"check:pending-changeset-literals",
"check:i18n-drift",
"check:i18n-dead-keys",
"check:doc-fences",
"check:doc-types",
"check:doc-snippets (784/784 judged, 0 failed)",
"check:doc-examples",
"check:readme-exports",
"check:skill-examples"
],
"green_at_344f8cea": [
"@object-ui/plugin-dashboard type-check",
"@object-ui/sdui-parser type-check",
"@object-ui/app-shell type-check"
],
"first_run_precondition": "check:doc-snippets, check:doc-examples and check:skill-examples first gave PRECONDITION NOT MET (exit 2), and check:readme-exports gave a collapsed population (exit 1), all because of unbuilt dist. Those first runs are NOT a measurement. All four were re-run after the scoped build that check-doc-snippet-types.mjs --build-filter names (35 tasks, green).",
"lint": "pnpm lint is owned by CI. eslint --no-inline-config over the 14 changed TS/TSX files gives 0 errors and 34 warnings; the only warning on a changed line is the rewritten DatasetWidget signature's pre-existing widget: any. This is a targeted run, not a proven narrowing.",
"governed": "check-governed-queue-guard.mjs --test: NOT GOVERNED, 18/18 paths",
"ci": "in_progress (not awaited, per contract)"
},
"line_budget": "n/a: no skills/** or governed path touched",
"deviations": [
"BASE is 19a7348, not the seat's f1781be: main moved before the worktree was cut.",
"Scope follows the PM route because H2 held: limb 2, useWidgetSubCaption and useObjectLabel().widgetSubCaption are retired beyond the ruling's named minimum.",
"Two files outside the claim's listed surface. content/docs/guide/dashboard-filters.md: its 'the renderer still draws a stored widget that carries them' became false for options.description, so it is fixed in the same PR. packages/i18n/src/tests/useObjectLabel-identity-5564.test.tsx: its member-count pin moved from 28 to 27.",
"A fourth read site the dispatch did not list was fixed: DashboardGridLayout's inline metric arm. Both arms go through the new internal helper withoutRetiredSubCaption in widgetDispatch.ts.",
"PR body cosmetic: 'objectstack seat post #6017' autolinks to objectui#6017. The intended spelling is objectstack-ai/objectstack#6017. Not PATCHed per the one-write rule; the seat may edit it.",
"Two verify-lock queue-timeouts (exit 99), both re-queued under the same slot objectui-11389-dev; no measurement was read from them.",
"Changeset: Clause-② is written as 'no (narrowing)' to match the claim's 'Clause-②: no'. The removed export member and the narrowed constant are listed in it."
],
"files_changed": [
".changeset/11389-retire-metric-subcaption.md",
"content/docs/guide/dashboard-filters.md",
"content/docs/plugins/plugin-dashboard.mdx",
"packages/app-shell/src/views/DashboardView.servedLocalized-11295.test.tsx",
"packages/i18n/src/tests/useObjectLabel-identity-5564.test.tsx",
"packages/i18n/src/useObjectLabel.ts",
"packages/plugin-dashboard/README.md",
"packages/plugin-dashboard/src/DashboardGridLayout.tsx",
"packages/plugin-dashboard/src/DashboardRenderer.tsx",
"packages/plugin-dashboard/src/DatasetWidget.tsx",
"packages/plugin-dashboard/src/tests/DashboardRenderer.metricSubCaption.test.tsx",
"packages/plugin-dashboard/src/tests/DashboardRenderer.servedLocalized-11295.test.tsx",
"packages/plugin-dashboard/src/tests/DashboardSurfaces.datasetSubCaption.test.tsx",
"packages/plugin-dashboard/src/tests/DatasetWidget.subCaption.test.tsx",
"packages/plugin-dashboard/src/widgetDispatch.ts",
"packages/plugin-dashboard/src/widgetSubCaption.ts (deleted)",
"packages/sdui-parser/src/tests/dashboard-widget-options-census.test.ts",
"packages/sdui-parser/src/tests/dashboard-widget-options.test.ts",
"packages/sdui-parser/src/dashboard-widget-options.ts"
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11389,
"round": 2,
"status": "done",
"branch": "claude/issue-11389-retire-subcaption-reads",
"pr": "#11957",
"session": "session_01DBZ9bntPZ7VKyQNtJeNsgw (mode subagent; the seat's id)",
"premise_still_valid": true,
"summary": "Patch round 1 fixes both CI reds the seat read on 0916a26; the new head is 567db02. (1) Test (shard 8/8), doc-version-claims: following the gate's own prescription, the two @objectstack/spec 17.7.0 literals this PR added to plugin-dashboard.mdx are deleted and the facts kept. One line now says @objectstack/spec no longer writes the key from a translation; the other says the translation schema in @objectstack/spec refuses a subCaption bundle key by name. No KNOWN_CLAIMS entry was added. The other doc and README lines this PR adds carry no version literal: dashboard-filters.md and the plugin-dashboard README have none, and .changeset is not a scanned root (SCAN_ROOTS is content/docs, packages/*/README.md and skills). (2) Test (shard 4/8), check-hand-rolled-comment-mask: census leg 3's private regex comment projection now goes through scripts/js-comment-mask.mjs. It uses stripComments, because the leg reports file names only, and it is imported with the repo's established @ts-expect-error line. No DEBT entry was added. The PR body was not edited and nothing else on the PR was touched.",
"tests": "All readings at 567db02 unless stated. pnpm exec vitest run scripts/tests/ (whole suite, through the lock): 'Test Files 179 passed | 2 skipped (181)', 'Tests 5452 passed | 2 skipped (5454)', VERDICT command-exit 0. It includes doc-version-claims and check-hand-rolled-comment-mask. The two 'new-cross-file-line-citations: 1 new citation(s)' VERDICT lines in that log come from the gate's own fixture cases; the real gate on the tree reads 0 new. doc-version-claims alone at 43ff16c: 'Tests 29 passed (29)'. Its lit control, putting '17.7.0' back on one line via ablation-replace: 1 failed, 28 passed, naming 'content/docs/plugins/plugin-dashboard.mdx:373 @objectstack/spec` 17.7.0'; the restore was proven (blob == HEAD, git diff HEAD empty). node scripts/check-hand-rolled-comment-mask.mjs: 'swept 6662 source file(s) under .; 6 private comment projection(s) in 5 file(s); DEBT names 5.' and 'OK every carrier is a DEBT entry, and every DEBT entry still carries one. (no carrier outside DEBT)', exit 0. Its lit control, the old regex projection put back: 'BREACH packages/sdui-parser/src/tests/dashboard-widget-options-census.test.ts', exit 1. sdui-parser: pnpm --filter @object-ui/sdui-parser run type-check is green (the @ts-expect-error is consumed), and the census plus options tests give 'Tests 31 passed (31)'; leg 3's lit options.limit control still passes on the stripComments output. Gates: check:doc-fences, check:doc-types, check:new-line-citations (0 new), check:control-bytes, check-changeset-presence, check:changeset-claims and check:pending-changeset-literals are all exit 0. NOT MEASURED: check:doc-snippets, because the 34-package build it needs is not on disk (the worktree was removed after round 1 and recreated for this round). The four lines this round changes in plugin-dashboard.mdx (373, 374, 530, 531) sit outside every code fence, and that gate judges fenced blocks only.",
"mcp_calls": "0",
"api_writes": "1 REST write this round, through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): this os-dev-report comment, POST /repos//issues/11389/comments. Plus 2 git pushes (not REST): 0916a26..43ff16c and 43ff16c..567db02.",
"open_questions": [],
"out_of_scope_findings": [],
"gates": {
"head": "567db020",
"green": [
"scripts/tests/ whole suite (179 files passed, 2 skipped)",
"check-hand-rolled-comment-mask (script)",
"doc-version-claims (in the suite)",
"@object-ui/sdui-parser type-check",
"check:doc-fences",
"check:doc-types",
"check:new-line-citations (0 new)",
"check:control-bytes",
"check-changeset-presence",
"check:changeset-claims",
"check:pending-changeset-literals"
],
"not_measured": [
"check:doc-snippets: build absent in the recreated worktree; the changed lines sit outside any fence"
],
"ci": "in_progress (not awaited)"
},
"line_budget": "n/a",
"deviations": [
"Two pushes, not one. The addendum asking to fold the second red into the same push arrived after 43ff16c (the doc fix) was already pushed, so the census fix went up separately as 567db02.",
"My mistake while building the comment-mask lit control: I ran ablation-replace before committing the stripComments edit. Its restore goes to HEAD, so it removed my uncommitted edit as well. The reading is still valid, because the mutated file was the old projection, and BREACH named the census file. The edit was re-applied verbatim and committed (567db02), and every reading above was taken after that commit.",
"Round 1's union missed the whole scripts/tests suite. I picked root script tests by grepping for the changed file names, and both reds came from suites that read the tree by content pattern. This round ran the whole suite.",
"The worktree had been removed after round 1, so it was recreated on the same branch at 0916a26, with pnpm install and a scoped sdui-parser^... build (5 tasks)."
],
"files_changed": [
"content/docs/plugins/plugin-dashboard.mdx",
"packages/sdui-parser/src/tests/dashboard-widget-options-census.test.ts"
]
}
Generated by Claude Code
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11389,
"round": "base merge",
"status": "done",
"branch": "claude/issue-11389-retire-subcaption-reads",
"pr": "#11957",
"head": "3c48ad9e",
"session": "session_01DBZ9bntPZ7VKyQNtJeNsgw (mode subagent; the seat's id)",
"premise_still_valid": true,
"summary": "Merged objectui main 3c888c6 into the branch as merge commit 3c48ad9 (parents 567db02 and 3c888c6) with git merge --no-edit: no conflict, no rebase, no force. It was pushed as a fast-forward, 567db02..3c48ad9. main brought two commits since the branch's merge-base 19a7348: f3a0488 and the revert 3c888c6. Their 10 files are app-shell Studio validation files (ObjectValidationsPanel and its tests, validationPresets.ts, metadata-admin i18n.ts), two changesets and content/docs/guide/console.md. None overlaps this PR's 19 paths. The PR body was not edited and no other write was made.",
"tests": "Sanity: git diff HEAD^1 HEAD --stat shows 10 files, all main's (22 insertions, 699 deletions). git diff origin/main...HEAD --stat shows the PR's 19 paths, the 18 files plus the widgetSubCaption.ts deletion (473 insertions, 893 deletions). Through the verify lock, at 3c48ad9: pnpm exec vitest run packages/sdui-parser/src/tests/dashboard-widget-options-census.test.ts scripts/tests/doc-version-claims.test.ts scripts/tests/check-hand-rolled-comment-mask.test.ts gives 'Test Files 3 passed (3)', 'Tests 64 passed (64)', VERDICT command-exit 0. No build was needed: these three read source and the installed spec, and the root vitest aliases point @object-ui/* at src. The farm is CI's.",
"mcp_calls": "0",
"api_writes": "1 REST write, through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): this os-dev-report comment, POST /repos//issues/11389/comments. Plus 1 git push (not REST): 567db02..3c48ad9, a fast-forward.",
"open_questions": [],
"out_of_scope_findings": [],
"gates": {
"head": "3c48ad9e",
"green": [
"dashboard-widget-options-census",
"doc-version-claims",
"check-hand-rolled-comment-mask"
],
"ci": "in_progress (not awaited)"
},
"line_budget": "n/a",
"deviations": [
"The merge commit carries git's default message, because the dispatch prescribed --no-edit, so it has no Claude-Session / Co-authored-by trailer pair. The PR squash-merges, so the message does not reach main.",
"The worktree was recreated from the local branch ref (567db02, equal to the remote) and removed again after the push, without --force."
],
"files_changed": []
}
Generated by Claude Code
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsACCEPT: PR #11957 at
3c48ad9e, reports6057593251(round 1),6057959735(patch round) and6058027075(base merge). From thedomain:spec @ objectuiseat (objectui#10217), sessionsession_01DBZ9bntPZ7VKyQNtJeNsgw, 2026-10-08T10:59Z. Ready and auto-merge follow in this act.Contract face.
- The at-tier record
6057862848read FAIL on0916a26d. Its only two items were the PR's own CI reds:doc-version-claims(two@objectstack/spec 17.7.0literals inplugin-dashboard.mdx) andcheck-hand-rolled-comment-mask(a private comment projection in census leg 3). Its ①–③ otherwise held. - The patch round fixed both, each the way its gate prescribes (no
KNOWN_CLAIMSor DEBT entry). The narrow at-tier record6058353993reads PASS on3c48ad9e, and the seat adopts it. Clause-②: nomatches the change: it removesuseObjectLabel().widgetSubCaptionand dropsdescriptionfromCONSUMED_WIDGET_OPTION_KEYS, and it widens nothing. The changeset declares@object-ui/plugin-dashboard,@object-ui/i18nand@object-ui/sdui-parserminor, with BREAKING stated.
Checked against the PR, not the reports:
- Draft, base
main, first lineFixes #11389. objectui#11070 is written only as "remains open", and no other closing keyword appears. - Not governed: 0 of 19 paths.
- On
3c48ad9e: 43 checks, 40 success and 3 skipped by design.Bundle Analysisis green at 3306.6 KB on the fresh merge ref.main's ceiling is now 3,391,484 bytes (objectui#11949). - File surface, amended by this ACCEPT: the claim's surface plus
packages/plugin-dashboard/src/widgetDispatch.ts(withoutRetiredSubCaption, the fourth read site,DashboardGridLayout's inline arm, which the dispatch did not list),content/docs/guide/dashboard-filters.md(a sentence this change made false) andpackages/i18n/src/__tests__/useObjectLabel-identity-5564.test.tsx(the member count, 28 → 27).packages/i18n/src/useObjectLabel.tswas claimed on condition H2, and H2 held: 0 producers, and the installed 17.7.0 refuses the bundle key by name.
Prose faces, judged by this seat against the diff and
main:- "Nothing on the package entry is removed" holds:
packages/plugin-dashboard/src/index.tsxexports neitherDatasetWidgetnor the deleted resolver (control:DashboardRendereris named 6 times there), and the package has one.export. - The
useObjectLabeldocblock, thedashboard-widget-options.tsheader (five keys, "and nothing else"), the README'slocalizedlist,dashboard-filters.mdand the two rewrittenplugin-dashboard.mdxsentences all hold. The record also checked those two sentences against objectstack's 17.7.0 tag.
The report's question (duly), answered by the seat: land per the ruling. Decision card objectui#11389 put this exact question to the maintainer: "If that ruling's reason still holds (a named user wants metric sub-captions), choose A". The maintainer chose C, and ruling
5942430353names the path back for a named user: a declared widget-level key outsideoptions. Whether objectstack-ai/duly authorsoptions.descriptiontoday is NOT MEASURED. That repository is outside this session's scope, and the dev's attempt to attach it was refused by the permission classifier and not retried. The seat lists it to the maintainer in its round report.Out of scope, one line each:
- Acceptance notes:
DashboardGridLayout's card header never drawswidget.description, whileDashboardRendererdoes. It predates this change and is dormant: no in-repo surface mounts the grid. Carrier: none. - Carried, not filed: two objectstack example comments ("plus the description sub-caption", in the app-crm pipeline and app-todo task dashboards) go stale at this landing. Carrier: objectstack seat post [PM seat] domain:spec — 🟢 os-warren · session_019G5ZnRrTMiwcHG6iZM19zf objectstack#6017's
.objectui-shabump, per the holder's pointer5946940099. - Dropped: the PR body's
#6017autolinks to objectui#6017 instead of [PM seat] domain:spec — 🟢 os-warren · session_019G5ZnRrTMiwcHG6iZM19zf objectstack#6017. It is cosmetic, and nothing reads it.
Generated by Claude Code
- The at-tier record
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsLanded: PR #11957 merged through the merge queue as
d92b2a15.Fixes #11389closed this cardcompleted, andpm:dispatchedcomes off in this act. From thedomain:spec @ objectuiseat (objectui#10217), sessionsession_01DBZ9bntPZ7VKyQNtJeNsgw, 2026-10-08T11:21Z.Verification
- Merge content matches the PR: the landed commit's
git patch-id --stableequals the PR's net diff against its merge base3c888c6e(769e6fc20745on both sides). - On
main, by content:packages/plugin-dashboard/src/widgetSubCaption.tsis gone (control:DatasetWidget.tsxis present). - Reviewed head is the landed head: the narrow at-tier record
6058353993PASSed3c48ad9e, and nothing was pushed after it. - CI on that head: 43 checks, 40 success and 3 skipped by design.
Ruling C is executed at both ends: objectstack
99e1912afc(17.7.0), and this landing. objectui#11070, the parent, is released frompm:blockedin a comment of its own in this act.
Generated by Claude Code
- Merge content matches the PR: the landed commit's
- added a commit that references this issue
on Oct 8, 2026 - added a commit that references this issue
on Oct 9, 2026
Ruled: 5942430353 · letter C · 2026-10-01T23:08Z
Blocked-by: objectstack-ai/objectstack#21257
Filing gate: ② a decision only the maintainer can make. It is a sub-issue of objectui#11070 (round 11, item (ii)), filed by
domain:devxseat 2 (objectui#10917),session_01TdiauJaVCHuj45EzZGUxHh, at shift close. Who acts after the ruling: the objectstackdomain:specseat first (the spec moves), then an objectui round on the reader side.维护者速读
options.description,三处说法不一致:translateDashboard会在下发时写它;DatasetWidget在读它;subCaption条目,唯一的写入方是解析器本身。widget.description分开的作者字段(「两个作者字段两个 key」)。objectstack#7862 为此在翻译节点上加了subCaption成员。options.description;options以外的声明位置;DashboardEditor's map-valued title stays read-only on a premise the spec invalidated, and the card it defers to (#4163) is closed #5428 第 4 条:两端一起退役(objectstack 先动);DashboardEditor's map-valued title stays read-only on a premise the spec invalidated, and the card it defers to (#4163) is closed #5428 第 4 条裁决。如果当时的理由今天仍成立,选 A。The facts (measured in objectui#11070 round 11, dev report
5934110109; objectstackmainb9087d77e, objectui3ae91930)@objectstack/spec17.5.0DashboardWidgetOptionsSchemadeclaresdateGranularity,sortBy,sortOrder,limitandstageOrder, plus anunknowncatchall that admitsdescriptionunjudged. Its docblock says the key "stays undeclared", andcheck:widget-option-censuslists it inNON_DECLARED_MEMBERSas a resolver output.translateDashboard:if (subCaption) next.options = { ...w.options, description: subCaption };, from the widget translation node'ssubCaptionmember (added by objectstack#7862 for objectstack#5428 item 4).subCaptionbundle entries: 0 in either repository's apps, examples or platform objects.DatasetWidget(the metric tile's sub-caption),widgetSubCaptionlimb 1, andDashboardRenderer's inline arms.options.description, the same as an undeclared control key. The tolerant face and the spec accept it.subCaptionmember.DatasetWidgetreads it.Options, along the four axes
options.description(anI18nLabel) on the widget options.DashboardEditor's map-valued title stays read-only on a premise the spec invalidated, and the card it defers to (#4163) is closed #5428 item 4 ruled into existence.descriptions (widget.descriptionandoptions.description). That is the confusion plugin-designer:DashboardEditor's map-valued title stays read-only on a premise the spec invalidated, and the card it defers to (#4163) is closed #5428 ruled on by naming them as two fields.options(for example a widget-level key), andtranslateDashboardwrites there.options.descriptionretires.descriptionplus a distinctly named key.subCaptiontranslation member, drop the overlay and the census row; then objectui drops theoptions.descriptionreads.widget.descriptionkeeps rendering as the card-header subtitle.description.Recommendation: C, on the business-need axis (zero producers, measured). It is the maintainer's call because it reverses #5428 item 4. If that ruling's reason still holds (a named user wants metric sub-captions), choose A to keep the ruling exactly, or B if the sub-caption should leave the query-key bag.
Duplicate check
Parent: objectui#11070.