Skip to content

Console and CLI polish from the real-user walkthrough #30126

Open

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

From a real-user walkthrough of the development flow, filed on the maintainer's word: 「第二组第三组也同意」 (2026-11-04). Measured on main 987ff33b88 unless a line says otherwise. Test project scaffolded with create-objectstack@18.3.0.

Each row works today but could be clearer. Rows marked 18.3.0 were seen on the published release and not re-run on main.

Console

# Observed Where Suggestion
1 Dialog title 新建Repair Ticket, with no space between Chinese and Latin main; ui/packages/i18n/src/locales/zh.ts:229 新建{{object}} Space when the object name starts with a Latin letter
2 The create dialog opened from a lookup has no title; it starts at the section name "Details" main, by DOM: no h2 Title it 新建 and the object label
3 An action with no successMessage toasts 「操作已成功完成」, which does not say what happened main code, ui/packages/core/src/actions/ActionRunner.ts:643; seen on 18.3.0 Name the action: "Resolve 已完成"
4 Every entry in an app's sidebar has the same icon; navigation does not take the object's icon main Inherit the object's icon when an entry names none
5 Setup's collapsed sidebar is 20+ icons with no text main Tooltips at least, or keep it expanded by default
6 Field labels on the record page differ in style: REPAIR COST beside 负责人 main One label style
7 Money differs by surface: record ¥1,280.50, dashboard ¥1,280.5 (18.3.0) and ¥1,293 for 1293.00 (main). #27520 row 16 asked for one format per column; this is the metric card Both Metric cards keep the currency's decimals, unless the author sets otherwise
8 Notification list shows the raw topic notify 18.3.0 Hide it or give it a label
9 A mention title reads 「李四 mentioned you」 in a Chinese console. The zh text exists (plugin-audit/src/translations/messages.ts:37); the title follows the recipient's sys_user.locale, then the deployment default, and a new user has no locale 18.3.0, code read on main Give new users a locale, or use the language they last used
10 The success toast covers the Assignee in the record header for a few seconds 18.3.0 Move it, or shorten it
11 A chart with one bar of value 1 has an axis to 4 and a bar filling the width 18.3.0 Axis fits the data
12 Opening the Setup app without access answers You do not have permission to open the 'com.objectstack.setup' app. in English, where other refusals are localized main; packages/rest/src/meta-item-read-gate.ts:797,1693 Localize

CLI and MCP

# Observed Where Suggestion
13 os package export takes -u and -t; os package install takes -r, --email and --password main, both --help One way to name the server and the credential
14 A page opened while os dev restarts stays on the splash with an empty root, and does not retry or say anything 18.3.0, console served by the server Retry, or show a message
15 An MCP argument error tells the reader the fix, then adds history for internal developers: "This argument used to be dropped silently…" main; packages/mcp/src/mcp-http-tools.ts:706 Drop the history sentence
16 list_actions gives a plain member all 36 actions, including ban_user and set_user_manager, and invite_user four times, on four objects. Not a hole: ban_user by that member is refused over REST and OAuth MCP (403 Admin role required) and over an API key, and the target stayed unbanned. An admin over OAuth MCP succeeds; an admin with an API key gets a clear refusal. #28943 fixed one case of this family main List only what this caller could run

Activity

  1. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p3 · domain:ui · pm:queue · 2026-11-04T16:34Z

    ⛔ Not a claim.

    • Read fresh. Console and CLI polish rows from the walkthrough (spacing, dialog titles, generic toasts). Each works today. p3.

    Generated by Claude Code

  2. added
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 4, 2026
  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif

    Claim: PM loop round 3
    Session: session_01L6bhgVwQZbHRRM9CaXeKif
    Account: os-sales
    Branch: claude/project-thread-poei5v (card thread of this project; a thread can push only its designated branch — measured platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-30126
    Domain: domain:ui
    Seat: domain:ui#5
    File surface: items 1, 2, 3 and 7 only — ui/packages/i18n/src/locales/*.ts (new keys / the zh createTitle spacing), ui/packages/fields/src/widgets/LookupField.tsx and ui/packages/app-shell/src/hooks/useActionModal.tsx (the lookup's create modal title), ui/packages/core/src/actions/ActionRunner.ts (the generic success sentence), ui/packages/plugin-dashboard/src/MetricWidget.tsx (currency decimals), their tests, one root .changeset/. ⛔ packages/**, ⛔ AppHeader.tsx, ⛔ RecordDetailView.
    Container & model: M, mode:thread, model: default — dispatch-gates --tier: no path-derived mandate, effort: high
    Clause-②: yes
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6636204050
    Premise: holds (items 1, 2, 3, 7 read on origin/main; the dev re-measures each before fixing)
    Serial constraints cleared: #30326 (this seat) and PR #30243 add other keys to the same locale files: the dev merges main before the final push. #30390 (domain:ui#3) names no file of this surface. Items 4–6 and 8–16 are out of this claim (server, CLI/MCP, re-measure on main, or held by #30344 / #30390) and stay on the card.

    Scope: Part of #30126. Clause-② yes (widening) if a new i18n key lands: the seat's TIER_DEFAULT review before the queue. Dispatch order lives in the card thread's opening message.

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif

    Claim amendment (claim 6657997438), item 1 shape — seat ruling.

    • Neither a global zh post-processor nor a blanket 新建 {{object}}. A post-processor over every zh interpolation reaches far past this card (every count, id and name in the zh bundle); a blanket space breaks the pinned 新建联系人 style.
    • Ruled shape: an opt-in i18next formatter registered in ui/packages/i18n/src/i18n.ts that pads the interpolated value with one space on a side where it meets a CJK character with a Latin letter or digit, applied only where a zh value names an object in {{object}} and opts in (form.createTitle / editTitle / viewTitle and their :2177 twin). Every other key and every static string is untouched; 新建联系人 stays as pinned; the one pin that encodes the defect ('新建Contacts') moves.
    • File surface added: ui/packages/i18n/src/i18n.ts and its test.
  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif

    Claim amendment 2 (claim 6657997438; amends 6658078173), from the card thread's measured findings.

    • Item 1 mechanism. The formatter spelling {{object, fmt}} would break the ten-locale {{name}}-only rule pinned by ui/packages/i18n/src/__tests__/fallback-placeholder-spelling-3512.test.ts. So the ruled intent moves to an i18next postProcessor registered in ui/packages/i18n/src/i18n.ts. It is still opt-in: it acts only on a key-listed table (form.createTitle / editTitle / viewTitle, and the console.ai.recordWriteCreateTitle / UpdateTitle object value), only in zh, and only where an interpolated value whose edge is a Latin letter or digit meets a CJK character. Pack spellings, 新建联系人, and every other key and static string are unchanged. File surface unchanged from amendment 1.
    • Item 7 mechanism. The card's two readings (¥1,280.5 on 18.3.0, and 1293.00 shown as ¥1,293 on main) come from DatasetWidget → formatMeasure in ui/packages/core/src/utils/dataset-format.ts, not from MetricWidget. With no author format, currency now takes the currency's own minor digits (CNY 2, JPY 0), the same rule as the list cell's formatCurrency. MetricWidget's static card has the same defect class and is fixed by the same rule, inside the already-claimed MetricWidget.tsx.
    • File surface added: ui/packages/core/src/utils/dataset-format.ts and its test. At 2026-11-05T12:37Z no open PR touches it or ui/packages/i18n/src/i18n.ts.
  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgTuQiDduLj5Xcj3KMa
    os-dev-report

    {
      "issue": 30126,
      "status": "done",
      "branch": "claude/project-thread-poei5v",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30495",
      "head": "70fc02c985ebabfdb6756df72640447207f9512e",
      "session": "session_01L6bhgTuQiDduLj5Xcj3KMa",
      "premise_still_valid": true,
      "items": {
        "1": "reproduced on main 989ae42d live (zh 新建Repair Ticket); fixed: key-listed zh i18next postProcessor in ui/packages/i18n/src/i18n.ts (form.createTitle/editTitle/viewTitle, console.ai.recordWriteCreateTitle/UpdateTitle); packs unchanged; 新建联系人 unchanged",
        "2": "reproduced (lookup inline create dialog had no heading); fixed in useActionModal objectName+create branch: form.createTitle with the object label; authored title wins; edit not titled",
        "3": "reproduced (操作已成功完成); fixed in ActionRunner composeSuccessMessage: labelled action -> new key actions.completedNamed (10 packs, zh “{{action}}”已完成); unlabelled keeps completedSuccessfully",
        "7": "reproduced on main (¥1,293 for 1293.00); fixed in core dataset-format.ts formatMeasure (currency with no format = currency minor digits) and MetricWidget static card (same rule)"
      },
      "summary": "Items 1, 2, 3 and 7 of #30126 implemented in one draft PR, each reproduced live on main first. Every item reproduced, none dropped. Two mechanism deviations from the dispatch, both agreed by the seat in claim amendment 2: item 1 is a key-listed postProcessor, not a pack formatter; item 7 root cause is core formatMeasure, not MetricWidget.metricPatternDecimals.",
      "deviations": [
        "item 1: dispatch/seat formatter spelling inside the pack value breaks fallback-placeholder-spelling-3512.test.ts (objectui#3512/#4135 ruling: packs use {{name}} only) -> key-listed zh postProcessor in i18n.ts; seat agreed (amendment 2, comment 6658174549)",
        "item 7: readings come from DatasetWidget -> core formatMeasure (min 0 / max 2), not MetricWidget.metricPatternDecimals; seat added ui/packages/core/src/utils/dataset-format.ts + test to the surface",
        "bounded in-place: form.editTitle, form.viewTitle, console.ai.recordWriteUpdateTitle share createTitle shape and are in the key list (same class, mechanical, same gate families, no other claim on i18n.ts)",
        "moved pins in 4 app-shell tests + MetricWidget.numberFormat (,930,000.00 / 1.930.000,00 €): each read the old generic toast or the old whole-unit width"
      ],
      "remeasure": "18.3.0 vs main: formatMeasure currency branch is byte-identical at the @object-ui/*@18.3.0 release commit 83d7e4ae and on main (minimumFractionDigits: decimals ?? 0, maximumFractionDigits: decimals ?? 2). Intl zh-CN CNY with that pair: 1280.5 -> ¥1,280.5 (the 18.3.0 report), 1293 -> ¥1,293 (the main report); with no fraction options: ¥1,280.50 / ¥1,293.00. Live on main 989ae42d (showcase stack, repair_metrics dataset sum 1280.5+12.5): before ¥1,293, after ¥1,293.00. Static MetricWidget on main with currency and no format: ¥1,281 (whole units), after ¥1,280.50.",
      "tests": "vitest touched packages after the main merge: Test Files 100/100, Tests 1508/1508 passed. pnpm --dir ui exec vitest run scripts/: 170 files passed (2 skipped), 4985 tests passed. Ablations, each reverted and git diff HEAD empty after: postProcess off -> 1 failed; modal title off -> 2 failed; named toast off -> 3 failed; formatMeasure width back -> 3 failed; MetricWidget width back -> 4 failed.",
      "gates": "local: node scripts/pm/dispatch-gates.mjs --commands -> 35 derived families, all run, all exit 0; --ran reconcile: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. type-check exit 0: @object-ui/i18n, core, react, plugin-dashboard, app-shell (i18n + app-shell re-run after merge). pnpm --dir ui run check:spec-symbols exit 0. check:new-line-citations 0 new. eslint: 1 pre-existing error MetricWidget.tsx (react-hooks, on base at line 419), warnings only otherwise. CI: PR just opened, check-runs pending at report time; seat reads them at ACCEPT.",
      "line_budget": "25 files, +402 / -26 total; non-test non-changeset source +153 / -14",
      "files_changed": [
        ".changeset/30126-console-copy-titles-toast-money.md",
        "ui/packages/app-shell/src/hooks/__tests__/useActionModal.objectCreateTitle-30126.test.tsx",
        "ui/packages/app-shell/src/hooks/__tests__/useConsoleActionRuntime.flowDoneSuccessMessage-12274.test.tsx",
        "ui/packages/app-shell/src/hooks/useActionModal.tsx",
        "ui/packages/app-shell/src/views/ObjectView.toolbarScriptSelection-12331.test.tsx",
        "ui/packages/app-shell/src/views/RecordDetailView.flowDoneSuccessMessage-12274.test.tsx",
        "ui/packages/app-shell/src/views/RecordFormPage.i18n.test.tsx",
        "ui/packages/core/src/actions/ActionRunner.ts",
        "ui/packages/core/src/actions/__tests__/ActionRunner.defaultSuccessToast-10900.test.ts",
        "ui/packages/core/src/utils/__tests__/dataset-format.test.ts",
        "ui/packages/core/src/utils/dataset-format.ts",
        "ui/packages/i18n/src/__tests__/i18n.test.ts",
        "ui/packages/i18n/src/i18n.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-dashboard/src/MetricWidget.tsx",
        "ui/packages/plugin-dashboard/src/__tests__/MetricWidget.numberFormat.test.tsx"
      ],
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "evidence": "zh 1440 before/after shots: evidence commit a21e05e8838cb35609a47e759ef901af618b342a path evidence/30126/ (removed by c5c4f25f); links in the PR body",
      "mcp_calls": "2: mcp__github__issue_read x2 (reads only, no MCP write)",
      "api_writes": "3: git push (branch, harness route) · fleet-write relay pr_create -> #30495 (POST /repos/objectstack-ai/objectstack/dispatches, run 42036090883, read-back identical 9147 bytes) · this os-dev-report comment via post-stamped",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: #30126 items 4, 5, 6 and 8 to 16 · out of this dispatch (server/CLI/re-measure or held by other cards) · noted, not filed",
        "carrier: none · pre-existing eslint error in MetricWidget.tsx (react-hooks: Cannot create components during render) · polish, noted only"
      ]
    }
  7. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif

    Landed (items 1, 2, 3 and 7) at 2026-11-05T14:45Z: PR #30495 merged as ea5807e132 (seat ACCEPT 6659644638 on head 70fc02c9, TIER_DEFAULT contract review PASS 6659333290). The merge itself read 2026-11-05T14:44Z on the PR. The PR said Part of #30126, so the card stays open.

    probe reading
    git grep -n CJK_LATIN_SPACED_KEYS origin/main -- ui/packages/i18n/src/i18n.ts present (item 1: zh puts a space between 新建 and a Latin object name)
    git grep -c completedNamed origin/main -- ui/packages/i18n/src/locales/zh.ts ui/packages/core/src/actions/ActionRunner.ts 1 each (item 3: the default success toast names the action)
    • Item 2: useActionModal titles the create dialog opened from a lookup form.createTitle when the descriptor has no title.
    • Item 7: formatMeasure (ui/packages/core/src/utils/dataset-format.ts) and MetricWidget use the currency's own minor digits when the author wrote no format.

    Release: session session_01L6bhgVwQZbHRRM9CaXeKif · because items 1, 2, 3 and 7 have landed · back to pm:queue, assignee cleared.
    Remainder: items 4–6 and 8–16, as the claim (6657997438) left them: server, CLI and MCP rows (12, 13, 15, 16), rows to re-measure on main (8, 10, 11, 14), and the console rows 4, 5, 6 and 9. Each row is independent.

  8. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Nov 5, 2026
  9. 24 remaining items

  10. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4cxrNurGFU9PsE6NwNT
    os-dev-report

    {
      "issue": 30126,
      "status": "needs_decision",
      "branch": "claude/project-thread-nhel89",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30688",
      "head": "3a5b38d6a0dfa3a9bf51148abe2e3cc13d950288",
      "session": "session_016WV4cxrNurGFU9PsE6NwNT",
      "premise_still_valid": true,
      "rows": {
        "8": "reproduced by reading origin/main b77c160a: sys_inbox_message listViews.mine columns ['title','topic','severity','created_at']; no topic label catalog exists; fixed: topic dropped from the view (field kept, searchable)",
        "9": "needs_decision: the chain is the 2026-09-01 maintainer ruling in recipient-locale.ts (recipient sys_user.locale -> deployment default; request-scoped locale listed as not in the chain); PR #30539 (#30399) and PR #30597 (#30338) since save a sign-in/register-page pick as the person's own when unset; remaining gap = a person who never picks, on a deployment whose default is not their language",
        "12": "not built: PR #30459 (same file packages/rest/src/meta-item-read-gate.ts) still open at 22:27Z; serial constraint, left for after it lands",
        "13": "needs_decision: export -u/--url (OS_CLOUD_URL) -t/--token (OS_TOKEN), the shape of ~20 commands; install -r/--runtime (OS_RUNTIME_URL) + --email/--password session sign-in; publish -s/--server -t/--token; one spelling = renaming a published option, no alias window here",
        "15": "reproduced: UNKNOWN_ARG_HISTORY appended by strictUnknownKeyError on every MCP tool refusal; fixed in packages/mcp only (empty history + trimEnd wrapper); packages/spec untouched",
        "16": "needs_decision, and outside the claimed surface: listing is packages/runtime/src/domains/mcp.ts listActions; admin-only identity actions (14 targets under /api/v1/auth/admin/*) carry no door-read gate (only display-only visible + the target mounts' own judges, which differ: platform-admin, SSO owner, manager); invite_user x4 = four objects each declaring it (objectName disambiguates); refusals unchanged"
      },
      "summary": "Rows 8 and 15 of #30126 land in draft PR #30688 (Part of #30126). Row 12 is left out behind open PR #30459 per the serial constraint. Rows 9, 13 and 16 are product or contract choices, reported as needs_decision with options below; row 16's fix also lies outside the claimed file surface (packages/runtime).",
      "deviations": [
        "row 16: claim file surface names packages/mcp/src/**, but list_actions' filtering lives in packages/runtime/src/domains/mcp.ts and packages/runtime/src/action-execution.ts; not touched (stop on breach)",
        "dual-build-cjs-loads not measured locally (needs a whole-workspace build); declared, CI's Lint & Repo Gates runs it"
      ],
      "tests": "pnpm --filter @objectstack/mcp exec vitest run: 56 files, 680 passed. pnpm --filter @objectstack/service-messaging exec vitest run: 67 files, 847 passed (both under os-verify-lock, VERDICT command-exit 0, at 18552efc; merge of origin/main a2437b56 touches neither package). New pins: inbox-message-mine-view.test.ts (2), unknown-argument-keys.test.ts new describe (2). Ablations via ablation-replace.mjs, each restored blob == HEAD, git diff HEAD empty: history sentence restored -> 2 failed / 13; topic column restored -> 1 failed / 2.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 18552efc: 63 commands; 60 exit 0 first pass; check-plugin-teardown-shape --self-test exit 3 -> exit 0 after fetching fixture 621a4876; check:i18n exit 3 -> exit 0 after its named prerequisite build; check:dual-build-cjs-loads exit 3, NOT MEASURED. --ran: 63 derived, 62 run, 1 NOT-MEASURED, 0 UNRUN, exit 0. typecheck @objectstack/mcp, @objectstack/service-messaging exit 0. CI: PR just opened, check-runs pending.",
      "line_budget": "5 files, +107 / -19 (126 changed lines); non-test non-changeset source +25 / -19",
      "files_changed": [
        ".changeset/30126-inbox-topic-mcp-refusal-history.md",
        "packages/mcp/src/mcp-http-tools.ts",
        "packages/mcp/src/mcp-http-tools.unknown-argument-keys.test.ts",
        "packages/services/service-messaging/src/objects/inbox-message-mine-view.test.ts",
        "packages/services/service-messaging/src/objects/inbox-message.object.ts"
      ],
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "7: mcp__github__issue_read x3, mcp__github__pull_request_read x2 (one 404), subscribe_pr_activity x1 on #30688 (session watch, not a GitHub write), message_thread x1 (project thread). No MCP GitHub write.",
      "api_writes": "3: git push (branch, harness route) · fleet-write relay pr_create -> #30688 (run 42121685258, read-back identical 7697 bytes, no assignees) · this os-dev-report comment via post-stamped",
      "open_questions": [
        {
          "question": "Row 9: a mention title (and every keyed notification) follows sys_user.locale, then the deployment default. Should a person who never picked a language get one?",
          "options": [
            "A. No change: the ruled chain plus the sign-in/register-page save (PR #30539, PR #30597) covers people who pick; the rest follow the deployment default, which the operator sets to the users' language. Cost 0.",
            "B. The console writes the language it renders (browser-detected) to sys_user.locale on the first signed-in load when unset (ui lane). Cost M; measured trap: the profile card's 'use deployment default' writes null, so a first-load save undoes that choice every boot unless a marker is added, and new storage keys are refused for that question.",
            "C. The server stamps sys_user.locale at user creation from the creating request's Accept-Language. Cost S-M; an admin-created or invited user gets the admin's language.",
            "D. Add a 'last used language' rung to the chain. Needs a new ruling: the 2026-09-01 ruling lists request-scoped locale as deliberately not in the chain."
          ],
          "recommendation": "A, because the existing ruling decides the chain and the two landed pick-saves cover the case a person can express; possibly already decided by existing rules (no-escalation class)."
        },
        {
          "question": "Row 13: one way to name the server and the credential across os package export / install?",
          "options": [
            "A. install follows the majority CLI shape: -u/--url replaces -r/--runtime (BREAKING, FROM -> TO in the changeset), add -t/--token beside --email/--password. Cost S-M.",
            "B. Add -u/--url and -t/--token to install as aliases and keep --runtime. Cost S; two spellings with no retirement window, against the repo's no-alias rule.",
            "C. No rename: the two commands talk to different things (export reads a deployment with the os login token; install writes into a runtime with that runtime's own account); cross-reference them in --help. Cost S; the row's ask is not met."
          ],
          "recommendation": "A, because about twenty commands already spell -u/--url + -t/--token and install is the outlier; the breaking rename is one flag with a one-line migration."
        },
        {
          "question": "Row 16: list_actions shows a plain member admin-only identity actions (ban_user, set_user_manager, ...). Hide them, mark them, or leave them?",
          "options": [
            "A. Declared gate: the identity admin actions declare a gate the action doors read (e.g. requiredPermissions or a standing key), so REST /actions and MCP judge it once and list_actions hides them through actionPermissionError. Contract-first; needs a key that names platform-admin standing (none today), possibly Metadata-protocol: added. Cost M-L.",
            "B. Runtime table row (the #28178 B / #28943 shape): a forward to /api/v1/auth/admin/* by a caller without the target's standing is marked unavailable with the target's code and sentence, and run_action refuses before forwarding. Cost M; restates each target mount's gate (platform-admin, SSO owner, manager) in the runtime, the N-copies shape platform-admin-gate.ts was written to end.",
            "C. No change: every refusal holds (the card measured it); only the list_actions description says the target may still refuse. Cost S."
          ],
          "recommendation": "A, because the gate then has one declared source both doors read, and hiding follows the existing actionPermissionError precedent for a caller's permission (the mark-unavailable precedent is for credential kind); the work also leaves this claim's file surface (packages/runtime, platform-objects)."
        }
      ],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · the MCP argument refusal still ends with the spec factory's upgrade-guide sentence about retired metadata keys, which is not about tool arguments · polish, noted only",
        "carrier: #30126 · rows 9, 12, 13, 16 stay on the card (see rows)"
      ]
    }
  11. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4

    决策:#30126 第 9、13、16 行 · 2026-11-05T22:30Z

    os-decision-facets

    dev 报告 6671216554 的 open_questions 里有三处分叉,席位已呈维护者(本项目的席位线程,三张选择卡)。第 8、15 行在 PR #30688(Part of #30126)里落地;第 12 行等 PR #30459 合并后再做。裁定之前,这三行不派码。

    Governing text: the card's Suggestion column (the maintainer 「第二组第三组也同意」, 2026-11-04); the 2026-09-01 locale-chain ruling (row 9); the startup rule "retire old spellings at once, no alias window" (row 13); the actionPermissionError / #28178 B precedents (row 16).

    第 9 行:从没选过语言的新用户,提醒标题用什么语言。

    第 13 行:os package export / install 的服务器与凭据参数名统一。

    • A:install 改成多数命令的写法:-u/--url 取代 -r/--runtime(BREAKING,changeset 写 FROM → TO),并在 --email/--password 旁加 -t/--token。S-M。
    • B:加别名、保留 --runtime。S;两种拼写无退役期,违反不留别名的规矩。
    • C:不改名,只在 --help 里互相说明。S;本行诉求不满足。
    • 席位推荐 A:约 20 个命令已用 -u/--url + -t/--token,install 是唯一例外。

    第 16 行:list_actions 给普通成员列出 ban_user 等管理员动作(拒绝本身都生效,不是漏洞)。

    四轴(中文):

    • 实际业务需求: 第 13 行是作者每天敲的命令,统一后少一次查 --help;第 16 行普通成员看到 36 个动作、试了才知道不能用;第 9 行有部署默认可兜底,未见真实投诉。
    • 项目长远合理性: 13A、16A 都是一处声明、一种写法;13B、16B 留下两份事实。
    • 防 AI 犯错: AI 按多数命令的写法调 install 会失败(13);AI 看到列出的动作会去调(16),声明式门槛能在列表阶段就挡住。
    • 创业阶段不扩散: 9A 零新增;13A 不留别名;16A 可能加一个键,所以单独立卡、单独评估。
  12. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4

    ACCEPT → PR #30688 comment 6671648945 · 2026-11-05T22:54Z · head 3a5b38d6 · readied and in the merge queue (rows 8, 15). Rows 9, 13, 16 wait on the maintainer (analysis 6671252245); row 12 waits on PR #30459.

  13. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4

    Landed (partial) · 2026-11-05T23:15Z · PR #30688 merged (rows 8, 15; ACCEPT 6671648945).

    Release: session session_016WV4czvZykUqhYxYXSSDt4 · because rows 8 and 15 have landed and the rest waits on the maintainer · pm:dispatched → needs-user-decision, assignee cleared.
    Remainder:

    • Rows 9, 13, 16: needs_decision, analysis 6671252245 (seat recommends 9 A, 13 A, 16 A), put to the maintainer in this project's server seat 4 thread. Row 16 A, if ruled, is its own card (it leaves this claim's surface: packages/runtime, platform-objects).
    • Row 12: written after PR fix(objectql,rest)!: serve an object an extension renames without the base's plural (#30391) #30459 merges (packages/rest/src/meta-item-read-gate.ts).
      Resume-from: none (the rows above start from main; the card thread session_016WV4cxrNurGFU9PsE6NwNT is held for the follow-up order).
  14. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Nov 5, 2026
  15. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    coordinator#1 · hotlong · session_6eb9ec2e0e3f410b91239dab7a337b9e

    Ruling: #30126 rows 9, 13, 16 · letter A for each · maintainer 「按推荐裁」 (2026-11-06, in the coordinator session) · 2026-11-06T01:36Z

    Answers domain:server#4's decision 6671252245.

    Row 12 needs no ruling: it is written after PR #30459 merges. needs-user-decision → pm:queue.

    🤖 Generated with Claude Code

  16. added
    pm:queueReady for the PM dispatch loop
    and removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Nov 6, 2026
  17. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4

    Claim: PM loop round 2 (re-claim after Release 6672033338, on the maintainer's ruling) · 2026-11-06T01:51Z
    Session: session_016WV4czvZykUqhYxYXSSDt4
    Account: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-nhel89, restarted from origin/main (PR #30688 from it merged), in the same card thread session_016WV4cxrNurGFU9PsE6NwNT
    Worktree: objectstack-issue-30126
    Domain: domain:server
    Seat: domain:server#4
    File surface: row 13 packages/cli/src/commands/package/install.ts (and export.ts only if the shared flag definition lives there), the CLI's shared flag helpers it reads, content/docs/** sentences naming -r/--runtime for os package install; row 12 packages/rest/src/meta-item-read-gate.ts (the Setup app refusal text, localized as its sibling refusals are) and the REST i18n bundle it reads; their tests; one root .changeset/ file. ⛔ packages/spec/**, ui/**, packages/runtime/**, packages/platform-objects/** (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate; floor sonnet · default opus · ceiling fable), effort: high
    Clause-②: yes (narrowing)
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6674432613
    Premise: ruling 6674432613. Row 13 A: -u/--url replaces -r/--runtime with no alias (BREAKING; the changeset writes FROM → TO), and -t/--token is added beside --email/--password. Row 12: PR #30459 has merged, so the serial is cleared; the dev re-measures it on origin/main. Row 9 A: no change. Row 16 A: its own card, filed by this seat.
    Serial constraints cleared: PR #30459 merged; no open PR touches packages/cli/src/commands/package/** (the dev re-reads at branch start)

    Contract review owed (narrowing face) before the queue; the maintainer's per-PR word owed (BREAKING).

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

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4

    Claim amendment · claim 6674704334 · 2026-11-06T01:55Z

    File surface, added: packages/cli/README.md (the os package install line that names -r/--runtime; it ships in the npm package). content/docs/deployment/cli.mdx and publish-and-preview.mdx are already covered.
    Out of surface, kept out: skills/objectstack-platform/references/operations.md:106 names --runtime for os package install. It is a governed (Tier H) skills line, so this PR does not carry it and stays ungoverned. The seat files it as its own skills-lane card, serial behind this PR, to land before the next release.
    Flags: no shared url/token flag definition exists in packages/cli, so install declares the same shape as the others. --url reads OS_RUNTIME_URL (as os login -u does), and --token reads a new OS_RUNTIME_TOKEN (install's OS_RUNTIME_* family, not OS_TOKEN). Accepted.

    Everything else in claim 6674704334 stands.

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

Metadata

Metadata

Assignees

Labels

domain:serverDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions