Uh oh!
There was an error while loading. Please reload this page.
refactor(spec)!: view.exportOptions adopts the object form the renderer reads; 'pdf' leaves the format enum (#8010) - #8324
Conversation
…ves the format enum (#8010) Option A per the maintainer ruling of 2026-08-12 (comment 5270998514): - object form declares exactly the five renderer-read keys measured on objectui origin/main@878140b (formats, maxRecords, includeHeaders, fileNamePrefix, streaming) - legacy bare array stays accepted and lifts to { formats } at parse - 'pdf' removed as an enum-VALUE narrowing (crypto.hash precedent): enum error map + union-level dispatch carry the prescription naming #1301 and the surviving formats - ADR-0087 conversion view-export-options-pdf-removed + step-17 wiring - liveness note re-cited, docs table + examples moved to the object form Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Euoy6wyfzgiWtgCg4s6JK2
…trictness-ledger counts for #8010 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Euoy6wyfzgiWtgCg4s6JK2
…ortoptions-object-form
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:
|
Uh oh!
There was an error while loading. Please reload this page.
…8315) The merge with main was textually conflict-free, but a conflict-free merge of two independently-regenerated projections is not the generator's output. Measured on this tree: the plain merge result was MISSING two sibling PRs' entries from `spec-changes.json` and `docs/protocol-upgrade-guide.md` — `view-export-options-pdf-removed` (#8010 / PR #8324) and `engine-dotted-projection-refused` (#7589 / PR #8327). Both are present in origin/main's copies of those artifacts; git dropped them while reporting no conflict. `registry.ts` spliced correctly and regenerated byte-identical (78 semantic entries) — the loss was confined to the two prose projections. Not a silent class: against the un-regenerated merge, `check:spec-changes` and `check:upgrade-guide` both FAIL (exit 1) while `check:migration-registry` passes. So this would have been caught — in the merge queue, as an ejection. Regenerating before arming is what makes it cost nothing. Ran on the merged tree, merge committed first: pnpm --filter @objectstack/spec gen:migration-registry pnpm --filter @objectstack/spec gen:spec-changes pnpm --filter @objectstack/spec gen:upgrade-guide Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PEVB6w7D7uCszR9Mw1BL73
Fixes#8010
What
view.exportOptionsadopts the object form the renderer actually reads (maintainer ruling 2026-08-12, on-card comment 5270998514, option A), and'pdf'leaves the format enum (PDF export was declined as #1301, NOT_PLANNED; that decision is unchanged here).{ formats?, maxRecords?, includeHeaders?, fileNamePrefix?, streaming? }— a strict object declaring exactly the five keys the only renderer reads, re-measured on objectuiorigin/main@878140b(ObjectGrid.tsx:1596–1642):formats(:1596, :1605), the previously undeclaredstreamingopt-out (:1600, :1642),maxRecords(:1621),includeHeaders(:1622),fileNamePrefix(:1631). The measurement matches the ruling's five-key claim exactly; no undeclared-but-read key survives.{ formats: [...] }at parse (z.inputkeeps both spellings;z.outputis the object form only —ListViewisz.input,ListViewParsedisz.infer, both stay coherent by construction).'pdf'removal is an enum-VALUE narrowing (thecrypto.hashprecedent): the format enum's error map carries the prescription keyed onissue.input, so only the spelling that used to be legal is told it "was removed"; a union-level error dispatch makes the refusal the top-level parse message in either authored form, naming [P1] export: no print / PDF export — procurement orders & audit reports cannot be delivered #1301 and the surviving formats. Not a runtimeconsole.warn.view-export-options-pdf-removed(D2) + step-17 wiring (D3);retiredFromLoadPath— stored pre-removal rows replay clean,os migrate meta --from 16rewrites author sources. The conversion strips only'pdf'and deliberately does not rewrite the array spelling (back-compat, not retired). NoRETIRED_KEYS_BY_MAJORentry — an enum value is not a key, so there is no tombstone line for gate (b) to read (same ashook-body-crypto-hash-removed); the four existence ratchets are byte-identical by design for a value narrowing (crypto.hash 能力声明了、构建期还会自动推断,但沙箱从没实现 —— 调用直接抛(declared ≠ enforced) #4391 precedent).view.jsonrow re-cited to the five measured reads and re-dated; docs table + generated references updated; both example apps moved to the canonical object form (which the current renderer actually reads — the examples' XLSX menu entry was dead under the array spelling).Scope
Spec half only, per the ruling's contract-first split: the objectui renderer/type reconciliation (the false "Aligned with @objectstack/spec" comment at
types/src/objectql.ts:783–785, theas anystreaming read,'pdf'in its local type) is the PM-filed follow-up card on that repo. objectui was touched read-only for measurement.File surface kept to the
ListViewSchemaexportOptionsblock inview.zod.ts(plus the new module-level consts it needs), the conversion/migration registries, liveness note, changeset, tests, docs, examples. TheFormSectionSchema/PageComponentSchemablocks and the shared strict-options plumbing are untouched.Landing serialization: current
origin/main(2a18012) is merged in; if #8201/#8202 (branchclaude/issue-8202-per-shape-guidance-completion, same file, disjoint region) lands first, this branch re-merges before landing.Verification
'pdf'refused in both spellings with the prescription (message substance asserted: the removal sentence, [P1] export: no print / PDF export — procurement orders & audit reports cannot be delivered #1301, the survivors, the migrate sentence); a never-legal format keeps the plain enum message (no false "was removed"); unknown key on the object form gets the strict-surface suggestion;ObjectListViewSchemacopy behaves identically.ListView.exportOptionsis typed as a bare array, but the only renderer readsexportOptions.formats#8010 for per-package readings.check:generatedgreen after regenerating exactly the four proved-stale artifacts (spec-changes, upgrade-guide, references, strictness-ledger counts); full derived gate list green except two pre-existing non-PR gates (objectui pin freshness — blocks the Version Packages PR only; dev-prereqs — local stale-dist advisory).Generated by Claude Code