nexu-io/open-design · warning · Error
The Open Design brief is incomplete. Missing
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.
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
- artifactType must be one of
- must be a non-empty string
- must be an object
- pluginWorkflowId requires a validated externalPluginContext
- projectTitle must be at most 256 characters
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/c15039e6990078f5.
Report an issue: GitHub.
Appendix: 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)