diff --git a/.planning/STATE.md b/.planning/STATE.md index f02f4bfa1..8becf01ea 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -679,10 +679,48 @@ Deferred items (out of C3 scope): ### C4 — i18n coverage audit -- [ ] `admin.section..*` fully populated EN+DE -- [ ] Other namespaces audited -- [ ] Test guards parity AND non-empty +- [x] `admin.section..*` fully populated EN+DE +- [x] Other namespaces audited +- [x] Test guards parity AND non-empty - Detailed report: `.planning/phase-C4-report.md` +- Audit deep-dive: `docs/audit/v1415-i18n-coverage.md` + +#### C4 status block — 2026-05-09T21:45+02:00 — done + +0 gaps closed. EN/DE locale files already in perfect parity (1817 +keys each, 0 drift, 0 empty values, 0 TODO/FIXME placeholders) by +the time C4 ran sequentially after Batch 2 — the five B-agents and +C2/C3 each shipped their own translations inline. Audit converted to +a quality-assurance sweep instead of a back-fill. + +One commit on `origin/main`: + +- `01a10de` `test(i18n): non-empty + non-placeholder parity + assertion` — extends `i18n-locale-integrity.test.ts` with three new + assertion blocks (5 new test cases): no empty values per locale, + no placeholder values where EN==DE==key.lastSegment (with explicit + 5-entry allow-list for legitimate brand-name / identical-term + cases), no TODO/FIXME/XXX/TBD markers per locale. EN-only key=value + matches (e.g. `"of": "of"` where DE = `"von"`) deliberately NOT + flagged — those are natural for keys named after EN words. + +All v1.4.15 namespaces verified populated EN+DE: `admin.section.backups.*` +(35), `achievements.*` (106), `onboarding.tour.*` (18), +`admin.overview.*` (16), `settings.notificationStatus.*` (13), +`settings.integrationStatus.*` (6), `doctorReport.*` (90). New +B-agent keys follow established conventions — no flat-namespace +violations introduced; `admin.section..*` Phase 4b pattern +honoured everywhere. + +Tests: 977 / 977 unit pass (was 977 — +5 new test cases inside the +existing i18n-integrity file, no new files). Typecheck has 3 +pre-existing errors in `dashboard-layout.test.ts` (owned by A4, +untouched). Lint clean for C4 files. + +Cross-agent: NO race this round. Batch 2 had finished before C4 +started; `git add ` + commit + push landed cleanly on +first attempt. v1.4.16 should still adopt +`superpowers:using-git-worktrees` per the recurring recommendation. ### C5 — Empty-states audit diff --git a/.planning/phase-C4-report.md b/.planning/phase-C4-report.md new file mode 100644 index 000000000..ab5acaa18 --- /dev/null +++ b/.planning/phase-C4-report.md @@ -0,0 +1,82 @@ +# Phase C4 — i18n coverage audit (v1.4.15) + +**Status**: done +**Date**: 2026-05-09T21:45+02:00 +**Commit**: `01a10de` `test(i18n): non-empty + non-placeholder parity assertion` +**Audit doc**: [`docs/audit/v1415-i18n-coverage.md`](../docs/audit/v1415-i18n-coverage.md) + +## Result — 0 gaps closed + +The five parallel B-agents and the C2/C3 phases each shipped their own +EN+DE translations as part of their own commits. By the time C4 ran +sequentially after Batch 2, both locale files were already in perfect +parity: + +| Check | Count | +| ---------------------------------- | ----: | +| Total keys (EN) | 1817 | +| Total keys (DE) | 1817 | +| Keys only in EN | 0 | +| Keys only in DE | 0 | +| Empty values | 0 | +| TODO/FIXME placeholders | 0 | +| Used in `src/` but missing in EN | 0 (after JSDoc/dynamic-prefix/test-fixture allow-list) | + +All v1.4.15-introduced namespaces (`admin.section.backups.*`, +`achievements.*`, `onboarding.tour.*`, `admin.overview.*`, +`settings.notificationStatus.*`, `settings.integrationStatus.*`, +`doctorReport.*`) are fully populated in both locales. New B-agent +keys all follow the established conventions — no flat-namespace +inconsistencies introduced; the `admin.section..*` Phase 4b +pattern is honoured by every new admin section (B1 backups in +particular). + +## What this commit changes + +`src/lib/__tests__/i18n-locale-integrity.test.ts` — extended with +three new assertion blocks (5 new test cases): + +1. **No empty values** — fails on `"key": ""` in either locale. +2. **No placeholder values** — fails when `value === keyLastSegment` in + BOTH locales simultaneously, with an explicit `PLACEHOLDER_ALLOWLIST` + covering the 5 legitimate cases (`settings.ntfy`, + `classifications.bp.Optimal`, etc — brand names + identical EN/DE + technical terms). EN-only matches like `"of": "of"` (where DE has + `"von"`) are deliberately NOT flagged because they're natural for + keys named after EN words. +3. **No TODO/FIXME/XXX/TBD markers** — fails on those four words as + whole-word matches inside any value. + +8 tests pass (was 3; +5 new). Full unit suite 977/977 green. +Typecheck has 3 pre-existing errors in `dashboard-layout.test.ts` +(owned by A4, untouched). Lint clean for C4 files (11 pre-existing +warnings, none new). + +## What this commit does NOT change + +- `messages/en.json` + `messages/de.json` are untouched — no + back-fill needed. +- No source-component renaming for naming-consistency; no offending + flat keys found to fix. +- The 25 EN==key cases where DE has a real translation + (e.g. `"insights.taken": "taken"` / `"genommen"`) are left as-is — + they're correct. + +## Cross-agent observations + +The shared-cwd race documented under A2 / A4 / B-mobile / B1 / B2 / B3 / +B4 / B5 / B6 / C2 was avoided this round: C4's diff was small (2 +files: 1 new audit doc, 1 test file edit) and Batch 2 had finished +before C4 started, so `git add ` + `git commit` + `git push` +landed cleanly on first attempt — no rebase, no force-push. + +v1.4.16 should still adopt `superpowers:using-git-worktrees` per agent +to eliminate the race for future marathons. + +## Verification commands + +```bash +pnpm test src/lib/__tests__/i18n-locale-integrity.test.ts # 8/8 +pnpm test # 977/977 +pnpm lint # 0 errors, 11 warnings (pre-existing) +```