nexu-io/open-design · warning · Error
The Open Design brief is incomplete. Missing: ${missing.join
Error message
The Open Design brief is incomplete. Missing: ${missing.join(', ')}. What it means
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.
Source
Thrown at apps/daemon/src/mcp-brief.ts:456
throw new Error(
'The Open Design brief has expired or is unknown. Call collect_brief again.',
);
}
if (draft.nonce !== nonce) {
throw new Error('The Open Design brief nonce is invalid.');
}
const submittedAnswers = readAnswerRecord(input.answers, 'answers');
const mergedAnswers: UnknownRecord = {
...draft.knownAnswers,
...submittedAnswers,
};
const decision = collectOpenDesignBrief({
artifactType: draft.artifactType,
knownAnswers: mergedAnswers,
});
if (!decision.complete) {
const missing = decision.questions.map((question) => question.id);
throw new Error(
`The Open Design brief is incomplete. Missing: ${missing.join(', ')}.`,
);
}
const confirmationAnswersDigest = stableAnswerDigest(decision.answers);
if (draft.confirmation) {
if (draft.confirmationAnswersDigest !== confirmationAnswersDigest) {
throw new Error(
'This Open Design brief was already confirmed with different answers.',
);
}
return draft.confirmation;
}
const confirmationLocale =
draft.localeSource === 'fallback'
? readBriefLocale(input.locale)
: draft.locale;
const confirmation: LocalMcpBriefConfirmation = {View on GitHub (pinned to 5be4028344)
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.
Example fix
// before: missing website.character
confirm_brief({ briefDraftId, nonce, answers: { 'website.goal': 'launch-product', 'website.scope': 'focused-landing' } })
// after
confirm_brief({ briefDraftId, nonce, answers: {
'website.goal': 'launch-product',
'website.scope': 'focused-landing',
'website.character': 'refined-tech',
} }) Defensive patterns
Strategy: validation
Validate before calling
const required = questionForm.questions.map((q) => q.id);
const missing = required.filter((id) => !answers[id]);
if (missing.length) {
throw new Error(`brief still missing: ${missing.join(', ')}`);
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: Agent only partially filled the form; the questionForm from collect_brief was not consulted; answers keyed by display label instead of question id.
Related errors
- pluginWorkflowId requires a validated externalPluginContext
- artifactType must be one of: ${Object.keys(openDesignBriefCa
- projectTitle must be at most 256 characters
- ${field} must be a non-empty string
- ${field} must be an object
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/c15039e6990078f5.
Report an issue: GitHub.