Uh oh!
There was an error while loading. Please reload this page.
fix(spec): punctuate the zh-CN Operation Message Catalog with the full-width comma - #12904
Conversation
…l-width comma Every zh-CN entry in BUILTIN_OPERATION_MESSAGES separated its clauses with U+002C while ending the same sentence with U+3002 — two punctuation systems inside one sentence, in strings a business user reads in a toast. Twelve U+002C across the nine zh-CN entries become U+FF0C. The U+3002 sentence finals were already correct, the two U+3001 enumeration commas are correct Chinese and stay, and the en / ja-JP / es-ES rows are untouched. The pins that quote the moved literals move in the same commit, per the triage ordering ruling: the spec catalog's own test and plugin-approvals' recall-refusal operator-visible pin. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LpRNHxWZgSUgVnFT9mQQo4
📓 Docs Drift Check9 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run. What this run could not see
Coarse fallback — 126 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 4120e1a719632c0053abbff4494b2a72c698b013 && git checkout 4120e1a719632c0053abbff4494b2a72c698b013
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin d41d166b857e5ff188ba79bcf756c8b110a48cb0 9bade031daae4895f401f7203c719541a366d311 && git checkout -B drift-repro d41d166b857e5ff188ba79bcf756c8b110a48cb0 && git merge --no-ff 9bade031daae4895f401f7203c719541a366d311
node scripts/docs-audit/affected-docs.mjs --json d41d166b857e5ff188ba79bcf756c8b110a48cb0 |
… the full-width comma The whole-repo pin census for the catalog punctuation pass found seven files quoting these literals, not the two anticipated at grading time. Four are real pins that assert catalog-rendered output; two of them sat outside the file surface originally authorized for this card: - plugin-security permission-denied-user-copy.test.ts:257 — the hand transcribed literal beside line 256's catalog read, which already passes. - objectql engine-delete-restricted-locale.test.ts:171 — the sentence rendered through the real engine with translated labels. Both are forced by the catalog edit in the previous commit; moving them here keeps the literal and every pin asserting it in ONE PR, per the triage ordering ruling. Surface extension authorized by the dispatching seat. The fixture-local quotes in rest.test.ts and data-permission-denied-envelope .test.ts construct their own Error and were measured green unchanged, so they are deliberately untouched, as are the deployment-override fixtures in both edited files. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LpRNHxWZgSUgVnFT9mQQo4
…h comma packages/plugins/plugin-sharing/src/write-denial-user-copy.test.ts pins the record_write_denied sentence as a hand-transcribed literal (ZH_SENTENCE, line 249) feeding five assertion sites. It renders through the operation catalog end-to-end, so the zh-CN punctuation pass this card owns moved the value out from under it. Only the literal moves; every assertion keeps its exact-equality toBe against it, so the suite still pins the ruled spelling end-to-end. The catalog-reading assertions in the same file (record_write_denied read straight off BUILTIN_OPERATION_MESSAGES) were green throughout -- as in plugin-security, only the hand-copied literal was stale. Why it was missed: the original pin sweep ran at the claim-time base, where this file did not yet exist; it arrived in a later main merge. The sweep is now re-run at the head being pushed, over both spellings of all nine sentences across all tracked TS, with a positive control per fragment. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LpRNHxWZgSUgVnFT9mQQo4
Uh oh!
There was an error while loading. Please reload this page.
Fixes#12717
The catalog literal and every pin asserting it move together in this one PR, which is what the
triage seat's ordering ruling requires.
Authored in Claude Code session
session_01LpRNHxWZgSUgVnFT9mQQo4.What moves
Every
zh-CNentry inBUILTIN_OPERATION_MESSAGESseparated its clauses with U+002C (the ASCIIcomma) while ending the same sentence with U+3002 (the full-width period) — two punctuation
systems inside one sentence, in strings a business user reads in a toast.
Twelve U+002C across the nine
zh-CNentries become U+FF0C: the five situation keys(
permission_denied,record_access_denied,record_change_not_allowed,record_write_denied,approval_recall_not_submitter) and the fourdelete_restricted*variants.Measured by codepoint before and after, not by eye:
Nothing else moves. The U+3002 sentence finals were already correct. The two U+3001 (、) in the
_requiredvariants are the ideographic ENUMERATION comma in必填、无法清空— correct Chinese,and deliberately left alone; the card is about the clause separator only. The
en,ja-JPandes-ESrows are byte-identical (the catalog diff is 9 insertions / 9 deletions, all inside thezh-CNblock).Text-face only: no key, placeholder, wire code, status or accept/reject behaviour changes. A
deployment that overrides
errors.MESSAGEKEYthrough atranslationis unaffected; only thebuilt-in default moves.
The pin census
Five test files pin these literals by asserting catalog-rendered output, so all five move with
the literal. Each classification was confirmed by RUNNING the file, not by reading it:
packages/spec/src/system/operation-message.test.tspackages/plugins/plugin-approvals/src/recall-refusal-user-copy.test.tsZH_SENTENCEpackages/plugins/plugin-security/src/permission-denied-user-copy.test.tspackages/objectql/src/engine-delete-restricted-locale.test.tspackages/plugins/plugin-sharing/src/write-denial-user-copy.test.tsZH_SENTENCE, feeding 270/273/281/305/357Each was measured RED against the catalog change before being moved — that is this PR's reverse
verification. Representative output:
Exactly one literal changed per pin file; no assertion was weakened — every site keeps its
exact-equality
toBe, so each suite still pins the ruled spelling end-to-end. In bothplugin-securityandplugin-sharingthe neighbouring assertions that readBUILTIN_OPERATION_MESSAGESdirectly stayed green throughout, which localises the defect: onlythe hand-transcribed literals were ever stale.
⛔ Editing a pin's expectation to match new output is only legitimate when done BY the change that
moved the literal. This PR is that change.
Two further files quote a catalog sentence but are NOT pins — they construct their own
Errorand assert the transport echoes it back (
grep -cforBUILTIN_OPERATION_MESSAGES|renderOperationMessagereturns 0 in each), so they are green for any string. Run green and left byte-identical:
packages/rest/src/rest.test.tspackages/runtime/src/domains/data-permission-denied-envelope.test.tsUSER_MESSAGESweep method
Population: 5145 tracked
.tsfiles (2883*.test.ts),git grep -Fat the head beingpushed. Per catalog sentence, a distinctive comma-free fragment is the anchor — so a stale pin
cannot hide behind the very character under test — and both spellings of its clause are probed
separately. Each fragment carries a positive control: it must hit the catalog source itself or
the reading is void. All 8 controls passed. The sweep was re-run after the final
mainmerge, onthe exact tree pushed.
Verification
All readings from
9bade031d, this branch's final commit (currentorigin/maina77e46010merged in; everything re-run after that merge).
Build:
pnpm exec turbo run build --concurrency=2 --filter=./packages/* --filter=./packages/*/*— 70/70 successful, exactly as
lint.ymldoes it.Dist reachability proved before trusting any consumer test: the emitted CJS, ESM and browser
bundles of
@objectstack/specwere unescaped and searched — the new U+FF0C sentence present(1 occurrence each), the old U+002C form absent (0 occurrences). Consumers resolve
@objectstack/spec/systemtodist, so without this every consumer reading would have been of astale bundle.
Tests: the five pin files as tabled above, plus whole-package runs for
@objectstack/spec(440files / 11650 tests) and
@objectstack/plugin-sharing(29 files / 673 tests);typecheckgreenfor spec, plugin-security, plugin-approvals, objectql and plugin-sharing; both fixture-local
controls green untouched.
Gates: 44 families run locally, 43 green — including
check:adr-anchors, the spec families,the changeset family,
check:query-options-erasure,check:type-check-coverage,check:type-check-debt(re-measured 31 ledger entries, none above its recorded number),check:engine-double-contract,check:where-matcher,check:cross-package-test-inputs,check:i18n,check:i18n-stale-fill,check:nul-bytes,check:durability-log-level,check-engine-split-ratioandcheck-undeclared-dep-imports. Per-gate exit codes were capturedindividually before any pipe.
The one non-green is
scripts/pm/check-half-states.mjs, which printedPREREQUISITE NOT MET(novalid GitHub credential in this container) and swept nothing — NOT MEASURED, not a failure; the
real
pnpm check:pm-half-statesscript passed.Lint: eslint over all 6 changed source files — 0 errors, 0 warnings. The narrowing is measured,
not asserted: population from eslint's own config, count from
--format json, and the configdeclares no
parserOptions.projectand no typed@typescript-eslintrules, so this diff cannotmove the verdict of any file it did not touch. CI runs the full farm regardless.
Scope notes
Two zh sentences keep their ASCII comma deliberately, because both are deployment-override
fixtures — the value a fake translator or bundle returns, asserted to WIN over the built-in
catalog. Neither is a catalog literal and no user reads either:
本单只能由发起人撤回,请联系发起人。— approvals test, lines 250 and 259.此操作已被安全策略阻止,请联系系统管理员。— plugin-security test, lines 352 and 354.Sibling repo
objectuicarries its own separate zh bundle (packages/i18n/src/locales/zh.ts)with different sentences; no coupling to these nine literals.
#11993's pin landed on main first, per the triage seat's ordering constraint.