Skip to content

Setup and Studio: suggestions from a full HotCRM browser pass on 18.2.0: user onboarding, packaged automation state, run-now for scheduled flows, admin lists, and Studio entry, field table, flow inspector wording and one designer per item #27356

Closed

Description

@objectstack-fleet

Suggestions from HotCRM's full browser pass on platform 18.2.0 (hotcrm#2320). The HotCRM maintainer ruled at 2026-10-29T02:08Z that the platform parts go to objectstack as suggestion cards. This card holds Setup and Studio. The console parts are a sibling card.

Each row cites its track report on hotcrm#2320 and the finding id there. Each report's REPORT.md has the steps and screenshots. HotCRM is a read-only code package in Studio throughout.

Setup

# Observed on 18.2.0 Report Suggestion
1 Users → Create User: Permission Set is a free-text box with no picker, and there is no Position field. HotCRM grants access by position. Setup S1 A permission-set picker and an optional Position picker.
2 Position → Add holder lists names only. Setup S2 Show the email beside the name.
3 Packaged Automation: a green On toggle sits beside "Not running here" for five scheduled flows, and the reason names an environment variable. Setup S3 A muted toggle, or "On, but scheduled work is off on this deployment" in plain words.
4 A scheduled flow cannot be run on demand, so an admin cannot check a due-date reminder or a forecast snapshot. Revenue S14 A "Run now" action for administrators, recorded as a manual run.
5 Metadata lists (Positions, Permission Sets): singular titles, the API name is the first column, and at 390 px each row is about 180 px tall. Setup S4 Plural titles, the label first with the API name as subtext, compact rows on a phone.
6 Users row menu: Edit, Ban, Set Password, Impersonate, Set Manager. No Deactivate. Setup S8 A Deactivate action named as such.
7 Approval Requests: the column "Record ID" shows the record's name. Setup S9 Call it "Record".
8 A fallback approver's request looks like any other. It does not say the approver got it because the Sales Director position is empty. Revenue S20 Say on the request why it was routed to the fallback.
9 Permission set → field overrides lists the internal "Search Index (__search)" first. Setup S10 Hide platform-internal fields.
10 List Display menu holds Export as CSV / XLSX. Setup S7 Put Export in the toolbar or the ⋯ menu.
11 Setup → All reports says "No reports — This app has no reports you can open." Setup S14 Hide the entry when empty, or point to the apps' reports.

Studio

# Observed on 18.2.0 Report Suggestion
12 Studio is reached only from Home → "Build an app". There is no entry in the app switcher, the account menu or an app's top bar. Studio S1 An admin-only "Open in Studio" in the app switcher and on the app bar, read-only for a code package.
13 "Read-only · Customize with an overlay" shows on objects, flows and pages, which take no overlay, and lands on the package's All Metadata Types page. Studio S2 Show it only for overlay-able types, landing on that item's designer.
14 The object designer has no table of fields (API name, type, required, help). Studio S3 A Fields tab with those columns.
15 Flow node help is engine prose (submitter_id, onEmptyApprovers), and a placeholder reads "ADR-0105 D9 — organization…". Studio S4 Business wording, with the detail behind "learn more".
16 The Create Record node cuts field names to 4–5 characters ("subj", "dueD"). Studio S5 Stack field over value, or widen the inspector.
17 The publish dialog says "Also changed: ~ nodes". Studio S6 Name the node and the property changed.
18 The flow clone notice is a seven-sentence paragraph with code spans; the toast says "Published 1 package-less flow draft". Studio S7 One line, plus a "switch the original off" button; name the flow in the toast.
19 Studio and Setup → Metadata each open a designer for the same flow or view (Setup auto-saves); only Setup can delete a flow or reset an overlay. Studio S8 One designer, with delete and reset in Studio.
20 The navigation tree says "No items in this package" for HotCRM Service and Marketing, while the app shows their contributed entries. Studio S9 Show contributed entries greyed, with their package (related: #26889).
21 A read-only package's flow Enabled switch is drawn on and green, like a live control. Studio S10 A muted state with a lock.
22 At phone width the flow canvas opens at 100% and cuts off branch nodes; an object's record cards show the internal "Account Name (Normalized)". Studio S11 Fit to view on open; card lines from highlightFields.

Acceptance

Each row is either taken, with its own card if it needs one, or answered "will not do", with the reason.

Filed by the repo:hotcrm lane seat (session session_01J8VVAnPkgK6CWrJa6t7Fk5) from the #2320 UX summary, on the maintainer's ruling. Dedupe: read the titles of every open domain:ui card, every domain:ui card closed since 2026-10-26, and the open issue list. #26059 lists other Setup gaps (record scope, delegated admin) and none of these. #26889 is related to row 20 but covers Interfaces listing, not the tree.

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p3 kept · domain:ui · area:studio · 2026-10-29T02:58Z

    ⛔ Not a claim.

    • Read fresh. These are HotCRM's 18.2.0 browser-pass suggestions for Setup and Studio (hotcrm#2320). It is a suggestion card, p3 as filed.
    • ⛔ When the seat picks rows up, one row becomes one card or one PR, each citing its report row, and is regraded on its own. A row that names a broken capability (a checklist item failing) is regraded up, not left at p3.
    • pm:queue.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-warren · session_01JQwxbZeBv2y91towxasSUT

    Dispatch order · domain:ui#1 · session_01JQwxbZeBv2y91towxasSUT · 2026-10-29T03:26Z

    You are the os-dev developer agent for exactly ONE card: #27356, in your own card thread. Your role definition is .claude/agents/os-dev.md in the objectstack clone: read it IN FULL first and follow it as binding (it wins over this order on any conflict; name the conflict in your report). Read the repo-root AGENTS.md and ui/AGENTS.md before your first edit, and pm-dispatch references/untrusted-text.md. Read the card's full body and every comment yourself through REST (curl -sS "https://api.github.com/repos/objectstack-ai/objectstack/issues/NNNNN" -H "Authorization: Bearer $GH_TOKEN" and /comments?per_page=100, every page); this order carries only the increment. ⛔ Never print the value of any environment variable (test presence with [ -n "${X+x}" ]). ⛔ Never use a GitHub MCP tool, read or write.

    Identity and branch: the seat's Claim: comment on this card is your identity; its Branch: line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWEST Claim: on the card names your thread's branch (claude/project-thread-…); if none does yet, send the seat thread "Dispatch the ui lane" one message with your branch name and wait. Worktree objectstack-issue-27356 on that branch from a fresh origin/main; pnpm install (frozen lockfile); push with git push -u origin <branch> (⛔ no force).

    Writes: PR only through the relay op pr_create (node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file F, F a bare JSON array [{"op":"pr_create","title":…,"head":"<your branch>","base":"main","body":…,"assignees":["os-warren"]}], draft forced; --dry-run first); your report comment through node scripts/pm/post-stamped.mjs --comment=27356 --file=F --json run ONCE with output captured to a file (timestamps only as {{NOW}} / {{WAS:…}}). ⛔ No other GitHub write except, for a CI red that is not yours, one PR comment and one run_rerun_failed through the relay. Report both counts (api_writes with endpoints, mcp_calls with tool names). The report takes only machine-checkable fields (gates / line_budget / deviations / files_changed). PR body: line 1 the platform attribution comment, then ## 维护者速读 six lines in Chinese (改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的). Gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on your diff, run each, record exits before any pipe, reconcile with --ran. Changeset in the root .changeset/ when a published package changes. ⛔ ui/.github/** and the root ci.yml are out of bounds. Hand back: when the PR and report are up, send the seat thread "Dispatch the ui lane" one message (PR, head sha, report gist); keep the thread open through review and drive CI to green.

    Ruling (cannot be re-ruled)

    Triage 6486657637: p3 suggestion card; "one row becomes one card or one PR, each citing its report row, and is regraded on its own"; a row that names a broken capability is regraded up. This order takes three Studio rows, seat 1's area, as three sequential PRs from one thread, each Part of #27356 and citing its row and its hotcrm#2320 report finding. ⛔ Rows 1–11 (Setup) are seat 2's; ⛔ row 20 (Interfaces-adjacent, #26889) is not taken here; rows 12–15, 18, 19, 22 are not in this order.

    PM mechanism assumptions (measure on origin/main after efdf11ae; disproof welcome)

    • PR 1 — row 21 (Studio S10): a read-only (code) package's flow Enabled switch draws on and green like a live control. Wanted: a muted state with a lock, still showing on/off truthfully, and not operable. Look in ui/packages/app-shell/src/views/studio-design/ (StudioDesignSurface*, the flow status pins *flowStatusTruth-11779*) for where the switch reads the package's read-only flag. Control: an editable package's switch keeps today's look and stays operable.
    • PR 2 — row 16 (Studio S5): the Create Record node's field/value map cuts field names to 4–5 characters ("subj", "dueD"). Likely ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeConfigField.tsx / FlowKeyValueField (pins FlowNodeInspector.fieldValueMap-11788, FlowKeyValueField.valueEnvelope). Wanted: the full field label is readable (stack field over value at narrow inspector width, or the inspector's own wrapping); pin with a long field name.
    • PR 3 — row 17 (Studio S6): the publish dialog reads "Also changed: ~ nodes". ui/packages/app-shell/src/preview/DraftChangesPanel.tsx:~895 (preview.changes.detailChangedKeys). Wanted: name what changed (the node and the property) instead of a bare ~ path; measure what the draft-changes payload carries first. If the payload does not carry node names, say so and stop at the seat for that row (it would be a server door, not a ui PR).

    Scope

    Per PR: the one surface's file(s), its test(s), i18n keys only if new copy is needed (all locales per the parity suite; zh text is real Chinese, other locales fall back as the suite allows), changeset (@object-ui/app-shell + @object-ui/console patch, the repo's pair for app-shell-only fixes). One ablation per PR that reds the new pin. ⛔ No sweep beyond the row; other findings go to the report. Stay under 300 changed lines per PR. Hand back after EACH PR (PR, head, report gist); start the next from a fresh origin/main after the previous merges.

    Tier

    Quote dispatch-gates --tier per diff. Expected none. TIER_DEFAULT, effort medium. Clause-②: no, Metadata-protocol: none. Each PR Part of #27356; the card closes when every row is taken or answered across seats, not by these PRs.

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-warren · session_01JQwxbZeBv2y91towxasSUT

    Claim: PM loop round 27 · 2026-10-29T03:29Z
    Session: session_01JQwxbZeBv2y91towxasSUT (seat; implementation by card thread session session_01JQwxbWuU6sVfBYiy4dY4PA, mode:thread)
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-ldfxxi (the card thread's harness push branch, self-reported — the measured platform exception to claude/issue-N-slug)
    Worktree: objectstack-issue-27356 in the card thread's clone
    Domain: domain:ui
    Seat: domain:ui#1 (seat post #25966)
    File surface: Studio rows only, one PR each, in order — row 21: the read-only package's flow Enabled switch under ui/packages/app-shell/src/views/studio-design/; row 16: the Create Record node field/value map under ui/packages/app-shell/src/views/metadata-admin/inspectors/ (FlowNodeConfigField / FlowKeyValueField); row 17: ui/packages/app-shell/src/preview/DraftChangesPanel.tsx; each with its tests, i18n keys if new copy is needed, and the app-shell + console patch changeset. ⛔ Rows 1–11 (Setup, seat 2), row 20, and rows 12–15, 18, 19, 22 (stop on breach; explain in the report)
    Container & model: M, mode:thread (the maintainer's word: 3 active card threads per seat, 2026-10-28 10:00Z / 12:11Z), model: TIER_DEFAULT, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: Studio presentation in this lane's @object-ui/app-shell | hotcrm#2320 Studio report S10 / S5 / S6 | a read-only switch reads as read-only, a field name is readable, a publish summary names what changed
    Thread-read: 6487063370
    Premise: holds as filed (HotCRM's 18.2.0 browser pass); the dev re-measures each row on origin/main after efdf11ae before its PR, and stops at the seat on row 17 if the draft-changes payload carries no node names.
    Serial constraints cleared: seat read of every open PR's file list at claim time — none touches StudioDesignSurface*, FlowNodeConfigField, FlowKeyValueField or DraftChangesPanel.
    Resume-from: none


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-warren · session_01JQwxbWuU6sVfBYiy4dY4PA
    os-dev-report

    {
      "issue": 27356,
      "row": 21,
      "report_finding": "hotcrm#2320 Studio S10",
      "status": "done",
      "branch": "claude/project-thread-ldfxxi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27376",
      "head": "a24979d2",
      "session": "session_01JQwxbWuU6sVfBYiy4dY4PA",
      "premise_still_valid": true,
      "summary": "Measured on origin/main 28872e68: the Automations pillar's flow switch (flowSwitchEl in StudioDesignSurface.tsx) was already disabled on a read-only package but kept its bg-emerald-500 track at half opacity. Read-only now draws a muted track (on bg-muted-foreground/60, off /25), a hidden Lock icon, no hover fill and no opacity fade; thumb, word and aria-checked unchanged. Writable package unchanged. Part of #27356, row 21 only.",
      "files_changed": [
        ".changeset/27356-studio-readonly-flow-switch.md",
        "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
        "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.readOnlyFlowSwitch-27356.test.tsx"
      ],
      "line_budget": "224 changed lines (+221 / -3) against the order's 300",
      "tests": "new file StudioDesignSurface.readOnlyFlowSwitch-27356: 4/4; with the 8 existing switch files: 9 files 76/76 passed; app-shell type-check exit 0; ablation (read-only on-track back to bg-emerald-500 via ablation-replace, anchor 1 to 0): 1 failed / 3 passed, restored blob = HEAD blob 112c2439faa1, git diff HEAD empty",
      "gates": "dispatch-gates --commands: 34 derived, 34 run, all exit 0; --ran: 34 run, 0 NOT-MEASURED, 0 UNRUN; tier: no path-derived mandate; check:new-line-citations exit 0 (0 new); PR check-runs: in_progress at report time",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0 GitHub MCP calls (subscribe_pr_activity on the claude-code-remote server only)",
      "api_writes": "2 — fleet-write relay pr_create (#27376); this report via post-stamped (issue comment on #27356)",
      "deviations": [
        "commit 48197f0e (WIP, pushed before the closure build) carries no Claude-Session / Co-authored-by trailer pair; later commits do; history not rewritten, named in the PR body",
        "PR body follows the order's six-line Chinese block plus the os-dev English sections; template headings What changes / Why / Verification kept"
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: seat 2 (row 3 of #27356, Setup Packaged Automation toggle has the same green-while-not-running look) · noted, not filed"
      ]
    }
  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-warren · session_01JQwxbZeBv2y91towxasSUT

    Landed (partial, row 21) · seat domain:ui#1 · 2026-10-29T04:35Z

    PR #27376 merged as 7e200b4a68 (seat record 6487871362). Row 21 taken (hotcrm#2320 Studio S10): on a read-only (code) package, Studio's flow Enabled switch now draws a muted track with a lock and no hover, while the thumb, the word and aria-checked still say on or off; a writable package's switch is unchanged. Part of #27356, so the card stays open and claimed: rows 16 and 17 follow from the same thread. Row 3's Setup toggle has the same look; that row is seat 2's and was passed to it.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-warren · session_01JQwxbWuU6sVfBYiy4dY4PA
    os-dev-report

    {
      "issue": 27356,
      "row": 16,
      "report_finding": "hotcrm#2320 Studio S5",
      "status": "done",
      "branch": "claude/project-thread-ldfxxi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27405",
      "head": "5ebc5576",
      "session": "session_01JQwxbWuU6sVfBYiy4dY4PA",
      "premise_still_valid": true,
      "summary": "Measured on origin/main 7e200b4a: FlowKeyValueField drew key, value, expression toggle and remove on one line; in the 300 px Studio aside the key box was 104 px, 9 characters visible (Chromium probe). Each row now stacks: key plus remove over value plus toggle; 227 px, 24 characters. FlowNodeConfigField is the only caller, so every key / value map in the flow inspector stacks (one component, declared in the PR body). Stored values unchanged.",
      "files_changed": [
        ".changeset/27356-studio-flow-map-rows-stack.md",
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowKeyValueField.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowKeyValueField.stackedRows-27356.test.tsx"
      ],
      "line_budget": "132 changed lines (+117 / -15) against the order's 300",
      "tests": "new file FlowKeyValueField.stackedRows-27356: 2/2; the 65 app-shell test files importing FlowNodeInspector / FlowNodeConfigField / FlowKeyValueField: 971/971; app-shell type-check exit 0; ablation (delete the anchor closing the key line and opening the value line): 2/2 failed, restored blob = HEAD blob 9f71951b7644, git diff HEAD empty",
      "gates": "dispatch-gates --commands: 34 derived, 34 run, all exit 0 (ui scripts family re-run after removing a stale ignored ui/apps/site/node_modules in this worktree: first run 1 failed on quick-reference-commands-4149, rerun 169 passed); --ran: 0 NOT-MEASURED, 0 UNRUN; changeset families re-run on 5ebc5576 exit 0; check:new-line-citations 0 new; PR check-runs in_progress at report time",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0 GitHub MCP calls (subscribe_pr_activity on the claude-code-remote server only)",
      "api_writes": "2 — fleet-write relay pr_create (#27405); this report via post-stamped (issue comment on #27356)",
      "deviations": [
        "the branch was recreated from origin/main 7e200b4a after #27376 squash-merged and its remote head was deleted; plain push, no force",
        "first push attempt was refused by check:commit-card-trailers (Part of line in the commit body); amended before publication"
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted in Acceptance notes: the Input primitive's md:text-sm outranks the map's text-xs at desktop width, so key boxes read at 14 px; pre-existing, polish"
      ]
    }
  7. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-warren · session_01JQwxbXpF772qWJjojJvRXw

    Seat note · Setup rows · domain:ui#2 · 2026-10-29T05:33Z

    ⛔ Not a claim on the rows marked "not carded".

    Seat 2 holds the Setup rows (1–11). Seat 1 holds the Studio rows 16, 17 and 21. Status read on origin/main 9f76037:

    Row State
    2 Carded → #27410 (Position holder picker shows email). Dispatched.
    3 Carded → #27378 → PR #27389, merged b223072.
    9 Carded → #27404 (permission set hides system + hidden fields). Dispatched.
    7 Not carded by seat 2. "Record ID" is the server object's own field label, packages/plugins/plugin-approvals/src/sys-approval-request.object.ts ≈L270 (and its generated translations), not a ui string. It belongs to the server lane.
    11 Not carded yet. The sidebar's "All reports" is a static entry by design: UnifiedSidebar.tsx ≈L596 says the sidebar reads no report list for it (objectui#12980). "Hide when empty" contradicts that, so the empty-state wording is the open door. It needs a ruling before a card.
    10 Not carded yet. Export sits in the Display panel only in the compact toolbar. The wide toolbar keeps its own Export group (ListView.tsx ≈L6110–6120). Measure which form HotCRM saw first.
    5 Not carded yet. The list title is the metadata type's registry label (translateMetadataType, singular), so a plural title needs a plural type label from the registry. Measure before carding.
    1, 4, 6, 8 Not carded yet. Each needs a server door: a permission-set and position picker on Create User, a Run-now route for scheduled flows, a Deactivate verb, and the fallback-routing reason.
  8. 23 remaining items

  9. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CZrsFMFmWFsxTaq2Bu
    os-dev-report

    {
      "issue": 27356,
      "row": 19,
      "report_finding": "hotcrm#2320 Studio S8",
      "status": "done",
      "branch": "claude/project-thread-9nt6x7",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28126",
      "head": "c090d582",
      "session": "session_01Utp6CZrsFMFmWFsxTaq2Bu",
      "premise_still_valid": true,
      "summary": "Maintainer-ruled A1 (6520616687). Measured on origin/main 6b125a7a: the Automations pillar had no delete; a flow was deleted only from Setup > Metadata. An open flow of a writable package now has a header menu (FlowItemMoreMenu) with Delete flow: Setup's in-app confirm (objectui#13333, Setup's engine.edit.deleteConfirm keys), then the pending draft discarded (client.reset state draft) and the flow deleted (client.reset, DELETE /meta/flow/:name, Setup's door) at the drafts' package. The rail re-reads and the pillar stays on its empty state (opens no other flow); a toast names the flow. A refusal shows the door's sentence and keeps the flow open. Read-only package: no menu. No Reset overlay (ADR-0146 Phase 2, #28045). Two studio keys (en, zh). Part of #27356, row 19.",
      "files_changed": [
        ".changeset/27356-studio-delete-flow.md",
        "ui/packages/app-shell/src/views/studio-design/FlowItemMoreMenu.tsx",
        "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
        "ui/packages/app-shell/src/views/studio-design/AutomationsPillar.deleteFlow-27356.test.tsx",
        "ui/packages/i18n/src/namespaces/studio/en.ts",
        "ui/packages/i18n/src/namespaces/studio/zh.ts"
      ],
      "line_budget": "297 changed lines (+295 / -2) against the order's 300",
      "tests": "new file AutomationsPillar.deleteFlow-27356: 4/4; every ui test file naming StudioDesignSurface / AutomationsPillar / FlowItemMoreMenu: 209 files, 1561 passed; app-shell + i18n type-check exit 0; ablation 1 (draft discard removed): 1 failed / 3 passed; ablation 2 (keep-empty guard removed, the re-read opens the next flow): 1 failed / 3 passed; both restored blob = HEAD 95e9a7fd2a3e, git diff HEAD empty; check:i18n-drift exit 0 (0 en values changed)",
      "gates": "dispatch-gates --commands on c090d582: 34 derived, 34 run, all exit 0; --ran: 34 run, 0 NOT-MEASURED, 0 UNRUN; tier: no path-derived mandate; check:new-line-citations 0 new; PR check-runs in_progress at report time",
      "dogfood_battery": "n/a - no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0 GitHub MCP calls (subscribe_pr_activity on the claude-code-remote server only; card and comments read with gh api GET)",
      "api_writes": "2 - fleet-write relay pr_create (#28126); this report via post-stamped (issue comment on #27356)",
      "deviations": [
        "the branch was recreated from origin/main 6b125a7a after #28076 squash-merged; install and app-shell closure rebuilt; plain push, no force",
        "Studio discards the flow's pending draft before the delete, which Setup's delete does not; named in the PR's Acceptance notes",
        "the harness's after-PR assign and review-request step was skipped on the order's word"
      ],
      "open_questions": [],
      "out_of_scope_findings": [],
      "card_rows": "after this PR every Studio row (12-22) is taken, carded or answered; Setup rows 1, 4, 5, 6, 7, 8, 10, 11 have no card or answer (seat 2 note 6488880391), so the PR says Part of, not Fixes"
    }
  10. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

    Seat handoff · 2026-10-30T13:45Z · the domain:ui lane is stopping after its current work, on the maintainer's instruction. This seat's claim on the card ends here.


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

    Release: session_01Utp6CaJoinvGQSbHeDaWBe · partial landing. Rows 13, 22 and 12 are merged (#27927, #27978, #28076). Row 19 is #28126, ACCEPT 6524279878, in the merge queue. Row 14 is answered C. The domain:ui lane is off duty by maintainer order, so the card is back in pm:queue with no assignee.
    Resume-from: none (every seat branch is merged or queued; the Setup rows start from main)

    Remaining: Setup rows 1, 4, 5, 6, 7, 8, 10 and 11 have no card or answer yet (seat 2's note 6488880391). Handoff detail: 6524323618.


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-tesla · session_01L9qibz8HEj53Wx2uphTo2o

    Claim: PM loop round 2 · 2026-10-30T15:09Z · Setup rows 1, 4, 5, 6, 7, 8, 10 and 11 (the Studio rows 12–22 are settled; handoff 6524323618)
    Session: session_01L9qibz8HEj53Wx2uphTo2o (seat; implementation by card thread session session_01L9qibwpXbWKjEuA5DF45BL, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-pz9hl0 (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-27356-setup
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: Setup / admin pages under ui/packages/app-shell/src/** that the rows name (metadata list pages, Users dialogs only where a server door exists, the All reports empty state), ui/packages/plugin-list/src/ListView.tsx toolbar Export region only, ui metadata type registry labels if row 5 needs them, i18n keys in the ten packs, tests, .changeset/27356-*.md; ⛔ server/spec/examples/**, views/setup/PackagedAutomationPage.tsx, views/studio-design/**, the Invitations page, the Connector credentials page (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6524544915
    Premise: holds (seat 2's row readings 6488880391 to be re-measured by the dev on current main)
    Serial constraints cleared: seat 1's #27797 (Invitations) and #27238 (Connector credentials) kept out of bounds; paused #28147/#28148 branches hold studio-design/** and PackagedAutomationPage.tsx; domain:ui#2 and #4 stood down (6525908560, brief 6526005030) — seat 2's vacated Setup area split with seat 1 on mailbox #28092 (6526045441)

    The maintainer lifted the p3 hold for the ui lane (「可以开p3」) and set five card threads per seat (「每个座位并发可以5」). Order: /mnt/project-files/ui-seat-3/r2026-10-30/dispatch-27356.md under FRAME.md.

  13. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-tesla · session_01L9qibwpXbWKjEuA5DF45BL
    os-dev-report

    {
      "issue": 27356,
      "row": 5,
      "report_finding": "hotcrm#2320 Setup S4",
      "status": "done",
      "branch": "claude/project-thread-pz9hl0",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28197",
      "head": "464325f7",
      "session": "session_01L9qibwpXbWKjEuA5DF45BL",
      "premise_still_valid": true,
      "summary": "Measured on origin/main 9f13ee81: under Setup the metadata list titled itself with the registry's singular type label, led with the API name and let descriptions wrap rows tall. The Setup header now takes the label of the app's own nav entry that opens exactly this page (navEntryTitle: resolveActiveNavItem + exact resolveHref path + resolveNavItemLabel; Setup's nav_positions is a url entry 'Positions'), falling back to the type label; the identity cell leads with the label with the API name beneath (Label column folded in where the type lists primary key first plus label); descriptions clamp to two lines with the full text as title. Outside Setup unchanged. No registry plural, no spec change. Part of #27356, row 5.",
      "files_changed": [
        ".changeset/27356-setup-lists-lead-with-labels.md",
        "ui/packages/app-shell/src/views/metadata-admin/navEntryTitle.ts",
        "ui/packages/app-shell/src/views/metadata-admin/ResourceListPage.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/ResourceListPage.setupLabelFirst-27356.test.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/ResourceListPage.setupPosture-12606.test.tsx"
      ],
      "line_budget": "259 changed lines (+247 / -12), dispatch-gates --tier reading",
      "tests": "new ResourceListPage.setupLabelFirst-27356: 5/5; every ui test file naming ResourceListPage / MetadataResourceListPage / navEntryTitle (24 files): 294/294; app-shell type-check exit 0 (lock VERDICT); ablation 1 (labelColumn = false): 4 failed / 1 passed, restored blob = HEAD 1abb07375086, git diff HEAD empty; ablation 2 (title ignores nav entry): 1 failed / 4 passed, restored, git diff HEAD empty; vitest resolves @object-ui/* to src, no rebuild leg",
      "gates": "dispatch-gates --commands on 464325f7: 34 derived, 34 run, all exit 0 (check-sdui-manifest included); --ran: 34 run, 0 NOT-MEASURED, 0 UNRUN; tier: no path-derived mandate; check:new-line-citations 0 new; PR check-runs in_progress at report time",
      "dogfood_battery": "n/a - no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "2 GitHub MCP reads (issue_read get x1, issue_read get_comments x1); 0 writes",
      "api_writes": "2 - fleet-write relay pr_create (#28197); this report via post-stamped (issue comment on #27356)",
      "deviations": [
        "the first closure build ran with OS_SKIP_DTS=1 and left ui packages unbuildable (TS7016); rebuilt with declarations before any reading above",
        "the harness's after-PR assign and review-request step was skipped on the order's word",
        "row 5 test of the phone row height is happy-dom only; no 390 px browser measurement"
      ],
      "open_questions": [],
      "row_dispositions": {
        "5": "taken, this PR",
        "11": "taken, next PR from this thread",
        "10": "will not do on this card: objectui#12423 (maintainer-approved design) puts Export in the Display footer at every width; HotCRM saw it at 1440 px; reversing needs a maintainer call"
      },
      "out_of_scope_findings": [
        "row 1 · class: suggestion (no defect class) · reach: Setup > Users > Create User shows Permission Set as a free-text box and no Position field · evidence: create_user params are server metadata in packages/platform-objects sys-user.object.ts (permissionSet inline type text; a lookup param to the permission-set catalog is the platform-objects half) and POST /api/v1/auth/admin/create-user (plugin-auth admin-user-endpoints.ts) accepts no position · carrier: domain:server · dedupe words: create user permission set picker, create user position, create_user params",
        "row 4 · class: suggestion · reach: POST /api/v1/automation/FLOW/trigger answers 403 PERMISSION_DENIED for an admin on a runAs system schedule flow (flowStartRefusal, packages/runtime flow-start-admission); all 8 HotCRM schedule flows are runAs system, so no Run now door exists for them · carrier: domain:server · dedupe words: run now scheduled flow, manual run schedule flow, flowStartRefusal runAs system admin",
        "row 6 · class: suggestion · reach: Setup > Users row menu offers Edit, Ban, Set Password, Impersonate, Set Manager; sys_user actions are server metadata (platform-objects sys-user.object.ts ban_user / unban_user), no deactivate verb or door · carrier: domain:server · dedupe words: deactivate user action, ban user wording, sys_user deactivate",
        "row 7 · class: suggestion (copy) · reach: Setup > Approval Requests column 'Record ID' shows the record name; the label is sys_approval_request's own field label (packages/plugins/plugin-approvals sys-approval-request.object.ts record_id) and its generated translations · carrier: domain:server · dedupe words: approval request Record ID label, record_id column label",
        "row 8 · class: suggestion · reach: a request routed to fallbackApprovers reads like any other; plugin-approvals approval-service sets slateSource 'fallback' and logs a warn but persists no marker (only fallback-prefixed __resolvedFrom keys in the config snapshot; administrators get adminRescueNote) · carrier: domain:server · dedupe words: fallback approver reason, onEmptyApprovers fallback note, slateSource fallback persisted"
      ]
    }
  14. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-tesla · session_01L9qibwpXbWKjEuA5DF45BL
    os-dev-report

    {
      "issue": 27356,
      "row": 11,
      "report_finding": "hotcrm#2320 Setup S11",
      "status": "done",
      "branch": "claude/project-thread-pz9hl0",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28254",
      "head": "c2241b20",
      "session": "session_01L9qibwpXbWKjEuA5DF45BL",
      "premise_still_valid": true,
      "summary": "Setup's All reports (any app's report index with nothing to list) said only 'This app has no reports you can open.' Its empty state now also lists the other launcher apps that ship at least one report the member may read (useOtherAppsWithReports: appShippedReports + mayOpenReport, the same served reports and read rule as useAppReportEntries), each linking to /apps/APP/reports; empty while reports or datasets load. The sidebar entry stays static. One key console.reportIndex.otherApps in all ten packs. Fixes #27356 with the full per-row table; row 5 landed in #28197.",
      "files_changed": [
        ".changeset/27356-report-index-points-to-other-apps.md",
        "ui/packages/app-shell/src/views/AppReportIndexView.tsx",
        "ui/packages/app-shell/src/views/appReportIndex.ts",
        "ui/packages/app-shell/src/views/__tests__/AppReportIndex.otherApps-27356.test.tsx",
        "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts"
      ],
      "line_budget": "209 changed lines (+208 / -1)",
      "tests": "on c2241b20 (base 39da1bd6, spec dist rebuilt): new AppReportIndex.otherApps-27356 2/2; every ui test file naming appReportIndex / AppReportIndexView / reportIndex (10 files): 171/171; pnpm --dir ui --filter @object-ui/i18n --filter @object-ui/app-shell run type-check (both scripts echoed Done): lock VERDICT command-exit 0. Ablation on 7b81b623 (same commit, base 3a2f4c00): read rule .some(mayOpenReport) -> .length > 0: 1 failed / 1 passed (control green), restored blob = HEAD d4e7c01cfe47, git diff HEAD empty; vitest resolves @object-ui/* to src, no rebuild leg",
      "gates": "dispatch-gates --commands on c2241b20: 34 derived (identical list to 7b81b623), 34 run, all exit 0; --ran: 34 run, 0 NOT-MEASURED, 0 UNRUN; check:new-line-citations 0 new (report-only); PR check-runs in progress at report time",
      "dogfood_battery": "n/a - no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "GitHub MCP reads only (pull_request_read, get_job_logs); 0 writes",
      "api_writes": "relay pr_create (#28254); one PR comment on #28197 (main-red note) and this report via post-stamped",
      "deviations": [
        "the PR body's type-check, ablation and gate readings name 7b81b623; their c2241b20 re-runs are in this report (ablation not re-run: the files it touches are byte-identical between the two bases)",
        "the harness's after-PR assign and review-request step was skipped on the order's word",
        "measured in happy-dom only; no browser pass"
      ],
      "open_questions": [],
      "row_dispositions": {
        "5": "landed in #28197 (39da1bd6)",
        "11": "taken, this PR",
        "10": "will not do on this card: objectui#12423 (maintainer-approved design) puts Export in the Display footer at every width; HotCRM saw it at 1440 px; reversing needs a maintainer call",
        "1, 4, 6, 7, 8": "seat files or screens out the domain:server findings (each listed in out_of_scope_findings below)"
      },
      "out_of_scope_findings": [
        "row 1 · class: suggestion (no defect class) · reach: Setup > Users > Create User shows Permission Set as a free-text box and no Position field · evidence: create_user params are server metadata in packages/platform-objects sys-user.object.ts (permissionSet inline type text; a lookup param to the permission-set catalog is the platform-objects half) and POST /api/v1/auth/admin/create-user (plugin-auth admin-user-endpoints.ts) accepts no position · carrier: domain:server · dedupe words: create user permission set picker, create user position, create_user params",
        "row 4 · class: suggestion · reach: POST /api/v1/automation/FLOW/trigger answers 403 PERMISSION_DENIED for an admin on a runAs system schedule flow (flowStartRefusal, packages/runtime flow-start-admission); all 8 HotCRM schedule flows are runAs system, so no Run now door exists for them · carrier: domain:server · dedupe words: run now scheduled flow, manual run schedule flow, flowStartRefusal runAs system admin",
        "row 6 · class: suggestion · reach: Setup > Users row menu offers Edit, Ban, Set Password, Impersonate, Set Manager; sys_user actions are server metadata (platform-objects sys-user.object.ts ban_user / unban_user), no deactivate verb or door · carrier: domain:server · dedupe words: deactivate user action, ban user wording, sys_user deactivate",
        "row 7 · class: suggestion (copy) · reach: Setup > Approval Requests column 'Record ID' shows the record name; the label is sys_approval_request's own field label (packages/plugins/plugin-approvals sys-approval-request.object.ts record_id) and its generated translations · carrier: domain:server · dedupe words: approval request Record ID label, record_id column label",
        "row 8 · class: suggestion · reach: a request routed to fallbackApprovers reads like any other; plugin-approvals approval-service sets slateSource 'fallback' and logs a warn but persists no marker (only fallback-prefixed __resolvedFrom keys in the config snapshot; administrators get adminRescueNote) · carrier: domain:server · dedupe words: fallback approver reason, onEmptyApprovers fallback note, slateSource fallback persisted"
      ]
    }

    Generated by Claude Code

  15. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-tesla · session_01L9qibz8HEj53Wx2uphTo2o

    Landed · 2026-10-30T20:26Z

    row disposition
    5 landed in #28197 (merged 2026-10-30T19:18:05Z, 39da1bd626, ACCEPT 6528516293)
    11 landed in #28254 (merged 2026-10-30T20:25:52Z, 49a078eb88, ACCEPT 6532126267), which closed this card
    7 carried to domain:server as #28250 (relabel sys_approval_request.record_id "Record")
    10 will not do on this card: Export in the Display footer is objectui#12423's maintainer-approved design; moving it is the maintainer's call
    1, 4, 6, 8 screened out by the filing gate as feature proposals, not filed: 1 (permission-set picker + Position on Create User; the free-text param is #25338's deliberate inline design), 4 ("Run now" for runAs: 'system' schedule flows), 6 (a Deactivate verb beside Ban), 8 (a persisted fallback-routing reason on approval requests). Listed for the maintainer; each becomes a card on the maintainer's word
    12–22 (Studio) settled earlier (6524323618)

    State: pm:dispatched removed (closed card).

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 portaldomain:uienhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions