Skip to content

docs(plugin-report): README 按真实导出面重写三处虚构导出与陈旧幸存清单 - #5053

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

docs(plugin-report): README 按真实导出面重写三处虚构导出与陈旧幸存清单#5053
yinlianghui merged 1 commit into
mainfrom
claude/issue-5016-plugin-report-readme

Conversation

@yinlianghui

@yinlianghuiyinlianghui commented Aug 17, 2026

Copy link
Copy Markdown
Collaborator

Fixes#5016

packages/plugin-report/README.md 教三个本包没有的导出。逐条判定后按 #5002 → PR #5021 的减法形重写:删虚构名、按真身重教,不加任何新导出。基线 origin/main = dc9d651a2c55c10a9e4d30434e429e5fdc5ae968,改动 1 个 README + 1 个 changeset。

正文里的 JSX 一律在 < 后留一个空格(< ReportViewer …)—— GitHub 会把 < + 字母当 HTML 标签吞掉。本 PR 正文第一版就在「删因」表里被吞了两处,读回后修正。

一、逐条判定:未实现 vs 改名

三条都不是「改名」,也不是「从未实现」—— 是 ADR-0021 9.0 切换时已删除的旧件,README 是那次删除的幸存者。判据不是 grep,而是 packages/plugin-report/CHANGELOG.md:1284 的原文:

plugin-report: the pre-9.0 query-form renderers (SpecReportGrid, MatrixRenderer, JoinedReportRenderer), the drill helpers, and the legacy authoring components (ReportBuilder, ReportConfigPanel, ColumnsEditor, GroupingsBuilder, JoinedBlocksEditor, FieldPickerDialog, ChartConfig, ScheduleConfig) are removed.

#README 原文判定依据修法
1:30/:33ReportBuilder 当主编辑器组件已删除(非改名):没有任何名字承接「报表编辑器」这个角色,本包不再有编辑组件CHANGELOG:1284 列名;导出面 25 名无此名删。Quick Start 改教真组件:ReportRenderer(dispatcher,取 schema)、DatasetReportRenderer(取 report)、ReportViewer
2:125-126registerDrillHandler(actionRunner, …)已删除且机制更换:不是换名,是换形 —— 从「注册 handler」变成「宿主回调」CHANGELOG:1284 "the drill helpers";真身是 ReportRendererProps.onDrill?: (args: DatasetDrillArgs) => void(src/ReportRenderer.tsx:47-52)、DatasetReportRenderer.tsx:52-58 的 ADR-0021 D2 注释整节按真实下钻面重写:onDrill + DatasetDrillArgs 五个字段表,写明导航归宿主(renderer 只认 dimension 名)
3:191-198ScheduleConfig 当组件已删除;近名 ReportScheduleConfig类型,且不在本包CHANGELOG:1284 列名;ReportScheduleConfig 定义在 packages/types/src/reports.ts:254,由 packages/types/src/index.ts:730 导出,本包只 import(src/LiveReportExporter.ts:27)不 re-export按真身重教:排程是 ReportComponentSchema.schedule 上的数据,类型从 @object-ui/types 导入;createScheduleTrigger 按真签名 (report, dataSource, resource, onComplete)() => Promise< LiveExportResult[] >(src/LiveReportExporter.ts:245-251)
4:155 "ReportBuilder, ReportViewer and the export functions below remain"陈旧幸存清单同上改为 ReportViewer / LegacyReportRenderer + 显式记下哪些是被删的,免得再被当成存活项加回来

⚠️卡面前提的一处修正:卡面写 ScheduleConfig 的真身是「类型 ReportScheduleConfig(src/LiveReportExporter.ts:27/:82)」。类型确实存在,但那两行是 import 与使用,不是定义 —— 它在 @object-ui/types,本包不 re-export,所以写成 import type { ReportScheduleConfig } from '@object-ui/plugin-report' 会是 TS2305。这正是 #5010 那条 CalendarViewSchema 同形陷阱,修法(改导入路径)与 #1#2(删)不同。README 里把这一点明写了出来。

二、名集合核对读数(导出面,非「src 里出现过」)

方法学按 #5010 评论:名集合取自 TypeScript program 对包入口 src/index.tsx 的 exported symbols(checker.getExportsOfModule),不是 grep src —— 注释里的名字和「只 import 不 re-export 的邻居包名字」都会骗过后者。README 侧按 import 语句解析,含多行 import 块与内联 type 修饰符。

导出面 25 名:DatasetDrillArgs, DatasetReportRenderer, DatasetReportRendererProps, ExcelColumnConfig, LegacyReportRenderer, LegacyReportRendererProps, LiveExportOptions, LiveExportResult, ReportRenderer, ReportRendererProps, ReportRendererSchema, ReportViewer, ScheduleTriggerCallback, createScheduleTrigger, exportAsCSV, exportAsExcel, exportAsHTML, exportAsJSON, exportAsPDF, exportExcelWithFormulas, exportReport, exportWithLiveData, formatValue, isDatasetReport, mergeFilters

改前(14 个自包命名导入 / 3 假):

README: 30 ReportBuilder FAKE <-- not on export surface
README: 30 ReportViewer REAL
README: 30 ReportRenderer REAL
README:125 registerDrillHandler FAKE <-- not on export surface
README:165 exportReport REAL
README:166 exportAsCSV REAL
README:167 exportAsJSON REAL
README:168 exportAsHTML REAL
README:169 exportAsPDF REAL
README:170 exportAsExcel REAL
README:183 exportWithLiveData REAL
README:183 exportExcelWithFormulas REAL
README:196 ScheduleConfig FAKE <-- not on export surface
README:196 createScheduleTrigger REAL
result: 11 real / 3 fake

改后(仍是 14 个自包命名导入 / 0 假 —— 数量没掉,所以这个绿不是「把 import 全删光」换来的):

README: 35 ReportRenderer REAL
README: 59 DatasetReportRenderer REAL
README: 59 isDatasetReport REAL
README: 71 ReportViewer REAL
README:166 DatasetDrillArgs REAL (多行 import 块 + 内联 `type` 修饰符)
README:229 exportReport REAL
README:230 exportAsCSV REAL
README:231 exportAsJSON REAL
README:232 exportAsHTML REAL
README:233 exportAsPDF REAL
README:234 exportAsExcel REAL
README:247 exportWithLiveData REAL
README:247 exportExcelWithFormulas REAL
README:267 createScheduleTrigger REAL
result: 14 real / 0 fake

跨包导入另行核对:ReportComponentSchema(packages/types/src/index.ts:721)、ReportScheduleConfig(:730)均在 @object-ui/types 导出面上;示例里的字面量也对过 union —— frequency: 'monthly'ReportScheduleFrequency(reports.ts:47),formats: ['pdf','excel']ReportExportFormat(:42)。

三、每一节的「删因」

删/改删因
Quick Start 的 ReportBuilder 示例组件不存在;顺带该块里 < ReportViewer report={…} showToolbar />< ReportRenderer title=… description=… chart={…} /> 也都不是真 props(见下方反向验证 (b)),照抄不编译
registerDrillHandler 整节(含 "Drill targets" 两条)函数与机制都不存在;drillDown.report 侧抽屉那条也无对应读点,留着等于教一个不存在的 API 面
### ScheduleConfig 组件块组件不存在,且把「schema 上的数据」教成了「组件」,方向本身是错的
"type": "report-builder" JSON 示例同一次删除的第二个面:仓里没有任何 ComponentRegistry.register('report-builder', …)(ReportBuilderSchema 只剩 packages/types 里的 zod/TS 声明),照抄得到一个解析不到组件的节点。改为列出真实注册的三个 type
feature 条目 :8 / :11分别断言 useReportData() 查询管线与 ActionRunner 派发的 drill action —— 正是 #1/#2 删掉的两个机制(src/index.tsx:33-37 记了 useReportData 随 ADR-0021 一并移除)。不改会与重写后的正文自相矛盾
标题行 :3 "build, view, render"「build」指的就是被删的编辑器
### Export 小标题不是新增内容:原文 :158-161 是一段无标题的悬空引导句(同一次删除留下的空洞),补回标题让该节可读

四、验证

README 不进编译,所以另外三条都是为「照抄可跑」做的实证:

  1. 名集合核对:上表,3 假 → 0 假。
  2. 示例真编译:把 README 四个 tsx/ts 块原样抄进一个 scratch 文件,@object-ui/plugin-report 指向构建产物packages/plugin-report/dist/index.d.ts(即消费者看到的公开类型面),@object-ui/types 走仓根 paths → tsc --noEmit0 error
  3. 仓根 pnpm exec turbo run type-check --concurrency=2:确认工位干净(结果见下方评论)。
  4. 文档门禁:node scripts/check-doc-links.mjsLinks are valid across 13 scan roots.(packages/*/README.md 在其 SCAN_ROOTS 内);node scripts/check-control-bytes.mjs → OK;改动文件 grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]' 无命中;check-changeset-no-major 通过。

反向验证(两次,方向都是事先定好的)

(a) 核对流程自证 —— 预期方向:注入的假名被抓出,且能区分「src 里出现过」。往改后 README 的 import 里临时塞两个名字,一个纯虚构(ReportBuilder)、一个src/ 里出现两次但不在导出面上(ReportScheduleConfig,LiveReportExporter.ts:27/:82):

README:267 createScheduleTrigger REAL
README:267 ReportBuilder FAKE <-- not on export surface
README:267 ReportScheduleConfig FAKE <-- not on export surface
result: 14 real / 2 fake

两个都被抓出。ReportScheduleConfig 这一个是判别性的:若核对用的是「src 里出现过」的近似,它会被判 REAL —— 被判 FAKE 才证明读的是导出面。临时改动已还原,sha256 与还原前逐字节相同(c13ebf21bbed…),未进 commit。
(读数口径说明:我脚本的退出码经了管道,所以以上以读数为证,不以 exit code 为证。)

(b) 示例编译自证 —— 预期方向:把 README 的三处写法放回 scratch 文件,tsc 必须转红,且报的错要正好对上我改的三处。实测转红(rc=2),三条一一对应:

error TS2322: Type '{ report: ReportComponentSchema; showToolbar: true; }' is not assignable to type 'IntrinsicAttributes & ReportViewerProps'.
Property 'report' does not exist on type 'IntrinsicAttributes & ReportViewerProps'.
error TS2322: Type '{ title: string; description: string; chart: {}; }' is not assignable to type 'IntrinsicAttributes & ReportRendererProps'.
Property 'title' does not exist on type 'IntrinsicAttributes & ReportRendererProps'.
error TS2554: Expected 4 arguments, but got 1. // createScheduleTrigger 旧写法

即:旧 README 的 ReportViewer / ReportRenderer 用法本来也编译不过,不只是三个假名的问题 —— 这是本次顺带修正的部分。(ReportBuilder / registerDrillHandler 两个假名无法参与本项,它们连符号都不存在,由 (a) 覆盖。)

五、changeset 口径(请复核一处取舍)

按派发口径写成 '@object-ui/plugin-report': patch(README 在本包 published files 里,修正随下次 publish 到 npm)。同族先例 PR #5021 选的是空 frontmatter(「无代码/行为变更,不声明发版」),scripts/check-changeset-presence.mjs 也认为本次不欠 changeset(0 of them under the src/)。两种都过门禁;若维护者更认 #5021 的口径,把 frontmatter 清空即可,一行改动。

六、本单未修、已另立的发现(scope = 本 issue)

两条都先搜过在开 issue(关键词 + 文件路径),无重复;均未打 finding 标签,交 PM 分诊。

`ReportBuilder`、`registerDrillHandler`、`ScheduleConfig` 三个名字都不在
`packages/plugin-report/src/index.tsx` 的导出面上。逐条核对 CHANGELOG 后判定:
三者都不是「改名」,而是 ADR-0021 9.0 切换时**已删除**的旧件,README 是那次
删除的幸存者。
- `ReportBuilder`:删除,本包不再有编辑器组件。Quick Start 改教真组件与真签名
(`ReportRenderer` 取 `schema`、`DatasetReportRenderer` 取 `report`、
`ReportViewer` 的 props 是 `{ schema, onRefresh }`)。
- `registerDrillHandler`:删除,机制也换了 —— 下钻是宿主回调
`onDrill?: (args: DatasetDrillArgs) => void`,导航归宿主(ADR-0021 D2)。
- `ScheduleConfig`:删除。排程是报表 schema 上的**数据**
(`ReportComponentSchema.schedule`,类型 `ReportScheduleConfig`);两个类型都在
`@object-ui/types`、本包不 re-export,示例改从那里导入,并按真签名
`createScheduleTrigger(report, dataSource, resource, onComplete)` 重写。
同一次删除的另两处遗留一并修正:陈旧幸存清单里的 `ReportBuilder`,以及
schema 示例中无组件注册的 `"type": "report-builder"`(真实注册的是 `report`/
`spec-report`/`report-viewer`)。两条断言已删机制的 feature 条目改为 dataset 形。
Fixes#5016
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-rb00miCg.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.19KB112.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.61KB29.71KB
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

本地验证读数(补正文第四节第 3 条)

工位:/home/user/objectui-5016-report-readme,基线 dc9d651a2c55c10a9e4d30434e429e5fdc5ae968。重活一律走共享验证锁 flock /tmp/os-heavy-verify.lock + NODE_OPTIONS=--max-old-space-size=4096(排队等锁约 14 分钟,是并发 agent 正常占用)。

仓根 type-check

$ pnpm exec turbo run type-check --concurrency=2
Tasks: 81 successful, 81 total
Cached: 33 cached, 81 total
Time: 4m0.22s

示例真编译(README 四个 tsx/ts 块 → scratch 文件,@object-ui/plugin-report 指向 packages/plugin-report/dist/index.d.ts)

$ pnpm exec tsc -p <scratch>.json --noEmit
EXAMPLE_TSC_RC=0

依赖先建过再跑,避免 fresh worktree 的假红:

$ pnpm --workspace-concurrency=2 --filter "@object-ui/plugin-report..." build
BUILD_EXIT=0

门禁

$ node scripts/check-doc-links.mjs
Links are valid across 13 scan roots.
$ node scripts/check-control-bytes.mjs
✅ check-control-bytes: OK (scanned 4503 tracked text file(s); skipped 85 binary).
$ grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]' packages/plugin-report/README.md .changeset/plugin-report-readme-truth-5016.md
(无命中)
$ node scripts/check-changeset-no-major.mjs
✅ No changeset declares a `major` bump.
$ node scripts/check-changeset-presence.mjs
Compared the working tree with dc9d651a2 …: 1 file(s) changed, 0 of them under the src/ of a package the release covers, …, 1 changeset(s) added.

CI 终态(按 runs + list_workflow_jobs 双端交叉验证,非单凭 check-runs;全部钉在 head 7327770438a4b25634ac3d0e653574c0666cfd66)

11 个 workflow run 全 completed:10 success + 1 skipped(Dependabot Auto-merge),零 failure。CI run 32068728571 的 9 个 job:8 success + 1 skipped(Test (coverage));其中 Type Check / 四个 Test shard / Build & E2E 的重活步骤本身是 skipped —— docs-only 改动被 job 内 Decide whether this change needs a full run 挡掉,按约定计绿。Changeset Fixed Group Check 是真跑并 success。

草稿状态保留,未 undraft、未 merge。


Generated by Claude Code

@yinlianghuiClaude

Copy link
Copy Markdown
CollaboratorAuthor

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

实物核验:merge-base 恰为批次基线 dc9d651a2,2 files +199/−41 与报告一致,单 commit,模型标识 msg/diff 双零,content/docs/releases/** 零触碰,改动面即 README + changeset。CI 亲读:19 个 check-run 全 completed 零失败(17 success + 2 skipped;docs-only path-filter 短路按纪律计绿,类型证据是本地仓根 81/81 —— 与 #5010 席同口径)。

验收要点:

  1. 三处判定不是「删了了事」而是有出处的考古:CHANGELOG:1284 原文点名 ReportBuilder / ScheduleConfig / drill helpers 在 ADR-0021 9.0 切换时 removed —— README 是那次删除的幸存者,重写方向由此钉死。卡面前提修正一处(ReportScheduleConfig 真身在 @object-ui/types,本包只 import 不 re-export,修法是改路径与 plugin-calendar README 教的 calendarComponents 手动注册 API 不存在 —— 照抄即抛 #5010 同形)—— 先修测量再下结论,正确。
  2. 示例真编译 + 双向反向验证:四个代码块对构建产物 dist/index.d.ts 编译 rc=0;反向 (a) 塞入 src 有命中但不在导出面的 ReportScheduleConfig 被正确判 FAKE(判别性用例,近似法会放过);(b) 旧写法回填转红且三条错误一一对应本次修改 —— 顺带证明旧 README 连真名的用法也编译不过。
  3. 四处同源扩展(report-builder JSON 示例、两条 feature 断言、标题行、悬空引导句)同文件同一次删除的遗留,逐条记删因 —— 采信,不算夹带。
  4. changeset 口径:保留卡面口径 A(plugin-report patch);dev 如实列出 B(空 frontmatter,PR docs(plugin-map): README 按现码重写,不再教包里不存在的那套 API (#5002) #5021 先例)并注明属发布口径。PM 采信 A(与今日同族 PR docs(plugin-calendar): 对齐 README 的导入面与包的真实导出面 #5046 一致,fixed 组的发版由 release 时点批量决定,增量成本趋零),留否决窗 —— 维护者若定 B,一行改动。

派生物分诊(本评论即分诊记录):#5047(pre-9.0 查询形当现行教 + 三个退休 renderer 点名 —— migrate vs 标注 bridge 段是 ADR-0021 迁移口径,#4600 同族)→ needs-user-decision 入决策箱;#5048(六个真导出的签名/参数序全错 —— 机械修正,JSDoc 正例现成)→ pm:queue,但与本 PR 同文件,本 PR 落 main 前不派

转 ready 并挂 auto-merge(squash)。


Generated by Claude Code

@yinlianghui
yinlianghui marked this pull request as ready for review August 17, 2026 21:05
@yinlianghui
yinlianghui added this pull request to the merge queueAug 17, 2026
Merged via the queue into main with commit f331f5aAug 17, 2026
20 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-5016-plugin-report-readme branch August 17, 2026 21:06
os-zhuang pushed a commit that referenced this pull request Aug 18, 2026
…t types (#5138)
objectui#5138 shape 2, as ruled: promote the snippet-extraction +
`tsc --strict`-against-built-`dist` harness into `scripts/`, where it runs once
in CI instead of three times by hand.
The harness already existed three times, hand-rolled and private — in #5053,
#5060 and #5047's PR — and each copy found defects its reviewer had not listed.
This keeps the practice each one proved: extraction by script rather than by
hand, resolution against the package's built `dist/*.d.ts` with a self-check
that says so, and a planted sentinel export that must produce a diagnostic.
The false-green mechanism #5047 measured is designed against structurally
rather than noted: parse errors suppress semantic checking program-wide, so a
run can print a few syntax errors, no semantic diagnostics at all, and read as
a meaningful red. The two phases are separate here, unparseable blocks are
reported and kept out of the semantic program, every failure line is tagged
`[syntax]` or `[semantic]`, and the summary always states how many blocks the
semantic phase actually judged.
Fragments are declared, never guessed: a block that is not meant to compile
carries a marker with a written reason immediately above its fence. A block
that fails to parse is a failure, never a skip — the alternative turns every
real defect into a silent skip.
Coverage is declared too. A document is covered unless it is named in the
script's ledger with a reason; the default is covered, so a new page is gated
from the day it lands. 13 documents and 67 blocks are covered today; the 44
documents on the ledger are debt with names, and the script's header says
plainly that they are unverified.
Scope of the gate, stated in its header because an unstated blind spot is how
this class stays green: it judges TypeScript resolvability only — not schema-key
validity against the spec (#5138 shape 1, unruled), not `type`-literal
registration (`check-doc-component-types.mjs`), and not shell examples (#5151).
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-report README 教三个不存在的导出:ReportBuilder 组件、registerDrillHandlerScheduleConfig 组件

2 participants

@yinlianghui@claude