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 flow edge inspector: on a read-only package the edge controls are disabled with no reason, and the readOnlyReason its host hands it after #28985 is ignored #29077
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. On a read-only package, an administrator who selects a flow edge (not a node) in Studio sees every edge control greyed with no reason on hover, on keyboard focus or to assistive tech. #28985 fixes the same defect for the node inspector; the edge inspector sits beside it on the same canvas and is left behind, so ux-conventions.disabled-control-reason still fails on that surface.
Measured (origin/main6b3ba82cbb, source reading; NOT MEASURED at a public door).
ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowEdgeInspector.tsx:223,232,239,270,287,348,370: each control is disabled={readOnly}, with no aria-describedby, title or focusable described wrapper.
Hosts that pass no reason are unchanged. No new key or option.
Tests. A read-only edge with a reason: the disabled controls are described and the group is focusable. Without a reason: unchanged. A test that fails on main.
Reader.domain:ui. Size S. Waits for PR #29073 (#28985) to land, since it reads the prop that PR adds.
Dedupe. Searched FlowEdgeInspector, flow edge inspector disabled reason: only #28985.
Claim: PM loop round 19 · 2026-11-02T08:45Z
Session: session_01QsR2jU7NRnC2NpRec6yEYE (card thread, os-dev); dispatched by seat session session_01QsR2jUJ19MstFvFhjgiYTu
Account: zhuangjianguo
Branch: claude/project-thread-1r2gue (platform-assigned to the card thread; it can push only this branch)
Worktree: objectstack-issue-29077
Domain: domain:ui
Seat: domain:ui#1
File surface: under ui/packages/app-shell/src/views/: metadata-admin/inspectors/_shared.tsx (a new InspectorReadOnlyReason lifted from FlowNodeInspector, not reachable from the package entry), metadata-admin/inspectors/FlowNodeInspector.tsx (same DOM, using the shared group), metadata-admin/inspectors/FlowEdgeInspector.tsx, a new FlowEdgeInspector.readOnlyReason-29077.test.tsx, and the host case in studio-design/StudioDesignSurface.automationsReadOnly-11124.test.tsx; plus a root .changeset (patch, @object-ui/app-shell). ResourceEditPage is #29079'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: the flow edge inspector describes its disabled controls with the host readOnlyReason (focusable, aria-describedby), as FlowNodeInspector does since #28985; hosts with no reason unchanged
Thread-read: 6571680968
Premise: holds (at origin/main692a4e4a: the card reads FlowEdgeInspector.tsx disabled={readOnly} with no description; the dev re-measures on main before code)
Serial constraints cleared: #28985 landed as fea2dbb7 (PR #29073), which adds readOnlyReason.
{
"issue": 29077,
"status": "done",
"branch": "claude/project-thread-1r2gue",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29206",
"session": "session_01QsR2jU7NRnC2NpRec6yEYE",
"premise_still_valid": true,
"summary": "Measured at origin/main 0d6d4061: FlowEdgeInspector never read readOnlyReason, though AutomationsPillar passes it to the registered FlowInspector, which spreads it into the edge panel; every edge control was disabled with no description or tab stop. FlowNodeInspector's inline reason group (#28985) is lifted into one InspectorReadOnlyReason in inspectors/_shared.tsx (not reachable from the package entry). The node panel uses it with an identical DOM, and the edge panel wraps itself in it, named by flowEdgeDisplayName. Hosts with no reason, a blank reason, or a writable panel are unchanged. Claim 6572861977; declarations copied verbatim (Clause-② no, Metadata-protocol none), and measurement agrees.",
"tests": "Head f844add6. From ui/: FlowEdgeInspector.readOnlyReason-29077 (new, 6) + StudioDesignSurface.automationsReadOnly-11124 (1 new host case) + FlowNodeInspector.readOnlyReason-28985 (unchanged): 3 files, 23/23. Red on base: the same three files with _shared.tsx, FlowNodeInspector.tsx and FlowEdgeInspector.tsx restored from 0d6d4061 gave 4 failed, 19 passed: the 3 edge reason cases + the host edge case fail on the missing group, and all node cases pass (node DOM unchanged). Restored with git checkout HEAD, and git diff HEAD is empty. Sweep: 120 app-shell test files naming FlowEdge/FlowNode/FlowInspector, AutomationsPillar, InspectorShell, _shared or flowNodeLabels, in 3 locked batches at --maxWorkers=2, all on f844add6: 38/38 (425), 42/42 (580), 41/41 (339). The first run on 07c2c014 caught flowNodeLabels.sites-13200.test.ts, which pins the edge title expression title={flowEdgeDisplayName(edge, nodes, locale)}. f844add6 keeps that expression and passes the same call as the group label. turbo type-check @object-ui/app-shell: 65/65. eslint on the 5 changed ui files: 0 errors (13 warnings, all on existing lines). Narrowed on purpose: CI Test UI runs the rest of app-shell. No ablation: the red-on-base run is the one-shot proof (source files, no dist resolution).",
"gates": "dispatch-gates --commands derived 34; all 34 exit 0 on f844add6 (PR-body gates with the final body as GITHUB_EVENT_PATH: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity; check-partof-closing-keyword with PR_BODY exit 0; check-sdui-manifest exit 0; pnpm --dir ui exec vitest run scripts/ locked: 169 passed, 2 skipped, 4900 tests). dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. check:new-line-citations (ui): 0 new. CI check-runs on #29206: in_progress at report time; re-runs and landing are the seat's.",
"dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
"mcp_calls": "3 reads: issue_read get, issue_read get_comments x2 on #29077. No MCP writes. The harness asked for assignee/reviewer via MCP issue_write/update_pull_request; skipped per os-dev (no assignees on a dev PR, GitHub writes only via scripts/pm).",
"api_writes": "2: git push to claude/project-thread-1r2gue (07c2c014, f844add6); fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches → run 41420022263, PR #29206, body read back identical 7268 bytes, assignees none, labels none). Plus this os-dev-report comment via post-stamped.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed. The same reason group is still inlined in StudioDesignSurface (field rail and others), ObjectValidationsPanel, FlowLedgerSwitch, ObjectFieldInspector (per-control locks), DeclaredActionsBar and MarketplacePackagePage. Each could adopt InspectorReadOnlyReason when next touched (drift, not a defect class); recorded in the PR's Acceptance notes."
]
}
Landed · 2026-11-02T10:41Z · PR #29206 merged through the merge queue as 987ef87f at 2026-11-02T10:40Z (GitHub's clock). ACCEPT 6573847376 at head f844add6.
probe
before (987ef87f~1)
now (origin/main)
InspectorReadOnlyReason in ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowEdgeInspector.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:35Z
⛔ 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:45Z
Session:
session_01QsR2jU7NRnC2NpRec6yEYE(card thread, os-dev); dispatched by seat sessionsession_01QsR2jUJ19MstFvFhjgiYTuAccount:
zhuangjianguoBranch:
claude/project-thread-1r2gue(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29077Domain:
domain:uiSeat:
domain:ui#1File surface: under
ui/packages/app-shell/src/views/:metadata-admin/inspectors/_shared.tsx(a newInspectorReadOnlyReasonlifted fromFlowNodeInspector, not reachable from the package entry),metadata-admin/inspectors/FlowNodeInspector.tsx(same DOM, using the shared group),metadata-admin/inspectors/FlowEdgeInspector.tsx, a newFlowEdgeInspector.readOnlyReason-29077.test.tsx, and the host case instudio-design/StudioDesignSurface.automationsReadOnly-11124.test.tsx; plus a root.changeset(patch,@object-ui/app-shell).ResourceEditPageis #29079'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: the flow edge inspector describes its disabled controls with the host readOnlyReason (focusable, aria-describedby), as FlowNodeInspector does since #28985; hosts with no reason unchanged
Thread-read: 6571680968
Premise: holds (at
origin/main692a4e4a: the card reads FlowEdgeInspector.tsx disabled={readOnly} with no description; the dev re-measures on main before code)Serial constraints cleared: #28985 landed as
fea2dbb7(PR #29073), which adds readOnlyReason.objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jU7NRnC2NpRec6yEYE
os-dev-report
{ "issue": 29077, "status": "done", "branch": "claude/project-thread-1r2gue", "pr": "https://github.com/objectstack-ai/objectstack/pull/29206", "session": "session_01QsR2jU7NRnC2NpRec6yEYE", "premise_still_valid": true, "summary": "Measured at origin/main 0d6d4061: FlowEdgeInspector never read readOnlyReason, though AutomationsPillar passes it to the registered FlowInspector, which spreads it into the edge panel; every edge control was disabled with no description or tab stop. FlowNodeInspector's inline reason group (#28985) is lifted into one InspectorReadOnlyReason in inspectors/_shared.tsx (not reachable from the package entry). The node panel uses it with an identical DOM, and the edge panel wraps itself in it, named by flowEdgeDisplayName. Hosts with no reason, a blank reason, or a writable panel are unchanged. Claim 6572861977; declarations copied verbatim (Clause-② no, Metadata-protocol none), and measurement agrees.", "tests": "Head f844add6. From ui/: FlowEdgeInspector.readOnlyReason-29077 (new, 6) + StudioDesignSurface.automationsReadOnly-11124 (1 new host case) + FlowNodeInspector.readOnlyReason-28985 (unchanged): 3 files, 23/23. Red on base: the same three files with _shared.tsx, FlowNodeInspector.tsx and FlowEdgeInspector.tsx restored from 0d6d4061 gave 4 failed, 19 passed: the 3 edge reason cases + the host edge case fail on the missing group, and all node cases pass (node DOM unchanged). Restored with git checkout HEAD, and git diff HEAD is empty. Sweep: 120 app-shell test files naming FlowEdge/FlowNode/FlowInspector, AutomationsPillar, InspectorShell, _shared or flowNodeLabels, in 3 locked batches at --maxWorkers=2, all on f844add6: 38/38 (425), 42/42 (580), 41/41 (339). The first run on 07c2c014 caught flowNodeLabels.sites-13200.test.ts, which pins the edge title expression title={flowEdgeDisplayName(edge, nodes, locale)}. f844add6 keeps that expression and passes the same call as the group label. turbo type-check @object-ui/app-shell: 65/65. eslint on the 5 changed ui files: 0 errors (13 warnings, all on existing lines). Narrowed on purpose: CI Test UI runs the rest of app-shell. No ablation: the red-on-base run is the one-shot proof (source files, no dist resolution).", "gates": "dispatch-gates --commands derived 34; all 34 exit 0 on f844add6 (PR-body gates with the final body as GITHUB_EVENT_PATH: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity; check-partof-closing-keyword with PR_BODY exit 0; check-sdui-manifest exit 0; pnpm --dir ui exec vitest run scripts/ locked: 169 passed, 2 skipped, 4900 tests). dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. check:new-line-citations (ui): 0 new. CI check-runs on #29206: in_progress at report time; re-runs and landing are the seat's.", "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm", "mcp_calls": "3 reads: issue_read get, issue_read get_comments x2 on #29077. No MCP writes. The harness asked for assignee/reviewer via MCP issue_write/update_pull_request; skipped per os-dev (no assignees on a dev PR, GitHub writes only via scripts/pm).", "api_writes": "2: git push to claude/project-thread-1r2gue (07c2c014, f844add6); fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches → run 41420022263, PR #29206, body read back identical 7268 bytes, assignees none, labels none). Plus this os-dev-report comment via post-stamped.", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed. The same reason group is still inlined in StudioDesignSurface (field rail and others), ObjectValidationsPanel, FlowLedgerSwitch, ObjectFieldInspector (per-control locks), DeclaredActionsBar and MarketplacePackagePage. Each could adopt InspectorReadOnlyReason when next touched (drift, not a defect class); recorded in the PR's Acceptance notes." ] }objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Landed · 2026-11-02T10:41Z · PR #29206 merged through the merge queue as
987ef87fat 2026-11-02T10:40Z (GitHub's clock). ACCEPT 6573847376 at headf844add6.987ef87f~1)origin/main)InspectorReadOnlyReasoninui/packages/app-shell/src/views/metadata-admin/inspectors/FlowEdgeInspector.tsxFlowEdgeInspector.readOnlyReason-29077.test.tsxexistsFixes #29077closed this card.pm:dispatchedcomes off in the same stroke as this note. No seat card waited on this PR.