{
  "ran_at": "2026-09-10T15:09:48Z",
  "target": "the ORIGINAL film itself (analysis/original-atomic/ledger.json)",
  "purpose": "sanity check: criteria derived from this film must not fail on this film",
  "criteria_count": 47,
  "results": [
    {
      "id": "C-SCRIPT-01",
      "status": "pass",
      "pass": true,
      "evidence": {
        "first_word_s": 0.0,
        "shots_before_first_word": []
      },
      "note": "film opens on the event, not on establishing shots",
      "on_fail": "Перегенерировать первую сцену: убрать вступительные планы, начать с реплики-события."
    },
    {
      "id": "C-SCRIPT-06",
      "status": "unknown",
      "pass": null,
      "evidence": "no has_product tags on shots",
      "note": "tag shots with has_product in the generated ledger to enable this check",
      "on_fail": "Сдвинуть появление продукта позже и добавить вопрос, который его вызывает."
    },
    {
      "id": "C-STRUCT-04",
      "status": "pass",
      "pass": true,
      "evidence": {
        "last_word_end_s": 321.59,
        "last_shot": "SH110",
        "last_shot_start_s": 322.033,
        "last_shot_duration_s": 3.649
      },
      "note": "the closing card is one silent shot after the last spoken word",
      "on_fail": "Пересобрать финал: перенести карточку за последнее слово и дать ей один непрерывный план."
    },
    {
      "id": "C-STRUCT-05",
      "status": "pass",
      "pass": true,
      "evidence": {
        "min": 1.0,
        "max": 8.2,
        "median": 2.333
      },
      "note": "both long held shots and short inserts present",
      "on_fail": "Перегенерировать/перемонтировать единицы с однородными длинами: удлинить планы с незавершённым действием, подрезать хвосты дублей под короткие вставки."
    },
    {
      "id": "C-BOARD-02",
      "status": "pass",
      "pass": true,
      "evidence": {
        "flagged": [],
        "joins_checked": 90
      },
      "note": "HARD CUTS whose outgoing and incoming shots frame the same subject at the same scale",
      "on_fail": "Заменить один из планов другой крупностью/осью или объединить их в один удержанный план."
    },
    {
      "id": "C-SCENE-02",
      "status": "pass",
      "pass": true,
      "evidence": [
        "SH007",
        "SH008",
        "SH014",
        "SH015",
        "SH016",
        "SH017",
        "SH018",
        "SH019",
        "SH020",
        "SH024",
        "SH025",
        "SH026",
        "SH027",
        "SH028",
        "SH044",
        "SH045",
        "SH046",
        "SH056",
        "SH058",
        "SH086",
        "SH087",
        "SH088",
        "SH089",
        "SH090",
        "SH091",
        "SH092",
        "SH110"
      ],
      "note": "wordless shots >= 1 s",
      "on_fail": "Добавить безмолвный дубль реакции после соответствующей реплики."
    },
    {
      "id": "C-VOICE-01",
      "status": "pass",
      "pass": true,
      "evidence": {
        "median_s": 0.46,
        "max_s": 19.84,
        "count": 40
      },
      "note": "pause before a reply belongs to the asker; instant replies only where speed is the evidence",
      "on_fail": "Перегенерировать реплику с явной инструкцией на паузу перед ответом."
    },
    {
      "id": "C-VOICE-04",
      "status": "external",
      "note": "scripts/production_policy.py::review_output_policy (только пункт «а») + run.py measure (пункт «б» НЕ реализован)"
    },
    {
      "id": "C-VIDEO-04",
      "status": "external",
      "note": "scripts/reference_generation.py::validate_generation_packet"
    },
    {
      "id": "C-EDIT-01",
      "status": "pass",
      "pass": true,
      "evidence": {
        "flagged": [],
        "joins_checked": 90
      },
      "note": "HARD CUTS whose outgoing and incoming shots frame the same subject at the same scale",
      "on_fail": "Объединить в один удержанный план либо вставить план слушателя между ними."
    },
    {
      "id": "C-EDIT-02",
      "status": "pass",
      "pass": true,
      "evidence": {
        "bridged": [
          "SH003",
          "SH004",
          "SH005",
          "SH006",
          "SH023",
          "SH030",
          "SH031",
          "SH032",
          "SH033",
          "SH035",
          "SH038",
          "SH042",
          "SH049",
          "SH051",
          "SH052",
          "SH055",
          "SH060",
          "SH061",
          "SH067",
          "SH069",
          "SH071",
          "SH073",
          "SH074",
          "SH076",
          "SH077",
          "SH078",
          "SH080",
          "SH083",
          "SH085",
          "SH095",
          "SH098",
          "SH099",
          "SH101",
          "SH102",
          "SH104",
          "SH105",
          "SH106",
          "SH107"
        ],
        "needed": 6
      },
      "note": "shots whose first word starts before the incoming join (J-cut)",
      "on_fail": "Сдвинуть точку склейки на 0.1–0.4 s позже начала реплики."
    },
    {
      "id": "C-EDIT-03",
      "status": "pass",
      "pass": true,
      "evidence": [
        {
          "shot": "SH002",
          "lead_s": 0.247
        },
        {
          "shot": "SH010",
          "lead_s": 0.18
        },
        {
          "shot": "SH011",
          "lead_s": 0.173
        },
        {
          "shot": "SH043",
          "lead_s": 0.277
        },
        {
          "shot": "SH047",
          "lead_s": 0.19
        },
        {
          "shot": "SH048",
          "lead_s": 0.21
        },
        {
          "shot": "SH050",
          "lead_s": 0.257
        },
        {
          "shot": "SH054",
          "lead_s": 0.303
        },
        {
          "shot": "SH096",
          "lead_s": 0.17
        },
        {
          "shot": "SH097",
          "lead_s": 0.183
        },
        {
          "shot": "SH100",
          "lead_s": 0.263
        },
        {
          "shot": "SH108",
          "lead_s": 0.21
        }
      ],
      "note": "shots whose first word starts 0.15-0.40 s after the cut into them",
      "on_fail": "Сдвинуть склейку раньше начала реплики слушателя."
    },
    {
      "id": "C-EDIT-04",
      "status": "pass",
      "pass": true,
      "evidence": {
        "hard cut": 90,
        "fade-through-black": 8,
        "dissolve": 11
      },
      "note": "join kinds present; adjudicate each one against its scene boundary by hand",
      "on_fail": "Заменить тип перехода в монтаже."
    },
    {
      "id": "C-EDIT-05",
      "status": "pass",
      "pass": true,
      "evidence": [
        "SH007",
        "SH008",
        "SH014",
        "SH015",
        "SH016",
        "SH017",
        "SH018",
        "SH019",
        "SH020",
        "SH024",
        "SH025",
        "SH026",
        "SH027",
        "SH028",
        "SH044",
        "SH045",
        "SH046",
        "SH056",
        "SH058",
        "SH086",
        "SH087",
        "SH088",
        "SH089",
        "SH090",
        "SH091",
        "SH092",
        "SH110"
      ],
      "note": "wordless shots >= 1 s",
      "on_fail": "Добавить безмолвные дубли реакции."
    },
    {
      "id": "C-EDIT-07",
      "status": "pass",
      "pass": true,
      "evidence": {
        "min": 1.0,
        "max": 8.2,
        "median": 2.333
      },
      "note": "both long held shots and short inserts present",
      "on_fail": "Перемонтировать: удлинить единицы объяснения, подрезать хвосты дублей под короткие вставки."
    }
  ],
  "found_and_fixed": [
    "C-EDIT-01/C-BOARD-02 first compared the set of SPEAKERS overlapping each shot, so every shot/reverse-shot pair was flagged and the original failed its own criterion. Rewritten to compare the framed subject and the scale reported by the join reading.",
    "The rewritten check still flagged J106 (300.1 s): the same pair at the same scale on both sides. Inspection showed a DISSOLVE between two different locations inside the closing montage, i.e. legitimate time compression. The check now applies to hard cuts only.",
    "The adversarial pass then found that several criteria set thresholds stricter than the source itself (zero mid-gesture joins vs >=23 measured; zero continuity breaks vs 9 measured). Those thresholds were relaxed to what the source actually does.",
    "The same pass found that the ASR word clock was hardcoded to English, which would have silently degraded every measured check on a Ukrainian adaptation. run.py now takes --language and records both the requested and the detected language."
  ],
  "note": "A criterion that fails here is mis-specified. model/human criteria are not exercised by this self-test. C-SCRIPT-06 returns unknown on the original because product tagging is an input of a generated ledger, not of the source ledger."
}
