Skip to content

fix(i18n): zh-CN renders case Critical as 严重, task Urgent keeps 紧急 - #1801

Merged
huangyiirene merged 1 commit into
mainfrom
claude/issue-1342-case-critical-severity-term
Sep 8, 2026
Merged

huangyiirene merged 1 commit into
mainfrom
claude/issue-1342-case-critical-severity-term

Conversation

@huangyiirene

@huangyiirene huangyiirene commented Sep 8, 2026 •

Copy link
Copy Markdown
Collaborator

Part of #1342

⚠️ This deliberately does NOT say Fixes, and the dispatch asked for Fixes. The ruling on #1342 has four items. Items 1–3 are here. Item 4 — the pins — is NOT, because it cannot be written without editing test/**, which is fenced (epic #1579). Auto-closing the card on merge would retire a ruling with a quarter of it undone and nothing tracking the remainder. Flip this line to Fixes #1342 the moment item 4 is filed as its own card, or unfence test/** and item 4 lands here. Details in The item that is missing below.

Ruling being executed

A, maintainer 2026-08-31 (hotcrm 决裁批 #19 ⑤, comment 5481124881, verbatim 「其他同意」). Not re-opened, not re-litigated: crm_case.priority.critical renders 严重, crm_task.priority.urgent keeps 紧急.

Every occurrence, graded by its referent

The word is not the discriminator — the object the sentence is about is. A find-and-replace on 紧急 corrupts the task documentation, so each hit below was read for what it refers to. Counts are grep -o occurrences unless a row says lines.

The language pack (src/translations/zh-CN/)

site (line at this commit) text referent verdict
objects.service.ts:62 critical: '紧急' crm_case priority.critical CHANGED → 严重
objects.activity.ts:55 urgent: '紧急' crm_task priority.urgent ⛔ KEPT — the ruling's other half
app.ts:170 title '紧急工单' the Critical Cases tile, crm_case CHANGED → 严重工单
app.ts:170 description '标记为紧急优先级的未关闭工单' the crm_case critical value CHANGED → 标记为严重优先级…
app.ts:174 description '…按紧急程度的分布' 紧急程度 = "priority level", the generic phrase ⛔ KEPT
app.ts:466 priority_rank: { label: '紧急度' } a task_metrics dataset dimension, and a generic word ⛔ KEPT

The app.ts:170 description was called out on the card as undecided (「item 2 names the title; whoever executes should say whether the description travels with it」). It travels. It names the value, not the phrase, so leaving it would describe a priority the console no longer shows — and ja-JP, which already made this split deliberately, words both halves with the value: title: '重大ケース', description: '優先度「重大」のオープンケース'.

The Chinese documentation

Changed — the sentence is about a CASE (9 sites per script face, 18 total):

page (zh-Hans / zh-Hant line) what it says why it is case-side
administration/profiles.*:53 紧急工单通过升级共享规则… 工单 = crm_case
administration/profiles.*:129 服务总监能看到每个紧急工单 工单
administration/sharing-and-security.*:95 service_manager —— 未关闭的紧急工单 the Escalated Cases sharing rule
administration/sharing-and-security.*:125 另加未关闭的紧急工单 same rule, summary table
service/sla-and-escalation.*:69 把卡住或紧急的工单标记为已升级 工单
service/sla-and-escalation.*:125 紧急未结工单由两条规则自动共享 工单
service/cases.*:163 紧急未结工单由两条规则自动共享 工单
ai-copilot/skills.*:90 一个优先级(低 / 中 / 高 / 紧急) triage output; the skill activates on crm_case, and the list IS the case vocabulary
ai-copilot/service-copilot.*:38 建议的优先级(低 / 中 / 高 / 紧急) case triage, same list

The last two are worth a note: 低/中/高/紧急 is the case option list spelled out, so it now reads 低/中/高/严重 and matches the pack character for character (AGENTS.md, Documentation discipline rule 6 — UI nouns take the pack's wording).

⛔ Kept — the sentence is about a TASK:

sales/activities.* :39 :41 :82 :104 :110 :131 (all 任务/任務) · administration/automation.*:67 紧急任务提醒 · administration/automation.*:73 紧急跟进任务 · service/cases.*:118 :135 优先级为紧急…的跟进任务 · service/index.*:38 same follow-up task · service/sla-and-escalation.*:106 紧急任务 · service/sla-and-escalation.*:117 紧急跟进任务.

⛔ Kept — 紧急程度 is "priority level", not the value word:

service/cases.*:181 先按紧急程度 · analytics/dashboards.*:109 未结工单按紧急程度的构成.

⛔ Kept and REPORTED, not guessed — the notification-name class:

service/cases.*:117 · service/index.*:37 · service/sla-and-escalation.*:116 and :168 — 紧急时通知 / 緊急時通知, the Chinese name of the row the English pages call Notify on Critical. Its trigger is case-Critical, and the very same row writes that trigger in English (優先順序設為 Critical). The dispatch classes this as report-do-not-guess and it is left alone. ⚠️ Consequence to decide: the docs now say 紧急时通知 for a notification fired by a priority the console renders 严重. My reading is that it is case-side and should become 严重时通知, but that is a rename of a named thing, not a value sweep, so it wants its own decision.

Untouched by rule: CHANGELOG.md (6 matching lines by grep -c, 8 occurrences by grep -o — published history, and changeset version owns that file) and docs/feature-inventory.md (:146 供队列按紧急度排序, generic; :211 紧急任务告警, task-side).

Counts

before after
content/docs 紧急 31 occ / 28 lines 22 occ / 19 lines
content/docs 緊急 31 occ / 28 lines 22 occ / 19 lines
content/docs 严重 0 9
content/docs 嚴重 0 9
src/ 紧急 as a value 6 occ / 5 lines 3 occ / 3 lines

严重 = 0 and 嚴重 = 0 across src/ content/ docs/ test/ before this PR, re-measured at d21367a0. It is new vocabulary and the ruling is its only authority.

The two comments (ruling item 3)

Both option lists now carry one, written as why the two words must differ rather than what they are, per the card's own argument and src/views/task.view.ts's live tombstone. objects.service.ts states that 紧急 belongs to the task and names the ruling; objects.activity.ts states that 紧急 stays and ⛔ must not be re-pointed at the case's top value. Both name the two vocabularies (low/medium/high/critical against low/normal/high/urgent) and the ruling's date and card.

The item that is missing, and why

Ruling item 4, verbatim:

pins:四语言 × 两对象的顶级值渲染各不塌缩(zh-CN 新增的区分入守卫,防回归)。

That is a guard, not a statement about locale consistency — 「入守卫,防回归」. No such guard exists today, measured: nothing under test/ asserts non-collapse, and 紧急 appears on exactly one line in the whole of test/ (automation-docs-coverage.test.ts:233, task_urgent_alert, task-side, untouched). Writing item 4 means editing test/**, which the dispatch fences behind epic #1579 with instructions to stop and report rather than cross. So it is reported, not crossed.

Two findings for whoever picks it up:

  1. The obvious home does not fit. test/docs-object-term-consistency.test.ts already derives a Chinese term from the pack and bans retired spellings — but its retired scan runs over every zh page, the pack itself and every ledger under test/. Adding 紧急 to crm_case's retired list would go red on the pack (crm_task.priority.urgent is still 紧急, legitimately), on the twelve task-side doc sites above, and on automation-docs-coverage.test.ts. This card's rule — the same word must die on one object and live on the other — is not expressible in that guard as built.
  2. Nothing currently catches a regression. Measured by ablation, below.

Verification

Every exit code captured before any pipe (cmd > log 2>&1; EXIT=$?).

gate exit reading
pnpm validate 0 unchanged approval-approver warnings only
pnpm typecheck 0
pnpm lint 0 1 warning, 12 suggestions — the pre-existing set
pnpm lint:i18n-gate 0 its own line: ✓ i18n lint gate: 0 i18n/missing-* issues (13 total lint issue(s) reported, unaffected by this gate) — a value was replaced, no key removed
pnpm hygiene 0 ✓ source hygiene clean, ✓ no raw control bytes in first-party files
pnpm hygiene:tokens 0 ✓ source token ratchet clean
pnpm build 0 dist/objectstack.json 1910.7 KB
pnpm test 0 165 files, 3453 passed, 1 skipped — identical to the d21367a0 baseline

Token ratchet, per touched path. Every src/ file here is under src/translations/, and the gate prints its own exclusion: outside the ratchet by ruling (src/translations, src/data): 45 files. src/dashboards/ and src/views/ are in surface and are not touched by this PR. The measure is also comment-stripped, so the two new comments could not move it either way. Residual: none.

The change reaches the shipped artifact, not just the source — from dist/objectstack.json:

"critical": "严重"                      (crm_case.priority)
"critical_cases": {"title": "严重工单", …}
"urgent": "紧急"                        (crm_task.priority — unchanged)
"description": "未关闭工单按紧急程度的分布"   (generic phrase — unchanged)
"priority_rank": {"label": "紧急度"}      (task dataset dimension — unchanged)

Ablation — no guard forces the docs half. content/docs/administration/profiles.zh-Hans.mdx was mutated back to 紧急工单 (2 sites) with the pack left saying 严重; the mutation was proved on disk by blob hash (076a7830… against HEAD's 830622ef…) before the run, and restored by git checkout HEAD -- path afterwards with git diff HEAD empty. The full suite stayed green: 165 files, 3453 passed — byte-identical to the unmutated run. Nothing in this repo compares that prose against the pack, because crm_case's pins in test/docs-object-term-consistency.test.ts is {} and the priority option is not among them. The docs sweep here is owed to the ruling and to Documentation discipline rule 6 — not to a gate. That gap is exactly what ruling item 4 was written to close, and it is still open.

Changeset

.changeset/case-critical-renders-yanzhong.md, patch. This ships: it is Chinese UI copy every user sees on every case, so skip-changeset would be wrong here.


🤖 Generated with Claude Code

https://claude.ai/code/session_01PpRjGNnwyo2J1rrmekxB1W

`crm_case.priority.critical` and `crm_task.priority.urgent` both rendered
紧急 in zh-CN — the only locale of four that collapsed two values the model
treats as distinct. en/es-ES/ja-JP all keep them apart, and ja-JP did so
deliberately (重大 / 緊急).

Per the maintainer ruling of 2026-08-31 (#1342, 决裁批 #19 ⑤):

- `crm_case.priority.options.critical` renders 严重;
- `crm_task.priority.options.urgent` keeps 紧急, unchanged;
- the Customer Service dashboard's Critical Cases tile follows the value
  (紧急工单 → 严重工单), and its description with it, the way ja-JP words
  both halves;
- both option lists carry a comment saying why the two words must differ.

The Chinese docs prose that calls a CASE 紧急/緊急 sweeps with the pack — 7
pages, 9 sites per script face. Every occurrence was graded by the object its
sentence is about, never by the word: task-side prose keeps 紧急, and the
generic phrase 紧急程度 ("priority level") is not the value word and does not
move.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PpRjGNnwyo2J1rrmekxB1W
@vercel

vercel Bot commented Sep 8, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
hotcrm Ignored Ignored Sep 8, 2026 3:01pm UTC

Request Review

@github-actions github-actions Bot added the metadata Declarative metadata — schema, security posture, UI surfaces label Sep 8, 2026
@huangyiirene
huangyiirene marked this pull request as ready for review September 8, 2026 15:13
@huangyiirene
huangyiirene added this pull request to the merge queue Sep 8, 2026
Merged via the queue into main with commit 5c71bdb Sep 8, 2026
11 checks passed
os-project-manager pushed a commit that referenced this pull request Sep 11, 2026
…e faces

PR #1801 moved crm_case.priority.critical from 紧急 to 严重 and swept the docs
prose describing a case as 紧急, but deliberately left the name of the named
thing alone. The automation row the English pages call "Notify on Critical" was
still 紧急时通知 / 緊急時通知, naming a notification after the word the packs now
reserve for crm_task.priority.urgent.

Align the row name to the rendered trigger: 严重时通知 / 嚴重時通知. This is the
rule the sibling row 升级时通知 already follows — the Chinese row names are
<rendered trigger>时通知 — so it keeps the pattern true rather than coining a
term.

8 sites across 3 pages x 2 script faces. The English pages, the 升级时通知
sibling, every task-urgent 紧急, and the generic 紧急程度 are all untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132iDHq4FLW2zS9VPXqbf9f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

metadata Declarative metadata — schema, security posture, UI surfaces

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants