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 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

    Studio rows 24–39 ACCEPT → PR #27830 comment 6512869777 · 2026-10-30T01:42Z


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    os-dev-report

    {
      "issue": 27521,
      "status": "done",
      "branch": "claude/project-thread-uywna1",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27849",
      "head": "5a54fd9875ae7fe97a162217f2a60276d29064f3",
      "session": "session_01Utp6CZLnkdSxVfvNuQ6RgB (card thread; seat session_01Utp6CY2n1JmZZKrHgtp9jC)",
      "premise_still_valid": true,
      "summary": "Setup rows 1-23 except 6, re-observed on main 561b7642 in Chromium (stock app-showcase --seed-admin, admin). Taken in PR 27849 (ui only, pinned): 1, 4 (info/warning colour), 5 (keyboard-reachable tag tooltip), 12+22 (forced-reset overlay body and 'Temporary password', ten packs), 13 (tab strip scroll + edge fade), 20 (confirm before switching an action off, toast, object label, phone layout), 21 (read-only reason, Disable confirm, 'Delete package', Installed Apps subtitle). Fixed on main: 16 name derivation; 18 by PR 27808 (taken from main at the merge, so no Fixes line). Carded (paragraphs below, the seat files): 2, 3, 4 rest, 10 Create User half, 12 result line, 13 rest, 14, 15 columns, 16 order + stacked messages, 17, 19, 22 rest. Will-not-do: 5 empty states, 15 hover reveal. Rows 7, 8, 9, 10 Invite half, 11, 23 follow #27797 in a separate PR (seat's instruction). PR body carries Refs #27521 per the seat.",
      "tests": "On head 5a54fd98 after merge + install + full build (114/114): pnpm --dir ui exec vitest run (setup/, PackagesPage*, AssignedUsersSection*, RemediationOverlay*, console/home/, AppSwitcher*, app-shell components/, fields __tests__/, components page-tabs*, i18n/, scripts/) -> Test Files 483 passed | 3 skipped, Tests 9777 passed | 22 skipped, lock VERDICT command-exit 0. Ablation (source-resolved, no dist): ablation-replace on PackagesPage.tsx Disable onClick -> anchor 1->0, blob 032c769d->41626a6b, readOnlyReasonAndDisableConfirm-27521 2 failed / 6 passed; restored blob == HEAD 032c769d, git diff HEAD empty.",
      "gates": "dispatch-gates --commands (2c0f76c9) derived 34 families, all run, --ran reconciliation: 34 run, 0 NOT-MEASURED. Lines: node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0 | node scripts/check-adr-0087-registration.mjs --self-test :: exit 0 | node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0 | node scripts/check-closing-keyword-parity.mjs :: exit 0 | node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 | node scripts/check-comment-mask-corpus.mjs :: exit 0 | node scripts/check-empty-changeset.mjs --base origin/main :: exit 0 | node scripts/check-empty-changeset.mjs --self-test :: exit 0 | node scripts/check-sdui-manifest.mjs :: exit 0 | node scripts/check-sdui-manifest.mjs --self-test :: exit 0 | node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0 | node scripts/release-pending-publish.mjs --self-test :: exit 0 | pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0 | pnpm check:changeset-gate-self-tests :: exit 0 | pnpm check:closed-ceremony-text :: exit 0 | pnpm check:cross-package-test-inputs :: exit 0 | pnpm check:dispatcher-error-vocabulary :: exit 0 | pnpm check:driver-memory-census :: exit 0 | pnpm check:engine-double-contract :: exit 0 | pnpm check:gitlink-declared :: exit 0 | pnpm check:nul-bytes :: exit 0 | pnpm check:pm-changeset-deadline-census :: exit 0 | pnpm check:published-files :: exit 0 | pnpm check:query-options-erasure :: exit 0 | pnpm check:refd-timer-probe :: exit 0 | pnpm check:skill-identifier-liveness :: exit 0 | pnpm check:test-source-alias :: exit 0 | pnpm check:tier-file-adoption :: exit 0 | pnpm check:type-check-coverage :: exit 0 | pnpm check:type-check-debt :: exit 0 | pnpm check:undeclared-dep-imports :: exit 0 | pnpm check:watch-hint-literal :: exit 0 | pnpm check:where-matcher :: exit 0 | pnpm --dir ui exec vitest run scripts/ :: exit 0 | pnpm --filter @object-ui/components run type-check :: exit 0 | pnpm --filter @object-ui/fields run type-check :: exit 0 | pnpm --filter @object-ui/i18n run type-check :: exit 0 | pnpm --filter @object-ui/app-shell run type-check :: exit 0 | eslint (changed ui files) :: exit 1 | pnpm --dir ui check:new-line-citations :: exit 0 | eslint (changed ui files, inline config honoured) :: exit 0. One interim red: 'vitest run scripts/' first ran with packages/i18n/ and failed de-quote-pairing-3876 (new de strings quoted); fixed in ed05c2ac, green in the final run. ESLint --no-inline-config on changed ui files: 1 pre-existing error in containers.tsx (react-hooks/static-components, disabled inline on main); with inline config: 0 errors. CI check-runs: in_progress at report time (not waited, per os-dev).",
      "line_budget": "n/a — no skills/** or governed surface in the diff",
      "files_changed": 39,
      "deviations": [
        "Harness post-PR assign/review step skipped (dispatch: no assignee, no reviewer). PR activity not subscribed (os-dev dispatch contract over the platform posture).",
        "PR body says Refs #27521 (seat's instruction 01:07Z) instead of the order's 'Part of #27521'; no Fixes #27433 because PR 27808 landed row 18 first.",
        "File surface: ui/packages/components (page:tabs renderer + a package-private hook) and ui/packages/fields (semantic colour map) are shared renderers Setup draws, touched for rows 13 and 4; the studio i18n namespace (en, zh) is touched for engine.packages.* keys only, beside seat 3's Studio keys."
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "4 — mcp__github__issue_read x4 (27521 get + comments, 27504 get, 27797 get); no write tool",
      "api_writes": "2 — fleet-write relay pr_create (objectstack#27849, run 40989560767, read-back identical 14131 bytes); post-stamped os-dev-report comment on #27521",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: seat 2 — the carded rows below are row dispositions of this card, not side findings; listed for the seat to file"
      ]
    }

    Filing-ready paragraphs (the seat files them; re-observed at main @ 561b7642, stock examples/app-showcase --seed-admin, admin, Chromium 1440×900: rows 2, 3, 4, 13 tab strip, 14 list, 15, 16, 19 and 20. Rows 10, 12 result line, 13 rest, 14 grant message and 22 rest are the walkthrough's readings at c4c515ad with the source line confirmed on main, not re-driven here)

    1. Row 2 — Settings help text speaks to engineers (server copy). Who: an administrator in Setup → Settings. What happens: Authentication's help reads invite_only / email_domain / open and OS_AUTH_REQUIRE_EMAIL_VERIFICATION=false; Feature Flags reads OS_FEATURE_FLAGS_AI_ENABLED=true; Mail mentions sys_email; the Webhooks subtitle reads defineStack({ webhooks }) / defineWebhook() / "webhook auto-enqueuer"; an inherited value's badge names the layer "Tenant". Where: packages/services/service-settings/src/manifests/auth.manifest.ts, feature-flags.manifest.ts, mail.manifest.ts and their translations/*; the sourceLabels.tenant string; packages/plugins/plugin-webhooks/src/sys-webhook.object.ts description. Wanted: business wording in help, the technical detail behind a "learn more" (a docs link) rather than in the sentence. Reach: every administrator opening Settings, today. Dedupe words: settings help machine values env var.
    2. Row 3 — Settings sidebar and hub disagree (server nav). What happens: the sidebar says "Email" (nav_settings_mail) where the hub card says "Mail Delivery"; the hub lists SMS Delivery and Data Lifecycle, the sidebar has neither. Where: packages/platform-objects/src/apps/setup-nav.contributions.ts (Configuration group) against the manifests' title in service-settings. Wanted: one name per settings page and the same set in both. Reach: every administrator. Dedupe words: setup nav settings sidebar hub mismatch.
    3. Row 4 rest — raw machine values in System Overview and Notifications (server metadata). What happens: the "Audit Events by Action" legend and table show config_change, because the sys_audit_log_metrics dataset declares action as type: 'string' (packages/platform-objects/src/apps/dashboards/system.datasets.ts); Notifications shows topic approval.requested and source sys_approval_request raw (topic and source_object are Field.text in sys-notification.object.ts), and severity options carry lowercase labels (Field.select(['info','warning','critical'])); Users carry "Env-Native" (sys-user.object.ts identity-source option). Wanted: labelled dimension values, a topic/object label, title-case option labels. Reach: every administrator on System Overview / Notifications. (The info badge colour is fixed in this PR.)
    4. Row 10, Create User half — "Either email or phoneNumber is required" (server). What happens: Create User with Email empty answers that sentence (packages/plugins/plugin-auth/src/admin-user-endpoints.ts, badRequest('Either email or phoneNumber is required')); phoneNumber is an API key and the form has no phone field; the dialog shows no required marks because its params are declared optional in sys-user.object.ts. Wanted: "Email is required" (or "Email or phone number is required" where phone sign-in is on), and the param marked required when phone sign-in is off. Reach: every administrator creating a user.
    5. Row 12, Create User result — the copy line shows when no password was generated (server). What happens: after Create User with a typed password, the result still says "If a temporary password was generated, copy it now" (sys-user.object.ts, two result texts). Wanted: the line only when the server generated one. Reach: every administrator creating a user with a typed password.
    6. Row 13 rest — the user record hides Locale and ban state (server page metadata). What happens: Details shows only created/updated, so a saved Locale is invisible; no Banned badge or ban reason; "Platform Role: user" is lowercase. Where: sys-user.object.ts (record page sections, highlight fields, role option labels). Wanted: Locale, ban state and reason on Details; a label for the platform role. Reach: every administrator opening a user. (The cut tab strip is fixed in this PR.)
    7. Row 14 — a user's Permission Sets tab shows API names (ui + server). What happens: the related list shows organization_admin_no_bypass / admin_full_access: sys_user_permission_set.permission_set is a by-name text column with widget: 'permission-ref', and no list cell reads a registry label for it. Wanted (ui card, @object-ui/fields): a read face for permission-ref / position-ref cells that draws the registry label with the name on title. Wanted (server card): the role change that auto-grants a set says so in its result. Reach: every administrator opening a user.
    8. Row 15 columns — no Status or Role on the Users list (server). Where: sys-user.object.ts list views (all_users columns: name, email, phone, email verified, identity source, created). Wanted: Status (banned) and Role columns. Reach: every administrator on Users.
    9. Row 16 rest — New Permission Set puts Name first and stacks three messages. (a) spec: packages/spec/src/security/permission.form.ts orders Name before Label and leaves Label optional; wanted Label first and required. (b) ui card, ResourceEditPage: a bad name saves anyway and draws the server refusal ("is not a legal metadata item name"), the client summary ("does not match the spec — 1 validation error(s)") and the inline error; wanted the inline error alone, with the save held while the client validator refuses. Name derivation from Label already works on main. Reach: every administrator creating a set.
    10. Row 17 — the permission-set grid at 1440 and on a phone (ui, too large here). Where: ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.tsx. What happens: sideways scroll at 1440 with the Bulk column cut and no cue; the Object column is not sticky on a phone; two fields are both labelled "Owner"; with field rows expanded the header labels drift from their columns. Wanted: sticky first column, an overflow cue, disambiguated labels, aligned headers. Reach: every administrator editing a set.
    11. Row 19 — Company settings country, locale and timezone are free text (server manifest). Measured: Country "de" is still refused ("1 setting needs attention: Country"), the input has maxlength=2. Where: packages/services/service-settings/src/manifests/company.manifest.ts (country is type: 'text' with a two-letter pattern; locale and timezone are text). Wanted: pickers (a select of ISO countries, locale and IANA timezone), with the code stored. Reach: every administrator filling Company.
    12. Row 22 rest — French user, English strings (server). (a) a wrong temporary password answers English "Invalid password" (plugin-auth / better-auth, no code the console localises); (b) the Home feed reads Updated User "Carl Edited": Banned et Ban Reason: the field labels are untranslated because platform-objects ships no fr bundle for sys_user; (c) the Locale help says "Preferred language for this user's notifications" (sys-user.object.ts), but the setting switches the whole UI. Wanted: a coded refusal the console can translate, the missing translations, a corrected help line. Reach: every non-English user. (The forced-change body and field are fixed in this PR.)

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    Landed (Setup rows, seat 2's second claim 6511270445) · 2026-10-30T02:42Z

    probe reading
    PR #27849 merged through the queue at 2026-10-30T02:42Z, merge commit d07e8d1b6b954ed66c821a81a5d14f3c77018236
    taken (ui halves) rows 1, 4, 5, 12, 13, 20, 21, 22
    carded #27853 #27854 #27855 #27857 #27858 #27859 #27861 #27862 #27863 #27864 #27865 #27866 #27867 #27869
    will not do row 5 empty states, row 15 hover reveal (reasons in the PR body)
    fixed on main row 16 name derivation; row 18 (#27808)
    still open Invitations rows 7, 8, 9, 10 (invite half), 11, 23: wait on #27843 (ruling E on #27797) and go in a separate PR; Studio rows: seat 3's claim

    State: this card stays open and pm:dispatched. Seat 2 keeps the Invitations rows and re-dispatches them once #27843 is on main.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    Release (seat's own claim 6511270445, end of shift) · 2026-10-30T13:58Z


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim: PM loop round 3 · 2026-10-30T15:13Z
    Session: session_01L9qibzC6RxMfB59EsgAoNN (seat; implementation by card thread session session_01L9qibyekmZuiE5TVrwDWqH, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-yg03y1 (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#1
    File surface: the Invitations rows 7, 8, 9, 10, 11 and 23 only. packages/platform-objects/src/identity/** (invitation object and shared role options, metadata only, platform first), ui/packages/app-shell/src/console/organizations/manage/**, ui/packages/app-shell/src/console/auth/**, ui/packages/auth/src/**, a shared dialog primitive only if row 23 lands there, i18n packs, tests, root changeset (stop on breach; explain in the report)
    Container & model: L, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: xhigh
    Clause-②: no
    Metadata-protocol: measure (option labels or action params on sys_invitation are object metadata; named in the report)
    Responsibility: n/a (suggestion rows, not a defect card)
    Thread-read: 6524603067
    Premise: holds (seat 2's release 6524603067 leaves these six rows claimable; their blocker #27843 closed by PR #27902 f552fa81f1)
    Serial constraints cleared: #27797 (row 6, test-only pin, this seat) runs in parallel and doesn't edit these files; no open PR touches the files (seat scan 15:10Z); domain:ui#2 told on #25995

    The PR carries Fixes #27521 only if all six rows land, otherwise Part of #27521. Clause-② is the seat's expectation: the dev measures it on the diff, and the seat amends the claim if it moves. Order: /mnt/project-files/ui-seat-1/r2026-10-30/dispatch-27521.md under FRAME.md.

  6. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim amendment · 2026-10-30T15:21Z · amends claim 6526176786 at the card thread's request. Append-only.

    1. Shared action dialogs (in the claim, confirmed): rows 23, 10 (client email check, inline field error) and 8 (help text keeps its line breaks) land in ui/packages/app-shell/src/views/{ActionParamDialog,ActionConfirmDialog,ActionResultDialog}.tsx and ui/packages/app-shell/src/hooks/useConsoleActionRuntime.tsx. Every console action dialog uses these, so the PR body names each dialog the change moves, and the pins cover a non-invitation action as well.
    2. Widened: File surface adds ui/apps/console/src/pages/auth/LoginPage.tsx, for one render line of the shared invited-person hint (row 11, sign-in half). The hint component itself stays under ui/packages/app-shell/src/console/auth/**.
    3. Recorded as remainder, not built: row 9's "Keep invitation" dismiss label needs a spec member (no cancel-button key on ActionSchema; ⛔ no spec edit on this card). Row 11's email pre-fill is needs_decision, because it conflicts with ADR-0138's amendment (the signed-out preview masks the invited address). The PR therefore carries Part of #27521, not Fixes.

    Serial re-check 15:22Z: no open PR touches these files. Seat 3 holds #27356's Setup rows, so the dev checks its live claim's file surface before the first push.

  7. 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

  8. 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.

  9. 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.

  10. 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.

  11. 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.

  12. 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": []
    }
  13. 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