Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

71 KiB

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 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, ExtensionManagement.tsx, ExtensionComponentLoader.tsx, packages/product-extensions/oss/entry.tsx, packages/product-extensions/pages/list.tsx, packages/ee/src/components/licensing/ReduceLicensesModal.tsx, and 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 still hardcoded its loading fallback, and 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 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, ee/server/src/components/licensing/ReduceLicensesModal.tsx, ee/server/src/app/msp/licenses/purchase/page.tsx, and 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 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 as part of the component wiring instead of splitting another micro-feature.

Commands / Runbooks

Validation

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

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

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
  • 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
  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 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. 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 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. 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 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, KBArticleList.tsx, and 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, KBPublishingControls.tsx, KBReviewDashboard.tsx, KBArticleFilters.tsx, KBCategoryTree.tsx, and 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. 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 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, JobMetricsDisplay.tsx, JobHistoryTable.tsx, JobProgress.tsx, JobDetailsDrawer.tsx, and 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. 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 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, GmailProviderForm.tsx, and 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, InboundTicketDefaultsForm.tsx, and 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 parsed successfully with Node.
  • (2026-03-21) Completed F045: localized the remaining provider setup/list/helper surface: EmailProviderList.tsx, EmailProviderSelector.tsx, ProviderSetupWizardDialog.tsx, BasicConfigCard.tsx, ProcessingSettingsCard.tsx, OAuthSection.tsx, schemas.ts, and 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 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: 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. 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 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, PasswordChangeForm.tsx, and 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 parsed successfully with Node.
  • (2026-03-21) Completed F052: localized the remaining profile/security wrapper surfaces: UserRoleAssignment.tsx, SecuritySettingsPage.tsx, and 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 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. 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 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, ExtensionManagement.tsx, ExtensionComponentLoader.tsx, packages/product-extensions/oss/entry.tsx, packages/product-extensions/pages/list.tsx, packages/product-extensions/pages/details.tsx, packages/product-extensions/pages/settings.tsx, packages/product-settings-extensions/oss/entry.tsx, server/src/app/msp/settings/extensions/page.tsx, and 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 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. 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 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 now reads its title and Enterprise-only body copy from the new namespace while reusing common.actions.close, and 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. 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, ee/server/src/components/licensing/ReduceLicensesModal.tsx, ee/server/src/app/msp/licenses/purchase/page.tsx, ee/server/src/app/msp/licenses/purchase/success/page.tsx, plus the mirrored server/src/app/msp/licenses/purchase/page.tsx and 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 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 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 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 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 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 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 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 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 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 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 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, server/src/app/client-portal/extensions/[id]/page.tsx, and 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 and the metadata unit assertions in 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 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 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 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 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 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 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 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 and 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 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, server/public/locales/de/msp/schedule.json, server/public/locales/de/msp/knowledge-base.json, and 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.