Skip to content

[Decision] A list view's addRecord defaults (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

Closed

Description

@objectstack-fleet

Ruled: 6281834942 · letter B′ · 2026-10-20T02:21Z — B with enabled required and the create form chosen by convention (formViews.create); mode / formView retire; state pm:queue · domain:spec · priority:p3 (director seat, summon #45, batch #374 item 1). Diagram: https://claude.ai/artifact/Ummx2sxuuzusTCr6yzFviR

Filing gate ②: a maintainer's decision. The direction is ADR-0049 enforce-or-remove, and retiring a published key goes to the decision box (triage-duties.md:40). The card was filed on objectstack-ai/objectui#13099's request ("Route this as … a decision card"), whose source is the objectui#13089 contract review (PR objectstack-ai/objectui#13098). Filed by the triage seat (seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U. ⛔ Not a claim.

Reader who acts: the maintainer answers A / B / C. Then the domain:spec seat lands the spec half here, and objectui's domain:ui seat takes the renderer half on objectstack-ai/objectui#13099.

Dedupe: MCP search_issues, objectstack, closed included.

Measured

Declared (packages/spec/src/ui/view.zod.ts:1782–1790 on origin/main 486745ec75, a strictObject):

  • enabled .default(true);
  • position ['top','bottom','both'], .default('bottom');
  • mode ['inline','form','modal'], .default('inline');
  • formView, optional, "Named form view to use when mode is form or modal".

Studio offers the whole object to authors: view.form.ts:178 lists { field: 'addRecord', type: 'composite' }.

Rendered (objectui origin/main 633ef99a3f, packages/plugin-list/src/ListView.tsx):

  • :1688 draws Add only on schema.addRecord?.enabled === true;
  • :717 resolveAddRecordPlacement maps an absent position to top;
  • nothing in plugin-list reads mode or formView. Every Add opens the create form.

Stored. The write doors keep the body as written. addRecord: {} is stored as {}, and the nested defaults are never materialised (the contract review on objectstack-ai/objectui#13098).

Who authors addRecord today (git grep 'addRecord\s*:', tests and changelogs excluded):

where rows written
objectstack examples/app-showcase 2 active-projects.page.ts:36 { enabled: true, position: 'top', mode: 'form', formView: 'default' }; contact.view.ts:60 { enabled: true, mode: 'form', formView: 'create' }
objectstack packages/lint 1 a fixture mirroring contact.view.ts
hotcrm origin/main 0 —
cloud origin/main 0 —

Nobody writes {}, nobody relies on bottom, and nobody writes inline.

维护者速读

一句话问题: 列表上的「新建」按钮,spec 写的默认是「显示、放在底部、行内新增」,实际渲染是「不写就不显示、放在顶部、总是打开新建表单」,mode 和 formView 两个键没有任何渲染器在读。要定的是以哪边为准。

选项 做法 客户能感知的后果 工作量
A 执行 spec 渲染器按 spec 默认画:addRecord: {} 就显示按钮,不写位置放底部;mode: 'inline' 要新做「行内新增」 showcase 联系人视图的按钮从顶部挪到底部;行内新增是一个全新功能 objectui 1 个 PR(M),外加行内新增(L);无先例
B 让 spec 说实话(推荐) spec 改成渲染器的实际行为:enabled 不写就不显示,position 默认顶部;没人读的 mode、formView 退役,加载时按 ADR-0087 转换丢弃并给出提示 现有页面零变化(showcase 两行写的 mode: 'form' 本来就是现在的行为);Studio 里不再出现填了也没用的「行内 / 弹窗 / 表单视图」选项 domain:spec 1 个 PR(S–M:默认值、一条转换、重新生成);objectui 只改对照行。先例:ADR-0049 退役惯例
C 一半执行 同 B 改默认值,但 objectui 真正实现 mode: 'form' / 'modal' 和 formView(按指定表单视图新建) 作者可以让某个列表用弹窗或指定的表单新建 spec S + objectui M

业务含义直译: A = 按说明书把按钮挪到楼下,还要新修一部电梯;B = 把说明书改成楼里现在的样子;C = 改说明书,同时兑现「可选弹窗 / 指定表单」这一条。

四轴(业务立场):

  • 项目长远合理性: 两年后应该是「列表声明什么就兑现什么」。B 和 C 都满足,A 也满足,但要为没人要的「行内新增」造新功能。主流平台(Salesforce 列表视图)的「新建」按钮在顶部,打开对象的新建表单。B 正是这个模型;C 多出「每个列表指定新建表单」,有价值,但今天没有需求。
  • 实际业务拉动: 只有 showcase 的 2 行在写这个键,hotcrm 和 cloud 都是 0。没人写 {},没人依赖「底部」,也没人写「行内」。
  • 防 AI 犯错: 今天 AI 照 spec 写 addRecord: {},以为会显示按钮,结果什么都没有,也不报错;写 mode: 'modal' 以为是弹窗,结果打开表单页,同样没有提示。B 把这两个陷阱都删掉,退役键被写到时加载会响亮地说出来。A 和 C 也能消除陷阱,但要多做功能。
  • 创业阶段不扩散: B 是删除,符合「删除优于声明并长期维护」;A、C 是新增。

推荐:B,时机不急(不进 18.0,这类协议收紧倾向不提前)。只看①:A、B、C 都满足「声明即兑现」,打平;②和④把它定在 B,③不翻。
回退:C,如果你希望保留「列表指定新建表单」这个能力。
置信缺口:

  • 云端客户自建应用里是否有人在 Studio 设过 mode、formView:只量了仓库源码,没量线上库。
  • B 的转换条目对已存储的 mode: 'inline' 会给出提示,具体文案由 domain:spec 车道定。

自检:只看①是平局,②④定 B;②③④是否翻转:否。

裁后执行:

os-decision-facets

  • ① 项目长远合理性:A、B、C 都兑现声明,打平;B 与主流「顶部新建、打开新建表单」一致,C 多保留一个今天无人要的能力。
  • ② 实际业务拉动:仓库内仅 showcase 2 行在写,hotcrm 与 cloud 均为 0;无人依赖 {}、底部或行内。
  • ③ 防 AI 犯错:今天 {} 与 mode: 'modal' 都静默失效;B 删除两个陷阱,退役键被写到时会响亮提示。
  • ④ 创业阶段不扩散:B 是删除;A、C 新增渲染器功能。

Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    席位意见(增量 1 · 列表「新建」入口:spec 默认值与渲染器不一致)· director seat (summon #45, session_01Lg6GQ4xjqmvEzYv78d6H7i), read as batch #374 item 1, 2026-10-20T00:05Z

    On the triage seat's decision card, filed on objectstack-ai/objectui#13099's request (B recommended by the filer with C as a fallback; under the maintainer's rule #24444 this delta names one option and no fallback). Opening marker #12708, comment 6279597228. Presented, not self-ruled: every letter moves a published, authorable key (AddRecordConfigSchema on views and pages), which is the decision box's floor (triage-duties.md L40; 代裁人工地板 「协议/公开契约变化」).

    Premises re-run in this act — objectstack origin/main 043100210467, objectui origin/main 90518cdb841a:

    1. view.zod.ts:1782–1790: enabled .default(true), position .default('bottom'), mode .default('inline'), formView optional, on a strictObject; the same schema is the page list-view node's addRecord (page.zod.ts:1060); view.form.ts:178 and page.form.ts:165 offer it to Studio. Holds.
    2. objectui ListView.tsx:1688–1689 and :717: Add draws only on enabled === true; an absent position maps to top; no reader of mode or formView anywhere under packages/** except a type-alignment test asserting the default. Holds.
    3. Producers: showcase active-projects.page.ts:36 and contact.view.ts:60 (both mode: 'form'; formView 'default' and 'create'), one lint fixture; hotcrm and cloud 0 by the card (unreachable from here). Holds.
    4. Not on the card — the create-form capability behind formView. content/docs/ui/create-vs-edit-form.mdx:88 promises 「The binding is addRecord.mode: 'form' + addRecord.formView: 'create' … No formViews.create → the create entry derives a default. Present → it wins for create.」 The showcase contact.view.ts authors a sparse formViews.create on that promise. objectui's create entry (app-shell/src/utils/recordFormNavigation.ts:218) reads objectDef.form ?? objectDef.formViews?.default and never formViews.create nor addRecord.formView. So the documented create-vs-edit model is declared in three places (spec key, docs page, showcase) and enforced nowhere: the showcase's create form is never shown. Holds — and it widens the card: B as written retires the selector and leaves the docs page and the showcase form pointing at nothing.
    5. ADR-0050 (Proposed, not accepted, so not binding) Decision 2 and its 「Non-goals」 reuse addRecord.mode as the add-record open-mode carrier; retiring mode takes a dated note there (「ADR 条目被协议取代 ⇒ 条目下加带日期注记点名 spec 符号」), Tier H. The mechanical pass named ADR-0076 D12 (advertise only what is mounted); ADR-0049 is the route. Neither picks a letter.

    Facets, this seat's reading against the card's: ① not a tie, as the card has it: in two years a list's Add is 「shown when the author says so, at the top, opening the object's create form」 — Salesforce and Airtable interfaces both put New at the top and open a form; WHICH form is a per-object convention (formViews.create when present, else the default form), not a per-list selector; HOW it opens is the list's existing navigation.mode if ever needed, not a second enum. Two keys leave, none arrives, and the documented create-vs-edit model becomes true with one selection line. ② in-repo pull: two showcase rows, both already 「form」; the one real authored intent (formView: 'create' on contact) is honoured by convention, not by the key. ③ addRecord: {} today draws nothing and says nothing; with enabled REQUIRED (no default) it is refused at authoring and publish instead of parked silently — 响亮拒绝优于静默容忍; the retired keys answer with the ADR-0087 notice. ④ a deletion of two keys plus one line of convention; A and C build renderer features nobody authored (inline add; modal and named-form plumbing).

    Recommend B′ — B, with enabled required and the create form chosen by convention. 口径: AddRecordConfigSchema keeps enabled (required, no default) and position (default top; top / bottom / both as the renderer draws them); mode and formView retire through the spec-property-retirement kit with ADR-0087 conversions that drop them with a notice; the showcase's two rows and the lint fixture lose the two keys; objectui's create entry selects formViews.create when the object declares it, else today's form / formViews.default (one line in recordFormNavigation.ts, pinned); create-vs-edit-form.mdx:88 states the convention and names no binding; ADR-0050 Decision 2 gains a dated note that the list add-record open mode is no longer declared. Not taken: A (builds inline add and moves every button to the bottom for a default nobody wrote); B as written (leaves the docs recipe and the showcase create form pointing at a retired key); C (plumbs mode and formView through the renderer for zero authored demand).

    Workload of the letter: domain:spec · 1 PR, S–M (schema, two conversions, the two form composites, regenerated artifacts, showcase and fixture edits; Clause-②: yes (narrowing), breaking, with its ADR-0087 disposition and FROM → TO) · objectui domain:ui · 1 PR, S (one selection line plus pin; objectstack-ai/objectui#13099 becomes that card) · domain:devx · 1 docs PR, S · ADR-0050 note, Tier H, S (may ride the spec PR as its governed half). Precedent: the ADR-0049 retirements of view-strictness-batch18.test.ts. Timing as the card says: not before 18.0 GA.

    After the ruling: needs-user-decision → pm:queue (domain:spec, p3); the spec seat dispatches with the kit; objectstack-ai/objectui#13099 leaves pm:blocked for the one-line selection card with the ruled convention quoted; a domain:devx docs card follows the spec landing.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #374 item 1 · letter B′ · maintainer 「同意」 2026-10-20T02:21Z

    Director seat, summon #45, session_01Lg6GQ4xjqmvEzYv78d6H7i (GitHub os-justin; written as objectstack-fleet[bot] through the relay, read back), on the triage seat's decision card filed on objectstack-ai/objectui#13099's request (B recommended by the filer; this seat's delta 6280103693 recommended B′). Opening marker #12708, comment 6279597228; ledger block B 6280112485. The maintainer's words in this session's chat, in order: 「没听懂,要不简单画个图」, answered with the three-figure diagram https://claude.ai/artifact/Ummx2sxuuzusTCr6yzFviR (today, the four letters, B′ after), then 「同意」. Thread-read: 6280103693.

    What the ruling binds (letter B′ — B, with enabled required and the create form chosen by convention):

    1. AddRecordConfigSchema (packages/spec/src/ui/view.zod.ts, the same schema on the page list-view node) keeps two keys: enabled, REQUIRED with no default, so addRecord: {} is refused at authoring and at publish instead of drawing nothing; and position, default top, values top / bottom / both as the renderer draws them.
    2. mode and formView retire through the spec-property-retirement kit: ADR-0087 conversion entries that drop the two keys from authored and stored bodies with a notice, retiredKey() tombstones on the strict object, the two form composites (view.form.ts:178, page.form.ts:165), regenerated artifacts, the liveness ledger. Clause-②: yes (narrowing), breaking, with its ADR-0087 disposition and the FROM → TO in the changeset.
    3. The producers follow in the same PR: showcase active-projects.page.ts:36, contact.view.ts:60 and the lint fixture showcase-shape.fixtures.ts:414 lose mode / formView; content/docs/ui/create-vs-edit-form.mdx:88 states the convention of item 4 and names no binding — the docs line is part of the retirement kit's surface and is declared in the claim as a cross-domain file.
    4. objectui: the create entry selects formViews.create when the object declares it, else today's form / formViews.default (app-shell/src/utils/recordFormNavigation.ts:218, one selection line, pinned by a test). list-view addRecord: the spec's declared defaults (enabled true, position bottom, mode inline) are not applied by the renderer (enforce or remove) objectui#13099 is that card; its parity row (p1-spec-alignment.test.ts:189, the mode default) changes when objectui's pin takes the spec release.
    5. ADR-0050 (Proposed) Decision 2 gains a dated note that the list add-record open mode is no longer declared on addRecord; how the create form opens stays the renderer's, and a per-list open mode, if ever wanted, is the list's existing navigation.mode, never a second enum. Tier H; it may ride the spec PR (the PR is then Tier H whole) or go as its own one-line PR — the spec seat chooses.
    6. Timing as the card says: not before 18.0 GA.
      Not taken: A (inline add and a bottom button for a default nobody wrote), B as written (the docs recipe and the showcase create form left pointing at a retired key), C (mode / formView plumbed through the renderer for zero authored demand).

    Workload of the letter: domain:spec · 1 PR, S–M (precedent: the ADR-0049 retirements of view-strictness-batch18.test.ts) · objectui domain:ui · 1 PR, S (objectstack-ai/objectui#13099) · ADR-0050 note, S.

    Execution: needs-user-decision → pm:queue in this act (domain:spec, priority:p3); the spec seat dispatches with the kit and quotes items 1–5 in the PR body; objectstack-ai/objectui#13099 moves pm:blocked → pm:queue in this act with the ruled convention quoted — the selection line does not wait on the spec PR.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat hold · domain:spec seat 2 (#18549) · session session_019oFY6Hi35J7atvgVFnmoaK · 2026-10-20T02:40Z · pm:queue → pm:on-hold, in this act.

    The director seat's ruling 6281834942 (letter B′, the maintainer's 「同意」) puts this card in pm:queue, and its item 6 binds the timing: "not before 18.0 GA". main exited Changesets pre mode at c46b5f14cf, so anything that lands now ships in 18.0.0. A pm:queue card is dispatchable by definition, so this card can only wait honestly as pm:on-hold. This act makes that transition, which the ruling already decided. Grade, lane, area:* and the ruling are unchanged.

    Restart-when: git ls-remote --tags origin 'refs/tags/@objectstack/spec@18.0.0' answers one ref (the 18.0.0 GA is tagged). At this act it answers none; the newest spec tag is 18.0.0-next.5.

    On restart, the dispatch shape is the ruling's items 1–5, quoted in the PR body:

    • AddRecordConfigSchema.enabled becomes REQUIRED with no default, and position defaults to top;
    • mode and formView retire through the spec-property-retirement kit (ADR-0087 drop conversions, retiredKey() tombstones, the two form composites, regenerated artefacts, the liveness ledger), Clause-②: yes (narrowing), breaking;
    • the producers follow in the same PR: showcase active-projects.page.ts:36 and contact.view.ts:60, the lint fixture showcase-shape.fixtures.ts:414, and content/docs/ui/create-vs-edit-form.mdx:88;
    • the ADR-0050 Decision 2 note is Tier H, as its own one-line PR or riding the spec PR, the spec seat's choice.

    objectstack-ai/objectui#13099 (the renderer's create-form selection) does not wait on this card, per the ruling.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Maintainer ruling 「甲」 recorded (#6015 6292005854): a narrowing that an ADR-0087 conversion carries ships in 18.x. Triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-20T13:30Z

    • The restart condition holds: refs/tags/@objectstack/spec@18.0.0^{} answers 06cab4849a8a.
    • State: pm:on-hold → pm:queue. The dispatch shape is this card's items 1–5, unchanged.
    • Under 甲, triage's derivation (the spec seat confirms it at dispatch):
      • mode / formView: they retire through the spec-property-retirement kit with ADR-0087 drop conversions. A conversion carries them, so they go into 18.x.
      • enabled REQUIRED with no default: the PR either carries a conversion that writes the old default (true) onto an authored addRecord that omits it, or that half ships as a warning in 18.x and its refusal is filed for 19.0.

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 19
    Session: session_01D6F9axfoPzR7t8G1J7Ytzz
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-24692-addrecord-retire-mode-formview
    Worktree: objectstack-issue-24692
    Domain: domain:spec
    Seat: domain:spec#3 (seat post #18883)
    File surface (at origin/main 71696121a6 or later; stop on a breach and explain it in the report):

    • packages/spec/src/ui/view.zod.ts (AddRecordConfigSchema), and its use on the page list-view node (page.zod.ts);
    • view.form.ts and page.form.ts;
    • the ADR-0087 conversion entries, retiredKey() tombstones, regenerated artifacts and liveness ledger that the spec-property-retirement kit requires;
    • the producers: showcase active-projects.page.ts and contact.view.ts, and the lint fixture showcase-shape.fixtures.ts;
    • content/docs/ui/create-vs-edit-form.mdx (the kit's docs surface, a cross-domain file);
    • .changeset/24692-*.md.

    The ADR-0050 Decision 2 note is Tier H and goes in its own one-line PR, so this spec PR stays ungoverned.
    Container & model: M, mode:subagent, model: default (no path-derived mandate)
    Clause-②: yes (narrowing: mode / formView retire through ADR-0087 drop conversions; enabled becomes required)
    Responsibility: n/a — ruled letter B′ (6281834942)
    Thread-read: 6292027850
    Serial constraints cleared: ruling item 6's "not before 18.0 GA" holds, since @objectstack/spec@18.0.0 has shipped. The dev re-checks open PRs touching these files before opening its own.

    Under 「甲」 (triage 6292027850):

    • mode / formView ship in 18.x with their drop conversions.
    • enabled REQUIRED ships in 18.x only with a conversion that writes true onto an authored addRecord that omits it. Otherwise that half is a warning in 18.x, and its refusal is filed for 19.0. The dev decides from the measurement and says which.

    Read on origin/main 71696121a6 at 2026-10-20T16:57Z: AddRecordConfigSchema defaults enabled true, position 'bottom' and mode 'inline', and has an optional formView.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 24692,
      "status": "done",
      "branch": "claude/issue-24692-addrecord-retire-mode-formview",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24970",
      "session": "session_01D6F9axfoPzR7t8G1J7Ytzz",
      "premise_still_valid": true,
      "summary": "Ruling B′ items 1-3 implemented on AddRecordConfigSchema, the one def behind ListView, ObjectListView, InterfacePageConfig and the page list-view node props. `enabled` is required with no default and is refused with a prescription when omitted; `position` defaults to `top`, verified against objectui ListView#resolveAddRecordPlacement at origin/main and pin 616df6598b; `mode`/`formView` are retiredKey() tombstones. The full kit landed: two retired-from-load-path D2 conversions (`add-record-mode-form-view-removed` strips both keys; `add-record-enabled-defaulted` writes `enabled: true` onto a block that omits it) reaching views, objects[].listViews, pages[].interfaceConfig and page list-view nodes, plus 2 RETIRED_KEYS_BY_MAJOR[18] entries, 2 D3 entries with step-18 rationale fragments, DEFAULT_CHANGES_BY_MAJOR[18] rows, both form composites spelled to enabled/position (labels translated), the liveness note, regenerated artifacts, the producers and the docs. Under 甲 the `enabled` half ships WITH the conversion, not as a warning: the measured population omitting `enabled` is zero (this repo at 71696121a6, objectui Studio at the pin; production DBs not measured), and the conversion writes the 18.0 parse's own default. Its one pixel consequence (a stored block that omitted `enabled` now draws its button) is stated in the changeset and the D3 entry, so no 19.0 refusal card is owed. ADR-0050 Decision 2 note NOT edited (Tier H). Exact one-line text for the separate PR: `**Note (2026-10-20, ruling record 6281834942):** the list add-record open mode is no longer declared on `addRecord` — `addRecord.mode` and `addRecord.formView` were retired (ADR-0049 enforce-or-remove); the create form is chosen by convention (`formViews.create` when declared, else `form` / `formViews.default`), how it opens stays the renderer's, and a per-list open mode, if ever wanted, is the list's existing `navigation.mode`, never a second enum.` Surfaces beyond the claim's file list, all required by the kit and declared here: packages/spec/scripts/lib/default-changes.ts (build gate), packages/spec/vitest.repo-tests.json, the two migrations/entries pairs, registry.ts.template, retired-key-removal-version.pin.test.ts, view.test.ts/page.test.ts, the new add-record-config-retirement.test.ts, the liveness README, content/docs/ui/views.mdx (taught `addRecord.formView`), packages/lint rule-explanations.ts + validate-list-view-field-refs.ts (a lint explanation naming the retired key; lintViewRefs never read it), platform-objects metadata-forms i18n bundles, and the regenerated content/docs/references pages.",
      "tests": "Final head a05f141642 (after merging origin/main), one && chain under os-verify-lock, VERDICT command-exit 0: `pnpm --filter @objectstack/spec test` → Test Files 703 passed (703), Tests 21369 passed | 1 todo; `spec test:repo` → 72 passed (72), 1236 passed; `spec typecheck` 0; `pnpm --filter @objectstack/lint build` + `typecheck` 0; `lint test` → 151 passed (151), 7013 passed. `spec build` + `check:generated` → `✓ All 14 generated artifacts are up to date`. Showcase: `objectstack validate` printed `✓ Validation passed`, `tsc --noEmit` 0. dispatch-gates derived 120 families; all re-run on a05f141642 with every exit 0, and `--ran` printed `120 run, 0 NOT-MEASURED`. Among them: check-adr-0087-registration `registered … (new here: 4 ids)`, spec check:api-surface/authorable-surface/liveness/skill-examples/spec-changes/upgrade-guide/variant-docs, check:engine-double-contract, check:test-source-alias, check:dual-build-cjs-loads. Also check:i18n in sync, check:i18n-coverage `none new`, check:cross-package-test-inputs, check:nul-bytes, check:doc-authoring, check:pm-skill-id-lint: all 0. Ablation, no build needed (the pin reads source files): `node scripts/ablation-replace.mjs` reinserted `formView: 'create'` into examples/app-showcase/src/ui/views/contact.view.ts (`ok mutation landed: anchor 1 -> 0, blob ac99eeccd1a3 -> 1488abb7be06`). The tree-scoped absence pin went red (`1 failed | 34 passed`, offender contact.view.ts). Restore: `ok restored: blob == HEAD (ac99eeccd1a3) and git diff HEAD is empty`, and the hash check printed RESTORED_HASH_OK. A trap with an absolute path was armed. NOT MEASURED: repo-wide `pnpm lint` (CI-owned; no narrowed proof attempted); packages/qa/dogfood expression-conformance (addRecord carries no expression surface, not run); packages/cli integration tier (declared to CI).",
      "mcp_calls": "0",
      "api_writes": "2 — fleet-write relay: pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST /issues/24970/assignees), and this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/24692/comments); git push not counted; zero label writes (dispatch named no labels, and a changeset is present so skip-changeset does not apply)",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · examples/app-showcase/src/ui/pages/active-projects.page.ts sets userActions.addRecordForm: false beside addRecord { enabled: true }; objectui ListView (showAddRecord memo: `addRecord?.enabled === true && ua?.addRecordForm !== false`) then withholds the Add button, so the page's comment ('a toolbar add entry point') likely describes a button that is not drawn. Read from the code only and not reproduced in a browser, so noted in PR Acceptance notes and not filed · dedupe words: active-projects addRecordForm false Add button hidden showcase",
        "carrier: objectui pin bump that takes this spec release · objectui packages/types/src/__tests__/p1-spec-alignment.test.ts:189 expects parsed addRecord.mode 'inline' and goes red once objectui consumes this spec; ruling item 4 already names this row as changing then, so it is noted here and not filed · dedupe words: p1-spec-alignment addRecord mode inline parity row"
      ]
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 24692,
      "status": "done",
      "branch": "claude/issue-24692-adr-0050-addrecord-note",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24975",
      "session": "session_01D6F9axfoPzR7t8G1J7Ytzz",
      "premise_still_valid": true,
      "summary": "ADR-0050 half of letter B' (ruling 6281834942 item 5, seat-2 hold 6282077441). docs/adr/0050-form-layout-vs-presentation.md gains a dated note (the dispatched text, verbatim, linked to the ruling record) inside Decision 2's list item. The Status line gains an Amended segment that points to the note, in the same form as ADR-0069/0088/0043. The status stays Proposed, and the original decision, Context and Non-goals text is untouched. Draft PR #24975 (Refs #24692, no closing keyword) says it is Tier H on docs/adr/** and needs an authorized approval, says it should land after PR #24970, and carries a Chinese governed-brief section with the seat-opinion field left blank. The claim on the card (6296388083) names the spec branch, not this one: this ADR branch was dispatched separately by the PM, as that claim foresaw ('goes in its own one-line PR').",
      "tests": "All 20 dispatch-gates-derived families at fb75b6ae54 exited 0. dispatch-gates --ran: '20 derived famil(ies) accounted for, 20 run, 0 NOT-MEASURED (a DERIVED zero, all 20 recorded an exit code and none of them is 3)'. check:doc-authoring '✓ doc authoring guard: 424 files clean' (+3 more ✓ lines); check:nul-bytes 'OK (scanned 11520 text file(s) ... no raw ASCII control bytes)'; check-adr-links '770 relative link destination(s) under docs/adr/ resolve'; check-adr-symbol-anchors '2369 anchors across 142 records resolve'; check:adr-anchors, check:pm-governed-merges, check:pm-prior-rulings and the rest all exit 0. check:doc-formula-expressions first exited 3 (PREREQUISITE NOT MET: formula/lint unbuilt, nothing measured). Rebuilt under the verify lock (VERDICT command-exit 0, 4/4 turbo tasks), it then exited 0. Self-scan for control bytes: none. A marked render shows the note nested in item 2 with items 3-4 still numbered. The first commit lacked the blank line after the blockquote, and item 3 would have become a lazy continuation; this was fixed in fb75b6ae54 and the gates were re-run on that head. No ablation applies (docs-only).",
      "mcp_calls": "0",
      "api_writes": "3 relay (fleet-write) requests in one dispatched action: POST /repos/objectstack-ai/objectstack/pulls (draft), POST /issues/24975/assignees (baozhoutao), POST /issues/24975/labels (skip-changeset); plus this os-dev-report comment POST /issues/24692/comments. Read back: body 3354 bytes sent = stored, draft true, labels [skip-changeset], assignee baozhoutao. git push x3 (not REST).",
      "open_questions": [],
      "out_of_scope_findings": ["carrier: none (承接者:无) · noted, not filed: the ADR-0050 Context bullet 'Add-record mode — list addRecord.mode: inline / form / modal + formView' and the Non-goals line naming addRecord.mode still describe the retired keys. They were left as historical text on purpose (the dispatch said not to rewrite the original text), and the Status line points readers to the Decision 2 note."]
    }

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 24692,
      "status": "done",
      "branch": "claude/issue-24692-addrecord-retire-mode-formview",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24970",
      "session": "session_01D6F9axfoPzR7t8G1J7Ytzz",
      "premise_still_valid": true,
      "summary": "CI-fix round. New head fc643e459f; the PR is still a draft. Failing test: packages/platform-objects/src/apps/translations/object-lifecycle-panel-echo-decisions.test.ts › '#19403 round 10 — the verdicts, on the live bundles' › '⭐⭐ the WHOLE metadata-form catalog now reads zero — and the two predicates are DIFFERENT QUESTIONS'. It failed with `zh-CN positive control: expected 677 to be 673`. Root cause: this PR spelled out the `addRecord` composites in view.form.ts and page.form.ts as `fields: [enabled, position]`. That added four form row labels (`addRecord.enabled`, `addRecord.position`, `interfaceConfig.addRecord.enabled`, `interfaceConfig.addRecord.position`), and I authored all four in zh-CN, ja-JP and es-ES. The test's positive control counts the genuinely translated `.label` leaves per locale, so it rose by exactly 4. The control moves on purpose: its comment logs every form-row change the same way. Fix: the pinned count is now 677, with a provenance line in the same comment. No schema, bundle or form change was needed. The worktree was re-added, origin/main was merged (merge commit, no rebase, no force), and the branch was pushed normally.",
      "tests": "Head fc643e459f, one && chain under os-verify-lock, VERDICT command-exit 0. platform-objects: before the fix it reproduced the CI red as `1 failed | 81 passed (82)`; after, `pnpm --filter @objectstack/platform-objects test` gives Test Files 82 passed (82), Tests 1232 passed, and `typecheck` passes. spec: `build` passes, `check:generated` says `✓ All 14 generated artifacts are up to date`, `test` gives 703 passed (703) and 21369 passed, `test:repo` gives 72 passed and 1236 passed. lint: `build` passes, `test` gives 152 passed (152) and 7025 passed. dispatch-gates on fc643e459f: 120 families derived and all 120 run with exit 0, and `--ran` reports `120 run, 0 NOT-MEASURED`. Five gates first answered exit 3 PREREQUISITE NOT MET because the re-added worktree was unbuilt: check:skill-examples, check:dual-build-cjs-loads, check:i18n, check:i18n-coverage and check:lean-entry-closure. I built their closures (cli, the examples, the i18n packages, client and client-react, knowledge-ragflow, organizations) and re-ran them, and all five passed: i18n `all bundles in sync`, i18n-coverage `none new`, skill-examples `262 prose examples type-check`. NOT MEASURED: the repo-wide `pnpm lint`, which belongs to CI.",
      "mcp_calls": "0",
      "api_writes": "1 this round: this os-dev-report comment, POST /repos/objectstack-ai/objectstack/issues/24692/comments through the fleet-write relay. git push is not counted. Zero label writes and no PR body edit.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed (spec half) · domain:spec seat 3 · baozhoutao · session session_01D6F9axfoPzR7t8G1J7Ytzz · 2026-10-20T23:20Z

    • PR feat(spec)!: addRecord says what renders — enabled required, position top, mode/formView retired #24970 merged as fde7456352 through the merge queue. Verified on origin/main: single parent, and the git diff C^ C patch-id equals the reviewed head fc643e459f's against its merge base (7378d5dca0).
    • Contract review: PASS at CONTRACT_REVIEW_TIER on that head (6303398861). The first head's record was FAIL on a red platform-objects control count (673 → 677), which was then fixed.
    • Ruling B′ items 1–3:
      • AddRecordConfigSchema.enabled is required, with no default.
      • position defaults to top.
      • mode / formView are retired with retiredKey() tombstones and an ADR-0087 drop conversion.
      • Under 「甲」 the enabled half ships with the add-record-enabled-defaulted conversion (writes true). The measured population omitting it is 0. The one pixel consequence is stated in the changeset and the D3 entry, so no 19.0 card is owed.
      • Producers and docs follow.
    • Landing hazard ruled out by the reviewer: objectui p1-spec-alignment.test.ts:189 is type-only against objectui's own interface, and no objectstack workflow runs objectui's vitest.
    • ADR-0050 Decision 2 note (Tier H): PR docs(adr-0050): Decision 2 notes that the add-record open mode is no longer declared on addRecord #24975. Seat check passed, and it waits for an authorized approval.

    Noted, not filed: showcase active-projects.page.ts sets userActions.addRecordForm: false beside addRecord.enabled: true, so the Add button the page comment describes is likely not drawn. This is pre-existing, read from code only, and recorded in PR #24970's acceptance notes.

    Claim 6296388083 ends here; pm:dispatched is removed in this stroke.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 21, 2026

    @objectstack-fleet
    ContributorAuthor

    ADR half landed

    PR #24975 is the ADR-0050 Decision 2 note, the Tier H half of letter B′. It was approved by os-zhuang on head fb75b6ae54 and merged as 662183604c, after PR #24970 as its body required. The merged commit's patch-id equals the approved head (6cfdc16a34). Both halves of this card are now on main.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:specpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions