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

  1. Read the missing list from the error and add an answer for every listed question id using a valid option id.
  2. Re-derive required ids from the questionForm returned by collect_brief and submit all of them.
  3. 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

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


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