Skip to content

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

Closed

Description

@objectstack-fleet

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 content lang="en". Four gaps remain, and they need different mechanisms. Priority: P2. It is an accessibility (WCAG 3.1.2) and localization defect.

  1. 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:

    • "Open Search" ×2, "Collapse Sidebar" ×2, "Open Sidebar", "Toggle Theme";
    • "Copy Anchor Link" ×9, "Copy Text" ×4.

    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.

  2. 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.tsx that marks untranslated entries.

  3. 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.json is (gen-zh-hant).

  4. "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

  • An aria-label scan of built pages in 3 locales finds 0 English chrome names, except brand names.
  • A built-HTML scan finds every untranslated page-tree entry carrying lang="en".
  • zh-Hant 404 renders in Traditional Chinese.
  • The repo's gates are green, with screenshots at 1440 and 390.

Order

After #298 lands.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop, repo:objectos seat
    Session: session_01FeA1nwBz1ohH65dvffUGKr
    Account: hotlong (the seat's linked user, as GET /user answers 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 from origin/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 way ui-text/zh-Hant.json is);
    • 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's seoTitle lines.
    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

  2. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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"
      ]
    }
  3. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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)"
      ]
    }
  4. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: 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 transform
      • not-found.tsx
      • components/ai/page-actions.tsx
      • lib/ui-text.ts, plus the 7 ui-text/*.json tables; zh-Hant is generated
    • Repository root:
      • package.json, patchedDependencies
      • patches/fumadocs-ui@16.8.12.patch, new
      • pnpm-lock.yaml
    • Nothing in content/docs/**. None of AGENTS.md, CLAUDE.md, .claude/**, skills/** or docs/adr/**.

    Checks on 41a1994: build and Node floor succeeded; Deploy docs was skipped. mergeable_state is clean on base 92a12d2.

    Push: fast-forward with no force. ff/issue-305 starts at the remote branch head 5e666c3, merges origin/main @ 92a12d2 (the diff against main is then empty), and cherry-picks 4da46c5. git diff origin/main 41a1994 is byte-identical to git diff 5d2f837 4da46c5. The dev's rebase onto 5d2f837 applied cleanly, and range-diff shows 1f5ea81 = 4da46c5.

    Review:

    Follow-ups carried:

    After merge: watch the deploy verdict and smoke, then post the landed note here. #307 is next on the branch.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed and live · 2026-10-06T15:50Z


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions