Repository navigation
feat(spec)!: FormSectionSchema.columns drops default(1) — undeclared section density is the renderer's, declared is the author's ceiling - #23771
Conversation
…ection density is the renderer's, declared is the author's ceiling Claude-Session: https://claude.ai/code/session_012vwv8sA1ZBBjmphdHWo9i5 Co-authored-by: Claude <noreply@anthropic.com>
…jor 18 Claude-Session: https://claude.ai/code/session_012vwv8sA1ZBBjmphdHWo9i5 Co-authored-by: Claude <noreply@anthropic.com>
…rmSection.columns Claude-Session: https://claude.ai/code/session_012vwv8sA1ZBBjmphdHWo9i5 Co-authored-by: Claude <noreply@anthropic.com>
…once the default is dropped Claude-Session: https://claude.ai/code/session_012vwv8sA1ZBBjmphdHWo9i5 Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 1 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 142 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin d166e0d479a1fa76a5d1796c87c4d2b438bcdf8a && git checkout d166e0d479a1fa76a5d1796c87c4d2b438bcdf8a
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 29c7157af4fed4738b3da14bbfb008496cbd1f6a 741552c04bdb6f52d2ffa261db609c365efbab88 && git checkout -B drift-repro 29c7157af4fed4738b3da14bbfb008496cbd1f6a && git merge --no-ff 741552c04bdb6f52d2ffa261db609c365efbab88
node scripts/docs-audit/affected-docs.mjs --json 29c7157af4fed4738b3da14bbfb008496cbd1f6a
|
席位核对 · ACCEPT · PR #23771 @
|
Contract reviewServed-tier: Inputs: card #23740 (body and both comments), the ruling record on objectstack-ai/objectui#12521 (comment 6204264665), PR #23771 (body, file list, net diff against ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
Fixes #23740
Clause-②: no
What
FormSectionSchema.columns(packages/spec/src/ui/view.zod.ts) drops.default(1), per the maintainer ruling recorded on objectstack-ai/objectui#12521 (comment 6204264665): 「不用决策卡,我同意 b) 改协议(推荐): 去掉分节 columns 的 default(1)」.1–4; the string spellings'1'–'4'keep their transform (nowparseInt(val, 10)), andundefinedpasses through. Measured with zod 4.6.5: an absent key parses to an object with nocolumnskey at all (notcolumns: undefined)..describe()stating the two meanings: declared = the author's ceiling (at most that many fields per row where the container is wide enough; collapsed by the renderer on narrow containers); undeclared = the renderer's choice by available width. No pixel or breakpoint value enters the protocol.FormViewSchema.columnsis untouched: its describe does not speak to sections.Files
packages/spec/src/ui/view.zod.ts: the schema change.packages/spec/scripts/lib/default-changes.ts: a new18: [...]row declaringui/FormSection:columns: 1 → (none). The spec build's default ratchet refused the change until it was declared; itsreasonexplains what moves for a consumer and why nosemanticmigration entry comes with it. A conversion that writescolumns: 1onto stored sections would bring back the reading the ruling removed.packages/spec/authorable-defaults/ui.json(theui/FormSection:columns = 1line leaves) andcontent/docs/references/ui/view.mdx(three tables losedefault: 1and gain the describe).check:generatednamed onlycheck:docsas stale;--fixregenerated it.content/docs/protocol/objectui/layout-dsl.mdxgets one paragraph on the two meanings.columns: 1now assert the key is absent. None was deleted.packages/spec/src/ui/view.test.ts(plus a new case: declared1/'2'/4survive, and5/'0'are refused)packages/spec/src/ui/view-union-diagnostics.test.ts(theSECTIONparse output)packages/spec/src/ui/view-overlay-viewkind-arm.test.ts(byte-identical form overlay output)packages/metadata-protocol/src/protocol.graft-folded-form-sections.test.ts.changeset/23740-form-section-columns-no-default.md:@objectstack/specminor, with a BREAKING line, a before/after table of parse outputs, and the ADR-0087 dispositionnot-required (no-migration-prescription).check:adr-0087-registrationaccepts that spelling (measured, exit 0).Evidence
columnsinpackages/*/srcoutsideview.zod.ts: 0, re-measured at2906cd8d2.protocol.tshand-builds a section with an explicitcolumns: 2, so it is unaffected.pnpm --filter @objectstack/spec build: exit 0, after the default row was declared.pnpm --filter @objectstack/spec test: 678 files passed, 1 skipped; 20755 tests passed.pnpm --filter @objectstack/spec typecheck: exit 0.@objectstack/metadata-protocol: its dependency closure was built,protocol.graft-folded-form-sections.test.tspassed 46 of 46, andtypecheckexited 0.node scripts/ablation-replace.mjsput.default(1)back on disk (anchor 1 → 0, blob3dba72ea→f04fd827).view.test.tsthen failed 1 test,FormSectionSchema > should accept minimal form section. The tool restored the file: blob back to the HEAD blob3dba72ea, andgit diff HEADempty.dispatch-gates --commands, at head741552c0): 110 derived, 109 ran with exit 0.--ranreconciles 110 of 110.check-plugin-teardown-shape --self-test(the shallow clone lacked its pinned fixture commit, which was fetched) andcheck:skill-examples(the client-react closure was built first).check:dual-build-cjs-loads, exit 3, PREREQUISITE NOT MET. It needs every package'sdist/, which takes a repo-wide build. Left to CI.Acceptance notes
metadata-admin/SchemaForm.tsxreadss.columns ?? 1; plugin-form's sectioned layout) are objectui#12521 / objectui PR test(cli): read back the port the e2e serve child actually bound, and fail loudly on a silent drift #12546's side. No objectui file is touched here.maingained 3 commits since the branch point (pm-dispatch, plugin-security tests, objectui pin). None touchespackages/specormetadata-protocol, so no merge was made before opening.Generated by Claude Code