nexu-io/open-design · warning · Error
This Open Design brief was already confirmed with different
Error message
This Open Design brief was already confirmed with different answers.
What it means
A draft may be confirmed more than once but only idempotently: once draft.confirmation is set, every later confirm must reproduce the same answer set. stableAnswerDigest serializes answers (entries sorted by key, values spread) and compares; any difference throws. This prevents a confirmed brief from being silently re-answered.
Source
Thrown at apps/daemon/src/mcp-brief.ts:463
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: 'brief-confirmed',
artifactType: draft.artifactType,
projectTitle: draft.projectTitle,
locale: confirmationLocale,
briefDraftId,
briefConfirmationId: randomUUID(),
confirmedAt: at,View on GitHub (pinned to 5be4028344)
Solutions
- If the answers legitimately changed, call collect_brief again to start a fresh draft and confirm that one.
- If retrying the same confirmation, resend the identical answers.
- Do not mutate the answer set between confirm attempts on one draft.
Example fix
// before: draft already confirmed with refined-tech, now sending warm-human
confirm_brief({ briefDraftId, nonce, answers: { 'website.character': 'warm-human' } })
// after: new intent -> new draft
const fresh = await collect_brief({ artifactType: 'website' })
await confirm_brief({ briefDraftId: fresh.briefDraftId, nonce: fresh.nonce, answers: { 'website.character': 'warm-human' } }) Defensive patterns
Strategy: validation
Try / catch
try {
await confirmBrief(input);
} catch (e) {
if (/already confirmed with different answers/i.test(e.message)) {
const fresh = await collectBrief({ artifactType });
return confirmBrief({ ...input, briefDraftId: fresh.briefDraftId, nonce: fresh.nonce });
}
throw e;
} Prevention
- One draft, one answer set; start a new draft to change answers.
- Cache and replay the exact answers that first succeeded for retries.
- Never mutate answers between confirm attempts on the same draft.
When it happens
Trigger: Calling confirm_brief twice on the same briefDraftId with different option selections; re-confirming after the user changed an answer but reused the draft.
Common situations: Retry logic that mutates answers between attempts; a UI back button that edits then re-submits on the same draft.
Related errors
- pluginWorkflowId requires a validated externalPluginContext
- The Open Design brief has expired or is unknown. Call collec
- The Open Design brief nonce is invalid.
- The Open Design brief is incomplete. Missing: ${missing.join
- artifactType must be one of: ${Object.keys(openDesignBriefCa
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/e86b97a44537471c.
Report an issue: GitHub.