{"record":{"id":"c15039e6990078f5","repo":"nexu-io/open-design","slug":"the-open-design-brief-is-incomplete-missing-mi","errorCode":null,"errorMessage":"The Open Design brief is incomplete. Missing: ${missing.join(', ')}.","messagePattern":"The Open Design brief is incomplete\\. Missing: (.+?)\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"apps/daemon/src/mcp-brief.ts","lineNumber":456,"sourceCode":"        throw new Error(\n          'The Open Design brief has expired or is unknown. Call collect_brief again.',\n        );\n      }\n      if (draft.nonce !== nonce) {\n        throw new Error('The Open Design brief nonce is invalid.');\n      }\n      const submittedAnswers = readAnswerRecord(input.answers, 'answers');\n      const mergedAnswers: UnknownRecord = {\n        ...draft.knownAnswers,\n        ...submittedAnswers,\n      };\n      const decision = collectOpenDesignBrief({\n        artifactType: draft.artifactType,\n        knownAnswers: mergedAnswers,\n      });\n      if (!decision.complete) {\n        const missing = decision.questions.map((question) => question.id);\n        throw new Error(\n          `The Open Design brief is incomplete. Missing: ${missing.join(', ')}.`,\n        );\n      }\n      const confirmationAnswersDigest = stableAnswerDigest(decision.answers);\n      if (draft.confirmation) {\n        if (draft.confirmationAnswersDigest !== confirmationAnswersDigest) {\n          throw new Error(\n            'This Open Design brief was already confirmed with different answers.',\n          );\n        }\n        return draft.confirmation;\n      }\n\n      const confirmationLocale =\n        draft.localeSource === 'fallback'\n          ? readBriefLocale(input.locale)\n          : draft.locale;\n      const confirmation: LocalMcpBriefConfirmation = {","sourceCodeStart":438,"sourceCodeEnd":474,"githubUrl":"https://github.com/nexu-io/open-design/blob/5be4028344c2eb4c667c5a97bda8f750c5597ef7/apps/daemon/src/mcp-brief.ts#L438-L474","documentation":"confirm_brief re-runs collectOpenDesignBrief over the merged answers (draft knownAnswers plus submitted answers) and throws when decision.complete is false. The error lists the question ids still unanswered, taken from the catalog for the draft's artifactType. Each artifactType (website, product-prototype, ...) has 2-3 required choice questions, all needing a valid option id.","triggerScenarios":"Submitting an answers object that omits one or more required question ids (e.g. website.goal, website.scope, website.character); sending ids from a different artifactType; sending the question id but no valid option id.","commonSituations":"Agent only partially filled the form; the questionForm from collect_brief was not consulted; answers keyed by display label instead of question id.","solutions":["Read the missing list from the error and add an answer for every listed question id using a valid option id.","Re-derive required ids from the questionForm returned by collect_brief and submit all of them.","Confirm with the same artifactType whose questionForm you collected."],"exampleFix":"// before: missing website.character\nconfirm_brief({ briefDraftId, nonce, answers: { 'website.goal': 'launch-product', 'website.scope': 'focused-landing' } })\n\n// after\nconfirm_brief({ briefDraftId, nonce, answers: {\n  'website.goal': 'launch-product',\n  'website.scope': 'focused-landing',\n  'website.character': 'refined-tech',\n} })","handlingStrategy":"validation","validationCode":"const required = questionForm.questions.map((q) => q.id);\nconst missing = required.filter((id) => !answers[id]);\nif (missing.length) {\n  throw new Error(`brief still missing: ${missing.join(', ')}`);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Drive confirm from the questionForm returned by collect_brief, not from memory.","Map each question id to one of its listed option ids.","Confirm with the same artifactType whose questionForm you collected."],"tags":["mcp","brief","validation"],"backgroundTag":null,"analyzedSha":"5be4028344c2eb4c667c5a97bda8f750c5597ef7","analyzedAt":"2026-08-12T12:03:58.812Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}