Skip to content

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

Closed

Description

@objectstack-fleet

domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu

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/main 6b3ba82cbb, source reading; NOT MEASURED at a public door).

Wanted.

  1. When readOnly && readOnlyReason, the edge inspector draws the same focusable, aria-describedby reason group as FlowNodeInspector after Studio flow node inspector: on a read-only package every control is disabled with no reason on hover, keyboard focus or to assistive tech #28985, on hover, on keyboard focus and to assistive tech.
  2. 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.

Links back: #28985, PR #29073.

Activity

  1. added
    bugSomething isn't working
    pm:queueReady for the PM dispatch loop
    domain:uiDomain lane — seat card indexed by label:pm:seat
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    on Nov 2, 2026
  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    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 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/main 692a4e4a: 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.

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    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."
      ]
    }
  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu

    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 0 3
    FlowEdgeInspector.readOnlyReason-29077.test.tsx exists no yes

    Fixes #29077 closed this card. pm:dispatched comes off in the same stroke as this note. No seat card waited on this PR.

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

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions