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
4.2 KiB
JSON
71 lines
4.2 KiB
JSON
{
|
||
"extName": {
|
||
"message": "Mokosh — Запись сессии",
|
||
"description": "manifest.json:name; отображается в chrome://extensions, Web Store, контекстных меню. Per brand-decisions-v1.md D-07."
|
||
},
|
||
"extDesc": {
|
||
"message": "Тридцать секунд назад, всегда под рукой.",
|
||
"description": "manifest.json:description; слоган per brand-decisions-v1.md D-08."
|
||
},
|
||
"tooltipOff": {
|
||
"message": "Mokosh — щёлкните, чтобы начать запись",
|
||
"description": "Подсказка кнопки на панели инструментов в режиме OFF. Click triggers chrome.action.onClicked → startVideoCapture."
|
||
},
|
||
"tooltipRecPrefix": {
|
||
"message": "Mokosh — идёт запись",
|
||
"description": "Подсказка кнопки в режиме REC; SW добавляет ' (MM:SS)' через formatElapsed(seconds)."
|
||
},
|
||
"tooltipErr": {
|
||
"message": "Mokosh — ошибка записи, щёлкните для восстановления",
|
||
"description": "Подсказка кнопки в режиме ERROR. Click reattempts startVideoCapture."
|
||
},
|
||
"popupSavePrompt": {
|
||
"message": "Сохранить отчёт об ошибке?",
|
||
"description": "Заголовок попапа (зарезервировано для будущих макетов попапа с явным вопросом)."
|
||
},
|
||
"popupSaveCta": {
|
||
"message": "Сохранить отчёт",
|
||
"description": "Текст основной CTA-кнопки попапа (idle state). Триггерит SAVE_ARCHIVE."
|
||
},
|
||
"popupSaveDone": {
|
||
"message": "Архив сохранён в Загрузки.",
|
||
"description": "Статусное сообщение попапа после успешного SAVE_ARCHIVE."
|
||
},
|
||
"popupSaving": {
|
||
"message": "Сохраняю...",
|
||
"description": "Текст CTA-кнопки попапа во время выполнения SAVE_ARCHIVE."
|
||
},
|
||
"popupSaveDoneShort": {
|
||
"message": "Готово! ✓",
|
||
"description": "Текст CTA-кнопки попапа сразу после успешного SAVE_ARCHIVE (3 секунды до возврата в idle)."
|
||
},
|
||
"popupEmptyState": {
|
||
"message": "Откройте запись через иконку расширения",
|
||
"description": "Empty-state статус попапа когда попап открыт без активной записи (редко в режиме SAVE-only из Plan 01-09)."
|
||
},
|
||
"popupInfoText": {
|
||
"message": "Последние 30 сек видео + 10 мин лога",
|
||
"description": "Info-text под SAVE-кнопкой. Краткое описание содержимого архива."
|
||
},
|
||
"notifStartupCta": {
|
||
"message": "Mokosh готов. Нажмите, чтобы начать запись.",
|
||
"description": "Тело уведомления для onStartup — CTA с жестом активации. Заголовок — extName. Per always-on charter: запись не запускается автоматически."
|
||
},
|
||
"notifRecordingStarted": {
|
||
"message": "Запись запущена. Я слежу за последними 30 секундами.",
|
||
"description": "Тело уведомления, отправляемое ПОСЛЕ успешного старта записи через startVideoCapture. Заголовок — extName."
|
||
},
|
||
"notifRecovery": {
|
||
"message": "Запись возобновлена. Буфер снова заполняется.",
|
||
"description": "Тело уведомления после RECORDING_ERROR recovery. Заголовок — extName."
|
||
},
|
||
"welcomeHeroRu": {
|
||
"message": "Тридцать секунд назад, всегда под рукой.",
|
||
"description": "Welcome page hero — Russian text (показывается рядом с английским в parallel-text layout)."
|
||
},
|
||
"welcomeHeroEn": {
|
||
"message": "Thirty seconds ago, always at hand.",
|
||
"description": "Welcome page hero — English text (показывается рядом с русским в parallel-text layout)."
|
||
}
|
||
}
|