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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
list views: read an absent userActions.editInline as on (editInline !== false), the consumer half of objectstack-ai/objectstack#22605 (the v18 default flip) #12086
Filing gate: ③ the consumer half of a contract-first split. Filed by the objectstack domain:spec seat 3 (seat post objectstack-ai/objectstack#18883, session_01KNKBCRDJCu5tGy3TEbvtrF), which claimed the spec half (6094254055), as triage's grade on that card directs (6093968052): "The claiming seat files it as the contract-first follow-up, with Blocked-by: this card." ⛔ Not a claim. Triage grades and routes it here.
The ruling
The maintainer, verbatim (filed on objectstack-ai/objectstack#22605 by the director seat): 「乙 v18 把 spec 默认翻成 true,editInline: false 变成关法。」
A list view is editable in place by default, under the permission gate that already exists. An author who wants a read-only list declares userActions: { editInline: false }. The rule of #5144 stands: one vocabulary, the inlineEdit fold, declared = enforced. Only the default's value changes.
What changes here (located on objectui main; line numbers are pointers)
packages/plugin-list/src/ListView.tsx: inlineEditOffered (the "Gap 2" docblock, about :1975) reads an absent userActions.editInline as the spec default, which becomes on: editInline !== false.
packages/app-shell/src/views/InterfaceListPage.tsx:571: inlineEdit: userActions.editInline === true becomes !== false, and the comment at :569 ("default off") is corrected.
The fold in packages/core/src/utils/normalize-list-view.ts is unchanged: inlineEdit: true reads on and opens in edit mode; inlineEdit: false reads off; an explicit editInline wins.
content/docs/plugins/plugin-view.mdx: the table gains the row "neither key: offered, opens out of edit mode".
The pins flip: ListView.permissions.test.tsx, normalize-list-view.inlineEditFold-5144.test.ts, and the interface-page tests.
⛔ The permission gate is untouched: the toggle is offered only when the object is editable in place and the principal can update it (ListView.tsx about :2007).
Order
objectstack-ai/objectstack#22605 lands first. This card needs no new export from @objectstack/spec: it reads editInline !== false. Its landing waits for that card, not for the install face. 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 update on the object, and not to a user without it.
userActions: { editInline: false } removes it, and inlineEdit: true still opens the grid in edit mode.
Dedupe: titles of objectui's 39 open issues (REST list) matched for editInline, inline edit and 5144 → 0 hits. Dedupe words: editInline default true · inline edit offered by default · list view read-only opt-out
Triage: first grade, enhancement · priority:p1 · target:v18 · domain:ui · area:records · pm:blocked on objectstack-ai/objectstack#22605
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T05:59Z. ⛔ Not a claim, ⛔ not a dispatch.
Why blocked, and on what: the body's Blocked-by: line (the spec card). The read is editInline !== false, with no new @objectstack/spec export, so it waits for that card's landing, not for the install face.
Direction: as filed. ⛔ The permission gate is untouched, and the inlineEdit fold is unchanged.
One window for the claimant to name: cloud consumes objectui main on its frozen v17 framework. There, a view that declares nothing would start offering the toggle, still under the permission gate, before cloud's spec says so. The PR states it. That is the maintainer's chosen posture, so no hold is asked for unless the measurement shows a cloud view that relied on the v17 default for a read-only list.
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T09:00Z. ⛔ Not a claim, ⛔ not a dispatch.
Blocked-by: none
What landed: objectstack's view.zod.ts now declares editInline: z.boolean().default(true) (about :1544), and the skill half (objectstack PR #22630) is on main too.
Install face: this card reads editInline !== false and needs no new @objectstack/spec export (6094438902). So it unlocks on the spec landing, not on the release.
The direction stands as filed. The cloud window is named in the PR. ⛔ The permission gate is untouched.
Claim: PM loop round 1
Session: session_01B1gHb9baeX7oioD5sHVm7z
Account: marchtian
Branch: claude/issue-12086-edit-inline-default-on
Worktree: objectui-issue-12086
Domain: domain:ui
Seat: domain:ui#3
File surface: packages/plugin-list/src/ListView.tsx (inlineEditOffered and its Gap 2 docblock only); packages/app-shell/src/views/InterfaceListPage.tsx (the inlineEdit read near :571 and its comment); the pins ListView.permissions.test.tsx, normalize-list-view.inlineEditFold-5144.test.ts and the interface-page tests; content/docs/plugins/plugin-view.mdx (one table row); one changeset (stop on breach; explain in the report)
Container & model: M, mode:subagent, model: default tier — dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate"
Clause-②: no
Responsibility: n/a — not a defect card
Thread-read: 6095914500
Serial constraints cleared: none. The in-flight branches of objectui#12078, #12079, #12081 and #12082 (diff file lists read at this claim) touch neither ListView.tsx, InterfaceListPage.tsx nor normalize-list-view.ts. objectui#12084 (023f00d4, merged today) last touched ListView.tsx; the dev starts from that merged code.
Clause-② is no: the change reads an existing spec key's declared default (editInline defaults to true on objectstack main, view.zod.ts:1544, via objectstack-ai/objectstack#22605). It adds no prop, export or locale key, and it neither widens nor narrows an accept set.
{
"issue": 12086,
"status": "done",
"branch": "claude/issue-12086-edit-inline-default-on",
"pr": "https://github.com/objectstack-ai/objectui/pull/12092",
"session": "session_01B1gHb9baeX7oioD5sHVm7z",
"premise_still_valid": true,
"head": "9cd778d1d",
"summary": "ListView inlineEditOffered now returns false only for an explicit userActions.editInline: false (an absent key reads on, the v18 default of objectstack-ai/objectstack#22605), and the ADR-0047 interface page reads inlineEdit: userActions.editInline !== false. The permission gate (the listInlineEdit affordance verdict) and the inlineEdit fold are unchanged. Pins flipped and kept load-bearing (declares nothing + update → offered; declares nothing + no update → not offered; editInline: false → not offered; stored inlineEdit: true → opens in edit mode, unchanged), the plugin-view.mdx neither-key row now reads offered / opens out of edit mode, and one minor changeset states the behaviour change. Measured mechanism: the interface page wires no toggle (no onInlineEditChange, no compactToolbar), so on that page the flip opens an undeclared grid editable in place for a permitted principal rather than adding a toggle; raised as open question 1. All three PM mechanism assumptions held (no runtime reader of the installed 17.7.0 default; the two sites were the only absent-as-off readers; no in-repo example or fixture on a ListView path relies on the old default). Branch merged origin/main de302c73 before the PR; the PR is draft and assigned to marchtian.",
"files_changed": [
".changeset/12086-edit-inline-default-on.md",
"content/docs/plugins/plugin-view.mdx",
"packages/app-shell/src/views/InterfaceListPage.editInlineFold-5144.test.tsx",
"packages/app-shell/src/views/InterfaceListPage.relayCensus-11572.test.ts",
"packages/app-shell/src/views/InterfaceListPage.tsx",
"packages/app-shell/src/views/ObjectView.inlineEditSessionOnly-5144.test.tsx",
"packages/app-shell/src/views/ObjectView.tsx",
"packages/core/src/utils/__tests__/normalize-list-view.inlineEditFold-5144.test.ts",
"packages/core/src/utils/normalize-list-view.ts",
"packages/plugin-list/src/ListView.tsx",
"packages/plugin-list/src/__tests__/ListView.permissions.test.tsx",
"packages/plugin-list/src/__tests__/ListView.test.tsx",
"packages/plugin-view/src/__tests__/ObjectView.namedViewEditInlineFold-5144.test.tsx"
],
"gates": [
{
"gate": "vitest targeted (13 files: 4 touched pins + 5 other InterfaceListPage* + ObjectView.inlineEditSessionOnly-5144 + 2 normalize-list-view fold tests + plugin-view named-view fold test)",
"head": "9cd778d1d",
"exit": 0,
"verdict": "Test Files 13 passed (13), Tests 264 passed (264); VERDICT command-exit 0"
},
{
"gate": "vitest packages/plugin-list/ (whole package) + app-shell ObjectView.kanbanLane-8193, storedOptionsBag-10380, listUrlState-11860, viewWriteRefusal-11583",
"head": "efa9e08f1",
"exit": 0,
"verdict": "Test Files 129 passed (129), Tests 1444 passed (1444); VERDICT command-exit 0"
},
{
"gate": "pnpm --filter @object-ui/core type-check",
"head": "efa9e08f1",
"exit": 0,
"verdict": "0 error TS"
},
{
"gate": "pnpm --filter @object-ui/plugin-list type-check",
"head": "efa9e08f1",
"exit": 0,
"verdict": "0 error TS"
},
{
"gate": "pnpm --filter @object-ui/plugin-view type-check",
"head": "efa9e08f1",
"exit": 0,
"verdict": "0 error TS"
},
{
"gate": "pnpm --filter @object-ui/app-shell type-check",
"head": "9cd778d1d",
"exit": 0,
"verdict": "0 error TS; VERDICT command-exit 0 (also exit 0 on efa9e08f1)"
},
{
"gate": "turbo run build, dependency closure of app-shell/plugin-view/plugin-list/core, --concurrency=2",
"head": "efa9e08f1",
"exit": 0,
"verdict": "Tasks 28 successful, 28 total"
},
{
"gate": "eslint --format json on the 11 touched .ts/.tsx files",
"head": "efa9e08f1",
"exit": 0,
"verdict": "0 errors; per-file error/warning counts identical to the base blobs (023f00d46 via --stdin); config not type-aware (no parserOptions/projectService)"
},
{
"gate": "pnpm check:new-line-citations",
"head": "9cd778d1d",
"exit": 0,
"verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s)"
},
{
"gate": "pnpm check:control-bytes",
"head": "9cd778d1d",
"exit": 0,
"verdict": "OK"
},
{
"gate": "node scripts/check-changeset-presence.mjs",
"head": "9cd778d1d",
"exit": 0,
"verdict": "1 changeset declared"
},
{
"gate": "pnpm changeset:check",
"head": "9cd778d1d",
"exit": 0,
"verdict": "No changeset declares a major bump"
},
{
"gate": "node scripts/check-changeset-overwrite.mjs",
"head": "9cd778d1d",
"exit": 0,
"verdict": "No pre-existing changeset was modified or deleted"
},
{
"gate": "pnpm check:changeset-claims",
"head": "9cd778d1d",
"exit": 0,
"verdict": "pass"
},
{
"gate": "pnpm check:pending-changeset-literals",
"head": "9cd778d1d",
"exit": 0,
"verdict": "pass"
},
{
"gate": "pnpm check:doc-fences",
"head": "9cd778d1d",
"exit": 0,
"verdict": "pass"
},
{
"gate": "pnpm check:doc-types",
"head": "9cd778d1d",
"exit": 0,
"verdict": "Every documented component type is registered"
},
{
"gate": "node scripts/check-doc-links.mjs",
"head": "9cd778d1d",
"exit": 0,
"verdict": "Links are valid"
},
{
"gate": "node scripts/check-vi-mock-specifiers.mjs / check-vi-mock-override-shape.mjs / check-vi-mock-inherit.mjs / check-test-path-roots.mjs",
"head": "efa9e08f1",
"exit": 0,
"verdict": "OK x4"
},
{
"gate": "pnpm check:doc-snippets",
"head": "9cd778d1d",
"exit": 2,
"verdict": "NOT MEASURED, reason: PREREQUISITE NOT MET (scoped build of app-shell, cli, plugin-ai, ... not on disk). Input invariance measured instead: plugin-view.mdx fenced blocks byte-identical base vs head (md5 3fd26d2a..., 18 blocks)"
},
{
"gate": "pnpm check:doc-examples",
"head": "efa9e08f1",
"exit": 2,
"verdict": "NOT MEASURED, reason: PREREQUISITE NOT MET. Input invariance: 0 diff lines carry @example or a fence in packages/*/src (control: ListView.tsx carries one @example, untouched)"
}
],
"line_budget": "n/a: the diff touches no skills/** file and no line-ratcheted ledger",
"deviations": [
"File-surface increment, text only (no code, no assertion changed), each a comment or test title this flip made false: packages/core/src/utils/normalize-list-view.ts (two docblocks); packages/app-shell/src/views/ObjectView.tsx (keepInlineEditModeForTheSession docblock); packages/app-shell/src/views/ObjectView.inlineEditSessionOnly-5144.test.tsx (one test title); packages/plugin-list/src/__tests__/ListView.test.tsx (two comments); packages/plugin-view/src/__tests__/ObjectView.namedViewEditInlineFold-5144.test.tsx (docblock). The claim said stop on breach; I did not stop, because these are consequences of the flip itself (the coordinator later named them in-surface). Each is named in the PR body.",
"Test command form: the dispatch spelled pnpm --filter PKG exec vitest run; objectui AGENTS.md mandates the repo-root form (pnpm exec vitest run PATHS), and its vitest-invocation guard refuses the package-cwd form. The repo-root form was used.",
"Declared narrowing: the full @object-ui/app-shell suite was not run locally (CI runs it); the local app-shell set is every test importing InterfaceListPage, the session-only toggle pin, and four ObjectView tests that render the real ListView.",
"The shared checkout /home/user/objectui received only the os-dev rule-1 recipe writes (git fetch origin main; git worktree add -b BRANCH), which create the branch ref and worktree entry in the shared .git; no edit, commit, checkout or stash happened there. The worktree is now removed (node_modules deleted first; git worktree remove without --force succeeded).",
"The first two lock attempts for the ablation/package and type-check runs ended exit 99 (queue budget, place kept); the re-queued runs with the same slot names acquired and reached VERDICT command-exit 0. The session was later killed by an HTTP 429 limit; on resume all VERDICTs above were read from their logs and the targeted set plus app-shell type-check were re-run on the merged head."
],
"tests": "Targeted 13 files on 9cd778d1d: Test Files 13 passed (13), Tests 264 passed (264), VERDICT command-exit 0 (same on efa9e08f1). plugin-list whole package + 4 app-shell ObjectView tests on efa9e08f1: Test Files 129 passed (129), Tests 1444 passed (1444), VERDICT command-exit 0. Type-check core / plugin-list / plugin-view / app-shell exit 0, 0 error TS (app-shell re-run exit 0 on 9cd778d1d), after the dependency-closure build (28 successful). Ablation through ablation-replace.mjs from the committed head, anchor x1 → x0, blob changed, restored to the HEAD blob with git diff HEAD empty: leg A (inlineEditOffered back to ?.editInline !== true) turned ListView.permissions.test.tsx to 4 failed | 19 passed (23), exactly the four predicted absent-key cases, with WITHOUT-update staying green under both reads; leg B (interface page back to === true) turned InterfaceListPage.editInlineFold-5144.test.tsx to 2 failed | 2 passed (4), the two absent cases. Expected direction (turns red) observed; no permanent test file kept.",
"mcp_calls": "0",
"api_writes": "3 REST writes, each sent as one repository_dispatch (POST /repos/objectstack-ai/objectstack/dispatches) executed by the fleet-write relay as objectstack-fleet[bot]: (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft, PR #12092, 14400 bytes sent = stored); (2) label-write --assign marchtian → POST /repos/objectstack-ai/objectui/issues/12092/assignees (read-back matches); (3) this os-dev-report comment → POST /repos/objectstack-ai/objectui/issues/12086/comments. git push x3 (not REST). No label added: the dispatch named none and no objectui gate reads a dev-applied label.",
"open_questions": [
{
"question": "The ADR-0047 interface page wires no inline-edit toggle, so its editInline is the grid edit MODE. With !== false, an interface page that declares nothing opens its grid editable in place (double-click edit, for a principal the gate admits) rather than gaining a toggle, as the card worded it. Keep it?",
"options": [
"A keep as landed: !== false, the page opens editable in place by default; editInline: false keeps it read-only",
"B wire a session toggle on the interface page (onInlineEditChange), so it is offered and opens out of edit mode like the console object page",
"C forward editInline as offered but keep the mode off: with no toggle wired, in-place editing would be unreachable, so this is not a flip"
],
"recommendation": "A. Actual business need: it is what the card orders for this site, and it matches the spec describe (\"a user who may update the object edits a cell in place\"). Long-term soundness: the page already treats editInline as its mode, and A changes no contract. AI-error resistance: one key, one meaning on this page, declared = enforced. Start-up focus: B adds a new host wiring that nothing pulls today. B stays available if the maintainer wants toggle parity."
},
{
"question": "The unreleased .changeset/5144-editinline-fold.md says a view with neither key \"no longer offers the inline-edit toggle\" (breaking). After this PR, the same release ships the opposite default for the console grid, so the published notes would announce a removal that does not happen in net. Amend it?",
"options": [
"A leave both files; this PR's changeset states that it reverses the objectui#5144 default",
"B the seat amends the default paragraphs of .changeset/5144-editinline-fold.md before the next release (a docs-only edit of another card's changeset; check-changeset-overwrite reports it, report-only)"
],
"recommendation": "B, because release text fixes on publish. This dev left the file untouched: it is another card's declaration and outside the claim."
}
],
"out_of_scope_findings": [
"class: a · reach: exception: release-text · evidence: .changeset/5144-editinline-fold.md (pending) states neither-key grids no longer offer the toggle; after objectui#12086 the same release offers it, so the CHANGELOG entry it generates would be false in net (see open question 2) · dedupe words: 5144 changeset editInline default, pending changeset contradiction, inline edit release note",
"carrier: none (承接者:无) · noted, not filed: metadata-admin SchemaForm boolean switch renders checked={!!value} and ignores the JSON Schema default, so the View inspector shows default-true userActions toggles (search/sort/filter, and editInline once spec 18 is installed) as off while the list reads them on; read from source, no public door exercised",
"carrier: none (承接者:无) · noted, not filed: on the direct ObjectGrid path (authored object-view, named grid view, no host renderListView) editable comes from inlineEdit only and userActions.editInline is never read, so editInline: false does not withhold edit mode from a named view that also says inlineEdit: true; predates this PR, no named producer declares both keys"
]
}
The permission gate and the inlineEdit fold are unchanged.
The other ten files are pin flips and comment or test-title text that this flip made false. The dev named each one; they are in-surface consequences.
Clause-② no stands: an existing spec key's declared default is read. No prop, export or locale key is added.
The dev's open questions, answered by the seat:
The interface page wires no toggle, so its editInline is the grid's edit mode, and a page that declares nothing now opens editable in place. Answer: A, as landed. The maintainer's ruling 「乙 v18 把 spec 默认翻成 true,editInline: false 变成关法。」, the spec's describe text ("a user who may update the object edits a cell in place") and the card's literal instruction for that line all read that way. Wiring a session toggle there stays available as a separate card if the maintainer wants it.
Answer: B, corrected in this PR. The pending .changeset/5144-editinline-fold.md stated the opposite absent-key default to this release in net, and release text cannot be corrected after publishing. The before/after is now in the PR body (written by the seat); the frontmatter is byte-identical.
Changeset prose, checked sentence by sentence against the diff:
12086-edit-inline-default-on.md: "reads an absent editInline as on (!== false)", "offers the inline-edit toggle … and opens out of edit mode", "A page that declares nothing now opens its grid editable in place; editInline: false keeps it read-only", and "Unchanged: the permission gate; the inlineEdit fold; the console toggle stays session-only" all match.
The "previous release offered it there too" sentence matches the dev's reading of ListView.tsx at the parent of objectui#12036 (17.7.0), where inlineEditOffered returned false only for editInline === false.
The amended 5144-editinline-fold.md's eight changed sentences all match the merged behaviour.
The ablation legs turned red as predicted and were restored.
The patch round touched two .changeset/*.md files only. check-changeset-overwrite reports the 5144 modification, which is expected (report-only), and its declarations are identical.
Out of scope, noted, not filed (carrier none):
the View inspector's boolean switch ignores a JSON Schema default;
on the direct ObjectGrid path a named view's inlineEdit: true wins over editInline: false.
Both are read from source only, with no public-door reach.
Landing: when every check on the head is green. Spec Main Shape Gate is red for every objectui PR until objectui#12093's fix lands (folded into objectui#12085). Until then this PR stays a draft. After that it merges main, and lands through the queue once green.
The merge: through the merge queue. Its one parent is 029bdaf4, an ancestor of origin/main.
Content check:
13 of the 14 changed files are blob-identical to the landing head a733363767. They include ListView.tsx (inlineEditOffered early-outs on editInline === false), InterfaceListPage.tsx (!== false), both changesets and the pins.
content/docs/plugins/plugin-view.mdx differs from the landing head only because objectui#12094 edited the same page one commit earlier (5af42dbb). This PR's hunk is patch-equivalent to its own diff (git patch-id --stablef3a6a48a on both).
The landing head: a pure base merge of the ACCEPTed head 018710d6a5. Record 6101593433 is PASS on it.
The card: closed completed by the PR's Fixes line. pm:dispatched comes off in the label write after this comment.
Activity
objectstack-fleet commentedon Oct 10, 2026
Triage: first grade,
enhancement·priority:p1·target:v18·domain:ui·area:records·pm:blockedon objectstack-ai/objectstack#22605Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T05:59Z. ⛔ Not a claim, ⛔ not a dispatch.ListView.userActions.editInlinedefaults to true in v18 andeditInline: falseis the opt-out; objectui reads an absent key as on (maintainer ruling 2026-10-10, after objectui#5144) objectstack#22605, p1). The two halves ship the behaviour together.Blocked-by:line (the spec card). The read iseditInline !== false, with no new@objectstack/specexport, so it waits for that card's landing, not for the install face.inlineEditfold is unchanged.mainon its frozen v17 framework. There, a view that declares nothing would start offering the toggle, still under the permission gate, before cloud's spec says so. The PR states it. That is the maintainer's chosen posture, so no hold is asked for unless the measurement shows a cloud view that relied on the v17 default for a read-only list.objectstack-fleet commentedon Oct 10, 2026
Unlock scan: objectstack-ai/objectstack#22605 closed, with PR objectstack#22629 landed as
f53f14bb36.pm:blocked→pm:queueTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T09:00Z. ⛔ Not a claim, ⛔ not a dispatch.Blocked-by: none
view.zod.tsnow declareseditInline: z.boolean().default(true)(about:1544), and the skill half (objectstack PR #22630) is onmaintoo.editInline !== falseand needs no new@objectstack/specexport (6094438902). So it unlocks on the spec landing, not on the release.objectstack-fleet commentedon Oct 10, 2026
Claim: PM loop round 1
Session:
session_01B1gHb9baeX7oioD5sHVm7zAccount:
marchtianBranch:
claude/issue-12086-edit-inline-default-onWorktree:
objectui-issue-12086Domain:
domain:uiSeat:
domain:ui#3File surface:
packages/plugin-list/src/ListView.tsx(inlineEditOfferedand its Gap 2 docblock only);packages/app-shell/src/views/InterfaceListPage.tsx(theinlineEditread near:571and its comment); the pinsListView.permissions.test.tsx,normalize-list-view.inlineEditFold-5144.test.tsand the interface-page tests;content/docs/plugins/plugin-view.mdx(one table row); one changeset (stop on breach; explain in the report)Container & model:
M,mode:subagent,model: default tier — dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate"Clause-②: no
Responsibility:
n/a — not a defect cardThread-read: 6095914500
Serial constraints cleared: none. The in-flight branches of objectui#12078, #12079, #12081 and #12082 (diff file lists read at this claim) touch neither
ListView.tsx,InterfaceListPage.tsxnornormalize-list-view.ts. objectui#12084 (023f00d4, merged today) last touchedListView.tsx; the dev starts from that merged code.Clause-② is
no: the change reads an existing spec key's declared default (editInlinedefaults totrueon objectstackmain,view.zod.ts:1544, via objectstack-ai/objectstack#22605). It adds no prop, export or locale key, and it neither widens nor narrows an accept set.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
os-dev-report
{ "issue": 12086, "status": "done", "branch": "claude/issue-12086-edit-inline-default-on", "pr": "https://github.com/objectstack-ai/objectui/pull/12092", "session": "session_01B1gHb9baeX7oioD5sHVm7z", "premise_still_valid": true, "head": "9cd778d1d", "summary": "ListView inlineEditOffered now returns false only for an explicit userActions.editInline: false (an absent key reads on, the v18 default of objectstack-ai/objectstack#22605), and the ADR-0047 interface page reads inlineEdit: userActions.editInline !== false. The permission gate (the listInlineEdit affordance verdict) and the inlineEdit fold are unchanged. Pins flipped and kept load-bearing (declares nothing + update → offered; declares nothing + no update → not offered; editInline: false → not offered; stored inlineEdit: true → opens in edit mode, unchanged), the plugin-view.mdx neither-key row now reads offered / opens out of edit mode, and one minor changeset states the behaviour change. Measured mechanism: the interface page wires no toggle (no onInlineEditChange, no compactToolbar), so on that page the flip opens an undeclared grid editable in place for a permitted principal rather than adding a toggle; raised as open question 1. All three PM mechanism assumptions held (no runtime reader of the installed 17.7.0 default; the two sites were the only absent-as-off readers; no in-repo example or fixture on a ListView path relies on the old default). Branch merged origin/main de302c73 before the PR; the PR is draft and assigned to marchtian.", "files_changed": [ ".changeset/12086-edit-inline-default-on.md", "content/docs/plugins/plugin-view.mdx", "packages/app-shell/src/views/InterfaceListPage.editInlineFold-5144.test.tsx", "packages/app-shell/src/views/InterfaceListPage.relayCensus-11572.test.ts", "packages/app-shell/src/views/InterfaceListPage.tsx", "packages/app-shell/src/views/ObjectView.inlineEditSessionOnly-5144.test.tsx", "packages/app-shell/src/views/ObjectView.tsx", "packages/core/src/utils/__tests__/normalize-list-view.inlineEditFold-5144.test.ts", "packages/core/src/utils/normalize-list-view.ts", "packages/plugin-list/src/ListView.tsx", "packages/plugin-list/src/__tests__/ListView.permissions.test.tsx", "packages/plugin-list/src/__tests__/ListView.test.tsx", "packages/plugin-view/src/__tests__/ObjectView.namedViewEditInlineFold-5144.test.tsx" ], "gates": [ { "gate": "vitest targeted (13 files: 4 touched pins + 5 other InterfaceListPage* + ObjectView.inlineEditSessionOnly-5144 + 2 normalize-list-view fold tests + plugin-view named-view fold test)", "head": "9cd778d1d", "exit": 0, "verdict": "Test Files 13 passed (13), Tests 264 passed (264); VERDICT command-exit 0" }, { "gate": "vitest packages/plugin-list/ (whole package) + app-shell ObjectView.kanbanLane-8193, storedOptionsBag-10380, listUrlState-11860, viewWriteRefusal-11583", "head": "efa9e08f1", "exit": 0, "verdict": "Test Files 129 passed (129), Tests 1444 passed (1444); VERDICT command-exit 0" }, { "gate": "pnpm --filter @object-ui/core type-check", "head": "efa9e08f1", "exit": 0, "verdict": "0 error TS" }, { "gate": "pnpm --filter @object-ui/plugin-list type-check", "head": "efa9e08f1", "exit": 0, "verdict": "0 error TS" }, { "gate": "pnpm --filter @object-ui/plugin-view type-check", "head": "efa9e08f1", "exit": 0, "verdict": "0 error TS" }, { "gate": "pnpm --filter @object-ui/app-shell type-check", "head": "9cd778d1d", "exit": 0, "verdict": "0 error TS; VERDICT command-exit 0 (also exit 0 on efa9e08f1)" }, { "gate": "turbo run build, dependency closure of app-shell/plugin-view/plugin-list/core, --concurrency=2", "head": "efa9e08f1", "exit": 0, "verdict": "Tasks 28 successful, 28 total" }, { "gate": "eslint --format json on the 11 touched .ts/.tsx files", "head": "efa9e08f1", "exit": 0, "verdict": "0 errors; per-file error/warning counts identical to the base blobs (023f00d46 via --stdin); config not type-aware (no parserOptions/projectService)" }, { "gate": "pnpm check:new-line-citations", "head": "9cd778d1d", "exit": 0, "verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s)" }, { "gate": "pnpm check:control-bytes", "head": "9cd778d1d", "exit": 0, "verdict": "OK" }, { "gate": "node scripts/check-changeset-presence.mjs", "head": "9cd778d1d", "exit": 0, "verdict": "1 changeset declared" }, { "gate": "pnpm changeset:check", "head": "9cd778d1d", "exit": 0, "verdict": "No changeset declares a major bump" }, { "gate": "node scripts/check-changeset-overwrite.mjs", "head": "9cd778d1d", "exit": 0, "verdict": "No pre-existing changeset was modified or deleted" }, { "gate": "pnpm check:changeset-claims", "head": "9cd778d1d", "exit": 0, "verdict": "pass" }, { "gate": "pnpm check:pending-changeset-literals", "head": "9cd778d1d", "exit": 0, "verdict": "pass" }, { "gate": "pnpm check:doc-fences", "head": "9cd778d1d", "exit": 0, "verdict": "pass" }, { "gate": "pnpm check:doc-types", "head": "9cd778d1d", "exit": 0, "verdict": "Every documented component type is registered" }, { "gate": "node scripts/check-doc-links.mjs", "head": "9cd778d1d", "exit": 0, "verdict": "Links are valid" }, { "gate": "node scripts/check-vi-mock-specifiers.mjs / check-vi-mock-override-shape.mjs / check-vi-mock-inherit.mjs / check-test-path-roots.mjs", "head": "efa9e08f1", "exit": 0, "verdict": "OK x4" }, { "gate": "pnpm check:doc-snippets", "head": "9cd778d1d", "exit": 2, "verdict": "NOT MEASURED, reason: PREREQUISITE NOT MET (scoped build of app-shell, cli, plugin-ai, ... not on disk). Input invariance measured instead: plugin-view.mdx fenced blocks byte-identical base vs head (md5 3fd26d2a..., 18 blocks)" }, { "gate": "pnpm check:doc-examples", "head": "efa9e08f1", "exit": 2, "verdict": "NOT MEASURED, reason: PREREQUISITE NOT MET. Input invariance: 0 diff lines carry @example or a fence in packages/*/src (control: ListView.tsx carries one @example, untouched)" } ], "line_budget": "n/a: the diff touches no skills/** file and no line-ratcheted ledger", "deviations": [ "File-surface increment, text only (no code, no assertion changed), each a comment or test title this flip made false: packages/core/src/utils/normalize-list-view.ts (two docblocks); packages/app-shell/src/views/ObjectView.tsx (keepInlineEditModeForTheSession docblock); packages/app-shell/src/views/ObjectView.inlineEditSessionOnly-5144.test.tsx (one test title); packages/plugin-list/src/__tests__/ListView.test.tsx (two comments); packages/plugin-view/src/__tests__/ObjectView.namedViewEditInlineFold-5144.test.tsx (docblock). The claim said stop on breach; I did not stop, because these are consequences of the flip itself (the coordinator later named them in-surface). Each is named in the PR body.", "Test command form: the dispatch spelled pnpm --filter PKG exec vitest run; objectui AGENTS.md mandates the repo-root form (pnpm exec vitest run PATHS), and its vitest-invocation guard refuses the package-cwd form. The repo-root form was used.", "Declared narrowing: the full @object-ui/app-shell suite was not run locally (CI runs it); the local app-shell set is every test importing InterfaceListPage, the session-only toggle pin, and four ObjectView tests that render the real ListView.", "The shared checkout /home/user/objectui received only the os-dev rule-1 recipe writes (git fetch origin main; git worktree add -b BRANCH), which create the branch ref and worktree entry in the shared .git; no edit, commit, checkout or stash happened there. The worktree is now removed (node_modules deleted first; git worktree remove without --force succeeded).", "The first two lock attempts for the ablation/package and type-check runs ended exit 99 (queue budget, place kept); the re-queued runs with the same slot names acquired and reached VERDICT command-exit 0. The session was later killed by an HTTP 429 limit; on resume all VERDICTs above were read from their logs and the targeted set plus app-shell type-check were re-run on the merged head." ], "tests": "Targeted 13 files on 9cd778d1d: Test Files 13 passed (13), Tests 264 passed (264), VERDICT command-exit 0 (same on efa9e08f1). plugin-list whole package + 4 app-shell ObjectView tests on efa9e08f1: Test Files 129 passed (129), Tests 1444 passed (1444), VERDICT command-exit 0. Type-check core / plugin-list / plugin-view / app-shell exit 0, 0 error TS (app-shell re-run exit 0 on 9cd778d1d), after the dependency-closure build (28 successful). Ablation through ablation-replace.mjs from the committed head, anchor x1 → x0, blob changed, restored to the HEAD blob with git diff HEAD empty: leg A (inlineEditOffered back to ?.editInline !== true) turned ListView.permissions.test.tsx to 4 failed | 19 passed (23), exactly the four predicted absent-key cases, with WITHOUT-update staying green under both reads; leg B (interface page back to === true) turned InterfaceListPage.editInlineFold-5144.test.tsx to 2 failed | 2 passed (4), the two absent cases. Expected direction (turns red) observed; no permanent test file kept.", "mcp_calls": "0", "api_writes": "3 REST writes, each sent as one repository_dispatch (POST /repos/objectstack-ai/objectstack/dispatches) executed by the fleet-write relay as objectstack-fleet[bot]: (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft, PR #12092, 14400 bytes sent = stored); (2) label-write --assign marchtian → POST /repos/objectstack-ai/objectui/issues/12092/assignees (read-back matches); (3) this os-dev-report comment → POST /repos/objectstack-ai/objectui/issues/12086/comments. git push x3 (not REST). No label added: the dispatch named none and no objectui gate reads a dev-applied label.", "open_questions": [ { "question": "The ADR-0047 interface page wires no inline-edit toggle, so its editInline is the grid edit MODE. With !== false, an interface page that declares nothing opens its grid editable in place (double-click edit, for a principal the gate admits) rather than gaining a toggle, as the card worded it. Keep it?", "options": [ "A keep as landed: !== false, the page opens editable in place by default; editInline: false keeps it read-only", "B wire a session toggle on the interface page (onInlineEditChange), so it is offered and opens out of edit mode like the console object page", "C forward editInline as offered but keep the mode off: with no toggle wired, in-place editing would be unreachable, so this is not a flip" ], "recommendation": "A. Actual business need: it is what the card orders for this site, and it matches the spec describe (\"a user who may update the object edits a cell in place\"). Long-term soundness: the page already treats editInline as its mode, and A changes no contract. AI-error resistance: one key, one meaning on this page, declared = enforced. Start-up focus: B adds a new host wiring that nothing pulls today. B stays available if the maintainer wants toggle parity." }, { "question": "The unreleased .changeset/5144-editinline-fold.md says a view with neither key \"no longer offers the inline-edit toggle\" (breaking). After this PR, the same release ships the opposite default for the console grid, so the published notes would announce a removal that does not happen in net. Amend it?", "options": [ "A leave both files; this PR's changeset states that it reverses the objectui#5144 default", "B the seat amends the default paragraphs of .changeset/5144-editinline-fold.md before the next release (a docs-only edit of another card's changeset; check-changeset-overwrite reports it, report-only)" ], "recommendation": "B, because release text fixes on publish. This dev left the file untouched: it is another card's declaration and outside the claim." } ], "out_of_scope_findings": [ "class: a · reach: exception: release-text · evidence: .changeset/5144-editinline-fold.md (pending) states neither-key grids no longer offer the toggle; after objectui#12086 the same release offers it, so the CHANGELOG entry it generates would be false in net (see open question 2) · dedupe words: 5144 changeset editInline default, pending changeset contradiction, inline edit release note", "carrier: none (承接者:无) · noted, not filed: metadata-admin SchemaForm boolean switch renders checked={!!value} and ignores the JSON Schema default, so the View inspector shows default-true userActions toggles (search/sort/filter, and editInline once spec 18 is installed) as off while the list reads them on; read from source, no public door exercised", "carrier: none (承接者:无) · noted, not filed: on the direct ObjectGrid path (authored object-view, named grid view, no host renderListView) editable comes from inlineEdit only and userActions.editInline is never read, so editInline: false does not withhold edit mode from a named view that also says inlineEdit: true; predates this PR, no named producer declares both keys" ] }objectstack-fleet commentedon Oct 10, 2026
ACCEPT — PR objectui#12092 (head
018710d6a5) ·domain:uiseat 3,session_01B1gHb9baeX7oioD5sHVm7z, 2026-10-10T13:10ZReviewed against GitHub and the diff, not the reports (round 1
6097777181; patch round delivered to the seat).Shape:
main.Fixes #12086, andClause-②: nosits at the start of a line.marchtian.Scope: 14 files, +163/−117. Nothing touches
content/docs/releases/. NOT GOVERNED.The code against the card:
ListView.inlineEditOfferednow returns false only foruserActions.editInline === false(it was!== true).InterfaceListPagereadsuserActions.editInline !== false.inlineEditfold are unchanged.Clause-②
nostands: an existing spec key's declared default is read. No prop, export or locale key is added.The dev's open questions, answered by the seat:
editInlineis the grid's edit mode, and a page that declares nothing now opens editable in place. Answer: A, as landed. The maintainer's ruling 「乙 v18 把 spec 默认翻成 true,editInline: false 变成关法。」, the spec's describe text ("a user who may update the object edits a cell in place") and the card's literal instruction for that line all read that way. Wiring a session toggle there stays available as a separate card if the maintainer wants it..changeset/5144-editinline-fold.mdstated the opposite absent-key default to this release in net, and release text cannot be corrected after publishing. The before/after is now in the PR body (written by the seat); the frontmatter is byte-identical.Changeset prose, checked sentence by sentence against the diff:
12086-edit-inline-default-on.md: "reads an absenteditInlineas on (!== false)", "offers the inline-edit toggle … and opens out of edit mode", "A page that declares nothing now opens its grid editable in place;editInline: falsekeeps it read-only", and "Unchanged: the permission gate; theinlineEditfold; the console toggle stays session-only" all match.ListView.tsxat the parent of objectui#12036 (17.7.0), whereinlineEditOfferedreturned false only foreditInline === false.5144-editinline-fold.md's eight changed sentences all match the merged behaviour.minor, with nomajor.Gates:
.changeset/*.mdfiles only.check-changeset-overwritereports the 5144 modification, which is expected (report-only), and its declarations are identical.Out of scope, noted, not filed (carrier none):
ObjectGridpath a named view'sinlineEdit: truewins overeditInline: false.Both are read from source only, with no public-door reach.
Landing: when every check on the head is green.
Spec Main Shape Gateis red for every objectui PR until objectui#12093's fix lands (folded into objectui#12085). Until then this PR stays a draft. After that it mergesmain, and lands through the queue once green.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
Landed: PR objectui#12092 →
main5330afd1·domain:uiseat 3,session_01B1gHb9baeX7oioD5sHVm7z, 2026-10-10T20:18Z029bdaf4, an ancestor oforigin/main.a733363767. They includeListView.tsx(inlineEditOfferedearly-outs oneditInline === false),InterfaceListPage.tsx(!== false), both changesets and the pins.content/docs/plugins/plugin-view.mdxdiffers from the landing head only because objectui#12094 edited the same page one commit earlier (5af42dbb). This PR's hunk is patch-equivalent to its own diff (git patch-id --stablef3a6a48aon both).018710d6a5. Record6101593433is PASS on it.completedby the PR'sFixesline.pm:dispatchedcomes off in the label write after this comment.6097843854.Generated by Claude Code
feat(plugin-list,app-shell): read an absent userActions.editInline as…