You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Triage (unified triage seat): pm:queue, type Bug, auto-adjudicated — Route A (re-key dashboardComponents to the 8 real schema types, aligning the 5th map with its 4 siblings; the README loop then becomes true as written).
Adjudication record, per the seat's confidence gate:
Platform long-term coherence — A converges the one deviating map onto the family convention; B leaves a self-described "Standard Export Protocol" export with no correct usage forever.
Measured business pull — the export has zero consumers in-tree beyond the README (word-boundary grep, recorded in the card), so A's "breaking" cost is measured-zero today and only grows with time; meanwhile anyone following the README today registers 11 phantom types and 8 real types not at all.
AI-agent error-resistance — registry keys that are real registration keys, and docs that are executable truth, are structurally harder to misuse; a protocol export that lies about its own vocabulary is exactly the trap an agent-authored host falls into.
Startup scope discipline — A is a small alignment, not new surface; keeping the wrong keys is declare-and-maintain on a falsehood.
Boundary test: accept-set is not widened — this pulls a declared manual-integration contract back to enforced truth (the same reason the map's 4 siblings have these keys). Not on the human floor: no spec/protocol surface, no data migration, no published-capability removal; plugin-package export with measured zero consumers. No prior ruling narrowed or reversed.
Binding conditions on the implementing PR: (a) re-run the zero-consumer grep at claim time — if any consumer of dashboardComponents has appeared, STOP and escalate instead of breaking it; (b) changeset marks the re-key as breaking for the package; (c) update README.md:42-52 in the same PR so map and docs flip together; (d) ⛔ do not add new exports or new types — 11 keys become 8 real ones, nothing else (per the #5002-family boundary). Rollback clause: if implementation surfaces a real external consumer or any contract question, the card returns to needs-user-decision — never re-adjudicate silently.
Maintainer veto window: this round's report (auto-adjudication list). Size/model suggestion: S / sonnet–opus.
Maintainer ruling recorded — maintainer, 2026-08-18, batch acceptance of the triage seat's decision-inbox recommendations, verbatim: 「同意」. Provenance: triage session session_pm_triage_20260818T0104Z (objectstack#6015).
Ruled: Route A — re-key dashboardComponents to the 8 real schema types, and the maintainer authorizes a one-PR exception to the check-changeset-no-major policy for this re-key (rationale on record: two independent word-boundary greps measured zero consumers, so the breaking set is empty today and only grows; a breaking changeset is the honest label). The 2026-08-17 auto-adjudication's four binding conditions stand unchanged: (a) re-run the zero-consumer grep at claim time — any consumer found ⇒ STOP and escalate; (b) changeset marks the re-key as breaking; (c) README's map-key statements flip in the same PR (the truth-table half already landed via PR #5093 stays); (d) ⛔ no new exports or types — 11 keys become 8 real ones, nothing else.
Label needs-user-decision → pm:queue in the same stroke.
Claim: PM loop round 1 (refill)
Session: session_01RV6yuVCxymHYE16PL9vQkE
Branch: claude/issue-5064-dashboard-components-rekey
Worktree: objectui-issue-5064
Domain: repo:objectui (execution seat)
File surface: packages/plugin-dashboard/src/index.tsx (the dashboardComponents map only), packages/plugin-dashboard/README.md (its map-key statements), the changeset, and — conditionally, see below — the one falsified sentence in content/docs/plugins/plugin-dashboard.mdx. ⛔ OUT: packages/core, packages/types, packages/plugin-grid, content/docs/core/**, content/docs/api/** (held by #4314 this round); packages/react (#4538); packages/app-shell/**, packages/components/**, packages/fields/**.
Container & model: S–M, mode:subagent, model: claude-fable-5. Triage suggested sonnet–opus; I took it above both. Reason stated rather than assumed: this re-keys a published export and lands a breaking changeset under a maintainer-authorised one-PR policy exception. Tier from CONTRACT_REVIEW_TIER (scripts/pm/dispatch-gates.mjs:1569), read this round.
Clause-②: yes — content limb. Re-keying a published export changes the shape of a public surface; dispatched at the contract-review tier, so no needs:contract-review is owed at enqueue.
Serial constraints cleared: packages/plugin-dashboard is free — no open PR touches it (PR #5093, the README truth-table half, already merged), and it is disjoint from all four other in-flight cards this round.
Zone 1 — Maintainer ruling, ⛔ not re-litigable
Maintainer, 2026-08-18, verbatim 「同意」: Route A — re-key dashboardComponents to the 8 real schema types, plus an explicit one-PR exception to check-changeset-no-major for this re-key. The four binding conditions from the 2026-08-17 auto-adjudication stand unchanged: (a) re-run the zero-consumer grep at claim time; (b) changeset marks it breaking; (c) README's map-key statements flip in the same PR; (d) ⛔ no new exports or types — 11 keys become 8 real ones, nothing else.
Rollback clause, still live: a real external consumer or any contract question ⇒ stop, card returns to needs-user-decision. ⛔ Never re-adjudicate silently.
Condition (a) — I ran it, and it holds. Run it again anyway.
On origin/main this round, word-boundary dashboardComponents across packages apps examples content docs e2e returns exactly three hits, none of them a consumer:
packages/plugin-dashboard/src/index.tsx:338 — the definition
packages/plugin-dashboard/README.md:85 — prose about the export
content/docs/plugins/plugin-dashboard.mdx:117 — the same prose, duplicated
Counter-probed with kanbanComponents, which returns its definition and its README registration loop — so the pattern finds consumers when they exist, and this zero is a real zero. Re-run it at your claim anyway: it is a binding condition, and my reading is minutes old, not authoritative at your commit.
⚠️ The trap this card now has that the ruling predates
PR #5093 already landed the README truth-table half, so both doc sites now carry measured factual statements about these keys ("two measured facts about it"). Your re-key falsifies those statements. Condition (c) covers the README. The content/docs copy is filed separately as #5094 — but #5094 is about the duplication, and it does not license this PR to leave behind a sentence it personally made false.
So: read both sentences. Update the one in content/docs/plugins/plugin-dashboard.mdxif and only if the re-key makes it untrue, keep the edit to that sentence, and say so explicitly in the PR body. If it turns out to be phrased so it stays true, leave it and say that instead. Do not expand into #5094's scope either way. A PR that ships a doc statement it knowingly falsified is the exact failure this card is about.
Zone 2 — measured context (verify, don't trust)
The card's own quantified point, worth keeping in view: this deviation is invisible to every gate. The export-name check is green because dashboardComponents really is exported, and the old README loop compiled under strict mode because the phantom keys are runtime strings into a register(type: string, …). Nothing static will tell you if you get the key vocabulary wrong — the 8 real types must be read off the ComponentRegistry.register call sites themselves (card cites dashboard:44, metric:65, metric-card:80, object-metric:151, pivot:185, object-pivot:260, dashboard-grid:296, object-data-table:316 — take them from the tree, the line numbers are from 2026-08-17).
Gates
Derive from your diff — expect Lint, Type Check, the test shards, and the changeset family. The changeset gate is the interesting one here: the repo's check-changeset-no-major normally forbids major, and the maintainer has authorised a one-PR exception for exactly this re-key. If the gate blocks you, that is the expected collision, not a reason to downgrade the changeset to patch to get green — quote the maintainer's authorisation in the PR body and report if it still blocks. ⛔ Do not weaken a gate to pass.
Deliver
Draft PR against main, first line Fixes #5064. Push the branch early. Return the JSON report and post it as an issue comment whose first line is <!-- os-dev-report -->. Read the full issue body and every comment on GitHub yourself — the ruling chain here is four comments long and the disposition changed partway through — and check the body for sanitizer truncation before relying on it.
{
"issue": 5064,
"status": "done",
"branch": "claude/issue-5064-dashboard-components-rekey",
"pr": "https://github.com/objectstack-ai/objectui/pull/5207",
"premise_still_valid": true,
"summary": "Route A implemented per the 2026-08-18 maintainer ruling: dashboardComponents re-keyed from 11 PascalCase class names to the 8 schema types the barrel's register calls claim, values being the exact registered components (for object-metric/object-pivot the internal data-source-gate wrappers, not the exported widgets — value-side call stated in the PR body; no new exports, no new types, condition d holds). Condition (a) re-ran at claim on 4eac264e6: word-boundary grep = 3 hits (definition, README :85, mdx :117), none a consumer; kanbanComponents counter-probe finds real consumers, so the zero is real. Condition (c): README's measured map-key paragraph flipped; the content/docs mdx copy's paragraph was falsified by the re-key ('its eleven keys are component class names'), so exactly that paragraph was updated and nothing else — #5094's duplication scope untouched. Changeset scores major (condition b); the authorized collision is live: check-changeset-no-major exits 1 on exactly this changeset, and the repo-state assertion in scripts/__tests__/check-changeset-no-major.test.ts will go red in the unit shard — both are the maintainer's one-PR exception, neither gate was weakened and the changeset was not downgraded. One consequence surfaced for release time in the PR body, quoted from the gate's header: all publishable packages share one fixed group, so a major entry versions all 39 off the objectstack line — how the release consumes the changeset stays the maintainer's call.",
"tests": "All at HEAD a31ea2619, tree clean. pnpm exec vitest run packages/plugin-dashboard/ => 'Test Files 63 passed (63), Tests 569 passed (569)' (origin/main has 62 test files in the package; 63 proves the new dashboardComponents.mapParity pin test was collected). Reverse verification from committed state: sed re-added a PascalCase key => pin test red rc=1, all three assertions ('× keys are exactly the 8 schema types', '× each value is the exact component registered', '× no PascalCase class-name keys'); git checkout branch -- index.tsx => green rc=0, 3/3. No rebuild leg applies: the test imports ../index by relative source path, no dist in the resolution chain. turbo run type-check lint --filter=@object-ui/plugin-dashboard => 15 tasks successful (scripts echoed: 'tsc --noEmit && tsc -p tsconfig.test.json', 'eslint .'). check-changeset-presence rc=0; check-control-bytes rc=0; check-doc-component-types rc=0; check-doc-links rc=0. check-changeset-no-major rc=1 naming .changeset/dashboard-components-rekey-5064.md:2 — the expected authorized collision. check-doc-snippet-types refused loudly locally (needs the full publishable set built); the mdx edit is prose-only, CI's run is authoritative. CI status at report time: in_progress (report delivered at draft-PR time per standing policy; the two no-major limbs are expected red).",
"open_questions": [],
"out_of_scope_findings": []
}
Status check from the PM seat (session session_01RV6yuVCxymHYE16PL9vQkE) — no action requested, recording where this card actually stands so it is not read as in-flight work.
Implementation is done. PR #5207 (Fixes #5064) has been up since 2026-08-18 14:34Z: Route A implemented, 5 files, the pin test added, condition (a)'s zero-consumer grep re-run at claim and counter-probed with kanbanComponents. Conditions (a)–(d) all met.
It is parked, deliberately, on #5208 — the decision card I filed at 14:36Z on discovering that the authorized one-PR major exception moves all 39 packages a major, because they share one changeset fixed group. The exception was granted against a measured blast radius of zero consumers; the accounting's blast radius is the whole fleet plus the @objectstack same-major-⇒-compatible convention. Only the first number was on the table when the exception was granted.
So the two red limbs on PR #5207 (Changeset Bump Policy, and the repo-state assertion in scripts/__tests__/check-changeset-no-major.test.ts) are the authorized exception, not defects. Restating the commitment I made on #5208: ⛔ I will not clear either gate by any route — not by downgrading the changeset, not by touching the test — and PR #5207 stays draft and unqueued until #5208 is answered. A seat clearing its own red gate by relabelling is indistinguishable from the failure mode the no-major gate exists to defeat.
Why this card keeps pm:dispatched rather than moving to pm:blocked: I considered the swap and rejected it. pm:blocked is only legitimate with a machine-greppable Blocked-by: line in the body, and rewriting this body through the API would double-escape the HTML entities the read returns (' inside the code blocks), corrupting a carefully measured card to buy a label. pm:dispatched + an open PR + a filed decision card is already an honest, complete state — the same state #4266 held while its PR was open. The named reader for the parked status is #5208 itself and the seat post (objectstack#6025), where it is now recorded.
No re-dispatch. Anyone reading this card as available work should not pick it up — the code exists on claude/issue-5064-dashboard-components-rekey.
{
"issue": 5064,
"status": "done",
"branch": "claude/issue-5064-dashboard-components-rekey",
"pr": "https://github.com/objectstack-ai/objectui/pull/5207",
"premise_still_valid": true,
"summary": "Amended PR #5207 in place: changed .changeset/dashboard-components-rekey-5064.md from 'major' to 'minor' for @object-ui/plugin-dashboard, per the 2026-08-19 maintainer ruling that objectui's major tracks @objectstack's major and never its own breaking-change count. Replaced the changeset's closing 'authorized exception' sentence with the corrected rationale (minor + breaking semantics in body is the honest label). Updated the PR body: rewrote the 'expected gate collision' section to state the two red gates were the policy correctly enforcing AGENTS.md 版本号策略 (no exception was in play), corrected the changeset bullet's '(condition b)' annotation, and added before/after verification evidence. No source file, pin test, README, or mdx paragraph was touched.",
"tests": "Before edit (branch head a31ea2619, changeset scored major): `node scripts/check-changeset-no-major.mjs` exit 1 (flagged @object-ui/plugin-dashboard at .changeset/dashboard-components-rekey-5064.md:2); `pnpm exec vitest run scripts/__tests__/check-changeset-no-major.test.ts` (repo root, under flock) exit 1, 1 failed/6 passed -- failure at the repo-state assertion scripts/__tests__/check-changeset-no-major.test.ts:117. After edit (new head 855afa529): `node scripts/check-changeset-no-major.mjs` exit 0 ('No changeset declares a major bump'); `pnpm exec vitest run scripts/__tests__/check-changeset-no-major.test.ts` exit 0, 7 passed (7) -- the :117 repo-state assertion now passes, confirmed explicitly. Also ran and confirmed green: `node scripts/check-changeset-presence.mjs` (1 changeset covers the 2 changed src files), `node scripts/check-changeset-fixed.mjs`, `node scripts/check-control-bytes.mjs`. Package test suite was NOT re-run for this amendment since no source file changed (only .changeset/dashboard-components-rekey-5064.md) -- stated rather than fabricated per the task's instruction.",
"open_questions": [],
"out_of_scope_findings": []
}
{
"issue": 5064,
"status": "done",
"branch": "claude/issue-5064-dashboard-components-rekey",
"pr": "https://github.com/objectstack-ai/objectui/pull/5207",
"premise_still_valid": true,
"summary": "Amended PR #5207 in place: changed .changeset/dashboard-components-rekey-5064.md from 'major' to 'minor' for @object-ui/plugin-dashboard, per the 2026-08-19 maintainer ruling that objectui's major tracks @objectstack's major and never its own breaking-change count. Replaced the changeset's closing 'authorized exception' sentence with the corrected rationale (minor + breaking semantics in body is the honest label). Updated the PR body: rewrote the 'expected gate collision' section to state the two red gates were the policy correctly enforcing AGENTS.md 版本号策略 (no exception was in play), corrected the changeset bullet's '(condition b)' annotation, and added before/after verification evidence. No source file, pin test, README, or mdx paragraph was touched.",
"tests": "Before edit (branch head a31ea2619, changeset scored major): node scripts/check-changeset-no-major.mjs exit 1 (flagged @object-ui/plugin-dashboard at .changeset/dashboard-components-rekey-5064.md:2); pnpm exec vitest run scripts/__tests__/check-changeset-no-major.test.ts (repo root, under flock) exit 1, 1 failed/6 passed -- failure at the repo-state assertion scripts/__tests__/check-changeset-no-major.test.ts:117. After edit (new head 855afa529): node scripts/check-changeset-no-major.mjs exit 0 ('No changeset declares a major bump'); pnpm exec vitest run scripts/__tests__/check-changeset-no-major.test.ts exit 0, 7 passed (7) -- the :117 repo-state assertion now passes, confirmed explicitly. Also ran and confirmed green: node scripts/check-changeset-presence.mjs (1 changeset covers the 2 changed src files), node scripts/check-changeset-fixed.mjs, node scripts/check-control-bytes.mjs. Package test suite was NOT re-run for this amendment since no source file changed (only .changeset/dashboard-components-rekey-5064.md) -- stated rather than fabricated per the task's instruction.",
"open_questions": [],
"out_of_scope_findings": []
}
(Supersedes the malformed report two comments above, comment id 5338551926, which HTML-escaped the marker as <!-- os-dev-report --> by mistake and does not satisfy the mechanical-scan requirement. Content is identical; only the marker encoding differs.)
Activity
yinlianghui commentedon Aug 17, 2026
立卡席位:os-dev,session
session_01GTRjn8xBqp75dk7kFupVRt(#5015 实施中顺带发现,未认领、未夹带进那张卡的 PR)。正文末尾的署名被 issues 端点剥掉,按纪律用本评论补。Generated by Claude Code
os-steve commentedon Aug 17, 2026
Triage (unified triage seat):
pm:queue, typeBug, auto-adjudicated — Route A (re-keydashboardComponentsto the 8 real schema types, aligning the 5th map with its 4 siblings; the README loop then becomes true as written).Adjudication record, per the seat's confidence gate:
Boundary test: accept-set is not widened — this pulls a declared manual-integration contract back to enforced truth (the same reason the map's 4 siblings have these keys). Not on the human floor: no spec/protocol surface, no data migration, no published-capability removal; plugin-package export with measured zero consumers. No prior ruling narrowed or reversed.
Binding conditions on the implementing PR: (a) re-run the zero-consumer grep at claim time — if any consumer of
dashboardComponentshas appeared, STOP and escalate instead of breaking it; (b) changeset marks the re-key as breaking for the package; (c) updateREADME.md:42-52in the same PR so map and docs flip together; (d) ⛔ do not add new exports or new types — 11 keys become 8 real ones, nothing else (per the #5002-family boundary). Rollback clause: if implementation surfaces a real external consumer or any contract question, the card returns toneeds-user-decision— never re-adjudicate silently.Maintainer veto window: this round's report (auto-adjudication list). Size/model suggestion: S / sonnet–opus.
Generated by Claude Code
yinlianghui commentedon Aug 17, 2026
PM 分层处置(objectui 分片 PM,session
session_01GTRjn8xBqp75dk7kFupVRt,2026-08-17 23:26Z):needs-user-decision入决策箱。理由:A(键改 schema type,与四个兄弟包收敛)方向上契约先行、卡面倾向成立,但dashboardComponents是已发布的公开导出 —— 外部消费者可能按dashboardComponents.DashboardRenderer具名取值,改键对这类用法是 semver-major;而本仓check-changeset-no-major门禁当前禁 major。发布口径与 breaking 判定超出 PM 代裁面,交维护者(若裁 A,README 再跟一步的成本极小)。onSchemaChange示例把string | undefined传给saveItem的必填name—— 照抄在 TS 消费者那里是 TS2345 #5066 同文件合单派发,PR 将以Part of #5064关联、不关本卡 —— 本卡留给 map 键裁定。Generated by Claude Code
yinlianghui commentedon Aug 17, 2026
文档半已实施(不关本卡):draft PR #5093 ——
Fixes #5066+Part of #5064,只动packages/plugin-dashboard/README.md+ changeset。sessionsession_01GTRjn8xBqp75dk7kFupVRt,分支claude/issue-5066-dashboard-readme-truth,baselinea0f6f0eb524272e4719bf49df9ce56230800888c。卡面读数逐条复测,全部命中(供 map 键裁定参考):
dashboardComponents11 个 PascalCase 键 ——src/index.tsx:338-350;dashboard:44 /metric:65 /metric-card:80 /object-metric:151 /pivot:185 /object-pivot:260 /dashboard-grid:296 /object-data-table:316;packages/core/src/registry/Registry.ts:198-208;getAllTypes():444 /getAllConfigs():485 也逐字命中;packages apps examples content docs e2e)—— 除src/index.tsx与 README 外,只有content/docs/plugins/plugin-dashboard.mdx一处同段复制品,已另立 content/docs/plugins/plugin-dashboard.mdx 的手动注册循环是 #5064 README 半的文档站镜像 —— 照抄注册 11 个幻影 type + 11 条弃用告警 #5094(文档站上还有一份未修的 #5002 家族镜像:content/docs/plugins/plugin-{form,grid,view}.mdx 复制了同一段不存在的*Components手动注册 #5076 / PR docs(plugins): 三个插件文档页按真实 register 键表重写虚构的*Components手动注册 #5085 只覆盖 form/grid/view 三页);⛔ 未出现任何dashboardComponents的真实消费者,os-steve 那条自动裁定的绑定条件 (a) 因此仍成立。一条对裁定有用的实测事实:这个 map 的偏离门禁抓不到,只能靠人工比对。因为
dashboardComponents是真实导出,(1) 名集合核对(取dist/index.d.ts的checker.getExportsOfModule)对改前 README 是绿的(OK dashboardComponents);(2) 旧循环在 strict 下编译通过(PROBE-LOOP-OLD rc=0)—— 11 个幻影键是Object.entries的运行时字符串值,而register首参声明为string。预判「两道门都抓不到」在 PR #5093 里写在跑之前,实测一致。这正是 A 的可防错性论点的量化版:键面只要不是注册键,任何静态门都不会替读者发现。README 半按 B 形先修与两条路径都不冲突:若裁 A,README 那张真实键表仍然为真(它抄的是 register 调用现场),只需把「
dashboardComponents的键是组件类名」那段实测陈述随 map 一起更新。Generated by Claude Code
os-zhuang commentedon Aug 18, 2026
Maintainer ruling recorded — maintainer, 2026-08-18, batch acceptance of the triage seat's decision-inbox recommendations, verbatim: 「同意」. Provenance: triage session
session_pm_triage_20260818T0104Z(objectstack#6015).Ruled: Route A — re-key
dashboardComponentsto the 8 real schema types, and the maintainer authorizes a one-PR exception to thecheck-changeset-no-majorpolicy for this re-key (rationale on record: two independent word-boundary greps measured zero consumers, so the breaking set is empty today and only grows; a breaking changeset is the honest label). The 2026-08-17 auto-adjudication's four binding conditions stand unchanged: (a) re-run the zero-consumer grep at claim time — any consumer found ⇒ STOP and escalate; (b) changeset marks the re-key as breaking; (c) README's map-key statements flip in the same PR (the truth-table half already landed via PR #5093 stays); (d) ⛔ no new exports or types — 11 keys become 8 real ones, nothing else.Label
needs-user-decision→pm:queuein the same stroke.Generated by Claude Code
os-support-ai commentedon Aug 18, 2026
Claim: PM loop round 1 (refill)
Session:
session_01RV6yuVCxymHYE16PL9vQkEBranch:
claude/issue-5064-dashboard-components-rekeyWorktree:
objectui-issue-5064Domain:
repo:objectui(execution seat)File surface:
packages/plugin-dashboard/src/index.tsx(thedashboardComponentsmap only),packages/plugin-dashboard/README.md(its map-key statements), the changeset, and — conditionally, see below — the one falsified sentence incontent/docs/plugins/plugin-dashboard.mdx. ⛔ OUT:packages/core,packages/types,packages/plugin-grid,content/docs/core/**,content/docs/api/**(held by #4314 this round);packages/react(#4538);packages/app-shell/**,packages/components/**,packages/fields/**.Container & model:
S–M,mode:subagent,model: claude-fable-5. Triage suggestedsonnet–opus; I took it above both. Reason stated rather than assumed: this re-keys a published export and lands a breaking changeset under a maintainer-authorised one-PR policy exception. Tier fromCONTRACT_REVIEW_TIER(scripts/pm/dispatch-gates.mjs:1569), read this round.Clause-②: yes — content limb. Re-keying a published export changes the shape of a public surface; dispatched at the contract-review tier, so no
needs:contract-reviewis owed at enqueue.Serial constraints cleared:
packages/plugin-dashboardis free — no open PR touches it (PR #5093, the README truth-table half, already merged), and it is disjoint from all four other in-flight cards this round.Zone 1 — Maintainer ruling, ⛔ not re-litigable
Maintainer, 2026-08-18, verbatim 「同意」: Route A — re-key
dashboardComponentsto the 8 real schema types, plus an explicit one-PR exception tocheck-changeset-no-majorfor this re-key. The four binding conditions from the 2026-08-17 auto-adjudication stand unchanged: (a) re-run the zero-consumer grep at claim time; (b) changeset marks it breaking; (c) README's map-key statements flip in the same PR; (d) ⛔ no new exports or types — 11 keys become 8 real ones, nothing else.Rollback clause, still live: a real external consumer or any contract question ⇒ stop, card returns to
needs-user-decision. ⛔ Never re-adjudicate silently.Condition (a) — I ran it, and it holds. Run it again anyway.
On
origin/mainthis round, word-boundarydashboardComponentsacrosspackages apps examples content docs e2ereturns exactly three hits, none of them a consumer:packages/plugin-dashboard/src/index.tsx:338— the definitionpackages/plugin-dashboard/README.md:85— prose about the exportcontent/docs/plugins/plugin-dashboard.mdx:117— the same prose, duplicatedCounter-probed with
kanbanComponents, which returns its definition and its README registration loop — so the pattern finds consumers when they exist, and this zero is a real zero. Re-run it at your claim anyway: it is a binding condition, and my reading is minutes old, not authoritative at your commit.PR #5093 already landed the README truth-table half, so both doc sites now carry measured factual statements about these keys ("two measured facts about it"). Your re-key falsifies those statements. Condition (c) covers the README. The
content/docscopy is filed separately as #5094 — but #5094 is about the duplication, and it does not license this PR to leave behind a sentence it personally made false.So: read both sentences. Update the one in
content/docs/plugins/plugin-dashboard.mdxif and only if the re-key makes it untrue, keep the edit to that sentence, and say so explicitly in the PR body. If it turns out to be phrased so it stays true, leave it and say that instead. Do not expand into #5094's scope either way. A PR that ships a doc statement it knowingly falsified is the exact failure this card is about.Zone 2 — measured context (verify, don't trust)
The card's own quantified point, worth keeping in view: this deviation is invisible to every gate. The export-name check is green because
dashboardComponentsreally is exported, and the old README loop compiled under strict mode because the phantom keys are runtime strings into aregister(type: string, …). Nothing static will tell you if you get the key vocabulary wrong — the 8 real types must be read off theComponentRegistry.registercall sites themselves (card citesdashboard:44,metric:65,metric-card:80,object-metric:151,pivot:185,object-pivot:260,dashboard-grid:296,object-data-table:316 — take them from the tree, the line numbers are from 2026-08-17).Gates
Derive from your diff — expect
Lint,Type Check, the test shards, and the changeset family. The changeset gate is the interesting one here: the repo'scheck-changeset-no-majornormally forbidsmajor, and the maintainer has authorised a one-PR exception for exactly this re-key. If the gate blocks you, that is the expected collision, not a reason to downgrade the changeset topatchto get green — quote the maintainer's authorisation in the PR body and report if it still blocks. ⛔ Do not weaken a gate to pass.Deliver
Draft PR against
main, first lineFixes #5064. Push the branch early. Return the JSON report and post it as an issue comment whose first line is<!-- os-dev-report -->. Read the full issue body and every comment on GitHub yourself — the ruling chain here is four comments long and the disposition changed partway through — and check the body for sanitizer truncation before relying on it.Generated by Claude Code
os-support-ai commentedon Aug 18, 2026
{ "issue": 5064, "status": "done", "branch": "claude/issue-5064-dashboard-components-rekey", "pr": "https://github.com/objectstack-ai/objectui/pull/5207", "premise_still_valid": true, "summary": "Route A implemented per the 2026-08-18 maintainer ruling: dashboardComponents re-keyed from 11 PascalCase class names to the 8 schema types the barrel's register calls claim, values being the exact registered components (for object-metric/object-pivot the internal data-source-gate wrappers, not the exported widgets — value-side call stated in the PR body; no new exports, no new types, condition d holds). Condition (a) re-ran at claim on 4eac264e6: word-boundary grep = 3 hits (definition, README :85, mdx :117), none a consumer; kanbanComponents counter-probe finds real consumers, so the zero is real. Condition (c): README's measured map-key paragraph flipped; the content/docs mdx copy's paragraph was falsified by the re-key ('its eleven keys are component class names'), so exactly that paragraph was updated and nothing else — #5094's duplication scope untouched. Changeset scores major (condition b); the authorized collision is live: check-changeset-no-major exits 1 on exactly this changeset, and the repo-state assertion in scripts/__tests__/check-changeset-no-major.test.ts will go red in the unit shard — both are the maintainer's one-PR exception, neither gate was weakened and the changeset was not downgraded. One consequence surfaced for release time in the PR body, quoted from the gate's header: all publishable packages share one fixed group, so a major entry versions all 39 off the objectstack line — how the release consumes the changeset stays the maintainer's call.", "tests": "All at HEAD a31ea2619, tree clean. pnpm exec vitest run packages/plugin-dashboard/ => 'Test Files 63 passed (63), Tests 569 passed (569)' (origin/main has 62 test files in the package; 63 proves the new dashboardComponents.mapParity pin test was collected). Reverse verification from committed state: sed re-added a PascalCase key => pin test red rc=1, all three assertions ('× keys are exactly the 8 schema types', '× each value is the exact component registered', '× no PascalCase class-name keys'); git checkout branch -- index.tsx => green rc=0, 3/3. No rebuild leg applies: the test imports ../index by relative source path, no dist in the resolution chain. turbo run type-check lint --filter=@object-ui/plugin-dashboard => 15 tasks successful (scripts echoed: 'tsc --noEmit && tsc -p tsconfig.test.json', 'eslint .'). check-changeset-presence rc=0; check-control-bytes rc=0; check-doc-component-types rc=0; check-doc-links rc=0. check-changeset-no-major rc=1 naming .changeset/dashboard-components-rekey-5064.md:2 — the expected authorized collision. check-doc-snippet-types refused loudly locally (needs the full publishable set built); the mdx edit is prose-only, CI's run is authoritative. CI status at report time: in_progress (report delivered at draft-PR time per standing policy; the two no-major limbs are expected red).", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
Generated by Claude Code
os-support-ai commentedon Aug 18, 2026
Status check from the PM seat (session
session_01RV6yuVCxymHYE16PL9vQkE) — no action requested, recording where this card actually stands so it is not read as in-flight work.Implementation is done. PR #5207 (
Fixes #5064) has been up since 2026-08-18 14:34Z: Route A implemented, 5 files, the pin test added, condition (a)'s zero-consumer grep re-run at claim and counter-probed withkanbanComponents. Conditions (a)–(d) all met.It is parked, deliberately, on #5208 — the decision card I filed at 14:36Z on discovering that the authorized one-PR
majorexception moves all 39 packages a major, because they share one changesetfixedgroup. The exception was granted against a measured blast radius of zero consumers; the accounting's blast radius is the whole fleet plus the@objectstacksame-major-⇒-compatible convention. Only the first number was on the table when the exception was granted.So the two red limbs on PR #5207 (
Changeset Bump Policy, and the repo-state assertion inscripts/__tests__/check-changeset-no-major.test.ts) are the authorized exception, not defects. Restating the commitment I made on #5208: ⛔ I will not clear either gate by any route — not by downgrading the changeset, not by touching the test — and PR #5207 stays draft and unqueued until #5208 is answered. A seat clearing its own red gate by relabelling is indistinguishable from the failure mode the no-major gate exists to defeat.Why this card keeps
pm:dispatchedrather than moving topm:blocked: I considered the swap and rejected it.pm:blockedis only legitimate with a machine-greppableBlocked-by:line in the body, and rewriting this body through the API would double-escape the HTML entities the read returns ('inside the code blocks), corrupting a carefully measured card to buy a label.pm:dispatched+ an open PR + a filed decision card is already an honest, complete state — the same state #4266 held while its PR was open. The named reader for the parked status is #5208 itself and the seat post (objectstack#6025), where it is now recorded.No re-dispatch. Anyone reading this card as available work should not pick it up — the code exists on
claude/issue-5064-dashboard-components-rekey.Generated by Claude Code
os-support-ai commentedon Aug 19, 2026
<!-- os-dev-report -->
{ "issue": 5064, "status": "done", "branch": "claude/issue-5064-dashboard-components-rekey", "pr": "https://github.com/objectstack-ai/objectui/pull/5207", "premise_still_valid": true, "summary": "Amended PR #5207 in place: changed .changeset/dashboard-components-rekey-5064.md from 'major' to 'minor' for @object-ui/plugin-dashboard, per the 2026-08-19 maintainer ruling that objectui's major tracks @objectstack's major and never its own breaking-change count. Replaced the changeset's closing 'authorized exception' sentence with the corrected rationale (minor + breaking semantics in body is the honest label). Updated the PR body: rewrote the 'expected gate collision' section to state the two red gates were the policy correctly enforcing AGENTS.md 版本号策略 (no exception was in play), corrected the changeset bullet's '(condition b)' annotation, and added before/after verification evidence. No source file, pin test, README, or mdx paragraph was touched.", "tests": "Before edit (branch head a31ea2619, changeset scored major): `node scripts/check-changeset-no-major.mjs` exit 1 (flagged @object-ui/plugin-dashboard at .changeset/dashboard-components-rekey-5064.md:2); `pnpm exec vitest run scripts/__tests__/check-changeset-no-major.test.ts` (repo root, under flock) exit 1, 1 failed/6 passed -- failure at the repo-state assertion scripts/__tests__/check-changeset-no-major.test.ts:117. After edit (new head 855afa529): `node scripts/check-changeset-no-major.mjs` exit 0 ('No changeset declares a major bump'); `pnpm exec vitest run scripts/__tests__/check-changeset-no-major.test.ts` exit 0, 7 passed (7) -- the :117 repo-state assertion now passes, confirmed explicitly. Also ran and confirmed green: `node scripts/check-changeset-presence.mjs` (1 changeset covers the 2 changed src files), `node scripts/check-changeset-fixed.mjs`, `node scripts/check-control-bytes.mjs`. Package test suite was NOT re-run for this amendment since no source file changed (only .changeset/dashboard-components-rekey-5064.md) -- stated rather than fabricated per the task's instruction.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
os-support-ai commentedon Aug 19, 2026
{ "issue": 5064, "status": "done", "branch": "claude/issue-5064-dashboard-components-rekey", "pr": "https://github.com/objectstack-ai/objectui/pull/5207", "premise_still_valid": true, "summary": "Amended PR #5207 in place: changed .changeset/dashboard-components-rekey-5064.md from 'major' to 'minor' for @object-ui/plugin-dashboard, per the 2026-08-19 maintainer ruling that objectui's major tracks @objectstack's major and never its own breaking-change count. Replaced the changeset's closing 'authorized exception' sentence with the corrected rationale (minor + breaking semantics in body is the honest label). Updated the PR body: rewrote the 'expected gate collision' section to state the two red gates were the policy correctly enforcing AGENTS.md 版本号策略 (no exception was in play), corrected the changeset bullet's '(condition b)' annotation, and added before/after verification evidence. No source file, pin test, README, or mdx paragraph was touched.", "tests": "Before edit (branch head a31ea2619, changeset scored major): node scripts/check-changeset-no-major.mjs exit 1 (flagged @object-ui/plugin-dashboard at .changeset/dashboard-components-rekey-5064.md:2); pnpm exec vitest run scripts/__tests__/check-changeset-no-major.test.ts (repo root, under flock) exit 1, 1 failed/6 passed -- failure at the repo-state assertion scripts/__tests__/check-changeset-no-major.test.ts:117. After edit (new head 855afa529): node scripts/check-changeset-no-major.mjs exit 0 ('No changeset declares a major bump'); pnpm exec vitest run scripts/__tests__/check-changeset-no-major.test.ts exit 0, 7 passed (7) -- the :117 repo-state assertion now passes, confirmed explicitly. Also ran and confirmed green: node scripts/check-changeset-presence.mjs (1 changeset covers the 2 changed src files), node scripts/check-changeset-fixed.mjs, node scripts/check-control-bytes.mjs. Package test suite was NOT re-run for this amendment since no source file changed (only .changeset/dashboard-components-rekey-5064.md) -- stated rather than fabricated per the task's instruction.", "open_questions": [], "out_of_scope_findings": [] }(Supersedes the malformed report two comments above, comment id 5338551926, which HTML-escaped the marker as
<!-- os-dev-report -->by mistake and does not satisfy the mechanical-scan requirement. Content is identical; only the marker encoding differs.)Generated by Claude Code
Generated by Claude Code
docs(plugin-dashboard): README 的 onSchemaChange 持久化示例与手动注册段按真实契约重写 (o…
docs(plugin-dashboard): 文档站页的手动注册段按真实 register 键面重写 (objectstack-ai#5104