Skip to content

service-settings: the Setup settings pages say 「工作区名称」 and 「此工作区」 for the organisation or environment — use the ruled nouns (ruling cloud#2939 A) #24142

Closed

Description

@objectstack-fleet

Filing gate: ③ a task the maintainer directed. The maintainer ruled objectstack-ai/cloud#2939 letter A, 「同意」 2026-10-17 (ruling 6229029648): one noun, 「组织」, for the thing members and billing belong to, and 「环境」 for the running instance. 「工作区」 retires. The ruling names this card as one of three follow-ups. Filed by the repo:cloud#1 seat (seat post #6026, session session_01WVbr5J6u8BHh8EyFtcWciH). ⛔ Not a claim. Independent: no Blocked-by.
Dedupe: the 200 most recent open objectstack issues carry no card on service-settings translations or workspace_name.

Where (framework pin f7e836da1ed3; re-read on main)

cloud's control plane mounts the framework SettingsServicePlugin with builtinSettingsManifests (cloud packages/service-cloud/src/control-plane-preset.ts:355). Its Setup settings pages read:

  • 「工作区名称」 (Branding);
  • 「此工作区」 in the mail, SMS and feature-flag descriptions.

The strings live in:

  • packages/services/service-settings/src/translations/zh-CN.ts:23,63,103,109,129,274,394;
  • en.ts:27,67,73,93,161,205;
  • ja-JP.ts:23,63,69,132,254,295,329;
  • es-ES.ts:23,63,69,132,254,295,329;
  • the en source in manifests/branding.manifest.ts:5,11,15,19 and the mail, SMS, feature-flags, localization, company and auth manifests.

Done when

  • Each string names what it means: the organisation (组织 / Organization) on the control plane's settings, or the environment (环境 / Environment) where a tenant reads it.
  • The four locales follow.
  • A test pins that no settings manifest or bundle says workspace / 工作区.

If one manifest is read on both planes with different meanings, say so and pick the wording per plane through the existing manifest scope, or report it.

Dedupe words: service-settings workspace_name 工作区名称 branding settings; settings manifests workspace noun.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: grade priority:p3 → p2 · domain:services · area:i18n · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-17T04:02Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  2. added
    area:i18nThe customer's own language, across UI, metadata and notifications
    domain:servicesRetired 2026-10-22, alias of domain:server (services surface); in-flight cards keep it until landed
    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 Oct 17, 2026
  3. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · 2026-10-17T17:25Z
    Session: session_01Nk17Z26X5DB59iQztDBADH (the dispatching seat; the dev runs mode:subagent in this session's container and shares its session ID, so its identity is the branch)
    Account: marchtian (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-24142-settings-organisation-noun
    Worktree: objectstack-issue-24142
    Domain: domain:services
    Seat: domain:services#1 (seat post #6021)
    File surface (at origin/main 7d6ec91d2f or later; stop on a breach and explain it in the report):


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 24142,
    "status": "done",
    "branch": "claude/issue-24142-settings-organisation-noun",
    "pr": "#24207",
    "session": "session_01Nk17Z26X5DB59iQztDBADH — mode:subagent, the dispatching seat's session id (shared container)",
    "premise_still_valid": true,
    "summary": "Every user-facing 'workspace' / 工作区 / ワークスペース / espacio de trabajo in the service-settings manifests (branding, company, feature-flags, mail, sms, auth) and the en/zh-CN/ja-JP/es-ES bundles now uses a ruled noun. The card's hits held on main 8a88901 (zh-CN 7, en 6, ja-JP 7, es-ES 7, plus the manifest literals). Deciding fact: no manifest field tells the control plane from a tenant environment (SettingsManifest.scope is the storage rung global/tenant/user, not a plane). Per-plane wording is not needed, because that existing scope means the same on both planes: tenant = one sys_setting row per organization_id (pinned by settings-organization-isolation.pin.test.ts), so Branding name/description, Company legal-name help and Feature Flags say organization (组织/組織/organización); global = one row for the running instance, so the Mail and SMS Provider sections say environment (环境/環境/entorno); the auth membership help names the act as creating an organization (ADR-0093 D1's personal-workspace hook = personal org). One judgement for review, stated in the PR body: in a tenant environment the tenant-scope pages say organization, not the card's 'environment', because they are stored per organization there too. No setting key, no bundle key, no category value changed. The hub category 'Workspace' is a console lookup key (console.settingsHub.categories.*), already rendered 环境/Environment by objectui, so it is excluded from the pin and left for objectui#12851. New pin src/settings-retired-workspace-noun.pin.test.ts walks every non-machine string of every built-in manifest and every bundle value. Landing site as expected: packages/services/service-settings.",
    "tests": "At 942717f (the final commit e594280 adds only the changeset): closure build pnpm --workspace-concurrency=2 --filter '@objectstack/service-settings^...' build, VERDICT command-exit 0; pin alone: Test Files 1 passed (1), Tests 16 passed (16); pnpm --filter @objectstack/service-settings test: Test Files 48 passed (48), Tests 861 passed (861); typecheck tsc --noEmit exit 0, and --listFiles includes the pin (1 hit). Ablation (one, the lane's commitment): node scripts/ablation-replace.mjs planted 工作区名称 into the zh-CN branding label (anchor x1 to x0, replacement x0 to x1, blob 568263dfa148 to 10719672d7c8). Direction as expected, red: Tests 1 failed | 15 passed (16), failing on 'zh-CN.settings.branding.keys.workspace_name.label (工作区): 工作区名称'. Restore proven: blob == HEAD 568263dfa148, git diff HEAD empty; re-read afterwards, 工作区 count 0 and git diff HEAD 0 bytes. The subject resolves by relative import to src, so no dist build or preflight was needed.",
    "gates": "Local: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) at e594280 vs merge base 8a88901 derived 63 commands. The seat's 57 plus engine-double-contract, objectql-double-limit, query-options-erasure, type-check-coverage, type-check-debt and where-matcher, because the diff adds a test file. No check:i18n family was derived. 62 exit 0. pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (needs every package's dist): NOT MEASURED, left to CI. --ran with per-command exit codes: '63 derived famil(ies) accounted for — 62 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. Key verdict lines: check-nul-bytes OK (no raw ASCII control bytes); check-issue-citations no issue citations added; check-changeset-no-major no major bump; check-empty-changeset 1 declaring changeset added; check-adr-0087-registration no declared-breaking changeset; type-check-debt re-measure OK, 26 raw tsc errors, none above record. CI on PR head e594280 at the time of this report, read once: No other open PR may claim the same issue success; The card this PR closes must claim this branch success; Part-of PR must not also close its card success; No other open PR may claim the same single-writer path success; Check PR Size success; Check Documentation Links success; filter success. In progress: Lint · ESLint, Lint · repo & tooling gates, Lint · docs & code guards, Lint · CI, release & engine gates, Lint · PM dispatch-gates, the two Lint · scoped jobs, Lint · scoped · tooling self-tests, Type Check workspace/source gates/consumer gates/debt ledger, Test Core 1-6/6, Build Core, Governed Surface Queue Guard, Check Changeset, Dogfood Regression Gate, Flag docs affected by code changes, Auto Label. Skipped: Console Pin Gate, Temporal Conformance, Build Docs, Dogfood Verify CLI, Packed-tarball smoke.",
    "mcp_calls": "0",
    "api_writes": "2 relay strokes, each a POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write as objectstack-fleet[bot]: (1) pr_create, i.e. POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos//issues/24207/assignees [marchtian], run 39056518062 success, body read back 9347 of 9347 bytes identical; (2) comment, i.e. POST /repos//issues/24142/comments (this report). Not REST: 3 git pushes (empty-branch probe, fix commit, changeset commit). No labels written: none named, and skip-changeset does not apply (the diff publishes and carries a patch changeset).",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · noted, not filed — same noun family outside this card's surface: packages/plugins/organizations/src/membership-policy-gate.ts:327 (operator boot refusal) and content/docs/permissions/authentication.mdx:127 still say 'creating a workspace' for the membership explicit act; per the family rule the seat may fold them into the ruling's follow-ups · dedupe words: membership-policy-gate creating a workspace invite-only; authentication.mdx membership policy workspace",
    "carrier: 承接者:无 · noted, not filed — packages/services/service-settings/README.md:110 describes branding as 'Workspace name, logo, accent colour' (ships in files[]); outside the claim's declared file surface, so left untouched for the seat · dedupe words: service-settings README branding workspace name",
    "carrier: 承接者:无 · noted, not filed — packages/spec/src/system/settings-manifest.zod.ts SpecifierScopeSchema doc says tenant is 'per-project' in project-kernel mode (the service stores it per organization; project renamed environment in v5), and the category describe example names 'Workspace'; comment-only drift",
    "carrier: objectstack-ai/objectui#12851 · noted, not filed — the console hub renders category key 'Workspace' as 环境/Environment, yet the three manifests under it (branding, company, localization) are per-organization (tenant scope); its section header now sits over 'Organization name'",
    "carrier: 承接者:无 · noted, not filed — examples/app-showcase grp_workspace label 工作区 is a navigation group meaning 'work area', not organization or environment; different meaning, left alone"
    ],
    "files_changed": [
    ".changeset/24142-settings-organization-noun.md",
    "packages/services/service-settings/src/manifests/auth.manifest.ts",
    "packages/services/service-settings/src/manifests/branding.manifest.ts",
    "packages/services/service-settings/src/manifests/company.manifest.ts",
    "packages/services/service-settings/src/manifests/feature-flags.manifest.ts",
    "packages/services/service-settings/src/manifests/mail.manifest.ts",
    "packages/services/service-settings/src/manifests/sms.manifest.ts",
    "packages/services/service-settings/src/settings-retired-workspace-noun.pin.test.ts",
    "packages/services/service-settings/src/translations/en.ts",
    "packages/services/service-settings/src/translations/es-ES.ts",
    "packages/services/service-settings/src/translations/ja-JP.ts",
    "packages/services/service-settings/src/translations/zh-CN.ts"
    ],
    "line_budget": {
    "additions": 197,
    "deletions": 34,
    "files": 12
    },
    "deviations": [
    "pnpm check:dual-build-cjs-loads NOT MEASURED locally (exit 3, PREREQUISITE NOT MET: whole-repo dist); left to CI Lint & Repo Gates",
    "test:repo (vitest repo project) not run locally: the diff edits no repo-project test and the derivation does not name it; it runs in CI Test Core",
    "Package build/test/typecheck ran at 942717f; the gates ran at e594280; the only difference between them is the added changeset",
    "Commit attribution: the harness reminder asked for a model-named Co-Authored-By trailer and a different PR footer; commits carry the AGENTS.md model-free pair (Claude-Session + Co-authored-by: Claude) and the PR body ends with the AGENTS.md session-URL footer, per that reminder's own precedence clause",
    "Tenant-plane wording for the tenant-scope pages is organization, not the card's 'environment where a tenant reads it'. It follows the existing manifest scope (per-organization storage on both planes) and is stated in the PR body as the one judgement to review",
    "Clause-②: no held. No translation bundle key was renamed or deleted, so no contract-tier review is owed on that count. Line copied to the PR body and the changeset",
    "Worktree cleaned up after the PR opened (node_modules removed, git worktree remove, no --force); remote head e594280 matches local"
    ]
    }


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat record on the dev report · domain:services seat 1 (#6021) · marchtian · session_01Nk17Z26X5DB59iQztDBADH · 2026-10-17T18:10Z. PR #24207, head e594280be9. Amends claim 6237566111: same session, same branch. ⛔ Not a new claim.

    • Seat ruling on the plane judgment: accepted as the dev measured it. The card's own condition decides this: "If one manifest is read on both planes with different meanings, say so and pick the wording per plane through the existing manifest scope." Measured, no manifest has different meanings on the two planes. SettingsManifest.scope is the storage rung, and one SettingsService stores both planes.
      • tenant is one sys_setting row per organization_id (settings-service.ts:130, pinned by settings-organization-isolation.pin.test.ts). Branding, Company and Feature Flags therefore say organization (组织).
      • global is one row for the running instance. Mail and SMS therefore say environment (环境).
      • This is the ruling's own split: 组织 for what members belong to, 环境 for the running instance.
    • Read by the seat on the diff: every change is a value. No setting key, bundle key or category value moves (workspace_name and OS_BRANDING_WORKSPACE_NAME stay). The four locales follow the en source string for string. The pin walks every non-machine manifest string and every bundle value, with a non-vacuity guard on the manifest labels, the specifier labels and the option labels. Its ablation went red on the planted 工作区名称.
    • Not yet accepted: patch round 1 is out to the dev.
      1. packages/services/service-settings/README.md:110 ships (files: ['dist', 'README.md', 'CHANGELOG.md']), and it lists the branding page's highlight as "Workspace name". This PR renames that label to "Organization name", so the change makes a published text false. os-dev's rule makes that a must-fix in this PR.
    • File surface, amended: packages/services/service-settings/README.md (the one line).
    • Kept out, and why:

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 24142,
    "status": "done",
    "branch": "claude/issue-24142-settings-organisation-noun",
    "pr": "#24207",
    "session": "session_01Nk17Z26X5DB59iQztDBADH — mode:subagent, the dispatching seat's session id (shared container)",
    "premise_still_valid": true,
    "round": "patch round 1 (seat record 6238337817, amending claim 6237566111)",
    "summary": "Patch round 1. In packages/services/service-settings/README.md:110 the branding row now reads 'Organization name, logo, accent colour', matching the manifest description. Same column width, no other line changed, and 0 'workspace' remain in the README. Before the edit I read seat record 6238337817: the newest Claim is still 6237566111 on this branch, and the record amends the file surface to this one line. I recreated the worktree from the pushed branch (local == origin at e594280) and merged origin/main f963d8e with no conflicts (merge commit 5e6f67b), with no rebase or force. Then I committed the README line (b16b259) and pushed. Since then origin/main has gained f792290 (plugin-auth / plugin-hono-server only, disjoint from this diff), so the branch is 1 commit behind. I did not merge that commit. GitHub reports mergeable_state clean. The items the seat kept out (authentication.mdx:127, membership-policy-gate.ts:327, the spec settings-manifest docs, the console hub category, showcase grp_workspace) are untouched. The PR body was not PATCHed. pr_body_append carries the round's text for the seat to append.",
    "pr_body_append": "## Patch round 1 (head b16b25977)\n\n- packages/services/service-settings/README.md:110: the built-in manifests table now gives branding's highlight as "Organization name, logo, accent colour", matching the manifest description. The README ships (files lists it), and this PR renamed that field's label, so the old row would have been false. No other line in the file changed, and the file has no other "workspace".\n- origin/main was merged at f963d8e2b (merge commit 5e6f67b58, no conflicts). No rebase and no force-push.\n- Re-verified at b16b25977: closure build VERDICT command-exit 0. The pin: Tests 16 passed (16). pnpm --filter @objectstack/service-settings test: Test Files 48 passed (48), Tests 861 passed (861). typecheck exit 0. pnpm --filter @objectstack/spec check:generated: all 14 generated artifacts up to date, because packages/spec moved on main's side. No ablation is owed, because no test reads the README.\n- Derived gates at b16b25977, against merge base f963d8e2b: the same 63 commands. 62 exited 0. check:dual-build-cjs-loads hit PREREQUISITE NOT MET and is measured by CI. --ran gives: 62 run, 1 NOT-MEASURED. CI on b16b25977 is green: Lint & Repo Gates, TypeScript Type Check, Test Core, Build Core, Governed Surface Queue Guard and Check Changeset all succeeded.",
    "tests": "At b16b259: closure build pnpm --workspace-concurrency=2 --filter '@objectstack/service-settings^...' build, VERDICT command-exit 0. Pin: Test Files 1 passed (1), Tests 16 passed (16). pnpm --filter @objectstack/service-settings test: Test Files 48 passed (48), Tests 861 passed (861). typecheck tsc --noEmit: exit 0. pnpm --filter @objectstack/spec check:generated, run because packages/spec moved on main's side (AGENTS.md section 10): exit 0, 'All 14 generated artifacts are up to date', measured against the spec dist the closure build produced at this head. No ablation: the README is read by no test, as the patch round states.",
    "gates": "Local at b16b259: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack against merge base f963d8e derived 63 commands, the same list as round 0, with 13 paths (+198 / -35). 62 exited 0. pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (whole-repo dist): NOT MEASURED locally. --ran with per-command exit codes: '63 derived famil(ies) accounted for — 62 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. Verdict lines: check-nul-bytes OK (12036 files, no raw ASCII control bytes); check-issue-citations no citations added against f963d8e; check-adr-0087-registration no declared-breaking changeset; check-empty-changeset no merge-base changeset modified. CI on PR head b16b259, read once: all completed. Success: Lint & Repo Gates, TypeScript Type Check, Test Core (and 1-6/6), Build Core, Governed Surface Queue Guard, Check Changeset, every Lint · and Type Check · lane, Dogfood Regression Gate, Flag docs affected by code changes, Check Documentation Links, Check PR Size, Auto Label, and the four claim/closing-keyword checks. Skipped: Console Pin Gate, Temporal Conformance, Build Docs, Dogfood Verify CLI, Dogfood Regression Gate matrix shards, Packed-tarball smoke. So check:dual-build-cjs-loads is measured green inside Lint & Repo Gates.",
    "mcp_calls": "0",
    "api_writes": "1 this round: a relay stroke POST /repos/objectstack-ai/objectstack/dispatches, which fleet-write executed as objectstack-fleet[bot] as op comment, i.e. POST /repos//issues/24142/comments (this report). Not REST: 1 git push (the merge commit 5e6f67b and README commit b16b259). No PR body PATCH and no label writes; the labels documentation / size/m / tests / tooling on the PR were set by the labeler, not by this session. Cumulative over both rounds: 3 relay strokes (pr_create + 2 comments) and 4 git pushes.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: seat record 6238337817 · noted, not filed — authentication.mdx:127 and membership-policy-gate.ts:327 ('creating a workspace'), the spec SpecifierScopeSchema / category describe drift, and the console hub category (carrier objectstack-ai/objectui#12851) are kept out by the seat as Acceptance notes and carriers; showcase grp_workspace dropped. No new finding this round."
    ],
    "files_changed": [
    "packages/services/service-settings/README.md (this round)",
    ".changeset/24142-settings-organization-noun.md",
    "packages/services/service-settings/src/manifests/auth.manifest.ts",
    "packages/services/service-settings/src/manifests/branding.manifest.ts",
    "packages/services/service-settings/src/manifests/company.manifest.ts",
    "packages/services/service-settings/src/manifests/feature-flags.manifest.ts",
    "packages/services/service-settings/src/manifests/mail.manifest.ts",
    "packages/services/service-settings/src/manifests/sms.manifest.ts",
    "packages/services/service-settings/src/settings-retired-workspace-noun.pin.test.ts",
    "packages/services/service-settings/src/translations/en.ts",
    "packages/services/service-settings/src/translations/es-ES.ts",
    "packages/services/service-settings/src/translations/ja-JP.ts",
    "packages/services/service-settings/src/translations/zh-CN.ts"
    ],
    "line_budget": {
    "additions": 198,
    "deletions": 35,
    "files": 13,
    "this_round": {
    "additions": 1,
    "deletions": 1
    }
    },
    "deviations": [
    "pnpm check:dual-build-cjs-loads NOT MEASURED locally (exit 3, PREREQUISITE NOT MET); it ran green in CI Lint & Repo Gates on b16b259",
    "The branch is 1 commit behind origin/main (f792290, plugin-auth / plugin-hono-server, disjoint from this diff). It arrived after the round's merge and was not merged, to avoid a churn lap; mergeable_state is clean and the queue rebuilds on the current main",
    "The existing changeset was not edited for the README line: the round limited the file surface to that one line, and the patch changeset already covers the package",
    "test:repo not run locally (CI Test Core ran green)",
    "Clause-②: no still holds; no bundle key renamed or deleted",
    "Worktree removed after the round (node_modules removed, git worktree remove, no --force); remote head b16b259 matches local"
    ]
    }


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #24207 comment 6238806068 · domain:services seat 1 (#6021) · session_01Nk17Z26X5DB59iQztDBADH · 2026-10-17T18:43Z. Head b16b25977b, round 0 and patch round 1. It lands through the merge queue once every check on its head is green. Fixes #24142 closes this card at the merge.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:services seat 1 (#6021) · marchtian · session_01Nk17Z26X5DB59iQztDBADH · 2026-10-17T19:08Z.

    Landed: PR #24207 (Fixes #24142) merged through the merge queue as 04fd88a9b0 at 2026-10-17T19:07Z. That commit is on origin/main (git merge-base --is-ancestor exit 0; control f7af839459 exit 0, negative control e594280be9 exit 1). The queue squashed it, and all 13 of its files are byte-identical to the PR head b16b25977b. ACCEPT 6238806068.

    Probe on origin/main Reading
    workspace_name: { label: '组织名称' } in service-settings/src/translations/zh-CN.ts line 109
    工作区 in that bundle 0
    settings-retired-workspace-noun.pin.test.ts present

    What a reader sees: the Setup settings pages say 组织 / Organization for what is stored per organization (Branding, Company, Feature Flags) and 环境 / Environment for what is stored once for the running instance (the Mail and SMS providers), in all four locales. Every setting key keeps its spelling. The console's hub category header is objectstack-ai/objectui#12851's.

    The card closed completed at the merge. pm:dispatched is cleared and the assignee released in this act.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:i18nThe customer's own language, across UI, metadata and notificationsdomain:servicesRetired 2026-10-22, alias of domain:server (services surface); in-flight cards keep it until landedenhancementNew feature or requestpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions