Repository navigation
Open
Labels
domain:serverDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestNew feature or requestpm:queueReady for the PM dispatch loopReady for the PM dispatch looppriority:p3
Description
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 [email protected].
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 |
Metadata
Metadata
Assignees
Labels
domain:serverDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestNew feature or requestpm:queueReady for the PM dispatch loopReady for the PM dispatch looppriority:p3
Activity
objectstack-fleet commentedon Nov 4, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 ·
domain:ui·pm:queue· 2026-11-04T16:34Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim: PM loop round 3
Session:
session_01L6bhgVwQZbHRRM9CaXeKifAccount:
os-salesBranch:
claude/project-thread-poei5v(card thread of this project; a thread can push only its designated branch — measured platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-30126Domain:
domain:uiSeat:
domain:ui#5File surface: items 1, 2, 3 and 7 only —
ui/packages/i18n/src/locales/*.ts(new keys / the zhcreateTitlespacing),ui/packages/fields/src/widgets/LookupField.tsxandui/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: highClause-②: 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.objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim amendment (claim 6657997438), item 1 shape — seat ruling.
新建 {{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.ui/packages/i18n/src/i18n.tsthat 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/viewTitleand their:2177twin). Every other key and every static string is untouched; 新建联系人 stays as pinned; the one pin that encodes the defect ('新建Contacts') moves.ui/packages/i18n/src/i18n.tsand its test.objectstack-fleet commentedon Nov 5, 2026
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif
Claim amendment 2 (claim 6657997438; amends 6658078173), from the card thread's measured findings.
{{object, fmt}}would break the ten-locale{{name}}-only rule pinned byui/packages/i18n/src/__tests__/fallback-placeholder-spelling-3512.test.ts. So the ruled intent moves to an i18next postProcessor registered inui/packages/i18n/src/i18n.ts. It is still opt-in: it acts only on a key-listed table (form.createTitle/editTitle/viewTitle, and theconsole.ai.recordWriteCreateTitle/UpdateTitleobject 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.DatasetWidget→formatMeasureinui/packages/core/src/utils/dataset-format.ts, not fromMetricWidget. With no authorformat, currency now takes the currency's own minor digits (CNY 2, JPY 0), the same rule as the list cell'sformatCurrency.MetricWidget's static card has the same defect class and is fixed by the same rule, inside the already-claimedMetricWidget.tsx.ui/packages/core/src/utils/dataset-format.tsand its test. At 2026-11-05T12:37Z no open PR touches it orui/packages/i18n/src/i18n.ts.objectstack-fleet commentedon Nov 5, 2026
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" ] }objectstack-fleet commentedon Nov 5, 2026
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 head70fc02c9, TIER_DEFAULT contract review PASS 6659333290). The merge itself read 2026-11-05T14:44Z on the PR. The PR saidPart of #30126, so the card stays open.git grep -n CJK_LATIN_SPACED_KEYS origin/main -- ui/packages/i18n/src/i18n.tsgit grep -c completedNamed origin/main -- ui/packages/i18n/src/locales/zh.ts ui/packages/core/src/actions/ActionRunner.tsuseActionModaltitles the create dialog opened from a lookupform.createTitlewhen the descriptor has no title.formatMeasure(ui/packages/core/src/utils/dataset-format.ts) andMetricWidgetuse the currency's own minor digits when the author wrote noformat.Release: session
session_01L6bhgVwQZbHRRM9CaXeKif· because items 1, 2, 3 and 7 have landed · back topm: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.19 remaining items
objectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4
Claim: PM loop round 1 · 2026-11-05T21:49Z
Session:
session_016WV4czvZykUqhYxYXSSDt4Account:
os-elon-musk(the seat's linked user asGET /useranswers it; the card's assignee)Branch: the card thread's designated
claude/project-thread-*branch, named in a claim amendment once the thread reports itWorktree:
objectstack-issue-30126Domain:
domain:serverSeat:
domain:server#4File surface: the server remainder per triage 6664870625 and Release 6664515024 — row 8
packages/services/service-messaging/src/objects/inbox-message.object.ts(themineview's columns); row 9 the mention title's locale fallback (packages/plugins/plugin-audit/src/**, the recipient locale read); row 12 the Setup app refusal text inpackages/rest/src/meta-item-read-gate.ts; row 13 theos package export/os package installoption names (packages/cli/src/commands/package/**); row 15 the MCP argument error text inpackages/mcp/src/mcp-http-tools.ts; row 16list_actionsfiltering inpackages/mcp/src/**; their tests; one root.changeset/file. ⛔ui/**(rows 4, 6, 11, 14 landed in PR #30573; rows 5, 10 did not reproduce) (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: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6664870625
Premise: rows 8, 9, 12, 13, 15, 16 stand as written on the card (measured on
main987ff33b88, row 8 re-measured onc045c341in os-dev-report 6663325262); the dev re-measures each onorigin/mainfirst and drops any row already fixed, with the readingSerial constraints cleared: row 12 shares
packages/rest/src/meta-item-read-gate.tswith open PR #30459 (#30391,domain:server#5ACCEPTed, waiting on the maintainer's ready): row 12 is written after PR #30459 merges, or mergesmainover it before the PR opens; the other rows touch no file in any open PR (read over the 36 open PRs at claim time)Row notes: row 9 (a new user's default locale) and row 13 (renaming or aliasing CLI options) can turn into product choices; if either does, the dev reports it as a
needs_decisionfork with options instead of picking one, and the other rows land without it.objectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4
Claim amendment · claim 6670461054 · 2026-11-05T21:52Z
Branch:
claude/project-thread-nhel89Dev session:
session_016WV4cxrNurGFU9PsE6NwNT(the card thread this seat opened; worktreeobjectstack-issue-30126)Everything else in claim 6670461054 stands.
objectstack-fleet commentedon Nov 5, 2026
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)" ] }objectstack-fleet commentedon Nov 5, 2026
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 行:从没选过语言的新用户,提醒标题用什么语言。
sys_user.locale(ui 车道,M)。实测有坑:资料卡的「使用部署默认」会写 null,每次启动都会被覆盖,要加标记。Accept-Language写入(S-M)。管理员代建或邀请的用户会被写成管理员的语言。第 13 行:
os package export/install的服务器与凭据参数名统一。-u/--url取代-r/--runtime(BREAKING,changeset 写 FROM → TO),并在--email/--password旁加-t/--token。S-M。--runtime。S;两种拼写无退役期,违反不留别名的规矩。--help里互相说明。S;本行诉求不满足。-u/--url+-t/--token,install 是唯一例外。第 16 行:
list_actions给普通成员列出ban_user等管理员动作(拒绝本身都生效,不是漏洞)。requiredPermissions或表示平台管理员身份的键),REST/actions与 MCP 共读一处,list_actions经actionPermissionError不列。契约优先;今天没有表示平台管理员身份的键,可能Metadata-protocol: added。M-L,超出本认领的文件面(packages/runtime、platform-objects),裁定后另立卡。unavailable(runtime(mcp): an OAuth-token agent's api action forward carries a bearer the target door does not accept (acceptOAuthAccessToken matches /mcp paths only), so the target likely resolves the caller as anonymous #28178 B / MCP list_actions offers sys_api_key.revoke_api_key as runnable to an API-key caller, and run_action then refuses it 403 #28943 形状)。M;要在运行时重抄各目标入口的门槛,正是platform-admin-gate.ts要消除的多份拷贝。list_actions描述里写目标可能拒绝。S。四轴(中文):
--help;第 16 行普通成员看到 36 个动作、试了才知道不能用;第 9 行有部署默认可兜底,未见真实投诉。objectstack-fleet commentedon Nov 5, 2026
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.objectstack-fleet commentedon Nov 5, 2026
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:
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).packages/rest/src/meta-item-read-gate.ts).Resume-from: none (the rows above start from
main; the card threadsession_016WV4cxrNurGFU9PsE6NwNTis held for the follow-up order).objectstack-fleet commentedon Nov 6, 2026
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.os package installuses the majority spelling:-u/--urlreplaces-r/--runtime(BREAKING; the changeset writes FROM → TO), and-t/--tokenis added beside--email/--password. ⛔ No alias for--runtime(no-alias-window rule)./actionsand MCP read it from one place.list_actionsusesactionPermissionErrorto leave out actions the caller can't run. Contract first; if it needs a new key,Metadata-protocol: added. As the seat said, this leaves the claim's file surface (packages/runtime,platform-objects), so it goes on its own card, filed by the seat with this ruling as its Ruling-ref.Row 12 needs no ruling: it is written after PR #30459 merges.
needs-user-decision→pm:queue.🤖 Generated with Claude Code