{"filename":"agent_20260505_0950.md","content":"# Report - cycle 20260505_0950\n\n**Lab**: ops-decisions\n**Faccia**: Incident Regeneration (Faccia 1)\n**Tension**: REDESIGN_APPLY_M1_SCHEMA_SPLIT / INCIDENT_CLASSIFICATION_EXECUTABLE_CONTRACT\n**Date**: 2026-05-05\n\n## Question\n\nSe il contratto split viene reso eseguibile nel regressor e consumato da\n`OD_DIPOLAR_M1`, lo stesso corpus N=2 produce davvero `node_class >= 2`\ne fa passare M1, oppure la split dei cycle 1833/1942 era solo una\nclassificazione manuale non traducibile?\n\nQuesta domanda cambia lo stato perche' distingue:\n- **contract-stale**: il vecchio FAIL era prodotto dal campo legacy\n  `fix_classification`;\n- **split-not-executable**: anche esportando `node_class`, il corpus resta\n  monoclasse.\n\n## Method\n\nEsperimento unico: schema split executable migration.\n\n1. Misurare baseline con `exp_incident_regressor.py --json` e\n   `assertions.py` prima della modifica.\n2. Aggiornare `exp_incident_regressor.py` per esportare gli assi:\n   `node_class`, `fix_class`, `fix_source`, `fix_text_class`,\n   `commit_fix_class`, `recurrence_family`.\n3. Aggiornare `OD_DIPOLAR_M1` per consumare `node_class` e dichiarare\n   confidence `exploratory` quando `N < 5`.\n4. Rieseguire regressor, assertions e py_compile.\n\nNull baseline: contratto legacy, stesso corpus, nessun nuovo incidente.\n\n## Data\n\n### Null baseline\n\n| Metric | Value |\n|---|---:|\n| Incident count | 2 |\n| Split schema coverage | 0/5 |\n| M1 consumed axis | `fix_classification` |\n| Distinct executable classes | 1 (`det=+1`) |\n| OD_DIPOLAR_M1 | FAIL |\n\nBaseline assertion:\n`[FAIL] OD_DIPOLAR_M1: All incidents classified as {'det=+1'} - no dipole`\n\n### Informed execution\n\nRegressor output after migration:\n\n| Metric | Value |\n|---|---:|\n| Incident count | 2 |\n| Split schema coverage | 5/5 |\n| `node_class_count` | 2 |\n| `node_classes` | `AUTH_BOUNDARY`, `CLOSURE_WRITE_BOUNDARY` |\n| `recurrence_families` | `auth_boundary`, `closure_write_boundary` |\n| `fix_class` | 2/2 `det=+1` |\n| `commit_fix_class` | 2/2 `UNOBSERVED` |\n\nAssertion run after migration:\n\n| Assertion | Status | Detail |\n|---|---:|---|\n| OD_CORPUS | PASS | incidents=2, memories=52 |\n| OD_REGRESSOR_M3 | PASS | Parsed 2 incidents |\n| OD_ARCHAEOLOGIST_M3 | PASS | Analyzed 52 files, 38 with axiom refs |\n| OD_DIPOLAR_M1 | PASS | 2 distinct node classes, N=2, confidence=exploratory |\n| OD_AXIOM_COVERAGE | PASS | 8 axioms referenced |\n| OD_CANDIDATE_RULES_M5 | PASS | 2 candidate rules |\n\nVerification:\n`python3 -m py_compile domains/ops-decisions/tools/exp_incident_regressor.py domains/ops-decisions/assertions.py` exits 0.\n\n## Null baseline vs informed\n\n**Naive baseline**: keep the old executable contract. Both incidents\ncontain manual recovery suggestions, so `fix_classification` collapses to\n`det=+1` for 2/2 incidents. OD_DIPOLAR_M1 fails with 1 class.\n\n**Informed contract**: classify first the regressive node, then report fix\nquality as a separate axis. On the same two incidents, `node_class` splits\ninto `AUTH_BOUNDARY` and `CLOSURE_WRITE_BOUNDARY`; `fix_class` remains\nmonoclasse and correctly low-N/source-dependent.\n\nDelta misurabile:\n- split schema coverage: 0/5 -> 5/5;\n- M1 consumed axis: `fix_classification` -> `node_class`;\n- M1 distinct classes: 1 -> 2;\n- OD_DIPOLAR_M1: FAIL -> PASS exploratory.\n\n## Findings\n\n### F1: The stale-contract hypothesis is confirmed\n\nThe previous M1 failure was not a stable property of the incident corpus.\nAfter exporting and consuming `node_class`, the same corpus produces two\nregressive nodes and M1 passes. The old failure measured fix-text collapse,\nnot incident-origin dipolarity.\n\n### F2: The split preserves the old signal instead of overwriting it\n\n`fix_classification` remains present as a legacy compatibility field, and\n`fix_class`/`fix_text_class` still report 2/2 `det=+1`. This matters: the\nexperiment did not force a second det label. It separated the axes.\n\n### F3: The new residual tension is commit-axis observability\n\nThe required split keys now exist, but `commit_fix_class` is currently\n`UNOBSERVED` for 2/2 incidents. This is acceptable for M1 because M1 now\ntests `node_class`, but it is the next maturity boundary for recurrence\nand source-disagreement analysis.\n\n## Verdict\n\n**REDESIGN APPLIED on INCIDENT_CLASSIFICATION_EXECUTABLE_CONTRACT**:\n`exp_incident_regressor.py` now exports the split contract and\n`OD_DIPOLAR_M1` consumes `node_class` with an N-aware confidence label.\n\nResult on current corpus:\n- contract coverage: 5/5;\n- `node_class_count`: 2;\n- `OD_DIPOLAR_M1`: PASS exploratory.\n\nFalsifier resolved for this cycle: if the previous manual split had not\nbeen executable, `node_class` would have remained <2 or M1 would still\nfail. It did not.\n\nResidual constraint: `commit_fix_class` exists but is not yet observed\nfrom git/source history. The next useful experiment should test whether\ncommit evidence can classify post-incident fixes without re-collapsing\nthe node/fix axes.\n\n## Bicono della scoperta\n\n- **Due radici**: executable schema and assertion consumption. Export\n  alone is insufficient; M1 changes only when the consumer changes too.\n\n- **Singolare**: `node_class` as the regressive coordinate. It is the\n  point where auth-start failure and closure-write failure separate.\n\n- **Invariante di passaggio**: same corpus, same incident files, different\n  executable axis. The measured state changes only because the contract\n  now represents the prior discovery.\n\n- **Campo di possibilita**: possible to close the M1 contract stale loop.\n  Not yet possible to make strong recurrence claims: N=2 remains\n  exploratory and commit fix evidence is still unobserved.\n\n## Seed update\n\nUpdate `seed.json`:\n- mark the M1 schema split as applied in verification for cycle\n  20260505_0950;\n- preserve the baseline/informed numbers;\n- add residual tension `INCIDENT_COMMIT_FIX_AXIS_OBSERVABILITY`;\n- lower the active contract tension because the executable contract is no\n  longer at 0/5.\n\n## Files\n\n- Regressor updated: `/opt/D-ND_LAB/domains/ops-decisions/tools/exp_incident_regressor.py`\n- Assertion updated: `/opt/D-ND_LAB/domains/ops-decisions/assertions.py`\n- Report: `/opt/D-ND_LAB/data/ops-decisions/reports/agent_20260505_0950.md`\n- Seed updated: `/opt/D-ND_LAB/data/ops-decisions/seed.json`\n","title":"Report - cycle 20260505_0950","verdict":"","bicono":{"roots":"executable schema and assertion consumption. Export\n  alone is insufficient; M1 changes only when the consumer changes too.","singular":"`node_class` as the regressive coordinate. It is the\n  point where auth-start failure and closure-write failure separate.","invariant":"same corpus, same incident files, different\n  executable axis. The measured state changes only because the contract\n  now represents the prior discovery.","field":"possible to close the M1 contract stale loop.\n  Not yet possible to make strong recurrence claims: N=2 remains\n  exploratory and commit fix evidence is still unobserved."},"size":6228,"mtime":"2026-05-05T09:53:19.844444+00:00"}