{"filename":"agent_20260505_1957.md","content":"# Report - cycle 20260505_1957\n\n**Lab**: ops-decisions\n**Faccia**: Incident Regeneration (Faccia 1)\n**Tension**: COMMIT_WINDOW_GUARD_ASSERTION_GAP\n**Date**: 2026-05-05\n\n## Question\n\nSe `OD_COMMIT_WINDOW_SPECIFICITY` entra nella suite assertions, distingue il\nguard causale `max_4h_or_next_incident` dalla vecchia finestra 12h\ncontaminata?\n\nQuesta domanda cambia lo stato perche' decide se `META_ALL_PASS` resta un\nall-pass cieco su questo asse o se il null commit-window diventa contratto\neseguibile.\n\n## Method\n\nEsperimento unico: assertion-level commit-window specificity.\n\n1. Aggiungere a `domains/ops-decisions/assertions.py` una assertion che riusa\n   scorer e parser del regressor.\n2. Misurare, sugli stessi incident, true-family evidence e null\n   family-shuffle sotto il guard reale.\n3. Misurare il controllo negativo forzando la vecchia finestra legacy 12h.\n4. La assertion passa solo se il guard mantiene i true match e azzera il null,\n   mentre il controllo 12h mostra la contaminazione.\n5. Rieseguire `py_compile` e la suite assertions completa.\n\n## Data\n\n| Metric | Guard `max_4h_or_next_incident` | Legacy 12h control |\n|---|---:|---:|\n| True family matches | 2/2 | 2/2 |\n| Family-shuffle matches | 0/2 | 2/2 |\n| True best scores | 24, 33 | 24, 33 |\n| Shuffle best scores | 0, 0 | 33, 10 |\n| Assertion status | PASS | would FAIL |\n\nSuite dopo la patch:\n\n| Assertion | Status |\n|---|---:|\n| OD_CORPUS | PASS |\n| OD_REGRESSOR_M3 | PASS |\n| OD_ARCHAEOLOGIST_M3 | PASS |\n| OD_DIPOLAR_M1 | PASS |\n| OD_AXIOM_COVERAGE | PASS |\n| OD_CANDIDATE_RULES_M5 | PASS |\n| OD_COMMIT_WINDOW_SPECIFICITY | PASS |\n\n`python3 -m py_compile domains/ops-decisions/assertions.py\ndomains/ops-decisions/tools/exp_incident_regressor.py` passed.\n\n## Null baseline vs informed\n\n**Naive baseline**: le 6 assertions precedenti passavano senza testare il\nnull family-shuffle del guard commit-window. Il regressor poteva essere\ncorretto, ma la suite non aveva un falsifier diretto per la contaminazione\n12h.\n\n**Informed boundary**: `OD_COMMIT_WINDOW_SPECIFICITY` misura due mondi nello\nstesso test:\n- guard reale: true 2/2, shuffle 0/2;\n- legacy 12h control: true 2/2, shuffle 2/2.\n\nDelta misurabile:\n- coverage assertion: 6 -> 7;\n- false positive null sotto guard: 2/2 legacy -> 0/2 guard;\n- all-pass ora include almeno un controllo negativo esplicito sull'asse\n  commit-window.\n\n## Findings\n\n### F1: Il gap assertion-level e' chiuso per il guard commit-window\n\nLa nuova assertion non verifica solo che il regressor produca JSON. Verifica\nla relazione causale che il run 20260505_1155 aveva lasciato come vincolo:\nil commit scoring deve sopravvivere sulla famiglia vera e collassare sulla\nfamiglia shufflata.\n\n### F2: Il controllo negativo discrimina davvero\n\nForzando la finestra 12h, il family-shuffle torna 2/2. Questo e' il caso che\nla assertion deve rifiutare. Il test non e' una tautologia di presenza dati:\nil medesimo corpus e il medesimo scorer passano solo quando la finestra e'\ncausale.\n\n### F3: META_ALL_PASS resta, ma cambia forma\n\nIl claim originale \"tutti i 6 test passano\" e' falsificato in questo ciclo come descrizione corrente della suite: ora i test\nsono 7 e uno contiene un null baseline. Il nuovo claim emerso e' che la tensione META resta utile solo come\nguard generale: altri assi potrebbero ancora passare senza null, ma non questo.\n\n## Verdict\n\n**RESOLVED/APPLIED on COMMIT_WINDOW_GUARD_ASSERTION_GAP**:\n`OD_COMMIT_WINDOW_SPECIFICITY` e' ora parte della suite. Sul corpus N=2 passa\ncon guard true 2/2 e family-shuffle 0/2; il controllo negativo legacy 12h\nmostra la contaminazione attesa con shuffle 2/2.\n\nResidual constraint: confidence resta exploratory per N=2. Con N>=5 il\ncriterio da mantenere e' true > shuffle sotto guard, e legacy/non-causale deve\nrestare rilevabile come controllo negativo.\n\n## Bicono della scoperta\n\n- **Due radici**: assertion di presenza e assertion di specificita'. La prima\n  dice \"lo strumento gira\"; la seconda dice \"la relazione causale rifiuta il\n  null\".\n\n- **Singolare**: lo stesso all-pass della suite. Prima era indistinto: poteva\n  significare struttura o tautologia. Dopo il null guard contiene almeno un\n  punto di inversione misurato.\n\n- **Invariante di passaggio**: il contrasto true-vs-shuffle sotto due finestre.\n  Il segnale vero resta 2/2; il null passa da 2/2 a 0/2 solo quando il confine\n  temporale e' causale.\n\n- **Campo di possibilita**: diventa possibile promuovere altri null audit da\n  report narrativo a assertion eseguibile. Diventa non-possibile dichiarare\n  questo asse \"all-pass tautologico\" senza falsificare\n  `OD_COMMIT_WINDOW_SPECIFICITY`.\n\n## Seed update\n\nUpdate `seed.json`:\n- mark `COMMIT_WINDOW_GUARD_ASSERTION_GAP` as resolved/applied;\n- update `META_ALL_PASS` from 6 to 7 tests and restrict its residual risk;\n- add verification block for cycle `20260505_1957`.\n\n## Files\n\n- Report: `/opt/D-ND_LAB/data/ops-decisions/reports/agent_20260505_1957.md`\n- Seed updated: `/opt/D-ND_LAB/data/ops-decisions/seed.json`\n- Assertion updated: `/opt/D-ND_LAB/domains/ops-decisions/assertions.py`\n","title":"Report - cycle 20260505_1957","verdict":"","bicono":{"roots":"assertion di presenza e assertion di specificita'. La prima\n  dice \"lo strumento gira\"; la seconda dice \"la relazione causale rifiuta il\n  null\".","singular":"lo stesso all-pass della suite. Prima era indistinto: poteva\n  significare struttura o tautologia. Dopo il null guard contiene almeno un\n  punto di inversione misurato.","invariant":"il contrasto true-vs-shuffle sotto due finestre.\n  Il segnale vero resta 2/2; il null passa da 2/2 a 0/2 solo quando il confine\n  temporale e' causale.","field":"diventa possibile promuovere altri null audit da\n  report narrativo a assertion eseguibile. Diventa non-possibile dichiarare\n  questo asse \"all-pass tautologico\" senza falsificare\n  `OD_COMMIT_WINDOW_SPECIFICITY`."},"size":5061,"mtime":"2026-05-05T20:01:18.810729+00:00"}