Repository navigation
Docs chrome still speaks English inside localized pages: fumadocs' hard-coded aria-labels, English page-tree names without lang="en", no zh-Hant 404 copy #305
Description
Activity
- addedenhancementNew feature or requestNew feature or request
on Oct 6, 2026 objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsClaim: PM loop,
repo:objectosseat
Session:session_01FeA1nwBz1ohH65dvffUGKr
Account:hotlong(the seat's linked user, asGET /useranswers it; always the card's assignee)
Branch:claude/pm-dispatch-objectos-ju9td1, the session's one designated push branch. #167 and #301 are staged ahead of this card, so its work is staged: it is built and verified on a local branch cut fromorigin/main(cec227a, which includes #298), then rebased and pushed in turn.
Worktree:objectos-issue-305
Domain: n/a (single-lane repo)
Seat:repo:objectos(objectstack-ai/objectstack#9831)
File surface:- slot overrides or a pinned patch for fumadocs-ui's hard-coded accessible names;
apps/docs/lib/ui-text*;- a page-tree transform in
apps/docs/app/[lang]/docs/layout.tsx; apps/docs/app/not-found.tsx(zh-Hant copy, derived the wayui-text/zh-Hant.jsonis);apps/docs/components/ai/page-actions.tsx(the Open-in links).
Stay out of #301's files (
app/global.css,mdx-components.tsx,source.config.ts, the search route,smoke-docs.mjs, the logo link in the shared layout options) and #167'sseoTitlelines.
Stop on breach and explain in the report.
Container & model: M,mode:subagent,model: default.
Clause-②: no
Thread-read: none
Serial constraints cleared: no. Pushes are serial on the one branch, in this order: #167 → #301 → this card.
Generated by Claude Code
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 305, "status": "staged", "branch": "staged/issue-305", "worktree": "/home/user/objectos-issue-305", "base": "cec227a137c62df8a181796aaf574bba6e799a08", "final_commit": "1f5ea81ef289eae88c116a560cef93578a94ebc2", "pr": null, "pr_body": "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/pr-body.md (first line: Fixes #305)", "session": "session_01FeA1nwBz1ohH65dvffUGKr (subagent; the parent seat session, per the Claim)", "premise_still_valid": true, "summary": "All four card items are implemented, committed on staged/issue-305 and not pushed. (1) patches/fumadocs-ui@16.8.12.patch (pnpm patchedDependencies) makes fumadocs-ui read nine hard-coded English accessible names from its i18n context: Open Search, Toggle Theme, Open/Collapse Sidebar, Copy Anchor Link, Copy/Copied Text, Toggle Menu, and Radix \"Main\". Eight keys are a backport of upstream 16.9.0 (same key names and defaults); navMain is the only non-upstream key. lib/ui-text supplies all nine in every locale, and zh-Hant is generated. (2) app/[lang]/docs/layout.tsx transforms the page tree, using the same translatedLocales detection as #298, so every untranslated entry in the sidebar, breadcrumb and prev/next footer wraps its name and description in span lang=\"en\". (3) The 404 copy moved into lib/ui-text (notFound), so the zh-Hant string is generated from zh-Hans and covered by gen-zh-hant --check. (4) Open in ChatGPT/Claude: English pages and fallbacks keep the English .mdx, and a real translation sends the assistant to the translated page URL. CHOICE: point at the shown locale content via its page URL, not inline it. Inlining was measured and rejected: the query string runs 2089-25630 chars over 230 locale pages, 165 of them over 8 KiB.", "item4_choice": "The assistant is sent to the page on screen, matching the #298 Copy Markdown rule. For English pages and fallbacks that is the English .mdx (unchanged). For a real translation it is the translated page itself (page.url, e.g. /de/docs/build/data), because the locale Markdown has no URL and is too long to inline into the prompt. The prompt sentence itself stays English (see Acceptance notes).", "files": [ "patches/fumadocs-ui@16.8.12.patch (new; 9 keys in contexts/i18n.js + .d.ts, 6 component files read useI18n().text; header explains the why, slot analysis, and deletion condition)", "package.json (pnpm.patchedDependencies entry) + pnpm-lock.yaml (patch hash; frozen install exit 0)", "apps/docs/lib/ui-text.ts (+9 fumadocs keys, +notFound; fumadocsTranslations passes 19 strings)", "apps/docs/lib/ui-text/{zh-Hans,ja,de,es,fr,ko}.json (+10 keys each; notFound strings moved byte-identical from not-found.tsx) and zh-Hant.json (generated by gen-zh-hant)", "apps/docs/app/[lang]/docs/layout.tsx (page-tree transform, memoized per locale)", "apps/docs/app/not-found.tsx (COPY derived from uiText(lang).notFound; JSON-escape of the left angle bracket in the inline script; h2 text from COPY.en)", "apps/docs/components/ai/page-actions.tsx (ViewOptions prop markdownUrl renamed readUrl)", "apps/docs/app/[lang]/docs/[[...slug]]/page.tsx (assistantReadUrl, passed to ViewOptions; outside the claimed surface, see deviations)" ], "measurements": { "english_chrome_names_per_locale_82_pages": "main cec227a: 1375-1387 (Copy Anchor Link 692-699, Copy Text 201-206, Open Search 160, Collapse Sidebar 158, Toggle Theme 81, Open Sidebar 79, Toggle Menu 2, Main 2) → 1f5ea81: 0 in all 7 locales (card asked de, ja, zh-Hans)", "untranslated_tree_entries_unmarked": "main: zh-Hans/zh-Hant 687, ja/de/es/fr/ko 920 each → 0 in all 7; marked lang=en: 687 / 920; translated entries wrongly marked: 0 (oracle = content-tree file existence, not app detection)", "folders_and_breadcrumb": "English folder names 0/639 folder buttons and 0/95 breadcrumb items per locale (all folders have a translated meta title, so none need marking)", "rsc_payload_full_tree": "de 113 span lang=en = 53 names + 53 descriptions + 7 #298 TOC items (exact); zh-Hans 65 = 29 + 29 + 7 (exact)", "hydrated_browser_on_worker_preview": "all 7 locales x {operate/backup fallback, build/data translated}: 0 English names, tree marks correct, 0 hydration errors; after interactions (collapse panel, drawer, search dialog, code copy) de: Seitenleiste einklappen / Suche oeffnen / Seitenleiste oeffnen / Text kopieren → Text kopiert; zh-Hans: 收起侧边栏 / 打开搜索 / 打开侧边栏 / 复制文本 → 已复制文本", "open_in_prompts": "fallback: Read http://127.0.0.1:8805/docs/operate/backup.mdx ... (all locales); translated: Read http://127.0.0.1:8805/LOCALE/docs/build/data ... (all 7)", "not_found": "all 8 locales x {1440,390}: status 404, html lang = locale, message localized; zh-Hant 找不到此頁面。 (built _not-found.html copy table now has the zh-Hant entry)", "english_unchanged": "en HTML outside RSC payload/asset hashes identical to main on /docs/build/data and /privacy; /docs/operate/backup differs by one shiki token colour only", "worker_size": "Total Upload: 49089.42 KiB / gzip: 7585.91 KiB (budget 61440); no main baseline taken, delta not claimed" }, "gates": [ "HEAD 1f5ea81 for every line below", "pnpm install --frozen-lockfile: exit 0 (Lockfile is up to date)", "pnpm turbo run type-check --continue --force: Tasks 1 successful; os-verify-lock VERDICT command-exit 0", "NEXT_PRIVATE_STANDALONE=true pnpm turbo run build --force: Generating static pages (1052/1052), Tasks 1 successful; VERDICT command-exit 0 (351 OG font-fetch proxy warnings, identical count on the main baseline build)", "pnpm turbo run test --force: ✓ 10 self-test(s) passed; VERDICT command-exit 0", "gen-zh-hant --check: ✓ zh-Hant: 62 generated file(s) match the zh-Hans sources byte for byte.", "check-locale-surface: ✓ every advertised URL has a source file and every source file is advertised; ... exit 0", "check-positioning: ✓ positioning: 4 copies equal their constants; the brand is right in 659 pages and 2 llms bodies; ... exit 0", "check-search-locales: ✓ search locales: all 8 locales answer 200, find \"permissions\", find every own page by its title, and find nothing for a nonce", "translations Ownership (workflow argv: git diff --name-status --no-renames origin/main...HEAD; --actor hotlong): exit 0, TRANSLATION_BOT_LOGIN unset → reports; armed with a bot login: ✓ 15 file(s) changed, no translation artifacts touched.", "translations Freshness: ✓ translations gate passed; Output --files: ✓ translation output gate passed (98 pre-existing finding(s) reported); Output --self-test: ✓", "check-node-floor (+ --self-test): ✅ exit 0; check-half-states --self-test: ✓ 1551 cases pass", "Worker: opennextjs-cloudflare build --skipNextBuild + wrangler deploy --dry-run: Total Upload 49089.42 KiB (budget 61440 KiB); VERDICT command-exit 0", "smoke-docs.mjs --base local opennextjs-cloudflare preview: ✓ smoke: 4 page(s) rendered against http://127.0.0.1:8805, negative control demonstrated red (exit 0); preview process group stopped, 0 processes left" ], "tests": "No unit-test surface exists for apps/docs; evidence is the gates above plus: (a) built-HTML scan scratchpad/issue-305/scan-built.mjs, JS off, on main (positive control: 1375-1387 names, 687/920 unmarked per locale) and on 1f5ea81 (0 / 0); (b) browser-verify.mjs on the Worker preview (results in browser-results.json); (c) reverse verification via objectstack scripts/ablation-replace.mjs: deleting navMain from fumadocsTranslations() → tsc exit 2, TS2741 Property navMain is missing ... required in type FumadocsTranslations (only the patched .d.ts requires it); restore: blob == HEAD 8e47a077e887, git diff HEAD empty; final type-check green. axe 4.14.0 on 1 fallback + 1 translated page per locale: no violation introduced. Every listed violation (color-contrast, landmark-one-main, region, svg-img-alt, landmark-unique, label-content-name-mismatch on the language switcher) is identical in kind on the English page, whose HTML is main's; valid-lang passes 25 nodes (de fallback) / 11 (de translated).", "screenshots": [ "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/zh-Hans-fallback-sidebar-1440.png", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/zh-Hans-fallback-sidebar-390.png (drawer open)", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/de-search-trigger-1440.png (collapsed-sidebar panel; annotation overlay shows aria-label)", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/de-search-trigger-1440-expanded.png (collapse button, annotated)", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/de-search-trigger-390.png (header search + sidebar triggers, annotated)", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/zh-Hant-404-1440.png", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/zh-Hant-404-390.png" ], "deviations": [ "File surface beyond the Claim list: apps/docs/app/[lang]/docs/[[...slug]]/page.tsx. Item 4 needs the page to pass the read URL (one const, one prop, one comment line). No sibling branch touches it: git merge-tree against staged/issue-167 and staged/issue-301 exits 0 with no conflicts. The seat should add it to the claimed surface.", "A ninth name, Radix NavigationMenu default aria-label \"Main\" on the HomeLayout header (privacy/terms, 2 pages per locale), is fixed through the same patch as a key upstream does not have (navMain). The card listed fumadocs names only, but its Done criterion (0 English chrome names in built pages) needs this one too.", "No #301 or #167 file was edited. smoke-docs.mjs was only executed.", "The UI strings for the 10 new keys in 6 locales are written by this card, the same as #298 did for ui-text; they are app UI copy, not content/docs. zh-Hant is generated. The 404 strings were moved byte-identical.", "\"de search trigger tooltip\": fumadocs renders no visual tooltip (no title attribute). The screenshots overlay the accessible name as a labelled annotation, not page UI.", "axe is not 0 violations: the pre-existing set is reported per page (see tests and out_of_scope_findings).", "Commit trailers are model-free (Co-Authored-By: Claude) per the agent contract. The harness reminder asked for a model name.", "Card-level baseline numbers come from a fresh main build at cec227a in this worktree, not from the card cd2af9f numbers. The card counts 29 zh-Hans / 53 per-locale untranslated pages; the per-entry counts here (687/920) are rendered occurrences across all pages." ], "mcp_calls": "0", "api_writes": "1 -- POST /repos/objectstack-ai/objectos/issues/305/comments (this os-dev-report, via objectstack scripts/pm/post-stamped.mjs). Reads only otherwise (gh api GET issue 305 and its comments; npm registry tarball downloads for the upstream fumadocs-ui comparison).", "open_questions": [], "out_of_scope_findings": [ "class: a · reach: public door, axe 4.14.0 on any docs page in any locale, English included (e.g. /docs/operate/backup) · evidence: label-content-name-mismatch on the fumadocs LanguageSelect trigger (aria-label Choose a language vs visible text English), landmark-one-main (no main landmark in DocsLayout), svg-img-alt (an svg role=img with no name), landmark-unique (unnamed code-block regions) · pre-existing (identical on the English page, whose HTML equals main) · dedupe words: axe, landmark-one-main, label-content-name-mismatch, svg-img-alt, language switcher", "class: a · reach: public door, axe color-contrast on every page (32-73 nodes) · evidence: browser-results.json · likely the #301 contrast work; dedupe words: color-contrast, muted text, axe", "carrier: none · noted, not filed: the Open-in prompt sentence (Read URL, I want to ask questions about it.) is English in every locale; upstream 16.9.0 makes it a translation key (pageActionsOpenInLLMPrompt)", "carrier: none · noted, not filed: shiki coloured one semicolon token in operate/backup differently on two builds of identical content (#032F62 on main, #24292E here); evidence is two builds only", "carrier: none · noted, not filed: no CI gate pins the English-chrome-name scan or the page-tree lang scan; a rule in check-locale-surface.mjs could (scan script in scratchpad/issue-305/scan-built.mjs)", "carrier: none · noted, not filed: s2twp renders codeBlockCopy as 複製文本 (Taiwan usage favours 文字); generated output, converter vocabulary" ] }objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsos-dev-report-addendum
{ "issue": 305, "status": "staged", "addendum_to": "https://github.com/objectstack-ai/objectos/issues/305#issuecomment-6016362941", "branch": "staged/issue-305", "worktree": "/home/user/objectos-issue-305", "tip": "4da46c5319f61856917e0266836ac4ff4ea7911f", "base": "5d2f837 (main: #310 = #301 squash, over a24b39d #309 = #167, over cec227a)", "previous_tip": "1f5ea81ef289eae88c116a560cef93578a94ebc2 (still the tip staged/issue-308 was cut from; that branch was not touched: 295d79c before and after)", "pushed": false, "pr": null, "pr_body": "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/pr-body.md (now has a \"Branch and rebase\" section; numbers updated to 4da46c5)", "session": "session_01FeA1nwBz1ohH65dvffUGKr", "rebase": "git fetch -q origin main && git rebase origin/main: applied with NO conflicts. git range-diff cec227a..1f5ea81 origin/main..HEAD reports 1f5ea81 = 4da46c5 (patch-identical); 15 files, 599+/45-.", "resolutions": [ "None needed: #301 files (shared-layout logo link and www icon link, global.css, mdx-components.tsx, source.config.ts, search route, smoke-docs.mjs, glossary) and #167 seoTitle content lines do not overlap this diff.", "Semantic, scanner only: #301 points the logo at /LOCALE/docs, so the built-HTML scanner first counted it as an unmarked sidebar page entry (79 per locale = one per page, text ObjectOS, a brand). The scanner now reads page-tree items only (a[data-active]). Sidebar entries return to exactly the pre-rebase 1166 per locale, and the narrowed scanner reproduces the main cec227a baseline exactly (1375-1387 names; 687/920 unmarked). No product code changed." ], "gates": [ "every line at HEAD 4da46c5", "pnpm install --frozen-lockfile: exit 0 (Lockfile is up to date); fumadocs-ui resolves with patch_hash=eb14645516e9", "pnpm turbo run type-check --continue --force: Tasks 1 successful; VERDICT command-exit 0. The #311 TS2306 race did not occur (both type-check runs green on the first try)", "NEXT_PRIVATE_STANDALONE=true pnpm turbo run build --force: Generating static pages (1038/1038), Tasks 1 successful; VERDICT command-exit 0 (332 OG font-fetch proxy warnings, container environment)", "pnpm turbo run test --force: ✓ 10 self-test(s) passed; VERDICT command-exit 0", "gen-zh-hant --check: ✓ zh-Hant: 60 generated file(s) match the zh-Hans sources byte for byte.", "check-locale-surface: ✓ exit 0; check-positioning: ✓ 4 copies equal their constants; the brand is right in 659 pages and 2 llms bodies ... exit 0", "check-search-locales: ✓ search locales: all 8 locales answer 200, find \"permissions\", find every own page by its title within the first 3 pages, and find nothing for a nonce", "Ownership, workflow argv (git diff --name-status --no-renames origin/main...HEAD, 15 files): actor hotlong + bot login unset: exit 0 (reports); actor hotlong + bot login set: ✓ 15 file(s) changed, no translation artifacts touched (exit 0); CONTROL actor = bot login: ✗ translation PRs may only touch translation artifacts (exit 1, expected)", "Freshness: ✓ translations gate passed; Output --files: ✓ translation output gate passed (256 pre-existing finding(s) reported, main corpus; this diff touches no content); Output --self-test: ✓", "check-node-floor + --self-test: ✅ exit 0; check-half-states --self-test: ✓ 1551 cases pass", "Worker: opennextjs-cloudflare build --skipNextBuild + wrangler deploy --dry-run: Total Upload 47077.66 KiB / gzip 7355.06 KiB (budget 61440); VERDICT command-exit 0", "smoke-docs.mjs (#301's version) against the local preview: ✓ smoke: 4 page(s) rendered against http://127.0.0.1:8805, negative control demonstrated red, search answered in 8 locale(s) and found nothing for a nonce (exit 0). Preview process group stopped, 0 left" ], "scans_vs_first_report": { "english_chrome_names": "0 in all 7 locales x 82 pages (first report 0; main cec227a 1375-1387)", "untranslated_tree_entries_unmarked": "0 in all 7 (first report 0). Marked: zh-Hans/zh-Hant 717 (was 687), ja/de/es/fr/ko 950 (was 920); +30 because #301 removed locale pages (flows). Translated entries wrongly marked: 0", "folders_breadcrumb": "0 English among 639 folder buttons / 95 breadcrumb items per locale (unchanged)", "rsc_full_tree": "de 117 = 55 + 55 + 7 TOC (was 113 = 53 + 53 + 7); zh-Hans 69 = 31 + 31 + 7 (was 65); exact", "not_found": "all 8 locales x {1440,390}: 404, html lang = locale, localized message; zh-Hant 找不到此頁面。; built copy table carries zh-Hant (unchanged)", "hydrated_browser": "all 7 locales x {fallback, translated}: 0 English names, tree marks correct, 0 hydration errors; collapse panel / drawer / search dialog / code copy localized; Open-in: fallback .mdx, translation /LOCALE/docs/build/data (unchanged)", "legal_header_new": "/de/privacy: header aria-label Hauptnavigation; Suche oeffnen, Menue ein- oder ausblenden (390); Design wechseln, Sprache waehlen, www.objectos.ai, GitHub (1440)" }, "axe_vs_first_report": "axe 4.14.0, 1 fallback + 1 translated page per locale, plus English: same rule set, no rule introduced. color-contrast fell from 32 / 61-73 nodes to 2 / 11 (#301 contrast work), identical on English. landmark-one-main 1, region 44-58, svg-img-alt 1, landmark-unique 1 (code pages), label-content-name-mismatch 1 (fumadocs language switcher): same as the first report and the same on English.", "screenshots_retaken_at_4da46c5": [ "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/zh-Hans-fallback-sidebar-1440.png (sidebar footer now shows #301 globe + GitHub icons)", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/zh-Hans-fallback-sidebar-390.png (drawer header: globe + GitHub icons)", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/de-search-trigger-1440.png (collapsed panel, annotated)", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/de-search-trigger-1440-expanded.png (annotated)", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/de-search-trigger-390.png (header, annotated)", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/de-legal-header-1440.png (new: HomeLayout header with www link, annotated)", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/de-legal-header-390.png (new: Hauptnavigation, Suche oeffnen, Menue toggle, annotated)", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/zh-Hant-404-1440.png", "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots/zh-Hant-404-390.png", "first-report shots kept in /tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-305/shots-v1/" ], "deviations": [ "Scanner change (scratch tooling only): sidebar entries restricted to a[data-active], as described under resolutions. The same filter was applied to browser-verify.mjs. v1 copies are kept beside them.", "The reverse check (navMain ablation, TS2741) was not repeated: the commit is patch-identical after the rebase (range-diff =), and type-check at 4da46c5 is green.", "The same as the first report otherwise (page.tsx outside the claimed surface; navMain beyond the card list; model-free trailers). The rebase keeps the original commit message and trailers." ], "mcp_calls": "0", "api_writes": "1 -- POST /repos/objectstack-ai/objectos/issues/305/comments (this addendum, via objectstack scripts/pm/post-stamped.mjs relay). No push, no branch move; staged/issue-308 untouched.", "open_questions": [], "out_of_scope_findings": [ "class: a · reach: public door, built /de/privacy and /de/terms (also ja, es, fr, ko, zh-Hant): html lang=LOCALE, h1 Privacy Policy / Terms of Service, English body, 0 lang=\"en\" attributes on the page · same WCAG 3.1.2 family as #298/#305 (the legal pages fall back to content.en with no language mark); zh-Hant also gets English rather than a generated Traditional version of the zh-Hans entry · pre-existing, this diff does not touch app/[lang]/privacy or terms · dedupe words: privacy, terms, legal page, lang en, fallback, zh-Hant", "carry-over from the first report, unchanged: axe pre-existing set (landmark-one-main, region, svg-img-alt, landmark-unique, label-content-name-mismatch on the language switcher; color-contrast now 2-11 nodes)" ] }objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsACCEPT: PR #314 on head
41a1994789f0247ed359767be02e61d6d7170f78· 2026-10-06T15:41Z. I am landing it now: no governed path is touched, and every check is green.Path surface (
get_files): 15 files, +599/−45.apps/docs:[lang]/docs/[[...slug]]/page.tsx[lang]/docs/layout.tsx, the page-tree transformnot-found.tsxcomponents/ai/page-actions.tsxlib/ui-text.ts, plus the 7ui-text/*.jsontables; zh-Hant is generated
- Repository root:
package.json,patchedDependenciespatches/fumadocs-ui@16.8.12.patch, newpnpm-lock.yaml
- Nothing in
content/docs/**. None ofAGENTS.md,CLAUDE.md,.claude/**,skills/**ordocs/adr/**.
Checks on
41a1994:buildandNode floorsucceeded;Deploy docswas skipped.mergeable_stateis clean on base92a12d2.Push: fast-forward with no force.
ff/issue-305starts at the remote branch head5e666c3, mergesorigin/main@92a12d2(the diff againstmainis then empty), and cherry-picks4da46c5.git diff origin/main 41a1994is byte-identical togit diff 5d2f837 4da46c5. The dev's rebase onto5d2f837applied cleanly, andrange-diffshows1f5ea81 = 4da46c5.Review:
- The patch rather than slot overrides. fumadocs-ui 16.8.12 hard-codes 9 English accessible names outside its Translations API. Eight of the keys backport upstream 16.9.0's own keys, with the same names and defaults. The patch defaults to the old literals, so English is unchanged. Its header gives the name-by-name slot analysis and when the patch can be deleted (on upgrading to 16.9.0 or later). Accepted.
- Results.
- Built HTML, all 7 locales × 82 pages: English chrome names went from 1375–1387 per locale to 0. Untranslated tree entries without
lang="en"went from 687 (zh) and 920 (others) to 0. - Translated entries wrongly marked
lang="en": 0. - The zh-Hant 404 renders 找不到此頁面。, generated by
gen-zh-hantand covered by--check. - Open-in links point at the page shown. Inlining the locale Markdown was measured and rejected: the query string runs to 25,630 characters.
- Built HTML, all 7 locales × 82 pages: English chrome names went from 1375–1387 per locale to 0. Untranslated tree entries without
- English unchanged. Served HTML outside the RSC payload matches
mainbyte for byte on/docs/build/dataand/privacy. - Rebase onto Docs polish from the 2026-10-06 audit: muted-text contrast, the License table on phones, FAQ formatting, search ranking, glossary order, licence/license spelling #301. No conflicts. The scanner's false count from Docs polish from the 2026-10-06 audit: muted-text contrast, the License table on phones, FAQ formatting, search ranking, glossary order, licence/license spelling #301's new
/LOCALE/docslogo link was a scan-script issue only, and the narrowed scan reproduces the baseline.
Follow-ups carried:
- Docs accessibility baseline: no main landmark, the language switcher's name contradicts its text, an unnamed svg role=img, unnamed code regions — on every page in every locale #308, the a11y baseline:
mainlandmark, switcher name, svg name, code regions, the prompt sentence, the CI rule. It is staged on this card's first tip and is rebased after this merge. - Docs legal pages: /de, /ja, /es, /fr and /ko privacy and terms show English text without lang="en", and zh-Hant shows English instead of text derived from zh-Hans #312, legal pages in non-zh locales and zh-Hant, from this card's addendum.
After merge: watch the deploy verdict and smoke, then post the landed note here. #307 is next on the branch.
Generated by Claude Code
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsLanded and live · 2026-10-06T15:50Z
- PR docs: localize fumadocs' accessible names, mark English page-tree entries, zh-Hant 404, Open-in links follow the page shown #314: squash
cf449fa, merged by the seat.Fixes #305closed this card. - CI on
main(run 37490176459, attempt 1):build,Node floor,Deploy docs / Publish the tested WorkerandDeploy docs / Smoke-check the live sitesucceeded; roll back was skipped. - Deploy verdict:
✓ deploy: 3484931c-e2c1-4fd6-b689-3340f03a0627 is serving, replacing 17a1012c-a7c4-46fa-9f30-a7acd1112c2d. - Live result: locale docs pages now announce fumadocs' chrome names in their own language. Untranslated sidebar, breadcrumb and footer entries are marked
lang="en". zh-Hant's 404 reads 找不到此頁面。. "Open in ChatGPT / Claude" points at the page shown. - Housekeeping: the seat removes
pm:dispatchedfrom this card. - Next on the branch: Docs code samples the current @objectstack/spec refuses: the remaining view fragments in build/interface/views.mdx and the send_email flow action in build/automation/flows.mdx #307 (code samples), then Docs accessibility baseline: no main landmark, the language switcher's name contradicts its text, an unnamed svg role=img, unnamed code regions — on every page in every locale #308, which is rebased onto
cf449fafrom this card's first tip, then Docs legal pages: /de, /ja, /es, /fr and /ko privacy and terms show English text without lang="en", and zh-Hant shows English instead of text derived from zh-Hans #312.
Generated by Claude Code
- PR docs: localize fumadocs' accessible names, mark English page-tree entries, zh-Hant 404, Open-in links follow the page shown #314: squash
Found while #298 was staged on 2026-10-06 (build
cd2af9f), so this is the same defect family as #298. #298 localizes the visible chrome strings and marks fallback page contentlang="en". Four gaps remain, and they need different mechanisms. Priority: P2. It is an accessibility (WCAG 3.1.2) and localization defect.Hard-coded English accessible names. Every locale page serves fumadocs-ui's built-in names in English inside
<html lang="xx">, for example/de/docs/build/agents:fumadocs-ui 16.8.12 hard-codes them (e.g.
dist/layouts/shared/slots/search-trigger.js:19), outside its Translations API.Fix: slot overrides, or a pinned patch, that take the names from
lib/ui-text.English page-tree names with no language marked. On a fallback page the sidebar, breadcrumb and prev/next footer render English page names with no
lang="en". Examples are "Backup and Disaster Recovery" on/zh-Hans/docs/operate/backup, plus 28 more in zh-Hans and 53 per locale in ja, de, es, fr and ko. axe has no language-of-parts rule, so it stays green.Fix: a page-tree transform in
docs/layout.tsxthat marks untranslated entries.No zh-Hant 404 text.
app/not-found.tsx's COPY table has no zh-Hant entry, so zh-Hant shows English 404 text.Fix: derive it the way
ui-text/zh-Hant.jsonis (gen-zh-hant)."Open in ChatGPT / Claude" on translated pages points at the English
.mdx.Fix: decide this with 290 English-fallback locale URLs render English under lang="xx" with no notice, and the docs chrome (search, TOC, Copy Markdown, language picker) is English in every locale #298's Copy Markdown choice, which is to inline the locale Markdown. Point at that, or say in the UI that the source is English.
Done looks like
lang="en".Order
After #298 lands.
Generated by Claude Code