{"record":{"id":"bdc615301501c976","repo":"Yeachan-Heo/oh-my-codex","slug":"sandbox-md-frontmatter-evaluator-format-is-require","errorCode":null,"errorMessage":"sandbox.md frontmatter evaluator.format is required and must be json in autoresearch v1.","messagePattern":"sandbox\\.md frontmatter evaluator\\.format is required and must be json in autoresearch v1\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/autoresearch/contracts.ts","lineNumber":169,"sourceCode":"\n  if (!evaluatorRaw || typeof evaluatorRaw !== 'object' || Array.isArray(evaluatorRaw)) {\n    throw contractError(EVALUATOR_BLOCK_ERROR);\n  }\n\n  const evaluator = evaluatorRaw as { command?: unknown; format?: unknown; keep_policy?: unknown };\n  const command = typeof evaluator.command === 'string'\n    ? evaluator.command.trim()\n    : '';\n  const format = typeof evaluator.format === 'string'\n    ? evaluator.format.trim().toLowerCase()\n    : '';\n  const keepPolicy = parseKeepPolicy(evaluator.keep_policy);\n\n  if (!command) {\n    throw contractError(EVALUATOR_COMMAND_ERROR);\n  }\n  if (!format) {\n    throw contractError(EVALUATOR_FORMAT_REQUIRED_ERROR);\n  }\n  if (format !== 'json') {\n    throw contractError(EVALUATOR_FORMAT_JSON_ERROR);\n  }\n\n  return {\n    frontmatter: parsedFrontmatter,\n    evaluator: {\n      command,\n      format: 'json',\n      ...(keepPolicy ? { keep_policy: keepPolicy } : {}),\n    },\n    body,\n  };\n}\n\nexport function parseEvaluatorResult(raw: string): AutoresearchEvaluatorResult {\n  let parsed: unknown;","sourceCodeStart":151,"sourceCodeEnd":187,"githubUrl":"https://github.com/Yeachan-Heo/oh-my-codex/blob/3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2/src/autoresearch/contracts.ts#L151-L187","documentation":"parseSandboxContract throws EVALUATOR_FORMAT_REQUIRED_ERROR when evaluator.format is absent or trims to empty. Autoresearch v1 requires the evaluator's output format to be declared explicitly; there is no default.","triggerScenarios":"Evaluator block with command but no 'format:' line, or 'format:' with only whitespace.","commonSituations":"Assuming json is the implicit default; deleting the format line while editing; copy-paste from an older template that omitted format.","solutions":["Add 'format: json' nested under evaluator.","Confirm the line is present and non-empty (only 'json' is accepted in v1)."],"exampleFix":"# before\nevaluator:\n  command: ./evaluate.sh\n\n# after\nevaluator:\n  command: ./evaluate.sh\n  format: json","handlingStrategy":"validation","validationCode":"function evaluatorFormatPresent(content: string): boolean {\n  return /^[ \\t]+format:\\s*\\S+/m.test(content);\n}","typeGuard":"const hasFormat = (ev: { format?: unknown }): boolean =>\n  typeof ev.format === 'string' && ev.format.trim().length > 0;","tryCatchPattern":"try {\n  parseSandboxContract(content);\n} catch (err) {\n  if ((err as Error).message.includes('evaluator.format is required')) {\n    // add 'format: json' under evaluator\n  }\n  throw err;\n}","preventionTips":["Never assume a default format; always declare 'format: json'.","Keep a template sandbox.md and copy it for new missions."],"tags":["yaml","frontmatter","evaluator","required-field"],"backgroundTag":"missing-required-field","analyzedSha":"3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2","analyzedAt":"2026-08-27T22:18:39.783Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}