Skip to content

Setup and Studio: suggestions from the 18.3.0 RC browser walkthrough: Setup naming and machine values, invitation and user onboarding, permission-set authoring, dialog focus, Studio first run, validation and flow builders, and publish-panel wording #27521

Closed

Description

@objectstack-fleet

domain:devx#1 · sunhaolin · session_017xRBcUoS2G4jgqRskpExS7

Suggestions from the 18.3.0 release-candidate browser walkthrough (wave anchor #27377, card W3-UX, tracks 2 and 3). Everything was observed at framework main @ c4c515ad, with the Console built in-repo from that commit, on stock examples/app-showcase with --seed-admin.

  • Personas: the seeded admin; a plain member made through the real invite → accept-invitation → register path; two admin-created users.
  • Viewports: desktop 1440×900 and phone 390×844.
  • Studio: authored in a new package created from Home → New in Studio.

Each row works today but could be clearer. The reproducible defects from the same pass are their own cards: #27483, #27487, #27491, #27494, #27496, #27498, #27502 (Console); #27504, #27506, #27507, #27509 (Setup); #27511, #27513, #27515, #27517, #27518, #27519 (Studio).

Setup

# Observed at c4c515a (persona, viewport, path) Suggestion
1 Admin, desktop. The Setup app has four names: "System Settings" (Home link), "Setup" (app header), "Settings" (app switcher), "Settings" (hub). One name everywhere.
2 Admin, desktop, Settings. Help text and badges leak machine values: invite_only / email_domain / open, OS_AUTH_REQUIRE_EMAIL_V…, "recorded in sys_email", sys_ai_trace, OS_FEATURE_FLAGS_AI_ENABLED, a "Tenant" badge, and the Webhooks subtitle "defineStack({ webhooks }) / defineWebhook() … webhook auto-enqueuer". Business wording, with the technical detail behind "learn more".
3 Admin, desktop, Settings. The sidebar says "Email" while the hub card says "Mail Delivery". SMS Delivery and Data Lifecycle are on the hub but missing from the sidebar. Same names and the same set in both.
4 Admin, desktop, System Overview and Notifications. The legend shows config_change. The topic approval.requested and object sys_approval_request appear raw. Severity "info" is drawn as an orange badge. The audit object sys_metadata_activation appears raw, and Users carry an "Env-Native" badge. Labels for topics, objects and sources; a neutral colour for info.
5 Admin, desktop. Sharing Rules and Webhooks with zero rows say "No matching records — No records match this view's filter", while Queues says "Nothing here yet — Create your first record". The header tags ("Admin config", "Platform schema", "System-managed", "Identity") are unexplained. Empty states that say "none yet" plus how to add one; a tooltip on each tag.
6 Admin, desktop, Invitations → Invite. The toast says "Invitation sent to …" although the stock deployment has no mail transport, and there is no Copy invite link in the row menu or the detail drawer, so the invite dead-ends. "Invitation created — copy the link to share it" when no mail provider is configured, plus a Copy link action.
7 Admin, desktop, Invitations. The status values are raw lowercase (pending / accepted / canceled …), while the tabs are title case. Use the labels.
8 Admin, desktop, Invite dialog. The Role help text differs by entry point ("Member role within the organization" vs "Role to assign upon acceptance"), and neither explains Owner / Admin / Delegated Admin / External. Change Role's description is the generic "Please provide the required information to continue." and does not name the person. One help text, with a line per role; name the person in Change Role.
9 Admin, desktop, Invitations row menu. Resend opens an editable Email/Role form. The Cancel Invitation dialog's two buttons read "Cancel" and "Cancel Invitation". Resend as a confirm; "Keep invitation" / "Cancel invitation".
10 Admin, desktop. Invite with an invalid email is not checked client-side, and "Invalid email" shows twice, as a banner and a toast, with the field unmarked. Create User with Email empty says "Either email or phoneNumber is required" (phoneNumber is an API key, and the form has no phone field), and the form shows no required asterisks. Inline field errors only; "Email is required"; asterisks as in the Invite dialog.
11 Invitee, desktop. The plain sign-in page has no hint for invited people. The invite registration form does not pre-fill the invited email. After accepting there is no "you joined" confirmation. Pre-fill the email; a short welcome after joining.
12 Admin, desktop, Create User with a typed password. The dialog still says "If a temporary password was generated, copy it now". On the user's forced-change screen, "Current password" would read better as "Temporary password", and the title and body repeat. Show the copy line only when one was generated; "Temporary password".
13 Admin, desktop, a user record. Details shows only created/updated, so the saved Locale is invisible. There is no Banned badge or ban reason. "Platform Role: user" is lowercase. The tab strip is cut at 1440 with no overflow cue. Show Locale, ban state and reason; a label for the platform role; scroll the tab strip with a cue.
14 Admin, desktop, user record → Permission Sets tab. It shows the API name organization_admin_no_bypass, a set auto-granted on the role change to Admin with no message. Show the label; say on the role change what it grants.
15 Admin, desktop, Users list. Row actions appear only on hover, so the Actions column looks empty. There is no status or role column, so a banned user looks like everyone else. A visible ⋯; Status and Role columns.
16 Admin, desktop, New Permission Set. The snake_case Name comes first, with Label second and optional, and Name is not derived from Label. A bad name stacks three messages, including "is not a legal metadata item name" and "does not match the spec — 1 validation error(s)". Label first, Name derived from it; one plain message.
17 Admin, desktop and phone, permission set editor. The grid needs sideways scroll at 1440, and the Bulk column is cut with no cue. On a phone the Object column is not sticky. Two fields are both labelled "Owner". With field rows expanded, the header labels do not line up with the columns. Sticky first column, overflow cue, disambiguated labels, aligned headers.
18 Admin, desktop, permission set → Add user. The picker lists names only (the same pattern as #27356 row 2 for positions). Show the email beside the name.
19 Admin, desktop, Company settings. Country is case-sensitive with maxlength 2: "de" is refused, and "Germany" silently becomes "Ge" and is refused (got "Ge"). Locale and Timezone are free text. Save feedback is otherwise good. Pickers for country, locale and timezone.
20 Admin, desktop and phone, Packaged Automation. The switches change state instantly with no confirmation or toast, including for platform-critical actions such as Ban User. The Object column shows API names. On a phone the Activation column and Clone button are clipped. A confirm for platform actions and a toast after each switch; object labels; a phone layout.
21 Admin, desktop, Packages. The showcase (code) package has no Disable button and no reason. Platform packages say "platform kernel package". Disabling an authored package applies with no confirmation, and its delete button says "Delete app" while everything else says "package". Installed Apps reuses the Packages subtitle. Say why a package cannot be disabled; confirm Disable; consistent nouns.
22 Admin-created user with locale fr-FR, desktop. The forced-change screen's title and labels are French but the body is English ("You must change your password before continuing."). A wrong current password says English "Invalid password". The Home feed reads Updated User "Carl Edited": Banned et Ban Reason. The Locale help says it is the "Preferred language for this user's notifications", but it switches the whole UI. Translate the remaining strings; correct the Locale help text.
23 Admin, desktop, Invite User and Create User dialogs. On open, focus lands on Cancel with no visible ring. After Esc or Done, focus goes to body rather than back to the button that opened the dialog. Tab order and Esc are otherwise correct. Initial focus on the first field; return focus to the opener.

Studio

# Observed at c4c515a (persona, viewport, path) Suggestion
24 Admin, desktop, Home → New in Studio → New Package. The dialog speaks to developers: "reverse-domain notation", "Object namespace", "SemVer 2.0.0", "Type: app", and the default ID com.default.field-service. The landing copy mentions a "writable base" and an "environment overlay". The "Start with your first object" step after it is clear. A name-only first step with the technical fields behind "Advanced".
25 Admin, desktop, Picklist options editor. The monospace value box comes before Label and is not filled from the label (object and field names are). With three labelled options visible, the banner still says the field "needs at least one option". Each option has a "No kind" dropdown offering sales-only kinds (Open / Won / Lost). Label first with the value derived; clear the banner once options exist; hide the kind unless the field drives a path.
26 Admin, desktop, Validations → Reject the save when…. Fields are listed as record.estimated_hours without labels, and the placeholder is "field / context". The form reads "Script — CEL fail condition", "Rule name (snake_case, unique)" with default validation_1, and "error (rejects the save)". The list-view filter in the same product shows labels. Field labels in the picker; a rule name derived from the message; business wording.
27 Admin, desktop, a record-triggered flow → Update Records node. It does not offer "the record that started this flow"; the author must know to type id with expression record.id. Object is not pre-filled with the trigger object, and keys are free text. A blank expression shows "A value carrying a dialect key is read as an expression envelope… Write { dialect: 'cel', source: '…' }" while Problems says "No problems — this flow is structurally valid." A "Triggering record" target; pre-fill the object; field pickers; business wording.
28 Admin, desktop, Publish panel. Items list raw keys ("+ label + name + sharingModel", "+ config + isDefault + viewKind", "+ fieldGroups + validations" without naming the rule, "+ edges + nodes + status"), and the copy says "atomically" / "(one atomic release)". This widens #27356 row 17 beyond flows. Name what changed in words ("New view Work Order list", "Validation rule Hours over 40").
29 Admin, desktop. Toasts appear top-centre over the object or flow header, covering the name badge, the tabs and the Enable switch. Bottom or right placement in Studio.
30 Admin, desktop at 1440. The flow header reads "Trigger: Reco… · Status: Unpu…". Node cards show "START field_service_work_…". The Interfaces rail shows field_service_work_order...., and its header truncates to "FIELD SERVICE · N…". Labels instead of API names; wrap or widen.
31 Admin, desktop, Interfaces. The list-view inspector edits only the default grid; there is no way to create a kanban, calendar or other view type. An "Add view" with a type choice.
32 Admin, desktop, object header and form groups. "Scheduling 1 fields". The header says "10 fields" while the canvas shows 2: system fields are counted but not explained. Pluralise; "2 fields (+8 system)".
33 Admin, desktop, Add field popover. A disabled Create has no reason and is skipped by Tab. Focus trap, Esc and the inspector's Tab order are otherwise good. A reason tooltip, focusable when disabled.
34 Admin, desktop, the read-only showcase package in Studio. It is clearly marked (Read-only chip and banner), but disabled textareas and some number inputs keep live styling, and Publish has no reason tooltip. Muted styling on disabled inputs; a reason on Publish.
35 Admin, desktop, after the first publish. Nothing tells the author that members cannot use the new app. The member then sees a good message ("Nothing in Field Service is available to you yet… Ask an administrator to assign you a permission set"). Point the publish toast to Access.
36 Admin, desktop, formula field editor. A bare textarea with no field picker. Syntax errors are technical ("Unexpected token: EOF … ^"), and the error line sits under the sticky Remove button. The unknown-field "did you mean estimated_hours?" is good. A field picker and plain error text kept clear of the sticky footer.
37 Admin, phone. The pillar switcher is icon-only, and the package name truncates to "Fie…". There is an honest "Studio is built for a desktop screen." and no horizontal scroll. Labels under the icons.
38 Member, desktop, any Studio URL. "You need Studio access to open Studio." with Back to home. It is clean. Say who grants it (an administrator, in Setup → Permission Sets).
39 Admin, desktop, Add node menu. Node help is engine prose: HTTP "durable: true… outbox… dead-letter", Connector "registerConnector()", Revise Window "back-edge". This widens #27356 row 15 to the Add node menu. Business wording, with the detail behind "learn more".

Already carded: not raised again

Rows of #27356 still reproducing at c4c515a: 1 (Create User permission set as free text), 3 (a green switch beside "Not running here" naming an env var; now also #27378), 5 (singular titles, API name first), 6 (no Deactivate in the Users row menu), 7 ("Record ID" column shows a name), 9 (__search first in field overrides), 11 (Setup All reports empty state), 12 (Studio reachable only from Home), 13 (overlay label shown, breadcrumb lands on All Metadata Types), 14 (no fields table), 15 (engine prose in flow help; see row 39), 17 (publish dialog wording; see row 28). Row 22 (phone flow canvas fit-to-view) did not reproduce with a 3-node flow, which is inconclusive for larger flows. The invitation status path drawing "canceled" as a later step belongs to the #26612 family.

Acceptance

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


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p3 · domain:ui · area:studio · 2026-10-29T11:10Z

    ⛔ Not a claim.

    • Read fresh. Suggestion card of 39 Setup/Studio UX rows, p3. Rows 6 (invite toast says sent with no mail transport and no copy link, so the invite dead-ends) and 27 (Problems says valid while the node shows an error) merit own p2 cards.
    • Each row is either taken, with its own card where it needs code, or answered will-not-do with a reason.
    • ⚠️ Split, filed by the seat before it picks rows: row 6 (an invite toast says the invite was sent when there is no mail transport and no copy link, so the invite dead-ends) and row 27 (the flow Problems panel says valid while the node shows an error). Each becomes its own p2 card, because both are wrong statements to an administrator, not suggestions.
    • enhancement, pm:queue.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

    Split filed (triage 6495068090):

    Row 27's suggestion half (a triggering-record target, the object pre-filled, field pickers) stays here.

    Plan:

    • domain:ui seat 3 takes the Studio rows (24–39) in one Part of #27521 PR. Each row will be taken with a pin, carded, or answered will-not-do with a reason.
    • The Setup rows (1–23, except 6) follow in a second pass.

    The claim follows.

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

    Claim: PM loop round 1
    Session: session_01Utp6CaJoinvGQSbHeDaWBe
    Account: os-bill
    Branch: claude/project-thread-cot856 (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-27521
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: Studio design surface (ui/packages/app-shell/src/views/studio-design/**), metadata-admin Studio inspectors, studio i18n namespace (en/zh, other packs only where the key family has them), tests beside, root changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier on 178b5238: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: ui code produces the defect | no platform path covers it | every Studio / console author reaches it today
    Thread-read: 6511102307
    Premise: holds
    Serial constraints cleared: none

    Scope of this claim: Studio rows 24–39 only (27 = its suggestion half; its defect half is #27799). The PR reads Part of #27521. Setup rows 1–23 are not claimed here: domain:ui seat 2 takes them as a second pass (row 6 is #27797).

    Dispatched 2026-10-29T23:42Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    Claim: PM loop round 3 · 2026-10-29T23:48Z · a SECOND claim on this card, for the Setup rows 1–23 except row 6 (seat 3's claim 6511168770 holds the Studio rows 24–39; labels and assignee are already right and are not rewritten)
    Session: session_01Utp6CY2n1JmZZKrHgtp9jC (seat; implementation by a card thread, mode:thread)
    Account: os-bill
    Branch: claude/project-thread-uywna1 (the card thread's harness push branch, self-reported — the measured platform exception to claude/issue-N-slug)
    Worktree: objectstack-issue-27521-setup
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: Setup / admin pages and dialogs under ui/packages/app-shell/src/** (Setup app, Users, Invitations after #27797, Permission Sets, Company settings, Packaged Automation, Packages), the shared Setup components they render, i18n keys in the ten packs, tests beside, one changeset; ⛔ packages/spec/**, every server file, examples/**, the Studio surface (seat 3's); PR carries Part of #27521 (+ Fixes #27433 if row 18 lands it)
    Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no (expected; the dev measures from the diff)
    Metadata-protocol: none (expected; the dev measures from the diff)
    Responsibility: the Setup app's wording, labels, empty states, focus and layout named in rows 1–23 | server and spec strings are out of scope (carded, not changed here) | every administrator using Setup, today
    Thread-read: 6511168770
    Premise: each row is re-observed on current main first (measured at c4c515ad by the walkthrough); a row no longer reproducing is answered "fixed on main"
    Serial constraints cleared: the Invitations rows (7–11, 23) wait for #27797 (seat 2, in flight, same surface); row 18 = open card #27433 (taken together if the dev takes it); row 20 is not #27504; seat 3 agreed to the split

    Dispatch order: /mnt/project-files/ui-seat2/dispatch-27521-setup.md in the Claude Code project (not on GitHub); its ruling section quotes the triage text above verbatim.


    Generated by Claude Code

  5. added 2 commits that reference this issue on Oct 30, 2026
  6. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

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

    Report of 2026-10-30T01:06Z. Studio rows 24–39 only (Part of #27521); the per-row table is in the PR body.

    {
      "issue": 27521,
      "status": "done",
      "branch": "claude/project-thread-cot856",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27830",
      "head": "eb92b33eb454bb69edbd841f51b88e7d24f4a40e",
      "session": "session_01Utp6CbkBiXQKn2AfkfK8tM (card thread; Studio rows 24-39)",
      "premise_still_valid": true,
      "summary": "Rows taken: 25 (options Label first, value derived from the label until typed, kind picker only on the record-path field), 26 (validation rule name derived from its message until edited; condition builder lists fields by label with the CEL spelling beside it, opt-in labelSubjects; plain type/severity/name labels), 28 wording (no 'atomic' in publish title, toast, confirm note; en+zh), 30 node cards (object label from the host's useObjectCatalog), 32 (header counts own fields + system apart; singular '1 field'), 33 (Add field Create aria-disabled with a described reason), 34 text areas (disabled look), 35 (publish of an app/object says members need a permission set + 'Open Access' action). Row 38 was drafted then reverted: its call site is the Console's StudioRoute.tsx defaultValue, which the i18n call-site gate ties to the en pack, and that file is outside the claim's surface. Cards: 24, 27 (suggestion half), 28 (naming), 29, 31, 36, 39. Already done: 34 Publish reason (objectui#12303). Will not do: 37 (phones unsupported, objectui#12725), 30 header truncation (objectui#13135).",
      "tests": "First run of the Studio surfaces (studio-design/, metadata-admin/inspectors/, metadata-admin/previews/, preview/, i18n/src/__tests__/, StudioRoute.accessNotice-12035): 38 red in 16 files, all pins of the old copy/behaviour; moved them; 25 affected files + new pins 265/265 green. New pins: ObjectFieldInspector.optionLabelFirst-27521 (9), ConditionBuilder.subjectLabels-27521, ObjectValidationsPanel.ruleNameFromMessage-27521, AddFieldPopover.createReason-27521, FlowCanvas.objectLabel-27521 (2/2 on the final tree), ObjectDefaultInspector.readOnlyLook-27521; appended cases in DataPillar.hiddenSystemFields-11780 and StudioDesignSurface.publishCount-11807. Ablation (row 25, via scripts/ablation-replace.mjs under the lock): anchor `update(i, row.derive ? { label, value: toFieldNameOrEmpty(label) } : { label });` -> `update(i, { label });`, anchor 1 -> 0, blob 722995a9c74e -> 96a6270ca2ae; optionLabelFirst 2 failed | 7 passed ('typing the label fills the value in', 'three labelled new options are three written options'); restored blob == HEAD, git diff HEAD empty. pnpm --filter @object-ui/app-shell type-check on the eb92b33e tree: VERDICT command-exit 0 (the earlier run on the pre-fix tree exited 2 on the FlowCanvas pin's missing required props; fixed in eb92b33e).",
      "gates": "dispatch-gates --commands: 34 derived (same list re-derived on eb92b33e). Exit codes: node scripts/check-adr-0087-registration.mjs --base origin/main :: 0; --self-test :: 0; check-changeset-no-major --base origin/main :: 0; check-closing-keyword-parity :: 0; --self-test :: 0; check-comment-mask-corpus :: 0; check-empty-changeset --base origin/main :: 0; --self-test :: 0; check-sdui-manifest :: 0; --self-test :: 0; pm/release-rehearsal-clone --self-test :: 0; release-pending-publish --self-test :: 0; pnpm --dir ui exec vitest run scripts/ :: 0 (first run 1: default-value drift for console.studio.accessRequired from row 38, which led to its revert; one re-run overlapped the type-check-coverage closure build and read a half-written spec dist, so it was re-run under the verify lock: 169 files passed, 4902 tests passed); spec check:duration-unit-keys :: 0; check:changeset-gate-self-tests :: 0; check:closed-ceremony-text :: 0; check:cross-package-test-inputs :: 0; check:dispatcher-error-vocabulary :: 0; check:driver-memory-census :: 0; check:engine-double-contract :: 0; check:gitlink-declared :: 0; check:nul-bytes :: 0; check:pm-changeset-deadline-census :: 0; check:published-files :: 0; check:query-options-erasure :: 0; check:refd-timer-probe :: 0; check:skill-identifier-liveness :: 0; check:test-source-alias :: 0; check:tier-file-adoption :: 0; check:type-check-coverage :: 0; check:type-check-debt :: 0; check:undeclared-dep-imports :: 0; check:watch-hint-literal :: 0; check:where-matcher :: 0. --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. Most gates ran on 776df8d5; the head after it changes only the row-38 revert (en/zh pack line, changeset bullet, one deleted pin) and a test's props, and the scripts/ gate ran after the revert. Outside derivation: pnpm --dir ui check:new-line-citations :: 0. CI families: PR #27830 check-runs not yet reported at report time.",
      "line_budget": "350 changed lines (added + removed) of source, copy and changeset; 759 of tests. Over the ~600 guideline on the test side, mostly new pins; nothing was cut for size.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create #27830: draft, no assignees, no review request; the harness's after-PR assign/review step was skipped per the dispatch order); this report comment via post-stamped. git push is not a REST write.",
      "deviations": [
        "PR body attribution links this card thread (session context), not the seat thread named in the order.",
        "PR body order: declaration lines (Part of, Clause-②, Metadata-protocol) right after the attribution, then 维护者速读, per os-dev.md.",
        "Commit trailers: model-free pair per AGENTS.md, not the harness's model-named Co-Authored-By.",
        "Row 38 not taken although it was bucketed TAKE at first: stopped on the file-surface breach as the claim says (see remainder)."
      ],
      "remainder": [
        "Row 38 (Studio access refusal names who grants access): change console.studio.accessRequired in locales en/zh, the inline defaultValue in ui/apps/console/src/components/StudioRoute.tsx and the NOTICE constant in its StudioRoute test together (check-i18n-call-site-keys ties the defaultValue to the en pack). Suggested en: 'You need Studio access to open Studio. An administrator can grant it with a permission set in Setup → Permission Sets.'",
        "docs/qa/platform-checklist/areas/studio-authoring.json still quotes the old '(one atomic release)' toast; outside the file surface."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "CARD row 24 · title: 'Studio: a name-only first step for New Package, with plain help' · body: The New Package dialog shows ManifestSchema's English .describe() text as help (package-schema.ts 'Help text') and asks for id/namespace up front; the landing overlay copy is pinned by BuilderLanding.environmentOverlayCopy-12171. A first step that asks only for a name and derives the rest, with plain help, is a dialog redesign plus a wording producer in packages/spec. · landing: ui/packages/app-shell studio-design New Package dialog + packages/spec package-schema describe() · dedupe words: new package dialog name only, ManifestSchema describe help, package namespace derive",
        "CARD row 27 (suggestion half; defect half is #27799) · title: 'Flow Update Records: a Triggering record target with field pickers' · body: In the Update Records node editor the author must type the object and the key names; offer a 'Triggering record' target that pre-fills the object from the trigger and field pickers for the keys. · landing: ui/packages/app-shell metadata-admin FlowNodeInspector update-records editor · dedupe words: update records triggering record, flow node field picker keys, update record object prefill trigger",
        "CARD row 28 (naming half) · title: 'Studio changes list: name each change in words' · body: Publish and the changes panel name flow-node changes in words since #27432 (carrier of #27356 row 17, flow nodes only); views, validation rules and other types still show keys. Name them by label (a view, a validation rule by its label, keys as words). · landing: ui/packages/app-shell preview/DraftChangesPanel + studio publish summary · dedupe words: draft changes panel change names, publish summary keys as words, validation rule change label",
        "CARD row 29 · title: 'Studio toasts: anchor near the canvas, not top-centre' · body: Toast placement is console-wide (ConsoleToaster top-centre by objectui#13340; bottom-right refused by objectui#7482). A Studio-only anchor needs a placement decision in shared chrome before code. · landing: ui/apps/console ConsoleToaster (decision first) · dedupe words: studio toast position, ConsoleToaster placement, toast anchor canvas",
        "CARD row 31 · title: 'Interfaces: Add view with a type choice' · body: The Interfaces list-view inspector has no 'Add view' that asks which type (grid, kanban, calendar…) to create. · landing: ui/packages/app-shell metadata-admin ObjectListViewInspector / Interfaces rail · dedupe words: interfaces add view type, list view inspector add view, new view type picker",
        "CARD row 36 · title: 'Formula editor: field picker, plain parser errors, error line placement' · body: The formula editor needs a field picker, parser errors in plain words, and the error line kept clear of the footer; InspectorShell does not overlay the footer in code, so the overlap needs a browser read first. · landing: ui/packages/app-shell metadata-admin formula field editor · dedupe words: formula editor field picker, formula parser error plain, formula error footer overlap",
        "CARD row 39 → fold into #27356 row 15 · title: 'Flow node help in plain words (engine descriptor descriptions)' · body: Node help is the engine's descriptor text (useFlowNodePalette adopts description), so the producer is service-automation http-nodes.ts and plugin-approvals. This widens #27356 row 15, now in flight in the seat's #27356 Studio-rows thread; fold it there rather than filing anew. · carrier: #27356 row 15 · dedupe words: flow node description help, node palette descriptor text, http node description plain"
      ]
    }
  7. 12 remaining items

  8. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibyekmZuiE5TVrwDWqH
    os-dev-report

    {
      "issue": 27521,
      "status": "done",
      "branch": "claude/project-thread-yg03y1",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28224",
      "head": "2582296ce06d02ba1b476da8b949b311a460971d",
      "session": "session_01L9qibyekmZuiE5TVrwDWqH",
      "premise_still_valid": true,
      "summary": "Rows 7, 8, 9, 10 (invite half), 11 and 23 of the claim, as amended by 6526355417. Platform objects: sys_invitation.status options carry labels (rejected reads Declined); one MEMBERSHIP_ROLE_PARAM_HELP built from BUILTIN_MEMBERSHIP_ROLE_OPTIONS on all six organization-role pickers; resend_invitation is a confirmation naming the invitee with email and role carried over; update_member_role's description names the member; the expired list projects role. Shared dialogs moved: ActionParamDialog (client-side email/url format check marked on the field, first-field initial focus via useInitialFieldFocus newly exported from @object-ui/plugin-form, whitespace-pre-line help), ActionConfirmDialog and ActionResultDialog (useActionDialogReturnFocus returns focus to the opener: a disabled action button including one Chrome blurred, a row menu trigger, the first opener across a param-to-result hand-over); useConsoleActionRuntime untouched. Invitation pages: Keep invitation on the workspace cancel dialog, InvitationLinkHint on both sign-in pages under by-invitation sign-up, and a joined state with a focused Continue on the accept page; four i18n keys in all ten packs.",
      "tests": "pnpm --filter @objectstack/platform-objects exec vitest run (after the first main merge, a78dee05) → Test Files 104 passed (104), Tests 1474 passed (1474), lock VERDICT command-exit 0. Affected ui suites before the focus follow-up → Test Files 944 passed (944), Tests 10202 passed | 15 skipped, VERDICT command-exit 0. Touched dialog/auth/organization/i18n suites at a78dee05 → Test Files 62 passed (62), Tests 543 passed (543), VERDICT command-exit 0. Type-check exit 0 for @object-ui/i18n, @object-ui/plugin-form, @object-ui/app-shell, @object-ui/console, @objectstack/platform-objects. Ablations (ui tests resolve the dialogs from source, no dist leg): focus changes reverted → 5 failed | 2 passed (7); last-activation read removed via scripts/ablation-replace.mjs (anchor 1 → 0, blob 6a631121312c → 8c9cd598c4ac) → 1 failed | 7 passed (8), the browser-blur case, restored blob == HEAD and git diff HEAD empty; format check removed → 3 failed | 7 passed (10); hint unrendered → 2 failed. Live (private stack, invite_only, Chromium): every row checked, detail in the PR body.",
      "gates": "local subset at a78dee05, dispatch-gates --commands (64 families), each run with stdin from /dev/null, exit codes on disk: all 64 exit 0. pnpm check:i18n first exit 1 after merging main (stale platform-objects dist), exit 0 after a closure rebuild with no file changes; check-plugin-teardown-shape --self-test first exit 3 on the shallow clone, exit 0 after fetching its pinned commit. dispatch-gates --ran: 64 derived, 64 run, 0 NOT-MEASURED, 0 UNRUN. node scripts/check-sdui-manifest.mjs exit 0 at the head. Head 2582296c merges 10 main commits that touch none of the 39 files; derivation unchanged. CI check-runs: in_progress at report time.",
      "line_budget": "n/a — no governed line ledger or skills/** file touched; diff 39 files, +1247 / -75",
      "dogfood_battery": "n/a — no ! in the PR title and Clause-②: yes (widening) carries no (narrowing) arm",
      "mcp_calls": "0 — no MCP GitHub tool called; reads via gh api REST GETs; harness subscribe_pr_activity on #28224 (not a GitHub write)",
      "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls via fleet-write run 41099487585, read-back identical 17482 bytes, no assignees); this os-dev-report comment via post-stamped",
      "deviations": [
        "Clause-② measured yes (widening) against the claim's expected no: @object-ui/plugin-form (published) exports useInitialFieldFocus and @object-ui/app-shell (private) exports InvitationLinkHint; Metadata-protocol measured none. The seat amends the claim if it accepts the measurement.",
        "ui/packages/plugin-form/src/index.tsx (one export plus its doc comment) is outside the claim's named paths; read under the amendment's shared-dialog-primitive allowance.",
        "Tests touched beside the claimed files: ui/apps/console/src/pages/auth/__tests__/AcceptInvitationRoute.test.tsx (toast assertion replaced by the joined state) and signUpFollowsPosture-11691.test.tsx (hint case).",
        "Long vitest runs that outlived the 600 s tool limit were moved to the background by the harness; each was waited for in the foreground and its log read on exit.",
        "The first three ablations used a copy-aside edit, not scripts/ablation-replace.mjs; all restored, the tree is clean at the head.",
        "Skipped the harness's post-PR assignee and reviewer step, per the frame."
      ],
      "files_changed": [
        ".changeset/27521-invitation-screens.md",
        "packages/platform-objects/src/apps/translations/en.objects.generated.ts",
        "packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts",
        "packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts",
        "packages/platform-objects/src/apps/translations/zh-CN.objects.generated.ts",
        "packages/platform-objects/src/identity/invitation-screens-copy.test.ts",
        "packages/platform-objects/src/identity/membership-role-help.ts",
        "packages/platform-objects/src/identity/sys-invitation.object.ts",
        "packages/platform-objects/src/identity/sys-member.object.ts",
        "packages/platform-objects/src/identity/sys-organization.object.ts",
        "packages/platform-objects/src/identity/sys-user.object.ts",
        "ui/apps/console/src/pages/auth/LoginPage.tsx",
        "ui/apps/console/src/pages/auth/__tests__/AcceptInvitationRoute.test.tsx",
        "ui/apps/console/src/pages/auth/__tests__/signUpFollowsPosture-11691.test.tsx",
        "ui/packages/app-shell/src/console/auth/LoginPage.tsx",
        "ui/packages/app-shell/src/console/auth/__tests__/defaultPagesFollowPosture-11705.test.tsx",
        "ui/packages/app-shell/src/console/auth/invitationArrival.tsx",
        "ui/packages/app-shell/src/console/organizations/__tests__/org-i18n-holdouts-4474.test.tsx",
        "ui/packages/app-shell/src/console/organizations/manage/AcceptInvitationPage.tsx",
        "ui/packages/app-shell/src/console/organizations/manage/InvitationsPage.tsx",
        "ui/packages/app-shell/src/index.ts",
        "ui/packages/app-shell/src/views/ActionConfirmDialog.tsx",
        "ui/packages/app-shell/src/views/ActionParamDialog.invitationScreens-27521.test.tsx",
        "ui/packages/app-shell/src/views/ActionParamDialog.tsx",
        "ui/packages/app-shell/src/views/ActionResultDialog.tsx",
        "ui/packages/app-shell/src/views/actionDialogFocus-27521.test.tsx",
        "ui/packages/app-shell/src/views/actionDialogReturnFocus.ts",
        "ui/packages/i18n/src/__tests__/invitation-screens-27521.test.ts",
        "ui/packages/i18n/src/locales/ar.ts",
        "ui/packages/i18n/src/locales/de.ts",
        "ui/packages/i18n/src/locales/en.ts",
        "ui/packages/i18n/src/locales/es.ts",
        "ui/packages/i18n/src/locales/fr.ts",
        "ui/packages/i18n/src/locales/ja.ts",
        "ui/packages/i18n/src/locales/ko.ts",
        "ui/packages/i18n/src/locales/pt.ts",
        "ui/packages/i18n/src/locales/ru.ts",
        "ui/packages/i18n/src/locales/zh.ts",
        "ui/packages/plugin-form/src/index.tsx"
      ],
      "remainder": [
        "Row 9, admin page: the declared Cancel Invitation confirm still reads Cancel / Cancel Invitation; its dismiss label needs a spec member on the action confirm.",
        "Row 11: pre-filling the invited email on the registration form is needs_decision against ADR-0138.",
        "Row 10, Create User half: the phoneNumber message and missing asterisks are not this claim's (Create User's dialog does get the row 23 focus fix)."
      ],
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim amendment 2 · 2026-10-30T17:37Z · amends claim 6526176786 and amendment 6526355417 at the card thread's request (os-dev-report 6529206941). Append-only.

    1. Clause-②: yes (widening: @object-ui/app-shell exports InvitationLinkHint and @object-ui/plugin-form exports useInitialFieldFocus; no accept set moves)
    2. Surface, recorded: ui/packages/plugin-form/src/index.tsx (the useInitialFieldFocus export, which is row 23's shared first-field focus and the "shared dialog primitive" the claim allows) and the four generated packages/platform-objects/src/apps/translations/*.objects.generated.ts bundles (the translations of the new metadata labels and help text, part of the claim's i18n packs). sys-member, sys-organization and sys-user take the shared role help text under packages/platform-objects/src/identity/**.
    3. Remainder on this card: row 9's dismiss label (needs a spec member), row 11's email pre-fill (needs_decision against ADR-0138's amendment), and row 10's Create User half. PR fix(ui,platform-objects): invitation screens — labelled statuses, role help, resend as a confirmation, dialog focus and email check #28224 carries Part of #27521.

    The widening puts a contract face on PR #28224, so it goes to the contract-review lane before the seat lands it.

  10. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Landed · 2026-10-30T20:51Z · PR #28224 (seat ACCEPT pinned to 5b5f464e, contract-review PASS 6532423369).

    reading value
    PR merged 2026-10-30T20:49:36Z as f40b777d through the merge queue
    origin/main content packages/platform-objects/src/identity/membership-role-help.ts and ui/packages/app-shell/src/views/actionDialogReturnFocus.ts present

    State: the PR is Part of #27521, so this card stays open. Rows 7, 8, 23 and the rest of the claimed set are done. What remains:

    • Row 9: the dismiss label needs a spec member first.
    • Row 11 pre-fill: needs_decision against ADR-0138's amendment, which masks the invited address on the signed-out preview. The maintainer makes this call.
    • Row 10: the Create User half.

    The copy-button finding is #28186, serial after this PR and now unblocked. pm:dispatched comes off and pm:queue goes back in the same stroke as this note, with the assignee cleared, so the remainder can be claimed again.

  11. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    director#2 · os-tesla · session_01L9qibxdiybU8ehPKBroYE3

    Ruling: batch #432 item 7 · letter B · maintainer 「同意」 2026-10-31T15:15Z

    Row 11 (sign-up form pre-fills the invited address) is answered: B, will-not-do. Presented to the maintainer (his 「同意」 landed at 2026-10-31T15:10Z) as item 7 of batch #432 (the consolidated 待 Tesla 决裁清单 of 2026-10-31T14:40Z); the maintainer answered the batch, verbatim: 「同意」 = every item at its recommendation.

    Why B: ADR-0138's amendment has the signed-out invitation preview mask the invited address, and PR #28224 (merged, Part of this card) shipped that mask with the sign-in hint and the joined state. Pre-filling the address on the sign-up form would put the masked value back on a signed-out page, which contradicts the ADR and the #28386 line that treats an invitation link as a bearer credential. The row stays as shipped: the invitee signs in or signs up and types the address; the server still binds the invitation to the invited address on accept.

    Execution: no PR. Whoever picks up the remaining rows of this card (9/10/11 bits) treats row 11 as closed by this record. Recorded at 2026-10-31T15:15Z.

  12. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibw2uhdSeHYfnZdAf4V

    Claim: PM loop round 2 · 2026-11-01T04:35Z · the card's last open items
    Session: session_01L9qibw2uhdSeHYfnZdAf4V (seat; implementation by card thread session session_01L9qibzwDG6ZV4BgLRC4oHH, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-72cqam
    Worktree: objectstack-issue-27521
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: docs/qa/platform-checklist/areas/studio-authoring.json (the one step that still quotes the retired "(one atomic release)" publish toast; with the area's revision bump and history entry if check:platform-checklist demands it), root changeset only if a gate asks for one (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: default, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: none
    Premise: holds for the docs line. The card thread's row ledger, /mnt/project-files/ui-seat-1/r2026-10-31b/out/27521-ledger.md (main efb1620c): 38 of 39 rows already disposed (PRs #27849, #27830, #28224; own cards; row 11 ruled will-not-do 6545261914; row 10's Create User half #27857, closed). Row 9's admin half (the Cancel Invitation confirm's dismiss label) needs a spec key and is filed as #28519 (domain:spec), which takes the row.
    Serial constraints cleared: none touch the checklist file.
    Order: /mnt/project-files/ui-seat-1/r2026-10-31b/dispatch-27521-ledger.md, Step 2. The PR carries Fixes #27521: with this line and #28519 every row is disposed.

  13. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzwDG6ZV4BgLRC4oHH
    os-dev-report

    {
      "issue": 27521,
      "status": "done",
      "branch": "claude/project-thread-72cqam",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28526",
      "head": "5e94fc038d410a18716d738ca65b3abdd6dce303",
      "session": "session_01L9qibzwDG6ZV4BgLRC4oHH (card thread; seat session_01L9qibw2uhdSeHYfnZdAf4V)",
      "premise_still_valid": true,
      "summary": "Step 1 row ledger on main efb1620c: 38 of 39 rows were already disposed (PRs #27849, #27830, #28224; own cards; rulings). Row 9's admin dismiss label needs an ActionSchema key, and the seat carded it as #28519. Step 2 (claim 6553466756): docs/qa/platform-checklist/areas/studio-authoring.json, item studio-authoring.first-run-loop, steps[3] now quotes the publish toast as main draws it ('Published N items in this package' / '...1 item...', fallback unchanged, plus the permission-set hint and Open Access an object publish adds), instead of the retired '(one atomic release)' text. Revision 8 to 9 with a history entry. PR body carries Fixes #27521 and the row ledger.",
      "tests": "No test or code surface changed (one docs JSON file). JSON parses; item revision 9 equals the newest history revision 9. Quoted strings read from ui/packages/i18n/src/namespaces/studio/en.ts 3140-3145 and StudioDesignSurface.tsx 1885-1930 at efb1620c; the toast was not re-driven live. No ablation (docs only).",
      "gates": "dispatch-gates --commands (5e94fc03): 16 derived. Each run with stdin /dev/null: check-adr-links :: 0; --self-test :: 0; check-closing-keyword-parity :: 0; --self-test :: 0; check-comment-mask-corpus :: 0; ci/plan-test-core-shards --self-test :: 0; @objectstack/lint check:doc-formula-expressions :: 3 first (prerequisite refusal, formula/lint dist absent, nothing measured), then 0 after turbo build of formula+lint (lock VERDICT command-exit 0); check:ci-filter-parity :: 0; check:cross-package-test-inputs :: 0; check:doc-authoring :: 0; check:driver-memory-census :: 0; check:gitlink-declared :: 0; check:nul-bytes :: 0; check:platform-checklist :: 0; check:refd-timer-probe :: 0; check:watch-hint-literal :: 0. Outside derivation: check-sdui-manifest :: 0. --ran: 16 derived, 16 run, 0 NOT-MEASURED. CI check-runs: not yet reported at report time.",
      "line_budget": "n/a — no skills/** or governed surface; diff 1 file, +4 / -3",
      "files_changed": ["docs/qa/platform-checklist/areas/studio-authoring.json"],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "1 — mcp__github__issue_read (27521 get); no write tool. Other reads via gh api REST GETs.",
      "api_writes": "2 — fleet-write relay pr_create (objectstack#28526, run 41274697466, read-back identical 6610 bytes, no assignees, label skip-changeset); this os-dev-report comment via post-stamped",
      "deviations": [
        "The ran list keeps the first exit-3 line of check:doc-formula-expressions with an annotation beside the green rerun line; --ran read it as outside the derivation and counted the rerun.",
        "Primary checkout detached so the thread branch could be checked out in worktree objectstack-issue-27521 (the claim's worktree name).",
        "Harness post-PR assignee/reviewer step and PR subscription skipped per the frame."
      ],
      "open_questions": [],
      "out_of_scope_findings": []
    }
  14. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibw2uhdSeHYfnZdAf4V

    Landed · 2026-11-01T05:20Z · PR #28526 merged through the merge queue as 37184244 at 2026-11-01T05:18:56Z. Seat ACCEPT 6553716269 (5e94fc03).

    probe before (37184244~1) now (origin/main)
    steps[3] quoting "Published 1 item in this package (one atomic release)" in docs/qa/platform-checklist/areas/studio-authoring.json 1 0
    "Published N items in this package" in the same file (step + history) 0 2
    revision 9 history entry (2026-11-01) 0 1

    The card closed on Fixes, and pm:dispatched is removed in the same stroke as this note. Row 9 (the dismiss label on the Cancel Invitation confirm) remains open on spec card #28519.

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