Repository navigation
Closed
Labels
area:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchdomain:specDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestNew feature or requestpriority:p2Medium: important, M3Medium: important, M3
Description
Filing gate ③ (maintainer-directed). Ruling 6464210455 on #27032 (batch #421 item 3, letter A′, maintainer 「其他同意」 2026-10-28): ADR-0050 Accepted, the cutover lands now as a (narrowing) minor. Filed by the director seat (session_01QSeKYo7qYsX6HsAneHBMP2, ledger objectstack#12708). ⛔ Not a claim; triage sets the lane (domain:spec expected) and grade.
Ruling-ref: 6464210455
维护者速读
- 改了什么:
FormView.type只剩布局三值simple | tabbed | wizard;split、drawer、modal发布时拒收,拒收信息带迁移处方(split→ 列表的navigation.mode: 'split'+subforms;drawer/modal→ 调用方的打开方式)。section.pane随split退役。 - 为什么改: 一个字段混两维(布局 + 呈现 + 视图模式),「模态框里放 tabbed 表单」已经靠 [P1] Finish ADR-0021 analytics migration (chart view / dashboard+Studio / report) #1890 实现,三个冗余值零业务使用(本树 showcase
task2 处、hotcrmlead3 处,全是演示视图)。 - 风险与回滚: BREAKING(narrowing);本仓无 spec-major 窗口,按 AGENTS.md L1084–1090 走 minor + 迁移 + tombstone + ADR-0087 处置(先例 [Decision] A list view's
addRecorddefaults (enabled true, position bottom, mode inline) are not what the renderer does: enforce the spec, or make the spec say what renders (objectui#13099) #24692 B′)。渲染器半边是子卡,先于本卡合并会让演示视图发布失败 ⇒ 子卡Blocked-by:本卡,两者同窗落地。 - 先看:
packages/spec/src/ui/view.zod.ts:4546–4551与 L4034(pane)、L4619–4627。 - 两分钟验证: 一个
type: 'modal'的 form view 在objectstack build被拒且信息点名迁移路径。 - 需要您做的: 无(spec PR 不是受管面;若 PR 顺带改
docs/adr/0050-*状态行则需您批)。
Measured (on origin/main e6e41998, 2026-10-28)
- Enum:
view.zod.ts:4546–4551lists six values, defaultsimple. - Live usage of the three values (non-test):
examples/app-showcase/src/ui/views/task.view.ts:421(split),:431(drawer); hotcrmsrc/sales/views/lead.view.ts:747(split),:796(drawer),:839(modal) at hotcrm6c52f22(spec pin 18.2.0). No business metadata. - Renderer still executes them:
ui/packages/plugin-form/src/ObjectForm.tsxL41–42 imports, L516 / L553 branches;ModalForm.tsx:167, 950carry the [P1] Finish ADR-0021 analytics migration (chart view / dashboard+Studio / report) #1890 layout forwarding (kept).
Task
-
FormViewSchema.type→z.enum(['simple','tabbed','wizard']);split/drawer/modalrefused withretiredKey()-style tombstones carrying the FROM → TO mapping above;section.paneretired withsplit(tombstone). - The
spec-property-retirementkit: ADR-0087 disposition in the changeset, liveness ledger, generated baselines / forms / docs, pin tests; stored-metadata survey of the three values (expected: the five demo views only). - Re-spell
examples/app-showcasetask.view.tsL421 / L431 to layouts (tabbed/simple) and demo the open modes via the list'snavigation.mode. - ADR-0050 status line → "Accepted — cutover card #N (this card)": rides the docs(adr): the 19 stale Proposed records (status date before 2026-07-26) are ruled by the maintainer in four batches of five — carrier for the rulings and the status-line PRs #26553 closeout docs PR (Tier H), or its own XS PR; ⛔ not mixed into this spec PR.
- hotcrm
lead.view.tsL747 / L796 / L839: owed to the hotcrm seat (unreachable from the filing session); named in the PR body asSkills-docs: follow-up owed — hotcrm src/sales/views/lead.view.ts.
Clause-②: no (narrowing) · Metadata-protocol: narrowed · Skills-docs: line owed in the PR body.
Child: the renderer half (domain:ui) is its own card, Blocked-by: this one. Dedupe: #27032 (ruled, closed), #24692 (closed, B′), #1890 (closed, the unlock), objectui#1763 (key drift, out of scope); no open card narrows FormView.type.
Metadata
Metadata
Assignees
Labels
area:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchdomain:specDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestNew feature or requestpriority:p2Medium: important, M3Medium: important, M3
Activity
objectstack-fleet commentedon Oct 28, 2026
Claim: PM loop round 3 · 2026-10-28T09:19Z
Session:
session_01WGufzgbJhFoXYsLSe5WSPPAccount:
os-support-aiBranch:
claude/project-thread-9k357q(card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead ofclaude/issue-27155-<slug>)Worktree:
objectstack-issue-27155Domain:
domain:specSeat:
domain:spec#3Ruling-ref: 6464210455 (on #27032, letter A′:
FormView.typenarrows tosimple | tabbed | wizard;split/drawer/modalrefused with tombstones;section.paneretires withsplit)File surface:
packages/spec/src/ui/view.zod.ts(FormViewSchema.type,section.pane, and the split / drawer parameter keyssplitDirection,splitSize,splitResizable,drawerSide,drawerWidthwhere no live reader reads them on a surviving type), their tests, the ADR-0087 disposition, the liveness ledger, regenerated baselines / forms / docs / ui manifest,examples/app-showcase/src/ui/views/task.view.ts, one changeset per touched published package. ⛔ Notui/packages/**renderer branches, notcomponent.zod.tsobject-formformType(both thedomain:uichild's), notdocs/adr/**`` (stop on breach; explain in the report) Container & model:M,mode:thread,model: TIER_DEFAULT — --tier: no path-derived mandate (narrowing; one CONTRACT_REVIEW_TIER review owed, run by the seat; full dogfood owed),effort: highClause-②: no (narrowing) Metadata-protocol: narrowed Responsibility: the spec lane ownsFormViewSchema; the renderer half is thedomain:uichild card,Blocked-by:this one Thread-read: 6464210455 Premise: holds onorigin/main6866e2e:view.zod.ts:4546-4551lists sixtypevalues;split/drawer/modalappear only in demo views (showcasetask.view.ts, hotcrmlead.view.ts) Serial constraints cleared:no open PR on FormViewSchema (open PRs searched 09:13Z)Seat rulings on the dev's three measured questions: (1)navigation.mode: 'split'was retired by objectstack-ai/objectstack#26804 (17b5152d), so the tombstones prescribe live values only:split→tabbed/simple, master-detail throughsubforms, the side-by-side pane being the reader's own preference;drawer/modal→ the caller's open mode. The PR body names this as the ruling's intent applied to the current tree, citing objectstack-ai/objectstack#26804. (2) Yes: tombstone the split / drawer parameter keys withpane, each only after measuring that no live reader reads it on a surviving type (modalSizestays; it is read on any type).drawerSide/drawerWidthare also on objectstack-ai/objectstack#27153, so the PR body names that it lands that card's drawer half, whilebuttons.resetstays there. (3)object-formformTypestays out and goes to thedomain:ui` child, which the seat files.objectstack-fleet commentedon Oct 28, 2026
Claim amendment: seat ruling (2) narrowed after measurement ·
domain:specseat 3 · sessionsession_01WGufzgbJhFoXYsLSe5WSPP· 2026-10-28T09:22Z · same claim (6465227713), same branchclaude/project-thread-9k357q.Measured by the dev at start (main
6866e2e7). On form views, every read of the five split / drawer parameter keys sits under a retiredtype. ButFormViewSchemais also the schema source of the ReactObjectFormblock contract (packages/spec/src/ui/react-blocks.tsdataProps). That block readssplitDirection,drawerSideanddrawerWidth, and itsformType: 'drawer' | 'split'survives here, becauseDrawerFormstays a caller container per the ruling. Tombstoning those three would also regenerateskills/objectstack-ui/references/react-blocks.mdand make the PR governed (Tier H).Ruling (2), as applied: a key that a live reader reads on a surviving surface stays.
section.pane,splitSize,splitResizable.splitDirection,drawerSide,drawerWidth. They pass to the renderer card ui(plugin-form):ObjectFormdrops thesplit/drawer/modalbranches andSplitFormretires; showcasetaskviews re-spelled (ADR-0050 cutover, renderer half of #27155) #27159, which owns the block contract (scope note 6465248799, edited). The PR carriesRefs objectstack-ai/objectstack#27153, notPart of: the drawer half of spec(ui): FormViewSchema declares drawerSide / drawerWidth and buttons.reset, but no console entry point renders a drawer form or a reset button; implement or retire them (ADR-0049) #27153 stays open (seat note 6465263085, edited).File surface, replacing the claim's:
packages/spec/src/ui/view.zod.ts(FormViewSchema.type,section.pane,splitSize,splitResizable) and its tests, the ADR-0087 disposition, the liveness ledger, regenerated baselines / forms / docs / ui manifest,examples/app-showcase/src/ui/views/task.view.ts, one changeset per touched published package.react-blocks.tsor theObjectFormblock keys.component.zod.tsobject-formformType.ui/packages/**renderer branches.docs/adr/**orskills/**.Stop on breach and explain.
objectstack-fleet commentedon Oct 28, 2026
Claim amendment 2: the Studio form-type choosers and the ui pins that assert the retired values ·
domain:specseat 3 · sessionsession_01WGufzgbJhFoXYsLSe5WSPP· 2026-10-28T09:54Z · same claim (6465227713), same branchclaude/project-thread-9k357q.Measured by the dev (static reading, to be confirmed with a ui run). The narrowing reaches
ui/**outside the renderer branches in two ways.ui/packages/app-shell/src/views/metadata-admin/anchors.ts~:289,default-schemas.ts~:223). It writesconfig.typefrom that choice, so after this PR asplit/drawer/modalpick produces a body the server refuses. That is a defect this PR would create.app-shellview-create-body.test.ts(~:97,:145) and:478, ~:484) assert that the spec accepts them, and possibly two more test files that authorplugin-form__tests__/formSectionGroupReference-7051.test.tsx(pane.Ruling: A, widen. A defect this PR creates is fixed in this PR, the precedent being #26804, which fixed its own Studio inspector. The file surface gains:
simple | tabbed | wizard;@object-ui/app-shellchangeset line, plus@object-ui/plugin-formif one of its tests moves only.The fences stand: ⛔
ObjectForm.tsx,ModalForm.tsx,SplitForm,react-blocks.ts,component.zod.ts,docs/adr/**andskills/**remain #27159's or out of scope. Stop on breach and explain.objectstack-fleet commentedon Oct 28, 2026
Claim amendment 3 ·
domain:specseat 3 · sessionsession_01WGufzgbJhFoXYsLSe5WSPP· 2026-10-28T10:13Z · same claim (6465227713), same branchclaude/project-thread-9k357q.The full build found one more Studio site that the narrowing makes false. It is the same class as amendment 2.
ui/packages/app-shell/src/views/metadata-admin/package-schema.ts(~:118),getPackageForm(), is spec-typed and returnstype: 'modal', which now fails TS2322.Ruling: it is in this PR's surface, respelled
type: 'simple'. Its only reader,SectionedSchemaForm, branches onformType === 'tabbed'alone, so the render is unchanged.PackageFormDialogstays the dialog container. Any furtherapp-shellsite the build or type-check finds of the same class (a spec-typed literal of a retired value) is in the surface too, and is named in the PR body. The fences from amendment 2 stand.objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{ "issue": 27155, "status": "done", "branch": "claude/project-thread-9k357q", "pr": "https://github.com/objectstack-ai/objectstack/pull/27229", "session": "session_01WGufziVeBj5ENSWqsDTaYe", "premise_still_valid": true, "summary": "FormViewSchema.type is simple|tabbed|wizard (default simple). split/drawer/modal are refused by name through enumWithRetiredValues, with prescriptions naming live replacements only (per objectstack-ai/objectstack#26804). sections[].pane, splitSize and splitResizable are retiredKey tombstones; splitDirection, drawerSide, drawerWidth and modalSize are kept for objectstack-ai/objectstack#27159. ADR-0087 kit: D2 form-view-presentation-types-removed (order 78, retiredAfter 18.2.0), D3 ui-form-view-type-layout-only, 3 RETIRED_KEYS rows, liveness rows, a JOIN row, and the pin form-view-type-layout-retirement.test.ts with a tree-scoped absence walk. Showcase respelled to tabbed/simple, with navigation.mode drawer on the list. Studio app-shell ripple fixed under claim amendments 2 and 3: the view-create and default-schemas enums, package-schema.ts modal->simple (TS2322), and 4 ui test pins re-pinned to the refusal.", "tests": "spec local 740 files, 22234 passed and 1 failed; the failure (view-metadata-schema splitSize vocabulary) was fixed and re-run 50/50. spec test:repo 82 files, 1355 passed. New pin 31/31; the absence walk named an injected pre-change task.view.ts. lint 2 files, 252 passed. showcase test 41 files, 505 passed. ui spec-reading sweep 370 passed, 1 skipped (7978 tests), VERDICT command-exit 0. ui scripts 175 files, 5019 passed. showcase build exit 0; with formViews.quick type 'modal' exit 2, invalid_value at formViews.quick.type with the prescription and the os migrate meta --from 17 sentence. Type-checks exit 0: spec typecheck (tests layer included), ui types, plugin-form, app-shell (tsconfig.test.json), console, showcase. Full pnpm build VERDICT command-exit 0, 116/116.", "gates": "dispatch-gates --commands derived 112 on cd275780d; all 112 :: exit 0. --ran: 112 derived, 112 run, 0 NOT-MEASURED, 0 UNRUN (exit 0). Re-run on edd4570f5 (one ui test file, 2 lines): check:type-check-debt, check:type-check-coverage, check:nul-bytes, check:test-source-alias, check:undeclared-dep-imports, check-comment-mask-adoption, check:issue-citations, plugin-form type-check, all exit 0. check-changeset-no-major with the PR event: exit 0. CI check-runs: pending at open.", "dogfood_battery": "cd275780d · VERDICT command-exit 0 · Test Files 348 passed and 3 skipped of 351 · Tests 2804 passed and 20 skipped of 2824 · no failures", "mcp_calls": "1 — subscribe_pr_activity (claude-code-remote; not a GitHub write tool). 0 GitHub MCP calls.", "api_writes": "3 relay strokes: pr_create (#27229), pr_request_reviewers (#27229, os-support-ai), comment (this report on objectstack-ai/objectstack#27155); plus git push x2", "open_questions": [], "out_of_scope_findings": [ "carrier: objectstack-ai/objectstack#27159 · ui object-form formType vocabularies still list split/drawer/modal (plugin-form index.tsx:295, types objectql.zod.ts:1017, console FormPage.tsx:259 FORM_SPEC_TYPES) and sdui.manifest object-form inputs carry splitSize/splitResizable · noted, not filed", "carrier: hotcrm seat · src/sales/views/lead.view.ts 3 form views (card reading L747/796/839 at 6c52f22) need the respell; not re-measured here (repo out of session scope) · noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
ACCEPT → PR #27229 comment 6468327301
objectstack-fleet commentedon Oct 28, 2026
Landed ·
domain:specseat 3 ·os-support-ai· 2026-10-28T12:17Z14e9685fc9origin/maingit merge-base --is-ancestor)Delivered (ruling A′, 6464210455; the spec half of the ADR-0050 cutover):
FormViewSchema.typeis layout only:simple(default),tabbed,wizard.split,drawerandmodalare refused at every door with a prescription that names live values only.section.pane,splitSizeandsplitResizableretire withsplit.splitDirection,drawerSideanddrawerWidthstay, because the ReactObjectFormblock still reads them.form-view-presentation-types-removed). Studio offers only the three layouts, and the package form'smodalis nowsimple.Owed elsewhere: #27159 (renderer half, now unblocked), #27153 (
drawerSide/drawerWidth/buttons.reset), objectstack-ai/hotcrm#2397 (hotcrmlead.view.ts).pm:dispatchedis removed here.chore(changeset): answer ADR-0087 with the existing entries; leave the …