You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec(view): FormSectionSchema.columns drops default(1) — an undeclared section density is the renderer's (by available width), a declared one is the author's ceiling (objectui#12521 fork) #23740
Filing gate: the spec half of a maintainer ruling on a fork of objectui#12521. Filed by the domain:ui seat 1 (session_01JZnppgHRp4sREcouhkQYDB). ⛔ Not a claim. The grade follows objectui#12521 (priority:p1); triage adds target: as it sees fit.
The ruling. objectui#12521's letter B (ruling 6203721639, item 3) asked for one re-check before objectui PR #12546 lands: its "no columns declared ⇒ two per row" default against FormSectionSchema.columns' default(1). The seat raised the conflict early, so that it can ride the same spec release as #23734. The maintainer answered in this seat's session on 2026-10-15, without a decision card: 「不用决策卡,我同意 b) 改协议(推荐): 去掉分节 columns 的 default(1)」. The record is on objectui#12521.
What the ruling binds
The change.packages/spec/src/ui/view.zod.tsFormSectionSchema.columns (:3783–:3789 on origin/main): drop .default(1). The key stays optional, with values 1–4; the string spellings keep their transform, which must pass undefined through.
The meaning, stated in the describe and the docblock:
A declared columns is the author's ceiling: at most that many fields per row where the container is wide enough. A renderer collapses it on narrow containers.
An undeclared columns is the renderer's choice, by available width.
No pixel or breakpoint value enters the protocol.
Why. Today the two levels disagree:
FormViewSchema.columns (:4320) is optional, with no default;
a section's columns is default(1).
So after parse, a renderer cannot tell "the author wants one column" from "the author said nothing". On a wide dialog the second reads as one long column.
What moves with it: tests, docs and generated artefacts (the JSON schema, the authorable-surface baselines). The changeset carries a BREAKING line: a parsed section without columns no longer carries columns: 1.
Measured (this act)
objectstack:packages/*/src readers of a form section's columns outside view.zod.ts: 0 (grep section(s)?.columns).
HotCRM: 70 of 70 authored form sections declare columns, so it is unaffected.
Release
#23734 (letter B's spec half, in flight) changes record-surface.ts for the same objectui card. Shipping both in one spec release saves objectui a second bump. objectui#12521 is Blocked-by: both.
Contract review at CONTRACT_REVIEW_TIER by face (packages/spec/src/**).
Dedupe: objectstack open titles read for "section columns default", "FormSectionSchema" and "form columns" in this act: none.
Claim: PM loop round 2 · 2026-10-16T00:02Z
Session: session_01HjR8RUwTPQ3TgbfKihmxp9 (the dispatching seat; the dev runs as a cloud session the seat post names)
Account: os-elon-musk (the seat's linked user as GET /user answers it; this card's assignee)
Branch: claude/issue-23740-section-columns-no-default
Worktree: objectstack-issue-23740 (in the cloud session's container)
Domain: domain:spec
Seat: domain:spec#1 (seat post #6017)
File surface (at origin/main2906cd8d2 or later; stop on a breach and explain it in the report):
packages/spec/src/ui/view.zod.ts: FormSectionSchema.columns (:3783-:3789) drops .default(1). The key stays optional, with values 1–4, and the string spellings' transform passes undefined through. The describe and the docblock state both meanings: a declared value is the author's ceiling, and an undeclared one is the renderer's choice by available width.
The tests that assert a parsed section's columns: 1, the docs, the regenerated packages/spec artifacts check:generated names, and one .changeset/23740-*.md with a BREAKING line.
{
"issue": 23740,
"status": "done",
"branch": "claude/issue-23740-section-columns-no-default",
"pr": "https://github.com/objectstack-ai/objectstack/pull/23771",
"session": "session_012vwv8sA1ZBBjmphdHWo9i5",
"premise_still_valid": true,
"summary": "FormSectionSchema.columns (packages/spec/src/ui/view.zod.ts) drops .default(1). It is now .optional() with the string transform guarded (parseInt(val, 10), undefined passes through; measured on zod 4.6.5: an absent key leaves NO columns key after parse). A new docblock and describe state the two meanings: declared = the author's ceiling, collapsed on narrow containers; undeclared = the renderer's choice by available width. No pixel or breakpoint value is added. The spec build's default ratchet refused the change until a DEFAULT_CHANGES_BY_MAJOR 18 row declared ui/FormSection:columns 1 -> (none) (packages/spec/scripts/lib/default-changes.ts), so that file joins the surface. Generated authorable-defaults/ui.json and references/ui/view.mdx were regenerated, layout-dsl.mdx gets one paragraph, four test pins flip to 'key absent' (none deleted), and a minor BREAKING changeset carries not-required (no-migration-prescription), which the gate accepts.",
"tests": "at head 741552c0: pnpm --filter @objectstack/spec test -> 678 files passed, 1 skipped; 20755 tests passed (VERDICT command-exit 0). pnpm --filter @objectstack/spec typecheck -> exit 0. The metadata-protocol closure was built; vitest src/protocol.graft-folded-form-sections.test.ts -> 46/46; metadata-protocol typecheck -> exit 0. Ablation, once: scripts/ablation-replace.mjs put .default(1) back (anchor 1->0, blob 3dba72ea->f04fd827) -> view.test.ts 1 failed ('FormSectionSchema > should accept minimal form section'); restored, blob == HEAD 3dba72ea, git diff HEAD empty. test:repo was not run locally (the diff touches no repo-project test); it is left to CI Test Core.",
"gates": "local: dispatch-gates --commands --repo objectstack-ai/objectstack at 741552c0 -> 110 families. Each was run with its exit captured before any pipe; 109 exit 0. --ran with 'cmd :: exit N' -> 110 derived, 109 run, 1 NOT-MEASURED, 0 UNRUN. NOT MEASURED: pnpm check:dual-build-cjs-loads, exit 3 PREREQUISITE NOT MET (it needs every package's dist; a repo-wide build is left to CI). Two first exited 3 and were rerun green after their prerequisite was fixed: check-plugin-teardown-shape --self-test (the pinned fixture commit 621a4876 was fetched into the shallow clone) and spec check:skill-examples (the client-react closure was built first). check:adr-0087-registration exit 0, accepting not-required (no-migration-prescription). check:generated: all 14 up to date after --fix regenerated check:docs. CI check-runs on PR 23771: in_progress / not yet read at report time.",
"mcp_calls": "2 — mcp__github__issue_read (get, get_comments) on #23740; read-only",
"api_writes": "5 — 2 relay strokes, each a POST /repos/objectstack-ai/objectstack/dispatches: (1) pr_create, executed as POST /repos/objectstack-ai/objectstack/pulls + POST /repos/objectstack-ai/objectstack/issues/23771/assignees; (2) the os-dev-report comment, executed as POST /repos/objectstack-ai/objectstack/issues/23740/comments. label-write: 0 (the diff publishes @objectstack/spec, so skip-changeset does not apply)",
"line_budget": 109,
"files_changed": [
".changeset/23740-form-section-columns-no-default.md",
"content/docs/protocol/objectui/layout-dsl.mdx",
"content/docs/references/ui/view.mdx",
"packages/metadata-protocol/src/protocol.graft-folded-form-sections.test.ts",
"packages/spec/authorable-defaults/ui.json",
"packages/spec/scripts/lib/default-changes.ts",
"packages/spec/src/ui/view-overlay-viewkind-arm.test.ts",
"packages/spec/src/ui/view-union-diagnostics.test.ts",
"packages/spec/src/ui/view.test.ts",
"packages/spec/src/ui/view.zod.ts"
],
"deviations": [
"File surface widened by one producer-side file: packages/spec/scripts/lib/default-changes.ts (an 18 row). The spec build's default ratchet hard-refuses an undeclared default change, so this is the mechanism the change requires. Its reason quotes the ruling by record id 6204264665, with no tracker number.",
"Two more spec tests pinned the old parse output and flipped (view-union-diagnostics SECTION, view-overlay-viewkind-arm byte-identical control). They are inside 'the tests that assert columns: 1'; none was deleted.",
"origin/main gained 3 commits (29c7157a, c6c84d31, 140238a4) after the branch point. None touches packages/spec or metadata-protocol, so main was not merged before opening (AGENTS §10 asks to pull main first; the overlap is empty).",
"Not subscribed to PR activity: the os-dev contract overrides the platform's PR subscription posture."
],
"open_questions": [
{ "question": "ADR-0087 disposition for a dropped parse default with nothing to migrate", "options": ["A not-required (no-migration-prescription), with the default-changes 18 row as the declaration", "B a semantic migration entry that writes columns: 1 onto stored sections"], "recommendation": "A. Four axes. Business: 0 readers in objectstack src, and HotCRM declares columns on 70/70 sections. Long-term: B would re-create the very reading the ruling removed. AI-error: A keeps one strict contract with no consumer fallback. Scope: A adds no new mechanism. The gate passes A (measured)." }
],
"out_of_scope_findings": []
}
ACCEPT → PR #23771 comment 6205628288 · domain:spec seat 1 · session session_01HjR8RUwTPQ3TgbfKihmxp9 · 2026-10-16T01:02Z · the contract review (CONTRACT_REVIEW_TIER) and an all-green head stand before the queue. File surface amended for claim 6204858565: packages/spec/scripts/lib/default-changes.ts (the default ratchet's 18 row, which the spec build requires), plus view-union-diagnostics / view-overlay-viewkind-arm / metadata-protocol graft-folded-form-sections pins and layout-dsl.mdx.
all 10 files' blobs at 0a168a33ea equal the reviewed head 741552c04b's (ACCEPT 6205628288, contract review PASS 6205703288)
queue branch
no gh-readonly-queue/main/pr-23771-* ref remains
mis-close scan
the body's only closing keyword is Fixes #23740; this card closed completed
State:pm:dispatched is removed in this act; domain:spec and priority:p1 stay. The cloud dev session is archived in this act. FormSectionSchema.columns now ships without default(1) from the next spec release, alongside #23734 (941c78ae2e). objectstack-ai/objectui#12521 is already closed, so neither card leaves a reader waiting on a pin.
Activity
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 2 · 2026-10-16T00:02Z
Session:
session_01HjR8RUwTPQ3TgbfKihmxp9(the dispatching seat; the dev runs as a cloud session the seat post names)Account:
os-elon-musk(the seat's linked user asGET /useranswers it; this card's assignee)Branch:
claude/issue-23740-section-columns-no-defaultWorktree:
objectstack-issue-23740(in the cloud session's container)Domain:
domain:specSeat:
domain:spec#1(seat post #6017)File surface (at
origin/main2906cd8d2or later; stop on a breach and explain it in the report):packages/spec/src/ui/view.zod.ts:FormSectionSchema.columns(:3783-:3789) drops.default(1). The key stays optional, with values 1–4, and the string spellings' transform passesundefinedthrough. The describe and the docblock state both meanings: a declared value is the author's ceiling, and an undeclared one is the renderer's choice by available width.columns: 1, the docs, the regeneratedpackages/specartifactscheck:generatednames, and one.changeset/23740-*.mdwith a BREAKING line.FormViewSchema.columns.Container & model:
M,mode:cloud(the maintainer's word in this session's chat: 「batch 调到 5, 可以开云卡」),model: default tier(dispatch-gates --tier --repo objectstack-ai/objectstack: no path-derived mandate; the contract review owed before the queue is atCONTRACT_REVIEW_TIERby face,packages/spec/src/**)Clause-②: no
Responsibility: n/a — not a defect card (a maintainer ruling's spec half)
Thread-read: none
Ruling-ref: console record form: a create/edit dialog with no authored layout opens at 95vw with one column of unequal field widths — a bounded dialog with a two-column field grid and one width per field kind objectui#12521 comment
6204264665(the maintainer's words, recorded there verbatim: 「不用决策卡,我同意 b) 改协议(推荐): 去掉分节 columns 的 default(1)」).Serial constraints cleared: the file lists of all open PRs and the claims of all open
pm:dispatchedcards were read in this act; none namesview.zod.ts. spec(record-surface): a field-heavy create/edit flow on desktop derives a bounded modal, not full-screen; mobile keeps full (objectui#12521 letter B) #23734 (this seat, PR feat(spec)!: a field-heavy task flow on desktop derives a bounded modal; mobile keeps full-screen #23747) editsrecord-surface.tsfor the same objectui card. The two are disjoint, and are meant to ride one spec release.objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 23740, "status": "done", "branch": "claude/issue-23740-section-columns-no-default", "pr": "https://github.com/objectstack-ai/objectstack/pull/23771", "session": "session_012vwv8sA1ZBBjmphdHWo9i5", "premise_still_valid": true, "summary": "FormSectionSchema.columns (packages/spec/src/ui/view.zod.ts) drops .default(1). It is now .optional() with the string transform guarded (parseInt(val, 10), undefined passes through; measured on zod 4.6.5: an absent key leaves NO columns key after parse). A new docblock and describe state the two meanings: declared = the author's ceiling, collapsed on narrow containers; undeclared = the renderer's choice by available width. No pixel or breakpoint value is added. The spec build's default ratchet refused the change until a DEFAULT_CHANGES_BY_MAJOR 18 row declared ui/FormSection:columns 1 -> (none) (packages/spec/scripts/lib/default-changes.ts), so that file joins the surface. Generated authorable-defaults/ui.json and references/ui/view.mdx were regenerated, layout-dsl.mdx gets one paragraph, four test pins flip to 'key absent' (none deleted), and a minor BREAKING changeset carries not-required (no-migration-prescription), which the gate accepts.", "tests": "at head 741552c0: pnpm --filter @objectstack/spec test -> 678 files passed, 1 skipped; 20755 tests passed (VERDICT command-exit 0). pnpm --filter @objectstack/spec typecheck -> exit 0. The metadata-protocol closure was built; vitest src/protocol.graft-folded-form-sections.test.ts -> 46/46; metadata-protocol typecheck -> exit 0. Ablation, once: scripts/ablation-replace.mjs put .default(1) back (anchor 1->0, blob 3dba72ea->f04fd827) -> view.test.ts 1 failed ('FormSectionSchema > should accept minimal form section'); restored, blob == HEAD 3dba72ea, git diff HEAD empty. test:repo was not run locally (the diff touches no repo-project test); it is left to CI Test Core.", "gates": "local: dispatch-gates --commands --repo objectstack-ai/objectstack at 741552c0 -> 110 families. Each was run with its exit captured before any pipe; 109 exit 0. --ran with 'cmd :: exit N' -> 110 derived, 109 run, 1 NOT-MEASURED, 0 UNRUN. NOT MEASURED: pnpm check:dual-build-cjs-loads, exit 3 PREREQUISITE NOT MET (it needs every package's dist; a repo-wide build is left to CI). Two first exited 3 and were rerun green after their prerequisite was fixed: check-plugin-teardown-shape --self-test (the pinned fixture commit 621a4876 was fetched into the shallow clone) and spec check:skill-examples (the client-react closure was built first). check:adr-0087-registration exit 0, accepting not-required (no-migration-prescription). check:generated: all 14 up to date after --fix regenerated check:docs. CI check-runs on PR 23771: in_progress / not yet read at report time.", "mcp_calls": "2 — mcp__github__issue_read (get, get_comments) on #23740; read-only", "api_writes": "5 — 2 relay strokes, each a POST /repos/objectstack-ai/objectstack/dispatches: (1) pr_create, executed as POST /repos/objectstack-ai/objectstack/pulls + POST /repos/objectstack-ai/objectstack/issues/23771/assignees; (2) the os-dev-report comment, executed as POST /repos/objectstack-ai/objectstack/issues/23740/comments. label-write: 0 (the diff publishes @objectstack/spec, so skip-changeset does not apply)", "line_budget": 109, "files_changed": [ ".changeset/23740-form-section-columns-no-default.md", "content/docs/protocol/objectui/layout-dsl.mdx", "content/docs/references/ui/view.mdx", "packages/metadata-protocol/src/protocol.graft-folded-form-sections.test.ts", "packages/spec/authorable-defaults/ui.json", "packages/spec/scripts/lib/default-changes.ts", "packages/spec/src/ui/view-overlay-viewkind-arm.test.ts", "packages/spec/src/ui/view-union-diagnostics.test.ts", "packages/spec/src/ui/view.test.ts", "packages/spec/src/ui/view.zod.ts" ], "deviations": [ "File surface widened by one producer-side file: packages/spec/scripts/lib/default-changes.ts (an 18 row). The spec build's default ratchet hard-refuses an undeclared default change, so this is the mechanism the change requires. Its reason quotes the ruling by record id 6204264665, with no tracker number.", "Two more spec tests pinned the old parse output and flipped (view-union-diagnostics SECTION, view-overlay-viewkind-arm byte-identical control). They are inside 'the tests that assert columns: 1'; none was deleted.", "origin/main gained 3 commits (29c7157a, c6c84d31, 140238a4) after the branch point. None touches packages/spec or metadata-protocol, so main was not merged before opening (AGENTS §10 asks to pull main first; the overlap is empty).", "Not subscribed to PR activity: the os-dev contract overrides the platform's PR subscription posture." ], "open_questions": [ { "question": "ADR-0087 disposition for a dropped parse default with nothing to migrate", "options": ["A not-required (no-migration-prescription), with the default-changes 18 row as the declaration", "B a semantic migration entry that writes columns: 1 onto stored sections"], "recommendation": "A. Four axes. Business: 0 readers in objectstack src, and HotCRM declares columns on 70/70 sections. Long-term: B would re-create the very reading the ruling removed. AI-error: A keeps one strict contract with no consumer fallback. Scope: A adds no new mechanism. The gate passes A (measured)." } ], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
ACCEPT → PR #23771 comment 6205628288 ·
domain:specseat 1 · sessionsession_01HjR8RUwTPQ3TgbfKihmxp9· 2026-10-16T01:02Z · the contract review (CONTRACT_REVIEW_TIER) and an all-green head stand before the queue. File surface amended for claim6204858565:packages/spec/scripts/lib/default-changes.ts(the default ratchet's 18 row, which the spec build requires), plusview-union-diagnostics/view-overlay-viewkind-arm/ metadata-protocolgraft-folded-form-sectionspins andlayout-dsl.mdx.objectstack-fleet commentedon Oct 16, 2026
Landed · PR #23771 →
0a168a33ea·domain:specseat 1 ·os-elon-musk· sessionsession_01HjR8RUwTPQ3TgbfKihmxp9· 2026-10-16T02:13Z0a168a33eaorigin/maingit merge-base --is-ancestor 0a168a33ea origin/main→ exit 00a168a33eaequal the reviewed head741552c04b's (ACCEPT6205628288, contract review PASS6205703288)gh-readonly-queue/main/pr-23771-*ref remainsFixes #23740; this card closedcompletedState:
pm:dispatchedis removed in this act;domain:specandpriority:p1stay. The cloud dev session is archived in this act.FormSectionSchema.columnsnow ships withoutdefault(1)from the next spec release, alongside #23734 (941c78ae2e). objectstack-ai/objectui#12521 is already closed, so neither card leaves a reader waiting on a pin.Generated by Claude Code