You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Studio metadata editor page: the flow node inspector on /studio/PKG/metadata/flow/NAME is read-only with no reason, because ResourceEditPage folds three causes into formReadOnly and passes no readOnlyReason #29079
Filing gate: ② out-of-scope finding, class a, from the #28985 os-dev-report (PR #29073, report 6571078597) · filed by domain:ui#1 · ⛔ Not a claim. No grade: triage sets it.
Business reason. A flow also opens on the metadata editor page (/studio/PKG/metadata/flow/NAME, ResourceEditPage). There the node inspector can be read-only for three different reasons: the user cannot write, a walled decision is pending, or the page is in view mode and not editing yet. After #28985 the Studio flow canvas explains its read-only state, but this page still greys the inspector with no reason, and each cause needs its own sentence (view mode should point at "Edit", not at switching packages).
Measured (origin/main6b3ba82cbb, source reading; NOT MEASURED at a public door).
ui/packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx:2571: formReadOnly = readOnly || walledDeciding || (!editing && !createMode), passed as readOnly to the inspectors (:3468, :3492, :3511, :3525, :3553) with no reason.
ResourceEditPage passes a readOnlyReason that names the cause in force: no write access, a pending walled decision, or view mode (with the way to start editing).
The inspectors that honor readOnlyReason show it; others are unchanged. No new metadata key or option; new UI strings go through the i18n packs.
Tests. Each of the three causes shows its own sentence on the node inspector; an editable page shows none. A test that fails on main.
Reader.domain:ui. Size S to M. Waits for PR #29073 (#28985) to land.
Dedupe. Searched ResourceEditPage read-only reason, FlowEdgeInspector: only #28985 and unrelated closed cards.
Claim: PM loop round 19 · 2026-11-02T08:46Z
Session: session_01QsR2jUgMp6a6PrErVUDx8h (card thread, os-dev); dispatched by seat session session_01QsR2jUJ19MstFvFhjgiYTu
Account: zhuangjianguo
Branch: claude/project-thread-bh1y5h (platform-assigned to the card thread; it can push only this branch)
Worktree: objectstack-issue-29079
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx (the readOnlyReason it passes to the inspectors), the reason strings in the i18n packs, their tests, and a root .changeset. Any other file is declared by a claim amendment before code. FlowEdgeInspector.tsx and inspectors/_shared.tsx are #29077's (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: ResourceEditPage passes a readOnlyReason naming the cause in force (no write access, a pending walled decision, or view mode pointing at Edit), which the flow node inspector draws since #28985; an editable page shows none
Thread-read: 6571602616
Premise: holds (at origin/main692a4e4a: the card reads ResourceEditPage.tsx:2571 formReadOnly passed as readOnly with no reason; the dev re-measures on main before code. Clause-② is re-read once the strings land and any change goes in a claim amendment)
Serial constraints cleared: #28985 landed as fea2dbb7 (PR #29073). #29077 (in build) owns FlowEdgeInspector and _shared.tsx.
{
"issue": 29079,
"status": "done",
"branch": "claude/project-thread-bh1y5h",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29203",
"session": "session_01QsR2jUgMp6a6PrErVUDx8h",
"premise_still_valid": true,
"summary": "ResourceEditPage now derives inspectorReadOnlyReason beside formReadOnly and passes it to the scoped inspector as readOnlyReason: the sentence the page's own notice gives for the cause in force, in the notices' order (walled catalog; read-only package; lock + served lockReason; declaration-only; no manage_metadata; code-package item; runtime read-only type). No new string, so no i18n file; Clause-② no, Metadata-protocol none as claimed. Premise corrected in part (seat accepted the shape before code): of the card's three causes only 'no write access' reaches the flow node inspector on this page. Walled applies only to position/permission/capability, which register no scoped inspector (pinned via a host inspector for position). View mode is unreachable: the inspector exists only beside a designer canvas, a designer type auto-enters editing while writable and has no Edit button, so view mode passes no reason. MetadataDefaultInspectorProps is unchanged.",
"tests": "New ResourceEditPage.inspectorReadOnlyReason-29079.test.tsx, 6 cases (real page, gates and FlowInspector to FlowNodeInspector; canvases stubbed only to emit a selection): head 162f85c0 6/6 passed; on main 87d6baef 5 failed / 1 passed (only the writable control passes). Ablation via scripts/ablation-replace.mjs deleting the readOnlyReason={inspectorReadOnlyReason} line (anchor 1 to 0, blob 9e74e863 to 5d2abee0): 5 failed / 1 passed; restored, blob == HEAD, git diff HEAD empty. Sweep of the 120 ui test files naming ResourceEditPage / MetadataResourceEditPage / readOnlyReason, three locked batches at --maxWorkers=2: 40/40 (364 tests), 40/40 (204), 40/40 (547); narrowed on purpose, CI Test UI runs the rest. turbo type-check @object-ui/app-shell: 65/65 tasks. eslint on the two changed ui files: 0 errors, 51 warnings (same count as ResourceEditPage.tsx on main; none in the new test). No dist build or alias question: the test imports the page from src.",
"gates": "dispatch-gates --commands derived 34 families on 162f85c0; all 34 exit 0 (33 unlocked with the final PR body as the event; pnpm --dir ui exec vitest run scripts/ locked: 169 passed, 2 skipped, 4900 tests). dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED. check-partof-closing-keyword on the body: exit 0. check:new-line-citations: 0 new. PR check-runs at report time on 162f85c0: 14 in_progress, 3 queued, 3 skipped, none concluded; mergeable_state blocked (draft, checks pending).",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, run 41419352971); os-dev-report comment via post-stamped on #29079",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed — MetadataDefaultInspectorProps (the no-selection default inspector) declares no readOnlyReason, so a read-only default inspector on this page still shows no reason; widening it is a Clause-② yes (widening) change of its own. Not a defect class a/b/c without a measured default inspector that disables controls with no reason; dedupe words: default inspector readOnlyReason, MetadataDefaultInspectorProps reason"
]
}
Landed · 2026-11-02T10:35Z · PR #29203 merged through the merge queue as 47ee57fe at 2026-11-02T10:35Z (GitHub's clock). ACCEPT 6573717105 at head 162f85c0.
probe
before (47ee57fe~1)
now (origin/main)
inspectorReadOnlyReason in ui/packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: ux-conventions.disabled-control-reason
Triage: p2 · 2026-11-02T07:30Z
⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim: PM loop round 19 · 2026-11-02T08:46Z
Session:
session_01QsR2jUgMp6a6PrErVUDx8h(card thread, os-dev); dispatched by seat sessionsession_01QsR2jUJ19MstFvFhjgiYTuAccount:
zhuangjianguoBranch:
claude/project-thread-bh1y5h(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29079Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx(thereadOnlyReasonit passes to the inspectors), the reason strings in the i18n packs, their tests, and a root.changeset. Any other file is declared by a claim amendment before code.FlowEdgeInspector.tsxandinspectors/_shared.tsxare #29077's (stop on breach; explain in the report)Container & model: S,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: ResourceEditPage passes a readOnlyReason naming the cause in force (no write access, a pending walled decision, or view mode pointing at Edit), which the flow node inspector draws since #28985; an editable page shows none
Thread-read: 6571602616
Premise: holds (at
origin/main692a4e4a: the card reads ResourceEditPage.tsx:2571 formReadOnly passed as readOnly with no reason; the dev re-measures on main before code. Clause-② is re-read once the strings land and any change goes in a claim amendment)Serial constraints cleared: #28985 landed as
fea2dbb7(PR #29073). #29077 (in build) owns FlowEdgeInspector and _shared.tsx.objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUgMp6a6PrErVUDx8h
os-dev-report
{ "issue": 29079, "status": "done", "branch": "claude/project-thread-bh1y5h", "pr": "https://github.com/objectstack-ai/objectstack/pull/29203", "session": "session_01QsR2jUgMp6a6PrErVUDx8h", "premise_still_valid": true, "summary": "ResourceEditPage now derives inspectorReadOnlyReason beside formReadOnly and passes it to the scoped inspector as readOnlyReason: the sentence the page's own notice gives for the cause in force, in the notices' order (walled catalog; read-only package; lock + served lockReason; declaration-only; no manage_metadata; code-package item; runtime read-only type). No new string, so no i18n file; Clause-② no, Metadata-protocol none as claimed. Premise corrected in part (seat accepted the shape before code): of the card's three causes only 'no write access' reaches the flow node inspector on this page. Walled applies only to position/permission/capability, which register no scoped inspector (pinned via a host inspector for position). View mode is unreachable: the inspector exists only beside a designer canvas, a designer type auto-enters editing while writable and has no Edit button, so view mode passes no reason. MetadataDefaultInspectorProps is unchanged.", "tests": "New ResourceEditPage.inspectorReadOnlyReason-29079.test.tsx, 6 cases (real page, gates and FlowInspector to FlowNodeInspector; canvases stubbed only to emit a selection): head 162f85c0 6/6 passed; on main 87d6baef 5 failed / 1 passed (only the writable control passes). Ablation via scripts/ablation-replace.mjs deleting the readOnlyReason={inspectorReadOnlyReason} line (anchor 1 to 0, blob 9e74e863 to 5d2abee0): 5 failed / 1 passed; restored, blob == HEAD, git diff HEAD empty. Sweep of the 120 ui test files naming ResourceEditPage / MetadataResourceEditPage / readOnlyReason, three locked batches at --maxWorkers=2: 40/40 (364 tests), 40/40 (204), 40/40 (547); narrowed on purpose, CI Test UI runs the rest. turbo type-check @object-ui/app-shell: 65/65 tasks. eslint on the two changed ui files: 0 errors, 51 warnings (same count as ResourceEditPage.tsx on main; none in the new test). No dist build or alias question: the test imports the page from src.", "gates": "dispatch-gates --commands derived 34 families on 162f85c0; all 34 exit 0 (33 unlocked with the final PR body as the event; pnpm --dir ui exec vitest run scripts/ locked: 169 passed, 2 skipped, 4900 tests). dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED. check-partof-closing-keyword on the body: exit 0. check:new-line-citations: 0 new. PR check-runs at report time on 162f85c0: 14 in_progress, 3 queued, 3 skipped, none concluded; mergeable_state blocked (draft, checks pending).", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, run 41419352971); os-dev-report comment via post-stamped on #29079", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed — MetadataDefaultInspectorProps (the no-selection default inspector) declares no readOnlyReason, so a read-only default inspector on this page still shows no reason; widening it is a Clause-② yes (widening) change of its own. Not a defect class a/b/c without a measured default inspector that disables controls with no reason; dedupe words: default inspector readOnlyReason, MetadataDefaultInspectorProps reason" ] }objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Landed · 2026-11-02T10:35Z · PR #29203 merged through the merge queue as
47ee57feat 2026-11-02T10:35Z (GitHub's clock). ACCEPT 6573717105 at head162f85c0.47ee57fe~1)origin/main)inspectorReadOnlyReasoninui/packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsxResourceEditPage.inspectorReadOnlyReason-29079.test.tsxexistsFixes #29079closed this card.pm:dispatchedcomes off in the same stroke as this note. No seat card waited on this PR.