{
  "schemaVersion": 1,
  "experimentId": "controlled-prism-renderer-ab-v1",
  "concept": "Explain why white light bends in glass and separates into colors when it leaves a prism.",
  "learnerOutcome": "Recognize refraction and dispersion without introducing equations.",
  "audience": "A curious beginner seeing refraction for the first time.",
  "mustBeTrue": [
    "Ray direction and color ordering must match the prism orientation."
  ],
  "truthGrounding": {
    "evidencePolicy": "model_cited_web",
    "documentEvidence": {
      "status": "not_supplied",
      "exactQuoteVerified": false
    },
    "premises": [
      {
        "id": "premise-1",
        "statement": "Light refracts at both air-glass boundaries because its speed and refractive index change.",
        "status": "supported",
        "importance": "critical",
        "sourceRefs": [
          "source-2",
          "source-4"
        ]
      },
      {
        "id": "premise-2",
        "statement": "A prism separates white light because glass refracts different wavelengths by different amounts.",
        "status": "supported",
        "importance": "critical",
        "sourceRefs": [
          "source-4"
        ]
      }
    ],
    "sources": [
      {
        "id": "source-2",
        "url": "https://science.nasa.gov/learn/basics-of-space-flight/chapter6-6/",
        "evidenceKind": "model_cited_web",
        "exactQuoteVerified": true,
        "exactQuote": "The path of electromagnetic waves moving from air to glass at an angle will be bent toward the perpendicular."
      },
      {
        "id": "source-4",
        "url": "https://science.nasa.gov/ems/03_behaviors/",
        "evidenceKind": "model_cited_web",
        "exactQuoteVerified": true,
        "exactQuote": "Different wavelengths of light are slowed at different rates, which causes them to bend at different angles."
      }
    ]
  },
  "durationSeconds": 30,
  "approvedStoryboard": {
    "title": "Why white light bends and separates in a prism.",
    "teachingPromise": "See refraction change the beam's direction and dispersion separate its colors.",
    "renderer": "svg-diagram",
    "assetStrategy": "Use clean vector rays and a labeled prism; no external assets are needed.",
    "approvalQuestion": "Does white light enter, refract by color, then leave as an ordered spectrum?"
  },
  "beats": [
    {
      "id": "beat-1",
      "startSeconds": 0,
      "endSeconds": 7.5,
      "instruction": "White light enters the prism.",
      "title": "White light enters the prism.",
      "appears": "White light approaches one face of a glass prism.",
      "changes": "The beam crosses from air into glass at the prism surface.",
      "whyItTeaches": "The new medium establishes the condition for refraction."
    },
    {
      "id": "beat-2",
      "startSeconds": 7.5,
      "endSeconds": 15,
      "instruction": "The light bends toward the entry normal.",
      "title": "The beam refracts inside the glass.",
      "appears": "The prism surface normal appears where the beam enters.",
      "changes": "Inside the glass, the beam changes direction toward the normal.",
      "whyItTeaches": "The direction change identifies refraction without equations."
    },
    {
      "id": "beat-3",
      "startSeconds": 15,
      "endSeconds": 22.5,
      "instruction": "Violet bends more than red, and the colors separate.",
      "title": "Different colors take different paths.",
      "appears": "The beam's color components become visible within the prism.",
      "changes": "Violet bends more than red, so the color paths begin to separate.",
      "whyItTeaches": "The unequal bending identifies dispersion as color-dependent refraction."
    },
    {
      "id": "beat-4",
      "startSeconds": 22.5,
      "endSeconds": 30,
      "instruction": "The colors exit away from the normal in an ordered spectrum toward the prism base.",
      "title": "The colors leave as an ordered spectrum.",
      "appears": "The separated color paths reach the prism's second face.",
      "changes": "Each color bends away from the normal, widening the ordered spectrum toward the prism base.",
      "whyItTeaches": "The exit preserves the prism's color order and makes the separation easy to recognize."
    }
  ],
  "designContract": {
    "visualDirection": "Warm textured cream paper with a restrained ink palette.",
    "palette": {
      "cream": "#F4EEDC",
      "paper": "#FBF7EA",
      "ink": "#18342B",
      "green": "#1F6A4A",
      "amber": "#F2A83B",
      "white": "#FFFDF4",
      "spectrumRed": "#D94A3A",
      "spectrumOrange": "#E7832F",
      "spectrumYellow": "#D9AA2F",
      "spectrumBlue": "#327AA2",
      "spectrumViolet": "#7553B8"
    },
    "lineWork": "Use clean, consistent line weights.",
    "lineWeightsPx": {
      "prismOutline": 9,
      "normalGuide": 5,
      "lightRay": 16
    },
    "typography": {
      "hierarchy": "Use one identical, restrained typography hierarchy throughout.",
      "fontFamily": "Noto Sans",
      "bundledFontFiles": [
        "NotoSans-Regular.ttf",
        "NotoSans-ExtraBold.ttf"
      ]
    },
    "captionTreatment": {
      "fontSizePx": 42,
      "fontWeight": 800,
      "lineHeight": 1.16,
      "textColor": "#18342B",
      "background": "transparent",
      "amberRuleColor": "#F2A83B",
      "amberRuleThicknessPx": 8,
      "instruction": "Set large dark-ink text directly on cream with an amber rule; never use a filled caption slab."
    },
    "forbidden": [
      "Glossy apparatus or clip-art.",
      "Black caption slabs.",
      "Blank callouts.",
      "End-state elements visible at frame 0."
    ],
    "camera": "Use one fixed camera with no cuts, zooms, or pans.",
    "staging": "Use one persistent prism tableau whose camera, prism, light source, normals, and explanatory regions do not jump between beats."
  },
  "explanationContract": {
    "equations": "Do not introduce equations, formulas, variables, or quantitative scales.",
    "focus": "Keep one learner focus at a time and let it become readable before introducing the next focus.",
    "captions": "Every caption must be a complete grammatical sentence; compact object labels may be noun phrases.",
    "overlap": "Reject unintended collisions, crossings, or overlap that obscures text or essential geometry. Allow spectrum rays to coincide intentionally on the common incident path and at the exact shared interface endpoint before visible separation.",
    "refraction": "A claimed refraction must be visible as incoming and outgoing non-collinear straight segments meeting exactly at the visible interface.",
    "dispersion": "Keep undivided light neutral or white until separation is visible, then reveal distinct colors together; never depict white light as only violet or any other single spectrum color."
  },
  "experimentInvariants": {
    "independentVariable": "renderer",
    "fixedInputs": "Use this exact packet byte-for-byte for every track. Do not add, remove, reinterpret, or reorder beats, facts, timing, staging, design constraints, review criteria, or execution budgets.",
    "author": {
      "model": "gpt-5.6-sol",
      "reasoningEffort": "high"
    },
    "critic": {
      "model": "gpt-5.6-sol",
      "reasoningEffort": "high",
      "independentFromAuthor": true
    },
    "attemptBudget": {
      "initialCandidates": 1,
      "criticReviewsPerCandidate": 1,
      "repairsAfterNoGo": 1,
      "maximumPlayableCandidates": 2
    },
    "traceContract": {
      "requiredPerNode": [
        "input",
        "output",
        "startedAt",
        "completedAt",
        "durationMs",
        "provider",
        "model",
        "reasoningEffort",
        "inputTokens",
        "outputTokens",
        "attempts",
        "verdict"
      ],
      "artifactRule": "Surface each playable candidate before its automated review, including candidates later marked NO_GO."
    }
  },
  "criticContract": {
    "defaultDecision": "NO_GO",
    "reviewAuthority": "Judge chronological rendered pixels against this packet; source code is diagnostic only.",
    "freshReview": "Review every candidate as a fresh whole film, including every learner-visible claim and the full ordered reveal.",
    "blockingRubric": [
      "All four beats are visibly demonstrated in order within their assigned intervals.",
      "The ray visibly changes direction at each claimed interface; normals or labels alone are not proof.",
      "The entry bend is toward the visible normal, violet bends more than red, and the exiting ordered spectrum bends away from the visible normal toward the prism base.",
      "White light remains neutral or white until a simultaneous, visibly distinct color separation appears.",
      "No equation, formula, variable, quantitative scale, or unsupported learner-visible claim appears.",
      "No unintended learner-visible collision, crossing, obscuring overlap, simultaneous new-focus reveal, caption fragment, blank callout, glossy apparatus, clip-art, black caption slab, staging jump, or frame-0 end state appears; intentional coincident rays on the common incident path and exact shared interface endpoint are allowed before visible separation.",
      "The warm textured cream paper, restrained ink palette, consistent line weights, typography hierarchy, fixed camera, and persistent staging remain legible for the full film."
    ],
    "findingContract": "Every learner-visible P0, P1, or P2 finding requires NO_GO and must include frame, problem, instructional impact, required change, and required proof."
  },
  "frameSamplingContract": {
    "fps": 30,
    "fullFilm": true,
    "chronological": true,
    "deduplicate": false,
    "baseline": {
      "firstFrame": 0,
      "lastFrame": 885,
      "stepFrames": 15
    },
    "beatBoundaryFrames": [
      225,
      450,
      675
    ],
    "beatBoundaryOffsets": [
      -12,
      -6,
      0,
      6,
      12
    ],
    "selection": "Use the unique sorted union of baseline frames and every in-range beat-boundary frame plus offset."
  }
}
