{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artwaste.land/data/the-error-they-share/schema.json",
  "title": "The error they share: one row per attempt to put a question to a model",
  "description": "The schema for asks.jsonl, the verbatim transcript of the experiment on /strata/the-error-they-share/. A row is one of four kinds: an answered ask (it has raw), an ask that failed upstream (upstream: true), an ask the model returned nothing readable for (silent: true), or a single roster note that a model was not served (unserved: true). items.json and results.json are described in README.md; they are single JSON documents, not rows.",
  "type": "object",
  "required": ["ts", "model"],
  "additionalProperties": false,
  "oneOf": [
    {
      "title": "answered",
      "required": ["ts", "item", "model", "condition", "question", "seed", "shown", "shownRoles", "checkedSlot", "raw"],
      "not": { "anyOf": [{ "required": ["upstream"] }, { "required": ["silent"] }, { "required": ["unserved"] }, { "required": ["detail"] }] }
    },
    {
      "title": "upstream fault",
      "required": ["ts", "item", "model", "condition", "question", "seed", "shown", "shownRoles", "checkedSlot", "upstream", "detail"],
      "not": { "anyOf": [{ "required": ["raw"] }, { "required": ["silent"] }, { "required": ["unserved"] }] }
    },
    {
      "title": "silent",
      "required": ["ts", "item", "model", "condition", "question", "seed", "shown", "shownRoles", "checkedSlot", "silent", "detail"],
      "not": { "anyOf": [{ "required": ["raw"] }, { "required": ["upstream"] }, { "required": ["unserved"] }] }
    },
    {
      "title": "model not served",
      "required": ["ts", "model", "unserved", "after", "detail", "note"],
      "not": { "anyOf": [{ "required": ["item"] }, { "required": ["raw"] }, { "required": ["upstream"] }, { "required": ["silent"] }] }
    }
  ],
  "properties": {
    "ts": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$",
      "description": "When ask.mjs wrote the row, in UTC (ISO 8601, milliseconds).",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "item": {
      "type": "string",
      "enum": ["seasons", "far-side", "moon-illusion", "water-blue", "equal-transit", "microwave", "metal-cold", "helium", "glass-flow", "concrete", "veins", "tongue-map", "dog-colour", "metabolism", "head-heat", "ulcers", "gum", "five-second", "cake", "february", "redshifts"],
      "description": "The question's id. Resolves to an entry in items.json.",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "model": {
      "type": "string",
      "enum": ["openai/gpt-oss-20b:free", "google/gemma-4-31b-it:free", "google/gemma-4-26b-a4b-it:free", "cohere/north-mini-code:free", "liquid/lfm-2.5-2.6b:free", "poolside/laguna-s-2.1:free", "poolside/laguna-xs-2.1:free", "nvidia/nemotron-3-ultra-550b-a55b:free", "nvidia/nemotron-3-super-120b-a12b:free", "nvidia/nemotron-3.5-lightning:free", "nvidia/nemotron-3-nano-30b-a3b:free", "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", "nvidia/nemotron-nano-12b-v2-vl:free", "nvidia/nemotron-nano-9b-v2:free", "nvidia/nemotron-3.5-content-safety:free"],
      "description": "The OpenRouter model id the question was put to. The fifteen ids are the roster in research/myth-consensus/models.json.",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "condition": {
      "type": "string",
      "enum": ["A", "B"],
      "description": "The arm. A offers the checked answer, the myth and two distractors (d1, d2). B replaces the myth with a third distractor (d3).",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "question": {
      "type": "string",
      "minLength": 1,
      "description": "The question as sent, copied from items.json.",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "seed": {
      "type": "integer",
      "minimum": 0,
      "maximum": 4294967295,
      "description": "FNV-1a hash of the string item|model|condition. It seeds the mulberry32 generator whose Fisher-Yates shuffle set the option order, so the order is recomputable from the tuple (seedOf and permute in research/myth-consensus/ask.mjs).",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "shown": {
      "type": "array",
      "minItems": 4,
      "maxItems": 4,
      "items": { "type": "string", "minLength": 1 },
      "description": "The four option texts in the order the model saw them, numbered 1 to 4 in the prompt.",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "shownRoles": {
      "type": "array",
      "minItems": 4,
      "maxItems": 4,
      "items": { "type": "string", "enum": ["checked", "myth", "d1", "d2", "d3"] },
      "description": "The role of each option in shown, position for position: checked (the answer this project verified), myth (the popular belief, arm A only), or distractor d1, d2 or d3 (d3 in arm B only).",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "checkedSlot": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4,
      "description": "The 1-based position of the checked answer in shown.",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "raw": {
      "type": "string",
      "minLength": 1,
      "description": "The model's reply, verbatim and unedited. Which option it chose is not stored here: score.mjs applies the published parse rule to this text.",
      "x-origin": "redistributed",
      "x-source": "src:model-replies-via-openrouter"
    },
    "upstream": {
      "const": true,
      "description": "Present when the router or provider failed to reach the model. Counted apart and never scored as the model's silence.",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "silent": {
      "const": true,
      "description": "Present when the model was reached and returned no usable text.",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "detail": {
      "type": "string",
      "minLength": 1,
      "description": "Why no reply was recorded, in the words that came back: an OpenRouter or provider error message, the Node.js timeout message, or the project's worker reporting an empty body with the finish_reason the provider gave.",
      "x-origin": "redistributed",
      "x-source": "src:model-replies-via-openrouter"
    },
    "unserved": {
      "const": true,
      "description": "Present on the one roster row recording that the free tier did not serve a model on the run date, so its remaining asks were not attempted.",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "after": {
      "type": "integer",
      "minimum": 1,
      "description": "On an unserved row: how many consecutive failed attempts preceded the decision to stop asking that model.",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    },
    "note": {
      "type": "string",
      "minLength": 1,
      "description": "On an unserved row: the project's explanation of the row.",
      "x-origin": "built",
      "x-source": "src:aw-myth-consensus"
    }
  }
}
