Repository navigation
fix(service-settings,platform-objects): Branding's name is the product name with no unserved default, and both timezone fields say which one is in effect - #25464
Conversation
Claude-Session: https://claude.ai/code/session_01JJZRJcjTF4oBQK7333oAnR Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJZRJcjTF4oBQK7333oAnR Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJZRJcjTF4oBQK7333oAnR Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 2 package(s): 7 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 4 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 10 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 2e338e7b77b6de21e43e0e76cc860b7749596af6 && git checkout 2e338e7b77b6de21e43e0e76cc860b7749596af6
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin ab510f42e7751a2441712374d5a6a2efeaeceba1 35b63d89a16afd5880727c422167732bb540164d && git checkout -B drift-repro ab510f42e7751a2441712374d5a6a2efeaeceba1 && git merge --no-ff 35b63d89a16afd5880727c422167732bb540164d
node scripts/docs-audit/affected-docs.mjs --json ab510f42e7751a2441712374d5a6a2efeaeceba1
|
…ares no default Claude-Session: https://claude.ai/code/session_01JJZRJcjTF4oBQK7333oAnR Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: The face is the declaration face. This review is owed only by ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
席位核对 · ACCEPT · 2026-10-23T15:45Z
Generated by Claude Code |
Requested by Sales · project thread
Part of #25347
Clause-②: yes
Metadata-protocol: none
Claim of record:
6367274301on the card (card thread,domain:servicesseat 1). Branchclaude/project-thread-xvfy21is the harness-pinned branch for this session. It names no issue, so the Duplicate Fix Guard's branch-name hint will not match, and the claim is the identity record.Part of, not Fixes: the card's "the organization's display name is edited in one place" is not met under
singleby this PR. Undersinglethe organization cannot be renamed at all: both rename actions are gated onmultiOrgEnabled, and the generic edit form keepsnamereadonly. The claim proposed gatingrename_organizationon theorganizationcapability. That gate is booked inpackages/spec/src/kernel/public-auth-features.ts(PUBLIC_AUTH_FEATURES.multiOrgEnabled.gatedInputs), which platform-objects'feature-gate-guard.test.tschecks in both directions, so the spec line and the object change must land in one PR. The spec lane is not this card thread's, so that half is held back and handed to the coordinator. The card stays open for it.What each surface reads (measured on
b9c7a8f5)runtime/configbranding.productName: a SAVEDbranding.workspace_nameundersingle, else the host option,OS_PRODUCT_NAME,'ObjectOS'branding.workspace_name, elseappName(OS_APP_NAME),'ObjectStack'workspace_name, manifest default'ObjectStack', served by neither readersys_organization.namelocalization.timezone(tenant scope, one row per organization) viaresolveLocalizationContextsys_organization.timezone: zero readers in this repositoryWhat changes
@objectstack/service-settingsbranding.workspace_nameis labelled "Product name", not "Organization name", in the manifest and in all four bundles. It names the product the deployment shows. Its help adds: "Leave empty to use the name this deployment was set up with. This is not the organization's own name, which is the Name on the Organization record."'ObjectStack'default is dropped, andrequiredbecomesfalse, asaccent_coloralready is. The default was a third name that no reader served. An unsaved page now shows the field empty, andGET /api/settings/brandinganswersvalue: nullwithsource: 'default'.required: falsefollows from dropping the default. Without it, objectui's pre-save check blocks every save of the page until a name is typed.readSavedBrandingdrops'';setAppNametrims toundefined), so nothing served changes.localization.timezone's help adds: "This is the timezone in effect for the organization: the Timezone field on the Organization record does not change it." Manifest plus all four bundles.@objectstack/platform-objectssys_organization.namegets help: "The organization's own name. The product name the console shows is a different setting, set in Settings → Branding." It names no door, because the rename doors are multi-org only.sys_organization.timezone's help no longer says date boundaries are computed in it, because no reader backs that claim (Prime Directive chore: version packages #10). It now says the value is kept as the root default for business units, changes no date calculation today, and that formulas, reports and displayed dates use Settings → Localization → Default timezone.en.objects.generated.tswas regenerated bynode scripts/check-i18n-bundles.mjs --write. Thezh-CN,ja-JPandes-ESleaves were translated by hand.No stored value changes meaning, and no write is newly refused.
Pins
branding.manifest.test.ts: three new cases.workspace_namedeclares no default (source and parsed), is not required, and is labelled "Product name" with help pointing at the Organization record.localization.manifest.test.ts: one new case. The timezone help names itself the zone in effect and says the organization record's field does not change it.packages/platform-objects/src/identity/sys-organization-name-timezone-help.test.ts, two cases: the name help points at Branding, and the timezone help says it changes no date calculation, names Localization's Default timezone, and no longer says "are computed in".settings-service.test.ts: two moved pins. "returns default when nothing set" now readslocalization.timezone('UTC') to keep a non-null default covered. A new case pinsworkspace_name'snulldefault. The reset case expectsnull.Ablation: with
branding.manifest.tsandsys-organization.object.tsrestored fromb9c7a8f5(worktree only),branding.manifest.test.tshad 3 failed and 5 passed, andsys-organization-name-timezone-help.test.tshad 2 failed. Withlocalization.manifest.tsrestored,localization.manifest.test.tshad 1 failed and 7 passed. After restoring HEAD, all passed andgit diff --quiet HEADwas clean.Tests and gates
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).typecheckscripts: exit 0.check-i18n-bundlesre-ran green aftermainwas merged in (9177cf7b). The 8 incoming commits touch otherplatform-objectsbundles (*.metadata-forms.generated.ts).dispatch-gates --commands: 68 families. All 68 exited 0, and--ranreports 68 run, 0 NOT-MEASURED, 0 UNRUN. Two of them first exited 3 on missing prerequisites and were rerun after the fix:check-plugin-teardown-shape --self-test: fetched its pinned fixture commit;check:dual-build-cjs-loads: built the 7 dists it named.check:i18n,check:i18n-stale-fill,check-adr-0087-registration --base origin/main(no breaking changeset) and eslint on the changed files all passed.!andClause-②carries no(narrowing)arm.Out of scope (for the seat)
singleneeds the spec registry line. It is handed to the coordinator, the card stays open, and the declaration, pins and a dogfood runtime pin for asingleboot are written and kept ready.ObjectOS(OS_PRODUCT_NAME,cloud-connection, cli lane) and auth mail saysObjectStack(OS_APP_NAME,plugin-auth). Acceptance notes.sys_business_unit.timezone's help still promises inheritance from the parent unit and the organization, which no reader implements. That is a documented contract by ruling, not a mechanism. Acceptance notes.Changesets:
.changeset/25347-branding-product-name.md(@objectstack/service-settingspatch) and.changeset/25347-organization-name-timezone-help.md(@objectstack/platform-objectspatch,Clause-②: no).Generated by Claude Code
🤖 Generated with Claude Code
https://claude.ai/code/session_01JJZRJcjTF4oBQK7333oAnR