Operator UAT 2026-05-20 rejected the build because the OS notification fired
on `chrome.runtime.onStartup` ("Recording started. I'm watching the last 30
seconds.") implied recording had auto-started when in fact recording was
not running. Per Phase 1 always-on charter recording does NOT auto-start;
the notification is the gesture surface that invites the operator to start
one (notifications.onClicked → startVideoCapture, src/background/index.ts:1038).
Root cause: a single i18n key `notifStartup` conflated the pre-recording
CTA-with-gesture path (the only path actually wired today) and a future
post-manual-start confirmation path. The key's own `.description` field
acknowledged the conflation. Operator-facing text leaned toward the
confirmation phrasing.
Fix (key split, no behavior change):
- `notifStartupCta` — EN: "Mokosh ready. Click to start a recording." /
RU: "Mokosh готов. Нажмите, чтобы начать запись." — wired into the
onStartup handler.
- `notifRecordingStarted` — preserves the original text ("Recording
started. I'm watching the last 30 seconds." / "Запись запущена…") for
a future post-manual-start confirmation flow.
- Fallback constant renamed `NOTIF_STARTUP_FALLBACK` →
`NOTIF_STARTUP_CTA_FALLBACK`; value updated to match the new CTA text.
- Inline test comment in tests/background/onstartup-notification.test.ts
refreshed to reference the new key + fallback. Assertion regex
/recording|recor|click/i covers both fallback + resolved locale variants,
no logic change.
Notification behavior preserved: same id prefix `mokosh-startup-`, same
priority, same icon, same onClicked → startVideoCapture wiring. No new
test-mode symbols (FORBIDDEN_HOOK_STRINGS inventory stays at 12).
Files modified:
- _locales/en/messages.json
- _locales/ru/messages.json
- src/background/index.ts
- tests/background/onstartup-notification.test.ts
Verification:
- npx vitest run --exclude tests/build/** --exclude tests/background/no-test-hooks-in-prod-bundle.test.ts: 104/104 GREEN
- npx vitest run tests/i18n/ tests/background/onstartup-notification.test.ts: 18/18 GREEN (locale-parity 4/4 + onstartup-notification 14/14)
- npx tsc --noEmit clean on src/background/index.ts
The 2 build-dependent vitest gates (tests/build/no-remote-fonts.test.ts +
tests/background/no-test-hooks-in-prod-bundle.test.ts) and npm run test:uat
are deferred to orchestrator-level re-verification after the parallel
Plan 01-10 mark-bundling fix also lands (operator-UAT re-spawn coordinated
by orchestrator).
Debug record: .planning/debug/resolved/01-09-startup-notification-misleading-text.md
Operator UAT rejection event: 2026-05-20
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
71 lines
3.6 KiB
JSON
71 lines
3.6 KiB
JSON
{
|
|
"extName": {
|
|
"message": "Mokosh — Session Capture",
|
|
"description": "manifest.json:name; surfaces in chrome://extensions, Web Store, right-click menus, and notification titles. Per brand-decisions-v1.md D-07 (override of branding draft A: 'Mokosh' alone). Operator-facing purpose explicit."
|
|
},
|
|
"extDesc": {
|
|
"message": "Thirty seconds ago, always at hand.",
|
|
"description": "manifest.json:description; tagline per brand-decisions-v1.md D-08. Read in Web Store + chrome://extensions card."
|
|
},
|
|
"tooltipOff": {
|
|
"message": "Mokosh — click to start recording",
|
|
"description": "Toolbar action title (chrome.action.setTitle) in OFF state. Click triggers chrome.action.onClicked → startVideoCapture per Plan 01-09 D-16-toolbar."
|
|
},
|
|
"tooltipRecPrefix": {
|
|
"message": "Mokosh — recording",
|
|
"description": "Toolbar action title prefix in REC state. The SW concatenates ' (MM:SS)' at runtime via formatElapsed(seconds) — see src/background/index.ts."
|
|
},
|
|
"tooltipErr": {
|
|
"message": "Mokosh — recording error, click to recover",
|
|
"description": "Toolbar action title in ERROR state. Click reattempts startVideoCapture."
|
|
},
|
|
"popupSavePrompt": {
|
|
"message": "Save error report?",
|
|
"description": "Popup heading copy (currently unused; reserved for future popup layouts that expose the question explicitly)."
|
|
},
|
|
"popupSaveCta": {
|
|
"message": "Save report",
|
|
"description": "Popup primary CTA button text (idle state). Triggers SAVE_ARCHIVE message to SW."
|
|
},
|
|
"popupSaveDone": {
|
|
"message": "Archive saved to Downloads.",
|
|
"description": "Popup status message after SAVE_ARCHIVE success. Used in the saveArchive success branch."
|
|
},
|
|
"popupSaving": {
|
|
"message": "Saving...",
|
|
"description": "Popup CTA text while SAVE_ARCHIVE is in flight."
|
|
},
|
|
"popupSaveDoneShort": {
|
|
"message": "Done ✓",
|
|
"description": "Popup CTA text immediately after SAVE_ARCHIVE success (3-second transient before returning to idle)."
|
|
},
|
|
"popupEmptyState": {
|
|
"message": "Open recording via the extension icon",
|
|
"description": "Popup empty-state status text shown when popup loads without an active recording (rare under Plan 01-09 SAVE-only charter)."
|
|
},
|
|
"popupInfoText": {
|
|
"message": "Last 30 s video + 10 min log",
|
|
"description": "Popup info-text below the SAVE button. Brief explanation of what the archive contains."
|
|
},
|
|
"notifStartupCta": {
|
|
"message": "Mokosh ready. Click to start a recording.",
|
|
"description": "Notification body for the onStartup flow — CTA-with-gesture invite. Notification title is extName. Per Phase 1 always-on charter: recording does NOT auto-start; this notification is the gesture surface."
|
|
},
|
|
"notifRecordingStarted": {
|
|
"message": "Recording started. I'm watching the last 30 seconds.",
|
|
"description": "Notification body fired AFTER recording successfully starts via startVideoCapture. Notification title is extName."
|
|
},
|
|
"notifRecovery": {
|
|
"message": "Recording resumed. Buffer refilling.",
|
|
"description": "Notification body for the post-RECORDING_ERROR recovery flow. The notification title is extName."
|
|
},
|
|
"welcomeHeroRu": {
|
|
"message": "Тридцать секунд назад, всегда под рукой.",
|
|
"description": "Welcome page hero — Russian-quoted text (rendered alongside the English version in parallel-text layout regardless of locale)."
|
|
},
|
|
"welcomeHeroEn": {
|
|
"message": "Thirty seconds ago, always at hand.",
|
|
"description": "Welcome page hero — English text (rendered alongside the Russian version in parallel-text layout)."
|
|
}
|
|
}
|