diff --git a/.agents/skills/mock-telegram-testing/SKILL.md b/.agents/skills/mock-telegram-testing/SKILL.md index 3c8a8b5d9..e831d5a8e 100644 --- a/.agents/skills/mock-telegram-testing/SKILL.md +++ b/.agents/skills/mock-telegram-testing/SKILL.md @@ -160,7 +160,7 @@ See `references/scenarios.md` for the full user-journey catalog. Common picks: - **`unlinked-sender`** — message from an unmapped Telegram user is nudged and dropped - **`long-reply-chunking`** — worker reply over 4096 chars splits into multiple messages - **`cancel-button`** — callback_query cancels the running job -- **`routing-confirmation`** — low-confidence route posts a workspace picker; Nevermind is the zero-side-effect live-test path +- **`routing-confirmation`** — low-confidence route posts a workspace picker; Never mind is the zero-side-effect live-test path LLM-judged eval scenarios live in `packages/communication/evals/scenarios/` and run via `pnpm --filter @roomote/communication eval:telegram-scenario`. diff --git a/.agents/skills/mock-telegram-testing/references/scenarios.md b/.agents/skills/mock-telegram-testing/references/scenarios.md index 0903939bb..fad090c08 100644 --- a/.agents/skills/mock-telegram-testing/references/scenarios.md +++ b/.agents/skills/mock-telegram-testing/references/scenarios.md @@ -117,12 +117,12 @@ When the router is unsure (confidence < 0.95, workspace remapped, or all-reposit - Expect: webhook responds `confirmationPending: true`; a compact card "Planning to run this in **{suggested}** — starting in ~5s." with one row of buttons: ✅ Yes (`route_ok:`) and ✖️ Nope (`route_alt:`). Router `fallback` skips the Yes/Nope step and shows the picker directly ("could not confidently pick a workspace") with no auto-start. - Click paths: - ✅ Yes → callback answered `Starting in {workspace}.`, the card is edited in place to "Starting in **{workspace}**." (keyboard removed), task launched. - - ✖️ Nope → the same message is edited into the picker ("Okay — where should I run this?" + one button per workspace + ✖️ Nevermind), re-keyed under a fresh pending-route id so the 5s timer can never fire the suggestion afterwards. The picker waits — no timer. + - ✖️ Nope → the same message is edited into the picker ("Okay — where should I run this?" + one button per workspace + ✖️ Never mind), re-keyed under a fresh pending-route id so the 5s timer can never fire the suggestion afterwards. The picker waits — no timer. - Picker choice (`route_pick::`) → same as Yes but with the chosen workspace. - - ✖️ Nevermind (`route_no:`) → callback answered `Okay — not starting a task.`, card finalized, nothing launches (the safe path for live testing: Nope → Nevermind). + - ✖️ Never mind (`route_no:`) → callback answered `Okay — not starting a task.`, card finalized, nothing launches (the safe path for live testing: Nope → Never mind). - No click → the Yes/Nope card auto-starts the suggestion after ~5s (card edited to "Starting in **{workspace}**." when the timer fires); pickers just expire (15-min Redis TTL). - Click from a different Telegram user → `Only the requester can choose a workspace for this task.` and the pending choice is NOT consumed. -- Assert: state `.messages` (card text edited through the stages, final `reply_markup` empty), `.callbackAnswers`; DB `cloud_jobs` for the launch (or its absence after Nevermind). +- Assert: state `.messages` (card text edited through the stages, final `reply_markup` empty), `.callbackAnswers`; DB `cloud_jobs` for the launch (or its absence after Never mind). - Note: the pending choice is one-shot (`GETDEL`) — a second click on a stale card gets `This choice expired — send the request again.` The 5s window is too short to tap from a phone notification; that is intentional — Nope is for users watching the chat, and the started message's cancel button covers everyone else. ## 16. suggestion-button diff --git a/apps/api/src/handlers/discord/__tests__/routing-confirmation.test.ts b/apps/api/src/handlers/discord/__tests__/routing-confirmation.test.ts index 761e78987..2f1c69135 100644 --- a/apps/api/src/handlers/discord/__tests__/routing-confirmation.test.ts +++ b/apps/api/src/handlers/discord/__tests__/routing-confirmation.test.ts @@ -394,7 +394,7 @@ describe('Discord routing confirmation', () => { 'All repositories', ); expect(buttons.at(-1)).toEqual([ - expect.objectContaining({ text: 'Nevermind' }), + expect.objectContaining({ text: 'Never mind' }), ]); }); diff --git a/apps/api/src/handlers/discord/routing-confirmation.ts b/apps/api/src/handlers/discord/routing-confirmation.ts index 4bd0ed232..df5b1c419 100644 --- a/apps/api/src/handlers/discord/routing-confirmation.ts +++ b/apps/api/src/handlers/discord/routing-confirmation.ts @@ -33,7 +33,7 @@ const DISCORD_CHANNEL_TYPE_PUBLIC_THREAD = 11; const PENDING_ROUTE_TTL_SECONDS = 15 * 60; const PENDING_ROUTE_PREFIX = 'discord:pending_route:'; // Discord supports at most five action rows. Reserve one for All repositories -// and one for Nevermind so every stored option is also visible and actionable. +// and one for Never mind so every stored option is also visible and actionable. const MAX_ENVIRONMENT_OPTIONS = 3; type PendingRouteOption = { @@ -140,7 +140,7 @@ function routeButtons(id: string, options: PendingRouteOption[]) { callbackData: `discord:route:${id}:${index}`, }, ]), - [{ text: 'Nevermind', callbackData: `discord:route:${id}:cancel` }], + [{ text: 'Never mind', callbackData: `discord:route:${id}:cancel` }], ]; } diff --git a/apps/api/src/handlers/telegram/__tests__/index.test.ts b/apps/api/src/handlers/telegram/__tests__/index.test.ts index de18194b5..ca163b9f7 100644 --- a/apps/api/src/handlers/telegram/__tests__/index.test.ts +++ b/apps/api/src/handlers/telegram/__tests__/index.test.ts @@ -1758,7 +1758,7 @@ describe('Telegram webhook handler', () => { buttons: [ [expect.objectContaining({ text: 'Web App' })], [expect.objectContaining({ text: 'All repositories' })], - [expect.objectContaining({ text: '✖️ Nevermind' })], + [expect.objectContaining({ text: '✖️ Never mind' })], ], }), ); @@ -1976,7 +1976,7 @@ describe('Telegram webhook handler', () => { ], [ expect.objectContaining({ - text: '✖️ Nevermind', + text: '✖️ Never mind', callbackData: expect.stringMatching(/^route_no:[\w-]+$/), }), ], @@ -2079,7 +2079,7 @@ describe('Telegram webhook handler', () => { ); }); - it('dismisses the confirmation without launching when Nevermind is clicked', async () => { + it('dismisses the confirmation without launching when Never mind is clicked', async () => { mockTelegramLinkedSender('launch-owner-25'); const pending = JSON.stringify({ launchOwnerUserId: 'launch-owner-25', diff --git a/apps/api/src/handlers/telegram/routing-confirmation.ts b/apps/api/src/handlers/telegram/routing-confirmation.ts index 86f0b5cbd..12366e267 100644 --- a/apps/api/src/handlers/telegram/routing-confirmation.ts +++ b/apps/api/src/handlers/telegram/routing-confirmation.ts @@ -228,7 +228,7 @@ function buildPickerButtons( ]), [ { - text: '✖️ Nevermind', + text: '✖️ Never mind', callbackData: buildTelegramRouteNoCallbackData(pendingRouteId), }, ], diff --git a/packages/communication/src/__tests__/mock-telegram-server.test.ts b/packages/communication/src/__tests__/mock-telegram-server.test.ts index 7442d8595..957cb0b11 100644 --- a/packages/communication/src/__tests__/mock-telegram-server.test.ts +++ b/packages/communication/src/__tests__/mock-telegram-server.test.ts @@ -328,7 +328,7 @@ describe('MockTelegramServer', () => { text: 'Okay — where should I run this?', buttons: [ [{ text: 'web-app', callbackData: 'route_pick:def456UVW012:0' }], - [{ text: '✖️ Nevermind', callbackData: 'route_no:def456UVW012' }], + [{ text: '✖️ Never mind', callbackData: 'route_no:def456UVW012' }], ], }); @@ -339,7 +339,7 @@ describe('MockTelegramServer', () => { expect(message?.reply_markup).toEqual({ inline_keyboard: [ [{ text: 'web-app', callback_data: 'route_pick:def456UVW012:0' }], - [{ text: '✖️ Nevermind', callback_data: 'route_no:def456UVW012' }], + [{ text: '✖️ Never mind', callback_data: 'route_no:def456UVW012' }], ], }); diff --git a/packages/slack/src/block-kit.ts b/packages/slack/src/block-kit.ts index fe63c4ae1..c7e3d843e 100644 --- a/packages/slack/src/block-kit.ts +++ b/packages/slack/src/block-kit.ts @@ -1385,7 +1385,7 @@ export async function showTaskConfiguration({ }, { type: 'button', - text: { type: 'plain_text', text: 'Nevermind', emoji: true }, + text: { type: 'plain_text', text: 'Never mind', emoji: true }, action_id: 'nevermind_task', }, ], @@ -2952,7 +2952,7 @@ export async function handleRoutingRejectNo(payload: SlackInteractivePayload) { } /** - * Handles the "Nevermind" button click on the manual selection UI. + * Handles the "Never mind" button click on the manual selection UI. * Cleans up pending state and replaces the selection message with * a cancellation confirmation so the user knows the task was dropped. */