docs(spec): re-anchor two self-descriptions to measured reality (#7056) - #7065
Conversation
… actually measured (#7017) `widgets.children.chartConfig`'s evidence claimed "chart-config bag forwarded to the chart renderer". Nothing ever measured that: the cited lines took the bag out of the widget and the line after them read exactly one key (`showLegend`, #3135), leaving the rest of `ChartConfigSchema` declared and inert. #5175 measured the real state — 1 of 14 keys reaching the renderer — and recorded that this sentence had already mis-steered the #5022 measurement for half its length. Re-anchored to today's objectui main rather than to either older state, because #7016 landed the enforce half in between. At objectui `@230ffd875`, `chartConfigPresentation` lowers NINE keys, one `if` per key, and the caller spreads the result onto the chart schema handed to the renderer; a DOM test pins each forwarded key. The remaining FIVE are named as unforwarded with the reason: `xAxis`/`yAxis`/`series` are derived from the dataset selection, `type` is answered by the widget's own `type` through `CHART_TYPE_MAP`, and `aria` has no reader on that path. The verdict is unchanged (`live`) — #5175's measurements never demanded a different one; they demanded evidence that supports it. No `children` are opened and no key is classified: the narrowing half for the five unforwarded keys is still an open maintainer decision on #5175, and the note says so. `verifiedAt` is stamped 2026-08-09 and `evidenceScope: "cross-repo"` added — the objectui realm was walked, at a pinned commit, which is what those two fields (#7024) exist to record. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PoaTe9AqwDvcGiE92dUp5Z
…A1 shipped (#6961) #5073 promoted `allowAddTab` into `UserFiltersSchema` with a `.describe()` narrowed on purpose to "renders an add-tab affordance": the button objectui shipped carried no click handler, and promising "end users can add presets" would have advertised a capability the runtime did not deliver (PD#10). The maintainer ruled A1 — implement, session-scoped (#5236, 2026-08-06) — and objectui#3926 delivered it (merged, objectui main `cf5be4ec2`). The describe now states what is shipped: the affordance asks for a name and snapshots the filters currently applied as a new tab; the tab is SESSION-SCOPED — it lives only for the current mount and is never written back as metadata (ADR-0047) — and it carries a remove control the authored presets do not. #5073's applicability sentence is kept verbatim (page lists only; object views use `listViews` for named presets). The `⚠️ Scope of the promotion` TSDoc above the schema recorded the dead-button state as current, so it was realigned too: it now records how the narrowing was resolved instead of asserting a state that has not held since objectui#3926. Documentation semantics only — the ruling confirmed renderers do not read this text. `content/docs/references/ui/view.mdx` is the regenerated projection of the new describe (`gen:schema` + `gen:docs`); no schema key, enum member or strictness posture moves, so the acceptance face is byte-identical. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PoaTe9AqwDvcGiE92dUp5Z
…ty (#7056) One patch changeset for the sweep — both members land in `@objectstack/spec` and neither changes behaviour. Matches the predecessor of this criterion family (#7024 / PR #7032), whose prose-level spec entries were also patch. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PoaTe9AqwDvcGiE92dUp5Z
…cribe-realignment-sweep
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckThis PR changes 1 package(s): 106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
⛔ 7 release-owned page(s) also reference the affected code. These are read-only:
|
Sweep card #7056 — the second round of the "self-descriptions answerable to reality" criterion family (#7024 / PR #7032 is the immediate predecessor). Both members are prose that stopped being answerable to the code it describes: one overstated what a reader delivers, one understated what a renderer now delivers. Every fix re-anchors the description to an already-measured source of truth.
Per-item checklist
packages/spec/liveness/dashboard.json→widgets.children.chartConfig(evidence,note,verifiedAt, newevidenceScope)"objectui @91757a7: …/DatasetWidget.tsx:602-603 (chart-config bag forwarded to the chart renderer)"/ note "chart presentation config; read on the dataset-bound chart path."@230ffd875:chartConfigPresentation(DatasetWidget.tsx:380-429) lowers nine keys, oneifper key, with the per-key line numbers, the call/spread sites (:1091,:1118) and the DOM pin test; the note names the five unforwarded keys and why, records that the old sentence was never measured, and states that the narrowing half is still open on #5175.verifiedAt→2026-08-09,evidenceScope: "cross-repo". Verdict unchanged:live.packages/spec/src/ui/view.zod.ts→UserFiltersSchema.allowAddTab.describe()+ the⚠️ Scope of the promotionTSDoc above the schema; regeneratedcontent/docs/references/ui/view.mdxRender an "add tab" affordance after the presets (tabs element). Page lists only — object views uselistViewsfor named presetsLet end users add their own tab after the presets (tabs element): the affordance asks for a name and snapshots the filters currently applied as a new tab. SESSION-SCOPED — an added tab lives only for the current mount, is never written back as metadata (ADR-0047), and carries a remove control the authored presets do not. Page lists only — object views uselistViewsfor named presetsFixes #7017
Fixes #6961
#7017 — the evidence sentence was never measured
The row claimed "chart-config bag forwarded to the chart renderer". #5175 measured what those lines actually do (verbatim, untranslated):
— i.e. 1 of the 14 keys
ChartConfigSchemadeclares reached the renderer, and the sentence had already mis-steered the #5022 measurement for half its length.Does #5175 demand a different verdict? No. Its measurements demanded that the evidence support the verdict; the maintainer's 2026-08-06 ruling on that card resolved the direction as enforce, not remove — 方案② 的收敛版, objectui-side forwarding of the presentation keys, with 「协议端 v17 零 schema 改动」. So
statusstayslive, unchanged, and nochildrenare opened: per-key classification and the verdict-shape question belong to the narrowing half still open on #5175, and the new note says so explicitly, so this row cannot be read as pre-empting it.Re-anchored to today's reality, not to either older state. #7017's own instruction was 「行号与 sha 按当前 objectui main 重新锚定」 and 「evidence 改写完成时若其已合入,以合入后的实况措辞为准」 — the enforce half (#7016) has merged: objectui main is
230ffd875, "feat(plugin-dashboard): forward the chartConfig presentation keys the chart block delivers (#3934)". Measured there:showLegendshowDataLabelstitlesubtitledescriptionheightannotationsinteractioncolors(split into the positional palette andcategoryColors)DatasetWidget.tsx:390,:391,:393,:395,:397,:401,:403,:405,:419/:425; called at:1091, spread onto the chart schema at:1118; DOM-pinned in__tests__/DatasetWidget.chartConfig.dom.test.tsxxAxisyAxisseries— derived from the dataset selection, so an authored value would shadow the derived binding;type— answered by the widget's owntypethroughCHART_TYPE_MAP;aria— no reader on this path (AdvancedChartImplhas noariaprop, and the ARIA injection reads the flatariaLabel/ariaDescribedBy/role)chartConfigPresentation's own contract commentverifiedAtis stamped andevidenceScope: "cross-repo"added — the objectui realm was walked, at a pinned commit, which is exactly what those two fields (added by this family's predecessor, #7024) exist to record.#6961 — the describe still carried the interim narrowing
#5073 promoted
allowAddTabwith a deliberately narrowed.describe()(renders an affordance, nothing more) because the button objectui shipped had no click handler — narrowing on purpose rather than advertising a capability the runtime did not deliver (PD#10). The maintainer's ruling on #5236 (comment 5200253516, 2026-08-06) closed that interim state. Verbatim, untranslated:objectui#3926 is MERGED (objectui main
cf5be4ec2, per the unblock comment on #6961). Verified in the merged source (packages/plugin-list/src/UserFilters.tsx):handleAddTabtakes the drafted label, snapshotsfiltersForTab(activeTab)into a newSessionTab, holds the list in component state only — its own comment: "adding a tab writes nosys_metadata, calls no API, and touches no storage" — and each session tab renders a remove control the authored presets do not get. The describe now says all three, and keeps #5073's applicability sentence verbatim.The stale
⚠️ Scope of the promotionTSDoc directly above the schema asserted the dead-button state as current; it is realigned in the same row to record how the narrowing was resolved, since leaving it would reintroduce the exact defect this sweep exists to remove.Per the ruling, renderers do not read this text — documentation semantics only, zero runtime change.
Self-certification
git diff --statmaps 1:1 onto the checklist (origin/main…HEAD):packages/spec/liveness/dashboard.json→ spec:liveness 台账widgets.children.chartConfig的 evidence 措辞不实(「chart-config bag forwarded」),按 #5175 实测改写(无争议先行步) #7017's row.packages/spec/src/ui/view.zod.ts+content/docs/references/ui/view.mdx→ spec:UserFiltersSchema.allowAddTab的.describe()从「仅承诺渲染入口」升回真实语义(#5236 A1 落地后的联动半边) #6961's row (the.mdxis the regenerated projection of the describe, per the sweep rule that generated-artifact deltas count as part of that row)..changeset/*→ the sweep's changeset: one patch bump on@objectstack/spec, matching the predecessor family (sweep(spec): 3-item "self-descriptions answerable to reality" sweep — one claim, one PR, per-item checklist (#6242 #4895 #4837) #7024 / PR sweep(spec): three self-descriptions re-anchored to a verifiable source of truth (#6242 #4895 #4837) #7032), whose prose-level spec entries were also patch.Zero acceptance-face change. No schema key, enum member, default, strictness posture or tombstone moves — the diff in
view.zod.tsis one.describe()string and one comment block.check:authorable-surface(which coversauthorable-surface/,authorable-defaults/and the JSON schemas) is green without regeneration, i.e. the legal-metadata set is byte-identical; the only stale artifact the gates found wascheck:docs, the describe's own docs projection. No test expectation is edited and no test file is touched.Gates run — enumerated from
.github/workflows/lint.yml(both jobs) and.github/workflows/spec-liveness-check.yml, not from memory. All run after mergingorigin/main(3f7f14e61) and rebuilding:check:generated— all 10 artifacts (spec-changes,upgrade-guide,skill-docs,skill-refs,react-blocks,authorable-surface,api-surface,docs,strictness-ledger,test-typecheck)gen:schema+gen:docscheck:liveness,check:empty-state,check:variant-docs,check:strictness-ledgerpnpm lint(ESLint job)check:slot-lookup,check:query-options-erasure,check:verify-stand-in,check:nul-bytes,check:stack-collection-maps,check:doc-authoring,check:docs-audit-scope,check:role-word,check:quick-reference-counts,check:adr-anchors,check:org-identifier,check:authz-resolver,check:service-providers,check:route-envelope,check:error-code-casing,check:wildcard-fallthrough,check:meta-type-normalized,check:init-service-contract,check:durability-log-level,check:startup-registry-verdict,check:objectui-changeset,check:changeset-gate-self-tests,check:release-notes,check:release-body,check:node-version,check:workflow-status-functions,check:shard-attestation,check:required-contexts,check:published-files,check:engine-double-contract,check:kernel-hook-pairs,check:resume-authority-declared,check:driver-memory-census,check:merge-driver,check:spec-parsed-alias,check:tenant-chokepointcheck:type-check-coverage,check:driver-conformance,check:stall-guard,check:skill-frame-sync,check:skill-compatibility,check:agent-model-declared,check:generated --reconcile-onlypnpm --filter @objectstack/spec exec tsc --noEmitturbo run typecheck(packages + apps)check:i18n,check:i18n-coverage,check:app-nav-i18npnpm --filter @objectstack/spec testnode scripts/check-adr-0087-registration.mjs --base origin/maincheck:react-declaration-paritysdui.manifest.json; on-demand at the pin bump, #5960)Out-of-scope discoveries: none — nothing was folded in.
⛔ Not queued and not armed for auto-merge — the PM lands spec PRs serially.
Refs: #7056 (sweep card), #5175 (the #7017 measurement source), #7016 (the enforce half, landed as objectui#3934), #5236 A1 + objectui#3926 (the #6961 semantics source), #7024 / PR #7032 (criterion-family predecessor).
Generated by Claude Code