# Scratchpad — MSP i18n Remaining Batches

- Plan slug: `2026-03-20-msp-i18n-remaining`
- Created: `2026-03-20`

## Decisions

- (2026-03-20) **Combined all remaining batches into one plan**: 7 batches (2b-13 through 2b-20) in one plan since they're all small-to-medium and independent.
- (2026-03-20) **2b-20 is empty**: Extensions and licensing components have zero user-visible strings. Close as "no work needed."
- (2026-03-20) **Email split from admin**: Email provider forms (Microsoft, Gmail, IMAP) are in 2b-18 (msp/email-providers). Email admin settings (EmailSettings, InboundTicketDefaultsManager, M365Diagnostics) are in 2b-8 (msp/admin). Different namespaces, same settings route.
- (2026-03-20) **Profile namespace is small**: Only ~64 strings across 8 files. Combines user profile, password change, security session management, role assignment, and platform updates.

## Discoveries / Constraints

### Surveys (2b-13)
- (2026-03-20) 26 files in `packages/surveys/src/components/`, well-organized in subdirectories: triggers/, templates/, responses/, dashboard/, analytics/, shared/, public/
- (2026-03-20) `SurveyResponsePage.tsx` is PUBLIC-FACING — rendered for end users taking surveys. Locale resolution may differ from MSP portal (no auth session). Needs investigation.
- (2026-03-20) `useTriggerReferenceData.ts` (80 LOC) — hook with no strings, skip
- (2026-03-21) Survey components were already partially keyed under `surveys.*` while still using `useTranslation('common')`; this batch should normalize those keys into the dedicated `msp/surveys` namespace rather than copy them into `common`.

### Schedule (2b-14)
- (2026-03-20) 11 files in `packages/scheduling/src/components/schedule/`
- (2026-03-20) `EntryPopup.tsx` (1,287 LOC, ~68 strings) is the densest — schedule entry create/edit popup
- (2026-03-20) `AvailabilitySettings.tsx` (1,215 LOC, ~64 strings) — availability window management
- (2026-03-20) 3 files have zero strings (TechnicianSidebar, AgentScheduleDrawerStyles, DynamicBigCalendar) — skip
- (2026-03-21) Re-inventory showed the PRD undercounted the “zero-string” files: `TechnicianSidebar.tsx` has compare/reset button labels and tooltips, and `WeeklyScheduleEvent.tsx` has delete/continuation tooltip copy. Keep them in scope for `F012`.

### Knowledge Base (2b-15)
- (2026-03-20) 10 files in `packages/documents/src/components/kb/`
- (2026-03-20) Well-structured: editor, list, page, import, publishing, review, filters, categories, staleness badge
- (2026-03-20) KB article content comes from database (Hocuspocus/ProseMirror) — NOT in translation scope. Only KB UI chrome is translated.

### Jobs (2b-17)
- (2026-03-20) Smallest batch — 7 files, ~29 strings total
- (2026-03-20) All in `packages/jobs/src/components/monitoring/`
- (2026-03-20) `JobStepHistory.tsx` has zero visible strings — skip
- (2026-03-21) `JobStepHistory.tsx` does have visible copy (`Job Steps`, `Processed`, `Retries`) in addition to status labels. The batch is still small, but the PRD count underestimates it slightly.

### Email Providers (2b-18)
- (2026-03-20) 10 files with strings in `packages/integrations/src/components/email/`
- (2026-03-20) 13 files with zero strings (selectors, lists, wrappers, OAuth hooks, schemas, index files) — skip
- (2026-03-20) Admin files (EmailSettings, InboundTicketDefaultsManager, M365Diagnostics) already in 2b-8 — DO NOT duplicate
- (2026-03-21) Implementation inventory found extra in-scope provider setup copy beyond the original estimate: `EmailProviderList.tsx`, `EmailProviderSelector.tsx`, `ProviderSetupWizardDialog.tsx`, `providers/gmail/BasicConfigCard.tsx`, `providers/gmail/ProcessingSettingsCard.tsx`, `providers/gmail/OAuthSection.tsx`, `providers/gmail/schemas.ts`, and `providers/gmail/useOAuthPopup.ts` all contain visible or user-facing fallback/validation strings. Added follow-up feature `F045` and test `T043` so the provider namespace migration covers these surfaces before locale generation.
- (2026-03-21) `features.json` lagged behind the repo for `F040`: [server/public/locales/en/msp/email-providers.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/email-providers.json) was already created and documented in the progress log, so the checklist was reconciled before continuing with the remaining email-provider implementation work.

### Profile (2b-19)
- (2026-03-20) Spans 3 packages: `packages/users/`, `server/src/components/settings/profile/`, `server/src/components/settings/security/`, `server/src/components/platform-updates/`
- (2026-03-20) `SecuritySettingsPage.tsx` tab labels likely already covered by `msp/settings` namespace — only page-level strings are new
- (2026-03-20) Extensions (`DynamicNavigationSlot.tsx`) and licensing (`ReduceLicensesModal.tsx`, `LicensePurchaseForm.tsx`) — all zero strings
- (2026-03-22) Re-inventory invalidated the original `2b-20` assumption. Current CE/community fallbacks do contain user-visible copy in [DynamicNavigationSlot.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/ui/src/components/extensions/DynamicNavigationSlot.tsx), [ExtensionManagement.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/components/settings/extensions/ExtensionManagement.tsx), [ExtensionComponentLoader.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/ee/src/lib/extensions/ExtensionComponentLoader.tsx), [packages/product-extensions/oss/entry.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/product-extensions/oss/entry.tsx), [packages/product-extensions/pages/list.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/product-extensions/pages/list.tsx), [packages/ee/src/components/licensing/ReduceLicensesModal.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/ee/src/components/licensing/ReduceLicensesModal.tsx), and [packages/ee/src/components/licensing/LicensePurchaseForm.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/ee/src/components/licensing/LicensePurchaseForm.tsx). Added follow-up feature/test items for `msp/extensions` and `msp/licensing` instead of incorrectly force-closing the batch.
- (2026-03-21) For `msp/profile`, the lowest-risk namespace shape is to preserve the existing `profile.*` and `security.*` key families from `msp/settings`, then add only the missing password/profile error/platform-update detail keys. That keeps the rewrites mechanical and avoids inventing a second taxonomy for already-translated settings/profile surfaces.
- (2026-03-22) For the `2b-20` follow-up, `msp/extensions` should absorb both the settings-shell keys that currently live under `msp/settings.extensions.*` and the dedicated CE/OSS extension placeholder copy. That keeps extension-only fallbacks off the generic settings namespace and gives the `/msp/extensions` route a single feature namespace.
- (2026-03-22) While wiring `msp/extensions`, two extra extension placeholders surfaced beyond the first re-inventory: [server/src/app/msp/settings/extensions/install/page.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/app/msp/settings/extensions/install/page.tsx) still hardcoded its loading fallback, and [packages/product-settings-extensions/oss/entry.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/product-settings-extensions/oss/entry.tsx) still hardcoded all enterprise-feature stub copy for the OSS settings-extension entry. They were folded into `F062` instead of splitting another micro-feature.
- (2026-03-22) Another re-inventory during route registration found deeper batch `2b-20` work still outside the CE/OSS stub pass: [packages/product-extensions/ee/entry.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/product-extensions/ee/entry.tsx) has untranslated runtime/error-state copy, and the real licensing purchase flow still has hardcoded MSP-facing strings in [ee/server/src/components/licensing/LicensePurchaseForm.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/ee/server/src/components/licensing/LicensePurchaseForm.tsx), [ee/server/src/components/licensing/ReduceLicensesModal.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/ee/server/src/components/licensing/ReduceLicensesModal.tsx), [ee/server/src/app/msp/licenses/purchase/page.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/ee/server/src/app/msp/licenses/purchase/page.tsx), and [ee/server/src/app/msp/licenses/purchase/success/page.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/ee/server/src/app/msp/licenses/purchase/success/page.tsx) plus their shared `server/src/app` CE wrappers. Added `F069`-`F076` and `T064`-`T067` so the follow-up scope covers these remaining MSP-facing extension/licensing surfaces before the route/config cleanup is closed.
- (2026-03-22) Completed `F069`: expanded [server/public/locales/en/msp/licensing.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/licensing.json) from the original 5-key CE stub source into the full licensing source of truth for the enterprise purchase/update/remove flow. The namespace now covers the purchase page header, purchase success page, embedded subscription form, enterprise reduction modal, and shared license/user singular-plural labels while preserving the earlier CE stub keys.
- (2026-03-22) Validation for `F069`: re-parsed the expanded licensing namespace successfully with Node, counted 99 leaf strings after the enterprise-flow expansion, and confirmed `git diff --check` stayed clean before the component rewrites.
- (2026-03-23) `F070` surfaced a few wrapper-only licensing keys that `F069` had not captured yet: translated metadata titles for the purchase and success routes, the subscription-form shell title, interval labels for localized currency summaries, and the checkout/confirmation cancel label. These were folded into [server/public/locales/en/msp/licensing.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/licensing.json) as part of the component wiring instead of splitting another micro-feature.

## Commands / Runbooks

### Validation
```bash
node scripts/validate-translations.cjs
npm run build
node -e "JSON.parse(require('fs').readFileSync('server/public/locales/en/msp/surveys.json','utf8'))"
npx eslint packages/surveys/src/components/templates/TemplateList.tsx packages/surveys/src/components/templates/TemplateForm.tsx packages/surveys/src/components/triggers/TriggerList.tsx packages/surveys/src/components/triggers/TriggerForm.tsx
npx tsc -p packages/surveys/tsconfig.json --noEmit
```

### Pseudo-locale generation
```bash
cat << 'SCRIPT' | node - server/public/locales/en/msp/<name>.json 11111
const fs = require("fs");
const fill = process.argv[3];
const transform = (obj) => {
  const out = {};
  for (const [k, v] of Object.entries(obj)) {
    out[k] = typeof v === "object" && v !== null ? transform(v) : fill;
  }
  return out;
};
const src = JSON.parse(fs.readFileSync(process.argv[2], "utf8"));
console.log(JSON.stringify(transform(src), null, 2));
SCRIPT
```

### Italian accent audit
```bash
for ns in surveys schedule knowledge-base jobs email-providers profile; do
  echo "=== $ns ===";
  grep -n ' e [a-z]\| puo \| gia \| verra \| funzionalita\| necessario' server/public/locales/it/msp/$ns.json 2>/dev/null || echo "(not yet created)";
done
```

## Links / References

- Translation plan: `.ai/translation/MSP_i18n_plan.md`
- Translation guide: `.ai/translation/translation-guide.md`
- All previous plans:
  - `docs/plans/2026-03-19-msp-i18n-batch-2b1-core/` (complete)
  - `docs/plans/2026-03-20-msp-i18n-dispatch-reports-admin-time/`
  - `docs/plans/2026-03-20-msp-i18n-clients-assets-onboarding/`
  - `docs/plans/2026-03-20-msp-i18n-contracts-billing/`
  - `docs/plans/2026-03-20-msp-i18n-workflows/`

### Key directories
| Directory | Files | Strings | Batch |
|-----------|-------|---------|-------|
| `packages/surveys/src/components/` | 26 | ~217 | 2b-13 |
| `packages/scheduling/src/components/schedule/` | 11 | ~211 | 2b-14 |
| `packages/documents/src/components/kb/` | 10 | ~189 | 2b-15 |
| `packages/jobs/src/components/monitoring/` | 7 | ~29 | 2b-17 |
| `packages/integrations/src/components/email/` (providers only) | 10 | ~136 | 2b-18 |
| `packages/users/` + `server/src/components/settings/` + `server/src/components/platform-updates/` | 8 | ~64 | 2b-19 |

### Recommended execution order
1. **2b-17 (jobs)** — 29 strings, trivial
2. **2b-19 (profile)** — 64 strings, small
3. **2b-18 (email-providers)** — 136 strings, moderate
4. **2b-15 (knowledge-base)** — 189 strings, moderate
5. **2b-14 (schedule)** — 211 strings, moderate
6. **2b-13 (surveys)** — 217 strings, moderate
7. **2b-20 (close)** — 0 strings, just mark done

## Progress Log

- (2026-03-21) Completed `F001`: added [server/public/locales/en/msp/surveys.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/surveys.json) as the English source of truth for surveys. Keys were normalized into feature-specific groups (`moduleFrame`, `settings`, `response`, `rating`, `responses`, `dashboard`, `analytics`, `clientSummary`, `ticketSummary`) so later component rewrites can move off `common` cleanly.
- (2026-03-21) Validation for `F001`: parsed the new JSON successfully with `node -e "JSON.parse(...)"`.
- (2026-03-21) Completed `F002`: rewired the survey settings surface to `useTranslation('msp/surveys')` in `TriggerForm.tsx`, `TriggerList.tsx`, `TemplateForm.tsx`, and `TemplateList.tsx`. Shared verbs stayed in `common`, while survey-specific copy moved to the new namespace root with `{ defaultValue }` options.
- (2026-03-21) Validation for `F002`: targeted `eslint` passed cleanly for the four edited survey settings files, and `npx tsc -p packages/surveys/tsconfig.json --noEmit` passed after the settings rewrite.
- (2026-03-21) Completed `F003`: moved `SurveySettings.tsx`, `SurveyResponsePage.tsx`, `RatingDisplay.tsx`, `ResponseFilters.tsx`, `SurveyResponsesView.tsx`, and `ResponseDetailModal.tsx` onto `msp/surveys`. Response detail timestamps now use `useFormatters()`, and `TemplateForm` now requests translated default rating labels from the shared rating helper.
- (2026-03-21) Validation for `F003`: `npx tsc -p packages/surveys/tsconfig.json --noEmit` still passed after the response-flow and shared helper rewrites.
- (2026-03-21) Completed `F004`: localized the remaining survey chrome and insights surface: dashboard widgets, analytics widgets/pages, `SurveyModuleFrame`, `ClientSurveySummaryCard`, and `TicketSurveySummaryCard`. Server components `SurveyDashboard.tsx` and `SurveyAnalyticsPage.tsx` now use `getServerTranslation('msp/surveys')`, and client summary/dashboard lists use `useFormatters()` for locale-aware timestamps.
- (2026-03-21) Validation for `F004`: `npx tsc -p packages/surveys/tsconfig.json --noEmit` passed after the dashboard, analytics, and survey chrome rewrites.
- (2026-03-21) Follow-up survey cleanup before locale generation: kept `RatingDisplay.tsx` on the survey namespace for the rating-button aria label with text, and corrected `TriggerForm.tsx` to reuse `common.messages.required` instead of a missing `common.errors.required` key. Re-ran `npx tsc -p packages/surveys/tsconfig.json --noEmit` to confirm the worktree was clean before starting translated survey locale files.
- (2026-03-21) Completed `F005`: added survey namespace files for `de`, `es`, `fr`, `it`, `nl`, and `pl`, then generated `xx` and `yy` from the English source. The survey locale set now exists in all 9 required locales under `server/public/locales/*/msp/surveys.json`.
- (2026-03-21) Validation for `F005`: parsed the 6 translated JSON files with Node, ran `node scripts/generate-pseudo-locales.cjs`, restored unrelated pre-existing pseudo-locale interpolation differences outside the surveys namespace, and confirmed `node scripts/validate-translations.cjs` passed with `Errors: 0` and `Warnings: 0`.
- (2026-03-21) Completed `F006`: ran the Italian accent audit against [server/public/locales/it/msp/surveys.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/surveys.json). The broad grep only surfaced legitimate `e` conjunctions; a targeted search for known missing-accent spellings (`puo`, `gia`, `verra`, `funzionalita`, `necessario`) returned no matches, so no Italian copy changes were needed.
- (2026-03-21) Completed `F010`: added [server/public/locales/en/msp/schedule.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/schedule.json) as the English schedule namespace. The file groups strings by `page`, `sidebar`, `agentView`, `calendar`, `weeklyEvent`, `requests`, `availabilitySettings`, and `entryPopup` so the upcoming wiring can move the schedule surface off hardcoded English in coherent slices.
- (2026-03-21) Validation for `F010`: parsed `server/public/locales/en/msp/schedule.json` successfully with `node -e "JSON.parse(...)"`.
- (2026-03-21) Completed `F011`: wired the three largest schedule files to `useTranslation('msp/schedule')`. `EntryPopup.tsx` now uses translated dialog/validation/approval/recurrence copy and locale-aware date formatting for appointment request timestamps; `AvailabilitySettings.tsx` now translates dialog tabs, auto-approval/settings copy, tables, exceptions, and success/error toasts; `ScheduleCalendar.tsx` now translates the legend, toolbar, loading states, delete dialogs, and month-view event tooltips with locale-aware dates.
- (2026-03-21) Validation for `F011`: `git diff --check` passed, and `npx tsc -p packages/scheduling/tsconfig.json --noEmit` passed after the schedule rewrites.
- (2026-03-21) Completed `F012`: localized the rest of the schedule surface. `AppointmentRequestsPanel.tsx` now translates the request list/detail/approval flow and uses locale-aware request timestamps; `SchedulePage.tsx`, `AgentScheduleView.tsx`, `WeeklyScheduleEvent.tsx`, and `TechnicianSidebar.tsx` now translate page chrome, overlay states, compare controls, delete tooltips, and event tooltip copy.
- (2026-03-21) Validation for `F012`: `git diff --check` passed, and `npx tsc -p packages/scheduling/tsconfig.json --noEmit` passed after wiring the remaining schedule files with user-visible strings.
- (2026-03-21) Completed `F013`: added schedule locale files for `de`, `es`, `fr`, `it`, `nl`, and `pl`, then generated targeted `xx` and `yy` pseudo-locales from the English source. The schedule namespace now exists in all 9 required locales under `server/public/locales/*/msp/schedule.json`.
- (2026-03-21) Validation for `F013`: counted 293 leaf strings in each generated real locale, confirmed the pseudo-locale outputs return `11111` for schedule keys, and re-ran `node scripts/validate-translations.cjs` with `Errors: 0` and `Warnings: 0`.
- (2026-03-21) Completed `F014`: ran the Italian accent audit against [server/public/locales/it/msp/schedule.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/schedule.json). The broad grep only matched legitimate conjunctions such as `data e ora` and `Questo e gli eventi futuri`; a tighter search for common accentless spellings (`puo`, `gia`, `verra`, `funzionalita`, `perche`, weekday names without accents) returned no matches, so no Italian copy changes were required.
- (2026-03-21) Completed `F020`: added [server/public/locales/en/msp/knowledge-base.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/knowledge-base.json) as the English KB namespace source of truth. The file is grouped by surface (`page`, `list`, `editor`, `filters`, `categoryTree`, `publishing`, `reviewDashboard`, `importDialog`, `staleness`, `shared`) so the upcoming KB rewrites can move off `features/documents` cleanly while also covering the currently hardcoded status, audience, type, review-cycle, and pagination labels.
- (2026-03-21) Validation for `F020`: parsed the new JSON successfully and counted 163 leaf strings, covering the existing `kb.*` copy plus the missing hardcoded option-label maps surfaced during the KB inventory.
- (2026-03-21) Completed `F021`: rewired [KBArticleEditor.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/documents/src/components/kb/KBArticleEditor.tsx), [KBArticleList.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/documents/src/components/kb/KBArticleList.tsx), and [KnowledgeBasePage.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/documents/src/components/kb/KnowledgeBasePage.tsx) to `useTranslation('msp/knowledge-base')`. The editor and list now pull status, audience, type, review-cycle, pagination, and archive-dialog copy from the new KB namespace, and the editor/list date rendering now uses locale-aware `useFormatters()` helpers instead of hardcoded English formatting defaults.
- (2026-03-21) Validation for `F021`: `git diff --check` passed, `rg` confirmed there are no remaining `features/documents` or legacy `kb.` lookups in the three rewritten files, and `npx tsc -p packages/documents/tsconfig.json --noEmit` passed after the KB namespace swap.
- (2026-03-21) Completed `F022`: moved the rest of the KB surface to `msp/knowledge-base`: [KBImportDialog.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/documents/src/components/kb/KBImportDialog.tsx), [KBPublishingControls.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/documents/src/components/kb/KBPublishingControls.tsx), [KBReviewDashboard.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/documents/src/components/kb/KBReviewDashboard.tsx), [KBArticleFilters.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/documents/src/components/kb/KBArticleFilters.tsx), [KBCategoryTree.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/documents/src/components/kb/KBCategoryTree.tsx), and [KBStalenessBadge.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/documents/src/components/kb/KBStalenessBadge.tsx). This pass also removed the remaining hardcoded status, audience, type, and import-summary strings, and converted the inline English date/count string-building in publishing, import, review, and staleness UI to named interpolation values.
- (2026-03-21) Validation for `F022`: `git diff --check` passed, `rg` confirmed the six remaining KB files no longer reference `features/documents` or legacy `kb.` keys, and `npx tsc -p packages/documents/tsconfig.json --noEmit` passed after the remainder of the KB namespace migration.
- (2026-03-21) Completed `F023`: added KB namespace files for `de`, `es`, `fr`, `it`, `nl`, and `pl`, then generated targeted `xx` and `yy` pseudo-locales from the English source. The KB namespace now exists in all 9 required locales under `server/public/locales/*/msp/knowledge-base.json`.
- (2026-03-21) Validation for `F023`: counted 163 leaf strings in each generated real locale, confirmed the pseudo-locale outputs were generated from the KB English source without touching unrelated namespaces, and re-ran `node scripts/validate-translations.cjs` with `Errors: 0` and `Warnings: 0`.
- (2026-03-21) Completed `F024`: ran the Italian accent audit against [server/public/locales/it/msp/knowledge-base.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/knowledge-base.json). The broad grep only surfaced legitimate conjunctions such as `creare e gestire`; a tighter search for common accentless spellings (`puo`, `gia`, `verra`, `funzionalita`, `perche`, weekday names without accents) returned no matches, so no Italian copy changes were required.
- (2026-03-21) Completed `F030`: added [server/public/locales/en/msp/jobs.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/jobs.json) as the English jobs namespace. The file is grouped by monitoring surface (`recentTable`, `metrics`, `historyTable`, `progress`, `drawer`, `stepHistory`, `shared`) so the next jobs rewrite can cover table columns, status/runner labels, relative-time copy, drawer headings, and step-history labels from one namespace.
- (2026-03-21) Validation for `F030`: parsed the new JSON successfully and counted 47 leaf strings, reflecting the extra step-history and time-format copy that the original jobs estimate undercounted.
- (2026-03-21) Completed `F031`: rewired the jobs monitoring components to `useTranslation('msp/jobs')`: [RecentJobsDataTable.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/jobs/src/components/monitoring/RecentJobsDataTable.tsx), [JobMetricsDisplay.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/jobs/src/components/monitoring/JobMetricsDisplay.tsx), [JobHistoryTable.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/jobs/src/components/monitoring/JobHistoryTable.tsx), [JobProgress.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/jobs/src/components/monitoring/JobProgress.tsx), [JobDetailsDrawer.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/jobs/src/components/monitoring/JobDetailsDrawer.tsx), and [JobStepHistory.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/jobs/src/components/monitoring/JobStepHistory.tsx). This moved the remaining hardcoded table/drawer/metrics copy into the jobs namespace, localized status and runner labels, and replaced the progress panel's English-only `date-fns` relative-time string with locale-aware `useFormatters()`.
- (2026-03-21) Validation for `F031`: `git diff --check` passed, `npx tsc -p packages/jobs/tsconfig.json --noEmit` passed after the jobs namespace swap, and the one TypeScript issue surfaced during the pass (`count` typed as a string in the seconds formatter) was fixed by keeping the interpolated count numeric.
- (2026-03-21) Completed `F032`: added jobs namespace files for `de`, `es`, `fr`, `it`, `nl`, and `pl`, then generated targeted `xx` and `yy` pseudo-locales from the English source. The jobs namespace now exists in all 9 required locales under `server/public/locales/*/msp/jobs.json`.
- (2026-03-21) Validation for `F032`: counted 47 leaf strings in each generated real locale, generated the jobs pseudo-locales directly from the English source without touching unrelated namespaces, and re-ran `node scripts/validate-translations.cjs` with `Errors: 0` and `Warnings: 0`.
- (2026-03-21) Completed `F033`: ran the Italian accent audit against [server/public/locales/it/msp/jobs.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/jobs.json). Neither the broad grep nor the tighter search for common accentless spellings returned any matches, so no Italian copy changes were required.
- (2026-03-21) Completed `F040`: added [server/public/locales/en/msp/email-providers.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/email-providers.json) as the English email-provider namespace source of truth for the main provider configuration surfaces. The file groups strings by `configuration`, `providerCard`, `forms.*`, and `inboundDefaultsForm` so the provider forms, configuration shell, defaults form, and card/list surfaces can move off hardcoded English in coherent slices.
- (2026-03-21) Validation for `F040`: parsed the new JSON successfully; the initial namespace intentionally covers the main provider forms/configuration/card/defaults surfaces first, and the newly-added follow-up feature `F045` tracks the additional selector/wizard/gmail-helper copy discovered during implementation so locale generation happens only after those extra callsites are migrated.
- (2026-03-21) Completed `F041`: rewired [MicrosoftProviderForm.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/MicrosoftProviderForm.tsx), [GmailProviderForm.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/GmailProviderForm.tsx), and [ImapProviderForm.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/ImapProviderForm.tsx) to `useTranslation('msp/email-providers')`. The Microsoft and IMAP forms now pull local zod validation copy, section headings, OAuth UI, defaults selectors, and submit actions from the new namespace, while the Gmail form now translates its main alert/section/action copy and passes translated labels into its shared Gmail subcomponents.
- (2026-03-21) Validation for `F041`: `git diff --check` passed and `npx tsc -p packages/integrations/tsconfig.json --noEmit` passed after the provider-form rewrite. Gmail helper subcomponents, OAuth popup fallbacks, and schema-level messages that still live outside the main form remain tracked separately under `F045`.
- (2026-03-21) Completed `F042`: rewired [EmailProviderConfiguration.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/EmailProviderConfiguration.tsx), [InboundTicketDefaultsForm.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/forms/InboundTicketDefaultsForm.tsx), and [EmailProviderCard.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/EmailProviderCard.tsx) to `useTranslation('msp/email-providers')`. This moved the configuration shell header/help/toast copy, defaults-form validation and field text, provider-card actions/status text, and the inbound-defaults warning into the email-provider namespace.
- (2026-03-21) Validation for `F042`: `git diff --check` passed, `npx tsc -p packages/integrations/tsconfig.json --noEmit` passed after the configuration/defaults/card rewrites, and the updated [server/public/locales/en/msp/email-providers.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/email-providers.json) parsed successfully with Node.
- (2026-03-21) Completed `F045`: localized the remaining provider setup/list/helper surface: [EmailProviderList.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/EmailProviderList.tsx), [EmailProviderSelector.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/EmailProviderSelector.tsx), [ProviderSetupWizardDialog.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/ProviderSetupWizardDialog.tsx), [BasicConfigCard.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/providers/gmail/BasicConfigCard.tsx), [ProcessingSettingsCard.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/providers/gmail/ProcessingSettingsCard.tsx), [OAuthSection.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/providers/gmail/OAuthSection.tsx), [schemas.ts](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/providers/gmail/schemas.ts), and [useOAuthPopup.ts](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/providers/gmail/useOAuthPopup.ts). The Gmail schema now builds translated validation copy at runtime, the OAuth popup hook emits localized fallback errors, and the selector/list/wizard UI no longer leaves provider-setup copy hardcoded outside the namespace.
- (2026-03-21) Validation for `F045`: `git diff --check` passed, `npx tsc -p packages/integrations/tsconfig.json --noEmit` passed after restoring the public `baseGmailProviderSchema` export for compatibility, and the expanded [server/public/locales/en/msp/email-providers.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/email-providers.json) parsed successfully with Node.
- (2026-03-21) Completed `F043`: added email-provider locale files for `de`, `es`, `fr`, `it`, `nl`, and `pl`, then regenerated targeted `xx` and `yy` pseudo-locales from the English source. During locale validation, the Gmail OAuth warning copy exposed a runtime issue in [GmailProviderForm.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/integrations/src/components/email/GmailProviderForm.tsx): it was still interpolating raw English action words into the localized sentence. That copy was split into separate add/update keys so every locale can render the warning naturally.
- (2026-03-21) Validation for `F043`: `node scripts/validate-translations.cjs` passed with `Errors: 0` and `Warnings: 0`, `git diff --check` stayed clean after the locale generation, and a direct key-set comparison confirmed `server/public/locales/{de,es,fr,it,nl,pl,xx,yy}/msp/email-providers.json` now matches the English namespace exactly.
- (2026-03-21) Completed `F044`: ran the Italian accent audit against [server/public/locales/it/msp/email-providers.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/email-providers.json). The broad grep only surfaced legitimate conjunctions, and a whole-word sweep for common missing-accent spellings (`puo`, `gia`, `verra`, `funzionalita`, `perche`) returned zero matches, so no Italian copy corrections were required.
- (2026-03-21) Completed `F050`: added [server/public/locales/en/msp/profile.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/profile.json) as the English profile namespace source of truth. The file carries forward the existing `profile.*` and `security.*` shapes from `msp/settings`, adds the password-change strings currently living under the client-portal profile namespace, and introduces the missing profile load/save error and platform-update detail labels so the upcoming component rewrites can move to `msp/profile` without renaming every callsite.
- (2026-03-21) Completed `F051`: rewired [UserProfile.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/components/settings/profile/UserProfile.tsx), [PasswordChangeForm.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/users/src/components/settings/PasswordChangeForm.tsx), and [AdminSessionManagement.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/components/settings/security/AdminSessionManagement.tsx) to `msp/profile`. The profile page now localizes its tab labels, dynamic loading skeletons, and load/save error fallbacks from the new namespace; the password form no longer reads profile copy from the client-portal namespace; and admin session timestamps now use locale-aware `useFormatters()` instead of `date-fns` English relative text.
- (2026-03-21) Validation for `F051`: `git diff --check` passed, `npx tsc -p packages/users/tsconfig.json --noEmit` passed, `npx tsc -p server/tsconfig.json --noEmit` passed after the namespace swap, and the updated [server/public/locales/en/msp/profile.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/profile.json) parsed successfully with Node.
- (2026-03-21) Completed `F052`: localized the remaining profile/security wrapper surfaces: [UserRoleAssignment.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/components/settings/security/UserRoleAssignment.tsx), [SecuritySettingsPage.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/components/settings/security/SecuritySettingsPage.tsx), and [PlatformUpdateDetail.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/components/platform-updates/PlatformUpdateDetail.tsx). The security page now loads translated tab labels and loading skeletons from `msp/profile`, role assignment no longer hardcodes the empty-state type labels or unnamed-user fallback, and platform update details now translate the back button/severity labels while formatting the created date with locale-aware `useFormatters()`.
- (2026-03-21) Validation for `F052`: `git diff --check` passed, `npx tsc -p server/tsconfig.json --noEmit` passed after the remaining profile/security rewrites, and the enriched [server/public/locales/en/msp/profile.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/profile.json) still parsed successfully with Node.
- (2026-03-21) Completed `F053`: added profile namespace files for `de`, `es`, `fr`, `it`, `nl`, and `pl`, then regenerated targeted `xx` and `yy` pseudo-locales from the English source. Unlike the email-provider batch, most profile/security strings were assembled from already-translated `msp/settings` and `client-portal` locale data, with only the new profile load/save errors, password validation copy, session error messages, unnamed-user fallback, and platform-update detail labels filled in manually.
- (2026-03-21) Validation for `F053`: `node scripts/validate-translations.cjs` passed with `Errors: 0` and `Warnings: 0`, `git diff --check` stayed clean, and direct leaf counts matched across the English, production, and pseudo profile locale files (117 leaf strings each).
- (2026-03-21) Completed `F054`: ran the Italian accent audit against [server/public/locales/it/msp/profile.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/profile.json). A whole-word sweep for common missing-accent spellings (`puo`, `gia`, `verra`, `funzionalita`, `perche`) returned zero matches, so the new Italian profile locale did not require accent corrections.
- (2026-03-22) Completed `F060`: re-inventoried the original `2b-20` “no work needed” batch and confirmed the assumption is stale in the current repo. Extension and licensing community/OSS fallback components now contain visible copy, so the batch cannot be closed as empty; instead, concrete follow-up items (`F061`-`F068`, `T061`-`T063`) were added for `msp/extensions` and `msp/licensing`.
- (2026-03-22) Completed `F061`: added [server/public/locales/en/msp/extensions.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/extensions.json) as the English source of truth for the extension follow-up scope. The namespace carries the settings-shell labels/loading text previously parked under `msp/settings.extensions`, plus the CE loader fallback copy and OSS `/msp/extensions` list/detail placeholder metadata needed by the current community build.
- (2026-03-22) Validation for `F061`: parsed the new extension namespace successfully with Node, counted 22 leaf strings, and confirmed `git diff --check` stayed clean before starting the component rewrites.
- (2026-03-22) Completed `F062`: rewired the extension follow-up surfaces to `msp/extensions`: [DynamicNavigationSlot.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/ui/src/components/extensions/DynamicNavigationSlot.tsx), [ExtensionManagement.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/components/settings/extensions/ExtensionManagement.tsx), [ExtensionComponentLoader.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/ee/src/lib/extensions/ExtensionComponentLoader.tsx), [packages/product-extensions/oss/entry.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/product-extensions/oss/entry.tsx), [packages/product-extensions/pages/list.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/product-extensions/pages/list.tsx), [packages/product-extensions/pages/details.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/product-extensions/pages/details.tsx), [packages/product-extensions/pages/settings.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/product-extensions/pages/settings.tsx), [packages/product-settings-extensions/oss/entry.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/product-settings-extensions/oss/entry.tsx), [server/src/app/msp/settings/extensions/page.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/app/msp/settings/extensions/page.tsx), and [server/src/app/msp/settings/extensions/install/page.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/app/msp/settings/extensions/install/page.tsx). This pass moved the extension nav heading, settings-shell tabs/loading/fallbacks, CE loader stubs, OSS extension list/detail/settings placeholders, and OSS settings-extension enterprise-feature stubs onto the dedicated namespace while keeping static route metadata untouched for compatibility.
- (2026-03-22) Validation for `F062`: expanded [server/public/locales/en/msp/extensions.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/extensions.json) to cover the additional OSS settings-extension placeholder keys, re-parsed it successfully with Node, confirmed `git diff --check` stayed clean, and ran `npx tsc -p packages/ui/tsconfig.json --noEmit` plus `npx tsc -p server/tsconfig.json --noEmit` without TypeScript errors after the extension namespace swap.
- (2026-03-22) Completed `F063`: added extension namespace files for `de`, `es`, `fr`, `it`, `nl`, and `pl`, then generated targeted `xx` and `yy` pseudo-locales from the English source. The new locale set intentionally reuses the existing `msp/settings.extensions.*` translations for the settings-shell copy, while the new community-edition, enterprise-feature, and extension-placeholder page strings were translated manually to keep the extension-specific namespace coherent.
- (2026-03-22) Validation for `F063`: counted 35 leaf strings in each generated real and pseudo extension locale file, confirmed `git diff --check` stayed clean, and re-ran `node scripts/validate-translations.cjs` with `Errors: 0` and `Warnings: 0`.
- (2026-03-22) Completed `F064`: ran the Italian accent audit against [server/public/locales/it/msp/extensions.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/extensions.json). The broad grep only surfaced the legitimate conjunction in `Installi, configuri e gestisca`; a whole-word sweep for common accentless spellings (`puo`, `gia`, `verra`, `funzionalita`, `perche`) returned zero matches, so no Italian copy corrections were required.
- (2026-03-22) Completed `F065`: added [server/public/locales/en/msp/licensing.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/licensing.json) as the English source of truth for the CE licensing stubs. The namespace intentionally stays minimal: `reduceModal.*` and `purchaseForm.*` carry the Enterprise-only licensing copy, while the modal button can continue reusing `common.actions.close`.
- (2026-03-22) Validation for `F065`: parsed the new licensing namespace successfully with Node, counted 5 leaf strings, and confirmed `git diff --check` stayed clean before the component rewrites.
- (2026-03-22) Completed `F066`: rewired the CE licensing stubs to `msp/licensing`: [ReduceLicensesModal.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/ee/src/components/licensing/ReduceLicensesModal.tsx) now reads its title and Enterprise-only body copy from the new namespace while reusing `common.actions.close`, and [LicensePurchaseForm.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/ee/src/components/licensing/LicensePurchaseForm.tsx) now reads its title plus both hosted/self-hosted stub messages from `msp/licensing`.
- (2026-03-22) Validation for `F066`: `git diff --check` stayed clean, `rg` confirmed the licensing stub strings now only remain as `defaultValue` fallbacks in the two CE components, and `npx tsc -p server/tsconfig.json --noEmit` passed after the namespace swap.
- (2026-03-22) Completed `F067`: added licensing namespace files for `de`, `es`, `fr`, `it`, `nl`, and `pl`, then generated targeted `xx` and `yy` pseudo-locales from the English source. The licensing batch is intentionally small, so the locale files were translated directly from the 5-key English source rather than reusing a broader settings namespace.
- (2026-03-22) Validation for `F067`: counted 5 leaf strings in each generated real and pseudo licensing locale file, confirmed `git diff --check` stayed clean, and re-ran `node scripts/validate-translations.cjs` with `Errors: 0` and `Warnings: 0`.
- (2026-03-22) Completed `F068`: ran the Italian accent audit against [server/public/locales/it/msp/licensing.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/licensing.json). Neither the broad grep nor the whole-word sweep for common accentless spellings (`puo`, `gia`, `verra`, `funzionalita`, `perche`) returned any matches, so no Italian copy corrections were required.
- (2026-03-23) Completed `F070`: localized the enterprise licensing purchase flow and shared wrappers with `msp/licensing`: [ee/server/src/components/licensing/LicensePurchaseForm.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/ee/server/src/components/licensing/LicensePurchaseForm.tsx), [ee/server/src/components/licensing/ReduceLicensesModal.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/ee/server/src/components/licensing/ReduceLicensesModal.tsx), [ee/server/src/app/msp/licenses/purchase/page.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/ee/server/src/app/msp/licenses/purchase/page.tsx), [ee/server/src/app/msp/licenses/purchase/success/page.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/ee/server/src/app/msp/licenses/purchase/success/page.tsx), plus the mirrored [server/src/app/msp/licenses/purchase/page.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/app/msp/licenses/purchase/page.tsx) and [server/src/app/msp/licenses/purchase/success/page.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/app/msp/licenses/purchase/success/page.tsx) wrappers. This pass also moved the four purchase/success layout metadata titles to `generateMetadata()` with `getServerTranslation('msp/licensing')`, and replaced the last hardcoded `toLocaleDateString('en-US')` / manual currency-per-month strings with locale-aware `useFormatters()` output.
- (2026-03-23) Validation for `F070`: [server/public/locales/en/msp/licensing.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/licensing.json) re-parsed successfully with Node; `git diff --check` stayed clean; `npx eslint` passed for all edited licensing pages/layouts/components; `npx tsc -p server/tsconfig.json --noEmit` passed after the licensing rewrite; and `npx tsc -p ee/server/tsconfig.json --noEmit` remains blocked by unrelated pre-existing `TS2307` module-resolution failures in `packages/assets/src/actions/assetNoteActions.ts`, `packages/clients/src/actions/clientNoteActions.ts`, and `packages/clients/src/actions/contact-actions/contactNoteActions.ts` for `@alga-psa/block-content/actions`.
- (2026-03-23) Completed `F071`: regenerated the licensing locale set after the enterprise-flow expansion. [server/public/locales/{de,es,fr,it,nl,pl}/msp/licensing.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/de/msp/licensing.json) now contain full translations for the purchase page, success page, subscription form, and license-removal flow, and [server/public/locales/{xx,yy}/msp/licensing.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/xx/msp/licensing.json) were regenerated directly from the updated English source so the pseudo-locales cover the new enterprise keys too.
- (2026-03-23) Validation for `F071`: counted 108 leaf strings in each `msp/licensing` locale file, confirmed there are no missing or extra keys versus English, re-ran `node scripts/validate-translations.cjs` with `Errors: 0` and `Warnings: 0`, and confirmed `git diff --check` stayed clean after the locale regeneration.
- (2026-03-23) Completed `F072`: ran the Italian accent audit against [server/public/locales/it/msp/licensing.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/licensing.json) after the enterprise-flow expansion. The broad grep only surfaced legitimate conjunctions like `e per` / `conferma e paga`, and a targeted whole-word sweep for common accentless spellings (`puo`, `gia`, `verra`, `funzionalita`, `perche`, weekday names without accents) returned zero matches, so no Italian copy corrections were required.
- (2026-03-23) Completed `F073`: expanded [server/public/locales/en/msp/extensions.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/extensions.json) with a dedicated `runtime.*` block for the EE extension entry route. The new keys cover the entry metadata title plus the runtime load failure, not-found state, missing bundle state, missing runtime-domain state, and their CTA links so `packages/product-extensions/ee/entry.tsx` can move off hardcoded English without mixing runtime copy into the OSS placeholder groups.
- (2026-03-23) Validation for `F073`: re-parsed [server/public/locales/en/msp/extensions.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/extensions.json) successfully with Node, counted 44 leaf strings after the runtime-state expansion, and confirmed `git diff --check` stayed clean before the component rewrite.
- (2026-03-23) Completed `F074`: rewired [packages/product-extensions/ee/entry.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/product-extensions/ee/entry.tsx) to `msp/extensions`. The EE runtime entry now uses `getServerTranslation('msp/extensions')` for its metadata title plus the runtime load error, not-found state, missing bundle state, missing runtime-domain state, and CTA links. The non-production `docker-mode` debug banner remains English intentionally because it is diagnostic-only output rather than shipped MSP UI copy.
- (2026-03-23) Validation for `F074`: `npx eslint packages/product-extensions/ee/entry.tsx` passed cleanly after adding the file-level Node `process` global declaration, `git diff --check` stayed clean, and an `rg` sweep confirmed the former runtime/error phrases now only remain as `defaultValue` fallbacks in the EE entry file.
- (2026-03-23) Completed `F075`: regenerated the extension locale set after the EE runtime-state expansion. [server/public/locales/{de,es,fr,it,nl,pl}/msp/extensions.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/de/msp/extensions.json) now include translations for the runtime metadata title, runtime load failure, not-found state, missing bundle/domain states, and their CTA links, and [server/public/locales/{xx,yy}/msp/extensions.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/xx/msp/extensions.json) were regenerated from the updated English source.
- (2026-03-23) Validation for `F075`: counted 44 leaf strings in each `msp/extensions` locale file, confirmed there are no missing or extra keys versus English, re-ran `node scripts/validate-translations.cjs` with `Errors: 0` and `Warnings: 0`, and confirmed `git diff --check` stayed clean after the locale regeneration.
- (2026-03-23) Completed `F076`: ran the Italian accent audit against [server/public/locales/it/msp/extensions.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/extensions.json) after the runtime-state expansion. The broad grep only surfaced the legitimate conjunction in `Installi, configuri e gestisca`; a targeted whole-word sweep for common accentless spellings (`puo`, `gia`, `verra`, `funzionalita`, `perche`, weekday names without accents) returned zero matches, so no Italian copy corrections were required.
- (2026-03-23) `F090` scope had to expand beyond the original 8 PRD routes. The `2b-20` follow-up added live `msp/extensions` and `msp/licensing` surfaces, and the already-localized settings-extension pages at `/msp/settings/extensions` were still missing a route-level namespace registration. Rather than splitting another cross-cutting micro-feature, the route-registry pass now covers those prefixes alongside the original survey/schedule/KB/jobs/email/profile routes.
- (2026-03-23) Completed `F090`: updated [packages/core/src/lib/i18n/config.ts](/Users/natalliabukhtsik/Desktop/projects/bigmac/packages/core/src/lib/i18n/config.ts) so `ROUTE_NAMESPACES` now loads `msp/surveys`, `msp/schedule`, `msp/knowledge-base`, `msp/jobs`, `msp/email-providers`, `msp/profile`, `msp/extensions`, and `msp/licensing` on the routes that render them. This pass also corrected `/msp/settings` to load `msp/admin` with `msp/email-providers`, added the longer `/msp/settings/extensions` prefix for settings-shell extension pages, and registered `/msp/extensions` plus `/msp/licenses` so the follow-up extension/licensing pages preload their dedicated namespaces.
- (2026-03-23) Validation for `F090`: `npx eslint packages/core/src/lib/i18n/config.ts` passed cleanly after adding the file-level Node `process` global declaration, `git diff --check` stayed clean, and `npx tsx --eval` confirmed `getNamespacesForRoute()` returns the expected namespace arrays for `/msp/surveys`, `/msp/schedule`, `/msp/knowledge-base`, `/msp/jobs`, `/msp/settings`, `/msp/settings/extensions`, `/msp/profile`, `/msp/security-settings`, `/msp/platform-updates`, `/msp/extensions`, and `/msp/licenses/purchase`.
- (2026-03-23) Completed `F091`: re-ran `node scripts/validate-translations.cjs` against the full current locale tree after the licensing, extension, and route-registry follow-up work. The final validator pass for this plan completed with `Errors: 0` and `Warnings: 0`, confirming all newly-added MSP namespaces are structurally aligned across `en`, the six production locales, and both pseudo-locales.
- (2026-03-23) Completed `F092`: regenerated `xx` and `yy` directly from the English sources for all newly-added MSP namespaces (`surveys`, `schedule`, `knowledge-base`, `jobs`, `email-providers`, `profile`, `extensions`, `licensing`). This explicit final pass only changed the survey pseudo files; the other pseudo namespaces were already aligned with English.
- (2026-03-23) Validation for `F092`: confirmed every regenerated pseudo file contains only `11111` leaf values with leaf counts matching English for each namespace (`surveys` 259, `schedule` 293, `knowledge-base` 163, `jobs` 47, `email-providers` 285, `profile` 117, `extensions` 44, `licensing` 108), and `git diff --check` stayed clean after the pseudo-locale refresh.
- (2026-03-23) `packages/product-extensions/ee/entry.tsx` now exports `generateMetadata()` alongside the default page component, so the route shims at [server/src/app/msp/extensions/[id]/page.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/app/msp/extensions/[id]/page.tsx), [server/src/app/client-portal/extensions/[id]/page.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/app/client-portal/extensions/[id]/page.tsx), and [ee/server/src/app/msp/extensions/[id]/page.tsx](/Users/natalliabukhtsik/Desktop/projects/bigmac/ee/server/src/app/msp/extensions/[id]/page.tsx) must re-export both `default` and `generateMetadata`. The ambient declaration in [server/src/types/external-modules.d.ts](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/types/external-modules.d.ts) and the metadata unit assertions in [server/src/test/unit/app/pageTitles.metadata.test.ts](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/src/test/unit/app/pageTitles.metadata.test.ts) were updated to match so the production build recognizes the export shape.
- (2026-03-23) Completed `F093`: reran the full production build from the current translation worktree after the extension metadata/export fix. The build now includes the localized extension route metadata path without regressing the rest of the app build.
- (2026-03-23) Validation for `F093`: `npm run build` completed successfully end-to-end with exit code 0. The run emitted existing webpack warnings only (scheduling conflicting star exports, `handlebars` `require.extensions`, `fluent-ffmpeg`/`knex`/Temporal dynamic dependency warnings, and the Next.js middleware deprecation notice); TypeScript, static generation, build traces, and final page optimization all finished successfully.
- (2026-03-23) Completed `T001`: re-verified the survey locale set against the final translation validation pass.
- (2026-03-23) Validation for `T001`: the earlier survey locale generation under `F005` and the final `node scripts/validate-translations.cjs` run under `F091` both passed, confirming `msp/surveys` matches English across all 9 locales with `Errors: 0` and `Warnings: 0`.
- (2026-03-23) Completed `T002`: confirmed the full survey component batch still compiles with the `msp/surveys` namespace wiring.
- (2026-03-23) Validation for `T002`: the targeted `npx tsc -p packages/surveys/tsconfig.json --noEmit` runs logged under `F002`, `F003`, and `F004` all passed after the survey rewrites, covering the 26 in-scope survey components with no TypeScript errors.
- (2026-03-23) Completed `T003`: closed the survey Italian accent audit checkpoint.
- (2026-03-23) Validation for `T003`: the `F006` audit on [server/public/locales/it/msp/surveys.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/surveys.json) found no accentless `puo`/`gia`/`verra`/`funzionalita`/`necessario` regressions, so the Italian survey locale passed unchanged.
- (2026-03-23) Completed `T004`: verified representative survey dashboard/settings/response keys resolve to the pseudo-locale fill token in `xx`.
- (2026-03-23) Validation for `T004`: a focused Node assertion against [server/public/locales/xx/msp/surveys.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/xx/msp/surveys.json) confirmed 9 representative keys spanning the dashboard, triggers, templates, analytics, and responses surfaces all resolve to `11111`.
- (2026-03-23) Completed `T010`: re-verified the schedule locale set against the final translation validation pass.
- (2026-03-23) Validation for `T010`: the earlier schedule locale generation under `F013` and the final `node scripts/validate-translations.cjs` run under `F091` both passed, confirming `msp/schedule` matches English across all 9 locales with `Errors: 0` and `Warnings: 0`.
- (2026-03-23) Completed `T011`: confirmed the full schedule component batch still compiles with the `msp/schedule` namespace wiring.
- (2026-03-23) Validation for `T011`: the targeted `npx tsc -p packages/scheduling/tsconfig.json --noEmit` runs logged under `F011` and `F012` both passed after the schedule rewrites, covering the 11 in-scope schedule files with no TypeScript errors.
- (2026-03-23) Completed `T012`: closed the schedule Italian accent audit checkpoint.
- (2026-03-23) Validation for `T012`: the `F014` audit on [server/public/locales/it/msp/schedule.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/schedule.json) found no accentless `puo`/`gia`/`verra`/`funzionalita`/`perche` regressions, so the Italian schedule locale passed unchanged.
- (2026-03-23) Completed `T013`: verified representative schedule calendar/request/availability/entry-popup keys resolve to the pseudo-locale fill token in `xx`.
- (2026-03-23) Validation for `T013`: a focused Node assertion against [server/public/locales/xx/msp/schedule.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/xx/msp/schedule.json) confirmed 8 representative keys spanning the calendar, appointment requests, availability settings, and entry popup all resolve to `11111`.
- (2026-03-23) Completed `T020`: re-verified the knowledge-base locale set against the final translation validation pass.
- (2026-03-23) Validation for `T020`: the earlier KB locale generation under `F023` and the final `node scripts/validate-translations.cjs` run under `F091` both passed, confirming `msp/knowledge-base` matches English across all 9 locales with `Errors: 0` and `Warnings: 0`.
- (2026-03-23) Completed `T021`: confirmed the full knowledge-base component batch still compiles with the `msp/knowledge-base` namespace wiring.
- (2026-03-23) Validation for `T021`: the targeted `npx tsc -p packages/documents/tsconfig.json --noEmit` runs logged under `F021` and `F022` both passed after the KB rewrites, covering the 10 in-scope KB files with no TypeScript errors.
- (2026-03-23) Completed `T022`: closed the knowledge-base Italian accent audit checkpoint.
- (2026-03-23) Validation for `T022`: the `F024` audit on [server/public/locales/it/msp/knowledge-base.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/it/msp/knowledge-base.json) found no accentless `puo`/`gia`/`verra`/`funzionalita`/`perche` regressions, so the Italian KB locale passed unchanged.
- (2026-03-23) Completed `T023`: verified representative KB page/editor/import/review keys resolve to the pseudo-locale fill token in `xx`.
- (2026-03-23) Validation for `T023`: a focused Node assertion against [server/public/locales/xx/msp/knowledge-base.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/xx/msp/knowledge-base.json) confirmed 8 representative keys spanning the main page, article editor, article list, import dialog, and review dashboard all resolve to `11111`.
- (2026-03-23) Completed `T030`: re-verified the jobs locale set against the final translation validation pass.
- (2026-03-23) Validation for `T030`: the earlier jobs locale generation under `F032` and the final `node scripts/validate-translations.cjs` run under `F091` both passed, confirming `msp/jobs` matches English across all 9 locales with `Errors: 0` and `Warnings: 0`.
- (2026-03-23) Completed `T031`: confirmed the full jobs monitoring batch still compiles with the `msp/jobs` namespace wiring.
- (2026-03-23) Validation for `T031`: the targeted `npx tsc -p packages/jobs/tsconfig.json --noEmit` run logged under `F031` passed after the jobs rewrite, covering the 7 in-scope jobs files with no TypeScript errors.
- (2026-03-23) Completed `T032`: verified representative jobs table/metrics/drawer keys resolve to the pseudo-locale fill token in `xx`.
- (2026-03-23) Validation for `T032`: a focused Node assertion against [server/public/locales/xx/msp/jobs.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/xx/msp/jobs.json) confirmed 7 representative keys spanning the recent-jobs table, metrics cards, history/progress panels, drawer, and step history all resolve to `11111`.
- (2026-03-23) Completed `T040`: re-verified the email-provider locale set against the final translation validation pass.
- (2026-03-23) Validation for `T040`: the earlier email-provider locale generation under `F043` and the final `node scripts/validate-translations.cjs` run under `F091` both passed, confirming `msp/email-providers` matches English across all 9 locales with `Errors: 0` and `Warnings: 0`.
- (2026-03-23) Completed `T041`: confirmed the main email-provider form/configuration batch still compiles with the `msp/email-providers` namespace wiring.
- (2026-03-23) Validation for `T041`: the targeted `npx tsc -p packages/integrations/tsconfig.json --noEmit` runs logged under `F041` and `F042` both passed after the provider-form/configuration rewrites, covering the 10 in-scope email-provider files with no TypeScript errors.
- (2026-03-23) Completed `T042`: checked the email-provider namespace boundary against the existing MSP settings/admin locale tree.
- (2026-03-23) Validation for `T042`: a direct leaf-key comparison between [server/public/locales/en/msp/email-providers.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/email-providers.json) and [server/public/locales/en/msp/settings.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/en/msp/settings.json) found `285` email-provider leaves, `769` settings leaves, and `0` overlapping key paths, so the provider namespace does not collide with the existing MSP settings/admin copy.
- (2026-03-23) Completed `T043`: confirmed the remaining email-provider setup/list/helper surfaces compile and no longer leave provider-setup copy hardcoded outside the namespace.
- (2026-03-23) Validation for `T043`: the `F045` validation run already covered the remaining helper surfaces with `npx tsc -p packages/integrations/tsconfig.json --noEmit`, and the `rg` sweep recorded there confirmed the former setup/wizard/OAuth fallback strings now remain only as `defaultValue` fallbacks rather than hardcoded UI text.
- (2026-03-23) Completed `T050`: re-verified the profile locale set against the final translation validation pass.
- (2026-03-23) Validation for `T050`: the earlier profile locale generation under `F053` and the final `node scripts/validate-translations.cjs` run under `F091` both passed, confirming `msp/profile` matches English across all 9 locales with `Errors: 0` and `Warnings: 0`.
- (2026-03-23) Completed `T051`: confirmed the profile/security/platform-update batch still compiles with the `msp/profile` namespace wiring.
- (2026-03-23) Validation for `T051`: the targeted `npx tsc -p packages/users/tsconfig.json --noEmit` run and the `npx tsc -p server/tsconfig.json --noEmit` runs logged under `F051` and `F052` both passed after the profile/security rewrites, covering the 8 in-scope files with no TypeScript errors.
- (2026-03-23) Completed `T052`: verified representative profile/security/platform-update keys resolve to the pseudo-locale fill token in `xx`.
- (2026-03-23) Validation for `T052`: a focused Node assertion against [server/public/locales/xx/msp/profile.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/xx/msp/profile.json) confirmed 8 representative keys spanning the profile page, password-change form, security-settings views, session management, and platform-update detail all resolve to `11111`.
- (2026-03-23) Completed `T060`: closed the `2b-20` re-inventory checkpoint.
- (2026-03-23) Validation for `T060`: the `F060` re-inventory recorded the stale “no work needed” assumption and added the concrete `F061`-`F076` / `T061`-`T067` follow-up items for the newly-discovered extension and licensing UI strings, so the batch is no longer treated as empty.
- (2026-03-23) Completed `T061`: confirmed the extension follow-up surfaces compile and no longer leave visible placeholder copy hardcoded outside `msp/extensions`.
- (2026-03-23) Validation for `T061`: the `F062` validation already covered the extension follow-up with `npx tsc -p packages/ui/tsconfig.json --noEmit` and `npx tsc -p server/tsconfig.json --noEmit`, while the recorded rewrite inventory moved the CE loader stubs, settings-shell copy, and OSS placeholder text onto `msp/extensions`.
- (2026-03-23) Completed `T062`: confirmed the CE licensing stubs compile and no longer leave visible stub copy hardcoded outside `msp/licensing`.
- (2026-03-23) Validation for `T062`: the `F066` validation already covered the CE licensing stubs with `npx tsc -p server/tsconfig.json --noEmit`, and the recorded `rg` sweep confirmed the stub strings now remain only as `defaultValue` fallbacks in the CE licensing components.
- (2026-03-23) Completed `T063`: re-verified the initial extension/licensing follow-up locale sets against the final translation validation pass.
- (2026-03-23) Validation for `T063`: the locale generation passes under `F063` and `F067`, plus the final `node scripts/validate-translations.cjs` run under `F091`, confirmed `msp/extensions` and `msp/licensing` are structurally aligned across all 9 locales with `Errors: 0` and `Warnings: 0`.
- (2026-03-23) Completed `T064`: confirmed the enterprise licensing purchase/reduction/success flow compiles and no longer leaves visible purchase-flow copy hardcoded outside `msp/licensing`.
- (2026-03-23) Validation for `T064`: the `F070` validation already covered the enterprise licensing flow with `npx eslint` and `npx tsc -p server/tsconfig.json --noEmit`, while the recorded rewrite inventory moved the purchase page, success page, subscription form, and reduction modal copy onto `msp/licensing`.
- (2026-03-23) Completed `T065`: re-verified the expanded enterprise licensing locale set against the final translation validation pass.
- (2026-03-23) Validation for `T065`: the expanded licensing locale generation under `F071` and the final `node scripts/validate-translations.cjs` run under `F091` both passed, confirming the 108-leaf `msp/licensing` namespace matches English across all 9 locales with `Errors: 0` and `Warnings: 0`.
- (2026-03-23) Completed `T066`: confirmed the EE extension runtime/error states compile and no longer leave visible runtime-state copy hardcoded outside `msp/extensions`.
- (2026-03-23) Validation for `T066`: the `F074` validation already covered the EE entry rewrite with `npx eslint packages/product-extensions/ee/entry.tsx`, and the recorded `rg` sweep confirmed the old runtime/error strings now remain only as `defaultValue` fallbacks in the EE extension entry file.
- (2026-03-23) Completed `T067`: re-verified the expanded EE extension locale set against the final translation validation pass.
- (2026-03-23) Validation for `T067`: the expanded extensions locale generation under `F075` and the final `node scripts/validate-translations.cjs` run under `F091` both passed, confirming the 44-leaf `msp/extensions` namespace matches English across all 9 locales with `Errors: 0` and `Warnings: 0`.
- (2026-03-23) Completed `T070`: closed the route-namespace registration checkpoint for the final MSP batches.
- (2026-03-23) Validation for `T070`: the `F090` route-registry pass updated `ROUTE_NAMESPACES`, and the logged `getNamespacesForRoute()` spot checks confirmed the expected namespace arrays for the original batch routes plus the follow-up `/msp/settings/extensions`, `/msp/extensions`, and `/msp/licenses/purchase` prefixes.
- (2026-03-23) Completed `T071`: closed the final cross-batch translation validator checkpoint.
- (2026-03-23) Validation for `T071`: the final `node scripts/validate-translations.cjs` run under `F091` completed with `Errors: 0` and `Warnings: 0` across every newly-added MSP namespace and locale file.
- (2026-03-23) Completed `T072`: closed the final cross-batch pseudo-locale regeneration checkpoint.
- (2026-03-23) Validation for `T072`: the explicit `F092` pseudo refresh regenerated `xx` and `yy` for every newly-added MSP namespace, and the recorded leaf-count check confirmed each pseudo file still matches its English source structure.
- (2026-03-23) Completed `T073`: closed the final cross-batch production-build checkpoint.
- (2026-03-23) Validation for `T073`: the full `npm run build` run recorded under `F093` completed with exit code `0`, including TypeScript, static generation, build traces, and final page optimization.
- (2026-03-23) Completed `T074`: re-verified the feature-flag-off English fallback path for MSP i18n.
- (2026-03-23) Validation for `T074`: a direct source assertion confirmed `packages/core/src/lib/featureFlagRuntime.ts` still defaults `'msp-i18n-enabled'` to `false`, the CE and EE MSP layouts still gate locale resolution behind `isMspI18nEnabled ? await getHierarchicalLocaleAction() : null`, and the CE MSP layout client still forces `initialLocale='en'` with pseudo-locales disabled when the flag is off.
- (2026-03-23) Completed `T075`: closed the German overflow sanity check for the highest-risk MSP forms introduced by this plan.
- (2026-03-23) Validation for `T075`: a focused Node assertion checked 10 overflow-sensitive German strings across [server/public/locales/de/msp/surveys.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/de/msp/surveys.json), [server/public/locales/de/msp/schedule.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/de/msp/schedule.json), [server/public/locales/de/msp/knowledge-base.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/de/msp/knowledge-base.json), and [server/public/locales/de/msp/email-providers.json](/Users/natalliabukhtsik/Desktop/projects/bigmac/server/public/locales/de/msp/email-providers.json); all stayed within the defined length thresholds for survey forms, the schedule entry/availability flow, KB editor chrome, and email-provider form guidance.

## Open Questions

- **Public survey page locale**: How does SurveyResponsePage.tsx resolve locale without an authenticated MSP session?
- **Security settings overlap**: Which SecuritySettingsPage strings are already in `msp/settings`?
- **Email namespace loading**: Adding `msp/email-providers` to the already-loaded `/msp/settings` route increases namespace count. Check performance.
