{"record":{"id":"ebf4469c8d68a306","repo":"deepseek-ai/deepseek-harness","slug":"the-user-dismissed-the-plan-review-to-speak-instea","errorCode":null,"errorMessage":"The user dismissed the plan review to speak instead; stay in plan mode, stop here, and wait for their message.","messagePattern":"The user dismissed the plan review to speak instead; stay in plan mode, stop here, and wait for their message\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/plan/plan-mode/src/index.ts","lineNumber":395,"sourceCode":"            options: [\n              { label: APPROVE_LABEL, description: 'Leave plan mode; the plan is carried out from the next step.' },\n              { label: KEEP_PLANNING_LABEL, description: 'Stay in plan mode; feedback goes back to the model.' },\n            ],\n            // Presentation only: a capable UI renders the plan as a review\n            // decision instead of a generic question, and answers with one of\n            // the labels above either way.\n            intent: { kind: 'plan-review', approve: APPROVE_LABEL },\n          }],\n          agent,\n          signal: exec.signal,\n        }).catch((cause: unknown) => {\n          // A dismissed review is not a failed one: the user took the turn back\n          // to say something the two options do not cover. Say so, because the\n          // generic channel message names ask_user_question, which the model\n          // never called. An abort (turn cancel, provider teardown) keeps its\n          // own message — there is no user to wait for.\n          if (cause instanceof UserQuestionError && cause.code === 'ASK_CANCELLED') {\n            throw new Error('The user dismissed the plan review to speak instead; '\n              + 'stay in plan mode, stop here, and wait for their message.')\n          }\n          throw cause\n        })\n        // A review may outlive this plugin fiber. Without its pre-step listener,\n        // an approved selection could never be appended, so fail and keep planning.\n        if (disposed) {\n          throw new Error('the plan-mode service was reloaded while the plan was under review; present the plan again')\n        }\n        const reviewItems = answer.answers.filter(entry => entry.id === REVIEW_ID)\n        const item = reviewItems.length === 1 ? reviewItems[0] : undefined\n        if (item?.selected.length !== 1 || item.selected[0] !== APPROVE_LABEL || item.custom !== undefined) {\n          const feedback = item?.custom ?? ''\n          throw new Error(feedback === ''\n            ? 'The user chose to keep planning; revise the plan and present it again.'\n            : `The user chose to keep planning; their feedback: ${feedback}`)\n        }\n        // Keep plan guidance for the rest of this assistant tool batch. The","sourceCodeStart":377,"sourceCodeEnd":413,"githubUrl":"https://github.com/deepseek-ai/deepseek-harness/blob/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e/packages/plan/plan-mode/src/index.ts#L377-L413","documentation":"Error \"The user dismissed the plan review to speak instead; stay in plan mode, stop here, and wait for their message.\" thrown in deepseek-ai/deepseek-harness.","triggerScenarios":"Thrown at packages/plan/plan-mode/src/index.ts:395 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Stay in plan mode, stop, and wait for the user's message."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"b150a551b8d465e31e418e1b2eaf5e79bbb7d28e","analyzedAt":"2026-08-24T18:12:29.105Z","schemaVersion":2},"datasetVersion":"2026-08-24T22:17:12.610Z"}