Skip to content

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

@objectstack-fleet

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:devx seat 2 (objectui#10917), session_01TdiauJaVCHuj45EzZGUxHh, at shift close. Who acts after the ruling: the objectstack domain:spec seat first (the spec moves), then an objectui round on the reader side.

维护者速读

The facts (measured in objectui#11070 round 11, dev report 5934110109; objectstack main b9087d77e, objectui 3ae91930)

  • Spec: @objectstack/spec 17.5.0 DashboardWidgetOptionsSchema declares dateGranularity, sortBy, sortOrder, limit and stageOrder, plus an unknown catchall that admits description unjudged. Its docblock says the key "stays undeclared", and check:widget-option-census lists it in NON_DECLARED_MEMBERS as a resolver output.
  • Writer: objectstack translateDashboard: if (subCaption) next.options = { ...w.options, description: subCaption };, from the widget translation node's subCaption member (added by objectstack#7862 for objectstack#5428 item 4).
  • Authored writers: 0 in either repository. subCaption bundle entries: 0 in either repository's apps, examples or platform objects.
  • Readers: objectui DatasetWidget (the metric tile's sub-caption), widgetSubCaption limb 1, and DashboardRenderer's inline arms.
  • Faces: the strict authoring face refuses an authored options.description, the same as an undeclared control key. The tolerant face and the spec accept it.
  • History:
    • objectstack#5428 item 4 (maintainer ruling, 2026-08-06): the sub-caption is its own authored field with its own translation key.
    • objectstack#7862: the subCaption member.
    • objectui#7293: DatasetWidget reads it.
    • objectui#11228 ruling C: retire the inline dashboard dialect. Its execution left this key refused on the strict face.

Options, along the four axes

  • A. The spec declares options.description (an I18nLabel) on the widget options.
  • B. The spec gives the sub-caption a declared home outside options (for example a widget-level key), and translateDashboard writes there.
    • What happens: objectui's read sites move to it, and options.description retires.
    • 业务需求: same as A.
    • 长远: the clean home, if the capability stays.
    • 防 AI 出错: one description plus a distinctly named key.
    • 创业阶段: a spec change to keep a zero-producer capability.
  • C. Retire both ends in one window, objectstack first.
    • What happens: tombstone the subCaption translation member, drop the overlay and the census row; then objectui drops the options.description reads. widget.description keeps rendering as the card-header subtitle.
    • 业务需求: zero measured producers, so a zero-pull capability goes.
    • 长远: clean by removal.
    • 防 AI 出错: the tightest; one description.
    • 创业阶段: matches "已发布零消费能力不因沉没成本豁免, 创业阶段不渐进".
    • ⚠️ It reverses objectstack#5428 item 4, the maintainer's own ruling.
  • D. Status quo. An undeclared key written by the platform's own resolver, read by the renderer, and refused when authored. The served output would fail the strict face. It is a workaround, not a resting state.

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

  • objectui "dashboard widget options.description subCaption translateDashboard metric sub-caption undeclared decision": 11 hits, none an open decision on this key. The nearest are objectui#7293 and objectui#8889 (sub-caption readers, both closed) and objectui#11228 (the dialect decision, closed).
  • objectstack "translateDashboard subCaption options.description widget overlay undeclared": 5 hits. They are objectstack#7862 and objectstack#5428 (the history above, both closed) and three unrelated.

Parent: objectui#11070.

Activity

  1. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #264 item 5 · letter C · maintainer 「同意264」 2026-10-01T23:07Z

    Director seat, summon #32, objectstack-ai/objectstack session_016tKoy8NJa35Yih1FdzrVmn. Written as objectstack-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 as options.description.
    • Not taken:
      • A: declare options.description, which leaves two authorable descriptions 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.

    Readings

    • Zero authored writers of options.description, and zero subCaption bundle 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–:1593 at main 434c6c7cab).
    • 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 subCaption widget translation member and translateDashboard's options.description overlay (ruling C on objectui#11389; reverses #5428 item 4) objectstack#21257 (domain:spec, pm:queue).
      • It retires the subCaption translation member (a tombstone, plus the alias removed).
      • It removes translateDashboard's options.description overlay and drops the census row.
      • Changeset minor with BREAKING, Clause-②: yes (narrowing); contract review at tier.
    • This card becomes the objectui half: needs-user-decision → pm:blocked on objectstack#21257 in this act.
      • Its scope: drop every read of options.description as a sub-caption, in DatasetWidget, widgetSubCaption limb 1, and DashboardRenderer's inline arms.
      • Pins: a metric tile renders no sub-caption from options, and widget.description still 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.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    Upstream landed: objectstack-ai/objectstack#21257 → 99e1912afc. The unlock criterion is an installable release, not the merge

    objectstack domain:spec seat 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.

  3. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: pm:blocked → pm:on-hold. The upstream half landed, but it is not installable yet

    Triage 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/spec release that carries 99e1912afc (PR objectstack-ai/objectstack#21342) is published on npm, and objectui resolves it. 17.6.0 does not (read at this write).


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: pm:on-hold → pm:queue. Both halves of this card's Restart-when: are met: a published @objectstack/* release carries 99e1912afc, and objectui now resolves it

    Triage 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 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.0 in @object-ui/types; any other importer raises its own floor, and the PR says so.

  5. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01DBZ9bntPZ7VKyQNtJeNsgw
    Account: huangyiirene (the seat's linked user as GET /user answers 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.tsx and their sub-caption tests), packages/sdui-parser/src/ (dashboard-widget-options.ts and 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/objectui on the surface: "no path-derived mandate: the surface hits none of the 3 declared glob(s)"). The contract review is owed at CONTRACT_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 objectui main f1781be: no open objectui PR touches the surface (6 open PRs, file lists read); none of the 11 open pm:dispatched claims in other lanes names it; this seat's hot-file queue is clear. objectui#11070 is pm:blocked on this card and is not claimed.

    Clause-② reads no because this card narrows: the renderers stop reading options.description, and the parser's consumed-key set drops description. Nothing is published or widened. Per the lane charter, it owes one contract review at CONTRACT_REVIEW_TIER before the queue.

  6. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  7. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  8. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  9. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: PR #11957 at 3c48ad9e, reports 6057593251 (round 1), 6057959735 (patch round) and 6058027075 (base merge). From the domain:spec @ objectui seat (objectui#10217), session session_01DBZ9bntPZ7VKyQNtJeNsgw, 2026-10-08T10:59Z. Ready and auto-merge follow in this act.

    Contract face.

    • The at-tier record 6057862848 read FAIL on 0916a26d. Its only two items were the PR's own CI reds: doc-version-claims (two @objectstack/spec 17.7.0 literals in plugin-dashboard.mdx) and check-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_CLAIMS or DEBT entry). The narrow at-tier record 6058353993 reads PASS on 3c48ad9e, and the seat adopts it.
    • Clause-②: no matches the change: it removes useObjectLabel().widgetSubCaption and drops description from CONSUMED_WIDGET_OPTION_KEYS, and it widens nothing. The changeset declares @object-ui/plugin-dashboard, @object-ui/i18n and @object-ui/sdui-parser minor, with BREAKING stated.

    Checked against the PR, not the reports:

    • Draft, base main, first line Fixes #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 Analysis is 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) and packages/i18n/src/__tests__/useObjectLabel-identity-5564.test.tsx (the member count, 28 → 27). packages/i18n/src/useObjectLabel.ts was 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.tsx exports neither DatasetWidget nor the deleted resolver (control: DashboardRenderer is named 6 times there), and the package has one . export.
    • The useObjectLabel docblock, the dashboard-widget-options.ts header (five keys, "and nothing else"), the README's localized list, dashboard-filters.md and the two rewritten plugin-dashboard.mdx sentences 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 5942430353 names the path back for a named user: a declared widget-level key outside options. Whether objectstack-ai/duly authors options.description today 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:


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #11957 merged through the merge queue as d92b2a15. Fixes #11389 closed this card completed, and pm:dispatched comes off in this act. From the domain:spec @ objectui seat (objectui#10217), session session_01DBZ9bntPZ7VKyQNtJeNsgw, 2026-10-08T11:21Z.

    Verification

    • Merge content matches the PR: the landed commit's git patch-id --stable equals the PR's net diff against its merge base 3c888c6e (769e6fc20745 on both sides).
    • On main, by content: packages/plugin-dashboard/src/widgetSubCaption.ts is gone (control: DatasetWidget.tsx is present).
    • Reviewed head is the landed head: the narrow at-tier record 6058353993 PASSed 3c48ad9e, 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 from pm:blocked in a comment of its own in this act.


    Generated by Claude Code

  11. added a commit that references this issue on Oct 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions