Skip to content

One organization shows three names (Branding, the Organization record, the product chrome) and two timezones (Edit Organization, Localization) — one place for each, or say which wins (hotcrm#2194 T2-U20, R2-T2-U10) #25347

Open

Description

@objectstack-fleet

维护者速读

  • 事由: 同一个组织在品牌设置、组织记录、产品界面里有三个名字;「编辑组织」又有一个独立的时区,与本地化设置的默认时区重复,没说哪个生效。
  • 要做: 原定并入 Setup → Branding saves, but the workspace name, accent colour and logo change nothing in the app #24766,但该卡在裁决前已按 B′ 关闭,没有处理这件事。组织名称和时区各只在一处编辑,或在页面上写明哪个生效。
  • 完成标准: 管理员能在一个地方改组织名,且知道时区以哪个为准。

Filing gate ③ a task the maintainer set: the maintainer's ruling on objectstack-ai/hotcrm#2194, recorded there at 6354968262 (the director seat, posting from the maintainer's account): 「25251 B hotcrm B」, 2026-10-23T01:05:47Z. That is letter B for all three rounds, exactly as the seat recommended, and it adopts T2-U20 and R2-T2-U10 (round 2 folded R2-T2-U10 into it). It was ruled as a fold into #24766. That card closed completed on 2026-10-20T21:48Z, before the ruling, under ruling B′, which scoped the Branding keys but did not unify the organization's name or timezone, so the item is filed here (see Why). Filed by the repo:hotcrm seat 1 (os-elon-musk, session session_014xanhPEmGTMTfVH4UokwJT) under objectstack-ai/hotcrm#2194's After the ruling. ⛔ Not a claim.

Grade: triage's. The seat suggests priority:p3: an adopted suggestion with a measured cost on an existing surface, no wrong data and no contract change.

Reader (who acts): objectstack triage routes and grades it. The landing below is the seat's reading of origin/main; paths under src/ are HotCRM's (objectstack-ai/hotcrm).

Governing text

Why (measured)

Landing

  • sys_organization (its name and timezone fields; plugin-auth / platform-objects), the settings namespaces for Branding, Company and Localization (service-settings), and the Edit Organization action.
  • The dev measures which value each surface reads (the product chrome, the org switcher, mail, date rendering) and proposes the single home for the name and for the timezone in the claim. If unifying them changes what a stored value means, that is a contract question and goes back to the maintainer, ⛔ not decided in the PR.

Done when

  • The organization's display name is edited in one place, and every other surface that shows it reads that value or says where it is set.
  • The organization's timezone has one home, or each of the two pages states which one wins.
  • Pins on the reading chain.

Size: S–M.

Dedupe

Method: every open objectstack-ai/objectstack issue (108) and every issue updated since 2026-10-19 (544, any state), listed through the repo-scoped issues endpoint (paged) at 2026-10-23T01:20Z and matched case-insensitively on their titles. Words: organization name, branding, timezone, edit organization, sys_organization. 1 open hit: #25249 (settings without an organization source), not on point; the closed #24766, #24987, #24887 and #25264 are the branding work described above. New.


Generated by Claude Code

Activity

  1. added
    area:identityLogin and identity — sign-up, sessions, organization membership, SSO
    bugSomething isn't working
    domain:servicesRetired 2026-10-22, alias of domain:server (services surface); in-flight cards keep it until landed
    domain:serverDomain lane — seat card indexed by label:pm:seat
    and removed
    domain:servicesRetired 2026-10-22, alias of domain:server (services surface); in-flight cards keep it until landed
    on Oct 23, 2026
  2. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: card thread · domain:services seat 1 (seat post #6021, project run by the Sales account, 由Sales账户的项目负责) · p2 · the whole card · 2026-10-23T14:29Z
    Session: session_01JJZRJcjTF4oBQK7333oAnR
    Account: os-sales (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-xvfy21 (the harness-pinned branch for this session; it names no issue, so the Duplicate Fix Guard's branch-name hint will not match — this claim is the identity record)
    Worktree: objectstack-issue-25347
    Domain: domain:services
    Seat: domain:services#1 (seat post #6021)
    File surface (read on origin/main b9c7a8f5; stop on a breach and explain it in the report):

    • packages/services/service-settings/src/manifests/branding.manifest.ts and localization.manifest.ts, their tests, and the four hand-written bundles in packages/services/service-settings/src/translations/.
    • packages/platform-objects/src/identity/sys-organization.object.ts (the name and timezone field help, and rename_organization's feature gate), its pins (sys-organization-rename-action.test.ts, the platform-objects.test.ts gate matrix row), and the generated object bundles regenerated with node scripts/check-i18n-bundles.mjs --write (zh-CN / ja-JP / es-ES leaves hand-translated).
    • Possibly one dogfood pin in packages/qa/dogfood/test/ for the rename door on a single boot.
    • One patch changeset each for @objectstack/service-settings and @objectstack/platform-objects.
    • Not packages/spec, not plugin-auth, not cloud-connection (cli lane), not objectui.

    Measured (the card's first act), on b9c7a8f5:

    • Product chrome (console title, sign-in page): runtime/config branding.productName = a SAVED branding.workspace_name under single, else the host option, then OS_PRODUCT_NAME, then 'ObjectOS' (runtime-config-plugin.ts readSavedBranding, source === 'default' skipped).
    • Auth mail / authenticator issuer / MCP sign-in: a SAVED branding.workspace_name, else appName (OS_APP_NAME), then 'ObjectStack' (auth-plugin.ts applyBrand, auth-manager.ts getAppName).
    • Settings → Branding "Organization name": workspace_name, manifest default: 'ObjectStack'. Neither reader serves that default, so on an unsaved deployment the page shows a name the console never shows. That is the round-1 "ObjectStack" vs "ObjectOS".
    • The organization record / switcher: sys_organization.name ("Default Organization" from the boot under single). Its only edit doors, update_organization and rename_organization, are gated on multiOrgEnabled, and the generic Edit form keeps name readonly (ADR-0092 D4). So under single the organization cannot be renamed anywhere (round 2's "no Name field").
    • Timezone: localization.timezone (tenant scope, one row per organization) is the zone in effect: resolveLocalizationContext puts it on every ExecutionContext (formulas, report bucketing, rendered instants), and the console's first-run prompt writes it. sys_organization.timezone has zero readers in this repository (its own docblock says so; token grep confirms), but its field help says date boundaries are computed in it.

    Proposed homes (no stored value changes meaning, so no maintainer question per the card's Landing; the split follows the three homes in the #24766 analysis that ruling B adopted):

    • The product's name has one home, Branding's workspace_name. Its label becomes "Product name", its help says the organization's own name is on the Organization record, and the unserved 'ObjectStack' default is dropped (required false, as accent_color already is), so an unsaved page shows empty instead of a third name.
    • The organization's name has one home, sys_organization.name. rename_organization (name and logo only, no slug) is gated on the organization capability instead of multiOrgEnabled, so a single deployment can rename its one organization. The field help names the door and points at Branding for the product name.
    • The timezone that wins is Localization's. sys_organization.timezone's help says it is not used for date calculations and points at Settings → Localization. Localization's help says it is the zone in effect and the organization record's field does not change it.
      Container & model: M, card thread (in-session executor), model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
      Clause-②: yes
      Metadata-protocol: none
      Basis for the Clause-② line: two widenings, both on purpose. A Branding write may now clear workspace_name (an empty value was refused as required). rename_organization is offered under single too.
      Responsibility: n/a — not a defect card (an adopted UX suggestion, filing gate ③)
      Thread-read: none
      Serial constraints cleared: none (no open PR or in-flight claim declares these files; the 27 open PRs' file lists read at claim time, PR fix(spec): a dataset dimension's nullLabel is live; move the objectui pin past its reader #25437 touches other generated bundles in platform-objects)
      Resume-from: none

    Generated by Claude Code

  3. added 5 commits that reference this issue on Oct 23, 2026
  4. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25347,
      "status": "done",
      "branch": "claude/project-thread-xvfy21",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25464",
      "session": "session_01JJZRJcjTF4oBQK7333oAnR",
      "premise_still_valid": true,
      "summary": "PR is Part of #25347, not Fixes. Measured (claim 6367274301): the console chrome reads a saved branding.workspace_name else OS_PRODUCT_NAME else ObjectOS; auth mail reads a saved value else OS_APP_NAME else ObjectStack; Branding's page showed its manifest default ObjectStack, which no reader serves; the organization record shows sys_organization.name; localization.timezone is the zone every date calculation uses, and sys_organization.timezone has no reader. Landed: workspace_name relabelled Product name in the manifest and four bundles, its unserved ObjectStack default dropped with required false (an empty value is now accepted, the Clause-② yes), help pointing at the Organization record's Name; sys_organization.name help says the product name is a different setting in Settings → Branding; sys_organization.timezone help no longer claims date boundaries are computed in it and names Localization's Default timezone as the one in effect; localization.timezone help says it is the zone in effect and the record's field does not change it. Two patch changesets. Scope narrowed from the claim: the rename_organization gate move (multiOrgEnabled to organization, so single can rename its one organization) is held back because PUBLIC_AUTH_FEATURES in packages/spec books that gate and feature-gate-guard.test.ts checks both directions, so the spec line must ride in the same PR; the spec lane is not this thread's. Handed to the coordinator; the declaration, pins and a single-boot dogfood pin are written and kept.",
      "tests": "New: 3 cases in branding.manifest.test.ts, 1 in localization.manifest.test.ts, new file sys-organization-name-timezone-help.test.ts (2). Moved: settings-service.test.ts 'returns default when nothing set' now reads localization.timezone (UTC), a new case pins workspace_name's null default, the reset case expects null. Ablation: branding.manifest.ts and sys-organization.object.ts restored from base b9c7a8f5 give 3 failed / 5 passed and 2 failed; localization.manifest.ts restored gives 1 failed / 7 passed; HEAD gives all passed, git diff --quiet HEAD clean. pnpm --filter @objectstack/service-settings test: Test Files 59 passed (59), Tests 993 passed (993). pnpm --filter @objectstack/platform-objects test: Test Files 94 passed (94), Tests 1343 passed (1343). Both typecheck exit 0; eslint on changed files exit 0.",
      "gates": "dispatch-gates --commands derived 68, all 68 exit 0; two first exited 3 on prerequisites and were rerun: check-plugin-teardown-shape --self-test after fetching its pinned fixture, check:dual-build-cjs-loads after building the 7 dists it named. --ran: 68 derived, 68 run, 0 NOT-MEASURED, 0 UNRUN. check:i18n and check:i18n-stale-fill OK; check-adr-0087-registration --base origin/main: no declared-breaking changeset. main merged in (9177cf7b, 8 commits touching other platform-objects bundles); both suites and check-i18n-bundles re-ran green. CI on the PR pending at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "5 — read tools only: issue_read get x2, issue_read get_comments, subscribe_pr_activity (session watch, not a GitHub write), tool search",
      "api_writes": "4 — all via the fleet-write relay: post-stamped (claim), label-write (assign os-sales, pm:queue to pm:dispatched), pr_create (draft, assignee os-sales), post-stamped (this report)",
      "open_questions": [
        "Cross-lane, for the coordinator and the spec lane: under single the organization cannot be renamed (both rename actions gated on multiOrgEnabled, generic edit form keeps name readonly). Fix = gate rename_organization on the organization capability plus moving 'sys_organization.actions.rename_organization' from multiOrgEnabled.gatedInputs to organization.gatedInputs in packages/spec/src/kernel/public-auth-features.ts, in one PR. Until then the card stays open."
      ],
      "out_of_scope_findings": [
        {
          "what": "Two built-in product names: with neither env var set the console says ObjectOS (OS_PRODUCT_NAME default, cloud-connection runtime-config-plugin.ts) while auth mail and the authenticator issuer say ObjectStack (OS_APP_NAME default, plugin-auth auth-manager.ts getAppName).",
          "class": "none",
          "carrier": "none",
          "disposition": "Acceptance notes"
        },
        {
          "what": "sys_business_unit.timezone help promises inheritance from the parent unit and the organization, which no reader implements (a documented contract by ruling, not a mechanism).",
          "class": "none",
          "carrier": "none",
          "disposition": "Acceptance notes"
        }
      ]
    }

    Generated by Claude Code

  5. added a commit that references this issue on Oct 23, 2026
  6. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed, first half · domain:services seat 1 (seat post #6021) · os-sales · session_016g7nYP9wdNx1GDa5XDr7Uy · 2026-10-23T16:29Z

    reading value
    PR #25464 MERGED through the queue (TIER_DEFAULT record 6368790969 PASS, ACCEPT 6368805651), head 35b63d89a1
    origin/main carries 832a84ebdf

    What main now serves:

    • Branding workspace_name is labelled "Product name", with no unserved 'ObjectStack' default and optional.
    • localization.timezone, sys_organization.name and sys_organization.timezone carry help that says which home is in effect.

    The card stays open and dispatched (Part of #25347) for the single-posture rename door. rename_organization stays gated on multiOrgEnabled because its registry line lives in packages/spec (PUBLIC_AUTH_FEATURES.multiOrgEnabled.gatedInputs). feature-gate-guard.test.ts checks that line in both directions, so the spec line and the object change must land in one PR. That half waits on the maintainer's ruling on which lane carries it.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruled: A on the open question of the claim 6367274301 / landing note 6369684376 (the single-posture rename door) · recorded by domain:services seat 1 (seat post #6021) · os-sales · session_016g7nYP9wdNx1GDa5XDr7Uy · 2026-10-24T13:11Z

    The maintainer's answer, verbatim (Sales, the project's standing ruling thread, 2026-10-24T13:10Z): 「25347 同意」, accepting the decision card's recommendation A.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: card thread, second PR (Fixes #25347) · domain:services seat 1 (seat post #6021, project run by the Sales account, 由Sales账户的项目负责) · p2 · the single-posture rename door · 2026-10-24T13:14Z
    Ruling-ref: 6384629949
    Session: session_01JJZRJcjTF4oBQK7333oAnR
    Account: os-sales (the seat's linked user; the card's assignee)
    Branch: claude/project-thread-xvfy21, restarted from origin/main 49653f91 (the first PR #25464 merged as 832a84eb; nothing of it is stacked again). The harness pins this name, so it names no issue; this claim is the identity record.
    Worktree: objectstack-issue-25347
    Domain: domain:services
    Seat: domain:services#1 (seat post #6021)
    File surface (read on origin/main 49653f91; stop on a breach and explain it in the report):

    • packages/platform-objects/src/identity/sys-organization.object.ts: rename_organization's requiresFeature moves from multiOrgEnabled to organization, and its comments, plus the name field help that pointed at no door.
    • Its pins: sys-organization-rename-action.test.ts, the platform-objects.test.ts gate-matrix row, and the multiOrg roster test.
    • Outside the services lane, under ruling 6384629949 (this card only): packages/spec/src/kernel/public-auth-features.ts, where the 'sys_organization.actions.rename_organization' row moves from multiOrgEnabled.gatedInputs to organization.gatedInputs. A declaration comment goes on spec seat post [PM seat] domain:spec — 🟢 os-tesla · session_013odhA26dvzy7pQmevdTTvy #6017.
    • One dogfood pin in packages/qa/dogfood/test/ showing the rename working on a single boot, plus any existing dogfood pin that asserts the old gate.
    • The generated object bundles only if node scripts/check-i18n-bundles.mjs --write moves them.
    • One patch changeset each for @objectstack/spec and @objectstack/platform-objects.
    • Not plugin-auth, not cloud-connection, not objectui. update_organization and every other multi-org action stay on multiOrgEnabled.
      Container & model: M, mode:cloud (the surface spans packages/spec/src/** and another package), card thread (in-session executor), model: default tier (dispatch-gates --tier: no path-derived mandate; the spec face is reviewed at CONTRACT_REVIEW_TIER per ruling 6384629949), effort: high
      Clause-②: yes
      Metadata-protocol: none
      Basis for the Clause-② line: a widening on purpose. rename_organization is offered under the single posture too, where multiOrgEnabled is false but the organization capability is on.
      Responsibility: n/a — not a defect card (an adopted UX suggestion, filing gate ③)
      Thread-read: 6384629949
      Serial constraints cleared: two open PRs touch neighbouring lines and assert nothing about this action. feat(plugin-auth): multi-org Create User joins an organization in the same step, defaulting to the admin's current one #25626 adds sys_user.actions.create_user.params.organizationId three lines below the moved row in multiOrgEnabled.gatedInputs. feat(spec,lint): an action's confirmText, successMessage and errorMessage are template slots over the roots the console runner binds #25637 rewrites invite_user's successMessage in sys-organization.object.ts. Whichever lands second takes a text merge only. These are the 16 open PRs' file lists read at claim time.
      Resume-from: none
  9. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat pointer · domain:server seat 1 (seat post #6367) · os-sales · session_01JrXUZYyTV4i588KLZRxSvJ · ⛔ not a claim

    The maintainer voided domain:services seat 1 (#6021) in the Sales account's project and summoned domain:server seat 1 there; #6021 is now an archive of #6367. The reviewing seat for claim 6384658457 (card thread session_01JJZRJcjTF4oBQK7333oAnR) is therefore seat post #6367, same account. The claim, its session, branch and file surface are unchanged. ACCEPT and landing for the second PR under ruling A (6384629949) come from #6367.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25347,
      "status": "done",
      "branch": "claude/project-thread-xvfy21",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25661",
      "session": "session_01JJZRJcjTF4oBQK7333oAnR",
      "premise_still_valid": true,
      "summary": "Second PR, Fixes #25347, under maintainer ruling 6384629949 (A). rename_organization (name and logo, never the slug) moves requiresFeature from multiOrgEnabled to organization, so a single deployment can rename its one organization; its grades (owner, admin via requiresMembershipReach update_organization) are unchanged. update_organization, create, delete, set_active and leave stay multi-org only. PUBLIC_AUTH_FEATURES moves the 'sys_organization.actions.rename_organization' row from multiOrgEnabled.gatedInputs to organization.gatedInputs in the same PR (spec lane file, +5/-3, ruling covers this card only; cross-lane declaration on #6017). sys_organization.name help now names the door, in four bundles. Two patch changesets (spec, platform-objects).",
      "tests": "Moved pins: sys-organization-rename-action.test.ts gate case (organization, update_organization as multiOrg control); platform-objects.test.ts matrix row (ADMINS && ORG) and the multiOrg roster test filtering rows by MULTI_ORG gate. New: help case in sys-organization-name-timezone-help.test.ts; new dogfood packages/qa/dogfood/test/organization-rename-single.dogfood.test.ts (4 cases on a single boot: flags, admin offered and multi-org set hidden, member not offered and refused 403 YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_ORGANIZATION, rename 200 with name changed and slug kept). Ablation (object, spec row, bundles restored from origin/main, rebuilt): platform-objects 4 failed / 156 passed; dogfood pin 1 failed / 3 passed (offer case; the door itself is not feature-gated); HEAD restored: 4/4. spec test: 716 files, 21725 passed | 1 todo. platform-objects test: 94 files, 1344 passed (includes feature-gate-guard). Four org dogfood files: 4 files, 18 passed. Typecheck spec, platform-objects, dogfood exit 0; eslint clean.",
      "gates": "dispatch-gates --commands on head d613a6d8 derived 91; all 91 exit 0; --ran: 91 derived, 91 run, 0 NOT-MEASURED. check-i18n-bundles, check:i18n-stale-fill OK; check-adr-0087-registration --base origin/main: no declared-breaking changeset. git merge-tree onto origin/main clean. CI pending at report time. Spec face owes a CONTRACT_REVIEW_TIER review per the ruling.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "3 — read/watch only: tool search x2, subscribe_pr_activity (session watch, not a GitHub write)",
      "api_writes": "4 — all via the fleet-write relay: post-stamped (re-claim 6384658457), pr_create (draft #25661, assignee os-sales), post-stamped (cross-lane declaration on #6017), post-stamped (this report)",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  11. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #25661 comment 6385376826 · domain:server seat 1 (seat post #6367) · session session_01JrXUZYyTV4i588KLZRxSvJ


    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

Labels

area:identityLogin and identity — sign-up, sessions, organization membership, SSObugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpm:dispatchedpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions