Repository navigation
fix(console, data-objectstack): the report drill's definition read names the report's package as the reader, and the chart colour probe's non-2xx guard is pinned (ADR-0150 D3) - #33366
Conversation
…sal whose body names the object The existing 409 pin answered an ADR-0112 envelope that names no object, so a probe with no status guard stopped at the missing `object` anyway and the pin stayed green. This refusal's body also carries a definition naming `task`: without the guard the chart reads `task` and relabels from it. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEkQ5muSKmXfKL9WVj7dKY
…mes the report's package as the reader MetadataClient.get takes an optional callerPackage, sent as ?callerPackage= (ADR-0150 D3), distinct from packageId (the exact qualifier). ReportView's drill reads the dataset definition with the report's served package when no exact drill filter arrives, which the current server answers for a report grouped by a date dimension with no granularity, not only an older server. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEkQ5muSKmXfKL9WVj7dKY
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEkQ5muSKmXfKL9WVj7dKY
|
domain:ui#1 · os-project-manager · session_01FEkQ5nWoa1Ze1QzjRTSYXD Contract reviewServed-tier: Read: card #32760 body and all five comments (triage 6828393064, re-grade 6837951505, claim 6880548960, amendment 6880606745, os-dev-report 6881549558); PR #33366 body and its six-file list; the net diff ① Derived judgments
② Semver level
③ Boundary flags
Findings:
Implemented-by: VERDICT: PASS |
|
domain:ui#1 · os-project-manager · session_01FEkQ5nWoa1Ze1QzjRTSYXD 席位核对Verdict: ACCEPT · head
|
|
domain:ui#1 · os-project-manager · session_01FEkQ5nWoa1Ze1QzjRTSYXD Regen-provenance: 6881609696 · |
|
domain:ui#1 · os-project-manager · session_01FEkQ5nWoa1Ze1QzjRTSYXD Landing · head
State: ready + auto-merge. |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 43626642771 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
|
domain:ui#1 · os-project-manager · session_01FEkQ5nWoa1Ze1QzjRTSYXD Queue red triage · 2026-11-14T18:47Z · queue build 43626642771 failed Dogfood Regression Gate (1/3) on |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 43630273394 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
|
domain:ui#1 · os-project-manager · session_01FEkQ5nWoa1Ze1QzjRTSYXD Queue red triage 2 · 2026-11-14T19:54Z
Re-queued a second and last time. A third red goes to the server lane / coordinator, not back to the queue. |
Requested by Leehom · project thread
Fixes #32760
Clause-②: yes (widening)
Metadata-protocol: none
维护者速读
?callerPackage=),和报表自己的查询解析到同一个数据集。为此MetadataClient.get新增一个可选的callerPackage参数。另给图表颜色探测的「非 2xx 不解析」守卫补了一个能区分它的测试。type: 'date'且没有dateGranularity的维度分组的报表,服务端只给object不给下钻元数据,点击就落到这里,原来按裸名读取,包里的报表可能读到别的包的同名数据集,或两包同名时409。ui/packages/app-shell/src/views/ReportView.tsx的handleDatasetDrill(回退分支带读者包);ui/packages/data-objectstack/src/metadata-client.ts的MetadataGetOptions.callerPackage与readItemResponse;ui/packages/app-shell/src/views/ReportView.drillCallerPackage-32760.test.tsx(用真实报表渲染器点击行)。pnpm --dir ui exec vitest run packages/app-shell/src/views/ReportView.drillCallerPackage-32760.test.tsx packages/data-objectstack/src/metadata-client.callerPackage-32760.test.ts,预期 7 个全绿。What changes
The card's three items, each re-measured on
origin/main(71ade1ae)..changeset/32077-dataset-query-package.mdis not onorigin/main: it shipped in 18.4.0 (PR chore: version packages #29963) together with fix(ui): dataset callers send the reader's package (?callerPackage=) instead of the exact qualifier, and the report date read and chart colour probe read by package (ADR-0150 D3) #32629's changeset, and both are in the 18.4.0 sections ofplugin-charts,plugin-report,plugin-dashboardanddata-objectstackCHANGELOG.md. fix(ui): dataset callers send the reader's package (?callerPackage=) instead of the exact qualifier, and the report date read and chart colour probe read by package (ADR-0150 D3) #32629's own 18.4.0 entry already states what happens to the 32077 BREAKING note (the dependency case is served again;outside-closureis the residual break, with its fix). No changeset is edited here.ObjectChart.optionColors.test.tsxgains a row in the ADR-0150 D3 describe: a409whose body also carries a definition namingtask(beside the ADR-0112 error). Without the guard the probe parses that body, readsmeta/object/taskand relabelstodoasTo dofrom a dataset the server refused to resolve. With it: one request (the refused definition read), raw labels, no colours. The existing409row stays as it is; it cannot tell the guard apart because its envelope names no object (fix(ui): dataset callers send the reader's package (?callerPackage=) instead of the exact qualifier, and the report date read and chart colour probe read by package (ADR-0150 D3) #32629's A10).queryDataset(service-analytics) setsobjecton every dataset answer. It sendsdimensionFields/drillRawRowsonly for dimensions with afieldand a type other thandate, anddrillRangesonly for a date dimension with adateGranularity.DatasetDimensionSchemamakesdateGranularityoptional, so a report grouped by atype: 'date'dimension with no granularity getsobjectanddrillScopesbut no exact filter. The renderer then emits the drill with noobjectFilter(DatasetReportTable'sdrill), andhandleDatasetDrilltakes the fallback, which readmetadataClient.get('dataset', NAME)bare.{ callerPackage: servedPackageId(editSchema || reportData) }, the same served package the renderer'sReportPackageContextgives every selection (the renderer receivespreviewReport, the sameeditSchema || reportData). A report authored in the environment sends none. A refusal is caught as before (ReportView: drill failed), so no drawer opens and nothing is retried bare.MetadataClient.gethad no caller arm: itspackageIdis the exact qualifier?package=(D5), which refuses a dataset only a dependency holds.MetadataGetOptionsgains an optionalcallerPackage, sent as?callerPackage=(the/metadoor's D3 arm,META_ITEM_CALLER_PACKAGE_PARAMinpackages/rest/src/meta-item-read-gate.ts), omitted when absent or empty. Using the client keeps the console's one authenticated meta transport and its?preview=draftoverlay, which a hand-rolledfetchwould lose. The door refusescallerPackagebesidepackage(400) and on any type butdataset; the client sends what it is given and does not pick between them.handleDatasetDrillnow says when the fallback runs and how it reads..changeset/32760-report-drill-caller-package.md:@object-ui/data-objectstack,@object-ui/app-shell(private) and@object-ui/console(ships app-shell), patch.plugin-chartschanges a test file only, which itsfiles[](dist) does not ship.Tests
ui/packages/plugin-charts/src/ObjectChart.optionColors.test.tsx: "a refusal whose body names the object is still a refusal: no object read, theme palette kept".ui/packages/app-shell/src/views/ReportView.drillCallerPackage-32760.test.tsx(new). It renders the realReportViewwith the real report renderer, answers the current server's shape for a date dimension with no granularity, and clicks thedataset-drill-row, so the fallback is reached through the input pipeline a user drives:READS_AS_THE_REPORTS_READER: one definition read,('dataset', 'task_metrics', { callerPackage: 'com.acme.app' }), and the drawer opens ontaskwith{ due_date: '2026-03-01' }.ENVIRONMENT_REPORT_READS_BARE: a report with no_packageIdreads with{}.REFUSAL_IS_NO_DRILL: a rejected read is logged once, never retried, no drawer.FAST_PATH_CONTROL: an answer withdimensionFields/drillRawRowsdrills with no definition read.ui/packages/data-objectstack/src/metadata-client.callerPackage-32760.test.ts(new):?callerPackage=sent and never as?package=; encoded and beside?preview=draft; CONTROL, omitted or empty sends no parameter.scripts/ablation-replace.mjs, each restore provenblob == HEADandgit diff HEADempty;@object-ui/*resolves tosrcthrough the vitest aliases, so no rebuild):if (!defRes.ok)made never-trueObjectChart.optionColors.test.tsxexpected 'To do' to be 'todo'); the old409row stays green{}whatever the packageREADS_AS_THE_REPORTS_READER,REFUSAL_IS_NO_DRILL)callerPackage=Acceptance notes
objectFilterfor it).Clause-②: yes (widening), the file surface plusui/packages/data-objectstack/src/metadata-client.tsand its test.Metadata-protocol: none: no metadata shape, schema, stored row or authorable key changes.type: 'date'dimension with no granularity filters its field by the clicked group value as the answer shows it (filter[due_date] = '2026-03-01'here). Whether the server's label pass rewrites such a value before the client sees it was not measured; the drill result for those reports is therefore not claimed correct beyond the dataset it reads. The fallback still ignores theobjectthe current server sends and takes the definition's.ObjectChart.tsxis not edited; the guard was only ablated.Verification
All readings on head
c72c8a04unless noted (baseorigin/main71ade1ae). Every number is from a shared box underscripts/pm/os-verify-lock.sh.pnpm --filter '@object-ui/app-shell^...' --filter '@object-ui/plugin-charts^...' build(plus the@objectstackspec, formula, client, lint and sdui-parser closures), lockVERDICT command-exit 0.@object-ui/data-objectstack,@object-ui/app-shell(tsc --noEmitandtsconfig.test.json),@object-ui/plugin-charts(both): eachVERDICT command-exit 0.pnpm --dir ui exec vitest run packages/data-objectstack/ packages/plugin-charts/ packages/app-shell/src/views/ReportView: 229 files passed, 2755 tests passed, 9 skipped,VERDICT command-exit 0(head4afe687a; the last commit only adds a module-top import to the new ReportView test, which was re-run alone onc72c8a04: 4/4).dispatch-gates --ranreads 37 derived, 37 run, eachexit 0, 0 NOT-MEASURED, 0 UNRUN. The first pass (head4afe687a) had one red,check:test-source-aliason the new ReportView test (a dynamicimport('@objectstack/lint')reached throughReportConfigPanel); fixed by the module-top import, then all 37 re-run onc72c8a04.check:type-check-debt: 0 ledger entries re-measured for this diff (none of the touched packages is in the ledger).Derived gate record (c72c8a0)
Generated by Claude Code