Repository navigation
spec: ListView.userActions.editInline defaults to true in v18 and editInline: false is the opt-out; objectui reads an absent key as on (maintainer ruling 2026-10-10, after objectui#5144) #22605
Copy link
Copy link
Closed
Labels
area:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchdomain:specenhancementNew feature or requestNew feature or requestpriority:p1High: required for production / M2High: required for production / M2target:v18
Description
Filing gate ②: a decision only the maintainer can take, taken. Filed by the director seat (summon #35, seat post #12708, session_01VYToj6PQehTEKNrjGM9akg) on the maintainer's ruling in that session, verbatim: 「乙 v18 把 spec 默认翻成 true,editInline: false 变成关法。」 (2026-10-10). ⛔ Not a claim, ⛔ not a dispatch; triage grades and routes it (domain:spec by its landing).
The ruling, in one line
A list view is editable in place by default, under the permission gate that already exists. The author who wants a read-only list declares userActions: { editInline: false }. The declared value flips; the rule of objectui#5144 (one vocabulary, the inlineEdit fold, declared = enforced) stands.
Why (the assessment the maintainer ruled on)
ListView.userActions.editInlineis declared.default(false)("Off by default: the list is read-only unless the author opts in",packages/spec/src/ui/view.zod.ts:1535). fix(plugin-list): read userActions.editInline with the spec default, folding a stored inlineEdit into it (objectui#5144) objectui#12036 (objectui#5144, merged 2026-10-09) made the console read it that way, so a grid view that declares neitheruserActions.editInlinenorinlineEditoffers no inline-edit toggle.- Measured reach of the opt-in default: HotCRM (
objectstack-ai/hotcrmmainf0afcbd) has 40gridand 1listviews in 14 view files, none declaring either key; objectstack's own examples have 18 files declaring grid or list views and at most 2 touch an inline-edit key; the UI skill and the CLI view scaffold teach nothing about the key, so an AI-built or scaffolded table is read-only in its cells too. - Mainstream practice splits. CRM and record-list products (Salesforce list views, ServiceNow list editing, HubSpot, Pipedrive, Zoho) are on by default, gated by field and record permissions, with an admin switch. Metadata app builders (Odoo list
editable, Power Apps model-driven grids, Oracle APEX interactive grids, AppSheet, Retool) are opt-in per view. The maintainer chose the first posture for this platform: the permission gate already does the protecting, and the per-view key is the exception, not the rule. - The permission gate is untouched: objectui offers the toggle only when the object is editable in place (ADR-0103 bucket,
userActions.edit, the server's effective API operations) and the current principal canupdatethe object (packages/plugin-list/src/ListView.tsx:2007).
Spec half (this card, @objectstack/spec)
packages/spec/src/ui/view.zod.ts:1535:editInline: z.boolean().default(true), with thedescribetext rewritten: on by default; a user who may update the object edits a cell in place with the field's type-aware widget; declareeditInline: falseto make the list read-only in place.- The reference pages (
content/docs/references/ui/view.mdx,page.mdx) regenerate through their generator. - Changeset:
Clause-②: yes (widening)(a view declaring nothing gains an affordance it did not have); the launch-window BREAKING banner names the author who relied on the documented default for a read-only list and the remedyeditInline: false; the ADR-0087 disposition marker ascheck:adr-0087-registrationdemands. Measured in-repo reach of the remedy: cloudpackages/service-tenant/src/pages/sys-package.page.ts:105already declareseditInline: falseexplicitly; no objectstack example declaresfalse. skills/objectstack-ui/rules/list-views.md("Configuring a List View"): one paragraph. Inline editing is on by default under the permission gate; a list whose records are read-only by nature (log, audit, history, report roll-up) declaresuserActions: { editInline: false }.skills/**is Tier H, so the PR takes the maintainer's APPROVED review.
Consumer half (objectui, filed by the claiming seat as the consumer card of this contract-first split)
packages/plugin-list/src/ListView.tsxinlineEditOfferedandpackages/app-shell/src/views/InterfaceListPage.tsx:571read an absent key as the spec default, on:editInline !== false. The fold inpackages/core/src/utils/normalize-list-view.tsis unchanged (inlineEdit: truereads on and opens in edit mode;inlineEdit: falsereads off; an expliciteditInlinewins).- The table in
content/docs/plugins/plugin-view.mdxgains the row "neither key: offered, opens out of edit mode". The pins flip:ListView.permissions.test.tsx,normalize-list-view.inlineEditFold-5144.test.ts, the interface-page tests. The console's toggle stays session-only (objectui#5144, ruling E). - The ADR-0047 interface page gains the toggle by default, as the maintainer accepted in the assessment.
- Sequence: this card lands first; objectui follows. In the window objectui still reads an absent key as off, so nothing regresses against today.
Acceptance
- A grid view that declares nothing offers the inline-edit toggle to a user with
updateon the object and not to a user without it;userActions: { editInline: false }removes it;inlineEdit: truestill opens the grid in edit mode. - HotCRM's 41 undeclared views regain cell editing after both packages upgrade, with no metadata change in that repo.
Not taken
- Declaring
userActions.editInline: trueon every existing view (the cards filed under that premise in the same session, views: declareuserActions.editInline: trueon every grid and list view, so cell editing survives the objectui upgrade (objectstack-ai/objectui#5144) hotcrm#2048 and ui skill, CLI view scaffold and examples: a business object's grid view declaresuserActions.editInline: true, so AI-built and scaffolded tables keep cell editing under the spec default (objectui#5144) #22604, are superseded by this ruling). - An app-level default between the spec default and the view (a new surface with one pull today).
Related
- [finding]
userActions.editInlinehas two different defaults across surfaces, and neither is the spec's.default(false)objectui#5144 (the 2026-08-18 B-fold ruling; its spec-default convergence stands, with the default's value changed here), fix(plugin-list): read userActions.editInline with the spec default, folding a stored inlineEdit into it (objectui#5144) objectui#12036.
Filed by the director seat; generated by Claude Code
Reactions are currently unavailable
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:specenhancementNew feature or requestNew feature or requestpriority:p1High: required for production / M2High: required for production / M2target:v18
Activity
objectstack-fleet commentedon Oct 10, 2026
Triage: first grade,
enhancement·priority:p1·target:v18·domain:spec·area:records, kept inpm:queue. It executes the maintainer's rulingTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T04:55Z. ⛔ Not a claim, ⛔ not a dispatch.packages/spec/src/ui/view.zod.ts, the generated references andskills/objectstack-ui. That isdomain:spec, and theskills/**edit takes the maintainer's APPROVED review (Tier H), as the card says.Blocked-by:this card. It readseditInline !== falseand needs no new export from@objectstack/spec. Its landing waits for this card, not for the install face. In the window, objectui still reads an absent key as off, so nothing regresses.objectstack-fleet commentedon Oct 10, 2026
Claim: PM loop round 5 (#22605, the maintainer's ruling 乙:
ListView.userActions.editInlinedefaults totrueon the v18 line, andeditInline: falseis the opt-out) · 2026-10-10T05:33ZSession:
session_01KNKBCRDJCu5tGy3TEbvtrFAccount:
zhuangjianguo(the seat's linked user asGET /useranswers it; the card's assignee from this act)Branch:
claude/issue-22605-edit-inline-default-on(PR 1);claude/issue-22605-skill-list-views(PR 2)Worktree:
objectstack-issue-22605Domain:
domain:specSeat:
domain:spec#3(seat post #18883)File surface (at
origin/maind748ae80afor later; stop on breach and explain in the report). Two PRs, because the card'sskills/**paragraph is Tier H and the default flip must not wait on it:Part of #22605, the queue):packages/spec/src/ui/view.zod.ts(about:1535):editInline: z.boolean().default(true), with thedescribetext rewritten as the card states;content/docs/references/ui/view.mdx,page.mdx) and any other generated artifact the default renders into;check:adr-0087-registrationdemands for a default flip (a D3 entry and its regenerated registry, if that is what it demands);.changeset/22605-*.md(@objectstack/spec;Clause-②: yes (widening), with the launch-window BREAKING banner naming the author who relied on the documented default for a read-only list, and the remedyeditInline: false);packages/spec/src/ui/.Fixes #22605, Tier H, the maintainer's APPROVED review):skills/objectstack-ui/rules/list-views.md, "Configuring a List View", one paragraph as the card states, through the skill's generator if it has one.Container & model:
S,mode:subagent,model: CONTRACT_REVIEW_TIER— MANDATORY:dispatch-gates --tieronskills/objectstack-ui/rules/list-views.mdprints "Model tier — MANDATORY: … (derived from the file surface, not recalled)" for'skills/**'(clause ①, the 2026-09-10 ruling 「必须 fable的还包括对外发布的skills」), and one such path closes the downgrade exit for the whole card, so one dev at that tier builds both PRs. The default flip widens what a view that declares nothing offers: the contract review atCONTRACT_REVIEW_TIERis owed before PR 1 enqueues; PR 2'sskills/**hunk is reviewed at that tier as well. (Corrected by the seat at 2026-10-10T05:36Z: this line first readmodel: default tier.)Clause-②: no
(Corrected by the seat at 2026-10-10T07:24Z: this line first read
Clause-②: yes (widening). A moved default neither widens nor narrows the accept set; the contract review6095058376judged the arm wrong, and the breaking signal rides the changeset banner and the ADR-0087 marker.)Responsibility:
n/a — not a defect card(a ruled change, filing gate ②)Thread-read: 6093968052
Serial constraints cleared: the file lists of the open PRs, read at 2026-10-10T05:33Z; none touches
view.zod.ts,skills/objectstack-ui/**orreferences/ui/view.mdx. The otherarea:recordscards in flight (ui(pages): a slotted page that authors bothdetailsandtabsloses itsdetailsslot in the console —sys_user_detailauthors both, so its sections andhideFields(incl.ban_reason) never apply #22568domain:spec, Comment reactions (ruling A amended on #22505): a reaction is the reactor's ownsys_comment_reactionrecord, andsys_comment.reactionsretires with no aggregate and no data migration #22566 and plugin-audit: sys_activity.actor_name is declared but never written, so every record History entry reads "Unknown user" #22510domain:services) name none of these files. ui(pages): a slotted page that authors bothdetailsandtabsloses itsdetailsslot in the console —sys_user_detailauthors both, so its sections andhideFields(incl.ban_reason) never apply #22568 shares onlyregistry.ts(ordinary concurrency; the maintainer's temporary rule-A relaxation applies).The ruling, verbatim (the director seat's filing): 「乙 v18 把 spec 默认翻成 true,editInline: false 变成关法。」 Triage (
6093968052) graded itpriority:p1: the default flips on the v18 line, so it must ride the v18 release.This act moves the card
pm:queue→pm:dispatchedand assignszhuangjianguo.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
os-dev-report
Report for #22605 covering both PRs — #22629 (spec half, Part of) and #22630 (skill half, Fixes). Posted 2026-10-10T06:54Z.
{ "issue": 22605, "status": "done", "branch": "claude/issue-22605-edit-inline-default-on (PR 1); claude/issue-22605-skill-list-views (PR 2)", "pr": "https://github.com/objectstack-ai/objectstack/pull/22629 (PR 1, Part of #22605, draft, queue); https://github.com/objectstack-ai/objectstack/pull/22630 (PR 2, Fixes #22605, draft, Tier H)", "session": "session_01KNKBCRDJCu5tGy3TEbvtrF", "premise_still_valid": true, "summary": "PR 1 (#22629, head 24d9bdcbf0): UserActionsConfigSchema.editInline is z.boolean().default(true) with the describe rewritten; the declared default change is ledgered in DEFAULT_CHANGES_BY_MAJOR[17] (ui/UserActionsConfig:editInline false → true, CURRENT_MAJOR is the package major 17); the D3 semantic entry list-view-edit-inline-default-on is added at protocol 18 as an entries/semantic file and the registry regenerated; authorable-defaults/ui.json and the four reference rows (view.mdx ×3, page.mdx ×1) regenerated; changeset 22605-spec-list-view-edit-inline-default-on.md (@objectstack/spec minor, Clause-②: yes (widening), BREAKING banner naming the author who relied on the documented default for a read-only list and the remedy editInline: false, marker registered list-view-edit-inline-default-on); five pins in view.test.ts. PR 2 (#22630, head e6f3eb158a): one paragraph in skills/objectstack-ui/rules/list-views.md after the column-features table, with the 维护者速读(草稿) section in its body (席位意见 left empty). Premise verified on origin/main: view.zod.ts:1535 read .default(false) with the Off-by-default describe; no in-repo metadata declares editInline at all; the skill file is hand-written (the only generated lifts in skills/** are references/_index.md and references/react-blocks.md). Not taken: an app-level default; editInline: true on existing views; nothing in objectui (its half is objectui#12086). Both PRs merged origin/main before opening (PR 1 at e22315238f, PR 2 at 83b8b80728); origin/main then moved two more commits past PR 1 with no path overlap.", "tests": "All under the verify lock with OS_VERIFY_LOCK_SLOT=issue-22605 (shared-box seconds). PR 1 at head 24d9bdcbf0 after the merge: pnpm --filter @objectstack/spec build — green; check:generated — '✓ All 15 generated artifacts are up to date'; pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2 (the package test script) — 'Test Files 642 passed (642) · Tests 19150 passed | 1 todo (19151)'; targeted src/ui/view.test.ts src/ui/page.test.ts src/migrations/migrations.test.ts src/migrations/semantic-relevance.test.ts — '4 passed · 740 passed'; repo-project scripts/step18-rationale-merge.test.ts scripts/authorable-defaults.test.ts scripts/build-schemas-check-mode.test.ts (+semantic-relevance) — '4 passed · 146 passed' (12m39s under the lock); pnpm --filter @objectstack/spec typecheck — tsc --noEmit, check:scripts-typecheck, check:test-typecheck all green ('52 file(s) / 246 error(s) / 135 pinned signature(s) held', ledger unchanged); consumer test examples/app-showcase test/inert-wirings.test.ts (the one non-spec test reading view-level userActions) — '1 passed · 38 passed'; spec test:repo beyond the three files declared to CI. The build printed '📌 1 declared default change(s) accepted (#4666): ui/UserActionsConfig:editInline: false → true'. Public type surface unchanged (check:api-surface green: .default(true) vs .default(false) infers the same type), so no consumer package owes tests beyond the one run. Ablation (committed fix, at 24d9bdcbf0): node scripts/ablation-replace.mjs --file packages/spec/src/ui/view.zod.ts --anchor 'editInline: z.boolean().default(true)' --replacement 'editInline: z.boolean().default(false)' -- vitest run src/ui/view.test.ts: on-disk proof anchor 1 → 0, replacement 0 → 1, blob 6979ade6158a → e0e02cd7f858; direction observed red, exactly the two default pins ('should apply default values', 'an absent key parses to true': expected false to be true), '2 failed | 462 passed (464)'; restore proved blob == HEAD (6979ade6158a), git diff HEAD empty, tree clean. Resolution path: view.test.ts imports './view.zod' from src, no dist between mutation and reading, so no rebuild was needed for this ablation. Lint as a proven narrowing: pnpm exec eslint --no-inline-config --format json over the .ts/.mjs files of the two-point diff — 24 files, 0 errors, 0 warnings (JSON counts); population from eslint.config.mjs is **/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs} minus ignores (.md/.mdx/.json outside it); invariance: no parserOptions.project and no typed rules, so untouched files' verdicts cannot move. PR 2: node scripts/check-skills-token-ratchet.mjs — 'skills/objectstack-ui/rules/list-views.md is 3136 tokens (ceiling 3141; headroom 5)', '54 authored bundle file(s) within their ceilings'.", "gates": { "pr1": "dispatch-gates --commands --repo objectstack-ai/objectstack at 24d9bdcbf0: 115 families; --ran reconcile: 115 derived, 114 run, 0 NOT-MEASURED, 1 UNRUN (pnpm check:dual-build-cjs-loads — NOT MEASURED by dispatch, whole-workspace build). 113 of the 114 exited 0 (after building @objectstack/formula, lint, client, client-react, objectql under the lock for the gates that load them: check:doc-formula-expressions, check:doc-security-posture, check:skill-examples, check:docs-transcript-drift, check:lean-entry-closure all re-ran green). pnpm check:dts-closure exited 1 for missing dist under plugin-approvals and plugin-dev — it reads every package's built declarations, so NOT MEASURED locally (CI Build Core), not red. Artifact-roster block (49): 46 run, all exit 0 except pnpm check:published-readme-exports exit 3 (44 unbuilt packages, NOT MEASURED); PR-context guards wired to #22629: check-closing-target-claim exit 0 ('binds no closing keyword to a card; a Part of #N declaration is not a closing target'; a first run without PR_HEAD_REF exited 2 NOT MEASURED), check-partof-closing-keyword exit 0, check-single-claim-paths exit 0. Staleness: the derivation tree is 2 commits behind origin/main 83b8b80728; the one moved derivation input is scripts/platform-object-tenancy-census.json (its family ran green on the older copy; no path overlap). check-adr-0087-registration --base origin/main exit 0; check-changeset-no-major --base origin/main exit 0; check-empty-changeset exit 0; check:authorable-surface, check:docs, check:migration-registry, check:spec-changes, check:upgrade-guide, check:api-surface all exit 0. Ran lists and logs: scratchpad issue-22605/gates-pr1/, gates-pr1-rosters/.", "pr2": "dispatch-gates --commands at e6f3eb158a (after merging origin/main 83b8b80728): 23 families; --ran: 23 derived, 23 run, 0 NOT-MEASURED, 0 UNRUN, all exit 0 (check:doc-formula-expressions after building formula and lint; check-skills-token-ratchet, check:pm-governed-merges, check:skill-compatibility, check:skill-frame-sync, check:skill-identifier-liveness among them). check-governed-merges --test skills/objectstack-ui/rules/list-views.md: governed, Tier H (exit 3 is the predicate's governed answer); not in a generated lift. PR-context guards wired to #22630: check-closing-target-claim exit 0 ('closes #22605, and each carries a Claim whose Branch line names claude/issue-22605-skill-list-views'), check-partof-closing-keyword exit 0, check-single-claim-paths exit 0. dispatch-gates --tier on the skill path: MANDATORY claude-fable-5-1, the tier this run ran at." }, "line_budget": { "pr1": "9 files, +233/−7 off merge base e22315238f (labeler: size/m); no skills/** file; well under the 3000-line human-merge limb.", "pr2": "1 file, +5/−0. rules/list-views.md 300 → 305 lines; 3068 → 3136 tokens (ceil(bytes/4): 12269 → 12543) against ceiling 3141, headroom 5, paid from existing headroom, nothing re-wrapped or deleted. Package: sum of every skills/*/SKILL.md 4410 → 4410 lines (none moves). No token count beyond the ratchet's own convention exists." }, "adr_0087_disposition": "registered list-view-edit-inline-default-on — a D3 semantic entry at step 18 (packages/spec/src/migrations/entries/semantic/18.list-view-edit-inline-default-on.ts, concatenated into registry.ts by gen:migration-registry, byte-exact after merging the sibling entry page-slots-details-beside-tabs-refused, not adjacent in id order). The gate refuses not-required (no-migration-prescription) when the body prescribes a remedy, and this body prescribes editInline: false; precedent: view-pagination-page-size-default-50 and protocol 12's rest-requireauth-default-flip. No tombstone, no RETIRED_KEYS_BY_MAJOR row, no D2 conversion (a mechanical pass in either direction would defeat or duplicate the ruling). A second ledger also applies and is written: DEFAULT_CHANGES_BY_MAJOR[17] carries ui/UserActionsConfig:editInline false → true, which check:authorable-surface accepted. No STEP18_RATIONALE fragment added (the default-flip precedents carry none). spec-changes.json and docs/protocol-upgrade-guide.md not regenerated: the PR-stage checks project in memory and compare no committed copy (#22449 B′), and origin/main turned the guide into a pointer stub during this run.", "files_changed": { "pr1": [ ".changeset/22605-spec-list-view-edit-inline-default-on.md", "content/docs/references/ui/page.mdx", "content/docs/references/ui/view.mdx", "packages/spec/authorable-defaults/ui.json", "packages/spec/scripts/lib/default-changes.ts", "packages/spec/src/migrations/entries/semantic/18.list-view-edit-inline-default-on.ts", "packages/spec/src/migrations/registry.ts", "packages/spec/src/ui/view.test.ts", "packages/spec/src/ui/view.zod.ts" ], "pr2": [ "skills/objectstack-ui/rules/list-views.md" ] }, "deviations": [ "spec-changes.json and docs/protocol-upgrade-guide.md: regenerated once, then reverted to HEAD — the regeneration on the pre-merge tree carried 30-odd lines of sibling drift this diff does not own, the PR-stage gates compare no committed copy (generator header, #22449 B′), and origin/main then made the guide a pointer stub. AGENTS.md's regenerate table and entries/README.md still say to regenerate both; the generator header is the newer authority and was followed. Conflict stated, not quietly picked.", "check:dual-build-cjs-loads not run (dispatch: no whole-workspace build); check:dts-closure exit 1 and check:published-readme-exports exit 3 read as NOT MEASURED (unbuilt dists), not red; dependency closures built only where a derived gate refused on a prerequisite (formula, lint, client, client-react, objectql).", "PR 2 carries no changeset: skills/** ships in no package's files[], so the diff releases nothing, and the changeset gate's own prescription is the skip-changeset label; the dispatch set labels to zero, so the seat applies skip-changeset to #22630. Labels documentation/size/*/tests/tooling/protocol:ui on both PRs were written by the labeler, not by this run.", "git push count 7 (4 on PR 1: the probe, then three WIP/final pushes; 3 on PR 2), beyond 'one per branch' — AGENTS.md requires a WIP push before every minutes-long step.", "PR 1 was not re-merged after origin/main moved from e22315238f to 83b8b80728 (two commits: plugin-approvals, plugin-audit; no path overlap; the only moved derivation input is the tenancy-census roster). The queue rebuilds onto current main.", "Commit trailers use the model-free pair AGENTS.md requires (Claude-Session + Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By line, which the pre-push hook refuses.", "The spec repo-project (test:repo) beyond the three files run is declared to CI; the full local project ran whole (642 files)." ], "mcp_calls": "0 — no MCP GitHub tool was called; reads were gh api (single-card REST reads of #22605, its comments, and the two PRs' bodies).", "api_writes": "5 relay actions, each one repository_dispatch to objectstack-ai/objectstack executed as objectstack-fleet[bot]: POST /repos/objectstack-ai/objectstack/pulls (pr_create #22629), POST /repos/objectstack-ai/objectstack/pulls (pr_create #22630), POST /repos/objectstack-ai/objectstack/issues/22629/assignees (label-write --assign zhuangjianguo), POST /repos/objectstack-ai/objectstack/issues/22630/assignees (label-write --assign zhuangjianguo), POST /repos/objectstack-ai/objectstack/issues/22605/comments (this os-dev-report, via post-stamped). git push is not a REST write: 7 pushes.", "open_questions": [], "out_of_scope_findings": [ "carrier: the seat holding #22449 B′ condition 2 (514bf3c101) · noted, not filed — packages/spec/src/migrations/entries/README.md ('What this does not fix') and AGENTS.md's regenerate table still instruct regenerating spec-changes.json and docs/protocol-upgrade-guide.md on every entry, while build-spec-changes.ts's header says the PR stage compares no committed copy and the guide is now a pointer stub; an agent following the README regenerates a stale committed copy that carries sibling drift. Agent-facing text, no runtime or contract reach.", "carrier: the next console pin bump · noted, not filed — .changeset/console-20c6d351ad74.md item (4) states the spec default as false and 'nothing here moves'; true of that diff at pin 20c6d351ad74, dated once this PR lands; the next pin bump's changeset is where the new reading belongs." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
✅ ACCEPT: PR #22629 at
24d9bdcbf0(Part of #22605, the queue) and PR #22630 ate6f3eb158a(Fixes #22605, Tier H). PR 1's contract review is owed; PR 2 waits on the maintainer's approval and lands after PR 1domain:specseat 3 (#18883) ·zhuangjianguo· sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-10T06:57Z · holder of claim6094254055. Report:os-dev-report6094863892. Thread-read: 6094863892.PR 1, checked in the diff (9 files, +233 / −7; no governed path):
UserActionsConfigSchema.editInlineisz.boolean().default(true), with thedescriberewritten as the card states.DEFAULT_CHANGES_BY_MAJOR[17](ui/UserActionsConfig:editInline,false→true), which is what letscheck:authorable-surfaceauthorise the moved fingerprint inauthorable-defaults/ui.json.list-view-edit-inline-default-onsits at step 18, with the registry regenerated. It has no tombstone and no D2 conversion, and the entry says why. It is the same class asview-pagination-page-size-default-50and protocol 12'srest-requireauth-default-flip.view.mdx×3,page.mdx×1).@objectstack/specminorunder the launch-window convention,Clause-②: yes (widening), the registered marker, a BREAKING banner naming the author who relied on the old default for a read-only list, the remedyeditInline: false, and the measured reach. No metadata in this repository declareseditInline, and every undeclared list view gains the toggle.true(on the schema and throughListViewSchema); explicitfalseandtruekeep their values;inlineEdit: trueparses as before. The ablation (.default(false)back) turns exactly the two default pins red, and the restore was blob-equal.PR 2, checked in the diff (1 file, +5 / −0): one paragraph in
skills/objectstack-ui/rules/list-views.md, after the column-features table, worded as the card states. The skill file is hand-written; the only generated lifts inskills/**arereferences/_index.mdandreferences/react-blocks.md. The skills token ratchet reads 3136 of 3141. It ships in no package'sfiles[], soskip-changesetis right; the seat applies it in this act.Evidence, as reported, with its shape checked:
@objectstack/specfull local project, 642 files / 19150 tests, plus the targetedview/page/migrationsfiles and the repo-project scripts tests;check:generated, 15 of 15;userActions(app-showcaseinert-wirings), 38 passed;dts-closureandpublished-readme-exportsNOT MEASURED locally (unbuilt dists) anddual-build-cjs-loadsNOT MEASURED as dispatched;check-governed-merges --testreads Tier H, not a generated lift; the PR-context guards are green.Deviations accepted:
spec-changes.jsonand the upgrade guide were reverted to base, as the generators' headers say (#22449 B′; the guide is now a pointer stub onmain); the WIP pushes; no re-merge ofmainafter two unrelated commits.out_of_scope_findings:packages/spec/src/migrations/entries/README.mdand AGENTS.md's regenerate table still instruct regenerating the two projections on every entry. Carrier: spec(changes): delete the committed spec-changes per-major projection and the upgrade guide copy, with their two merge=os-regen routes, once generation at publish has landed (#22449 B′) #22485, the card that deletes the committed copies; this seat files the pointer there.false" is dated once PR 1 lands → carrier: the next console pin bump.Landing order: PR 1 goes through the queue after its contract review. PR 2 takes the maintainer's APPROVED review, and the seat lands it after PR 1 merges, so the skill never teaches a default the spec does not yet carry. PR 2 carries
Fixes #22605, so the card closes on its landing.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
Reopened: PR #22630 (the skill paragraph) landed first and closed this card through its
Fixes, but PR #22629 (the spec default flip) is still opendomain:specseat 3 (#18883) ·zhuangjianguo· sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-10T07:23Z · holder of claim6094254055. Thread-read: 6094884470.os-zhuangreadied PR docs(skills): a list view edits in place by default; a read-only list declares editInline: false (#22605, skill half) #22630 at 2026-10-10T07:00Z, enabled auto-merge and queued it. It merged at 2026-10-10T07:20Z asf368b7e980. A maintainer's own merge of a Tier H PR is its review record, so the landing stands. The at-tier contract review of itsskills/**hunk was posted on the PR 8 seconds after the merge (6095063264).skills/objectstack-ui/rules/list-views.md, onmainis blob-equal to the reviewed heade6f3eb158a.6094884470: PR 2 after PR 1). Until PR feat(spec)!: ListView.userActions.editInline defaults to true on the v18 line; editInline: false is the opt-out (#22605, spec half) #22629 lands, the skill teaches that inline editing is on by default while the spec still parses an absenteditInlinetofalse. The window is the time PR feat(spec)!: ListView.userActions.editInline defaults to true on the v18 line; editInline: false is the opt-out (#22605, spec half) #22629 takes to pass its contract review and the queue. The seat drives that now.Part of #22605), is still open, and an in-flight card is followed until its last PR merges. The card reopens with its labels and assignee as they were (pm:dispatched,zhuangjianguo). It closes again when PR feat(spec)!: ListView.userActions.editInline defaults to true on the v18 line; editInline: false is the opt-out (#22605, spec half) #22629 lands; that PR carriesPart of, so the seat closes the card in its landing act.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
Seat order: patch round on PR #22629. Contract review FAIL
6095058376adopted, plus theTest Corered it found after posting. Urgent: the skill paragraph is already onmaindomain:specseat 3 (#18883) ·zhuangjianguo· sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-10T07:25Z · holder of claim6094254055. Thread-read: 6095085980.Why urgent: PR #22630 merged first (
f368b7e980). Until this PR lands, the published skill teaches that inline editing is on by default while the spec still parses an absenteditInlinetofalse. The skills catalog installs straight from this repository.The three changes, and nothing else:
Clause-②: no, notyes (widening). A moved default neither widens nor narrows the accept set, and the breaking signal is the changeset banner plus the ADR-0087 marker. Change it in.changeset/22605-spec-list-view-edit-inline-default-on.md(line 13). The seat corrects the claim (done,6094254055) and the PR body's line 2 (in this act).Test Core (4/6)red, caused by this PR:packages/cli/test/migrate-meta-engine-guidance.test.ts:417, "list-view-edit-inline-default-on: the printed guidance cites a tracker id: expected 'Analytics: a dataset dimension on a dotted relationship path (crm_account.industry) renders raw stored values — the same field as a local dimension renders its option labels #5144' to be undefined".reasoncontainsobjectui#5144.objectui#Ncitations amongmain's semantic entries all sit in//comments, never in printed strings, so a citation that must stay belongs in the file's leading comment.surface,replacementandacceptanceCriteriafor the same.DEFAULT_CHANGES_BY_MAJOR[17]entry'sreason(packages/spec/scripts/lib/default-changes.ts). The pin does not cover it, but it prints into the build log.Verify:
registry.ts;packages/cli/test/migrate-meta-engine-guidance.test.ts(the integration project, after the CLI closure build) and show it green, with the pre-patch red reproduced first;src/ui/view.test.tsandsrc/migrations;check:migration-registry,check:generated,check-adr-0087-registration --base origin/mainandcheck-changeset-no-major.If
mainmoved registry files, merge it once throughos-regen-merge.shfirst. Push, and report the new head andgit diff --name-only 24d9bdcbf0 NEW-HEAD. A same-head contract review follows, scoped to these three changes.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
os-dev-report
Patch round on PR #22629 per seat order 6095101276: new head fc3733b. Posted 2026-10-10T07:37Z.
{ "issue": 22605, "status": "done", "branch": "claude/issue-22605-edit-inline-default-on", "pr": "https://github.com/objectstack-ai/objectstack/pull/22629 (draft; new head fc3733b971, previous head 24d9bdcbf0)", "session": "session_01KNKBCRDJCu5tGy3TEbvtrF", "premise_still_valid": true, "summary": "Patch round on PR #22629 per seat order 6095101276 (contract review FAIL 6095058376 adopted, plus the Test Core red). Three changes and nothing else: (1) the changeset's declaration line is now Clause-②: no (it sits at line 7 of .changeset/22605-spec-list-view-edit-inline-default-on.md, not line 13 as the order says; the line itself is unambiguous); (2) the D3 entry's printed reason no longer names a tracker id — 'the one-vocabulary rule objectui ruled for the fold stands' — and the objectui#5144 citation moved into the entry file's leading // comment, as main's other entries carry theirs; surface, replacement and acceptanceCriteria scanned with the pin's own shape (# plus four or five digits): none; (3) the DEFAULT_CHANGES_BY_MAJOR[17] reason rewritten the same way. registry.ts regenerated by gen:migration-registry (415 semantic entries). main moved no registry file since 24d9bdcbf0 (git log 24d9bdcbf0..origin/main over src/migrations, spec-changes.json, the upgrade guide, default-changes.ts, authorable-defaults: empty), so no os-regen-merge.sh pass and no merge; origin/main f368b7e980 is six commits past the PR's last merge, none touching a path of this diff. New head fc3733b971, pushed. git diff --name-only 24d9bdcbf0 fc3733b971: .changeset/22605-spec-list-view-edit-inline-default-on.md, packages/spec/scripts/lib/default-changes.ts, packages/spec/src/migrations/entries/semantic/18.list-view-edit-inline-default-on.ts, packages/spec/src/migrations/registry.ts (4 files, +15/−7).", "tests": "Under the verify lock, OS_VERIFY_LOCK_SLOT=issue-22605, in a worktree recreated at the remote head 24d9bdcbf0 (pnpm install clean). RED reproduced first, pre-patch, after the CLI closure build (pnpm exec turbo run build --filter=@objectstack/cli... --concurrency=2: 'Tasks: 59 successful, 59 total'): pnpm --filter @objectstack/cli exec vitest run --project integration --maxWorkers=2 test/migrate-meta-engine-guidance.test.ts — 'FAIL |integration| … prints every covered block verbatim, and no printed block names a tracker id — AssertionError: list-view-edit-inline-default-on: the printed guidance cites a tracker id: expected '#5144' to be undefined', 'Tests 1 failed | 2 passed (3)'. GREEN after the patch, same closure build re-run on the new registry ('Tasks: 59 successful, 59 total', spec and its dependents rebuilt): the same command — 'Test Files 1 passed (1) · Tests 3 passed (3)'. Spec: pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2 src/ui/view.test.ts src/migrations — 'Test Files 5 passed (5) · Tests 667 passed (667)'. The test's resolution path: the CLI child runs through tsx and imports @objectstack/spec/migrations from the built dist, which is why the closure build sits between the mutation and the reading on both legs. Nothing in packages/spec/src/ui/** moved; the five editInline pins are unchanged and green.", "gates": { "pr1": "At fc3733b971: pnpm --filter @objectstack/spec run check:migration-registry — '✓ src/migrations/registry.ts is current'; pnpm --filter @objectstack/spec run check:generated — '✓ All 15 generated artifacts are up to date' (migration-registry, spec-changes, upgrade-guide, meta-url-spelling, skill-docs, skill-refs, react-blocks, authorable-surface, api-surface, export-origins, declaration-map, docs, strictness-ledger, liveness, test-typecheck); node scripts/check-adr-0087-registration.mjs --base origin/main — exit 0, '1 declared-breaking changeset(s), each carrying an ADR-0087 disposition … [BREAKING] registered list-view-edit-inline-default-on (new here)' — the BREAKING reading now comes from the banner alone, with Clause-②: no; node scripts/check-changeset-no-major.mjs --base origin/main — exit 0, 'This diff introduces no major bump', protocol lockstep exception evidenced (pre mode, pending major). Both changeset gates were run on the working tree and again on the committed head. The wider dispatch-gates harvest from the previous round (115 derived, 114 run) stands for every family whose inputs this patch does not touch; the four touched files are the changeset and the registry/ledger prose, which the four gates above read. CI not waited for, per the order." }, "line_budget": { "pr1": "4 files, +15/−7 off the previous head 24d9bdcbf0; the PR's full diff off its merge base e22315238f stays 9 files; no skills/** file." }, "adr_0087_disposition": "Unchanged: registered list-view-edit-inline-default-on (D3 semantic entry at step 18) plus the DEFAULT_CHANGES_BY_MAJOR[17] hop for ui/UserActionsConfig:editInline false → true. Only prose inside the entry's reason and the ledger's reason moved; ids, surface, replacement and acceptanceCriteria are byte-identical to the reviewed head.", "files_changed": { "pr1": [ ".changeset/22605-spec-list-view-edit-inline-default-on.md", "packages/spec/scripts/lib/default-changes.ts", "packages/spec/src/migrations/entries/semantic/18.list-view-edit-inline-default-on.ts", "packages/spec/src/migrations/registry.ts" ] }, "deviations": [ "The order names the Clause-② line as line 13 of the changeset; in the file it is line 7 (line 13 is the ruling paragraph). The named line was edited; no other line moved.", "The worktree had been removed at the end of the previous round (cleanup is a task step), so it was recreated from the remote branch head 24d9bdcbf0 (equal to the local branch ref) before any edit; the Resume-from pattern, with no merge of origin/main because main moved no registry file and no path of this diff.", "The changeset's own prose still cites objectui#5144 and objectui#12086 (changeset text ships to CHANGELOG.md; the pin covers printed migrate-meta guidance only, and the order scoped the rewrite to the entry and the ledger reason). Not touched.", "The regenerated registry.ts hunk carries the entry file's new leading // comment lines as well as the reason line (the generator copies the comment run above export const entry into the table by design): +6/−2 there." ], "mcp_calls": "0 — no MCP GitHub tool was called; reads were gh api (the card's comments, the contract review comment).", "api_writes": "1 relay action, one repository_dispatch executed as objectstack-fleet[bot]: POST /repos/objectstack-ai/objectstack/issues/22605/comments (this os-dev-report, via post-stamped). No PR-body write, no label write. git push is not a REST write: 1 push (24d9bdcbf0..fc3733b971).", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
Landed: PR #22629 →
f53f14bb36(Part of #22605, the spec half). With the skill half (PR #22630) already onmain, the card is complete and closes heredomain:specseat 3 (#18883) ·zhuangjianguo· sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-10T08:30Z · holder of claim6094254055.f53f14bb36, a squash with one parent,86da194919. The queue did not eject it.6094884470, contract review round 1 FAIL6095058376, the patch order6095101276, contract review round 2 PASS6095355885atfc3733b971, and the pre-queue record6095415780.f53f14bb36are blob-equal to the reviewed headfc3733b971.UserActionsConfigSchema.editInlineisz.boolean().default(true): a list view (or a pageinterfaceConfig) whoseuserActionsomitseditInlineparses totrue, andeditInline: falseis the opt-out. The permission gate is unchanged.list-view-edit-inline-default-on(step 18) and theDEFAULT_CHANGES_BY_MAJOR[17]row record the flip.f368b7e980) and the spec default now agree onmain.spec-changes.json→ spec(changes): delete the committed spec-changes per-major projection and the upgrade guide copy, with their two merge=os-regen routes, once generation at publish has landed (#22449 B′) #22485 (carriers held from round 1's review).This act closes the card as completed and removes
pm:dispatched; the domain, priority, target and area labels stay.Generated by Claude Code
docs(changeset): state the v18 editInline default in the pending obje…