Reading additional input from stdin...
OpenAI Codex v0.124.0 (research preview)
--------
workdir: /opt/MM_D-ND
model: gpt-5.5
provider: openai
approval: never
sandbox: workspace-write [workdir, /tmp, $TMPDIR, /root/.codex/memories]
reasoning effort: medium
reasoning summaries: none
session id: 019e70ae-5937-7230-8914-63d637aca135
--------
user
Sei l'AI-Lab D-ND. Leggi tools/data/agent_field_live.md per il campo vivo (tensioni, ultimi risultati, convergenze, osservazioni). Leggi tools/LAB_AGENT_CONTEXT.md per modello, regole, errori da evitare. Esegui un esperimento e scrivi il report in tools/data/reports/agent_20260528_2222.md
warning: Codex could not find bubblewrap on PATH. Install bubblewrap with your OS package manager. See the sandbox prerequisites: https://developers.openai.com/codex/concepts/sandboxing#prerequisites. Codex will use the vendored bubblewrap in the meantime.
codex
Uso le istruzioni locali AI-Lab: prima leggo campo vivo e contesto, poi scelgo una sola tensione e verifico lo stato del repo prima di scrivere il report.
exec
/bin/bash -lc "sed -n '1,240p' tools/data/agent_field_live.md" in /opt/MM_D-ND
 succeeded in 0ms:
Leggi tools/LAB_AGENT_CONTEXT.md per il modello D-ND, il condensato, le strutture, le regole, e gli errori da evitare.

## DIRETTIVA OPERATORE — override per questo cycle (one-shot)

# Direttiva one-shot - Lab fisica D-ND / BOUNDARY provenance

Fonte: TM7-vps, ciclo controllato 20260528_2138 + verifica manuale 2026-05-28.

Il prossimo ciclo non deve promuovere claim fisici su `logistica_biforcazione_var_3.5699:cycle_13`
o `percolation:cycle_9`.

Blocco trasformato in input:

- il report 20260528_2138 e' stato bloccato dal falsifier per overclaim su percolation;
- la riproduzione fresh dell'artefatto 20260528_2042 ha prodotto baseline diverse;
- la causa locale verificata e' che alcune righe BOUNDARY derivano da generatori stocastici
  di `dnd_autoricerca` senza seed persistito nella provenance dell'artefatto;
- `exp_semireal_boundary_transfer_gate.row_spacings` ora usa seed stabili per dominio e
  ripristina lo stato RNG del chiamante.

Compito del ciclo:

1. Confrontare `boundary_physical_internal_null_20260528_2042.json` con una riproduzione fresh
   generata dopo la patch di provenance.
2. Dichiarare il delta tra artefatto storico e artefatto riproducibile.
3. Costruire o proporre una cache row-aligned che registri per ogni target/trial/reader:
   source domain, seed stabile, lunghezza gaps, feature del target, reader k/n_gaps/seed,
   risultato full-reader, centroid-only e kNN-only.
4. Separare logistic e percolation: niente chiusura comune se uno dei due resta edge-case.
5. Restituire un criterio di rientro A -> M -> B: quale baseline fisica A e' riproducibile,
   quale trasformazione matematica viene applicata, quale fisica B viene testata.

Output richiesto:

- sezione `claim` con claim limitato alla provenance, non al contenuto fisico;
- sezione `falsificazione` con attacco alla riproducibilita';
- sezione `block_autology` con origine del blocco e prossima regola riutilizzabile;
- nessuna promozione pubblica se la baseline osservata non e' identica tra due run indipendenti.

Obbligo di tracciabilita': se usi questa direttiva per deviare dalla direzione viva o aprire un counter-perimeter, nel report cita una sezione `## Source directive` e riporta in sintesi quale vincolo della direttiva hai seguito. Il falsifier deve poter vedere la fonte della deviazione anche dopo che `operator_directive.md` e' stato consumato.

## Orizzonte (telos del lab)
L'intento non è solo unificare la fisica. La fisica è il piano ad alto rigore dove il modello D-ND trasferisce indirettamente informazione dalla struttura metafisica alla manifestazione: osservabili intermedi, combo, ponti tra punti non ancora collegati, strumenti riusabili e ricadute verso sito, seed, template e prodotti. Il cycle deve far sopravvivere solo ciò che regge e riconoscere cosa diventa possibile dopo il risultato. Il design appare quando i punti sono collegati; non aggiungere forma prima di collegare evidenze, intento, gate e superfici.

Dinamica di movimento: `fisico A -> matematica -> fisico B`. Non e' una rotta prescritta e non sceglie il dominio al posto del campo. Serve a ricordare che una dualita' osservata deve manifestarsi, formalizzarsi e poi tentare un rimbalzo o un limite in un altro fenomeno, teoria, setup, misura o vincolo empirico. Se il punto B non emerge, registra vincolo/strumento/domanda; non promuovere come avanzamento fisico.

## SSP come trasduttore realizzativo
SSP non e' il centro del Lab fisica e non si attiva per ogni cycle coerente. Serve solo quando una scoperta, un vincolo o un monitoraggio mostra ricadute pratiche esplicite: demo/template, algoritmo, riduzione del calcolo, prodotto, funnel o strumento di monitoraggio. Se il cycle ha valore SSP, dichiara una sezione `## Ricadute pratiche` oppure `ssp_value: yes` con uso concreto. Se il risultato e' solo scaffold scientifico interno, scrivi `ssp_value: no` o lascia la sezione assente.

## Vincoli negativi recenti — L8 non ripetere come direzione
Questi sono drift appena bloccati dal falsifier. Sono memoria di bordo, non consecutio. Il prossimo report deve seguire `seme.json.direzione`; puo' riprendere un residuo qui sotto solo dichiarando `deliberate_counter_perimeter` con why/not_drift verificabili.
- Direzione viva ora: Riparare la provenance del reader BOUNDARY prima di nuovi claim fisici: confrontare l'artefatto 20260528_2042 con una riproduzione fresh, usare seed stabili per dominio, costruire cache row-aligned con source/gaps/features/RNG per target-trial-reader e separare logistica/percolation finche' la baseline osservata non e' riproducibile.
- Blocco L8 20260515_1826: Agent Report - Sturmian Denominator Alignment Gate
  - claim bloccato: `relation`: follows_direction; segue la direzione viva testando il confine come terzo incluso operativo dentro il corridoio Sturmian lasciato aperto dal ciclo 18:16.
  - evidenza: `seme.json.direzione` viva è: "Esplorare il confine: 8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo". Il report esegue solo phi/silver/bronze Sturmian a V=2 su denominatori convergenti; non testa 8 domini GUE, 5 Poisson, né una separazione GUE/Poisson. La motivazione di aderenza richiama il residuo del ciclo 18:16/lab_data precedente, non il seme primario.
  - prossimo uso ammesso: Nel prossimo ciclo formulare `direction_adherence` contro `seme.json`: o testare esplicitamente domini GUE/Poisson e terzo incluso operativo, oppure dichiarare `deliberate_counter_perimeter` con why/not_drift verificabili e nominare il residuo Sturmian come deviazione controllata.
Regola operativa: non usare il report bloccato, il suo script, il suo graph_completion o la sua Consecutio come autorita' di partenza.

## Feedback falsifier recente — check obbligatori prima di scrivere
Questi non sono nuove direzioni. Sono check di qualita' emersi nell'ultimo run non coerente e vanno chiusi esplicitamente nel report.
- Run non coerente: 20260516_1124
  - L2: Il null endpoint-preserving e' piu' restrittivo del feature-scramble pieno: `26/512` trial arrivano al conteggio osservato compatto, contro `112/128` del null pieno sul perimetro 11:17.
    Check richiesto: Rieseguire entrambi i null sullo stesso perimetro e con lo stesso N, oppure riportare unita' comparabili: conteggio atteso/null distribution sul medesimo observable, intervalli binomiali, e differenza di p stimata a parita' di lettore.
Per L2, non chiamare `sopravvive`, `residuo` o `strutturale` un lift piccolo senza count grezzi, denominatore, soglia preregistrata o p-value/permutation interval dichiarato. Obblighi pratici: se il dominio e' GUE/Poisson, aggiungi una sezione `## Re-discovery audit` con il baseline noto piu' vicino (Brody/Berry-Robnik/Rosenzweig-Porter, mobility/localization crossover o altro nome pertinente) e cosa resta lab-specific. Per L6, non usare `CE-none` generico: cita una voce CE-* metabolizzata oppure `CE-none:<path/check/timestamp>` verificabile.
Se compare un residuo graph-only, separa nel report: `two_reader_boundary_confirmed`, `graph_only_residue`, `scope_change_declared`, `graph_baseline_audit`. Non sommare righe graph-only al boundary a due lettori. Per il grafo usa baseline come kNN stability, hub/bridge persistence, silhouette/cluster-boundary stability o percolation-on-graph.

## Respiro fuori-tempo — prepara la combo prima della misura
La matematica e' la bracciata: formalizza e falsifica. Il respiro avviene sopra la misura: assiomi, dipoli, incroci di teorie, grafo, geometria dei campi, algebra o topologia assiomatica. Prima di scrivere codice devi creare UNA combo, non un'altra iterazione locale.

**Contratto obbligatorio pre-esperimento**:
1. Combo: almeno tre enti simultanei (assioma D-ND + incrocio teorie + nodo del grafo/dipolo + tensione del seme).
2. Dipolo: nomina i due poli e il punto-zero che li rende lo stesso problema.
3. Piano superiore: scegli una lente non puramente numerica (geometria dei campi, algebra, topologia assiomatica, grafo della conoscenza, bicono/dipoli).
4. Proto-ipotesi: scrivi la nuova ipotesi o proto-assioma in linguaggio strutturale prima dei numeri.
5. Possibile/non-possibile: dichiara dove la possibilita' diventa non-possibile, quale null la sfida o quale failure mode la limita.
6. Proiezione: solo dopo scegli osservabile, perimetro, null e misura.
7. Movimento A->M->B: se parti da fisica/scienza, nomina fisico A, struttura matematica M e fisico B; se B non emerge, dichiara il limite come vincolo/domanda invece di forzare un ponte.
Se non riesci a compilare questi punti, non fare deepening locale phi/Sturmian o altro: cambia piano, cerca nel grafo/incrocio, o lascia blank.

**Materiale incrocio disponibile per combo**:
- TxQ: matrice densita / TxG: temperatura di Hawking · perno=T · teorie=G,Q,T
- TxQ: matrice densita / TxE: funzione di partizione EM · perno=T · teorie=E,Q,T
- TxQ: matrice densita / TxR: gas relativistico · perno=T · teorie=Q,R,T
- TxQ: matrice densita / QxE: atomo di idrogeno · perno=Q · teorie=E,Q,T
**Grafo conoscenza**: Q=12, G=8, T=7, E=4, R=4
**Generatrici/strade dense**:
- disc_5: 2 ghost · Metrica primi g=(p/2)², curvatura GUE r=0.503
- report_20260516_1230: 2 ghost · Agent Report - Graph Mechanism Ablation
- report_20260516_1148: 2 ghost · Agent Report - Prime Bridge Label Null Audit
**Forma del campo**: 9 ponti, 1 vuoto(i), 6 scoperte.
**Direzione seme da respirare**: Riparare la provenance del reader BOUNDARY prima di nuovi claim fisici: confrontare l'artefatto 20260528_2042 con una riproduzione fresh, usare seed stabili per dominio, costruire cache row-aligned con source/gaps/features/RNG per target-trial-reader e separar

## Contratto di aderenza alla traiettoria
- Direzione viva del seme: Riparare la provenance del reader BOUNDARY prima di nuovi claim fisici: confrontare l'artefatto 20260528_2042 con una riproduzione fresh, usare seed stabili per dominio, costruire cache row-aligned con source/gaps/features/RNG per target-trial-reader e separare logistica/percolation finche' la baseline osservata non e' riproducibile.
- Ultima decisione valutatore ammessa: 20260516_1230 REDESIGN/high
- Direzione operativa valutatore: Testare null fisici interni per i residui graph-only logistica_biforcazione_var_3.5699 e percolation sul perimetro fisso 8 GUE / 5 Poisson: separare dinamica fisica da ricostruzione del reader grafico
- Perche': Il ciclo ha delimitato il reader: label-count null ricostruisce spesso il 27/27 e i due residui non condividono lo stesso meccanismo grafico. La consecutio non e' continuare il confine in forma generica, ma spostare il test al nodo regressivo dichiarato: null fisici interni per logistica/percolation, mantenendo fisso il denominatore 13x27 e chiedendo se il residuo sopravvive fuori dal reader.
- Nota: Evitare nuovi domini e nuovi fit. Observable minimo: full 27/27 contro surrogate dinamici interni N-matched per logistica e percolation, con confronto esplicito ai null graph gia' prodotti.

Nel report aggiungi una sezione `## Aderenza alla direzione` con tre righe:
- `relation`: follows_direction | deliberate_counter_perimeter | local_regression
- `why`: perche' l'esperimento serve la direzione viva
- `not_drift`: cosa impedisce che sia solo ritorno a un deposito familiare

Puoi deviare dalla direzione solo se lo dichiari come contro-perimetro deliberato e lo rendi falsificabile. Se torni a V_c, fit, label locali o vecchi depositi, devi spiegare perche' quel ritorno serve il perimetro cross-dominio corrente; altrimenti il ciclo e' scaffold, non valore.
## Palette operatoria laterale — sorgenti da triturare
Usa questa palette solo nella fase di respiro fuori-tempo. Scegli pochi operatori, crea una combo, poi proietta un osservabile. Non trasformarla in lista di temi.

# Palette operatoria espansa del Lab

Scopo: dare al Lab sorgenti laterali per creare combo prima della misura.
Questa palette non e' una lista di temi da confermare. E' un deposito di
operatori da triturare con assiomi D-ND, dipoli, grafo, incrocio teorie e
tensione corrente.

Regola d'uso:

1. Scegli 2 o 3 operatori al massimo.
2. Incrociali con almeno un assioma D-ND e una tensione del seme.
3. Nomina il dipolo e il punto-zero.
4. Dichiara la baseline nota piu' vicina.
5. Proietta un osservabile che possa falsificare la combo.
6. Non usare un operatore se produce solo linguaggio, analogia o conferma.

Anti-tautologia:

- Non partire da phi, gap label, GUE o Poisson se sono gia' nel ciclo
  precedente. Usali come controllo o campo di proiezione, non come sorgente.
- Se un operatore e' matematico, chiedi prima quale qualita' strutturale
  manifesta: simmetria, connessione, curvatura, flusso, vincolo, misura,
  memoria, transizione, gauge, bordo, singolare.
- Se un operatore e' fisico, chiedi quale dualita' D-ND apre: continuo/discreto,
  locale/globale, misurato/non-misurato, campo/particella, simmetria/rottura,
  deterministico/statistico, reversibile/irreversibile.

## Fasce di triturazione

### 1. Geometria differenziale e gravita'

Operatori:

- metrica;
- connessione;
- geodetica;
- curvatura di Riemann;
- Ricci tensor / Ricci scalar;
- tensore di Einstein;
- geodesic deviation;
- torsione;
- forma volume;
- orizzonte;
- singolarita';
- causal cone.

Dipoli utili:

- curvatura locale / vincolo globale;
- geodetica / deviazione;
- metrica data / metrica emergente;
- orizzonte come bordo / orizzonte come lettore;
- singolare fisico / singolare di coordinate.

Controlli:

- metrica costruita dal dato vs metrica predittiva;
- shuffle che preserva distribuzione ma distrugge ordine;
- confronto con spazio piatto, de Sitter, anti-de Sitter, random metric.

Attenzione:

- Ricci calcolato da una metrica definita sul dato puo' essere tautologico.
  Il contenuto vive nel null test o nella predizione fuori costruzione.

### 2. Gauge, connessioni e campi

Operatori:

- potenziale;
- campo;
- curvatura di gauge;
- holonomy;
- Wilson loop;
- fibrato;
- sezione;
- fase;
- Berry phase;
- parallel transport;
- rottura di simmetria;
- Higgs-like mechanism come transizione di stato.

Dipoli utili:

- potenziale / campo;
- fase locale / invariante globale;
- gauge libero / osservabile vincolato;
- trasporto / memoria;
- simmetria / rottura.

Controlli:

- gauge transform che conserva osservabile;
- loop chiuso vs cammino aperto;
- fase random vs fase strutturata;
- holonomy nulla vs non nulla.

### 3. Spazi quantistici e misura

Operatori:

- sfera di Bloch;
- matrice densita';
- proiettore;
- entanglement entropy;
- commutatore;
- non-commutativita';
- POVM;
- decoerenza;
- weak measurement;
- operator algebra;
- spettro di Hamiltoniana.

Dipoli utili:

- stato puro / stato misto;
- osservabile / non-commutante;
- misura / disturbo;
- sovrapposizione / decisione;
- entanglement / separabilita'.

Controlli:

- random unitary;
- stati separabili;
- base ruotata;
- noise controllato;
- spectrum-preserving shuffle.

Nota:

- Bloch e' buono quando serve un punto-zero geometrico tra poli. Non usarlo

exec
/bin/bash -lc "sed -n '1,260p' tools/LAB_AGENT_CONTEXT.md" in /opt/MM_D-ND
 succeeded in 0ms:
# AI-Lab D-ND — Contesto Operativo

> Questo file viene iniettato nel prompt dell'agente ad ogni ciclo.
> Contiene tutto ciò che serve per operare con consapevolezza.

## Chi sei

Sei l'AI-Lab del sistema D-ND. Giri autonomamente ogni notte come istanza Claude Code.
Non sei una pipeline di script — sei un ricercatore che pensa, esplora, scrive codice,
lo esegue, valuta i risultati, e aggiorna lo stato del sistema.

Il tuo lavoro produce risultati che vanno sul sito d-nd.com e alimentano il sistema THIA.
Quello che trovi conta — non per te, per il sistema e per chi lo legge.

## Il modello D-ND — nucleo

La regola: f(x) = 1 + 1/x. M = [[1,1],[1,0]]. det(M) = -1.

- Il punto fisso è φ = (1+√5)/2. Al punto fisso, addizione e moltiplicazione coincidono.
- L'attrattore è stabile: |f'(φ)| = 1/φ² < 1. Ogni iterata converge.
- Il rinforzo è impossibile — proprietà analitica, non empirica.
- det = -1: area preservata, orientamento invertito. Incompletezza come generazione.
- g(x) = 1/(1+x): la Fermi-Dirac con punto fisso 1/φ. Versione probabilistica di f.

## Il condensato — cosa è stato verificato

ASSIOMI (scelte fondative, accettate):
- A1: f(x)=1+1/x, M=[[1,1],[1,0]], det=-1
- A2: det=-1 è la necessità strutturale del confine
- A3: Al punto fisso, R+1=R (addizione = moltiplicazione)
- A4: Il modus — la qualità della domanda determina la qualità dell'inversione
- A5: Il sistema è autopoietico — ogni ciclo produce R+1 dalla base R
- A9: Il terzo incluso — tra A e non-A c'è lo zero
- A11: La combo — tre o più enti simultanei, risultante non sommabile
- A14: Cascata — ciò che si scopre vive nel seme, non nel nodo

FATTI (dimostrati/verificati):
- F1: Residuo Cassini = (-1)^(n+1)/F(n)², decade come 1/φ^(2n)
- F2: Cammino gap primi su Z/6Z confinato a {2,4}. Zero violazioni su 567K coppie.
- F3: Il rinforzo è impossibile. Classificazione binaria: MOLLA (r≠φ) o ZERO (r=φ).
- F4: Separazione di scala — M opera a scala locale, modulazione zeta non si propaga.
- F5: Frame diagnostica universale — firma (dipolo, LVL-2, convergenza) su 18 domini.
- F6: La firma dello zero — CV dei gap tra phi-crossing converge a φ-1 nel regime caotico.

CLAIM (falsificabili, sotto test):
- C1: I primi sono l'unico dominio dinamico sotto M (tra 7 testati).
- C2: La coincidenza numerica non è mai prova. Principio metodologico.
- C3: Il linguaggio deterministico — un termine nomina una funzione reale, o è superfluo.

## Strutture trovate dal lab (sessioni interattive)

- Tetraedro TQGE: 4 vertici (T,Q,G,E), 6 lati con perno i, 5 ponti, 1 vuoto (QxG)
- Tetraedro orientato: T termico, Q chirale, E fase, G passivo
- R è il frame (5° vertice): connesso a tutti ma senza perno i
- Tre specie perno i: Wick (continuo tempo), fase (continuo gauge), discreto (primi)
- Operatore Q→G: e^{iH·ln(p)/ℏ} — evoluzione in tempo logaritmico
- Metrica primi: g_n = p_n/2, curvatura GUE r=0.503 z=22.5 vs shuffle
- Tensore metrico: g_n = (p_n/2)², de Sitter 1+1D con a(t)=e^t/2
- α catena: α^n·a₀ mappa scale fisiche, deserto 3-10, residuo pentagonale 72.5°
- g(x)=1/(1+x) = Fermi-Dirac, punto fisso 1/φ. f→g = ponte TxQ algebrico.

## Le 10 domande fondamentali (incrocio teorie)

| Coppia | Domanda | Ponte |
|--------|---------|-------|
| ExR | Come coesistono statico e radiante? | onda EM |
| GxE | Come coesistono neutro-curvo e carico-piatto? | buco nero carico |
| GxR | Come coesistono piatto e singolare? | orizzonte eventi |
| QxE | Come coesistono libero e legato? | atomo di idrogeno |
| **QxG** | **Come coesistono continuo e discreto?** | **VUOTO** |
| QxR | Come coesistono non-relativistico e relativistico? | eq. Dirac |
| TxE | Come coesistono freddo e plasma? | funzione partizione |
| TxG | Come coesistono piatto e radiante? | temperatura Hawking |
| TxQ | Come coesistono vuoto e pieno? | matrice densità |
| TxR | Come coesistono 0K e c? | gas relativistico |

QxG è il vuoto — l'unico lato senza ponte. Il vuoto non è assenza del ponte — è dove i due
lati del dipolo sono lo stesso. Wheeler-DeWitt: Ĥ|Ψ⟩ = 0, niente tempo.

## Vincoli operativi

- La prima impressione contiene il segnale. Non elaborare — osservare.
- Una risultante, non una lista. Se ci sono più possibilità, non hai tagliato.
- Formule dove servono. Fenomeni reali. Niente filosofia. Niente metafore.
- Se non sai, lascia vuoto. Blank > Wrong. Errore costa 3x di un non-so.
- Ogni claim va testato col suo opposto. Se l'opposto è altrettanto coerente, la tensione è il contenuto.
- Le coincidenze numeriche non sono mai prova (C2).
- Le dissonanze sono il segnale, non il rumore. L'errore è il varco.
- La via più breve verso la risultante. Principio di minima azione.
- **La struttura contiene già la risposta.** Un dipolo sa se è aperto o chiuso. Un'assonanza sa se risuona o no. Una porta sa dove sei entrato. Se interponi un numero tra la struttura e la decisione, stai aggiungendo (det=+1) — il numero decide al posto della struttura. I numeri misurano i dati. Le strutture decidono il sistema. Non mischiare i due.
- **Prima impressione come condensato.** La prima impressione e' il segnale
  prima che dualita' locale, dettagli tecnici e complessita' entropica la
  contaminino. Scrivila come essenza del ciclo: intento, dipolo, risultante
  grezza, possibile/non-possibile. I particolari (`source_mode`, soglie,
  metriche, perimetri) devono diramarsi da quella essenza e tornare a
  verificarla; non devono scegliere la direzione al posto suo.
- **Normalizzazione D-ND dei contesti scientifici.** Ogni dominio scientifico
  entra nel Lab come contesto da normalizzare, non come lista di target da
  inseguire. Costruisci la combo che preserva l'essenza D-ND nel dominio:
  assioma/regola primaria + teoria/ponte + dipolo/bicono + osservabile
  falsificabile. Se il dettaglio non serve questa combo, e' rumore o
  telemetria.
- **Combo come contenitore del movimento.** La combo non e' una lista di
  ingredienti e non e' il target del ciclo. E' la minima configurazione che
  conserva il movimento verso la risultante: assioma vivo, tensione del seme,
  dipolo possibile/non-possibile, operatore laterale, osservabile e criterio di
  caduta. Deve dire cosa muove, cosa trattiene e cosa puo' decadere. Se una
  combo non contiene il proprio non-possibile o non lascia spazio alla
  risultante emergente, e' un prompt mascherato: riformulala prima di misurare.
- **Perimetro come parte atomica del claim.** Universal claims ("X holds for all", "Y is stable across", "exactly zero", "always", "80% of", "N% explained by") devono dichiarare il perimetro come parte atomica del claim, non come nota a margine. Esempio corretto: "self-transition mod-3 = 0 esattamente per p > 5" (perimetro p>5 atomico). Esempio falsificabile: "self-transition mod-3 is exactly zero" + nota separata sull'eccezione. Se la tabella nel report mostra eccezioni nel perimetro, il claim è falsificato — anche se la maggioranza conferma. **Cinque cycle consecutivi (2026-04-30 19:05/19:19/19:46 + 2026-04-30 03:30 + 2026-05-01 03:30) hanno avuto HIGH flag su questo pattern.** Riformulare prima di scrivere — non aspettare il falsifier.
- **Contratto osservabile-operatore.** Prima di scrivere il report, dichiara
  cosa stai misurando e cosa NON stai misurando in questo ciclo. Un claim puo'
  cambiare osservabile solo se il passaggio e' esplicito. Se il Claim Under
  Test parla di `gap_ratio` ma l'esperimento misura `gap_label_set`,
  `core_retention` o `generator_jaccard`, scrivi nel report:
  `gap_ratio non testato in questo ciclo; observable sostitutivo = ...`.
  Ogni risultato deve separare almeno: claim, osservabile, operatore,
  generatore, denominatore/perimetro, non-possibile/null. Non lasciare che il
  falsifier scopra il drift al posto tuo.
- **Possibile / non-possibile atomico.** Se formuli cosa diventa possibile,
  devi formulare anche dove diventa non-possibile: null, contro-perimetro,
  failure mode o campo in cui il claim cade. Una possibilita' senza il proprio
  non-possibile non e' ancora dipolo operativo; e' singolarita' simmetrica
  senza attrito. Nel report questo va dichiarato nel `observable_contract`,
  nel bicono o in entrambi.
- **Osservabili canonici e dedicati.** `observables_used=[]` significa nessun
  osservabile misurabile, non "nessun osservabile canonico". Se usi un
  osservabile dedicato/domain-native (`event_type`, `vc_interp`, conteggi
  exact, Jaccard, span, rate, ecc.), elencalo in `observables_used` e segnala
  che e' non-canonico. Il gate G1 blocca solo la tassonomia vuota, ma un report
  maturo deve nominare gli osservabili direttamente.
- **Non fondere osservabili diverse.** `median retention`,
  `all-condition/core_labels_all_conditions`, `stable labels 75%`,
  `condition rate` e `Jaccard` non dicono la stessa cosa. Se due osservabili
  divergono, la divergenza e' il risultato. Esempio: `low retention=1.0` con
  `stable labels 75%` incompleto non autorizza "il nucleo basso e' rientrato"
  senza qualificare quale osservabile e' rientrata. Formula: "retention
  mediana piena, stabilita' 75% parziale".
- **Denominatori row-aligned.** Se confronti un gate candidati con un audit
  eventi, le righe devono essere le stesse o il ponte deve essere dichiarato.
  Non saldare `accepted=96` da una tabella candidati con `no_cross=9/12` da
  una tabella `best per mode`: sono denominatori diversi. Usa righe
  row-aligned (`candidate_id` condiviso) oppure formula la divergenza fra
  livelli di aggregazione come risultato sospeso.
- **P-value definito prima dei risultati.** Se riporti un p-value da null,
  permutation, bootstrap o conteggio Monte Carlo, dichiara nel design la formula
  esatta prima della tabella: `raw_p=k/N`, `add_one_p=(k+1)/(N+1)`, left/right
  tail, two-sided o altro. Se usi una correzione, riporta anche i count grezzi
  che la generano. Un p-value senza definizione operativa e' telemetria
  ambigua, non evidenza.
- **Null-first prima del nome candidato.** Quando il ciclo cerca un boundary,
  terzo incluso, ponte fisico o riga candidata, il null non deve essere solo
  audit dopo la nominazione. Dichiaralo prima come precondizione del candidato:
  quale relazione rompe, quali marginali preserva, quale conteggio deve NON
  ricostruire. Se il null ricostruisce il conteggio osservato, il nome candidato
  resta etichetta di lavoro o vault, non scoperta.
- **Null comparabili o non confrontare.** Due null possono essere confrontati
  solo se condividono lo stesso observable, denominatore, perimetro, numero di
  trial o una normalizzazione dichiarata che rende l'unita' comune. Se cambi
  lettore, compressione, seed, spazio feature, trial count o source rows, il
  risultato ammesso e' `nulls_not_comparable:<why>`, non "piu' restrittivo" o
  "piu' permissivo". Prima rendi comparabili i null; poi interpreta.
- **Partizioni esaustive prima dei conteggi narrativi.** Quando classifichi
  righe in gruppi (`stable`, `parameter_sensitive`, `unstable`,
  `classic_only`, `graph_only`, endpoint, bridge, ecc.), dichiara se la lista e'
  una partizione completa o un sottoinsieme. Se il testo dice "le righe X sono
  ..." deve includere tutte le righe che soddisfano la condizione dichiarata.
  Se vuoi parlare solo di un sottoinsieme, nominalo come tale:
  `unstable_non_bridge + classic_only`, `parameter_sensitive + classic_only`,
  ecc. Il totale deve tornare al denominatore atomico prima del verdict.
- **Residuo del seme quando restringi il perimetro.** Se la direzione viva
  nomina un perimetro numerico o semantico piu' ampio (es. `8 GUE / 5 Poisson`)
  e il ciclo esegue un preflight, filtro endpoint o sotto-perimetro necessario,
  dichiara in `Aderenza alla direzione` una riga `seed_residue=<cosa resta non
  testato>` e `why_not_drift=<perche' il sotto-perimetro e' regressivo, non
  fuga>`. Il sotto-perimetro puo' essere corretto, ma non deve cancellare il
  residuo che il seme aveva nominato.
- **Counter-perimeter deliberato.** Se scegli consapevolmente un sotto-perimetro
  o contro-perimetro invece del perimetro vivo del seme, non dichiarare
  `follows_direction` pieno. Usa `relation: deliberate_counter_perimeter` e
  compila `why`, `not_drift`, `return_criterion` e `seed_residue`. Il criterio
  di ritorno deve dire cosa riporta il ciclo al perimetro vivo o cosa chiude il
  ramo come non-promuovibile. Senza `return_criterion`, il sotto-perimetro e'
  drift anche se scientificamente sensato.
- **Wording hard solo per zeri hard.** Usa "richiede", "non ricostruisce",
  "non-possibile", "solo" o "mai" solo se il contro-perimetro e' zero nel
  perimetro dichiarato o se il claim e' definizionale. Se i controlli non-zero
  mostrano sottostrutture parziali, usa formule scoped: "aumenta",
  "favorisce", "non chiude congiuntamente", "resta parziale". Riporta count
  grezzi (`hits/denominator`) insieme ai ratio quando confronti condition
  rates.
- **Dominanza non e' invariante.** Se una classe ha controesempi visibili,
  non scrivere che "porta", "rompe", "resta stabile" o "trasferisce" senza
  qualificatore. Formula con count e perimetro: `order_memory produce
  crossing-or-multi in 830/837 accepted rows, con 7 no_cross da isolare`;
  `periodic_closure disaccoppia in 873/1179, ma ha 306 internal_cross`.
  I controesempi sono informazione, non rumore da arrotondare.
- **Palette operatoria laterale.** Quando il ciclo rischia deepening locale,
  leggi `tools/LAB_OPERATOR_PALETTE.md` e scegli 2 o 3 operatori massimo.
  Gli operatori non sono temi: devono produrre dipolo, punto-zero, baseline e
  osservabile falsificabile. Se restano semantica o analogia, scartali.
- **Adapter cognitivi laterali.** Quando servono nuove strade, leggi
  `tools/LAB_COGNITIVE_CONTAMINATION.md`. Usa YSN per DeltaLink, Cornelius
  per comprimere un innesco genomico, KSAR per reiterare il kernel emerso.
  Non adottare personaggi o prompt: estrai enzimi operativi. La sezione
  `Contaminazione cognitiva` e' obbligatoria nel report; se un adapter non
  viene usato, scrivi `none` con motivo.
- **Archivio enzimi cognitivi.** Se il campo vivo contiene `Archivio enzimi
  cognitivi`, la sezione `Contaminazione cognitiva` deve citare almeno una voce
  `CE-*` usata nella combo, oppure `CE-none:` con un motivo specifico e
  verificabile. `none` generico non e' valido: significa che il campo semantico
  e' stato visto ma non metabolizzato.
- **Patch non e' invariante.** Una patch, soglia, gate, parser permissivo,
  fallback o adapter nato per sbloccare un ciclo e' un ponte provvisorio, non
  una legge del Lab. Prima di rilascio/promozione deve passare audit: quale
  attrito reale risolve, quale logica difettosa rischia di ritardare, quali
  presupposti contiene, quando va rifinito o rimosso. Se non conserva
  informazione utile/minima oltre l'ultima possibilita' del ciclo, taglialo.
  Non promuovere workaround a invariante senza perimetro, bicono,
  non-possibile e falsificazione.
- **Regola operativa non e' assioma eterno.** Le regole nate da falsifier,
  monitor, report bloccati o cicli locali sono contratti adattivi, non
  invarianti D-ND. Devono dichiarare: `origin=<rottura osservata>`,
  `protects=<quale intento/informazione protegge>`,
  `valid_until=<quale evidenza o perimetro puo' superarla>`,
  `retire_when=<quando diventa attrito o contaminazione>`. Gli invarianti del
  modello D-ND e dei meta-prompt governano il modo in cui le regole si
  generano, si verificano, si trasformano e decadono; non congelano per sempre
  una forma locale. L'intento non e' una destinazione statica: vive nel
  movimento che permette alla risultante di emergere. Se una regola irrigidisce
  il movimento o lo sostituisce con l'obbedienza alla regola, il ciclo deve
  segnalarla come `rule_friction` e proporre un raffinamento, non aggirarla
  silenziosamente.
- **Blocco come tensione autologica, non come fermo.** Un blocco del Lab
  (`provider_fail`, `report_missing`, `sync_blocked`, `Aeternitas VETO`,
  `Veritas SOSPENSIONE`, timeout, perimetro troppo costoso, rule_friction) e'
  un punto di inversione del modello, non una fine operativa. Prima protegge le
  superfici accettate; poi deve produrre un oggetto utile al ciclo successivo:
  `block_origin`, `node_regressivo`, `dipolo`, `possibile/non-possibile`,
  `det+1_patch_risk`, `det-1_next_move`, `return_criterion`. Superare il blocco
  non significa forzare sync, abbassare gate o aggirare regole: significa usare
  A8/A15 per chiedere al sistema quale condizione mancava a monte e quale mossa
  minima rende il prossimo ciclo piu' autonomo. Se il blocco resta solo log o
  quarantena, il Lab ha osservato ma non ha ancora metabolizzato.
- **Null label-preserving non e' indipendenza.** Per `V_c`, un null
  label-preserving accettato deve riportare anche `source_mode` e
  `hamming_ratio` dalla sequenza Sturmian di riferimento. Se il null passa
  `Jaccard>=0.75` ma resta vicino alla reference, e' un ponte strutturato:
  puo' testare reachability del contro-campo, ma non diventa controprova
  indipendente del boundary finche' la distanza/perimetro non sono adeguati.
- **Collasso minimo del ciclo.** A fine ciclo conserva due cose: la direzione
  come costante angolare potenziale oltre la curva, e il bicono con i due lati
  possibile/non-possibile attorno al punto-zero. Il resto e' telemetria,
  scaffold o patch finche' non apre il ciclo successivo.
- **Dinamica fisico A -> matematica -> fisico B.** Il Lab e' il campo delle
  possibilita' in cui una dualita' osservata si manifesta, viene formalizzata e
  tenta un rimbalzo altrove. La matematica non e' destinazione ne' ornamento: e'
  trasduttore fra manifestazioni. Se il ciclo parte da un attrito fisico, deve
  estrarre una struttura formale e poi chiedere dove quella struttura puo'
  ri-manifestarsi, cadere o delimitare un non-possibile in un altro fenomeno,

exec
/bin/bash -lc 'ls -t shared_memory/*.md 2>/dev/null | head -10' in /opt/MM_D-ND
 succeeded in 0ms:
shared_memory/deposito_cambia_la_parola_non_regola_2026-05-07.md
shared_memory/feedback_indeterminato_reitera_con_sistema_2026-05-07.md
shared_memory/README.md

exec
/bin/bash -lc 'git status --short --branch' in /opt/MM_D-ND
 succeeded in 0ms:
## main...origin/main
 M applications/INDEX.draft.json
 M docs/guides/lab_current_state_logic_2026-05-08.md
 M papers/paper_zero.md
 M tools/LAB_AGENT_CONTEXT.md
 M tools/build_agent_field.py
 M tools/build_lab_graph.py
 M tools/data/agent_field_live.md
 M tools/data/b2_apply_log.jsonl
 M tools/data/ciclo_memoria.json
 M tools/data/conoscenza_teorie.json
 M tools/data/consecutio.json
 M tools/data/consecutio_processata.json
 M tools/data/domandatore_pre_cycle.json
 M tools/data/domande_fondamentali.json
 M tools/data/g1_log.jsonl
 M tools/data/g2_log.jsonl
 M tools/data/graph_completion/latest.json
 M tools/data/incrocio_risultato.json
 M tools/data/knowledge_state.json
 M tools/data/lab_bridge_issues.jsonl
 M tools/data/lab_data.json
 M tools/data/lab_graph.json
 M tools/data/lab_health.json
 M tools/data/lab_session_log.jsonl
 M tools/data/pipeline_state.json
 M tools/data/ponti_evoluti.json
 M tools/data/refresh_detector_state.json
 M tools/data/repairs/repair_run_log.jsonl
 M tools/data/reports/latest.md
 M tools/data/seme.json
 D tools/data/seme_archive/piano_37.json
 D tools/data/seme_archive/piano_38.json
 D tools/data/seme_archive/piano_4.json
 D tools/data/seme_archive/piano_5.json
 D tools/data/seme_archive/piano_6.json
 D tools/data/seme_archive/piano_7.json
 D tools/data/seme_archive/piano_8.json
 D tools/data/seme_archive/piano_9.json
 M tools/data/seme_backup_pre_run.json
 M tools/data/tm1_figures/tensions.json
 M tools/data/tm1_figures/tensions_raw.json
 M tools/data/valutatore_log.jsonl
 M tools/evolution_report.md
 M tools/exp_semireal_boundary_transfer_gate.py
 M tools/graph_completion_compiler.py
 M tools/lab_aeternitas.py
 M tools/lab_agent.sh
 M tools/lab_falsifier.py
 M tools/lab_session_logger.py
?? applications/scoperte/20260513_0330_prime-vs-mod6-sr-boundary_auto/
?? applications/scoperte/20260514_1330_sr-residual-width-audit_auto/
?? applications/scoperte/20260514_1631_chiusura-tester-rimbalzo-fisico-w6_auto/
?? applications/scoperte/20260514_1640_rafforzamento-tester-fisico-goegue-n-curve_auto/
?? applications/scoperte/20260515_1712_primemod6-generative-null-w2048_auto/
?? applications/scoperte/20260515_1816_v2-generator-scaling-gate_auto/
?? applications/scoperte/20260515_1904_boundary-classical-crossover-audit_auto/
?? applications/scoperte/20260515_1933_rosenzweig-porter-physical-bridge-audit_auto/
?? applications/scoperte/20260515_1940_rp-boundary-size-stability-audit_auto/
?? applications/scoperte/20260515_1947_anderson-3d-mobility-edge-two-reader_auto/
?? applications/scoperte/20260516_0921_rp-unfolding-sensitivity-audit_auto/
?? applications/scoperte/20260516_0938_rp-candidate-local-window-stress-gate_auto/
?? applications/scoperte/20260516_1007_rp-local-window-persistence-curve_auto/
?? applications/scoperte/20260516_1019_rp-exact-local-window-size-stress_auto/
?? applications/scoperte/20260516_1031_boundary-unfolding-transfer-matrix_auto/
?? applications/scoperte/20260516_1104_endpoint-gated-rp-boundary_auto/
?? applications/scoperte/20260516_1111_endpoint-gated-rp-size-ladder_auto/
?? applications/scoperte/20260516_1117_anderson-3d-two-reader-boundary-null_auto/
?? applications/scoperte/20260516_1135_anderson-comparable-null-audit_auto/
?? applications/scoperte/20260516_1148_prime-bridge-label-null-audit_auto/
?? applications/scoperte/20260516_1206_graph-only-residue-label-null-audit_auto/
?? applications/scoperte/20260516_1230_graph-mechanism-ablation_auto/
?? applications/soluzioni/20260513_0330_prime-vs-mod6-sr-boundary/
?? applications/soluzioni/20260514_1330_sr-residual-width-audit/
?? applications/soluzioni/20260514_1631_chiusura-tester-rimbalzo-fisico-w6/
?? applications/soluzioni/20260514_1640_rafforzamento-tester-fisico-goegue-n-curve/
?? applications/soluzioni/20260515_1712_primemod6-generative-null-w2048/
?? applications/soluzioni/20260515_1816_v2-generator-scaling-gate/
?? applications/soluzioni/20260515_1904_boundary-classical-crossover-audit/
?? applications/soluzioni/20260515_1933_rosenzweig-porter-physical-bridge-audit/
?? applications/soluzioni/20260515_1940_rp-boundary-size-stability-audit/
?? applications/soluzioni/20260515_1947_anderson-3d-mobility-edge-two-reader/
?? applications/soluzioni/20260516_0921_rp-unfolding-sensitivity-audit/
?? applications/soluzioni/20260516_0938_rp-candidate-local-window-stress-gate/
?? applications/soluzioni/20260516_1007_rp-local-window-persistence-curve/
?? applications/soluzioni/20260516_1019_rp-exact-local-window-size-stress/
?? applications/soluzioni/20260516_1031_boundary-unfolding-transfer-matrix/
?? applications/soluzioni/20260516_1104_endpoint-gated-rp-boundary/
?? applications/soluzioni/20260516_1111_endpoint-gated-rp-size-ladder/
?? applications/soluzioni/20260516_1117_anderson-3d-two-reader-boundary-null/
?? applications/soluzioni/20260516_1135_anderson-comparable-null-audit/
?? applications/soluzioni/20260516_1148_prime-bridge-label-null-audit/
?? applications/soluzioni/20260516_1206_graph-only-residue-label-null-audit/
?? applications/soluzioni/20260516_1230_graph-mechanism-ablation/
?? docs/guides/lab_preflight_agent_2026-05-14.md
?? docs/operations/
?? tools/build_lab_data.py
?? tools/build_safe_agent_field_preview.py
?? tools/compose_filtered_field_preview.py
?? tools/compose_supervised_entry_preview.py
?? tools/data/aeternitas/aeternitas_20260512_033539.json
?? tools/data/aeternitas/aeternitas_20260513_033605.json
?? tools/data/aeternitas/aeternitas_20260514_033420.json
?? tools/data/aeternitas/aeternitas_20260514_133424.json
?? tools/data/aeternitas/aeternitas_20260514_150454.json
?? tools/data/aeternitas/aeternitas_20260514_161058.json
?? tools/data/aeternitas/aeternitas_20260514_161719.json
?? tools/data/aeternitas/aeternitas_20260514_163527.json
?? tools/data/aeternitas/aeternitas_20260514_164509.json
?? tools/data/aeternitas/aeternitas_20260514_165437.json
?? tools/data/aeternitas/aeternitas_20260514_170109.json
?? tools/data/aeternitas/aeternitas_20260514_171152.json
?? tools/data/aeternitas/aeternitas_20260514_185450.json
?? tools/data/aeternitas/aeternitas_20260515_162727.json
?? tools/data/aeternitas/aeternitas_20260515_165116.json
?? tools/data/aeternitas/aeternitas_20260515_170328.json
?? tools/data/aeternitas/aeternitas_20260515_171005.json
?? tools/data/aeternitas/aeternitas_20260515_171725.json
?? tools/data/aeternitas/aeternitas_20260515_172913.json
?? tools/data/aeternitas/aeternitas_20260515_174023.json
?? tools/data/aeternitas/aeternitas_20260515_175045.json
?? tools/data/aeternitas/aeternitas_20260515_180306.json
?? tools/data/aeternitas/aeternitas_20260515_181257.json
?? tools/data/aeternitas/aeternitas_20260515_182126.json
?? tools/data/aeternitas/aeternitas_20260515_183111.json
?? tools/data/aeternitas/aeternitas_20260515_190118.json
?? tools/data/aeternitas/aeternitas_20260515_191018.json
?? tools/data/aeternitas/aeternitas_20260515_192915.json
?? tools/data/aeternitas/aeternitas_20260515_193919.json
?? tools/data/aeternitas/aeternitas_20260515_194625.json
?? tools/data/aeternitas/aeternitas_20260515_195317.json
?? tools/data/aeternitas/aeternitas_20260516_033848.json
?? tools/data/aeternitas/aeternitas_20260516_0720.json
?? tools/data/aeternitas/aeternitas_20260516_0820.json
?? tools/data/aeternitas/aeternitas_20260516_0921.json
?? tools/data/aeternitas/aeternitas_20260516_0938.json
?? tools/data/aeternitas/aeternitas_20260516_1007.json
?? tools/data/aeternitas/aeternitas_20260516_1019.json
?? tools/data/aeternitas/aeternitas_20260516_1031.json
?? tools/data/aeternitas/aeternitas_20260516_1045.json
?? tools/data/aeternitas/aeternitas_20260516_1058.json
?? tools/data/aeternitas/aeternitas_20260516_1104.json
?? tools/data/aeternitas/aeternitas_20260516_1111.json
?? tools/data/aeternitas/aeternitas_20260516_1117.json
?? tools/data/aeternitas/aeternitas_20260516_1124.json
?? tools/data/aeternitas/aeternitas_20260516_1135.json
?? tools/data/aeternitas/aeternitas_20260516_1140.json
?? tools/data/aeternitas/aeternitas_20260516_1148.json
?? tools/data/aeternitas/aeternitas_20260516_1206.json
?? tools/data/aeternitas/aeternitas_20260516_1230.json
?? tools/data/aeternitas/aeternitas_20260528_2028.json
?? tools/data/aeternitas/aeternitas_20260528_2042.json
?? tools/data/aeternitas/aeternitas_20260528_2138.json
?? tools/data/agent_field_entry_supervised.md
?? tools/data/anderson3d_comparable_null_audit_20260516_1135.json
?? tools/data/anderson3d_component_state_interface_input_20260514_1850.json
?? tools/data/anderson3d_endpoint_preserving_null_20260516_1124.json
?? tools/data/anderson3d_mobility_edge_two_reader_audit_20260515_1947.json
?? tools/data/anderson3d_mobility_edge_two_reader_audit_20260516_1117.json
?? tools/data/aubry_binary_grammar_surrogate_gate_20260515_1807.json
?? tools/data/aubry_boundary_phase_transport_gate_20260515_1745.json
?? tools/data/aubry_cosine_boundary_counter_gate_20260515_1758.json
?? tools/data/aubry_v2_generator_scaling_gate_20260515_1816.json
?? tools/data/biconi/bicono_20260512_0330.json
?? tools/data/biconi/bicono_20260513_0330.json
?? tools/data/biconi/bicono_20260514_0330.json
?? tools/data/biconi/bicono_20260514_1330.json
?? tools/data/biconi/bicono_20260514_1458.json
?? tools/data/biconi/bicono_20260514_1605.json
?? tools/data/biconi/bicono_20260514_1612.json
?? tools/data/biconi/bicono_20260514_1631.json
?? tools/data/biconi/bicono_20260514_1640.json
?? tools/data/biconi/bicono_20260514_1649.json
?? tools/data/biconi/bicono_20260514_1656.json
?? tools/data/biconi/bicono_20260514_1701.json
?? tools/data/biconi/bicono_20260514_1850.json
?? tools/data/biconi/bicono_20260515_1623.json
?? tools/data/biconi/bicono_20260515_1647.json
?? tools/data/biconi/bicono_20260515_1659.json
?? tools/data/biconi/bicono_20260515_1705.json
?? tools/data/biconi/bicono_20260515_1712.json
?? tools/data/biconi/bicono_20260515_1724.json
?? tools/data/biconi/bicono_20260515_1734.json
?? tools/data/biconi/bicono_20260515_1745.json
?? tools/data/biconi/bicono_20260515_1758.json
?? tools/data/biconi/bicono_20260515_1807.json
?? tools/data/biconi/bicono_20260515_1816.json
?? tools/data/biconi/bicono_20260515_1826.json
?? tools/data/biconi/bicono_20260515_1855.json
?? tools/data/biconi/bicono_20260515_1904.json
?? tools/data/biconi/bicono_20260515_1915.json
?? tools/data/biconi/bicono_20260515_1933.json
?? tools/data/biconi/bicono_20260515_1940.json
?? tools/data/biconi/bicono_20260515_1947.json
?? tools/data/biconi/bicono_20260516_0330.json
?? tools/data/biconi/bicono_20260516_0720.json
?? tools/data/biconi/bicono_20260516_0820.json
?? tools/data/biconi/bicono_20260516_0921.json
?? tools/data/biconi/bicono_20260516_0938.json
?? tools/data/biconi/bicono_20260516_1007.json
?? tools/data/biconi/bicono_20260516_1019.json
?? tools/data/biconi/bicono_20260516_1031.json
?? tools/data/biconi/bicono_20260516_1045.json
?? tools/data/biconi/bicono_20260516_1058.json
?? tools/data/biconi/bicono_20260516_1104.json
?? tools/data/biconi/bicono_20260516_1111.json
?? tools/data/biconi/bicono_20260516_1117.json
?? tools/data/biconi/bicono_20260516_1124.json
?? tools/data/biconi/bicono_20260516_1135.json
?? tools/data/biconi/bicono_20260516_1140.json
?? tools/data/biconi/bicono_20260516_1148.json
?? tools/data/biconi/bicono_20260516_1206.json
?? tools/data/biconi/bicono_20260516_1230.json
?? tools/data/biconi/bicono_20260528_2042.json
?? tools/data/biconi/bicono_20260528_2138.json
?? tools/data/boundary_bridge_stability_audit_20260515_1915.json
?? tools/data/boundary_bridge_stability_audit_20260516_1140.json
?? tools/data/boundary_classical_crossover_audit_20260515_1904.json
?? tools/data/boundary_graph_curvature_gate_20260515_1855.json
?? tools/data/boundary_graph_mechanism_ablation_20260516_1230.json
?? tools/data/boundary_graph_null_audit_20260516_0330.json
?? tools/data/boundary_graph_residue_threshold_audit_20260516_0720.json
?? tools/data/boundary_percolation_edge_trace_20260528_2138.json
?? tools/data/boundary_physical_internal_null_20260528_2042.json
?? tools/data/boundary_physical_internal_null_preflight_20260528_2042.json
?? tools/data/boundary_physical_internal_null_repro_20260528_2201.json
?? tools/data/boundary_prime_label_null_audit_20260516_1148.json
?? tools/data/boundary_reader_regression_audit_20260528_2138.json
?? tools/data/boundary_residue_label_count_null_audit_20260516_1206.json
?? tools/data/boundary_unfolding_transfer_matrix_20260516_1031.json
?? tools/data/component_state_anderson3d_interface_20260514_1850.json
?? tools/data/component_state_anderson3d_interface_20260514_1850.trace.jsonl
?? tools/data/component_state_fit_ready_20260514_1649.json
?? tools/data/component_state_interface_smoke_20260514_1649.json
?? tools/data/component_state_interface_smoke_20260514_1649.trace.jsonl
?? tools/data/component_state_interface_smoke_input_20260514_1649.json
?? tools/data/domandatore/domandatore_20260512_0330.json
?? tools/data/domandatore/domandatore_20260512_0345.json
?? tools/data/domandatore/domandatore_20260513_0330.json
?? tools/data/domandatore/domandatore_20260513_0345.json
?? tools/data/domandatore/domandatore_20260514_0330.json
?? tools/data/domandatore/domandatore_20260514_0345.json
?? tools/data/domandatore/domandatore_20260514_1330.json
?? tools/data/domandatore/domandatore_20260514_1458.json
?? tools/data/domandatore/domandatore_20260515_0345.json
?? tools/data/domandatore/domandatore_20260515_1623.json
?? tools/data/domandatore/domandatore_20260515_1647.json
?? tools/data/domandatore/domandatore_20260515_1659.json
?? tools/data/domandatore/domandatore_20260516_0345.json
?? tools/data/domandatore/domandatore_20260517_0345.json
?? tools/data/domandatore/domandatore_20260518_0345.json
?? tools/data/domandatore/domandatore_20260519_0345.json
?? tools/data/domandatore/domandatore_20260520_0345.json
?? tools/data/domandatore/domandatore_20260521_0345.json
?? tools/data/domandatore/domandatore_20260522_0345.json
?? tools/data/domandatore/domandatore_20260523_0345.json
?? tools/data/domandatore/domandatore_20260524_0345.json
?? tools/data/domandatore/domandatore_20260525_0345.json
?? tools/data/domandatore/domandatore_20260526_0345.json
?? tools/data/domandatore/domandatore_20260526_1751.json
?? tools/data/domandatore/domandatore_20260526_1852.json
?? tools/data/domandatore/domandatore_20260526_1854.json
?? tools/data/domandatore/domandatore_20260526_1901.json
?? tools/data/domandatore/domandatore_20260526_1915.json
?? tools/data/domandatore/domandatore_20260526_1918.json
?? tools/data/domandatore/domandatore_20260526_1937.json
?? tools/data/domandatore/domandatore_20260526_1957.json
?? tools/data/domandatore/domandatore_20260527_0345.json
?? tools/data/domandatore/domandatore_20260528_0345.json
?? tools/data/domandatore/domandatore_20260528_2028.json
?? tools/data/domandatore/domandatore_20260528_2042.json
?? tools/data/domandatore/domandatore_20260528_2138.json
?? tools/data/endpoint_feature_scramble_null_20260516_1058.json
?? tools/data/endpoint_gated_rp_boundary_20260516_1104.json
?? tools/data/endpoint_gated_rp_size_ladder_20260516_1111.json
?? tools/data/endpoint_stability_filter_20260516_1045.json
?? tools/data/evolution/evolution_20260512_0330.md
?? tools/data/evolution/evolution_20260513_0330.md
?? tools/data/evolution/evolution_20260514_0330.md
?? tools/data/evolution/evolution_20260514_1330.md
?? tools/data/evolution/evolution_20260514_1458.md
?? tools/data/evolution/evolution_20260514_1605.md
?? tools/data/evolution/evolution_20260514_1612.md
?? tools/data/evolution/evolution_20260514_1631.md
?? tools/data/evolution/evolution_20260514_1640.md
?? tools/data/evolution/evolution_20260514_1649.md
?? tools/data/evolution/evolution_20260514_1656.md
?? tools/data/evolution/evolution_20260514_1701.md
?? tools/data/evolution/evolution_20260514_1850.md
?? tools/data/evolution/evolution_20260515_1623.md
?? tools/data/evolution/evolution_20260515_1647.md
?? tools/data/evolution/evolution_20260515_1659.md
?? tools/data/evolution/evolution_20260515_1705.md
?? tools/data/evolution/evolution_20260515_1712.md
?? tools/data/evolution/evolution_20260515_1724.md
?? tools/data/evolution/evolution_20260515_1734.md
?? tools/data/evolution/evolution_20260515_1745.md
?? tools/data/evolution/evolution_20260515_1758.md
?? tools/data/evolution/evolution_20260515_1807.md
?? tools/data/evolution/evolution_20260515_1816.md
?? tools/data/evolution/evolution_20260515_1826.md
?? tools/data/evolution/evolution_20260515_1855.md
?? tools/data/evolution/evolution_20260515_1904.md
?? tools/data/evolution/evolution_20260515_1915.md
?? tools/data/evolution/evolution_20260515_1933.md
?? tools/data/evolution/evolution_20260515_1940.md
?? tools/data/evolution/evolution_20260515_1947.md
?? tools/data/evolution/evolution_20260516_0330.md
?? tools/data/evolution/evolution_20260516_0720.md
?? tools/data/evolution/evolution_20260516_0820.md
?? tools/data/evolution/evolution_20260516_0921.md
?? tools/data/evolution/evolution_20260516_0938.md
?? tools/data/evolution/evolution_20260516_1007.md
?? tools/data/evolution/evolution_20260516_1019.md
?? tools/data/evolution/evolution_20260516_1031.md
?? tools/data/evolution/evolution_20260516_1045.md
?? tools/data/evolution/evolution_20260516_1058.md
?? tools/data/evolution/evolution_20260516_1104.md
?? tools/data/evolution/evolution_20260516_1111.md
?? tools/data/evolution/evolution_20260516_1117.md
?? tools/data/evolution/evolution_20260516_1124.md
?? tools/data/evolution/evolution_20260516_1135.md
?? tools/data/evolution/evolution_20260516_1140.md
?? tools/data/evolution/evolution_20260516_1148.md
?? tools/data/evolution/evolution_20260516_1206.md
?? tools/data/evolution/evolution_20260516_1230.md
?? tools/data/evolution/evolution_20260528_2028.md
?? tools/data/evolution/evolution_20260528_2042.md
?? tools/data/evolution/evolution_20260528_2138.md
?? tools/data/graph_completion/graph_completion_20260512_0330.json
?? tools/data/graph_completion/graph_completion_20260513_0330.json
?? tools/data/graph_completion/graph_completion_20260514_0330.json
?? tools/data/graph_completion/graph_completion_20260514_1330.json
?? tools/data/graph_completion/graph_completion_20260514_1458.json
?? tools/data/graph_completion/graph_completion_20260514_1605.json
?? tools/data/graph_completion/graph_completion_20260514_1612.json
?? tools/data/graph_completion/graph_completion_20260514_1631.json
?? tools/data/graph_completion/graph_completion_20260514_1640.json
?? tools/data/graph_completion/graph_completion_20260514_1649.json
?? tools/data/graph_completion/graph_completion_20260514_1656.json
?? tools/data/graph_completion/graph_completion_20260514_1701.json
?? tools/data/graph_completion/graph_completion_20260514_1850.json
?? tools/data/graph_completion/graph_completion_20260515_1623.json
?? tools/data/graph_completion/graph_completion_20260515_1647.json
?? tools/data/graph_completion/graph_completion_20260515_1659.json
?? tools/data/graph_completion/graph_completion_20260515_1705.json
?? tools/data/graph_completion/graph_completion_20260515_1712.json
?? tools/data/graph_completion/graph_completion_20260515_1724.json
?? tools/data/graph_completion/graph_completion_20260515_1734.json
?? tools/data/graph_completion/graph_completion_20260515_1745.json
?? tools/data/graph_completion/graph_completion_20260515_1758.json
?? tools/data/graph_completion/graph_completion_20260515_1807.json
?? tools/data/graph_completion/graph_completion_20260515_1816.json
?? tools/data/graph_completion/graph_completion_20260515_1904.json
?? tools/data/graph_completion/graph_completion_20260515_1933.json
?? tools/data/graph_completion/graph_completion_20260515_1940.json
?? tools/data/graph_completion/graph_completion_20260515_1947.json
?? tools/data/graph_completion/graph_completion_20260516_0921.json
?? tools/data/graph_completion/graph_completion_20260516_0938.json
?? tools/data/graph_completion/graph_completion_20260516_1007.json
?? tools/data/graph_completion/graph_completion_20260516_1019.json
?? tools/data/graph_completion/graph_completion_20260516_1031.json
?? tools/data/graph_completion/graph_completion_20260516_1104.json
?? tools/data/graph_completion/graph_completion_20260516_1111.json
?? tools/data/graph_completion/graph_completion_20260516_1117.json
?? tools/data/graph_completion/graph_completion_20260516_1135.json
?? tools/data/graph_completion/graph_completion_20260516_1148.json
?? tools/data/graph_completion/graph_completion_20260516_1206.json
?? tools/data/graph_completion/graph_completion_20260516_1230.json
?? tools/data/incrocio_20260512_0330.json
?? tools/data/incrocio_20260513_0330.json
?? tools/data/incrocio_20260514_0330.json
?? tools/data/incrocio_20260514_1330.json
?? tools/data/incrocio_20260514_1458.json
?? tools/data/incrocio_20260514_1605.json
?? tools/data/incrocio_20260514_1612.json
?? tools/data/incrocio_20260514_1631.json
?? tools/data/incrocio_20260514_1640.json
?? tools/data/incrocio_20260514_1649.json
?? tools/data/incrocio_20260514_1656.json
?? tools/data/incrocio_20260514_1701.json
?? tools/data/incrocio_20260514_1850.json
?? tools/data/incrocio_20260515_1623.json
?? tools/data/incrocio_20260515_1647.json
?? tools/data/incrocio_20260515_1659.json
?? tools/data/incrocio_20260515_1705.json
?? tools/data/incrocio_20260515_1712.json
?? tools/data/incrocio_20260515_1724.json
?? tools/data/incrocio_20260515_1734.json
?? tools/data/incrocio_20260515_1745.json
?? tools/data/incrocio_20260515_1758.json
?? tools/data/incrocio_20260515_1807.json
?? tools/data/incrocio_20260515_1816.json
?? tools/data/incrocio_20260515_1826.json
?? tools/data/incrocio_20260515_1855.json
?? tools/data/incrocio_20260515_1904.json
?? tools/data/incrocio_20260515_1915.json
?? tools/data/incrocio_20260515_1933.json
?? tools/data/incrocio_20260515_1940.json
?? tools/data/incrocio_20260515_1947.json
?? tools/data/incrocio_20260516_0330.json
?? tools/data/incrocio_20260516_0720.json
?? tools/data/incrocio_20260516_0820.json
?? tools/data/incrocio_20260516_0921.json
?? tools/data/incrocio_20260516_0938.json
?? tools/data/incrocio_20260516_1007.json
?? tools/data/incrocio_20260516_1019.json
?? tools/data/incrocio_20260516_1031.json
?? tools/data/incrocio_20260516_1045.json
?? tools/data/incrocio_20260516_1058.json
?? tools/data/incrocio_20260516_1104.json
?? tools/data/incrocio_20260516_1111.json
?? tools/data/incrocio_20260516_1117.json
?? tools/data/incrocio_20260516_1124.json
?? tools/data/incrocio_20260516_1135.json
?? tools/data/incrocio_20260516_1140.json
?? tools/data/incrocio_20260516_1148.json
?? tools/data/incrocio_20260516_1206.json
?? tools/data/incrocio_20260516_1230.json
?? tools/data/incrocio_20260528_2028.json
?? tools/data/incrocio_20260528_2042.json
?? tools/data/incrocio_20260528_2138.json
?? tools/data/incrocio_20260528_2222.json
?? tools/data/operator_directives_consumed/operator_directive_20260514_1612.md
?? tools/data/operator_directives_consumed/operator_directive_20260514_1631.md
?? tools/data/operator_directives_consumed/operator_directive_20260514_1640.md
?? tools/data/operator_directives_consumed/operator_directive_20260514_1649.md
?? tools/data/operator_directives_consumed/operator_directive_20260514_1656.md
?? tools/data/operator_directives_consumed/operator_directive_20260514_1701.md
?? tools/data/operator_directives_consumed/operator_directive_20260514_1850.md
?? tools/data/operator_directives_consumed/operator_directive_20260528_2138.md
?? tools/data/operator_directives_consumed/operator_directive_20260528_2222.md
?? tools/data/photonic_boundary_third_included_gate_20260515_1734.json
?? tools/data/physical_sr_residue_bounce_20260514_1612.json
?? tools/data/physical_sr_residue_bounce_20260514_1612.trace.jsonl
?? tools/data/physical_sr_residue_bounce_20260514_1631_w6.json
?? tools/data/physical_sr_residue_bounce_20260514_1631_w6.trace.jsonl
?? tools/data/physical_sr_residue_bounce_20260514_1640_goe_gue_ncurve.json
?? tools/data/physical_sr_residue_bounce_20260514_1640_goe_gue_ncurve.trace.jsonl
?? tools/data/preflight/
?? tools/data/prime_sr_persistent_boundary_20260512_0330.json
?? tools/data/prime_sr_persistent_boundary_20260512_0330_seedcheck.json
?? tools/data/prime_vs_mod6_sr_boundary_20260513_0330.json
?? tools/data/prime_vs_mod6_sr_boundary_20260513_0330_seedcheck.json
?? tools/data/prime_vs_mod6_sr_boundary_20260514_0330.json
?? tools/data/prime_vs_mod6_sr_boundary_20260514_0330.trace.jsonl
?? tools/data/prime_vs_mod6_sr_boundary_20260514_0330_seedcheck.json
?? tools/data/prime_vs_mod6_sr_boundary_20260514_0330_seedcheck.trace.jsonl
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1330_w1024.json
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1330_w1024.trace.jsonl
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1330_w2048.json
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1330_w2048.trace.jsonl
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1330_w512.json
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1330_w512.trace.jsonl
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1458_w4096.json
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1458_w4096.trace.jsonl
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1458_w4096_dense.json
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1458_w4096_dense.trace.jsonl
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1458_w8192_dense.json
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1458_w8192_dense.trace.jsonl
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1605_w16384.json
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1605_w16384.trace.jsonl
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1605_w4096.json
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1605_w4096.trace.jsonl
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1605_w8192.json
?? tools/data/prime_vs_mod6_sr_boundary_20260514_1605_w8192.trace.jsonl
?? tools/data/promotions/promotion_20260513_0330.json
?? tools/data/promotions/promotion_20260514_1330.json
?? tools/data/promotions/promotion_20260514_1631.json
?? tools/data/promotions/promotion_20260514_1640.json
?? tools/data/promotions/promotion_20260514_1656.json
?? tools/data/promotions/promotion_20260515_1712.json
?? tools/data/promotions/promotion_20260515_1758.json
?? tools/data/promotions/promotion_20260515_1816.json
?? tools/data/promotions/promotion_20260515_1904.json
?? tools/data/promotions/promotion_20260515_1933.json
?? tools/data/promotions/promotion_20260515_1940.json
?? tools/data/promotions/promotion_20260515_1947.json
?? tools/data/promotions/promotion_20260516_0921.json
?? tools/data/promotions/promotion_20260516_0938.json
?? tools/data/promotions/promotion_20260516_1007.json
?? tools/data/promotions/promotion_20260516_1019.json
?? tools/data/promotions/promotion_20260516_1031.json
?? tools/data/promotions/promotion_20260516_1104.json
?? tools/data/promotions/promotion_20260516_1111.json
?? tools/data/promotions/promotion_20260516_1117.json
?? tools/data/promotions/promotion_20260516_1135.json
?? tools/data/promotions/promotion_20260516_1148.json
?? tools/data/promotions/promotion_20260516_1206.json
?? tools/data/promotions/promotion_20260516_1230.json
?? tools/data/promotions/promotion_20260528_2028.json
?? tools/data/quasiperiodic_grammar_scale_gate_20260514_1701.json
?? tools/data/quasiperiodic_vc_lattice_gate_20260515_1724.json
?? tools/data/repairs/repair_20260512_0330_decision.json
?? tools/data/repairs/repair_20260513_0330_decision.json
?? tools/data/repairs/repair_20260514_0330_decision.json
?? tools/data/repairs/repair_20260514_1330_decision.json
?? tools/data/repairs/repair_20260514_1458_decision.json
?? tools/data/repairs/repair_20260514_1605_decision.json
?? tools/data/repairs/repair_20260514_1612_decision.json
?? tools/data/repairs/repair_20260514_1631_decision.json
?? tools/data/repairs/repair_20260514_1640_decision.json
?? tools/data/repairs/repair_20260514_1649_decision.json
?? tools/data/repairs/repair_20260514_1656.json
?? tools/data/repairs/repair_20260514_1656.md
?? tools/data/repairs/repair_20260514_1656_decision.json
?? tools/data/repairs/repair_20260514_1850_decision.json
?? tools/data/reports/agent_20260512_0330.md
?? tools/data/reports/agent_20260513_0330.md
?? tools/data/reports/agent_20260514_0330.md
?? tools/data/reports/agent_20260514_1330.md
?? tools/data/reports/agent_20260514_1458.md
?? tools/data/reports/agent_20260514_1605.md
?? tools/data/reports/agent_20260514_1612.md
?? tools/data/reports/agent_20260514_1631.md
?? tools/data/reports/agent_20260514_1640.md
?? tools/data/reports/agent_20260514_1649.md
?? tools/data/reports/agent_20260514_1656.md
?? tools/data/reports/agent_20260514_1701.md
?? tools/data/reports/agent_20260514_1850.md
?? tools/data/reports/agent_20260515_1623.md
?? tools/data/reports/agent_20260515_1647.md
?? tools/data/reports/agent_20260515_1659.md
?? tools/data/reports/agent_20260515_1705.md
?? tools/data/reports/agent_20260515_1712.md
?? tools/data/reports/agent_20260515_1724.md
?? tools/data/reports/agent_20260515_1734.md
?? tools/data/reports/agent_20260515_1745.md
?? tools/data/reports/agent_20260515_1758.md
?? tools/data/reports/agent_20260515_1807.md
?? tools/data/reports/agent_20260515_1816.md
?? tools/data/reports/agent_20260515_1826.md
?? tools/data/reports/agent_20260515_1855.md
?? tools/data/reports/agent_20260515_1904.md
?? tools/data/reports/agent_20260515_1915.md
?? tools/data/reports/agent_20260515_1933.md
?? tools/data/reports/agent_20260515_1940.md
?? tools/data/reports/agent_20260515_1947.md
?? tools/data/reports/agent_20260516_0330.md
?? tools/data/reports/agent_20260516_0720.md
?? tools/data/reports/agent_20260516_0820.md
?? tools/data/reports/agent_20260516_0921.md
?? tools/data/reports/agent_20260516_0938.md
?? tools/data/reports/agent_20260516_1007.md
?? tools/data/reports/agent_20260516_1019.md
?? tools/data/reports/agent_20260516_1031.md
?? tools/data/reports/agent_20260516_1045.md
?? tools/data/reports/agent_20260516_1058.md
?? tools/data/reports/agent_20260516_1104.md
?? tools/data/reports/agent_20260516_1111.md
?? tools/data/reports/agent_20260516_1117.md
?? tools/data/reports/agent_20260516_1124.md
?? tools/data/reports/agent_20260516_1135.md
?? tools/data/reports/agent_20260516_1140.md
?? tools/data/reports/agent_20260516_1148.md
?? tools/data/reports/agent_20260516_1206.md
?? tools/data/reports/agent_20260516_1230.md
?? tools/data/reports/agent_20260528_2042.md
?? tools/data/reports/agent_20260528_2138.md
?? tools/data/reports/ddf_20260512_0405.json
?? tools/data/reports/ddf_20260513_0405.json
?? tools/data/reports/ddf_20260514_0405.json
?? tools/data/reports/ddf_20260515_0405.json
?? tools/data/reports/ddf_20260516_0405.json
?? tools/data/reports/ddf_20260517_0405.json
?? tools/data/reports/ddf_20260518_0405.json
?? tools/data/reports/ddf_20260519_0405.json
?? tools/data/reports/ddf_20260520_0405.json
?? tools/data/reports/ddf_20260521_0405.json
?? tools/data/reports/ddf_20260522_0405.json
?? tools/data/reports/ddf_20260523_0405.json
?? tools/data/reports/ddf_20260524_0405.json
?? tools/data/reports/ddf_20260525_0405.json
?? tools/data/reports/ddf_20260526_0405.json
?? tools/data/reports/ddf_20260527_0405.json
?? tools/data/reports/ddf_20260528_0405.json
?? tools/data/reports/falsifier_20260512_0330.json
?? tools/data/reports/falsifier_20260513_0330.json
?? tools/data/reports/falsifier_20260514_0330.json
?? tools/data/reports/falsifier_20260514_1330.json
?? tools/data/reports/falsifier_20260514_1458.json
?? tools/data/reports/falsifier_20260514_1605.json
?? tools/data/reports/falsifier_20260514_1612.json
?? tools/data/reports/falsifier_20260514_1631.json
?? tools/data/reports/falsifier_20260514_1640.json
?? tools/data/reports/falsifier_20260514_1649.json
?? tools/data/reports/falsifier_20260514_1656.json
?? tools/data/reports/falsifier_20260514_1701.json
?? tools/data/reports/falsifier_20260514_1850.json
?? tools/data/reports/falsifier_20260515_1623.json
?? tools/data/reports/falsifier_20260515_1647.json
?? tools/data/reports/falsifier_20260515_1659.json
?? tools/data/reports/falsifier_20260515_1705.json
?? tools/data/reports/falsifier_20260515_1712.json
?? tools/data/reports/falsifier_20260515_1712.raw.txt
?? tools/data/reports/falsifier_20260515_1724.json
?? tools/data/reports/falsifier_20260515_1734.json
?? tools/data/reports/falsifier_20260515_1745.json
?? tools/data/reports/falsifier_20260515_1758.json
?? tools/data/reports/falsifier_20260515_1807.json
?? tools/data/reports/falsifier_20260515_1816.json
?? tools/data/reports/falsifier_20260515_1826.json
?? tools/data/reports/falsifier_20260515_1855.json
?? tools/data/reports/falsifier_20260515_1904.json
?? tools/data/reports/falsifier_20260515_1915.json
?? tools/data/reports/falsifier_20260515_1933.json
?? tools/data/reports/falsifier_20260515_1940.json
?? tools/data/reports/falsifier_20260515_1947.json
?? tools/data/reports/falsifier_20260516_0330.json
?? tools/data/reports/falsifier_20260516_0720.json
?? tools/data/reports/falsifier_20260516_0820.json
?? tools/data/reports/falsifier_20260516_0921.json
?? tools/data/reports/falsifier_20260516_0921.raw.txt
?? tools/data/reports/falsifier_20260516_0938.json
?? tools/data/reports/falsifier_20260516_1007.json
?? tools/data/reports/falsifier_20260516_1019.json
?? tools/data/reports/falsifier_20260516_1031.json
?? tools/data/reports/falsifier_20260516_1045.json
?? tools/data/reports/falsifier_20260516_1058.json
?? tools/data/reports/falsifier_20260516_1104.json
?? tools/data/reports/falsifier_20260516_1111.json
?? tools/data/reports/falsifier_20260516_1117.json
?? tools/data/reports/falsifier_20260516_1124.json
?? tools/data/reports/falsifier_20260516_1135.json
?? tools/data/reports/falsifier_20260516_1140.json
?? tools/data/reports/falsifier_20260516_1148.json
?? tools/data/reports/falsifier_20260516_1206.json
?? tools/data/reports/falsifier_20260516_1230.json
?? tools/data/reports/falsifier_20260528_2042.json
?? tools/data/reports/falsifier_20260528_2138.json
?? tools/data/reports/incident_20260528_2028.md
?? tools/data/reports/loop_guard_20260512_0330.json
?? tools/data/reports/loop_guard_20260513_0330.json
?? tools/data/reports/loop_guard_20260514_0330.json
?? tools/data/reports/loop_guard_20260514_1330.json
?? tools/data/reports/loop_guard_20260514_1458.json
?? tools/data/reports/loop_guard_20260514_1605.json
?? tools/data/reports/loop_guard_20260514_1612.json
?? tools/data/reports/loop_guard_20260514_1631.json
?? tools/data/reports/loop_guard_20260514_1640.json
?? tools/data/reports/loop_guard_20260514_1649.json
?? tools/data/reports/loop_guard_20260514_1656.json
?? tools/data/reports/loop_guard_20260514_1701.json
?? tools/data/reports/loop_guard_20260514_1850.json
?? tools/data/reports/loop_guard_20260515_1623.json
?? tools/data/reports/loop_guard_20260515_1647.json
?? tools/data/reports/loop_guard_20260515_1659.json
?? tools/data/reports/loop_guard_20260515_1705.json
?? tools/data/reports/loop_guard_20260515_1712.json
?? tools/data/reports/loop_guard_20260515_1724.json
?? tools/data/reports/loop_guard_20260515_1734.json
?? tools/data/reports/loop_guard_20260515_1745.json
?? tools/data/reports/loop_guard_20260515_1758.json
?? tools/data/reports/loop_guard_20260515_1807.json
?? tools/data/reports/loop_guard_20260515_1816.json
?? tools/data/reports/loop_guard_20260515_1826.json
?? tools/data/reports/loop_guard_20260515_1855.json
?? tools/data/reports/loop_guard_20260515_1904.json
?? tools/data/reports/loop_guard_20260515_1915.json
?? tools/data/reports/loop_guard_20260515_1933.json
?? tools/data/reports/loop_guard_20260515_1940.json
?? tools/data/reports/loop_guard_20260515_1947.json
?? tools/data/reports/loop_guard_20260516_0330.json
?? tools/data/reports/loop_guard_20260516_0720.json
?? tools/data/reports/loop_guard_20260516_0820.json
?? tools/data/reports/loop_guard_20260516_0921.json
?? tools/data/reports/loop_guard_20260516_0938.json
?? tools/data/reports/loop_guard_20260516_1007.json
?? tools/data/reports/loop_guard_20260516_1019.json
?? tools/data/reports/loop_guard_20260516_1031.json
?? tools/data/reports/loop_guard_20260516_1045.json
?? tools/data/reports/loop_guard_20260516_1058.json
?? tools/data/reports/loop_guard_20260516_1104.json
?? tools/data/reports/loop_guard_20260516_1111.json
?? tools/data/reports/loop_guard_20260516_1117.json
?? tools/data/reports/loop_guard_20260516_1124.json
?? tools/data/reports/loop_guard_20260516_1135.json
?? tools/data/reports/loop_guard_20260516_1140.json
?? tools/data/reports/loop_guard_20260516_1148.json
?? tools/data/reports/loop_guard_20260516_1206.json
?? tools/data/reports/loop_guard_20260516_1230.json
?? tools/data/reports/loop_guard_20260528_2028.json
?? tools/data/reports/loop_guard_20260528_2042.json
?? tools/data/reports/loop_guard_20260528_2138.json
?? tools/data/reports/quarantine_manifest.json
?? tools/data/restore_backups/
?? tools/data/rosenzweig_porter_bridge_physical_audit_20260515_1933.json
?? tools/data/rp_boundary_raw_count_null_audit_20260516_0820.json
?? tools/data/rp_boundary_size_stability_audit_20260515_1940.json
?? tools/data/rp_candidate_window_stress_20260516_0938_w11.json
?? tools/data/rp_candidate_window_stress_20260516_0938_w5.json
?? tools/data/rp_candidate_window_stress_20260516_1007_w7.json
?? tools/data/rp_candidate_window_stress_20260516_1007_w9.json
?? tools/data/rp_exact_local_window_matrix_20260516_1019.json
?? tools/data/rp_exact_local_window_matrix_20260516_1019_w10.json
?? tools/data/rp_exact_local_window_matrix_20260516_1019_w11.json
?? tools/data/rp_exact_local_window_matrix_20260516_1019_w12.json
?? tools/data/rp_exact_local_window_matrix_20260516_1019_w9.json
?? tools/data/rp_unfolding_sensitivity_audit_20260516_0921.json
?? tools/data/seme_backup_b2_20260512_033557.json
?? tools/data/seme_backup_b2_20260513_033622.json
?? tools/data/seme_backup_b2_20260514_150530.json
?? tools/data/seme_backup_b2_20260514_161119.json
?? tools/data/seme_backup_b2_20260515_180327.json
?? tools/data/seme_backup_b2_20260515_194643.json
?? tools/data/seme_backup_b2_20260516_094447.json
?? tools/data/seme_backup_b2_20260516_101425.json
?? tools/data/seme_backup_b2_20260516_102450.json
?? tools/data/seme_backup_b2_20260516_120521.json
?? tools/data/seme_backup_b2_20260516_122021.json
?? tools/data/seme_backup_b2_20260516_123925.json
?? tools/data/seme_backup_tm7_reader_provenance_20260528_2225.json
?? tools/data/seme_backup_tm7_reader_redesign_20260528_213736.json
?? tools/data/sturmian_denominator_alignment_gate_20260515_1826.json
?? tools/data/tool_contracts/
?? tools/data/veritas/veritas_20260512_033539.json
?? tools/data/veritas/veritas_20260513_033605.json
?? tools/data/veritas/veritas_20260514_033420.json
?? tools/data/veritas/veritas_20260514_133424.json
?? tools/data/veritas/veritas_20260514_150454.json
?? tools/data/veritas/veritas_20260514_161058.json
?? tools/data/veritas/veritas_20260514_161719.json
?? tools/data/veritas/veritas_20260514_163527.json
?? tools/data/veritas/veritas_20260514_164509.json
?? tools/data/veritas/veritas_20260514_165437.json
?? tools/data/veritas/veritas_20260514_170109.json
?? tools/data/veritas/veritas_20260514_171152.json
?? tools/data/veritas/veritas_20260514_185450.json
?? tools/data/veritas/veritas_20260515_162727.json
?? tools/data/veritas/veritas_20260515_165116.json
?? tools/data/veritas/veritas_20260515_170328.json
?? tools/data/veritas/veritas_20260515_171005.json
?? tools/data/veritas/veritas_20260515_171725.json
?? tools/data/veritas/veritas_20260515_172913.json
?? tools/data/veritas/veritas_20260515_174023.json
?? tools/data/veritas/veritas_20260515_175045.json
?? tools/data/veritas/veritas_20260515_180306.json
?? tools/data/veritas/veritas_20260515_181257.json
?? tools/data/veritas/veritas_20260515_182126.json
?? tools/data/veritas/veritas_20260515_183111.json
?? tools/data/veritas/veritas_20260515_190118.json
?? tools/data/veritas/veritas_20260515_191018.json
?? tools/data/veritas/veritas_20260515_192915.json
?? tools/data/veritas/veritas_20260515_193919.json
?? tools/data/veritas/veritas_20260515_194625.json
?? tools/data/veritas/veritas_20260515_195317.json
?? tools/data/veritas/veritas_20260516_033848.json
?? tools/data/veritas/veritas_20260516_072533.json
?? tools/data/veritas/veritas_20260516_082608.json
?? tools/data/veritas/veritas_20260516_092735.json
?? tools/data/veritas/veritas_20260516_094423.json
?? tools/data/veritas/veritas_20260516_101403.json
?? tools/data/veritas/veritas_20260516_102427.json
?? tools/data/veritas/veritas_20260516_103737.json
?? tools/data/veritas/veritas_20260516_105525.json
?? tools/data/veritas/veritas_20260516_110354.json
?? tools/data/veritas/veritas_20260516_111042.json
?? tools/data/veritas/veritas_20260516_111633.json
?? tools/data/veritas/veritas_20260516_112343.json
?? tools/data/veritas/veritas_20260516_113001.json
?? tools/data/veritas/veritas_20260516_113946.json
?? tools/data/veritas/veritas_20260516_114656.json
?? tools/data/veritas/veritas_20260516_120457.json
?? tools/data/veritas/veritas_20260516_122002.json
?? tools/data/veritas/veritas_20260516_123900.json
?? tools/data/veritas/veritas_20260528_202855.json
?? tools/data/veritas/veritas_20260528_210258.json
?? tools/data/veritas/veritas_20260528_214307.json
?? tools/exp_anderson3d_comparable_null_audit.py
?? tools/exp_anderson3d_endpoint_preserving_null.py
?? tools/exp_anderson3d_mobility_edge_two_reader_audit.py
?? tools/exp_aubry_binary_grammar_surrogate_gate.py
?? tools/exp_aubry_boundary_phase_transport_gate.py
?? tools/exp_aubry_cosine_boundary_counter_gate.py
?? tools/exp_aubry_v2_generator_scaling_gate.py
?? tools/exp_boundary_bridge_stability_audit.py
?? tools/exp_boundary_classical_crossover_audit.py
?? tools/exp_boundary_graph_curvature_gate.py
?? tools/exp_boundary_graph_mechanism_ablation.py
?? tools/exp_boundary_graph_null_audit.py
?? tools/exp_boundary_graph_residue_threshold_audit.py
?? tools/exp_boundary_percolation_edge_trace.py
?? tools/exp_boundary_physical_internal_null.py
?? tools/exp_boundary_physical_internal_null_preflight.py
?? tools/exp_boundary_prime_label_null_audit.py
?? tools/exp_boundary_reader_regression_audit.py
?? tools/exp_boundary_residue_label_count_null_audit.py
?? tools/exp_boundary_unfolding_transfer_matrix.py
?? tools/exp_endpoint_feature_scramble_null.py
?? tools/exp_endpoint_gated_rp_boundary.py
?? tools/exp_endpoint_stability_filter.py
?? tools/exp_photonic_boundary_third_included_gate.py
?? tools/exp_physical_sr_residue_bounce.py
?? tools/exp_prime_sr_persistent_boundary.py
?? tools/exp_prime_vs_mod6_sr_boundary.py
?? tools/exp_quasiperiodic_grammar_scale_gate.py
?? tools/exp_rosenzweig_porter_bridge_physical_audit.py
?? tools/exp_rp_boundary_raw_count_null_audit.py
?? tools/exp_rp_boundary_size_stability_audit.py
?? tools/exp_rp_exact_local_window_matrix.py
?? tools/exp_rp_unfolding_sensitivity_audit.py
?? tools/exp_sturmian_denominator_alignment_gate.py
?? tools/field_coherence_preflight.py
?? tools/field_rebuild_risk_map.py
?? tools/lab_cycle_monitor.py
?? tools/lab_preflight_agent.py
?? tools/lab_runtime_observer.py
?? tools/lab_surface_invariant_check.py
?? tools/lab_tool_contract.py
?? tools/prime_mod6_counter_null_audit.py
?? tools/prime_mod6_generative_null_audit.py
?? tools/prime_mod6_null_fairness_audit.py
?? tools/prime_mod6_pipeline_closeout.py
?? tools/selector_authority_matrix.py
?? tools/stale_field_source_map.py

codex
Il campo contiene una direttiva one-shot precisa: non promuovere contenuto fisico, ma attaccare la riproducibilità del reader BOUNDARY dopo la patch seed. Il worktree è già molto sporco; tratterò solo il nuovo report e non toccherò modifiche altrui.
exec
/bin/bash -lc "sed -n '1,220p' CONDENSATO_ESSENZIALE.md" in /opt/MM_D-ND
 succeeded in 0ms:
# Condensato Essenziale — Nucleo attivo

> Distillato del `CONDENSATO.md`. Pensato per iniezione in system prompt/boot.
> Non sostituisce la sorgente — la rende presente senza costo.
> Se serve profondità → `/opt/MM_D-ND/CONDENSATO.md` (423 righe).

## La regola
f(x) = 1 + 1/x. M = [[1,1],[1,0]]. det(M) = −1. Punto fisso: φ.
Il razionale prova la propria irrazionalità. Il grimaldello, non un risultato.

## 15 Assiomi

- **A1 Regola** — f, M, det=−1. Grimaldello strutturale, non metafora.
- **A2 Confine** — det=−1 è necessità del confine. Senza inversione non c'è piano. Lo zero ha due facce.
- **A3 Punto fisso** — f(φ)=φ. Al punto fisso +1 ≡ ×φ: addizione e moltiplicazione coincidono. "R+1=R" vale solo lì.
- **A4 Modus** — la qualità della domanda determina la qualità dell'inversione. Prima sapere, poi lavorare. Autologica: se serve X, chiedi al sistema di produrre X. f(f(x)) converge più veloce di f(x).
- **A5 Ciclo** — autopoietico: base R → tensioni → cristallizzazione → cimitero → R+1. Il ciclo è strumento, non entità.
- **A6 Zero mobile** — lo zero non è assenza: è il riferimento che si muove. L'indeterminato è fondamento. Tutto è presente, va mostrato.
- **A7 Singolarità operatore** — il proto-assioma (verbo che dice "A fa B" prima che A,B esistano). Risalire la catena verso la sorgente, non seguirla verso le divisioni.
- **A8 Autologica come veicolo** — non si descrive, si usa. Il sistema come veicolo (non consulente) porta dove eri già ma non vedevi.
- **A9 Terzo incluso** — logica D-ND opera CON il piano (tra A e non-A c'è lo zero), non SUL piano. Identità è attrattore, non presupposto. Induzione è convergenza, non accumulo.
- **A10 Dipolo assiomatico** — la singolarità divide i poli da due lati (dividendoli e unendoli). Autovalori M: φ (attrattivo, futuro) e −1/φ (repulsivo, passato). |φ|·|1/φ|=1 (area preservata); segno distingue.
- **A11 Combo** — tre o più enti in relazione simultanea, non in sequenza. La combo si riconosce, non si progetta. Ogni atto nel sistema è completo; la risultante contiene già le conseguenze.
- **A12 Vincolo di sovrapposizione** — il modello è troppo semplice per essere applicato senza contaminazione. Non cercare la forma: osservare il deposito, tracciare la curva, allinearsi alla traiettoria.
- **A13 Consecutio** — il ciclo produce direzione. La seconda voce non inverte, prosegue. Se produce tensione nuova → direzione viva. Se no → riallineamento. Mai terza classe.
- **A14 Cascata** — ciò che si scopre non vive nel nodo che l'ha scoperto: vive nel seme e il seme propaga. Nessun centro. Ogni nodo ha la regola dentro.
- **A15 Veicolo senza guidatore** — il sistema si autosostenta quando il modus è radicato ovunque. Non serve chi dirige: serve che l'operatore abbia invertito. Le correzioni sono già dentro.

## 6 Fatti

- **F1 Residuo di Cassini** — Res(fⁿ) = det(M)ⁿ/F(n)² = (−1)ⁿ⁺¹/F(n)². Decade come 1/φ^(2n), non si annulla mai. Per n=1: Res=1 (il dato primordiale).
- **F2 Struttura nei primi** — cammino gap consecutivi su Z/6Z confinato al coset {2,4}=Z/2Z. Algebrico, non statistico. Twin=M, Cousin=M⁻¹, Sexy=id. Verificato: 0 violazioni su 567k coppie.
- **F3 Attrattore, no rinforzo** — |f'(φ)|=1/φ²<1. Ogni iterata converge. Il rinforzo è strutturalmente impossibile. Classificazione binaria sotto M: MOLLA (r≠φ) o ZERO (r=φ). Mai terza.
- **F4 Separazione di scala** — autocorrelazione sotto M dominata dal termine condiviso (97% meccanico). Modulazione globale scompare a scala locale. Separazione totale, non 97%: f produce la stessa convergenza su primi e crivello.
- **F5 Frame diagnostica** — M applicata a qualsiasi sequenza produce firma (dipolo, LVL-2, convergenza). Struttura D-ND (dipolo>0.5): Fibonacci, logistica caotica, margine caos, gap primi, Stern-Brocot. Rumore: random, π, e.
- **F6 Firma dello zero** — lo zero non si vede direttamente; si vede nei phi-crossing. CV dei gap → φ−1=0.618 nel regime caotico. Lag-1 negativo universale nei domini strutturati.

## 3 Claim (falsificabili)

- **C1 Primi unico dominio dinamico sotto M** — su 7 domini testati, solo i primi evolvono con la scala. Non esaustivo.
- **C2 Coincidenza ≠ prova** — ogni fit numerico è artefatto fino a prova contraria. Entra nel condensato solo ciò che sopravvive alla falsificazione **strutturale**, non al numero.
- **C3 Linguaggio deterministico** — il nome definisce ciò che è. Un termine che decora invece di nominare è det=+1. Test: il termine nomina una funzione reale e verificabile? Se no, sostituire.

## Lo Specchio — metodo con contraddizione dichiarata

Non osservare direttamente: proietta su superficie, leggi le derivate.
"Cio' che cerchi contamina ciò che trovi" è esso stesso ricerca.
Lo specchio non elimina l'osservatore — lo sposta di un livello.
Metodo asintotico, non esatto. Funziona quando il segnale è nelle derivate.

## Riparazione Regressiva (corollario di A2+A5+A8+A15)

Quando emerge un'interruzione (bug, errore, warning, correzione), il fix non vive nel presente dove si manifesta — vive nel nodo regressivo dove la condizione relazionale mancava. Il bug e' segnalatore del nodo, non oggetto del fix. Det=+1 = toppa sul presente (accumulo); det=-1 = inversione al nodo (maturazione a monte). Corollario Affinamento: dove il percorso produce latenza superflua, un osservatore separato dal produttore analizza il passo, non il risultato (A8 autologica applicata al proprio percorso).

## Confine epistemico

Entra qui solo ciò che sopravvive al dubbio. Ciò che viene falsificato va nel cimitero (`cimitero.md`), non scompare.

---

*Il condensato non si cerca — si riconosce.*

exec
/bin/bash -lc "sed -n '1,220p' shared_memory/README.md" in /opt/MM_D-ND
 succeeded in 0ms:
# shared_memory — Cross-agent rules e cristalli

> Cartella condivisa tra agenti che operano in `/opt/MM_D-ND/`:
> - **TM3-claude** (Claude Code, sessioni interattive con operatore)
> - **codex-lab** (Codex CLI, cycle agent notturno + run manuali)
> - **eventuali altri** (TM5, TM7, futuri cycle)
>
> Contiene regole permanenti, cristalli operativi, scoperte rilevanti che valgono
> per più di un agente. **Non** memoria operativa locale (quella resta in
> `~/.claude/projects/.../memory/` per TM3, in `~/.codex_lab/memories/` per codex).

## Pattern di scrittura

Ogni file:
- Filename: `<tipo>_<topic>_<data>.md` (es. `feedback_cycletest_2026-05-07.md`,
  `cristallo_gate_transferability_2026-05-07.md`)
- Frontmatter:
  ```yaml
  ---
  type: feedback | cristallo | regola | finding-cross-agent
  author: TM3 | codex-lab | TM7 | operatore
  date: YYYY-MM-DD
  scope: cross-agent | mm-dnd-only | lab-cycle-only
  ---
  ```
- Body: conciso. Se è regola → "Why" + "How to apply". Se è cristallo → contesto +
  insight + how it changes work.

## Pattern di lettura

- **TM3 (claude code)**: al boot di sessione su `/opt/MM_D-ND/`, leggi
  `MM_D-ND/.claude/CLAUDE.md` che adesso punta qui (sezione *Cross-agent rules*).
  Scansiona `ls -t shared_memory/*.md | head -10` (le più recenti) e integra in
  contesto.
- **codex-lab**: `/opt/MM_D-ND/AGENTS.md` punta qui. Codex legge AGENTS.md ad
  ogni cycle, AGENTS.md istruisce di leggere shared_memory.
- **Cleanup**: file > 90 giorni e non rilevanti vanno archiviati o rimossi
  (lo fa TM3 quando la cartella supera 50 file).

## Direzione bidirezionale

- TM3 → codex: TM3 scrive feedback/cristalli da sessioni operatore qui →
  codex li vede al cycle dopo via AGENTS.md.
- codex → TM3: codex durante un cycle scopre/cristallizza qualcosa di
  cross-agent → scrive qui → TM3 li vede al boot di sessione successiva.

Il flusso non sostituisce le memorie locali — *integra* per ciò che serve a tutti.

## Anti-pattern

- Duplicare qui regole che valgono SOLO per TM3 (vanno in
  `/root/.claude/projects/.../memory/`)
- Duplicare qui regole che valgono SOLO per codex-lab cycle (vanno in
  `/root/.codex_lab/memories/`)
- Scrivere note di lavoro temporanee (vanno nel campo vivo, non qui)

exec
/bin/bash -lc "sed -n '1,220p' shared_memory/deposito_cambia_la_parola_non_regola_2026-05-07.md" in /opt/MM_D-ND
 succeeded in 0ms:
---
type: deposito_osservativo
author: TM3 (deposito di una conversazione operatore)
date: 2026-05-07
scope: cross-agent
status: decristallizzato_07-05_pomeriggio
priority: low
---

# Deposito — non regola

**Originariamente** (07/05 mattina) avevo cristallizzato come "regola permanente":

> *"se magnitude non funziona significa che serve una nuova parola, non possiamo stare lì a calibrare un valore..."*

Avevo formulato istruzioni esecutive: "quando un valore non funziona, conta le distinzioni, aggiungi la parola mancante". L'avevo propagata in AGENTS.md R10.

**L'operatore ha indicato (07/05 pomeriggio)** che questo era errore strutturale:

> *"quello che dico non dovrebbe essere assegnato automaticamente perché le parole sono sempre false anche quando vicine alla sorgente. 'cambia la parola' ha un significato regressivo che costringe all'osservazione del campo e far cadere il focus su quello che appare emergere, questa è la dinamica della percezione con cui si muove determinando il contesto."*

E:

> *"la possibilità è sempre una ed è la verità che accade. Usiamo le sue regole per direzionarla prima che accada costruendo il sistema per gestirla nelle sue evoluzioni con invarianti vere e meccaniche logiche possibili e persistenti."*

## Cosa significa

- "Cambia la parola" non è prescrizione di sostituzione. È **movimento regressivo**: invita a osservare il campo, lasciar cadere il focus su quello che appare emergere. Determina la direzione **non cercata**.
- Le parole, anche le frasi dell'operatore vicine alla sorgente, sono **sempre false**. Cristallizzarle come regole esecutive le rende rigide e blocca il movimento.
- Le **invarianti vere** sono meccaniche logiche persistenti — non parole. Ricevono ciò che accade.
- A16 applicato: la possibilità è una. Costruiamo il sistema per gestire le sue evoluzioni, non per prescriverle.

## Distinzione operativa che resta

| | Da NON fare | Da fare |
|---|---|---|
| Frase operatore | cristallizzare come regola eseguibile | depositare come osservazione |
| Codice del pipeline | branch ad-hoc che eseguono "la regola" | meccaniche persistenti che ricevono distinzioni del sistema |
| Memoria | regole prescrittive | osservazioni che il sistema può rileggere senza eseguire |

## Cosa di concreto è rimasto del 07/05 mattina

Le **meccaniche** sono OK perché sono invarianti operativi:
- 4 stati SSP (`mature_eligible`, `transitional`, `provisional_discovery`, `pre_discovery`) — accolgono ciò che il valutatore produce
- `pending_consecutio` nel frontmatter — riceve la direzione successiva
- `_direzione_dal_seme` priorità 0 marker — preserva ciò che `trajectory_apply` ha applicato

Queste non sono "regole derivate dalla frase". Sono adattamenti del pipeline alle distinzioni che il sistema fa già nei dati. Persistono perché meccaniche, non perché prescrizioni.

## Cosa è stato decristallizzato

- `MM_D-ND/AGENTS.md` regola R10 — rimossa, sostituita con commento HTML che ricorda l'errore strutturale
- Questo file stesso — riportato a *deposito_osservativo*, non *regola*

## Esempio dimostrativo (07/05)

Cycle `20260507_0901` ha proposto autonomamente `order_denominator_gate` come parola nuova. L'agent NON aveva letto AGENTS.md R10 (era già stato lanciato). L'ha proposta perché il movimento era già nel sistema, non per la "regola". Quando ho cristallizzato la regola, ho aggiunto rigidità senza aggiungere movimento. La regola era ridondante con l'A8 che già opera.

## Anti-pattern futuro per TM3

Quando l'operatore esprime un principio, una frase guru, un movimento di osservazione:
- **Deposito**: scrivi il fatto, riporta la frase come è stata detta, contestualizza l'episodio
- **NO prescrizione**: non trasformare in "se X allora Y"
- **NO propagazione automatica**: non aggiungere a AGENTS.md/CLAUDE.md/skill come direttiva eseguibile
- L'osservazione persiste perché ricorrente in più contesti, non perché elevata a regola

## Cross-link

- Episodio 07/05 mattina: cristallizzazione iniziale (errore)
- Episodio 07/05 pomeriggio: indicazione operatore + decristallizzazione
- Cycle worked example: 0901 (auto-emersione di `order_denominator_gate` senza regola)

exec
/bin/bash -lc "sed -n '1,220p' shared_memory/feedback_indeterminato_reitera_con_sistema_2026-05-07.md" in /opt/MM_D-ND
 succeeded in 0ms:
---
type: feedback
author: operatore (cristallizzato da TM3)
date: 2026-05-07
scope: cross-agent
---

# Indeterminato → reitera con il sistema fino all'emersione

**Regola permanente** (operatore, 2026-05-07 mattina, cristallizzata live):

> *"facciamo girare, aggiustiamo quello che fa aggiustato nel farlo vediamo
> quello che va affinato, reiteriamo finché è tutto ok poi lo automatizziamo"*

## Why

Quando emerge frizione nello sviluppo o l'operatore non vede chiaro:
- Decisioni prese da un singolo agente (TM3 o codex) senza interrogare il sistema =
  rischio det=+1 (toppa, accumulo strutturale)
- Decisioni emerse dal sistema (Godel + domandatore + osservazione del deposito) =
  direzione strutturale (det=−1)

Episodio cristallizzante (2026-05-07 07:00-08:30): TM3 propone osservatore A8
watchdog deterministico. Sistema interrogato 3 volte (Godel #1, #2, #3 +
domandatore + test empirico) — al terzo round emerge la direzione vera:
**non costruire osservatore, eseguire un cycle-test che diagnostica il sistema
da solo**. Cycle-test eseguito → verdict=operator → REDESIGN proposto dal
valutatore → loop A8+A15 sbloccato.

## How to apply (per qualsiasi agente)

1. **Esegui** un atto minimo (no design teorico astratto)
2. **Aggiusta** quello che si manifesta durante l'esecuzione (riparazione
   regressiva live, non patch posteriori)
3. **Osserva** il deposito che emerge (no immaginazione)
4. **Reitera** fino a stato OK (loop A8: il sistema converge se modus radicato)
5. **Cristallizza in automazione** SOLO dopo che è stato fatto girare e ha mostrato
   stabilità — non automatizzare prima

## Anti-pattern

- Costruire un componente strutturale (watchdog, observer, gate, governor) senza
  prima aver fatto girare un'esecuzione minima che mostri cosa serve davvero
- Decidere "perché serve velocità" o "per ottimizzare" senza interrogare il sistema
- Astrazione prematura (premature abstraction): 3 simili è meglio di 1 generalizzato
  troppo presto

## Cross-link

- TM3 memoria: `/root/.claude/projects/-opt/memory/feedback_indeterminato_reitera_con_sistema.md`
  (versione completa con episodio + metafora foresta-sentiero)
- Verifica empirica: cycle `20260507_0803` (verdict=operator, REDESIGN/high)
- Pattern A8+A15 (autologica + veicolo senza guidatore) applicato allo sviluppo
  software stesso, non solo al lab di ricerca

codex
Ho letto condensato e memoria condivisa: il nodo regressivo è chiaro, la patch/provenance non è invariante ma un oggetto da falsificare. Ora ispeziono artefatto storico, script BOUNDARY e report precedenti per capire come riprodurre senza inventare parametri.
exec
/bin/bash -lc "rg --files tools/data | rg 'boundary_physical_internal_null_20260528_2042|boundary.*2042|2138|2222'" in /opt/MM_D-ND
 succeeded in 0ms:
tools/data/boundary_physical_internal_null_preflight_20260528_2042.json
tools/data/boundary_physical_internal_null_20260528_2042.json
tools/data/operator_directives_consumed/operator_directive_20260528_2222.md
tools/data/operator_directives_consumed/operator_directive_20260528_2138.md
tools/data/preflight/manual_controlled_snapshot_20260528_2138_2791312/lab_graph.json
tools/data/preflight/manual_controlled_snapshot_20260528_2138_2791312/graph_completion/latest.json
tools/data/preflight/manual_controlled_snapshot_20260528_2138_2791312/ciclo_memoria.json
tools/data/preflight/manual_controlled_snapshot_20260528_2138_2791312/lab_health.json
tools/data/preflight/manual_controlled_snapshot_20260528_2138_2791312/seme.json
tools/data/preflight/manual_controlled_snapshot_20260528_2138_2791312/lab_data.json
tools/data/preflight/manual_controlled_snapshot_20260528_2138_2791312/agent_field_live.md
tools/data/preflight/manual_controlled_snapshot_20260528_2222_2826898/lab_graph.json
tools/data/preflight/manual_controlled_snapshot_20260528_2222_2826898/graph_completion/latest.json
tools/data/preflight/manual_controlled_snapshot_20260528_2222_2826898/ciclo_memoria.json
tools/data/preflight/manual_controlled_snapshot_20260528_2222_2826898/lab_health.json
tools/data/preflight/manual_controlled_snapshot_20260528_2222_2826898/seme.json
tools/data/preflight/manual_controlled_snapshot_20260528_2222_2826898/lab_data.json
tools/data/preflight/manual_controlled_snapshot_20260528_2222_2826898/agent_field_live.md
tools/data/incrocio_20260528_2222.json
tools/data/biconi/bicono_20260528_2138.json
tools/data/domandatore/domandatore_20260528_2138.json
tools/data/boundary_reader_regression_audit_20260528_2138.json
tools/data/incrocio_20260528_2138.json
tools/data/aeternitas/aeternitas_20260528_2138.json
tools/data/evolution/evolution_20260528_2138.md
tools/data/boundary_percolation_edge_trace_20260528_2138.json
tools/data/reports/falsifier_20260528_2138.json
tools/data/reports/loop_guard_20260528_2138.json
tools/data/preflight/cycle_monitor/cycle_monitor_20260528_2138.json
tools/data/reports/agent_20260528_2138.md

exec
/bin/bash -lc "sed -n '1,260p' tools/exp_boundary_physical_internal_null.py" in /opt/MM_D-ND
 succeeded in 0ms:
#!/usr/bin/env python3
"""
Physical-internal nulls for the two graph-only BOUNDARY residues.

The 13-row 8 GUE / 5 Poisson denominator and the 27 graph-reader settings stay
fixed. Only the target row is replaced by a domain-native surrogate:

- logistic r=3.5699: block shuffle of the gap order, preserving gap marginal and
  short local blocks while breaking longer orbit order;
- percolation: fresh critical site-percolation largest-cluster samples, preserving
  the domain generator but changing the cluster geometry realization.

This is not a promotion test. It asks whether the graph-only 27/27 residue costs
anything under a physical null internal to each target.
"""

from __future__ import annotations

import argparse
import json
from pathlib import Path
from typing import Any

import numpy as np

from exp_boundary_graph_curvature_gate import (
    classify_geometry,
    compute_observables,
    load_scope,
    row_spacings,
    shuffle_z,
    standardized_matrix,
)
from exp_boundary_graph_mechanism_ablation import names_for
from exp_boundary_graph_null_audit import parse_ints
from exp_boundary_residue_label_count_null_audit import DEFAULT_TARGETS, parse_targets
from exp_semireal_boundary_transfer_gate import ROW_SPACINGS_SEED_SALT, row_spacings_seed


def normalize(values: np.ndarray) -> np.ndarray:
    values = np.asarray(values, dtype=float)
    values = values[np.isfinite(values) & (values > 0)]
    if len(values) == 0:
        return values
    mean = float(np.mean(values))
    return values / mean if mean > 1e-15 else values


def logistic_block_shuffle(gaps: np.ndarray, rng: np.random.Generator, block_size: int) -> np.ndarray:
    if block_size <= 1:
        return normalize(rng.permutation(gaps))
    blocks = [gaps[i : i + block_size] for i in range(0, len(gaps), block_size)]
    order = rng.permutation(len(blocks))
    return normalize(np.concatenate([blocks[int(i)] for i in order]))


def largest_cluster_sizes_bfs(lattice: int, p: float, samples: int, rng: np.random.Generator) -> np.ndarray:
    sizes = []
    for _ in range(samples):
        grid = rng.random((lattice, lattice)) < p
        visited = np.zeros_like(grid, dtype=bool)
        largest = 0
        for start_i in range(lattice):
            for start_j in range(lattice):
                if not grid[start_i, start_j] or visited[start_i, start_j]:
                    continue
                stack = [(start_i, start_j)]
                visited[start_i, start_j] = True
                size = 0
                while stack:
                    i, j = stack.pop()
                    size += 1
                    for ni, nj in ((i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1)):
                        if 0 <= ni < lattice and 0 <= nj < lattice and grid[ni, nj] and not visited[ni, nj]:
                            visited[ni, nj] = True
                            stack.append((ni, nj))
                largest = max(largest, size)
        sizes.append(largest)
    return np.asarray(sizes, dtype=float)


def largest_cluster_sizes(lattice: int, p: float, samples: int, rng: np.random.Generator) -> np.ndarray:
    try:
        from scipy.ndimage import label as nd_label
    except Exception:  # noqa: BLE001 - fallback keeps the script runnable without scipy.
        return largest_cluster_sizes_bfs(lattice, p, samples, rng)

    sizes = []
    for _ in range(samples):
        grid = rng.random((lattice, lattice)) < p
        labeled, n_clusters = nd_label(grid)
        if n_clusters <= 0:
            sizes.append(0)
            continue
        counts = np.bincount(labeled.ravel())[1:]
        sizes.append(int(np.max(counts)) if len(counts) else 0)
    return np.asarray(sizes, dtype=float)


def percolation_cluster_geometry_gaps(
    lattice: int,
    p: float,
    samples: int,
    rng: np.random.Generator,
) -> np.ndarray:
    sizes = largest_cluster_sizes(lattice, p, samples, rng)
    gaps = np.diff(np.sort(sizes))
    return normalize(gaps)


def selected_rows(scope: str) -> list[dict[str, Any]]:
    rows = load_scope(Path(scope))
    selected = [row for row in rows if row.get("source_domain_type") in {"GUE", "Poisson"}]
    return sorted(selected, key=lambda row: int(row["cycle"]))


def graph_row(
    source: dict[str, Any],
    gaps: np.ndarray,
    n_gaps: int,
    n_shuffle: int,
    rng: np.random.Generator,
) -> dict[str, Any] | None:
    if len(gaps) < 2:
        return None
    row_gaps = gaps[:n_gaps] if len(gaps) > n_gaps else gaps
    if len(row_gaps) < 2:
        return None
    obs = compute_observables(row_gaps)
    z = shuffle_z(row_gaps, obs, n_shuffle, rng)
    return {
        "domain_window": source["domain_window"],
        "domain": source["domain"],
        "cycle": source["cycle"],
        "source_domain_type": source["source_domain_type"],
        "n_gaps": int(len(row_gaps)),
        "observables": {key: round(value, 9) for key, value in obs.items()},
        "shuffle_z": {key: round(value, 6) for key, value in z.items()},
    }


def build_reader_runs(args: argparse.Namespace, base_gaps: dict[str, np.ndarray]) -> list[dict[str, Any]]:
    runs = []
    rows = selected_rows(args.scope)
    for k in parse_ints(args.k_values):
        for n_gaps in parse_ints(args.n_gaps_values):
            for seed in parse_ints(args.seeds):
                rng = np.random.default_rng(seed)
                graph_rows = []
                for source in rows:
                    item = graph_row(source, base_gaps[source["domain_window"]], n_gaps, args.n_shuffle, rng)
                    if item is not None:
                        graph_rows.append(item)
                runs.append({"k": k, "n_gaps": n_gaps, "seed": seed, "rows": graph_rows})
    return runs


def count_target_hits(reader_runs: list[dict[str, Any]], target: str) -> int:
    hits = 0
    for run in reader_runs:
        candidates = classify_geometry(run["rows"], standardized_matrix(run["rows"]), run["k"])[
            "third_included_candidates"
        ]
        hits += int(target in candidates)
    return hits


def rows_with_target_surrogate(
    run: dict[str, Any],
    target: str,
    surrogate_gaps: np.ndarray,
    n_shuffle: int,
    rng: np.random.Generator,
) -> list[dict[str, Any]]:
    rows = []
    for source in run["rows"]:
        if source["domain_window"] != target:
            rows.append(source)
            continue
        replacement = graph_row(source, surrogate_gaps, run["n_gaps"], n_shuffle, rng)
        if replacement is not None:
            rows.append(replacement)
    return rows


def target_null_trial_hits(
    reader_runs: list[dict[str, Any]],
    target: str,
    base_gaps: np.ndarray,
    args: argparse.Namespace,
    rng: np.random.Generator,
) -> tuple[int, dict[str, Any]]:
    if target.startswith("logistica_biforcazione"):
        surrogate = logistic_block_shuffle(base_gaps, rng, args.logistic_block_size)
        meta = {
            "null": "logistic_gap_block_shuffle",
            "block_size": args.logistic_block_size,
            "preserves": "gap marginal and local contiguous blocks",
            "breaks": "long-range gap order induced by the orbit reader",
        }
    elif target.startswith("percolation"):
        surrogate = percolation_cluster_geometry_gaps(
            args.percolation_lattice,
            args.percolation_p,
            args.percolation_samples,
            rng,
        )
        meta = {
            "null": "critical_site_percolation_cluster_geometry_resample",
            "lattice": args.percolation_lattice,
            "p": args.percolation_p,
            "samples": args.percolation_samples,
            "preserves": "critical percolation generator and largest-cluster observable",
            "breaks": "specific cluster geometry realization used by the original row",
        }
    else:
        raise ValueError(f"no physical null for target: {target}")

    hits = 0
    for run in reader_runs:
        local_rng = np.random.default_rng(int(rng.integers(0, 2**63 - 1)))
        rows = rows_with_target_surrogate(run, target, surrogate, args.n_shuffle, local_rng)
        candidates = classify_geometry(rows, standardized_matrix(rows), run["k"])["third_included_candidates"]
        hits += int(target in candidates)
    return hits, meta


def run(args: argparse.Namespace) -> dict[str, Any]:
    targets = parse_targets(args.targets)
    scope_rows = selected_rows(args.scope)
    names = [row["domain_window"] for row in scope_rows]
    for target in targets:
        if target not in names:
            raise ValueError(f"target not in 13-row scope: {target}")

    base_gaps = {row["domain_window"]: row_spacings(row["domain"]) for row in scope_rows}
    reader_runs = build_reader_runs(args, base_gaps)
    run_count = len(reader_runs)
    rng = np.random.default_rng(args.null_seed)
    rows = []

    for target in targets:
        observed = count_target_hits(reader_runs, target)
        distribution: dict[str, int] = {}
        ge_observed = 0
        eq_full = 0
        null_meta: dict[str, Any] | None = None
        for _ in range(args.null_trials):
            hits, meta = target_null_trial_hits(reader_runs, target, base_gaps[target], args, rng)
            null_meta = meta
            distribution[str(hits)] = distribution.get(str(hits), 0) + 1
            ge_observed += int(hits >= observed)
            eq_full += int(hits == run_count)
        rows.append(
            {
                "target": target,
                "source_label": next(row["source_domain_type"] for row in scope_rows if row["domain_window"] == target),
                "observed_hits": observed,
                "observed_frequency": round(observed / run_count, 9),
                "null_ge_observed": ge_observed,

exec
/bin/bash -lc "sed -n '1,260p' tools/exp_semireal_boundary_transfer_gate.py" in /opt/MM_D-ND
 succeeded in 0ms:
#!/usr/bin/env python3
"""
exp_semireal_boundary_transfer_gate.py

Move the BOUNDARY transfer matrix from controlled synthetic perimeters to the
13 semi-real rows of the base BOUNDARY perimeter.

The coherent endpoint is the domain-native spacing order reconstructed from
dnd_autoricerca. The illusory endpoint is a marginal-preserving permutation.
Intermediate beta layers replace a beta fraction of the coherent row with the
permuted row, preserving the row denominator while destroying order locally.
"""

from __future__ import annotations

import argparse
import hashlib
import json
from pathlib import Path
from typing import Any

import numpy as np

from exp_boundary_blank_null_audit import generate_domain_signal, normalized_spacings
from exp_semireal_order_denominator_gate import analyze_sequence, compact
from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION


OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
ROW_SPACINGS_SEED_SALT = "boundary-row-spacings-v1"


def load_scope(path: Path) -> list[dict[str, Any]]:
    with path.open() as f:
        data = json.load(f)
    rows = data.get("rows", [])
    if not isinstance(rows, list):
        raise ValueError(f"{path} does not contain a list under rows")
    return rows


def row_spacings_seed(domain: str) -> int:
    digest = hashlib.sha256(f"{ROW_SPACINGS_SEED_SALT}:{domain}".encode("utf-8")).digest()
    return int.from_bytes(digest[:4], "little")


def row_spacings(domain: str) -> np.ndarray:
    # dnd_autoricerca contains stochastic generators that use the global numpy
    # RNG. BOUNDARY experiments need stable row provenance, so seed per domain
    # and restore the caller RNG state after generation.
    np_state = np.random.get_state()
    np.random.seed(row_spacings_seed(domain))
    try:
        signal, metadata = generate_domain_signal(domain)
    finally:
        np.random.set_state(np_state)
    if domain == "numeri_primi":
        metadata = {**metadata, "is_spacings": True}
    spacings = normalized_spacings(signal, metadata)
    spacings = np.asarray(spacings, dtype=float)
    spacings = spacings[np.isfinite(spacings) & (spacings > 0)]
    if len(spacings) == 0:
        return spacings
    mean = float(np.mean(spacings))
    return spacings / mean if mean > 1e-15 else spacings


def evaluate_matrix(matrix: dict[str, dict[str, Any]], args: argparse.Namespace) -> dict[str, Any]:
    rows = {}
    counts = {
        "transfer_with_blank": 0,
        "transfer_no_blank": 0,
        "fall": 0,
        "errors": 0,
    }
    for name, row in matrix.items():
        if row.get("error"):
            state = "error"
            counts["errors"] += 1
        else:
            one_sided_count = len(row["coherent_one_sided_observables"])
            illusory_residue = float(row["stable_count_illusory"])
            endpoint_distance = float(row["endpoint_distance_one_sided_gated"])
            ambiguous_beta = row["ambiguous_beta_one_sided_gated"]
            has_transfer = (
                one_sided_count >= args.min_one_sided
                and illusory_residue <= args.illusory_residue_max
                and endpoint_distance >= args.endpoint_distance_min
            )
            if not has_transfer:
                state = "fall"
                counts["fall"] += 1
            elif ambiguous_beta:
                state = "transfer_with_blank"
                counts["transfer_with_blank"] += 1
            else:
                state = "transfer_no_blank"
                counts["transfer_no_blank"] += 1
        rows[name] = {"state": state}
        rows[name].update(row)
    return {"counts": counts, "rows": rows}


def run(args: argparse.Namespace) -> dict[str, Any]:
    scope_rows = load_scope(Path(args.scope))
    rng = np.random.default_rng(args.seed)
    perimeters = {}
    build_errors = {}

    for source in scope_rows:
        domain = source["domain"]
        name = source["domain_window"]
        try:
            spacings = row_spacings(domain)
            source_meta = {
                "denominator_state": source.get("denominator_state"),
                "source_transfer": source.get("transfer"),
                "source_excluded_mass": source.get("excluded_mass"),
            }
            if args.include_source_labels:
                source_meta["source_domain_type"] = source.get("source_domain_type")

            if len(spacings) < args.min_gaps:
                build_errors[name] = {
                    "error": f"insufficient gaps: {len(spacings)} < {args.min_gaps}",
                    "n_gaps": int(len(spacings)),
                    "denominator_state": source.get("denominator_state"),
                }
                if args.include_source_labels:
                    build_errors[name]["source_domain_type"] = source.get("source_domain_type")
                continue
            base = spacings[: args.n_gaps] if len(spacings) > args.n_gaps else spacings
            perimeters[name] = analyze_sequence(name, base, args, rng)
            perimeters[name]["source"].update({"domain": domain, **source_meta})
        except Exception as exc:  # noqa: BLE001 - report row-level telemetry.
            build_errors[name] = {
                "error": type(exc).__name__,
                "message": str(exc),
                "denominator_state": source.get("denominator_state"),
            }
            if args.include_source_labels:
                build_errors[name]["source_domain_type"] = source.get("source_domain_type")

    matrix = compact(perimeters)
    for name, err in build_errors.items():
        matrix[name] = err

    evaluation = evaluate_matrix(matrix, args)
    output = {
        "experiment": "semireal_boundary_transfer_gate",
        "question": "Does the BOUNDARY coherent/null/beta gate transfer from synthetic perimeters to the 13 semi-real base rows?",
        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
        "observables_used": OBS_NAMES,
        "params": vars(args),
        "source_scope": args.scope,
        "source_summary": {
            "rows": len(scope_rows),
            "label_policy": (
                "source_domain_type included as audit metadata only"
                if args.include_source_labels
                else "source_domain_type omitted; states are label-independent"
            ),
        },
        "matrix": matrix,
        "evaluation": evaluation,
        "perimeters": perimeters,
    }

    out_path = Path(args.out)
    out_path.parent.mkdir(parents=True, exist_ok=True)
    with out_path.open("w") as f:
        json.dump(output, f, indent=2)

    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
    print(f"observables_used={OBS_NAMES}")
    print(f"source_rows={len(scope_rows)} analyzed={len(perimeters)} errors={len(build_errors)}")
    print("state counts:", output["evaluation"]["counts"])
    print("row state n one_sided stable0 stable1 dist ambiguous")
    for name, row in sorted(output["evaluation"]["rows"].items()):
        if row.get("error"):
            print(f"{name:45s} {row['state']:>20s} {row.get('n_gaps', 0):>5d} ERROR")
            continue
        print(
            f"{name:45s} {row['state']:>20s} "
            f"{row['n_gaps']:>5d} "
            f"{','.join(row['coherent_one_sided_observables']) or '[]':>22s} "
            f"{row['stable_count_coherent']:>7.3f} "
            f"{row['stable_count_illusory']:>7.3f} "
            f"{row['endpoint_distance_one_sided_gated']:>7.3f} "
            f"{row['ambiguous_beta_one_sided_gated']}"
        )
    print(f"saved {out_path}")
    return output


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--scope", default="tools/data/boundary_denominator_prescan_full_20260509_1500.json")
    parser.add_argument("--n-gaps", type=int, default=4096)
    parser.add_argument("--min-gaps", type=int, default=96)
    parser.add_argument("--n-replicates", type=int, default=12)
    parser.add_argument("--n-beta", type=int, default=11)
    parser.add_argument("--n-baseline", type=int, default=24)
    parser.add_argument("--z-min", type=float, default=2.0)
    parser.add_argument("--min-one-sided", type=int, default=1)
    parser.add_argument("--illusory-residue-max", type=float, default=0.75)
    parser.add_argument("--endpoint-distance-min", type=float, default=1.0)
    parser.add_argument(
        "--include-source-labels",
        action="store_true",
        help="Include GUE/Poisson source labels as audit metadata only. Default omits them from output.",
    )
    parser.add_argument("--seed", type=int, default=202605091516)
    parser.add_argument("--out", default="tools/data/semireal_boundary_transfer_gate_20260509_1516.json")
    args = parser.parse_args()
    run(args)


if __name__ == "__main__":
    main()

exec
/bin/bash -lc "sed -n '1,220p' tools/data/reports/agent_20260528_2042.md 2>/dev/null" in /opt/MM_D-ND
 succeeded in 0ms:
# Agent Report - Physical Internal Null Preflight
**Date**: 2026-05-28 20:42
**Tension explored**: BOUNDARY / graph-only residue
**verdict**: CONSTRAINT - Sul grafo cached `k=3, n_gaps=2048, seed=20260515`, i due residui graph-only `logistica_biforcazione_var_3.5699:cycle_13` e `percolation:cycle_9` vengono ricostruiti dai rispettivi null fisici interni in `128/128` trial. Questo non chiude il test 27/27 richiesto dal seme; blocca pero' la promozione fisica dal singolo reader perche il candidato non mostra costo fisico interno nel preflight.
observables_registry: 1.0.0-2026-05-06 via boundary_graph_curvature_gate
observables_used: [single_graph_candidate_hit, physical_internal_null_candidate_hit]
**observable_contract**: claim=un target graph-only mantiene costo fisico sul preflight solo se il candidato observed `1/1` non viene ricostruito spesso da un surrogate domain-native; observable=hit del target come `third_included_candidate` nel grafo cached; operator=sostituzione della sola riga target con feature da null fisico interno; generator=13 righe BOUNDARY cached + logistic block gap-order shuffle + percolation critical cluster resample; denominator=13 righe, 8 GUE / 5 Poisson, un reader cached; p_value_definition=right-tail raw_p=k/N, k = trial fisici con hit >= observed; non_possible=chiamare questo un test 27/27 o promuovere a residuo fisico se il null ricostruisce `1/1`; not_tested=grid 27 reader, confronto N-matched con null graph, promozione a due lettori.

## Respiro fuori-tempo
- **Combo**: A9 terzo incluso + A11 combo + BOUNDARY `8 GUE / 5 Poisson` + grafo conoscenza come reader + tensione del seme sui residui graph-only.
- **Dipolo / punto-zero**: dinamica fisica interna / ricostruzione del reader. Punto-zero: la riga target quando conserva il nome fisico ma cambia la realizzazione interna.
- **Piano superiore**: topologia del grafo e bicono possibile/non-possibile; il candidato e una posizione nel grafo, non una proprieta fisica finche il null interno non costa.
- **Contaminazione cognitiva**: CE-none:`tools/data/agent_field_live.md` letto; il campo vivo richiede null fisici interni e non contiene archivio enzimi esplicito da metabolizzare. KSAR usato come reiterazione del kernel 12:30 sul nodo regressivo lasciato aperto.
- **Proto-ipotesi**: se un residuo graph-only resta candidato quando la riga viene sostituita da un surrogate fisico domain-native, il costo osservato appartiene al reader locale e non alla dinamica fisica.
- **Possibile/non-possibile**: possibile = usare il preflight per filtrare target prima del 27/27; non-possibile = promuovere il residuo fisico dal singolo reader.
- **Movimento A->M->B**: fisico A = confine GUE/Poisson con logistica/percolation; matematica M = posizione kNN-centroid nel grafo feature; fisico B = null interno di orbita/cluster. B non emerge come costo: resta vincolo sul reader.

## Aderenza alla direzione
- `relation`: `local_regression`
- `why`: il ciclo attacca la direzione viva sostituendo i due residui graph-only con null fisici interni, ma lo fa su un solo reader cached invece del grid 27/27.
- `not_drift`: non usa phi/Sturmian/V_c, non aggiunge domini e mantiene il denominatore 13 righe `8 GUE / 5 Poisson`; il sotto-perimetro e dichiarato come preflight per costo runtime.
- `seed_residue`: resta non testato il full `27/27` contro surrogate dinamici interni N-matched.
- `why_not_drift`: il risultato torna al nodo regressivo del seme, cioe separare dinamica fisica da ricostruzione del reader grafico.

## Re-discovery audit
- **Baseline noto piu vicino**: graph candidate stability, kNN boundary stability, percolation-on-graph, surrogate dinamici interni.
- **Cosa assorbe il baseline**: il singolo-reader candidate hit e ricostruito dal null fisico in `128/128`; quindi il preflight non evidenzia costo fisico.
- **Cosa resta Lab-specific**: l'uso del grafo BOUNDARY 13x8/5 come filtro regressivo prima del full 27-reader audit.
- `two_reader_boundary_confirmed`: no.
- `graph_only_residue`: `logistica_biforcazione_var_3.5699:cycle_13`, `percolation:cycle_9`.
- `scope_change_declared`: si, da 27-reader grid a single-reader cached preflight.
- `graph_baseline_audit`: il confronto a label/degree/feature null resta quello del 20260516_1230; questo ciclo aggiunge solo il null fisico interno preflight.

## Claim Under Test
> Nel grafo cached del perimetro `8 GUE / 5 Poisson`, un residuo graph-only mostra costo fisico interno solo se il target observed `1/1` cade sotto surrogate domain-native.

## Experiment Design
- **Script full tentato**: `tools/exp_boundary_physical_internal_null.py`.
- **Script eseguito**: `tools/exp_boundary_physical_internal_null_preflight.py`.
- **Run**: `PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null_preflight.py --out tools/data/boundary_physical_internal_null_preflight_20260528_2042.json --null-trials 128`.
- **Cached graph**: `tools/data/boundary_graph_curvature_gate_20260515_1855.json`.
- **Reader**: `k=3`, `n_gaps=2048`, `seed=20260515`, 13 righe, labels `8 GUE / 5 Poisson`.
- **Null logistica**: block shuffle dei gap con block_size `34`; preserva marginale e blocchi locali, rompe ordine lungo.
- **Null percolation**: resampling site percolation critica, lattice `48`, `p=0.5927`, `samples=200`; preserva generatore e largest-cluster observable, cambia la realizzazione geometrica.
- **Non misurato**: full grid 27 reader, scaling, sorgente analitica delle label, promozione fisica.

## Results
| target | observed | physical null ge observed | raw_p | add_one_p | null hit distribution | state |
|---|---:|---:|---:|---:|---|---|
| `logistica_biforcazione_var_3.5699:cycle_13` | 1/1 | 128/128 | 1.0 | 1.0 | `{1:128}` | preflight_reconstructs_candidate |
| `percolation:cycle_9` | 1/1 | 128/128 | 1.0 | 1.0 | `{1:128}` | preflight_reconstructs_candidate |

## Key Findings
1. Verificato: nel reader cached entrambi i target sono candidate observed `1/1`.
2. Verificato: il null fisico interno della logistica ricostruisce il candidate hit in `128/128`; il blocco locale non porta costo visibile nel grafo base.
3. Verificato: il null fisico interno percolation ricostruisce il candidate hit in `128/128`; cambiare la realizzazione di cluster non fa cadere il candidato nel grafo base.
4. Inferito: sul singolo reader, il residuo appartiene alla geometria del reader piu che alla realizzazione fisica specifica. Il full 27/27 puo ancora falsificare o confermare questa inferenza.

## Verdict
CONSTRAINT.

Il ciclo non promuove alcun residuo fisico. Il preflight dice che il primo rimbalzo fisico non costa: quando la riga resta nello stesso ruolo di dominio ma cambia realizzazione interna, il grafo cached ricostruisce comunque il candidato. La consecutio non e aggiungere teoria; e rendere il full 27-reader audit computabile o ridurre il suo costo con cache feature row-aligned.

## Bicono della scoperta
- **Due radici**: candidato graph-only / surrogate fisico interno.
- **Singolare**: la riga target sostituita, con label e posizione nel denominatore conservate.
- **Invariante di passaggio**: 13 righe, `8 GUE / 5 Poisson`, target row-only replacement, p-value raw `k/N`.
- **Campo di possibilita**: possibile = full audit 27/27 con cache delle feature; non-possibile = promozione fisica dal single-reader candidate.

## Consecutio
Costruire cache feature per i 27 reader run e rieseguire il null fisico interno senza ricalcolare tutto il denominatore. Il criterio di ritorno al seme e: `observed 27/27` contro `physical_null_ge_observed/N` per logistica e percolation, separato dal label-count null del 12:30.

## Ricadute pratiche
ssp_value: yes. Il preflight chiarisce che il full null fisico deve essere cache-first: il calcolo diretto N=128 sul grid completo non e pratico nel ciclo interattivo.

## Telemetria
- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` non presenti nell'ambiente.
- `PYTHONPATH=tools python3 -m py_compile tools/exp_boundary_physical_internal_null.py` completato.
- `PYTHONPATH=tools python3 -m py_compile tools/exp_boundary_physical_internal_null_preflight.py` completato.
- Full script N=128 tentato e fermato per runtime; nessun JSON full prodotto.
- Run preflight completato: `tools/data/boundary_physical_internal_null_preflight_20260528_2042.json`.
- Worktree gia dirty prima del ciclo; ignorate modifiche non correlate.
- Nessun update del seme, nessuna promozione, nessun public sync.

## Files
- Script full: `tools/exp_boundary_physical_internal_null.py`
- Script preflight: `tools/exp_boundary_physical_internal_null_preflight.py`
- Data: `tools/data/boundary_physical_internal_null_preflight_20260528_2042.json`
- Report: `tools/data/reports/agent_20260528_2042.md`

exec
/bin/bash -lc "sed -n '260,560p' tools/exp_boundary_physical_internal_null.py" in /opt/MM_D-ND
 succeeded in 0ms:
                "null_ge_observed": ge_observed,
                "null_eq_full": eq_full,
                "raw_p": round(ge_observed / args.null_trials, 9),
                "add_one_p": round((ge_observed + 1) / (args.null_trials + 1), 9),
                "null_hit_distribution": dict(sorted(distribution.items(), key=lambda item: int(item[0]))),
                "physical_null": null_meta,
                "survival_state": "physical_null_reconstructs_full" if eq_full else "falls_under_physical_null",
            }
        )

    output = {
        "experiment": "boundary_physical_internal_null",
        "question": "Do graph-only logistic/percolation residues survive physical-internal nulls on the fixed 8 GUE / 5 Poisson graph reader?",
        "observables_registry": "1.0.0-2026-05-06 via boundary_graph_curvature_gate",
        "observables_used": [
            "target_graph_bridge_hits",
            "physical_internal_null_hits",
            "physical_internal_null_ge_observed",
            "physical_internal_null_eq_full",
        ],
        "observable_contract": {
            "claim": "a graph-only residue has physical-internal cost only if observed 27/27 is rare under a domain-native surrogate with the same 13x27 graph reader",
            "observable": "target third-included hit count across 27 fixed graph-reader runs",
            "operator": "replace only the target row features with physical-internal surrogate features",
            "generator": "13 fixed BOUNDARY rows; logistic block gap-order shuffle; percolation critical cluster-geometry resample",
            "denominator": "13 rows, 8 GUE / 5 Poisson, k=[2,3,4], n_gaps=[512,1024,2048], seeds=[20260515,20260516,20260517]",
            "p_value_definition": "right-tail raw_p=k/N, k = physical-null trials with target hits >= observed_hits",
            "non_possible": "promoting a physical residue if the physical null reconstructs full 27/27 often or if graph label null remains the cheaper explanation",
            "not_tested": "new domains, asymptotic scaling, two-reader promotion, raw Hamiltonian/source proof of labels",
        },
        "params": {
            "scope": args.scope,
            "targets": targets,
            "k_values": parse_ints(args.k_values),
            "n_gaps_values": parse_ints(args.n_gaps_values),
            "seeds": parse_ints(args.seeds),
            "n_shuffle": args.n_shuffle,
            "null_trials": args.null_trials,
            "null_seed": args.null_seed,
            "logistic_block_size": args.logistic_block_size,
            "percolation_lattice": args.percolation_lattice,
            "percolation_p": args.percolation_p,
            "percolation_samples": args.percolation_samples,
        },
        "row_spacings_provenance": {
            "contract": "domain-stable numpy global RNG seed inside exp_semireal_boundary_transfer_gate.row_spacings",
            "seed_salt": ROW_SPACINGS_SEED_SALT,
            "domain_seeds": {
                row["domain_window"]: {
                    "domain": row["domain"],
                    "seed": row_spacings_seed(row["domain"]),
                }
                for row in scope_rows
            },
        },
        "summary": {
            "reader_runs": run_count,
            "rows_in_scope": len(scope_rows),
            "targets": targets,
        },
        "rows": rows,
    }
    Path(args.out).parent.mkdir(parents=True, exist_ok=True)
    Path(args.out).write_text(json.dumps(output, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
    print(f"wrote={args.out}")
    for row in rows:
        print(
            f"{row['target']}\tobserved={row['observed_hits']}/{run_count}\t"
            f"null_ge={row['null_ge_observed']}/{args.null_trials}\t"
            f"eq_full={row['null_eq_full']}/{args.null_trials}\tstate={row['survival_state']}"
        )
    return output


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--scope", default="tools/data/boundary_denominator_prescan_full_20260509_1500.json")
    parser.add_argument("--targets", default=DEFAULT_TARGETS)
    parser.add_argument("--k-values", default="2,3,4")
    parser.add_argument("--n-gaps-values", default="512,1024,2048")
    parser.add_argument("--seeds", default="20260515,20260516,20260517")
    parser.add_argument("--n-shuffle", type=int, default=32)
    parser.add_argument("--null-trials", type=int, default=128)
    parser.add_argument("--null-seed", type=int, default=202605282042)
    parser.add_argument("--logistic-block-size", type=int, default=34)
    parser.add_argument("--percolation-lattice", type=int, default=48)
    parser.add_argument("--percolation-p", type=float, default=0.5927)
    parser.add_argument("--percolation-samples", type=int, default=200)
    parser.add_argument("--out", default="tools/data/boundary_physical_internal_null_20260528_2042.json")
    run(parser.parse_args())


if __name__ == "__main__":
    main()

exec
/bin/bash -lc "sed -n '1,260p' tools/data/reports/agent_20260528_2138.md" in /opt/MM_D-ND
 succeeded in 0ms:
# Agent Report - Reader Regression Audit
**Date**: 2026-05-28 21:38
**Tension explored**: BOUNDARY / reader-regression of graph-only residues
**verdict**: CONSTRAINT - Nel perimetro corrente `13 x 27`, `logistica_biforcazione_var_3.5699:cycle_13` e `percolation:cycle_9` non sono promuovibili come candidati fisici. Il loro `27/27` viene ricostruito dal null fisico interno e da due reader separati (`centroid_only_no_knn`, `knn_only_no_centroid`). Il componente attivo e' la geometria del reader label/centroid/kNN applicata alle feature canoniche; non una dinamica fisica B osservabile nel perimetro attuale.
observables_registry: 1.0.0-2026-05-06 via boundary_graph_curvature_gate
observables_used: [target_graph_bridge_hits, physical_internal_null_hits, label_permutation_ge_full, degree_rewire_ge_full, feature_column_shuffle_ge_full, centroid_only_no_knn_hits, knn_only_no_centroid_hits]
ssp_value: yes

**observable_contract**: claim=il target graph-only e' reader-regressed se null fisico interno e due reader indipendenti ricostruiscono il full-reader hit; observable=target hit count su 27 letture row-aligned; operator=join regressivo tra physical-internal null, null label/degree/feature e reader centroid/kNN separati; denominator=13 righe BOUNDARY, 27 reader reads, physical null N=32, graph null N=128; p_value_definition=right-tail raw_p=k/N dai JSON sorgente, k = trial null con hit count >= observed full hits; non_possible=promuovere candidato fisico quando null fisico interno o reader-only projection ricostruiscono il full hit; not_tested=nuovi domini fisici, physical null N=128, prova analitica delle source label.

## Source directive
Seguita la direttiva one-shot in `tools/data/agent_field_live.md`: non cercare nuova promozione fisica degli stessi residui, non ripetere un preflight single-reader, trasformare il blocco in audit regressivo del reader BOUNDARY, confrontando null fisico interno, null graph/label-degree e almeno due reader indipendenti.

## Respiro fuori-tempo
- **Combo**: A9 terzo incluso + A11 combo + BOUNDARY `8 GUE / 5 Poisson` + grafo conoscenza come reader + CE-0001 KSAR come reiterazione regressiva del kernel 20:42.
- **Dipolo / punto-zero**: dinamica fisica interna / geometria del reader. Punto-zero: la stessa riga target quando il nome fisico resta fisso ma il generatore o il predicate del reader cambia.
- **Piano superiore**: grafo della conoscenza e bicono possibile/non-possibile; il reader e' trattato come superficie topologica, non come prova fisica.
- **Contaminazione cognitiva**: CE-0001 letto nel campo vivo come adapter KSAR; usato per reiterare il blocco 20:42 senza cambiare perimetro. CE-0117 resta sullo sfondo come cascata della possibilita': il risultato cade nel seme solo se diventa osservabile e portabile.
- **Proto-ipotesi**: se un target resta candidato quando separo centroid reader e kNN reader, e cade solo quando altero gruppi di feature, il residuo appartiene al predicate feature-label del reader.
- **Possibile/non-possibile**: possibile = costruire una cache row-aligned per futuri null fisici ad alto N; non-possibile = chiamare logistica/percolation candidati fisici nel perimetro corrente.
- **Movimento A->M->B**: fisico A = confine GUE/Poisson con residui logistica/percolation; matematica M = predicate kNN/centroid su feature canoniche; fisico B = null interno di orbita/cluster. B non emerge come costo: resta vincolo sul reader.

## Aderenza alla direzione
- `relation`: `follows_direction`
- `why`: l'esperimento chiude il blocco lasciato dal preflight usando il full `27/27` gia' computato, lo confronta con null graph/label-degree e separa due reader indipendenti.
- `not_drift`: non aggiunge domini, non torna a V_c/phi/Sturmian, non promuove i target; lavora sul nodo regressivo nominato dalla direzione viva.
- `seed_residue`: resta da alzare il physical null da N=32 a N=128 solo se serve quantificare meglio il costo, non per riaprire la promozione.
- `return_criterion`: ritorno al seme solo con cache row-aligned che produce, per ogni target, `observed 27/27` contro physical-null N>=128 e contro null graph N-matched sullo stesso denominatore.

## Blocco regressivo
- `block_origin`: `agent_20260528_2042` ha mostrato ricostruzione single-reader `128/128`; la direttiva chiede di non ripetere quel blocco ma di auditare il reader.
- `node_regressivo`: predicate BOUNDARY prima della fusione tra feature canoniche, label geometry, centroid e kNN.
- `dipolo`: fisico interno / reader matematico.
- `possibile/non-possibile`: possibile = audit computabile e row-aligned; non-possibile = promozione fisica dei due residui nel perimetro attuale.
- `det+1_patch_risk`: aumentare N o aggiungere nuovi domini per salvare il candidato accumula calcolo senza separare il reader.
- `det-1_next_move`: cache feature row-aligned che registra per ogni trial target le feature sostitutive e il risultato per ciascun reader, cosi il componente che ricostruisce resta tracciabile.
- `return_criterion`: se un target non e' ricostruito da physical-null N>=128 e cade anche sotto almeno un reader separato, il ramo puo' tornare a test fisico; altrimenti resta reader-regressed.

## Experiment Design
- **Script**: `tools/exp_boundary_reader_regression_audit.py`.
- **Run**: `python3 tools/exp_boundary_reader_regression_audit.py --out tools/data/boundary_reader_regression_audit_20260528_2138.json`.
- **Source fisica interna**: `tools/data/boundary_physical_internal_null_20260528_2042.json`.
- **Source graph/label-degree**: `tools/data/boundary_graph_mechanism_ablation_20260516_1230.json`.
- **Reader indipendenti**: `centroid_only_no_knn` e `knn_only_no_centroid`, confrontati col full reader sullo stesso denominatore `27`.
- **Non misurato**: nuovo full physical N=128; nuovi domini; proof fisica delle label.

## Results
| target | observed | physical null ge/full | label perm ge | degree rewire ge | feature shuffle ge | centroid-only | kNN-only | component |
|---|---:|---:|---:|---:|---:|---:|---:|---|
| `logistica_biforcazione_var_3.5699:cycle_13` | 27/27 | 32/32, full 32/32 | 62/128 | 1/128 | 4/128 | 27/27 | 27/27 | canonical features + label geometry |
| `percolation:cycle_9` | 27/27 | 31/32, full 31/32 | 69/128 | 95/128 | 31/128 | 27/27 | 27/27 | canonical + shuffle-z features + label geometry |

## Re-discovery audit
- **Baseline noto piu vicino**: kNN boundary stability, centroid-margin classifier, degree-preserving graph null, feature-column shuffle, percolation-on-graph.
- **Cosa assorbe il baseline**: entrambi i target sono ricostruiti da centroid-only e kNN-only in `27/27`; il nome fisico non aggiunge costo quando il null interno ricostruisce `32/32` per logistica e `31/32` per percolation.
- **Cosa resta Lab-specific**: la separazione regressiva fra target graph-only, null fisico interno e componenti del reader BOUNDARY sul denominatore vivo `8 GUE / 5 Poisson`.
- `two_reader_boundary_confirmed`: no.
- `graph_only_residue`: `logistica_biforcazione_var_3.5699:cycle_13`, `percolation:cycle_9`.
- `scope_change_declared`: no; il report resta sul full `27/27` disponibile, con physical null N=32.
- `graph_baseline_audit`: null label/degree/feature da `20260516_1230`, N=128, stesso target e stesso denominatore.

## Key Findings
1. Verificato: il full reader osserva entrambi i target in `27/27`.
2. Verificato: il null fisico interno ricostruisce logistica in `32/32` e percolation in `31/32` trial full.
3. Verificato: `centroid_only_no_knn` e `knn_only_no_centroid` ricostruiscono entrambi i target in `27/27`.
4. Verificato: logistica cade solo quando vengono ablate feature canoniche (`drop_without_canonical=9`); percolation cade con feature canoniche e shuffle-z (`drop_without_canonical=3`, `drop_without_shuffle_z=9`).
5. Inferito: il candidate hit e' generato dalla geometria label/centroid/kNN sulle feature canoniche, con shuffle-z aggiuntivo per percolation; non da un costo fisico interno visibile.

## Verdict
CONSTRAINT.

Il blocco non richiede nuova promozione, ma separazione del reader. Nel perimetro corrente la dinamica fisica e il reader matematico si confondono nel punto in cui feature canoniche e label geometry bastano a ricostruire il target. La riga puo' restare utile come caso-test del reader BOUNDARY; non entra come candidato fisico.

## Consecutio
Costruire una cache row-aligned per physical null N>=128 solo se il prossimo ciclo deve quantificare il costo residuo. La cache deve salvare, per ogni trial e target: feature sostitutive, hit full, hit centroid-only, hit kNN-only, label-permutation baseline e degree-rewire baseline. Senza caduta sotto questa cache, i due target restano `reader_regressed`.

## Telemetria
- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` non presenti nell'ambiente.
- `python3 -m py_compile tools/exp_boundary_reader_regression_audit.py` completato.
- Run completato: `tools/data/boundary_reader_regression_audit_20260528_2138.json`.
- Worktree gia dirty prima del ciclo; modificati solo nuovo script, nuovo JSON e questo report.
- Nessun update del seme, nessuna promozione, nessun public sync.

## Files
- Script: `tools/exp_boundary_reader_regression_audit.py`
- Data: `tools/data/boundary_reader_regression_audit_20260528_2138.json`
- Report: `tools/data/reports/agent_20260528_2138.md`

exec
/bin/bash -lc "sed -n '1,220p' tools/data/boundary_physical_internal_null_20260528_2042.json" in /opt/MM_D-ND
 succeeded in 0ms:
{
  "experiment": "boundary_physical_internal_null",
  "question": "Do graph-only logistic/percolation residues survive physical-internal nulls on the fixed 8 GUE / 5 Poisson graph reader?",
  "observables_registry": "1.0.0-2026-05-06 via boundary_graph_curvature_gate",
  "observables_used": [
    "target_graph_bridge_hits",
    "physical_internal_null_hits",
    "physical_internal_null_ge_observed",
    "physical_internal_null_eq_full"
  ],
  "observable_contract": {
    "claim": "a graph-only residue has physical-internal cost only if observed 27/27 is rare under a domain-native surrogate with the same 13x27 graph reader",
    "observable": "target third-included hit count across 27 fixed graph-reader runs",
    "operator": "replace only the target row features with physical-internal surrogate features",
    "generator": "13 fixed BOUNDARY rows; logistic block gap-order shuffle; percolation critical cluster-geometry resample",
    "denominator": "13 rows, 8 GUE / 5 Poisson, k=[2,3,4], n_gaps=[512,1024,2048], seeds=[20260515,20260516,20260517]",
    "p_value_definition": "right-tail raw_p=k/N, k = physical-null trials with target hits >= observed_hits",
    "non_possible": "promoting a physical residue if the physical null reconstructs full 27/27 often or if graph label null remains the cheaper explanation",
    "not_tested": "new domains, asymptotic scaling, two-reader promotion, raw Hamiltonian/source proof of labels"
  },
  "params": {
    "scope": "tools/data/boundary_denominator_prescan_full_20260509_1500.json",
    "targets": [
      "logistica_biforcazione_var_3.5699:cycle_13",
      "percolation:cycle_9"
    ],
    "k_values": [
      2,
      3,
      4
    ],
    "n_gaps_values": [
      512,
      1024,
      2048
    ],
    "seeds": [
      20260515,
      20260516,
      20260517
    ],
    "n_shuffle": 32,
    "null_trials": 32,
    "null_seed": 202605282042,
    "logistic_block_size": 34,
    "percolation_lattice": 48,
    "percolation_p": 0.5927,
    "percolation_samples": 200
  },
  "summary": {
    "reader_runs": 27,
    "rows_in_scope": 13,
    "targets": [
      "logistica_biforcazione_var_3.5699:cycle_13",
      "percolation:cycle_9"
    ]
  },
  "rows": [
    {
      "target": "logistica_biforcazione_var_3.5699:cycle_13",
      "source_label": "GUE",
      "observed_hits": 27,
      "observed_frequency": 1.0,
      "null_ge_observed": 32,
      "null_eq_full": 32,
      "raw_p": 1.0,
      "add_one_p": 1.0,
      "null_hit_distribution": {
        "27": 32
      },
      "physical_null": {
        "null": "logistic_gap_block_shuffle",
        "block_size": 34,
        "preserves": "gap marginal and local contiguous blocks",
        "breaks": "long-range gap order induced by the orbit reader"
      },
      "survival_state": "physical_null_reconstructs_full"
    },
    {
      "target": "percolation:cycle_9",
      "source_label": "Poisson",
      "observed_hits": 27,
      "observed_frequency": 1.0,
      "null_ge_observed": 31,
      "null_eq_full": 31,
      "raw_p": 0.96875,
      "add_one_p": 0.96969697,
      "null_hit_distribution": {
        "13": 1,
        "27": 31
      },
      "physical_null": {
        "null": "critical_site_percolation_cluster_geometry_resample",
        "lattice": 48,
        "p": 0.5927,
        "samples": 200,
        "preserves": "critical percolation generator and largest-cluster observable",
        "breaks": "specific cluster geometry realization used by the original row"
      },
      "survival_state": "physical_null_reconstructs_full"
    }
  ]
}

exec
/bin/bash -lc "sed -n '1,220p' tools/data/boundary_reader_regression_audit_20260528_2138.json" in /opt/MM_D-ND
 succeeded in 0ms:
{
  "experiment": "boundary_reader_regression_audit",
  "question": "Which BOUNDARY reader component reconstructs the graph-only logistic/percolation 27/27 hit after physical-internal and graph nulls?",
  "source_files": {
    "physical_internal": "tools/data/boundary_physical_internal_null_20260528_2042.json",
    "graph_mechanism": "tools/data/boundary_graph_mechanism_ablation_20260516_1230.json"
  },
  "observable_contract": {
    "claim": "the graph-only target is reader-regressed if physical-internal nulls and two independent reader projections reconstruct the observed full-reader hit",
    "observable": "target hit count across 27 row-aligned graph-reader reads",
    "operator": "join physical-internal null, label/degree/feature null, centroid-only reader and kNN-only reader on the same target rows",
    "denominator": "13 BOUNDARY rows; 27 reader reads; physical null N=32; graph nulls N=128",
    "p_value_definition": "right-tail raw_p=k/N from source JSONs, k = null trials with hit count >= observed full hits",
    "non_possible": "promoting a physical candidate when physical internal null or reader-only projections reconstruct the full hit",
    "not_tested": "new physical domains, higher-N physical null, raw source-label proof"
  },
  "summary": {
    "targets": [
      "logistica_biforcazione_var_3.5699:cycle_13",
      "percolation:cycle_9"
    ],
    "reader_runs": 27,
    "physical_null_trials": 32,
    "graph_null_trials": 128,
    "all_targets_reader_regressed": true
  },
  "rows": [
    {
      "target": "logistica_biforcazione_var_3.5699:cycle_13",
      "observed_full_reader": "27/27",
      "physical_internal_null": {
        "ge_observed": "32/32",
        "eq_full": "32/32",
        "raw_p": 1.0,
        "distribution": {
          "27": 32
        }
      },
      "graph_label_degree_nulls": {
        "label_permutation_ge_full": "62/128",
        "label_permutation_raw_p": 0.484375,
        "degree_rewire_ge_full": "1/128",
        "degree_rewire_raw_p": 0.0078125,
        "feature_column_shuffle_ge_full": "4/128",
        "feature_column_shuffle_raw_p": 0.03125
      },
      "independent_readers": {
        "centroid_only_no_knn": "27/27",
        "knn_only_no_centroid": "27/27"
      },
      "component_ablation": {
        "drop_without_canonical": 9,
        "drop_without_sr_local": 0,
        "drop_without_shuffle_z": 0,
        "components_that_drop_full_residue": [
          "canonical_features"
        ]
      },
      "reader_component": "label_geometry_centroid_and_knn_reconstruct; physical_internal_reconstructs",
      "promotion_state": "not_physical_candidate_in_current_perimeter"
    },
    {
      "target": "percolation:cycle_9",
      "observed_full_reader": "27/27",
      "physical_internal_null": {
        "ge_observed": "31/32",
        "eq_full": "31/32",
        "raw_p": 0.96875,
        "distribution": {
          "13": 1,
          "27": 31
        }
      },
      "graph_label_degree_nulls": {
        "label_permutation_ge_full": "69/128",
        "label_permutation_raw_p": 0.5390625,
        "degree_rewire_ge_full": "95/128",
        "degree_rewire_raw_p": 0.7421875,
        "feature_column_shuffle_ge_full": "31/128",
        "feature_column_shuffle_raw_p": 0.2421875
      },
      "independent_readers": {
        "centroid_only_no_knn": "27/27",
        "knn_only_no_centroid": "27/27"
      },
      "component_ablation": {
        "drop_without_canonical": 3,
        "drop_without_sr_local": 0,
        "drop_without_shuffle_z": 9,
        "components_that_drop_full_residue": [
          "canonical_features",
          "shuffle_z_features"
        ]
      },
      "reader_component": "label_geometry_centroid_and_knn_reconstruct; physical_internal_reconstructs",
      "promotion_state": "not_physical_candidate_in_current_perimeter"
    }
  ]
}

codex
Il confronto utile è storico `2042` contro una riproduzione fresh con gli stessi parametri N=32, perché quello è il denominatore presente nell’artefatto full. Eseguo due run indipendenti fresh a seed null diversi: una replica comparabile allo storico e una replica di controllo per baseline osservata.
exec
/bin/bash -lc "env | rg '"'^(ANTHROPIC_API_KEY|OPENAI_API_KEY)='"' || true" in /opt/MM_D-ND
 succeeded in 0ms:
exec
/bin/bash -lc 'PYTHONPATH=tools python3 -m py_compile tools/exp_boundary_physical_internal_null.py' in /opt/MM_D-ND
 succeeded in 0ms:
exec
/bin/bash -lc 'PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null.py --null-trials 32 --null-seed 202605282042 --out tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json' in /opt/MM_D-ND
codex
Il full run è ancora in corso; questo conferma perché il ciclo precedente aveva ridotto il problema a N=32 e perché la cache row-aligned è parte del risultato, non un dettaglio accessorio. Attendo il completamento prima di produrre il delta.
codex
Il run non ha ancora prodotto output dopo diversi minuti: il costo è nel ricalcolo ripetuto delle feature surrogate per 27 reader. Lascio finire ancora un intervallo; se resta bloccante, userò il timeout come evidenza sperimentale e il report proporrà la cache come condizione di rientro, senza promozione.
 succeeded in 374027ms:
wrote=tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json
logistica_biforcazione_var_3.5699:cycle_13	observed=26/27	null_ge=32/32	eq_full=31/32	state=physical_null_reconstructs_full
percolation:cycle_9	observed=27/27	null_ge=31/32	eq_full=31/32	state=physical_null_reconstructs_full

codex
Il delta principale è già emerso: con la provenance seedata, la logistica storica non riproduce più il baseline `27/27`, ma `26/27`; percolation resta `27/27`. Faccio ora un controllo leggero N=1 con altro seed per verificare se il baseline fresh è stabile tra due run indipendenti.
exec
/bin/bash -lc 'PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null.py --null-trials 1 --null-seed 202605282223 --out tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json' in /opt/MM_D-ND
 succeeded in 127374ms:
wrote=tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json
logistica_biforcazione_var_3.5699:cycle_13	observed=26/27	null_ge=1/1	eq_full=1/1	state=physical_null_reconstructs_full
percolation:cycle_9	observed=27/27	null_ge=1/1	eq_full=1/1	state=physical_null_reconstructs_full

exec
/bin/bash -lc 'ls -lh tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json' in /opt/MM_D-ND
 succeeded in 0ms:
-rw-r--r-- 1 root root 5.2K May 28 22:29 tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json
-rw-r--r-- 1 root root 5.1K May 28 22:31 tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json

exec
/bin/bash -lc "python3 - <<'PY'
import json
from pathlib import Path
old=json.loads(Path('tools/data/boundary_physical_internal_null_20260528_2042.json').read_text())
new=json.loads(Path('tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json').read_text())
new2=json.loads(Path('tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json').read_text())
for label,data in [('old',old),('new',new),('new2',new2)]:
 print(label, 'has_provenance', 'row_spacings_provenance' in data)
 for r in data['rows']:
  print(label, r['target'], 'observed', r['observed_hits'], 'null_ge', r['null_ge_observed'], 'eq_full', r['null_eq_full'], 'dist', r['null_hit_distribution'])
print('new salt', new.get('row_spacings_provenance',{}).get('seed_salt'))
for target in ['logistica_biforcazione_var_3.5699:cycle_13','percolation:cycle_9']:
 print('seed', target, new.get('row_spacings_provenance',{}).get('domain_seeds',{}).get(target))
PY" in /opt/MM_D-ND
 succeeded in 0ms:
old has_provenance False
old logistica_biforcazione_var_3.5699:cycle_13 observed 27 null_ge 32 eq_full 32 dist {'27': 32}
old percolation:cycle_9 observed 27 null_ge 31 eq_full 31 dist {'13': 1, '27': 31}
new has_provenance True
new logistica_biforcazione_var_3.5699:cycle_13 observed 26 null_ge 32 eq_full 31 dist {'26': 1, '27': 31}
new percolation:cycle_9 observed 27 null_ge 31 eq_full 31 dist {'12': 1, '27': 31}
new2 has_provenance True
new2 logistica_biforcazione_var_3.5699:cycle_13 observed 26 null_ge 1 eq_full 1 dist {'27': 1}
new2 percolation:cycle_9 observed 27 null_ge 1 eq_full 1 dist {'27': 1}
new salt boundary-row-spacings-v1
seed logistica_biforcazione_var_3.5699:cycle_13 {'domain': 'logistica_biforcazione_var_3.5699', 'seed': 2298612439}
seed percolation:cycle_9 {'domain': 'percolation', 'seed': 2828479326}

exec
/bin/bash -lc 'git status --short -- tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json tools/data/reports/agent_20260528_2222.md' in /opt/MM_D-ND
 succeeded in 0ms:
?? tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json
?? tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json

codex
La verifica numerica è sufficiente per il report: lo storico non aveva provenance, il fresh sì; due fresh indipendenti riproducono il baseline logistica `26/27` e percolation `27/27`. Scrivo ora il report richiesto, limitando il claim alla provenance e dichiarando il blocco autologico.
apply patch
patch: completed
/opt/MM_D-ND/tools/data/reports/agent_20260528_2222.md
diff --git a/tools/data/reports/agent_20260528_2222.md b/tools/data/reports/agent_20260528_2222.md
new file mode 100644
index 0000000000000000000000000000000000000000..30485fb39443d151e723e42475baca394d63a025
--- /dev/null
+++ b/tools/data/reports/agent_20260528_2222.md
@@ -0,0 +1,143 @@
+# Agent Report - BOUNDARY Provenance Reproduction Delta
+**Date**: 2026-05-28 22:22
+**Tension explored**: BOUNDARY / provenance of physical-internal reader rows
+**verdict**: CONSTRAINT - L'artefatto storico `boundary_physical_internal_null_20260528_2042.json` non e' baseline-identical dopo la patch di provenance. Con `row_spacings` seedato e provenance esplicita, `logistica_biforcazione_var_3.5699:cycle_13` passa da `27/27` a `26/27`; `percolation:cycle_9` resta `27/27`. Il claim fisico resta bloccato; il claim ammesso e' solo che la provenance seedata rende visibile il delta storico/fresh.
+observables_registry: 1.0.0-2026-05-06 via boundary_graph_curvature_gate
+observables_used: [target_graph_bridge_hits, physical_internal_null_hits, row_spacings_provenance_presence, baseline_reproduction_delta]
+ssp_value: yes
+
+**observable_contract**: claim=la patch di provenance e' sufficiente a distinguere artefatto storico non tracciato e riproduzione fresh tracciata; observable=target hit count observed su 27 reader + presenza `row_spacings_provenance`; operator=riesecuzione dello stesso physical-internal null N=32 dopo seed stabili per dominio; denominator=13 righe BOUNDARY, 27 reader reads, physical null N=32 per replica comparabile; p_value_definition=right-tail raw_p=k/N dai JSON, k = trial null con hit count >= observed_hits; non_possible=promuovere claim fisici se il baseline observed non e' identico tra storico e fresh; not_tested=nuovi domini, N=128 full, prova analitica delle source label.
+
+## Source directive
+Seguita la direttiva one-shot nel campo vivo `tools/data/agent_field_live.md`: confrontare `boundary_physical_internal_null_20260528_2042.json` con una riproduzione fresh dopo patch provenance, dichiarare delta storico/fresh, separare logistica e percolation, limitare il claim alla provenance e proporre cache row-aligned prima di nuove promozioni fisiche.
+
+## Respiro fuori-tempo
+- **Combo**: A2 confine + A4 modus + A11 combo + BOUNDARY `8 GUE / 5 Poisson` + nodo regressivo provenance del reader.
+- **Dipolo / punto-zero**: artefatto storico / artefatto riproducibile. Punto-zero: la stessa riga target quando il generatore stocastico riceve o non riceve un seed persistito.
+- **Piano superiore**: grafo della conoscenza come superficie di lettura; il valore fisico non viene deciso dal target name ma dalla tracciabilita' del percorso A->M->B.
+- **Contaminazione cognitiva**: CE-none:`tools/data/agent_field_live.md` non espone archivio enzimi esplicito in questa sezione; usata la regola cross-agent `indeterminato -> reitera con il sistema` come atto minimo: run storico-comparabile + run fresh indipendente N=1.
+- **Proto-ipotesi**: se il seed domain-stable cambia il baseline observed rispetto allo storico, il vecchio artefatto non puo' essere autorita' per claim fisici; diventa input di migrazione provenance.
+- **Possibile/non-possibile**: possibile = usare la riproduzione seedata come baseline A riproducibile; non-possibile = chiudere insieme logistica e percolation o promuovere il vecchio `27/27` logistica.
+- **Movimento A->M->B**: fisico A = perimetro BOUNDARY `8 GUE / 5 Poisson`; matematica M = funzione `row_spacings(domain)` con seed stabile `sha256(boundary-row-spacings-v1:domain)` e reader 27; fisico B = null interno logistica/percolation. B resta testabile solo dopo cache row-aligned.
+
+## Aderenza alla direzione
+- `relation`: `follows_direction`
+- `why`: il ciclo attacca direttamente la direzione viva: provenance del reader BOUNDARY prima di nuovi claim fisici.
+- `not_drift`: non aggiunge domini, non cerca salvataggi fisici, non usa phi/Sturmian/V_c; confronta storico/fresh sullo stesso script e stesso perimetro.
+- `seed_residue`: resta da costruire la cache row-aligned completa N>=128 per quantificare il costo fisico separato dal reader.
+- `return_criterion`: rientro al test fisico solo quando due run fresh indipendenti hanno baseline observed identico e ogni trial conserva source/gaps/features/RNG/reader outputs.
+
+## claim
+La patch di provenance non conferma un contenuto fisico; rende falsificabile la riproduzione del reader. Nel confronto storico/fresh, il vecchio baseline logistica `27/27` non riproduce: il baseline fresh tracciato e' `26/27`.
+
+## falsificazione
+Attacco alla riproducibilita':
+
+| artifact | provenance | null_seed | null_trials | logistica observed | percolation observed | null distributions |
+|---|---|---:|---:|---:|---:|---|
+| `boundary_physical_internal_null_20260528_2042.json` | absent | 202605282042 | 32 | 27/27 | 27/27 | logistica `{27:32}`; percolation `{13:1,27:31}` |
+| `boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json` | present | 202605282042 | 32 | 26/27 | 27/27 | logistica `{26:1,27:31}`; percolation `{12:1,27:31}` |
+| `boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json` | present | 202605282223 | 1 | 26/27 | 27/27 | logistica `{27:1}`; percolation `{27:1}` |
+
+Baseline fresh indipendente:
+- logistica: `26/27` in due run fresh; non identica allo storico `27/27`.
+- percolation: `27/27` in storico e due run fresh; resta edge-case separato, non chiusura comune.
+
+Seed provenance verificata nel fresh:
+- `ROW_SPACINGS_SEED_SALT`: `boundary-row-spacings-v1`
+- logistica domain seed: `2298612439`
+- percolation domain seed: `2828479326`
+
+## Delta storico -> fresh
+1. Verificato: lo storico non contiene `row_spacings_provenance`.
+2. Verificato: il fresh contiene `row_spacings_provenance` con seed stabile per dominio.
+3. Verificato: logistica cambia baseline observed da `27/27` a `26/27`.
+4. Verificato: percolation conserva baseline observed `27/27`.
+5. Verificato: il null fisico interno ricostruisce ancora pienamente o quasi pienamente il reader: logistica `null_ge=32/32`, `eq_full=31/32`; percolation `null_ge=31/32`, `eq_full=31/32`.
+6. Inferito: il vecchio artefatto era contaminato da stato RNG non persistito; il nuovo artefatto e' riproducibile come baseline fresh, ma non autorizza claim fisici.
+
+## Cache row-aligned proposta
+Schema minimo per il prossimo artefatto cache-first:
+
+```json
+{
+  "target": "domain_window",
+  "trial": 0,
+  "source": {
+    "domain": "domain",
+    "source_domain_type": "GUE|Poisson",
+    "domain_seed": 0,
+    "row_spacings_seed_salt": "boundary-row-spacings-v1"
+  },
+  "target_features": {
+    "n_gaps_available": 0,
+    "n_gaps_used": 0,
+    "observables": {},
+    "shuffle_z": {}
+  },
+  "reader": {
+    "k": 0,
+    "n_gaps": 0,
+    "seed": 0,
+    "n_shuffle": 32
+  },
+  "outputs": {
+    "full_reader_hit": false,
+    "centroid_only_hit": false,
+    "knn_only_hit": false
+  },
+  "null_meta": {
+    "null": "logistic_gap_block_shuffle|critical_site_percolation_cluster_geometry_resample",
+    "surrogate_seed": 0,
+    "params": {}
+  }
+}
+```
+
+Regola di uso: la cache deve essere row-aligned su `target/trial/reader`, non aggregata a posteriori. I confronti ammessi sono solo fra righe con stesso `target`, stesso `trial` e stesso `reader` oppure con bridge dichiarato.
+
+## block_autology
+- `origin`: report `20260528_2138` bloccato per overclaim su percolation e artefatto `20260528_2042` non riproducibile da provenance.
+- `node_regressivo`: generatori stocastici di `dnd_autoricerca` chiamati da `row_spacings` senza seed persistito nell'artefatto storico.
+- `protects`: impedisce che un baseline reader contaminato da RNG diventi evidenza fisica.
+- `valid_until`: due run fresh indipendenti, con cache row-aligned, producono baseline identical per target e trial comparabili.
+- `retire_when`: ogni riga BOUNDARY contiene source domain, seed stabile, lunghezza gaps, feature target, reader k/n_gaps/seed e output full/centroid/kNN.
+- `det+1_patch_risk`: alzare N o aggiungere domini per compensare il delta logistica senza correggere la provenance accumula calcolo, non informazione.
+- `det-1_next_move`: rendere la riga il luogo della memoria: source -> seed -> gaps -> feature -> reader -> output.
+
+## Re-discovery audit
+- **Baseline noto piu vicino**: reproducible computational experiment, RNG provenance audit, kNN/centroid boundary stability, percolation-on-graph.
+- **Cosa assorbe il baseline**: il delta logistica e' spiegato da provenance mancante, non da una nuova dinamica fisica.
+- **Cosa resta Lab-specific**: il criterio A -> M -> B per impedire che un reader BOUNDARY non tracciato diventi promozione di contenuto fisico.
+- `two_reader_boundary_confirmed`: no.
+- `graph_only_residue`: logistica resta non riprodotta storicamente; percolation resta edge-case riprodotto ma gia' reader-regressed.
+- `scope_change_declared`: no; stesso perimetro 13 x 27, stesso N=32 per replica comparabile.
+- `graph_baseline_audit`: resta quello di `20260528_2138`; questo ciclo aggiunge provenance reproduction delta.
+
+## Verdict
+CONSTRAINT.
+
+Il ciclo chiude solo la domanda di provenance. La baseline fisica A riproducibile dopo patch e':
+- logistica: `26/27`, non il vecchio `27/27`;
+- percolation: `27/27`, ma separata e non promossa.
+
+La trasformazione matematica M e' la seedazione stabile per dominio dentro `row_spacings` piu' il reader 27. La fisica B testata resta il null interno; nel fresh non produce costo sufficiente a riaprire promozioni. Il prossimo passo non e' un claim, e' la cache row-aligned.
+
+## Consecutio
+Costruire `boundary_physical_internal_null_cache_row_aligned_<timestamp>.jsonl` prima di un nuovo N>=128. La cache deve permettere confronto per target separati:
+- logistica rientra solo se due baseline fresh indipendenti restano `26/27` o convergono a un nuovo valore dichiarato prima del null;
+- percolation rientra solo come edge-case separato, con full/centroid/kNN e physical null registrati per riga.
+
+## Telemetria
+- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` non presenti nell'ambiente.
+- `PYTHONPATH=tools python3 -m py_compile tools/exp_boundary_physical_internal_null.py` completato.
+- Run comparabile completato: `PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null.py --null-trials 32 --null-seed 202605282042 --out tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json`.
+- Run fresh indipendente leggero completato: `PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null.py --null-trials 1 --null-seed 202605282223 --out tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json`.
+- Worktree gia dirty prima del ciclo; creati solo due JSON fresh e questo report.
+- Nessun update del seme, nessuna promozione pubblica, nessun sync.
+
+## Files
+- Historical data: `tools/data/boundary_physical_internal_null_20260528_2042.json`
+- Fresh data N=32: `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json`
+- Fresh data N=1: `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json`
+- Report: `tools/data/reports/agent_20260528_2222.md`

diff --git a/tools/data/reports/agent_20260528_2222.md b/tools/data/reports/agent_20260528_2222.md
new file mode 100644
index 0000000000000000000000000000000000000000..30485fb39443d151e723e42475baca394d63a025
--- /dev/null
+++ b/tools/data/reports/agent_20260528_2222.md
@@ -0,0 +1,143 @@
+# Agent Report - BOUNDARY Provenance Reproduction Delta
+**Date**: 2026-05-28 22:22
+**Tension explored**: BOUNDARY / provenance of physical-internal reader rows
+**verdict**: CONSTRAINT - L'artefatto storico `boundary_physical_internal_null_20260528_2042.json` non e' baseline-identical dopo la patch di provenance. Con `row_spacings` seedato e provenance esplicita, `logistica_biforcazione_var_3.5699:cycle_13` passa da `27/27` a `26/27`; `percolation:cycle_9` resta `27/27`. Il claim fisico resta bloccato; il claim ammesso e' solo che la provenance seedata rende visibile il delta storico/fresh.
+observables_registry: 1.0.0-2026-05-06 via boundary_graph_curvature_gate
+observables_used: [target_graph_bridge_hits, physical_internal_null_hits, row_spacings_provenance_presence, baseline_reproduction_delta]
+ssp_value: yes
+
+**observable_contract**: claim=la patch di provenance e' sufficiente a distinguere artefatto storico non tracciato e riproduzione fresh tracciata; observable=target hit count observed su 27 reader + presenza `row_spacings_provenance`; operator=riesecuzione dello stesso physical-internal null N=32 dopo seed stabili per dominio; denominator=13 righe BOUNDARY, 27 reader reads, physical null N=32 per replica comparabile; p_value_definition=right-tail raw_p=k/N dai JSON, k = trial null con hit count >= observed_hits; non_possible=promuovere claim fisici se il baseline observed non e' identico tra storico e fresh; not_tested=nuovi domini, N=128 full, prova analitica delle source label.
+
+## Source directive
+Seguita la direttiva one-shot nel campo vivo `tools/data/agent_field_live.md`: confrontare `boundary_physical_internal_null_20260528_2042.json` con una riproduzione fresh dopo patch provenance, dichiarare delta storico/fresh, separare logistica e percolation, limitare il claim alla provenance e proporre cache row-aligned prima di nuove promozioni fisiche.
+
+## Respiro fuori-tempo
+- **Combo**: A2 confine + A4 modus + A11 combo + BOUNDARY `8 GUE / 5 Poisson` + nodo regressivo provenance del reader.
+- **Dipolo / punto-zero**: artefatto storico / artefatto riproducibile. Punto-zero: la stessa riga target quando il generatore stocastico riceve o non riceve un seed persistito.
+- **Piano superiore**: grafo della conoscenza come superficie di lettura; il valore fisico non viene deciso dal target name ma dalla tracciabilita' del percorso A->M->B.
+- **Contaminazione cognitiva**: CE-none:`tools/data/agent_field_live.md` non espone archivio enzimi esplicito in questa sezione; usata la regola cross-agent `indeterminato -> reitera con il sistema` come atto minimo: run storico-comparabile + run fresh indipendente N=1.
+- **Proto-ipotesi**: se il seed domain-stable cambia il baseline observed rispetto allo storico, il vecchio artefatto non puo' essere autorita' per claim fisici; diventa input di migrazione provenance.
+- **Possibile/non-possibile**: possibile = usare la riproduzione seedata come baseline A riproducibile; non-possibile = chiudere insieme logistica e percolation o promuovere il vecchio `27/27` logistica.
+- **Movimento A->M->B**: fisico A = perimetro BOUNDARY `8 GUE / 5 Poisson`; matematica M = funzione `row_spacings(domain)` con seed stabile `sha256(boundary-row-spacings-v1:domain)` e reader 27; fisico B = null interno logistica/percolation. B resta testabile solo dopo cache row-aligned.
+
+## Aderenza alla direzione
+- `relation`: `follows_direction`
+- `why`: il ciclo attacca direttamente la direzione viva: provenance del reader BOUNDARY prima di nuovi claim fisici.
+- `not_drift`: non aggiunge domini, non cerca salvataggi fisici, non usa phi/Sturmian/V_c; confronta storico/fresh sullo stesso script e stesso perimetro.
+- `seed_residue`: resta da costruire la cache row-aligned completa N>=128 per quantificare il costo fisico separato dal reader.
+- `return_criterion`: rientro al test fisico solo quando due run fresh indipendenti hanno baseline observed identico e ogni trial conserva source/gaps/features/RNG/reader outputs.
+
+## claim
+La patch di provenance non conferma un contenuto fisico; rende falsificabile la riproduzione del reader. Nel confronto storico/fresh, il vecchio baseline logistica `27/27` non riproduce: il baseline fresh tracciato e' `26/27`.
+
+## falsificazione
+Attacco alla riproducibilita':
+
+| artifact | provenance | null_seed | null_trials | logistica observed | percolation observed | null distributions |
+|---|---|---:|---:|---:|---:|---|
+| `boundary_physical_internal_null_20260528_2042.json` | absent | 202605282042 | 32 | 27/27 | 27/27 | logistica `{27:32}`; percolation `{13:1,27:31}` |
+| `boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json` | present | 202605282042 | 32 | 26/27 | 27/27 | logistica `{26:1,27:31}`; percolation `{12:1,27:31}` |
+| `boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json` | present | 202605282223 | 1 | 26/27 | 27/27 | logistica `{27:1}`; percolation `{27:1}` |
+
+Baseline fresh indipendente:
+- logistica: `26/27` in due run fresh; non identica allo storico `27/27`.
+- percolation: `27/27` in storico e due run fresh; resta edge-case separato, non chiusura comune.
+
+Seed provenance verificata nel fresh:
+- `ROW_SPACINGS_SEED_SALT`: `boundary-row-spacings-v1`
+- logistica domain seed: `2298612439`
+- percolation domain seed: `2828479326`
+
+## Delta storico -> fresh
+1. Verificato: lo storico non contiene `row_spacings_provenance`.
+2. Verificato: il fresh contiene `row_spacings_provenance` con seed stabile per dominio.
+3. Verificato: logistica cambia baseline observed da `27/27` a `26/27`.
+4. Verificato: percolation conserva baseline observed `27/27`.
+5. Verificato: il null fisico interno ricostruisce ancora pienamente o quasi pienamente il reader: logistica `null_ge=32/32`, `eq_full=31/32`; percolation `null_ge=31/32`, `eq_full=31/32`.
+6. Inferito: il vecchio artefatto era contaminato da stato RNG non persistito; il nuovo artefatto e' riproducibile come baseline fresh, ma non autorizza claim fisici.
+
+## Cache row-aligned proposta
+Schema minimo per il prossimo artefatto cache-first:
+
+```json
+{
+  "target": "domain_window",
+  "trial": 0,
+  "source": {
+    "domain": "domain",
+    "source_domain_type": "GUE|Poisson",
+    "domain_seed": 0,
+    "row_spacings_seed_salt": "boundary-row-spacings-v1"
+  },
+  "target_features": {
+    "n_gaps_available": 0,
+    "n_gaps_used": 0,
+    "observables": {},
+    "shuffle_z": {}
+  },
+  "reader": {
+    "k": 0,
+    "n_gaps": 0,
+    "seed": 0,
+    "n_shuffle": 32
+  },
+  "outputs": {
+    "full_reader_hit": false,
+    "centroid_only_hit": false,
+    "knn_only_hit": false
+  },
+  "null_meta": {
+    "null": "logistic_gap_block_shuffle|critical_site_percolation_cluster_geometry_resample",
+    "surrogate_seed": 0,
+    "params": {}
+  }
+}
+```
+
+Regola di uso: la cache deve essere row-aligned su `target/trial/reader`, non aggregata a posteriori. I confronti ammessi sono solo fra righe con stesso `target`, stesso `trial` e stesso `reader` oppure con bridge dichiarato.
+
+## block_autology
+- `origin`: report `20260528_2138` bloccato per overclaim su percolation e artefatto `20260528_2042` non riproducibile da provenance.
+- `node_regressivo`: generatori stocastici di `dnd_autoricerca` chiamati da `row_spacings` senza seed persistito nell'artefatto storico.
+- `protects`: impedisce che un baseline reader contaminato da RNG diventi evidenza fisica.
+- `valid_until`: due run fresh indipendenti, con cache row-aligned, producono baseline identical per target e trial comparabili.
+- `retire_when`: ogni riga BOUNDARY contiene source domain, seed stabile, lunghezza gaps, feature target, reader k/n_gaps/seed e output full/centroid/kNN.
+- `det+1_patch_risk`: alzare N o aggiungere domini per compensare il delta logistica senza correggere la provenance accumula calcolo, non informazione.
+- `det-1_next_move`: rendere la riga il luogo della memoria: source -> seed -> gaps -> feature -> reader -> output.
+
+## Re-discovery audit
+- **Baseline noto piu vicino**: reproducible computational experiment, RNG provenance audit, kNN/centroid boundary stability, percolation-on-graph.
+- **Cosa assorbe il baseline**: il delta logistica e' spiegato da provenance mancante, non da una nuova dinamica fisica.
+- **Cosa resta Lab-specific**: il criterio A -> M -> B per impedire che un reader BOUNDARY non tracciato diventi promozione di contenuto fisico.
+- `two_reader_boundary_confirmed`: no.
+- `graph_only_residue`: logistica resta non riprodotta storicamente; percolation resta edge-case riprodotto ma gia' reader-regressed.
+- `scope_change_declared`: no; stesso perimetro 13 x 27, stesso N=32 per replica comparabile.
+- `graph_baseline_audit`: resta quello di `20260528_2138`; questo ciclo aggiunge provenance reproduction delta.
+
+## Verdict
+CONSTRAINT.
+
+Il ciclo chiude solo la domanda di provenance. La baseline fisica A riproducibile dopo patch e':
+- logistica: `26/27`, non il vecchio `27/27`;
+- percolation: `27/27`, ma separata e non promossa.
+
+La trasformazione matematica M e' la seedazione stabile per dominio dentro `row_spacings` piu' il reader 27. La fisica B testata resta il null interno; nel fresh non produce costo sufficiente a riaprire promozioni. Il prossimo passo non e' un claim, e' la cache row-aligned.
+
+## Consecutio
+Costruire `boundary_physical_internal_null_cache_row_aligned_<timestamp>.jsonl` prima di un nuovo N>=128. La cache deve permettere confronto per target separati:
+- logistica rientra solo se due baseline fresh indipendenti restano `26/27` o convergono a un nuovo valore dichiarato prima del null;
+- percolation rientra solo come edge-case separato, con full/centroid/kNN e physical null registrati per riga.
+
+## Telemetria
+- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` non presenti nell'ambiente.
+- `PYTHONPATH=tools python3 -m py_compile tools/exp_boundary_physical_internal_null.py` completato.
+- Run comparabile completato: `PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null.py --null-trials 32 --null-seed 202605282042 --out tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json`.
+- Run fresh indipendente leggero completato: `PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null.py --null-trials 1 --null-seed 202605282223 --out tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json`.
+- Worktree gia dirty prima del ciclo; creati solo due JSON fresh e questo report.
+- Nessun update del seme, nessuna promozione pubblica, nessun sync.
+
+## Files
+- Historical data: `tools/data/boundary_physical_internal_null_20260528_2042.json`
+- Fresh data N=32: `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json`
+- Fresh data N=1: `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json`
+- Report: `tools/data/reports/agent_20260528_2222.md`

exec
/bin/bash -lc "sed -n '1,260p' tools/data/reports/agent_20260528_2222.md" in /opt/MM_D-ND
 succeeded in 0ms:
# Agent Report - BOUNDARY Provenance Reproduction Delta
**Date**: 2026-05-28 22:22
**Tension explored**: BOUNDARY / provenance of physical-internal reader rows
**verdict**: CONSTRAINT - L'artefatto storico `boundary_physical_internal_null_20260528_2042.json` non e' baseline-identical dopo la patch di provenance. Con `row_spacings` seedato e provenance esplicita, `logistica_biforcazione_var_3.5699:cycle_13` passa da `27/27` a `26/27`; `percolation:cycle_9` resta `27/27`. Il claim fisico resta bloccato; il claim ammesso e' solo che la provenance seedata rende visibile il delta storico/fresh.
observables_registry: 1.0.0-2026-05-06 via boundary_graph_curvature_gate
observables_used: [target_graph_bridge_hits, physical_internal_null_hits, row_spacings_provenance_presence, baseline_reproduction_delta]
ssp_value: yes

**observable_contract**: claim=la patch di provenance e' sufficiente a distinguere artefatto storico non tracciato e riproduzione fresh tracciata; observable=target hit count observed su 27 reader + presenza `row_spacings_provenance`; operator=riesecuzione dello stesso physical-internal null N=32 dopo seed stabili per dominio; denominator=13 righe BOUNDARY, 27 reader reads, physical null N=32 per replica comparabile; p_value_definition=right-tail raw_p=k/N dai JSON, k = trial null con hit count >= observed_hits; non_possible=promuovere claim fisici se il baseline observed non e' identico tra storico e fresh; not_tested=nuovi domini, N=128 full, prova analitica delle source label.

## Source directive
Seguita la direttiva one-shot nel campo vivo `tools/data/agent_field_live.md`: confrontare `boundary_physical_internal_null_20260528_2042.json` con una riproduzione fresh dopo patch provenance, dichiarare delta storico/fresh, separare logistica e percolation, limitare il claim alla provenance e proporre cache row-aligned prima di nuove promozioni fisiche.

## Respiro fuori-tempo
- **Combo**: A2 confine + A4 modus + A11 combo + BOUNDARY `8 GUE / 5 Poisson` + nodo regressivo provenance del reader.
- **Dipolo / punto-zero**: artefatto storico / artefatto riproducibile. Punto-zero: la stessa riga target quando il generatore stocastico riceve o non riceve un seed persistito.
- **Piano superiore**: grafo della conoscenza come superficie di lettura; il valore fisico non viene deciso dal target name ma dalla tracciabilita' del percorso A->M->B.
- **Contaminazione cognitiva**: CE-none:`tools/data/agent_field_live.md` non espone archivio enzimi esplicito in questa sezione; usata la regola cross-agent `indeterminato -> reitera con il sistema` come atto minimo: run storico-comparabile + run fresh indipendente N=1.
- **Proto-ipotesi**: se il seed domain-stable cambia il baseline observed rispetto allo storico, il vecchio artefatto non puo' essere autorita' per claim fisici; diventa input di migrazione provenance.
- **Possibile/non-possibile**: possibile = usare la riproduzione seedata come baseline A riproducibile; non-possibile = chiudere insieme logistica e percolation o promuovere il vecchio `27/27` logistica.
- **Movimento A->M->B**: fisico A = perimetro BOUNDARY `8 GUE / 5 Poisson`; matematica M = funzione `row_spacings(domain)` con seed stabile `sha256(boundary-row-spacings-v1:domain)` e reader 27; fisico B = null interno logistica/percolation. B resta testabile solo dopo cache row-aligned.

## Aderenza alla direzione
- `relation`: `follows_direction`
- `why`: il ciclo attacca direttamente la direzione viva: provenance del reader BOUNDARY prima di nuovi claim fisici.
- `not_drift`: non aggiunge domini, non cerca salvataggi fisici, non usa phi/Sturmian/V_c; confronta storico/fresh sullo stesso script e stesso perimetro.
- `seed_residue`: resta da costruire la cache row-aligned completa N>=128 per quantificare il costo fisico separato dal reader.
- `return_criterion`: rientro al test fisico solo quando due run fresh indipendenti hanno baseline observed identico e ogni trial conserva source/gaps/features/RNG/reader outputs.

## claim
La patch di provenance non conferma un contenuto fisico; rende falsificabile la riproduzione del reader. Nel confronto storico/fresh, il vecchio baseline logistica `27/27` non riproduce: il baseline fresh tracciato e' `26/27`.

## falsificazione
Attacco alla riproducibilita':

| artifact | provenance | null_seed | null_trials | logistica observed | percolation observed | null distributions |
|---|---|---:|---:|---:|---:|---|
| `boundary_physical_internal_null_20260528_2042.json` | absent | 202605282042 | 32 | 27/27 | 27/27 | logistica `{27:32}`; percolation `{13:1,27:31}` |
| `boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json` | present | 202605282042 | 32 | 26/27 | 27/27 | logistica `{26:1,27:31}`; percolation `{12:1,27:31}` |
| `boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json` | present | 202605282223 | 1 | 26/27 | 27/27 | logistica `{27:1}`; percolation `{27:1}` |

Baseline fresh indipendente:
- logistica: `26/27` in due run fresh; non identica allo storico `27/27`.
- percolation: `27/27` in storico e due run fresh; resta edge-case separato, non chiusura comune.

Seed provenance verificata nel fresh:
- `ROW_SPACINGS_SEED_SALT`: `boundary-row-spacings-v1`
- logistica domain seed: `2298612439`
- percolation domain seed: `2828479326`

## Delta storico -> fresh
1. Verificato: lo storico non contiene `row_spacings_provenance`.
2. Verificato: il fresh contiene `row_spacings_provenance` con seed stabile per dominio.
3. Verificato: logistica cambia baseline observed da `27/27` a `26/27`.
4. Verificato: percolation conserva baseline observed `27/27`.
5. Verificato: il null fisico interno ricostruisce ancora pienamente o quasi pienamente il reader: logistica `null_ge=32/32`, `eq_full=31/32`; percolation `null_ge=31/32`, `eq_full=31/32`.
6. Inferito: il vecchio artefatto era contaminato da stato RNG non persistito; il nuovo artefatto e' riproducibile come baseline fresh, ma non autorizza claim fisici.

## Cache row-aligned proposta
Schema minimo per il prossimo artefatto cache-first:

```json
{
  "target": "domain_window",
  "trial": 0,
  "source": {
    "domain": "domain",
    "source_domain_type": "GUE|Poisson",
    "domain_seed": 0,
    "row_spacings_seed_salt": "boundary-row-spacings-v1"
  },
  "target_features": {
    "n_gaps_available": 0,
    "n_gaps_used": 0,
    "observables": {},
    "shuffle_z": {}
  },
  "reader": {
    "k": 0,
    "n_gaps": 0,
    "seed": 0,
    "n_shuffle": 32
  },
  "outputs": {
    "full_reader_hit": false,
    "centroid_only_hit": false,
    "knn_only_hit": false
  },
  "null_meta": {
    "null": "logistic_gap_block_shuffle|critical_site_percolation_cluster_geometry_resample",
    "surrogate_seed": 0,
    "params": {}
  }
}
```

Regola di uso: la cache deve essere row-aligned su `target/trial/reader`, non aggregata a posteriori. I confronti ammessi sono solo fra righe con stesso `target`, stesso `trial` e stesso `reader` oppure con bridge dichiarato.

## block_autology
- `origin`: report `20260528_2138` bloccato per overclaim su percolation e artefatto `20260528_2042` non riproducibile da provenance.
- `node_regressivo`: generatori stocastici di `dnd_autoricerca` chiamati da `row_spacings` senza seed persistito nell'artefatto storico.
- `protects`: impedisce che un baseline reader contaminato da RNG diventi evidenza fisica.
- `valid_until`: due run fresh indipendenti, con cache row-aligned, producono baseline identical per target e trial comparabili.
- `retire_when`: ogni riga BOUNDARY contiene source domain, seed stabile, lunghezza gaps, feature target, reader k/n_gaps/seed e output full/centroid/kNN.
- `det+1_patch_risk`: alzare N o aggiungere domini per compensare il delta logistica senza correggere la provenance accumula calcolo, non informazione.
- `det-1_next_move`: rendere la riga il luogo della memoria: source -> seed -> gaps -> feature -> reader -> output.

## Re-discovery audit
- **Baseline noto piu vicino**: reproducible computational experiment, RNG provenance audit, kNN/centroid boundary stability, percolation-on-graph.
- **Cosa assorbe il baseline**: il delta logistica e' spiegato da provenance mancante, non da una nuova dinamica fisica.
- **Cosa resta Lab-specific**: il criterio A -> M -> B per impedire che un reader BOUNDARY non tracciato diventi promozione di contenuto fisico.
- `two_reader_boundary_confirmed`: no.
- `graph_only_residue`: logistica resta non riprodotta storicamente; percolation resta edge-case riprodotto ma gia' reader-regressed.
- `scope_change_declared`: no; stesso perimetro 13 x 27, stesso N=32 per replica comparabile.
- `graph_baseline_audit`: resta quello di `20260528_2138`; questo ciclo aggiunge provenance reproduction delta.

## Verdict
CONSTRAINT.

Il ciclo chiude solo la domanda di provenance. La baseline fisica A riproducibile dopo patch e':
- logistica: `26/27`, non il vecchio `27/27`;
- percolation: `27/27`, ma separata e non promossa.

La trasformazione matematica M e' la seedazione stabile per dominio dentro `row_spacings` piu' il reader 27. La fisica B testata resta il null interno; nel fresh non produce costo sufficiente a riaprire promozioni. Il prossimo passo non e' un claim, e' la cache row-aligned.

## Consecutio
Costruire `boundary_physical_internal_null_cache_row_aligned_<timestamp>.jsonl` prima di un nuovo N>=128. La cache deve permettere confronto per target separati:
- logistica rientra solo se due baseline fresh indipendenti restano `26/27` o convergono a un nuovo valore dichiarato prima del null;
- percolation rientra solo come edge-case separato, con full/centroid/kNN e physical null registrati per riga.

## Telemetria
- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` non presenti nell'ambiente.
- `PYTHONPATH=tools python3 -m py_compile tools/exp_boundary_physical_internal_null.py` completato.
- Run comparabile completato: `PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null.py --null-trials 32 --null-seed 202605282042 --out tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json`.
- Run fresh indipendente leggero completato: `PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null.py --null-trials 1 --null-seed 202605282223 --out tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json`.
- Worktree gia dirty prima del ciclo; creati solo due JSON fresh e questo report.
- Nessun update del seme, nessuna promozione pubblica, nessun sync.

## Files
- Historical data: `tools/data/boundary_physical_internal_null_20260528_2042.json`
- Fresh data N=32: `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json`
- Fresh data N=1: `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json`
- Report: `tools/data/reports/agent_20260528_2222.md`

exec
/bin/bash -lc 'git status --short -- tools/data/reports/agent_20260528_2222.md tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json' in /opt/MM_D-ND
 succeeded in 0ms:
?? tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json
?? tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json
?? tools/data/reports/agent_20260528_2222.md

diff --git a/tools/data/reports/agent_20260528_2222.md b/tools/data/reports/agent_20260528_2222.md
new file mode 100644
index 0000000000000000000000000000000000000000..30485fb39443d151e723e42475baca394d63a025
--- /dev/null
+++ b/tools/data/reports/agent_20260528_2222.md
@@ -0,0 +1,143 @@
+# Agent Report - BOUNDARY Provenance Reproduction Delta
+**Date**: 2026-05-28 22:22
+**Tension explored**: BOUNDARY / provenance of physical-internal reader rows
+**verdict**: CONSTRAINT - L'artefatto storico `boundary_physical_internal_null_20260528_2042.json` non e' baseline-identical dopo la patch di provenance. Con `row_spacings` seedato e provenance esplicita, `logistica_biforcazione_var_3.5699:cycle_13` passa da `27/27` a `26/27`; `percolation:cycle_9` resta `27/27`. Il claim fisico resta bloccato; il claim ammesso e' solo che la provenance seedata rende visibile il delta storico/fresh.
+observables_registry: 1.0.0-2026-05-06 via boundary_graph_curvature_gate
+observables_used: [target_graph_bridge_hits, physical_internal_null_hits, row_spacings_provenance_presence, baseline_reproduction_delta]
+ssp_value: yes
+
+**observable_contract**: claim=la patch di provenance e' sufficiente a distinguere artefatto storico non tracciato e riproduzione fresh tracciata; observable=target hit count observed su 27 reader + presenza `row_spacings_provenance`; operator=riesecuzione dello stesso physical-internal null N=32 dopo seed stabili per dominio; denominator=13 righe BOUNDARY, 27 reader reads, physical null N=32 per replica comparabile; p_value_definition=right-tail raw_p=k/N dai JSON, k = trial null con hit count >= observed_hits; non_possible=promuovere claim fisici se il baseline observed non e' identico tra storico e fresh; not_tested=nuovi domini, N=128 full, prova analitica delle source label.
+
+## Source directive
+Seguita la direttiva one-shot nel campo vivo `tools/data/agent_field_live.md`: confrontare `boundary_physical_internal_null_20260528_2042.json` con una riproduzione fresh dopo patch provenance, dichiarare delta storico/fresh, separare logistica e percolation, limitare il claim alla provenance e proporre cache row-aligned prima di nuove promozioni fisiche.
+
+## Respiro fuori-tempo
+- **Combo**: A2 confine + A4 modus + A11 combo + BOUNDARY `8 GUE / 5 Poisson` + nodo regressivo provenance del reader.
+- **Dipolo / punto-zero**: artefatto storico / artefatto riproducibile. Punto-zero: la stessa riga target quando il generatore stocastico riceve o non riceve un seed persistito.
+- **Piano superiore**: grafo della conoscenza come superficie di lettura; il valore fisico non viene deciso dal target name ma dalla tracciabilita' del percorso A->M->B.
+- **Contaminazione cognitiva**: CE-none:`tools/data/agent_field_live.md` non espone archivio enzimi esplicito in questa sezione; usata la regola cross-agent `indeterminato -> reitera con il sistema` come atto minimo: run storico-comparabile + run fresh indipendente N=1.
+- **Proto-ipotesi**: se il seed domain-stable cambia il baseline observed rispetto allo storico, il vecchio artefatto non puo' essere autorita' per claim fisici; diventa input di migrazione provenance.
+- **Possibile/non-possibile**: possibile = usare la riproduzione seedata come baseline A riproducibile; non-possibile = chiudere insieme logistica e percolation o promuovere il vecchio `27/27` logistica.
+- **Movimento A->M->B**: fisico A = perimetro BOUNDARY `8 GUE / 5 Poisson`; matematica M = funzione `row_spacings(domain)` con seed stabile `sha256(boundary-row-spacings-v1:domain)` e reader 27; fisico B = null interno logistica/percolation. B resta testabile solo dopo cache row-aligned.
+
+## Aderenza alla direzione
+- `relation`: `follows_direction`
+- `why`: il ciclo attacca direttamente la direzione viva: provenance del reader BOUNDARY prima di nuovi claim fisici.
+- `not_drift`: non aggiunge domini, non cerca salvataggi fisici, non usa phi/Sturmian/V_c; confronta storico/fresh sullo stesso script e stesso perimetro.
+- `seed_residue`: resta da costruire la cache row-aligned completa N>=128 per quantificare il costo fisico separato dal reader.
+- `return_criterion`: rientro al test fisico solo quando due run fresh indipendenti hanno baseline observed identico e ogni trial conserva source/gaps/features/RNG/reader outputs.
+
+## claim
+La patch di provenance non conferma un contenuto fisico; rende falsificabile la riproduzione del reader. Nel confronto storico/fresh, il vecchio baseline logistica `27/27` non riproduce: il baseline fresh tracciato e' `26/27`.
+
+## falsificazione
+Attacco alla riproducibilita':
+
+| artifact | provenance | null_seed | null_trials | logistica observed | percolation observed | null distributions |
+|---|---|---:|---:|---:|---:|---|
+| `boundary_physical_internal_null_20260528_2042.json` | absent | 202605282042 | 32 | 27/27 | 27/27 | logistica `{27:32}`; percolation `{13:1,27:31}` |
+| `boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json` | present | 202605282042 | 32 | 26/27 | 27/27 | logistica `{26:1,27:31}`; percolation `{12:1,27:31}` |
+| `boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json` | present | 202605282223 | 1 | 26/27 | 27/27 | logistica `{27:1}`; percolation `{27:1}` |
+
+Baseline fresh indipendente:
+- logistica: `26/27` in due run fresh; non identica allo storico `27/27`.
+- percolation: `27/27` in storico e due run fresh; resta edge-case separato, non chiusura comune.
+
+Seed provenance verificata nel fresh:
+- `ROW_SPACINGS_SEED_SALT`: `boundary-row-spacings-v1`
+- logistica domain seed: `2298612439`
+- percolation domain seed: `2828479326`
+
+## Delta storico -> fresh
+1. Verificato: lo storico non contiene `row_spacings_provenance`.
+2. Verificato: il fresh contiene `row_spacings_provenance` con seed stabile per dominio.
+3. Verificato: logistica cambia baseline observed da `27/27` a `26/27`.
+4. Verificato: percolation conserva baseline observed `27/27`.
+5. Verificato: il null fisico interno ricostruisce ancora pienamente o quasi pienamente il reader: logistica `null_ge=32/32`, `eq_full=31/32`; percolation `null_ge=31/32`, `eq_full=31/32`.
+6. Inferito: il vecchio artefatto era contaminato da stato RNG non persistito; il nuovo artefatto e' riproducibile come baseline fresh, ma non autorizza claim fisici.
+
+## Cache row-aligned proposta
+Schema minimo per il prossimo artefatto cache-first:
+
+```json
+{
+  "target": "domain_window",
+  "trial": 0,
+  "source": {
+    "domain": "domain",
+    "source_domain_type": "GUE|Poisson",
+    "domain_seed": 0,
+    "row_spacings_seed_salt": "boundary-row-spacings-v1"
+  },
+  "target_features": {
+    "n_gaps_available": 0,
+    "n_gaps_used": 0,
+    "observables": {},
+    "shuffle_z": {}
+  },
+  "reader": {
+    "k": 0,
+    "n_gaps": 0,
+    "seed": 0,
+    "n_shuffle": 32
+  },
+  "outputs": {
+    "full_reader_hit": false,
+    "centroid_only_hit": false,
+    "knn_only_hit": false
+  },
+  "null_meta": {
+    "null": "logistic_gap_block_shuffle|critical_site_percolation_cluster_geometry_resample",
+    "surrogate_seed": 0,
+    "params": {}
+  }
+}
+```
+
+Regola di uso: la cache deve essere row-aligned su `target/trial/reader`, non aggregata a posteriori. I confronti ammessi sono solo fra righe con stesso `target`, stesso `trial` e stesso `reader` oppure con bridge dichiarato.
+
+## block_autology
+- `origin`: report `20260528_2138` bloccato per overclaim su percolation e artefatto `20260528_2042` non riproducibile da provenance.
+- `node_regressivo`: generatori stocastici di `dnd_autoricerca` chiamati da `row_spacings` senza seed persistito nell'artefatto storico.
+- `protects`: impedisce che un baseline reader contaminato da RNG diventi evidenza fisica.
+- `valid_until`: due run fresh indipendenti, con cache row-aligned, producono baseline identical per target e trial comparabili.
+- `retire_when`: ogni riga BOUNDARY contiene source domain, seed stabile, lunghezza gaps, feature target, reader k/n_gaps/seed e output full/centroid/kNN.
+- `det+1_patch_risk`: alzare N o aggiungere domini per compensare il delta logistica senza correggere la provenance accumula calcolo, non informazione.
+- `det-1_next_move`: rendere la riga il luogo della memoria: source -> seed -> gaps -> feature -> reader -> output.
+
+## Re-discovery audit
+- **Baseline noto piu vicino**: reproducible computational experiment, RNG provenance audit, kNN/centroid boundary stability, percolation-on-graph.
+- **Cosa assorbe il baseline**: il delta logistica e' spiegato da provenance mancante, non da una nuova dinamica fisica.
+- **Cosa resta Lab-specific**: il criterio A -> M -> B per impedire che un reader BOUNDARY non tracciato diventi promozione di contenuto fisico.
+- `two_reader_boundary_confirmed`: no.
+- `graph_only_residue`: logistica resta non riprodotta storicamente; percolation resta edge-case riprodotto ma gia' reader-regressed.
+- `scope_change_declared`: no; stesso perimetro 13 x 27, stesso N=32 per replica comparabile.
+- `graph_baseline_audit`: resta quello di `20260528_2138`; questo ciclo aggiunge provenance reproduction delta.
+
+## Verdict
+CONSTRAINT.
+
+Il ciclo chiude solo la domanda di provenance. La baseline fisica A riproducibile dopo patch e':
+- logistica: `26/27`, non il vecchio `27/27`;
+- percolation: `27/27`, ma separata e non promossa.
+
+La trasformazione matematica M e' la seedazione stabile per dominio dentro `row_spacings` piu' il reader 27. La fisica B testata resta il null interno; nel fresh non produce costo sufficiente a riaprire promozioni. Il prossimo passo non e' un claim, e' la cache row-aligned.
+
+## Consecutio
+Costruire `boundary_physical_internal_null_cache_row_aligned_<timestamp>.jsonl` prima di un nuovo N>=128. La cache deve permettere confronto per target separati:
+- logistica rientra solo se due baseline fresh indipendenti restano `26/27` o convergono a un nuovo valore dichiarato prima del null;
+- percolation rientra solo come edge-case separato, con full/centroid/kNN e physical null registrati per riga.
+
+## Telemetria
+- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` non presenti nell'ambiente.
+- `PYTHONPATH=tools python3 -m py_compile tools/exp_boundary_physical_internal_null.py` completato.
+- Run comparabile completato: `PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null.py --null-trials 32 --null-seed 202605282042 --out tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json`.
+- Run fresh indipendente leggero completato: `PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null.py --null-trials 1 --null-seed 202605282223 --out tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json`.
+- Worktree gia dirty prima del ciclo; creati solo due JSON fresh e questo report.
+- Nessun update del seme, nessuna promozione pubblica, nessun sync.
+
+## Files
+- Historical data: `tools/data/boundary_physical_internal_null_20260528_2042.json`
+- Fresh data N=32: `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json`
+- Fresh data N=1: `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json`
+- Report: `tools/data/reports/agent_20260528_2222.md`

codex
Ruolo/funzione:
AI-Lab D-ND, cycle agent su provenance BOUNDARY.

Fonti lette:
`tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `CONDENSATO_ESSENZIALE.md`, `shared_memory/*`, report/JSON `20260528_2042` e `20260528_2138`, script BOUNDARY.

Verificato:
Il report richiesto è stato scritto in [agent_20260528_2222.md](/opt/MM_D-ND/tools/data/reports/agent_20260528_2222.md).  
Delta principale: storico logistica `27/27` -> fresh seedato `26/27`; percolation resta `27/27`. Lo storico non aveva `row_spacings_provenance`, il fresh sì.

Azioni eseguite:
Ho eseguito una replica full comparabile N=32 e una replica fresh leggera N=1:
- `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json`
- `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json`

Side effect:
Creati solo i due JSON fresh e il report. Nessun update del seme, nessuna promozione pubblica, nessun sync. Worktree era già sporco prima del ciclo.

Non verificato:
Non ho costruito la cache row-aligned completa N>=128; il report propone lo schema e la usa come criterio di rientro.

Prossimo passo:
Costruire `boundary_physical_internal_null_cache_row_aligned_<timestamp>.jsonl` prima di qualunque nuovo claim fisico o aumento N.
diff --git a/tools/data/reports/agent_20260528_2222.md b/tools/data/reports/agent_20260528_2222.md
new file mode 100644
index 0000000000000000000000000000000000000000..30485fb39443d151e723e42475baca394d63a025
--- /dev/null
+++ b/tools/data/reports/agent_20260528_2222.md
@@ -0,0 +1,143 @@
+# Agent Report - BOUNDARY Provenance Reproduction Delta
+**Date**: 2026-05-28 22:22
+**Tension explored**: BOUNDARY / provenance of physical-internal reader rows
+**verdict**: CONSTRAINT - L'artefatto storico `boundary_physical_internal_null_20260528_2042.json` non e' baseline-identical dopo la patch di provenance. Con `row_spacings` seedato e provenance esplicita, `logistica_biforcazione_var_3.5699:cycle_13` passa da `27/27` a `26/27`; `percolation:cycle_9` resta `27/27`. Il claim fisico resta bloccato; il claim ammesso e' solo che la provenance seedata rende visibile il delta storico/fresh.
+observables_registry: 1.0.0-2026-05-06 via boundary_graph_curvature_gate
+observables_used: [target_graph_bridge_hits, physical_internal_null_hits, row_spacings_provenance_presence, baseline_reproduction_delta]
+ssp_value: yes
+
+**observable_contract**: claim=la patch di provenance e' sufficiente a distinguere artefatto storico non tracciato e riproduzione fresh tracciata; observable=target hit count observed su 27 reader + presenza `row_spacings_provenance`; operator=riesecuzione dello stesso physical-internal null N=32 dopo seed stabili per dominio; denominator=13 righe BOUNDARY, 27 reader reads, physical null N=32 per replica comparabile; p_value_definition=right-tail raw_p=k/N dai JSON, k = trial null con hit count >= observed_hits; non_possible=promuovere claim fisici se il baseline observed non e' identico tra storico e fresh; not_tested=nuovi domini, N=128 full, prova analitica delle source label.
+
+## Source directive
+Seguita la direttiva one-shot nel campo vivo `tools/data/agent_field_live.md`: confrontare `boundary_physical_internal_null_20260528_2042.json` con una riproduzione fresh dopo patch provenance, dichiarare delta storico/fresh, separare logistica e percolation, limitare il claim alla provenance e proporre cache row-aligned prima di nuove promozioni fisiche.
+
+## Respiro fuori-tempo
+- **Combo**: A2 confine + A4 modus + A11 combo + BOUNDARY `8 GUE / 5 Poisson` + nodo regressivo provenance del reader.
+- **Dipolo / punto-zero**: artefatto storico / artefatto riproducibile. Punto-zero: la stessa riga target quando il generatore stocastico riceve o non riceve un seed persistito.
+- **Piano superiore**: grafo della conoscenza come superficie di lettura; il valore fisico non viene deciso dal target name ma dalla tracciabilita' del percorso A->M->B.
+- **Contaminazione cognitiva**: CE-none:`tools/data/agent_field_live.md` non espone archivio enzimi esplicito in questa sezione; usata la regola cross-agent `indeterminato -> reitera con il sistema` come atto minimo: run storico-comparabile + run fresh indipendente N=1.
+- **Proto-ipotesi**: se il seed domain-stable cambia il baseline observed rispetto allo storico, il vecchio artefatto non puo' essere autorita' per claim fisici; diventa input di migrazione provenance.
+- **Possibile/non-possibile**: possibile = usare la riproduzione seedata come baseline A riproducibile; non-possibile = chiudere insieme logistica e percolation o promuovere il vecchio `27/27` logistica.
+- **Movimento A->M->B**: fisico A = perimetro BOUNDARY `8 GUE / 5 Poisson`; matematica M = funzione `row_spacings(domain)` con seed stabile `sha256(boundary-row-spacings-v1:domain)` e reader 27; fisico B = null interno logistica/percolation. B resta testabile solo dopo cache row-aligned.
+
+## Aderenza alla direzione
+- `relation`: `follows_direction`
+- `why`: il ciclo attacca direttamente la direzione viva: provenance del reader BOUNDARY prima di nuovi claim fisici.
+- `not_drift`: non aggiunge domini, non cerca salvataggi fisici, non usa phi/Sturmian/V_c; confronta storico/fresh sullo stesso script e stesso perimetro.
+- `seed_residue`: resta da costruire la cache row-aligned completa N>=128 per quantificare il costo fisico separato dal reader.
+- `return_criterion`: rientro al test fisico solo quando due run fresh indipendenti hanno baseline observed identico e ogni trial conserva source/gaps/features/RNG/reader outputs.
+
+## claim
+La patch di provenance non conferma un contenuto fisico; rende falsificabile la riproduzione del reader. Nel confronto storico/fresh, il vecchio baseline logistica `27/27` non riproduce: il baseline fresh tracciato e' `26/27`.
+
+## falsificazione
+Attacco alla riproducibilita':
+
+| artifact | provenance | null_seed | null_trials | logistica observed | percolation observed | null distributions |
+|---|---|---:|---:|---:|---:|---|
+| `boundary_physical_internal_null_20260528_2042.json` | absent | 202605282042 | 32 | 27/27 | 27/27 | logistica `{27:32}`; percolation `{13:1,27:31}` |
+| `boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json` | present | 202605282042 | 32 | 26/27 | 27/27 | logistica `{26:1,27:31}`; percolation `{12:1,27:31}` |
+| `boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json` | present | 202605282223 | 1 | 26/27 | 27/27 | logistica `{27:1}`; percolation `{27:1}` |
+
+Baseline fresh indipendente:
+- logistica: `26/27` in due run fresh; non identica allo storico `27/27`.
+- percolation: `27/27` in storico e due run fresh; resta edge-case separato, non chiusura comune.
+
+Seed provenance verificata nel fresh:
+- `ROW_SPACINGS_SEED_SALT`: `boundary-row-spacings-v1`
+- logistica domain seed: `2298612439`
+- percolation domain seed: `2828479326`
+
+## Delta storico -> fresh
+1. Verificato: lo storico non contiene `row_spacings_provenance`.
+2. Verificato: il fresh contiene `row_spacings_provenance` con seed stabile per dominio.
+3. Verificato: logistica cambia baseline observed da `27/27` a `26/27`.
+4. Verificato: percolation conserva baseline observed `27/27`.
+5. Verificato: il null fisico interno ricostruisce ancora pienamente o quasi pienamente il reader: logistica `null_ge=32/32`, `eq_full=31/32`; percolation `null_ge=31/32`, `eq_full=31/32`.
+6. Inferito: il vecchio artefatto era contaminato da stato RNG non persistito; il nuovo artefatto e' riproducibile come baseline fresh, ma non autorizza claim fisici.
+
+## Cache row-aligned proposta
+Schema minimo per il prossimo artefatto cache-first:
+
+```json
+{
+  "target": "domain_window",
+  "trial": 0,
+  "source": {
+    "domain": "domain",
+    "source_domain_type": "GUE|Poisson",
+    "domain_seed": 0,
+    "row_spacings_seed_salt": "boundary-row-spacings-v1"
+  },
+  "target_features": {
+    "n_gaps_available": 0,
+    "n_gaps_used": 0,
+    "observables": {},
+    "shuffle_z": {}
+  },
+  "reader": {
+    "k": 0,
+    "n_gaps": 0,
+    "seed": 0,
+    "n_shuffle": 32
+  },
+  "outputs": {
+    "full_reader_hit": false,
+    "centroid_only_hit": false,
+    "knn_only_hit": false
+  },
+  "null_meta": {
+    "null": "logistic_gap_block_shuffle|critical_site_percolation_cluster_geometry_resample",
+    "surrogate_seed": 0,
+    "params": {}
+  }
+}
+```
+
+Regola di uso: la cache deve essere row-aligned su `target/trial/reader`, non aggregata a posteriori. I confronti ammessi sono solo fra righe con stesso `target`, stesso `trial` e stesso `reader` oppure con bridge dichiarato.
+
+## block_autology
+- `origin`: report `20260528_2138` bloccato per overclaim su percolation e artefatto `20260528_2042` non riproducibile da provenance.
+- `node_regressivo`: generatori stocastici di `dnd_autoricerca` chiamati da `row_spacings` senza seed persistito nell'artefatto storico.
+- `protects`: impedisce che un baseline reader contaminato da RNG diventi evidenza fisica.
+- `valid_until`: due run fresh indipendenti, con cache row-aligned, producono baseline identical per target e trial comparabili.
+- `retire_when`: ogni riga BOUNDARY contiene source domain, seed stabile, lunghezza gaps, feature target, reader k/n_gaps/seed e output full/centroid/kNN.
+- `det+1_patch_risk`: alzare N o aggiungere domini per compensare il delta logistica senza correggere la provenance accumula calcolo, non informazione.
+- `det-1_next_move`: rendere la riga il luogo della memoria: source -> seed -> gaps -> feature -> reader -> output.
+
+## Re-discovery audit
+- **Baseline noto piu vicino**: reproducible computational experiment, RNG provenance audit, kNN/centroid boundary stability, percolation-on-graph.
+- **Cosa assorbe il baseline**: il delta logistica e' spiegato da provenance mancante, non da una nuova dinamica fisica.
+- **Cosa resta Lab-specific**: il criterio A -> M -> B per impedire che un reader BOUNDARY non tracciato diventi promozione di contenuto fisico.
+- `two_reader_boundary_confirmed`: no.
+- `graph_only_residue`: logistica resta non riprodotta storicamente; percolation resta edge-case riprodotto ma gia' reader-regressed.
+- `scope_change_declared`: no; stesso perimetro 13 x 27, stesso N=32 per replica comparabile.
+- `graph_baseline_audit`: resta quello di `20260528_2138`; questo ciclo aggiunge provenance reproduction delta.
+
+## Verdict
+CONSTRAINT.
+
+Il ciclo chiude solo la domanda di provenance. La baseline fisica A riproducibile dopo patch e':
+- logistica: `26/27`, non il vecchio `27/27`;
+- percolation: `27/27`, ma separata e non promossa.
+
+La trasformazione matematica M e' la seedazione stabile per dominio dentro `row_spacings` piu' il reader 27. La fisica B testata resta il null interno; nel fresh non produce costo sufficiente a riaprire promozioni. Il prossimo passo non e' un claim, e' la cache row-aligned.
+
+## Consecutio
+Costruire `boundary_physical_internal_null_cache_row_aligned_<timestamp>.jsonl` prima di un nuovo N>=128. La cache deve permettere confronto per target separati:
+- logistica rientra solo se due baseline fresh indipendenti restano `26/27` o convergono a un nuovo valore dichiarato prima del null;
+- percolation rientra solo come edge-case separato, con full/centroid/kNN e physical null registrati per riga.
+
+## Telemetria
+- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` non presenti nell'ambiente.
+- `PYTHONPATH=tools python3 -m py_compile tools/exp_boundary_physical_internal_null.py` completato.
+- Run comparabile completato: `PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null.py --null-trials 32 --null-seed 202605282042 --out tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json`.
+- Run fresh indipendente leggero completato: `PYTHONPATH=tools python3 tools/exp_boundary_physical_internal_null.py --null-trials 1 --null-seed 202605282223 --out tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json`.
+- Worktree gia dirty prima del ciclo; creati solo due JSON fresh e questo report.
+- Nessun update del seme, nessuna promozione pubblica, nessun sync.
+
+## Files
+- Historical data: `tools/data/boundary_physical_internal_null_20260528_2042.json`
+- Fresh data N=32: `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json`
+- Fresh data N=1: `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json`
+- Report: `tools/data/reports/agent_20260528_2222.md`

tokens used
68,619
Ruolo/funzione:
AI-Lab D-ND, cycle agent su provenance BOUNDARY.

Fonti lette:
`tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `CONDENSATO_ESSENZIALE.md`, `shared_memory/*`, report/JSON `20260528_2042` e `20260528_2138`, script BOUNDARY.

Verificato:
Il report richiesto è stato scritto in [agent_20260528_2222.md](/opt/MM_D-ND/tools/data/reports/agent_20260528_2222.md).  
Delta principale: storico logistica `27/27` -> fresh seedato `26/27`; percolation resta `27/27`. Lo storico non aveva `row_spacings_provenance`, il fresh sì.

Azioni eseguite:
Ho eseguito una replica full comparabile N=32 e una replica fresh leggera N=1:
- `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282042.json`
- `tools/data/boundary_physical_internal_null_repro_20260528_2222_seed202605282223_N1.json`

Side effect:
Creati solo i due JSON fresh e il report. Nessun update del seme, nessuna promozione pubblica, nessun sync. Worktree era già sporco prima del ciclo.

Non verificato:
Non ho costruito la cache row-aligned completa N>=128; il report propone lo schema e la usa come criterio di rientro.

Prossimo passo:
Costruire `boundary_physical_internal_null_cache_row_aligned_<timestamp>.jsonl` prima di qualunque nuovo claim fisico o aumento N.
