Skip to content

docs(plugin-dashboard): README 的 TypeScript 一节按真实导出面重写虚构的 DashboardSchema / MetricCardSchema - #5069

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-5015-plugin-dashboard-readme
Aug 17, 2026
Merged

docs(plugin-dashboard): README 的 TypeScript 一节按真实导出面重写虚构的 DashboardSchema / MetricCardSchema#5069
yinlianghui merged 1 commit into
mainfrom
claude/issue-5015-plugin-dashboard-readme

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes#5015

基线 origin/main @ bb3fab62c7729092174a1e8ae6032cbb29ce28a3(worktree 显式建在该 sha 上)。方法学照抄同族已落地的三单:#5010 → PR #5046#5016 → PR #5053#5012 → PR #5059

前提验证:卡面读数自己复测,两条都成立

卡面的复核命令写的是裸 grep,所以按 #5012 的教训先补词边界重测:

# 词边界,全仓
grep -rn "\bDashboardSchema\b" --include=*.ts --include=*.tsx --include=*.md packages apps
grep -rn "\bMetricCardSchema\b" --include=*.ts --include=*.tsx --include=*.md packages apps
  • DashboardSchema —— 19 处命中,没有一处是本包或 @object-ui/types 的导出:3 处是本包的注释(src/DashboardRenderer.tsx:884src/DashboardGridLayout.tsx:76:88),其余是 @objectstack/spec/ui 那个元数据级 zod schema 的名字被引用(packages/types/src/zod/complex.zod.ts:21DashboardSchema as SpecDashboardSchema 导入、packages/app-shell/src/views/metadata-admin/dashboard-schema.ts:25clientValidation.ts:587),加上 SKILL.md 与本 README 自己。卡面说的「标识符 grep 的假信号」成立,而且假信号有两个来源:注释,以及一个同名但属于另一个包、另一个层次(zod 而非 TS 类型)的真实物件。
  • MetricCardSchema —— 除本 README 的 :321 / :323全仓零命中。纯虚构。
  • 卡面「MetricCardProps 是真的但未从 index re-export」也成立,见下。

真身查证(#5012 的路数:先查真身再定修法)

声明式 grep(^\s*(export )?(declare )?(type|interface|const|class) …)在 @object-ui/types 找 dashboard 侧的授权类型:

真身声明处@object-ui/types 导出
DashboardComponentSchemapackages/types/src/complex.ts:738(type: 'dashboard' + widgets + columns / gap / header / globalFilters / dateRange)src/index.ts:278
DashboardWidgetSchemacomplex.ts:676(extends Omit< Partial< SpecDashboardWidget >, 'type' | 'options' | 'chartConfig' | 'filter' >)src/index.ts:277
DashboardWidgetLayoutcomplex.ts:652src/index.ts:276

容器侧真身存在 ⇒ 示例按真身从 @object-ui/types 重写。

metric card 侧不是「同名换路径」,分两层量:

  1. widget 层没有「按族」的类型可换。 一个 DashboardWidgetSchema 覆盖全部 type,族内设置在 options 下 —— 不存在 MetricCardSchema 的兄弟名。而且 metric-card 也不是 spec widget 家族成员:@objectstack/spec@17.0.0DashboardWidgetSchema.type 枚举里是 metric / kpi,没有 metric-card(objectui 把 type 放宽成 string,所以 tsc 收但 spec 不收)。
  2. 组件层的真身在,但不在公开面上。MetricCardProps(src/MetricCard.tsx:35)是真的,没从 src/index.tsx re-export:
import type { MetricCardProps } from '@object-ui/plugin-dashboard';
-> TS2724: '"@object-ui/plugin-dashboard"' has no exported member named
'MetricCardProps'. Did you mean 'MetricCard'?

按认领裁定 ⛔ 不代裁命名、⛔ 不加新导出、⛔ 不 re-export MetricCardProps。这半个裁定已经是在途卡 #4600 的余留范围(该卡 2026-08-14 状态注记:「which schema an SDUI dashboard COMPONENT node validates against; classes A/B + metric-card」,等 objectstack#8593),所以按「附着不散落」的纪律写成 #4600 的追评而不另立孪生卡 —— 见下文「顺手立的卡」。

判定表

README(改前)判定依据处理
:321import type { DashboardSchema … } from 本包虚构名,但真身存在导出面 20 名零命中;假信号来自 3 处注释 + @objectstack/spec/ui 的同名 zod schema按真身重写:DashboardComponentSchema from @object-ui/types
:321… MetricCardSchema }:323const metricCard: MetricCardSchema纯虚构,且无同族真名可换全仓词边界零命中;widget 侧无按族类型;组件侧真身 MetricCardProps 不在导出面(TS2724)示例改按 DashboardWidgetSchema,并如实陈述这三个键是组件 props
:42-52dashboardComponents 手动注册真名导出面命中(src/index.tsx:338)未动(键词汇表另有问题,见 #5064)
:416-422onSchemaChange 示例真名真键,可选性不符改前改后同样红,与本卡两处无关未动,单立 #5066

名集合核对读数

导出名集合取自构建产物dist/index.d.ts,走 TS compiler API 的 checker.getExportsOfModule;README 侧不用正则抓 import —— 先抽 fenced 块,每块 ts.createSourceFile,再走 ImportDeclaration 的 AST,A as BpropertyName(导出名)而非本地别名。#5043 记的两个坑因此在结构上不可能发生。

export surfaces: @object-ui/plugin-dashboard 20 / @object-ui/types 675 /
@object-ui/core 416 / @object-ui/data-objectstack 72 /
@object-ui/components 420
改前: README 5 bindings / MISSING COUNT: 2
- DashboardSchema from @object-ui/plugin-dashboard @ README.md:321
- MetricCardSchema from @object-ui/plugin-dashboard @ README.md:321
改后: README 5 bindings / MISSING COUNT: 0

绑定数不变是对的:换掉的两个名从本包挪到了 @object-ui/types,另三个(dashboardComponentsComponentRegistrycreateObjectStackAdapter)本来就成立。

编译探针读数

README 的 ts/tsx 块抄进 scratch,对同一批构建产物编译(strict: true,没有为让块通过而放松任何选项);块按内容签名分类而非块序号,所以改前改后共用一套机器。

改前: 10 个可编译块(2 块按设计跳过并列明理由) tsc -> rc=2
block10(1,15): error TS2305: Module '"@object-ui/plugin-dashboard"' has no exported member 'DashboardSchema'.
block10(1,32): error TS2305: Module '"@object-ui/plugin-dashboard"' has no exported member 'MetricCardSchema'.
block12(8,63): error TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
改后: 10 个可编译块 tsc -> rc=2
block12(8,63): error TS2345: (原样携带 —— 非本卡漏修,已立 #5066)

跳过的两块(输出里列明,不静默丢)::61-67:75-84 的 Schema API 形状速写 —— widgets: Widget[] / title: string类型语法落在值位置,故意不合法的 TS。

harness 两处,都只补作用域、不放松检查::293colorVariant 裸 widget 字面量被钉在真 DashboardWidgetSchema(改前改后皆绿,该节确认为真话);:417 的裸 JSX 补 dashboard / client 声明。

逐键 pin(散文新增的断言不靠外推)。 新增那段说 value / trend / trendValue 三个键 DashboardWidgetSchema 都不声明,而合并写在一个字面量里只报一条 —— 第一个多余属性会把其余诊断短路(PR #5059 记过同一现象)。所以一文件一键单独探:

DashboardWidgetSchema 的诊断
valueTS2561 … 'value' does not exist … Did you mean to write 'values'?
trendTS2353 … 'trend' does not exist in type 'DashboardWidgetSchema'
trendValueTS2353 … 'trendValue' does not exist in type 'DashboardWidgetSchema'

反向验证(两条,预判先写)

(a) 名集合核对自证。 预判:往多行类型 import 块里 planted,MISSING COUNT 0 → 2,恰为 {DashboardSchema, DashboardThings};别名判导出名;行尾注释里的非导出词不得报。四条全符 ——

变异预判实测
多行块中段DashboardSchemaDashboardSchema @ :332
多行块里加 DashboardThings as Things报,且按导出名DashboardThings 而非别名 ThingsDashboardThings @ :332
DashboardWidgetSchemaDashboardWidgetSchema as WidgetSchema仍 OK(别名判导出名)OK
行尾 // MetricCardSchema was never real不得报(假阳性测试)未报

MISSING COUNT: 2,还原读数 0。变异全做在 README 的 scratch 副本上(检查器的 --readme 指向副本),git status --porcelain 全程只有本卡那一个 M —— 不存在「临时改动误入 commit」的窗口。

(b) 改前 README 回填探针。 预判:回填后必须转红,且错误与所改两处一一对应,:417 那条既有红原样携带。同一套机器直接跑 git show $BASE:packages/plugin-dashboard/README.md 的副本,转红 rc=2:

所改之处预判实测诊断
DashboardSchemaTS2305block10(1,15): TS2305 … has no exported member 'DashboardSchema'
MetricCardSchemaTS2305block10(1,32): TS2305 … has no exported member 'MetricCardSchema'
既有的 onSchemaChange原样携带block12(8,63): TS2345(改前改后同一坐标)

预判与实测无出入,方向即通常的「改前红 / 改后绿」—— 本卡的 ?? 链、计数门那类反转情形不适用(这是导入名不存在,不是取值判决)。

验证

  • 仓根 pnpm exec turbo run type-check --concurrency=281 successful, 81 total(4m34s;重活经 flock -w 3600 /tmp/os-heavy-verify.lock 串行 + --max-old-space-size=4096)。
  • node scripts/check-doc-links.mjsLinks are valid across 13 scan roots.
  • node scripts/check-control-bytes.mjsOK (scanned 4512 tracked text file(s); skipped 85 binary);改动两文件另做 grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]' 自扫,零命中。
  • pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-dashboard...' build → rc=0(探针与名集合核对所依赖的构建产物)。

docs-only 的 CI 形状:**/*.md.changeset/**paths-ignore 里,Test / Type Check 各 job 的实质步骤会被 path-filter 短路成 skipped 而 job 报 success。按纪律计绿,但类型证据是上面的本地仓根读数,不是 CI 的(#5046 / #5053 / #5059 先例)。

顺手立的卡(均未认领,不夹带进本 PR)

changeset

.changeset/plugin-dashboard-readme-truth-5015.md,@object-ui/plugin-dashboard: patch,口径同 #5046 / #5053 / #5059:无代码/类型/运行时改动,声明 patch 是因为 README.md 在包的 files 里,随下次发布到 npm。


Generated by Claude Code

`packages/plugin-dashboard/README.md:321` 导入的 `DashboardSchema` 与
`MetricCardSchema`,在本包与 `@object-ui/types` 的导出面上都不存在,照抄该节
是两条 TS2305。导出名集合取自构建产物 `dist/index.d.ts`(走 TS compiler API 的
checker.getExportsOfModule,不是对 src 做正则),示例逐块对同一构建产物
strict 编译验证。
- `DashboardSchema`:标识符 grep 的典型假信号 —— 它只出现在三处注释
(DashboardRenderer.tsx:884、DashboardGridLayout.tsx:76/:88),以及
`@objectstack/spec/ui` 里那个元数据级 zod schema 的名字上;按导出面查,本包
与 `@object-ui/types` 都零命中。真身存在,故按真身重写而非删节:
`@object-ui/types` 的 `DashboardComponentSchema`。
- `MetricCardSchema`:纯虚构,加词边界后除本 README 外全仓零命中。且**改不成
同族真名** —— widget 侧不存在「按族」的 schema 类型,一个
`DashboardWidgetSchema` 覆盖全部 type,族内设置在 `options` 下。示例改按
`DashboardWidgetSchema` 写,并给出该类型真正承载的三种作者形:数据集绑定的
KPI、无查询的静态单值(值在 `options` 下)、以及 widget 的 `component` 槽里
的注册组件节点。
新增一段陈述该类型集**不**覆盖什么,因为旧片段暗示了相反的事:`value` /
`trend` / `trendValue` 是 MetricCard 的**组件** props,`DashboardWidgetSchema`
三个都不声明(逐键单独探,因为第一个多余属性会把后续诊断短路),而组件 props
接口也不在本包导出面上。
⛔ 未新增、未 re-export、未改名任何导出来把旧名变真;`dashboardComponents`
(真实存在,src/index.tsx:338)一节未动。
Fixes#5015
Co-authored-by: Claude <noreply@anthropic.com>
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation plugin labels Aug 17, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)25.3 KB350 KB
Entry fileindex-BIGfVmnY.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)9.56KB3.59KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)8.92KB3.41KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)25.13KB5.40KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.79KB
auth (createAuthenticatedFetch.js)6.34KB2.43KB
auth (index.js)2.71KB1.22KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.02KB0.88KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)502.20KB112.21KB
core (index.js)4.11KB1.62KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)159.03KB44.08KB
fields (index.js)234.25KB58.48KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.35KB1.38KB
i18n (pickLocalized.js)3.69KB1.73KB
i18n (provider.js)23.12KB7.62KB
i18n (useDisplayLocale.js)2.84KB1.45KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)7.77KB3.13KB
layout (index.js)39.16KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.35KB3.31KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.42KB1.42KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.81KB0.83KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.62KB12.83KB
plugin-charts (index.js)64.75KB18.37KB
plugin-chatbot (index.js)181.21KB43.14KB
plugin-dashboard (index.js)127.85KB32.73KB
plugin-designer (index.js)212.39KB42.83KB
plugin-detail (index.js)241.12KB60.43KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)122.95KB29.80KB
plugin-gantt (index.js)164.10KB39.87KB
plugin-grid (index.js)197.61KB53.03KB
plugin-kanban (index.js)52.72KB14.54KB
plugin-list (index.js)111.17KB26.99KB
plugin-map (index.js)18.72KB6.09KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)41.97KB11.33KB
plugin-timeline (index.js)26.68KB7.66KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)83.81KB20.49KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)27.53KB9.41KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.28KB0.68KB
react (schema-input.js)1.45KB0.83KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (index.js)4.77KB2.16KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)10.76KB3.17KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)6.92KB2.40KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)3.05KB1.52KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@yinlianghuiClaude

Copy link
Copy Markdown
CollaboratorAuthor

CI 终态读数(按 jobs 端点判,不单凭 check-runs),head c0d0ff5d8c60b064136ed9a96abb2fd294228721:

11 个 run 全部 completed,零 failure —— CI / Lint / Control Bytes / Docs Links / Doc Component Types / Skills Paths / Bundle Analysis / Changeset Presence / Changeset Guard / Auto Label PRs 皆 success,Dependabot Auto-merge skipped

CI 这个 run 的 9 个 job 逐个 completed,结论 success / skipped:

job结论实质步骤
Type ChecksuccessRun type-checkskipped(path-filter 短路)
Test (shard 1-4 / coverage)success / skippedRun testsskipped(同上)
Build & E2EsuccessRun E2E testsskipped(同上)
Build DocssuccessBuild Siteskipped(Check for docs changes 判定本 PR 不含 content/docs 改动)
Changeset Fixed Group ChecksuccessVerify all packages are in changeset fixed group实跑

这正是正文「docs-only 的 CI 形状」那一段预告的结果:**/*.md.changeset/**paths-ignore 里,所以类型证据是正文里的本地仓根读数(81 successful, 81 total),不是这里的 Type Check job。

但并非全部被短路 —— 两道门对本 PR 给了真信号,值得单独记一笔:

  • Docs Links → job Internal Docs Link Check,步骤 Check internal docs links 结论 success 而非 skipped,即真的扫了改动后的 README。
  • Control Bytes → run success(本地 node scripts/check-control-bytes.mjs 同样绿:scanned 4512 tracked text file(s))。

另附一条过程上的自我纠正,以免同族后续 PR 踩同一坑:第一版 CI 守望脚本用 curl 直连 GitHub REST 轮询,拿回的其实是 {"message": "GitHub access is not enabled for this session…"},而脚本用 d.get('workflow_runs', []) 取值 —— 空列表让「未完成 run 数」算成 0,于是打印了 ALL RUNS COMPLETED。那是个假绿:终态读数一条都没取到,却长得像取全了。上面的读数全部改走已授权的 MCP actions 端点重测。教训与本 PR 的主题同源 —— 一个「零命中」既可能是真的零,也可能是根本没查到,.get(k, []) 这类宽容默认值正是把后者伪装成前者的地方。


Generated by Claude Code

@yinlianghuiClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM 验收:ACCEPT(session session_01GTRjn8xBqp75dk7kFupVRt,objectui 分片 PM,批次 22)

实物核验:merge-base bb3fab62c,2 files +94/−9 与报告一致,单 commit,模型标识 msg/diff 双零,releases 零触碰,⛔ 零新导出、零 re-export。CI 亲读:19 个 check-run 全 completed 零失败(docs-only 形状;Docs Links 步骤真跑 success,类型证据为本地仓根 81/81)。

验收要点:

  1. 真身查证分两层且各得其所:容器侧按真身 DashboardComponentSchema 重写;widget 侧证实不存在按族类型(DashboardWidgetSchema 覆盖全部 type、族内设置在 options 下)—— 示例按该真形给出三种作者形并如实陈述 value/trend/trendValue 是组件 props 而非 widget 键,逐键 pin(TS2561 带 Did-you-mean、TS2353、TS2724)。
  2. 命名裁定「附着不散落」是正确处置:metric-card 的对外类型名与 MetricCardProps 是否 re-export,落在在途卡 schema-catalog: all 9 plugin-dashboard examples are refused by the spec's DashboardSchema — the AI few-shot corpus teaches the pre-ADR-0021 widget shape #4600 等 objectstack#8593 的余留范围(其状态注记明列 metric-card)—— 写成 schema-catalog: all 9 plugin-dashboard examples are refused by the spec's DashboardSchema — the AI few-shot corpus teaches the pre-ADR-0021 widget shape #4600 追评而非孪生卡,避免 zod 校验面与 TS 导出面两卡各裁出不一致的名字。采信。
  3. 前提修正一处有价值:DashboardSchema 的假信号有第二个来源(@objectstack/spec/ui 的同名 zod 物件)—— 标题的「全仓不存在」对它略宽、操作性主张(导出面上没有)完全成立;这一区分已进 PR 与 changeset,供同族后续巡查。
  4. 自纠一条假绿并披露:curl 直连未授权 → d.get('workflow_runs', []) 空列表 → 「ALL RUNS COMPLETED」—— 与案头既有的未认证轮询器反向假绿同族,dev 自己抓住并改走 MCP 端点重测,教训写进 PR 评论。方法学发现(合并字面量多余键只报第一条,散文断言须一键一探)与 PR docs(plugin-gantt): README 按真实导出面重写虚构的手动注册与 GanttSchema 类型 #5059 读数互证。

派生物分诊(本评论即记录):#5064(dashboardComponents 用类名作键 —— 全仓 5 个 map 里唯一异类,README 教的循环注册 11 个没人写的 type;两个修向未代裁)→ pm:queue,派发时由 PM 先裁方向;#5066(README onSchemaChange 把 string | undefined 传必填 name,即改后探针余红)→ pm:queue,与本 PR 同文件、落 main 后再派;#5067(过期 as any)finding 入池;#4600 追评采信。

转 ready 并挂 auto-merge(squash)。


Generated by Claude Code

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

Labels

documentationImprovements or additions to documentationplugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

plugin-dashboard README 的 TypeScript 一节导入 DashboardSchema / MetricCardSchema,两个名字在全仓都不存在

2 participants

@yinlianghui@claude