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

  1. If the answers legitimately changed, call collect_brief again to start a fresh draft and confirm that one.
  2. If retrying the same confirmation, resend the identical answers.
  3. 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

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


AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12). Data as JSON: /api/errors/e86b97a44537471c. Report an issue: GitHub.