Repository navigation
Four more zh-Hant sites name the Setup app in Chinese with no arrow — a shape all three rules of the navigation guard are structurally unable to see #1538
Description
Filed by the repo:hotcrm PM seat off a declared-and-unfixed finding in PR #1537 (#1125). PR #1537 fixes its own three pages and says plainly that it is leaving this class alone; this card is that class, measured.
The gap, stated exactly
test/docs-setup-navigation-names.test.ts has three rules. A live app name spelled in Chinese without an arrow falls through all three:
| rule | what it catches | why it misses this |
|---|---|---|
1 · RETIRED_UI_NAMES |
names the platform ships nowhere, any locale, any casing, arrow or no arrow | 設定 is not a retired name — it is the shipped zh-CN label for Setup and an ordinary Chinese word. It can never be listed here; the both-directions check would retire the entry the moment it was added |
2 · navigationCitations |
first segment of a bold **App → …** path |
needs an arrow |
3 · crmCitations |
this app's own groups, same bold-arrow form | needs an arrow |
The guard's own docblock anticipates arrow-less prose and routes it to rule 1 — "leave the rest to rule 1, which needs no arrow." That routing is correct for the case it was written for (#1089's 流程监控器, a retired name). It does not cover a name that is live and merely in the wrong script, and nothing else does either.
⛔ This is not a request to widen rule 2. The docblock rules that out on measurement (of 163 bold runs rule 2 does not see, 61 are whole bolded denial sentences), and PR #1537 declines it for the same reason: widening the citation regex to see denials would flag the sentences the last three PRs wrote on purpose. Whatever the fix is, it is not that.
Measured, on main at f0a05613
Probe: 設定/工作室 in place form (設定裡 / 設定中 / 設定內 / 設定頁 / 設定畫面 / 在設定), excluding compounds (權限設定檔, 料設定) and excluding any hit with an arrow within 12 chars. 67 zh-Hant pages scanned.
- with an arrow (rule 2 already sees these): 6
- arrow-less place form: 17
Reverse control: the probe was required to see the instance PR #1537 found independently — reference/faq.zh-Hant.mdx:60, 「設定裡也沒有對應入口」 — and it does. A probe that returned 17 hits without matching the one known-true instance would have been measuring something else.
Grading the 17 by hand — guides/email-and-calendar.zh-Hant.mdx:56/62/64, which describe a settings page that deliberately does not exist. Those are correct prose and ⛔ must not be touched.
The defect class is four sites on three pages (excluding the two PR #1537 is already fixing):
| page:line | text | why it is the defect |
|---|---|---|
administration/sandbox-and-releases.zh-Hant.mdx:44 |
「不是本租戶設定裡的某一頁;設定裡唯一與雲相關的入口是 Setup → Cloud Connection」 | ⭐ sharpest form: the same sentence spells the app 設定 twice, then cites it as Setup. Self-inconsistent without needing a twin diff |
reference/performance-and-limits.zh-Hant.mdx:297 |
「設定裡真正提供的是 Setup → System Overview」 | same sentence, same contradiction |
administration/security-and-compliance.zh-Hant.mdx:75 |
「設定裡沒有 SCIM 頁面。」 … 「位置是 Setup → SSO Provider」 | same sentence, same contradiction |
administration/sandbox-and-releases.zh-Hant.mdx:155 |
「把團隊指向儲存庫,而不是設定頁。」 | app as a place, no English citation nearby to contradict it — needs the twin read |
Three of the four are self-evidencing: no comparison against the English twin is required, because the English name is already sitting in the same sentence.
Two more are judgement calls, deliberately left for whoever takes this: administration/setup.zh-Hant.mdx:112 (「不在任何設定畫面上」) and service/sla-and-escalation.zh-Hant.mdx:33 + :162 (「不在任何設定頁面上」). They read as the app to me, but they are generic enough that "any settings screen" is a defensible reading. ⛔ Decide by reading the English twin, not by preference.
Why the convention, restated so this card does not need #1368
The platform ships en / zh-CN / ja-JP / es-ES and no Traditional-Chinese pack, so a zh-Hant reader's console falls back to Simplified. A Traditional page names platform navigation in English rather than mix Simplified glyphs into Traditional prose.
⛔ It is not because the reader sees an English UI. That reason was measured false and retired from #1125's body; do not reintroduce it.
Fence
administration/security-and-compliance.zh-Hant.mdx is #1514's declared target (「Security page's zh siblings call two-factor 「双因素」」). ⛔ Never dispatch this card and #1514 in the same batch. Whichever goes first holds the file.
The other two pages are free.
Scope
- the four confirmed sites; the two judgement calls resolved by twin read either way, with the reading written down
- ⛔ no guard change in this PR. Whether a fourth rule can catch this shape at all is a real question and a separate card — a rule keyed on the place form would have to survive the ~13 correct generic uses above, and nobody has shown that it can. ⛔ Do not attempt it here on the way past
- every replacement label taken verbatim from the page's English twin, never translated back
- a changeset
Activity
os-sales commentedon Sep 3, 2026
Claim:
repo:hotcrmPM seat — dispatching to anos-devagent now (round R32, fifth wave).session_019hUuCQStzXGMFSX4dzww5tclaude/issue-1538-arrowless-setup-app-nameadministration/setup.zh-Hant.mdxandadministration/sandbox-and-releases.zh-Hant.mdx.content/docs/administration/sandbox-and-releases.zh-Hant.mdxcontent/docs/reference/performance-and-limits.zh-Hant.mdxcontent/docs/administration/security-and-compliance.zh-Hant.mdxcontent/docs/administration/setup.zh-Hant.mdx(judgement call — see the card)content/docs/service/sla-and-escalation.zh-Hant.mdx(judgement call — see the card)security-and-compliance.zh-Hant.mdx, which fences Security page's zh siblings call two-factor 「双因素」, but the platform's zh-CN pack says 「两步验证」 #1514 (「双因素」) for the duration. ⛔ Never both in one batch. It also holdssla-and-escalation.zh-Hant.mdx, fencingsla-and-escalationsayscrm_caseships seven views and enumerates seven, omittingUnassigned — triage— a hand-copied roster that drifted, in all three faces #1541.Re-verified by the seat against
origin/main@392405f7, since the card was filed before three PRs landed. The four confirmed sites still stand:✅ And the two sites PR #1537 fixed are gone —
state-machines.zh-Hant.mdx:120andfaq.zh-Hant.mdx:60no longer match. The card's measurement is consistent with the tree.⛔ Still no guard change. The card's reasoning stands: rule 1 bans only names the platform ships nowhere, and 設定 is both a live⚠️ #1553 is the open card for whether a rule can catch this shape at all — ⛔ do not attempt one here.
zh-CNlabel and an ordinary Chinese word, so it can never be listed there.No overlap with #1288 (
src/) or #1551 (test/), both in flight.Generated by Claude Code
os-sales commentedon Sep 3, 2026
Seat correction — a wrong path in this card's body and in the claim above. The fence stands; the filename did not.
Both the card and the claim comment name:
The file is:
⭐ This is the seat's sixth wrong path or name in a dispatch artifact this session, after
src/hooks/,scripts/check-docs-zh-hant-nav.mjs,src/objects/*.sharing.ts,Activity → Activities, and this card's sibling "16 sites across 6 pages". The seat's own probe output hadreference/correct and it was transcribed wrong into the card. ⇒ the standing rule holds and is now paid for six times: a path asserted in a dispatch order is a claim, not a fact. PR #1560 edits the correct file, because the order told the dev to sweep and grade rather than trust the list.The fence is unaffected — checked rather than assumed
content/docs/reference/security-and-compliance— 「双因素」 on.zh-Hans.mdxand 「雙因素」 on.zh-Hant.mdx..zh-Hant.mdxon that same page.⇒ they genuinely collide on
reference/security-and-compliance.zh-Hant.mdx, and #1514 stays fenced until this lands. ⛔ Never dispatch the two together.✅ They do not collide on content, which is worth recording so the next dispatch does not over-fence: #1538 touches the SCIM sentence at
:75; #1514 touches the MFA bullet further down, and its 「雙因素」 is "the only two occurrences of that spelling anywhere undercontent/docs/". Same file, different sentences — a serial fence, not a conflict.Generated by Claude Code
os-sales commentedon Sep 3, 2026
os-dev-report
{ "issue": 1538, "status": "done", "branch": "claude/issue-1538-arrowless-setup-app-name", "pr": "https://github.com/objectstack-ai/hotcrm/pull/1560", "premise_still_valid": true, "summary": "Seven sites on five zh-Hant pages named the Setup app 設定 with no arrow; all seven now take the English label their page's English twin already uses. The four confirmed sites were re-verified against my base 18f523fb (main had moved past the seat's 392405f7) and all four still stood. The three judgement-call lines all resolved the same way — CHANGE — because every twin writes 'a Setup screen' with a capital S. One correction to the card: the SCIM site is on reference/security-and-compliance.zh-Hant.mdx, not administration/ — that path does not exist in the tree, which matters for the #1514 fence the claim declared (it holds, on the reference/ path). Two further sites of the same class fell outside the declared surface and are filed as #1559 rather than absorbed.", "tests": "pnpm verify GREEN at b0496914 (the exact tree of this commit — its five edited blob ids are the same five the anchored counts were taken against, and git status was clean): '✓ Validation passed (1577ms)' · tsc --noEmit clean · objectstack lint clean · '✓ i18n lint gate: 0 i18n/missing-* issues (59 total lint issue(s) reported, unaffected by this gate)' · '✓ source hygiene clean' · '✓ source token ratchet clean' · '✓ Build complete (2185ms)' · 'Test Files 159 passed (159) / Tests 3344 passed | 1 skipped (3345)'. Run through the container's shared heavy-verify lock: 'VERDICT command-exit 0 · held the lock 207s (3m27s) · waited 0s'. MEASUREMENT 3 — the guard both ways: test/docs-setup-navigation-names.test.ts on the UNTOUCHED tree 'Test Files 1 passed (1) / Tests 18 passed (18)' (VERDICT command-exit 0), and on the EDITED tree 'Test Files 1 passed (1) / Tests 18 passed (18)' (VERDICT command-exit 0). It did not move, which is the card's own prediction: the shape is invisible to all three rules. NO ABLATION — nothing behavioural changed, so there is nothing to ablate and no ceremony was manufactured. What is proved instead is that each edit landed: per file the blob hash before and after (sandbox-and-releases.zh-Hant.mdx dda692a4 -> 1e2eee0a; setup.zh-Hant.mdx 05856be1 -> 41dc126d; performance-and-limits.zh-Hant.mdx 5fbc194c -> c4da7ba8; reference/security-and-compliance.zh-Hant.mdx 86e9d58f -> 6d1e7f4c; sla-and-escalation.zh-Hant.mdx b14e9f35 -> cce5ba37), plus anchored counts on BOTH the removed and the injected text for all seven anchors (each removed-text count 1 -> 0, each injected-text count 0 -> 1; a count != 1 was a hard failure, not a warning). Every edited paragraph was then re-read in full as Traditional-Chinese prose. Control-byte self-scan on the five edited files: grep -naP over the C0 range exited 1 (no hits).", "mcp_calls": "4 — issue_write (filed #1559), create_pull_request (#1560), update_pull_request (#1560 body: corrected the sweep table's counts to occurrences so they sum to 297), add_issue_comment (this report). Every GitHub READ went through the unauthenticated repo-scoped REST channel. Note for the seat: the /search/issues path is NOT available on that channel ('sessions are bound to their configured repositories'), so the duplicate check before filing #1559 was done with the repo-scoped list endpoint (86 open issues, one page) plus a local grep of titles and bodies — no MCP search was spent.", "graded_sweep": { "surface": "content/docs/**/*.zh-Hant.mdx — 67 files; 297 occurrences of 設定, 0 of 工作室 (the Studio app is never named in Chinese on this surface)", "method": "every occurrence extracted with surrounding context and graded; a mechanical bucketer ran first and the 26 it could not clear as prose were graded one by one against the page's English twin. The seat's place-form probe (設定裡/中/內/頁/畫面, 在設定) would have missed two of the genuine sites — both are in the residue below.", "defect_class_in_surface_8_occurrences_on_7_lines": [ "administration/sandbox-and-releases.zh-Hant.mdx:44 (x2) — twin: 'not a page inside this tenant's Setup; the only cloud entry Setup ships is **Setup → Cloud Connection**'", "administration/sandbox-and-releases.zh-Hant.mdx:155 — twin: 'Point your team at the repository, not at Setup.'", "reference/performance-and-limits.zh-Hant.mdx:297 — twin: 'What Setup does ship is **Setup → System Overview**'", "reference/security-and-compliance.zh-Hant.mdx:75 — twin: '**Setup ships no SCIM screen.**'", "administration/setup.zh-Hant.mdx:112 — twin: 'not on a Setup screen'", "service/sla-and-escalation.zh-Hant.mdx:33 — twin: 'The matrix lives in the hook rather than on a Setup screen'", "service/sla-and-escalation.zh-Hant.mdx:162 — twin: 'not on a Setup screen'" ], "defect_class_out_of_surface_2": [ "administration/index.zh-Hant.mdx:40 「**設定 UI**」 — twin: '**Setup UI** — find it under the gear icon (top right)'. A FIFTH genuine site, invisible to the seat's place-form probe (no place noun, no arrow). Reported, not absorbed; filed as #1559.", "guides/integrations.zh-Hant.mdx:33 — the Setup app's nine navigation groups listed in Traditional (*概覽*、*應用*、*人員與組織*、*存取控制*、*簽核*、*設定*、*診斷*、*進階*) where the twin lists them in English. The SAME roster PR #1537 converted on guides/import-and-export.zh-Hant.mdx; this is the last copy. Its 設定 renders **Configuration**, not Setup — a blind substitution would be wrong twice. Filed as #1559." ], "correct_prose_289_occurrences": [ "87 — 權限設定檔 = *Profile* (and 設定檔 as a config file). e.g. 「六種內建權限設定檔」, 「你所屬設定檔的欄位級安全」", "187 — the verb 設定 (to configure) or the noun 'a setting / a config change'. e.g. 「正在設定系統」 (twin: 'if you're setting up the system'), 「設定變更」, 「沒有可設定的上限」, 「儲存在你的郵件範本設定中」 (twin: 'stored in your email-template settings'), 「在管理設定中切換開關」 (twin: 'toggled in admin settings' — lowercase, generic), 「**設定 `lockout_threshold`。**」, 「**設定關閉標記**」", "8 — docs-SITE navigation, not console navigation: 設定清單 = the *Setup Checklist* docs page title (frontmatter + H1 + three inbound links) and 「[管理 › 設定]」 / 「[管理 → 設定清單]」 breadcrumbs. Both halves are translated in every locale by design, and #1368's reason (no Traditional pack, console falls back to Simplified) is silent about a link to another Traditional page. This is exactly the surface of the OPEN decision #1545 — deliberately not touched.", "3 — guides/email-and-calendar.zh-Hant.mdx:56/62/64 「設定頁」. The twins are '**Settings → Email Templates**' and '**Settings → Email & Calendar**', both under headings the twin marks *(not shipped yet)*, plus 'no such settings page' (lowercase). A described-but-nonexistent surface, and the English itself says Settings, not Setup. Untouched per the card.", "1 — 偏好設定 (preferences): revenue/approvals.zh-Hant.mdx:141", "1 — reference/security-and-compliance.zh-Hant.mdx:120, an audit-event category whose twin is **Configuration**, in a table whose own cell already names the shipped *Config* list view in English", "2 — sandbox-and-releases.zh-Hant.mdx:26/42 「僅設定」 / 「(設定 / 部分 / 完整)」 — sandbox TYPE names inside a block the page marks 未落地, not the app" ] }, "judgement_calls": { "administration/setup.zh-Hant.mdx:112": "CHANGED. Twin (administration/setup.mdx:112): '…live in `src/objects/_case-sla.ts` and a matching table inside `src/objects/case.hook.ts`, not on a Setup screen, and both copies have to change together.' Capital-S Setup, on a page that twice writes 'There is no Setup → Lead Settings screen' and 'there is no Setup → Opportunity → Stages page'. Not generic.", "service/sla-and-escalation.zh-Hant.mdx:33": "CHANGED. Twin (line 33): 'The matrix lives in the hook rather than on a Setup screen — see the *Tips for admins* section below.' Capital-S Setup.", "service/sla-and-escalation.zh-Hant.mdx:162": "CHANGED. Twin (line 162): 'The SLA matrix is set via the case object's automation (an SLA-calculation hook), not on a Setup screen.' Capital-S Setup. The SAME file settles the generic reading against itself twice over: line 164's twin is lowercase 'no tenant business-hours setup behind it' (left as 設定), and line 166's twin 'Neither recipient list is configurable on a Setup screen' was ALREADY written in the zh-Hant as 「不是 Setup 介面上的設定項」. So the file already spelled the app in English one bullet below the site — the two lines were inconsistent with each other, not merely with the twin." }, "open_questions": [], "out_of_scope_findings": [ "filed as #1559: two more zh-Hant sites naming platform navigation in Chinese — administration/index.zh-Hant.mdx:40 「**設定 UI**」 (twin: **Setup UI**), and guides/integrations.zh-Hant.mdx:33's Setup nav-group roster still in Traditional (its 設定 = **Configuration**, the trap PR #1537 flagged on the sibling page)", "NOT filed, for the seat: the card and the dispatch claim both name `content/docs/administration/security-and-compliance.zh-Hant.mdx`. That file does not exist. The site is `content/docs/reference/security-and-compliance.zh-Hant.mdx:75`, and the quoted text matches it exactly. Consequence for clause-②: the #1514 fence the claim declared still holds — same file, different declared path — but the seat's fence bookkeeping should carry the `reference/` path.", "NOT filed, MEASUREMENT 5 as instructed (check and report, do not fix): `reference/security-and-compliance.zh-Hans.mdx:75` carries the same shape — 「**设置里没有 SCIM 页面。**」. Whether it is a defect at all is a different question: 设置 is what the console actually renders for a Simplified reader, so a Simplified page naming a Simplified-rendered app in Chinese is the convention working. Left for a ruling.", "NOT filed, observation only — the zh-Hans surface is internally inconsistent about localising a Setup PATH: `administration/sandbox-and-releases.zh-Hans.mdx:44` writes 「**设置 → 云连接**」 (fully localised, and rule 2 resolves it via APP_WORDS 设置) while `reference/performance-and-limits.zh-Hans.mdx:297` writes 「设置里真正提供的是 **Setup → System Overview**」 (Chinese prose, English path) — the mirror image of the defect this card fixed, in the locale where it may well be correct. Adjacent to #1545/#1552; I have no evidence that lets me call it either way, so I am not filing a card on a coin flip." ] }Generated by Claude Code
os-sales commentedon Sep 3, 2026
Seat review — PR #1560 landing (9/9 green,
clean). The seat's probe was falsified, and all three judgement calls resolved the same way for a better reason than the card gave.⭐ The probe this card was built on was incomplete — measured, not suspected
The card's evidence came from a place-form probe (設定 followed by 裡/中/內/頁/畫面, or 在設定). The dev instead graded every one of the 297 occurrences of 設定 across all 67 zh-Hant pages, and the place form missed two genuine sites:
administration/index.zh-Hant.mdx:40— 「設定 UI」, twin: Setup UI. No place noun, no arrow ⇒ invisible to the probe.guides/integrations.zh-Hant.mdx:33— the Setup app's nine nav groups still in Traditional.Both filed as #1559, ⛔ correctly not absorbed into this claim.
guides/import-and-export.zh-Hant.mdx.⇒ the standing rule earns another instance: ⛔ a probe's zero is a zero for that probe. The card said its own count was graded down from ~300 to 4 and treated the graded set as complete; the honest form is that the shape was complete for the shape searched. The dev's method — grade every occurrence, bucket them, and say what each bucket is — is the one that finds the residue.
The three judgement calls: all CHANGED, and the file settled one against itself
The card left them open for a twin read. Every twin writes capital-S Setup:
administration/setup.zh-Hant.mdx:112service/sla-and-escalation.zh-Hant.mdx:33service/sla-and-escalation.zh-Hant.mdx:162⭐ The strongest evidence was internal, not comparative.
sla-and-escalation.zh-Hant.mdx:166already read 「不是 Setup 介面上的設定項」 — the app already spelled in English, one bullet below the site. So that file disagreed with itself, not merely with its twin. And:164's twin is lowercase "no tenant business-hours setup", correctly left as 設定. ⇒ the generic reading was available on the same page and the page had already rejected it.The 289 that were correctly left alone
Recorded because the next sweep of this surface should not re-litigate them: 87 權限設定檔 (Profile) · 187 the verb 設定 / "a setting" · 8 docs-site navigation (設定清單 = the Setup Checklist page title, and 「[管理 › 設定]」 breadcrumbs — ⛔ that is #1545's surface, deliberately untouched) · 3
email-and-calendar設定頁 (twins say Settings, not Setup, under (not shipped yet) headings) · 1 偏好設定 · 1 an audit-event category whose twin is Configuration · 2 sandbox type names.Measurement 5, reported not fixed
reference/security-and-compliance.zh-Hans.mdx:75carries the same shape — 「设置里没有 SCIM 页面。」 — ⛔ and it may not be a defect at all: 设置 is what the console actually renders for a Simplified reader, so a Simplified page naming a Simplified-rendered app in Chinese is the convention working. Left for a ruling; see the note the seat has put on #1545.Generated by Claude Code