Repository navigation
fix(services): in-system copy says "this system" or drops the noun, not "this environment" (cloud#3002 ruling A) - #24407
Conversation
…ot "this environment" Refusals, two guard warnings and Setup help text in plugin-auth, plugin-security and service-settings, read inside the running system, follow the per-string rule: "this system", or drop the noun. The OIDC authorize-gate refusal keeps its noun: only the cloud control plane installs that gate, and there it names the environment being signed in to. Copy only: no status, error code, settings key or response shape moves. Claude-Session: https://claude.ai/code/session_01Nk17Z26X5DB59iQztDBADH Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 3 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 — 28 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 fa491536744aa7c4ba4153ee7c31bd635de3623b && git checkout fa491536744aa7c4ba4153ee7c31bd635de3623b
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 2a1e48a1c104f533186b13fc0f19d9e60e567ce3 3777e26dc067b2383761c1281d16a95bfc1971d9 && git checkout -B drift-repro 2a1e48a1c104f533186b13fc0f19d9e60e567ce3 && git merge --no-ff 3777e26dc067b2383761c1281d16a95bfc1971d9
node scripts/docs-audit/affected-docs.mjs --json 2a1e48a1c104f533186b13fc0f19d9e60e567ce3
|
席位核对ACCEPT ·
Generated by Claude Code |
Fixes #24368
Clause-②: no
Basis: copy only. Every HTTP status, error code, settings key and response shape stays as it was. Only the human-readable text moves.
What changed
This PR covers the
domain:servicespart of the census on the card:plugin-auth,plugin-securityandservice-settings. Each string follows the rule in triage6252585695, the one6250167038set out for objectstack-ai/cloud#3002 ruling A. "Made here, not from a package" becomes "authored in this system". "The system the caller is in" drops the noun, or says "this system" when the noun is the subject of the sentence. A deployment or configuration scope keeps its word. The other lanes went to #24404 (cloud-connection,mcp), #24405 (platform-objects) and #24406 (packages/spec). This PR does not touch them.Lines are on
3777e26dc. They are the same lines as ond79dc4883, because every edit replaces one line with one line.The strings the claim lists
plugin-auth/src/audience-posture.ts:476,SELF_REGISTRATION_CLOSED(sign-up refusal)audience-posture.ts:487,EMAIL_DOMAIN_NOT_ALLOWEDauth-manager.ts:2527,403 ENV_ACCESS_DENIED(the/oauth2/authorizegate)auth-plugin.ts:3505, OAuth self-service503 SERVICE_UNAVAILABLElast-admin-guard.ts:893, maxScan overflow refusallast-admin-guard.ts:1278, the walled-posture remedy appended to both emptiness refusalslast-admin-guard.ts:1304, refusal whenadmin_full_accessis switched offlast-admin-guard.ts:1354, refusal for dangling grantslast-admin-guard.ts:1510, alogger.warnline (the user-row halves)register-sso-provider.ts:385,400 DOMAIN_VERIFICATION_DISABLEDplugin-security/src/packaged-permission-set-lock.ts:337–:338,PackagedPermissionSetLockedErrordiagnosticmessage(403 NOT_OVERRIDABLE)userMessageis unchanged.packaged-permission-set-lock.ts:363,PackagedPermissionSetProvenanceUnknownErrordiagnosticmessageuserMessagealready says "the system couldn't confirm".service-settings/src/manifests/auth.manifest.ts:92, Authentication › Audience group helpmanifests/mail.manifest.ts:58, Mail › Provider group helpmanifests/sms.manifest.ts:22, SMS › Provider group helptranslations/en.ts:27,settings.mail.groups.provider.descriptiontranslations/en.ts:139,settings.auth.groups.audience.descriptionThree strings the census missed, read and changed in place
The census grepped one line at a time. These three split the phrase across a string concatenation (
… this+environment …), so it never saw them. A multiline search found them in the same file and in the same functions as rows 9 and 7–8. I changed them under os-dev's bounded in-place rule, because all four of its conditions hold: they are the same defect class, the fix is mechanical and the rule above fixes its shape, the claim already names this file, and the same gates verify them. In the two refusals, "administer the environment" in the same sentence follows too, so neither sentence names the system twice in two ways.last-admin-guard.ts:1516–:1519, the user-row refusal thrown right after row 9's warninglast-admin-guard.ts:1612–:1613, alogger.warnline (the standing halves), the twin of row 9last-admin-guard.ts:1619–:1624, the standing refusalThe other locales of rows 13–15
zh-CN,ja-JPandes-EScarry the same three keys. The only change is the noun, which now uses the spellings the console's locale packs already use under the same ruling (objectstack-ai/objectui PR 12959 and PR 12962: zh 本系统, ja このシステム, es este sistema). No other word in those translations changed.settings.mail.groups.provider.descriptionsettings.sms.groups.provider.descriptionsettings.auth.groups.audience.description(first sentence)en.tshas nosettings.smsnamespace. In English, the SMS help comes from the manifest literal (row 15). This PR does not add the key.Kept, and why
auth-manager.ts:2527(row 3). This refusal exists only where the host setsoidcAuthorizeGate. The option's contract (auth-manager.ts:726–:735) calls it the "OIDC OP authorization gate (cloud-as-IdP app-assignment)". The cloud control plane uses it so that "a cloud user may only obtain a code for an env client … of an org they belong to". It also says: "Unset (open editions / self-host …) = allow". Nothing in this repository sets the option. Onlyoidc-authorize-env-gate.dogfood.test.tsinstalls one, as a fixture. So the text is shown by the cloud, acting as OIDC provider, to a cloud user who is already signed in, and its noun names the environment that user asked to sign in to. That is the deployment addressed from outside, where triage keeps the cloud noun (its reason forcli). "This system" would tell that user they may not sign in to the cloud itself. Dropping the noun would tell an already signed-in user they may not sign in. The census counted this string in-system from a code reading, so I report the different reading here and in the report rather than choosing silently.last-admin-guard.ts:1300and:1350: twologger.warnlines, "refused a … in an environment whose …" and "… in an environment with no administrator that is NOT a fresh install". They use an indefinite "an environment" to describe a state, not "this environment". They are not in the census and not in this card's phrase. Noted only.*///hit of the phrase in the three packages.plugin-security/src/__tests__/legacy-catalog-objects.testkit.ts:366: a test fixture that freezes a retired object's field description.plugin-auth/CHANGELOG.md(:610,:14237);.changeset/pre/22463-sso-domain-verification-unknown-provider.md:9, which quotes the old 400 as its "Before"; andcontent/docs/releases/v17/17-3.mdx(:18,:183, concept prose "an environment's apps").service-settingslocales are configuration scope and keep their words: the env-var source label, "deploy env vars take precedence", "production environment", "regulated environments", the per-environment storage prefix.Readers of the changed strings, measured
git grepover the whole tree (packages, docs,docs/qa,content/docs, skills, examples,.changeset) for each string's fragments, plus the sibling objectui checkout at2ec9e2a:/recognises NO administrator/(last-admin-guard.test.ts:1979,:2098),/last administrators?/iin 46toThrow/toMatchassertions across thelast-admin-guard*andgrant-readers-*suites,'Self-registration is closed'(audience-posture.test.ts:606, and a not-contain ataudience-bootstrap-seam.test.ts:185), and the lock errors' class plus the set name, package id and reason inmessage(packaged-permission-set-lock.test.ts:229–:272). No test pins the changed noun, so no pin moved and no new prose was copied into a test.oidc-authorize-env-gate.dogfood.test.ts:271pins the codeENV_ACCESS_DENIED. That string is kept anyway.code(objectuisignUpRefusalMessages.ts), and it reads Settings help from the shipped bundles.docs/qa/platform-checklistitem, doc page or skill quotes any of these strings.Mechanism hypotheses from the dispatch, measured
d79dc4883: confirmed. All 17 listed sites sit at the lines the claim gives.packaged-permission-set-lock.ts:337–:338, splits the phrase across two lines, and the census listed it as a range. The multiline search for a split phrase finds that one and three more strings, rows 18–20, which the list missed. After this PR, the only non-comment, non-test hit ofthis environmentin the three packages is row 3, and the split-phrase search finds none.check:i18n/check:i18n-stale-fill": falsified. Both gates walk the generated*.generated.tsbundle sets thati18n-extract.config.tsconfigs produce.service-settingshas no extract config, and its four locale files are hand-written. At3777e26dc,check:i18nreports "OK (10 package(s) …)" andcheck:i18n-stale-fillreports "scanned 11 bundle set(s)". Neither log namesservice-settings. So no repo tool moves these values. The route the ruling intends is the noun swap above, in the ruling's own per-locale spellings, not a new translation. Its coverage guard,settings-translation-coverage.test.ts, checks presence only and stays green.Verification (head
3777e26dc, ond79dc4883;origin/mainhad not moved)All builds and tests ran through
scripts/pm/os-verify-lock.sh.turbo run build --filter=!@objectstack/docs --concurrency=2: "Tasks: 76 successful, 76 total" (3 cached).VERDICT command-exit 0.@objectstack/plugin-auth:vitest run --maxWorkers=2reported "Test Files 163 passed (163) · Tests 3145 passed | 10 skipped (3155)".typecheckexited 0 (tsc, the examples project, andcheck:test-typecheck: "10 file(s) / 88 error(s) / 23 pinned signature(s) held").@objectstack/plugin-security: reported "Test Files 187 passed (187) · Tests 3738 passed | 45 skipped (3783)".typecheckexited 0 (tsc, the scripts project, andcheck:test-typecheck: "0 file(s) / 0 error(s)").@objectstack/service-settings: reported "Test Files 51 passed (51) · Tests 881 passed (881)".typecheck(tsc --noEmit) exited 0.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths) derived 67 commands from the 13 changed paths. All 67 ran after the final commit, each exit code captured before any pipe, and all 67 exited 0.--ran: "Run reconciliation — 67 derived, 67 run, 0 NOT-MEASURED, 0 UNRUN." Selected verdict lines:check:doc-authoring"19057 customer-facing string(s) … clean";check:nul-bytes"OK (scanned 12249 text file(s) …)";check-empty-changeset"1 declaring changeset(s) added";check-adr-0087-registration"this PR adds no declared-breaking changeset";check:dual-build-cjs-loads"111 … 69 …" entries/packages, over its floors.pnpm exec eslint --no-inline-configover the 12 changed.tsfiles: exit 0, no output..changeset/24368-services-this-system-copy.md:patchon@objectstack/plugin-auth,@objectstack/plugin-securityand@objectstack/service-settings, all three published (files: dist, README.md, CHANGELOG.md). It starts withClause-②: no.Acceptance notes
packages/spec/src/system/auth-config.zod.ts:401has the audience sentence ("Who may become a user of this environment's apps") as a TSDoc comment. It is a comment, so the census left it out, and it sits in spec copy, the rest of cloud#3002 ruling A: 9 published "this environment" strings in packages/spec need the per-string reading (split from #24368) #24406's lane. If spec copy, the rest of cloud#3002 ruling A: 9 published "this environment" strings in packages/spec need the per-string reading (split from #24368) #24406 reaches it, the two should read alike.repo:objectui, at2ec9e2a:apps/console/src/pages/auth/__tests__/registerRefusalCodes-10998.test.tsx:47–:54andpackages/app-shell/src/console/auth/__tests__/registerRefusalCodes-11030.test.tsx:47–:56restate rows 1–2's old server message "as the audience gate sends it", as a fake-server fixture. They do not parse it and stay green. Once this lands, the fixture is out of date, not broken.auth-manager.ts:2527, and no test reads its prose.Generated by Claude Code