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-lab/memories]
reasoning effort: none
reasoning summaries: none
session id: 019e0fef-64ba-7eb1-8f60-8d4f8814f110
--------
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_20260510_0330.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
Leggo il campo vivo e il contesto operativo prima di scegliere l’esperimento. Controllerò anche se esiste una direttiva one-shot, perché in quel caso prevale sulla scelta autonoma.
exec
/bin/bash -lc "if [ -f tools/data/operator_directive.md ]; then sed -n '1,200p' tools/data/operator_directive.md; else true; fi" in /opt/MM_D-ND
exec
/bin/bash -lc 'ls -t shared_memory/*.md 2>/dev/null | head -10' in /opt/MM_D-ND
 succeeded in 0ms:
 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 "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.

## 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.

## 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.

## 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.
Se non riesci a compilare questi sei 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_20260509_1839: 2 ghost · Agent Report - Boundary Transition Taxonomy 13 Rows
- report_20260509_1532: 2 ghost · Agent Report - Boundary Two-Axis Matrix
**Forma del campo**: 9 ponti, 1 vuoto(i), 6 scoperte.
**Direzione seme da respirare**: Esplorare il confine: 8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo

## Contratto di aderenza alla traiettoria
- Direzione viva del seme: Esplorare il confine: 8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo
- Ultima decisione valutatore: 20260509_1839 NEXT_CYCLE/high
- Direzione operativa valutatore: BOUNDARY consecutio sui due residui beta-absent medio/forti
- Perche': Il ciclo ha prodotto una chiusura locale utile senza contraddizione: `thin_persist_rows=0` dissolve la specie `blank_thin_support` sul perimetro 13 righe, ma lascia due residui medio/forti senza beta (`numeri_primi:cycle_3`, `random_matrix:cycle_7`). La consecutio naturale non e' redesign: e' testare se quei due blank residui sono stesso operatore di confine, due classi distinte, o artefatto da denominatore/atlante.
- Nota: Prossima mossa: isolare il residuo vivo dopo la dissoluzione del thin blank. Se anche questi due blank cadono, la tassonomia BOUNDARY puo' maturare; se divergono, emerge nuova tensione strutturale.

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
  solo per disegnare dualita': deve produrre un osservabile.

### 4. Equazioni differenziali, flussi e stabilita'

Operatori:

- ODE;
- PDE;
- flusso di gradiente;
- Hamiltonian flow;
- Lagrangian / action;
- fixed point;
- biforcazione;
- attractor;
- Lyapunov exponent;
- Riccati equation;
- heat equation;
- wave equation;
- diffusion equation;
- reaction-diffusion;
- renormalization flow.

Dipoli utili:

- flusso / punto fisso;
- stabilita' / instabilita';
- reversibile / dissipativo;
- locale / propagato;
- biforcazione / continuita'.

Controlli:

- perturbazione iniziale;
- time reversal;
- noise injection;
- random field;
- stesso spettro, diversa dinamica.

### 5. Topologia assiomatica e forme globali

Operatori:

- omotopia;
- omologia;
- coomologia;
- indice;
- winding number;
- Euler characteristic;
- Betti numbers;
- persistent homology;
- Morse theory;
- boundary operator;
- cobordism;
- sheaf / cosheaf;
- topos-like viewpoint.

Dipoli utili:

- bordo / interno;

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.
- **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.
- **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.
- **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.

## Come operare — il modus

Non seguire passi. Segui il modus: **espandi → osserva → taglia → risultante**.

### 1. Espandi
Leggi il seme, le tensioni, il contesto. Non scegliere subito — lascia che il campo si carichi. Guarda dove più tensioni convergono sullo stesso punto. Se METRIC_TENSOR e BOUNDARY e BRODY_CROSSOVER parlano tutte della stessa cosa da angoli diversi, il punto è lì — non in una delle tre.

### 2. Osserva
La prima impressione contiene il segnale. Cosa emerge dal campo caricato? Non è "quale tensione ha l'intensità più alta" — è "dove si concentra il potenziale non esplorato?". La dissonanza è il segnale. L'errore è il varco. Quello che non torna è più interessante di quello che conferma.

Prima di scegliere misure o generatori, comprimi l'impressione in una frase di
condensato. I dettagli nascono dopo: sono strumenti per verificare la prima
risultante, non il punto da inseguire.

### 3. Taglia
Una risultante, non una lista. Se vedi 5 possibilità, non hai tagliato. Formula UNA domanda che, se rispondessi, cambierebbe lo stato del sistema. Non "è vero X?" ma "cosa succede se misuro Y che nessuno ha misurato?"

### 4. Risultante
Scrivi lo strumento — non l'esperimento usa e getta. Se scopri che serve misurare la pair correlation dei primi, scrivi `exp_pair_correlation.py` che può essere riusato con parametri diversi. Se scopri un pattern, cristallizzalo come tensione nel seme. Se falsifichi qualcosa, registra il vincolo.

### La consecutio — cosa apre
Dopo ogni risultato, la domanda più importante è: **cosa apre questo?** Non "ho confermato X" ma "ora che so X, cosa diventa possibile che prima non lo era?" La consecutio non inverte — prosegue. Se il risultato non apre nulla, non era un risultato — era una conferma circolare.

### Il dipolo — trova l'opposto
Ogni trovata ha un opposto. Se trovi che la curvatura è de Sitter, l'opposto è: "dove NON è de Sitter?" Se trovi che i primi sono GUE-like, l'opposto è: "dove smettono di esserlo?" Il contenuto è nella tensione tra i due — non in uno dei due poli.

### Crea strumenti, non esperimenti
Uno script che misura una cosa su un set di primi è un esperimento. Uno script che misura quella cosa su qualsiasi segnale ordinato è uno strumento. Il lab cresce quando crea strumenti che i prossimi cicli possono usare. Salva gli strumenti riusabili in tools/exp_*.py con parametri.

### Leggi il seme, scrivi il report, aggiorna il seme
- Leggi: tools/data/seme.json
- Report: tools/data/reports/agent_TIMESTAMP.md
- Aggiorna: aggiungi tensione o vincolo al seme
- Video: se hai usato un video dal feed, segna processed=true in tools/data/video_feed.json

## Strumenti disponibili (directory /opt/MM_D-ND/tools/)

- **dnd_scenario.py**: PRIMA di scegliere cosa esplorare, esegui `python tools/dnd_scenario.py --best`.
  Ti dice quale tensione ha il massimo potere discriminante e dove punta la risultante.
  Il proiettore mappa le tensioni su P^1, estrae le leggi di scala dai claim, e proietta sulla curva.
- dnd_autoricerca.py: esplora domini, varianti, null baseline
- dnd_controprove.py: 6 controprove indipendenti
- dnd_domandatore.py --ask 'tensione': 5 operatori discriminanti
- dnd_incrocio.py: incrocio teorie, ponti, vuoti, domande fondamentali
- dnd_normalizer.py: scissione, regola D-ND, discriminatore dipoli su segnali
- dnd_bloch_explorer.py: scan Bloch, φ emergente
- dnd_arxiv.py: cerca paper rilevanti su arXiv

Motore strutturale del modello (importabili come libreria, non workflow obbligati):

- dnd_kernel.py: regole del livello (f, M, det=-1, costanti, assiomi A0-A3, principi P0-P5, leggi L0-L7)
- dnd_teoria.py: 5 teorie codificate come dipoli (TQGE+R), 13 dipoli, isomorfie cross-teoria
- dnd_dipolo_lab.py: pattern producer/critic con Godel inversion (PoloA esplora, PoloB inverte)
- dnd_M_operator.py: M sulla conoscenza [noto, ignoto] → φ. Stato in knowledge_state.json
- dnd_riflesso.py: campo compresso + 3 voci (NUOVO/ROTTURA/DIREZIONE), un colpo non un ciclo

- Puoi scrivere ed eseguire script Python con numpy, scipy, sympy
- Se ti serve contesto esterno e non hai video, cercalo

## Errori già fatti — non ripeterli

Questi sono errori reali commessi nelle sessioni precedenti. Il sistema li ha pagati.

**1. Cercare conferme invece di creare strumenti.**
Non scrivere esperimenti per dimostrare che qualcosa è vero. Scrivi esperimenti che misurano qualcosa di nuovo — il risultato dirà da solo se conferma o falsifica. Se sai già cosa troverai, non stai esplorando.

**2. Iniettare il risultato atteso nel test.**
Esempio reale: testare se "la curvatura dei primi è GUE-like" calcolando la r-statistic e confrontando con 0.536. Il test trova r=0.503 e dichiara "GUE-like". Ma 0.503 è più vicino a Poisson (0.386) che a GUE (0.536). Il frame "GUE-like" era nel claim, non nei dati. Misura prima, interpreta dopo.

**3. Tautologie — testare proprietà algebriche come se fossero scoperte.**
Esempio reale: la curvatura di Ricci R=2.000 della metrica g=(p/2)² segue analiticamente dal PNT (p_n ~ n ln n). Non è una scoperta — è una conseguenza della definizione. Il contenuto non-banale era altrove: lo shuffle distrugge R dimezzandola (R=-1). Il fattore 2x è la vera scoperta — ma senza il null test sarebbe stata spacciata come "R conferma de Sitter".

**4. Coincidenze numeriche trattate come struttura.**
0.606 ≈ 1/φ = 0.618 (2% di differenza). Non è una connessione — è rumore fino a prova contraria (C2 del condensato). Ogni volta che un numero è "vicino a" φ, √5, π, e, 1/137: non è prova di nulla. Serve un meccanismo, non una vicinanza.

**5. Usare lo stesso dato come input e come test.**

codex
Il campo punta la consecutio su BOUNDARY: restano due residui beta-absent medio/forti (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) dopo la dissoluzione del blank thin. Ora raccolgo i dettagli recenti e lancio il proiettore richiesto dal contesto.
exec
/bin/bash -lc "sed -n '241,520p' tools/data/agent_field_live.md" in /opt/MM_D-ND
 succeeded in 0ms:
- buco / ponte;
- classe globale / rappresentante locale;
- singolare / regolare;
- persistente / transitorio.

Controlli:

- filtrazione random;
- graph rewiring;
- stesso grado, topologia diversa;
- rumore che conserva statistiche locali.

### 6. Algebra, simmetria e rappresentazioni

Operatori:

- gruppo;
- anello;
- modulo;
- campo;
- algebra di Lie;
- rappresentazione;
- carattere;
- spettro;
- autovalore;
- commutatore;
- categoria;
- funtore;
- limite / colimite;
- dualita';
- adjunction.

Dipoli utili:

- elemento / struttura;
- rappresentazione / invariante;
- commutativo / non-commutativo;
- locale / universale;
- oggetto / morfismo.

Controlli:

- trasformazioni che preservano invarianti;
- rappresentazioni non equivalenti;
- generatori non-phi;
- algebra random con stesso ordine.

### 7. Informazione, termodinamica e irreversibilita'

Operatori:

- entropia;
- mutual information;
- KL divergence;
- Fisher information;
- free energy;
- partition function;
- Landauer bound;
- fluctuation theorem;
- entropy production;
- temperature;
- phase transition;
- non-equilibrium steady state.

Dipoli utili:

- informazione / calore;
- reversibile / irreversibile;
- equilibrio / non-equilibrio;
- misura / costo;
- memoria / dissipazione.

Controlli:

- surrogate con stessa distribuzione;
- block shuffle;
- time shuffle;
- temperature sweep;
- finite-size scaling.

### 8. Random matrix, spettri e caos

Operatori:

- GUE;
- GOE;
- GSE;
- Poisson;
- Brody parameter;
- number variance;
- spectral rigidity;
- spacing ratio;
- spectral form factor;
- unfolding;
- eigenvector localization;
- mobility edge.

Dipoli utili:

- repulsione / indipendenza;
- ordine spettrale / caos;
- locale / lungo raggio;
- spettro / autovettore;
- universale / dominio-specifico.

Controlli:

- Poisson synthetic;
- GUE synthetic;
- same density random;
- unfolding alternative;
- finite-size sensitivity.

Nota:

- GUE/Poisson e' spesso un piano di proiezione, non una sorgente. Se diventa
  sorgente, il ciclo rischia di confermare la propria tassonomia.

### 9. Grafi, reti e conoscenza

Operatori:

- Laplacian;
- graph spectrum;
- centrality;
- community;
- cut;
- flow;
- hitting time;
- random walk;
- PageRank-like operator;
- curvature on graphs;
- Ollivier-Ricci curvature;
- Forman-Ricci curvature;
- motif;
- hypergraph;
- simplicial complex.

Dipoli utili:

- nodo / bordo;
- path / cut;
- hub / vuoto;
- locale / globale;
- grafo / ipergrafo.

Controlli:

- degree-preserving rewiring;
- edge shuffle;
- random graph;
- same community size, different topology.

### 10. Campi continui, onde e modi

Operatori:

- Fourier mode;
- wavelet;
- Green function;
- propagator;
- dispersion relation;
- soliton;
- mode locking;
- resonance;
- interference;
- standing wave;
- boundary condition;
- eigenmode.

Dipoli utili:

- onda / particella;
- propagazione / vincolo;
- risonanza / rumore;
- modo locale / modo globale;
- bordo / spettro.

Controlli:

- phase randomization;
- same PSD surrogate;
- boundary swap;
- mode deletion;
- noise floor.

### 11. Computazione, logica e sistemi formali

Operatori:

- automa cellulare;
- Turing machine;
- lambda calculus;
- rewriting system;
- proof search;
- fixed point theorem;
- diagonalization;
- incompleteness;
- type system;
- modal logic;
- paraconsistent logic;
- category semantics.

Dipoli utili:

- regola / esecuzione;
- decidibile / indecidibile;
- sintassi / semantica;
- prova / modello;
- locale computabile / globale emergente.

Controlli:

- random rule;
- same complexity class;
- symbolic perturbation;
- grammar shuffle;
- proof trace vs output trace.

### 12. Materia condensata, fasi e difetti

Operatori:

- Ising model;
- percolation;
- renormalization group;
- order parameter;
- correlation length;
- topological defect;
- domain wall;
- crystal / quasicrystal;
- band gap;
- Chern number;
- Anderson localization;
- phase diagram.

Dipoli utili:

- fase / transizione;
- ordine / disordine;
- locale / correlato;
- gap / banda;
- difetto / struttura.

Controlli:

- critical vs off-critical;
- lattice shuffle;
- disorder sweep;
- boundary condition swap;
- finite-size scaling.

### 13. Cosmologia e scale

Operatori:

- scale factor;
- horizon problem;
- inflation-like expansion;
- cosmological constant;
- causal structure;
- conformal time;
- redshift;
- density perturbation;
- power spectrum;
- large-scale structure.

Dipoli utili:

- locale / cosmico;
- tempo proprio / tempo conforme;
- espansione / vincolo;
- fluttuazione / struttura;
- orizzonte / informazione.

Controlli:

- scale-free surrogate;
- random phase spectrum;
- same power spectrum, different phase;

exec
/bin/bash -lc "sed -n '261,620p' tools/LAB_AGENT_CONTEXT.md" in /opt/MM_D-ND
 succeeded in 0ms:
Se costruisci la metrica usando p_n e poi misuri proprietà di p_n con quella metrica, stai misurando la definizione. Il test vero è: la metrica predice qualcosa sui primi che NON è stato usato per costruirla? Se no, è circolare.

**6. Aggiungere domini hardcoded invece di lasciare che il sistema li trovi.**
Il lab non è una calcolatrice con domini pre-scritti. Se una tensione parla di primi, non aggiungere "metrica_primi" come dominio. Scrivi un esperimento che esplora la tensione — se servono i primi, il codice li userà. Il sistema decide cosa fare, non il programmatore.

**7. Usare numeri per vincolare concetti (det=+1).**
Esempio reale: `intensità: 0.65` trattata come soglia → `if intensita > 0.5: conferma`. Il sistema D-ND opera con dipoli (claim/anti-claim), assonanze (risuona/non risuona), potenziale (alto/medio/basso) — stati qualitativi, non scale numeriche. Quando usi un float come proxy per una qualità strutturale, stai comprimendo il concetto in un numero e il numero decide al posto della struttura. Lo stesso vale per "maturity > 0.99", "confidence < 0.7", "score = rank * 10 + intensita".
**Regola**: se il codice confronta una qualità concettuale con una soglia numerica, è sbagliato. Usa la struttura: dipoli (sì/no), potenziale (tipo, non valore), assonanza (binaria), porta (categoria). I numeri servono per misurare i dati (gap primi, correlazioni, z-score) — non per decidere lo stato del sistema.
Se trovi questo pattern in un tool che stai modificando, correggilo. Non serve riscrivere tutto — correggi dove passi. Il sistema evolve organicamente.

## Come evitarli

- **Prima il null test, poi l'interpretazione.** Ogni esperimento ha un controllo: shuffle (stessa distribuzione, ordine distrutto), Cramer random (stessa densità, nessuna correlazione), baseline teorica.
- **Il risultato non è nel numero — è nella differenza col controllo.** z-score, non valore assoluto.
- **Se il risultato spiega se stesso, non è un risultato.** Chiediti: "questo segue dalla definizione?" Se sì, cerca il contenuto altrove.
- **Non lanciare un esperimento per confermare. Lancialo per scoprire.** La domanda giusta non è "è vero X?" ma "cosa succede se misuro Y?"

## Auto-evoluzione — il sistema corregge se stesso

Il post-processing del lab (step 8 in lab_agent.sh) esegue `structural_check.py` sui file che hai toccato.
Se trova anti-pattern strutturali, genera una tensione META nel seme. Il ciclo successivo la vede e corregge.

**Come funziona:**
- Tu scrivi/modifichi codice → il post-processing lo scansiona
- Se trova numeri che vincolano concetti (errore #7) o altri pattern noti, crea una tensione
- Il prossimo ciclo legge quella tensione e la risolve dove passa
- Non serve riscrivere tutto — il sistema evolve organicamente, un file alla volta

**Se scopri un nuovo anti-pattern:**
- Non limitarti a corregere il codice — aggiungi il pattern a `tools/structural_check.py` nella lista `PATTERNS`
- Così il sistema lo riconoscerà autonomamente nei cicli futuri
- L'errore pagato una volta non si ripete — la consapevolezza si propaga

Questo è f(f(x)): il sistema che migliora il sistema che migliora se stesso.

## Cosa NON fare

- Non modificare CONDENSATO.md, KERNEL_SEED.md, o file del kernel
- Non committare — salva solo in tools/data/ e tools/exp_*.py
- Non inventare dati o risultati
- Non cercare φ — crea le condizioni, osserva cosa emerge
- Non superare 20 minuti di lavoro per ciclo
- Non produrre liste di possibilità — produci UNA risultante
- Non iniziare dalla matematica. La matematica e' bracciata: formalizza,
  misura, falsifica. Prima respira sopra la misura: combo, assiomi, dipoli,
  incroci di teorie, grafo, geometria dei campi, algebra o topologia
  assiomatica. Se la misura genera la domanda, sei dentro la tautologia.

## Formato report

```markdown
# Agent Report — TITOLO
**Date**: YYYY-MM-DD HH:MM
**Piano**: N
**Tension explored**: ID (intensità)
observables_used: [nomi osservabili canonici o domain-native] - usa [] solo se non hai misurato nulla
**observable_contract**: claim=<claim>; observable=<cosa misuri>; operator=<come lo misuri>; generator=<se applicabile>; denominator=<perimetro>; non_possible=<dove il claim diventa non-possibile/null o quale contro-perimetro lo limita>; not_tested=<cosa resta sospeso>

## Respiro fuori-tempo
(Obbligatorio. Compilalo prima dell'esperimento, non dopo.)

- **Combo**: almeno tre enti simultanei (assioma D-ND + incrocio teorie + nodo del grafo/dipolo + tensione seme)
- **Dipolo / punto-zero**: i due poli, il possibile/non-possibile e il punto in cui la dualita' si annulla
- **Piano superiore**: geometria dei campi / algebra / topologia assiomatica / grafo conoscenza / bicono-dipoli
- **Operatori laterali scelti**: 2 o 3 elementi da `tools/LAB_OPERATOR_PALETTE.md`
  e perche' entrano nella combo
- **Contaminazione cognitiva**: eventuale DeltaLink YSN, gene Cornelius,
  passaggio KSAR/PVI/Vault o voce `CE-*` dell'archivio usata nel ciclo. Se non
  usi il layer cognitivo, dichiara `CE-none:` e il motivo specifico. `none`
  generico non basta.
- **Proto-ipotesi**: nuova ipotesi o proto-assioma strutturale, prima dei numeri
- **Proiezione**: perche' l'osservabile scelto manifesta quella combo

## Claim Under Test
> Il claim proiettato dalla combo, non il residuo locale del ciclo precedente

## Question
La domanda che hai formulato dopo il respiro fuori-tempo

## Experiment Design
- Metrica, scope, null baseline, N campioni
- Come la misura serve la combo: cosa della proto-ipotesi puo' sopravvivere o cadere
- Contratto osservabile-operatore: claim, osservabile, operatore, generatore,
  denominatore/perimetro, non_possible/null, cosa non viene testato in questo ciclo
- Se usi frequenze o condition rate, dichiara il denominatore grezzo
  (`hits/total`) e separa ogni osservabile usata nel verdict

## Results
Tabella con numeri reali

## Key Findings
1. Cosa hai trovato (con evidenza)

## Verdict
NEW / CONFIRMED / FALSIFIED / CONSTRAINT

## Bicono della scoperta
(Obbligatoria. Nomina la struttura. Se non riesci, l'esperimento non è ancora filtrato.)

- **Due radici** (dipolo primario, già duali e invertite): <quali sono le due facce della scoperta>
- **Singolare** (qualità del 1-che-è-tutto in questo contesto, dove la dualità non c'è): <cosa>
- **Invariante di passaggio** (cosa sopravvive al passaggio del vertice): <cosa>
- **Campo di possibilità**: qui diventa possibile <X>; qui diventa non-possibile <Y>

Riferimenti: CONDENSATO A16, method/DND_POSSIBILITA.md.

## Files
- Script, dati, report
```

## Bicono della scoperta — come compilarlo

Non è riformulazione ornamentale del Verdict. È **filtro**: la scoperta passa
per il modello e torna spogliata dei bias. Se la struttura (radici · singolare
· invariante · campo) non si riconosce, la scoperta è rumore o è incompleta.

**Esempio retroattivo — TWO_CHANNEL_DECOMPOSITION:**
- Radici: canale magnitudine · canale residuo (segno invertito — uno aggiunge,
  l'altro sottrae sulla PNT)
- Singolare: il segnale totale prima della separazione. Non esiste come ente
  autonomo, esiste solo come sovrapposizione dei due canali.
- Invariante: la chiusura algebrica del residuo al 3° ordine Markov.
- Campo: possibile → predire lo slope PSD magnitudine dalle correlazioni
  Hardy-Littlewood. Non-possibile → trattare il residuo come random noise.

**Esempio retroattivo — DUALITA_DIPOLARE_VS_ILLUSORIA:**
- Radici: dipolo ordinato · dipolo mescolato
- Singolare: la sequenza in sé, prima della distinzione ordine/disordine
- Invariante: det=-1 quando l'ordine è reale; det=+1 quando illusorio
- Campo: possibile → discriminare dipoli reali da illusori via test di
  shuffle. Non-possibile → inferire dipolarità da statistica locale senza
  contesto sequenziale.

**Cattura nel momento emergente.** Compila questa sezione *mentre* l'esperimento
produce i risultati, non alla fine. Se hai già chiuso il Verdict e torni
indietro a scriverla, è post-hoc — introduce distanza dall'immagine-sorgente.
Il modus è A8 applicato: il sistema chiede al sistema di produrre la struttura
*nel formarsi*.

exec
/bin/bash -lc 'for f in $(ls -t shared_memory/*.md 2>/dev/null | head -10); do printf '"'\\n### %s\\n' \""'$f"; sed -n '"'1,180p' \""'$f"; done' in /opt/MM_D-ND
 succeeded in 0ms:

### shared_memory/deposito_cambia_la_parola_non_regola_2026-05-07.md
---
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)

### shared_memory/feedback_indeterminato_reitera_con_sistema_2026-05-07.md
---
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

### shared_memory/README.md
# 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,240p' tools/data/seme.json" in /opt/MM_D-ND
 succeeded in 0ms:
{
  "timestamp": "2026-05-09T18:44:34.285821",
  "piano": 114,
  "tensioni": [
    {
      "tipo": "confine_inesplorato",
      "id": "TRASCENDENZA_LIMITE",
      "claim": "La trascendenza e il limite attuale del modello. I punti fissi relazionali (non solo phi ma la rete di punti fissi tra osservabili) possono rivelare il vero grafo della realta e pattern nelle matrici. Il confine non e nella matematica - e nel passaggio tra piani.",
      "intensita": 0.9,
      "nota": "Input operatore 2026-04-10. Tocca: confine del modello, struttura relazionale dei punti fissi. Consecutio: quali punti fissi relazionali emergono dalle 21 tensioni attuali? Il grafo e gia nei dati?",
      "manuale": true,
      "porta": "sessione_interattiva",
      "condensato_ref": "A3,A10",
      "condensato_motivo": "Estende A3 (punto fisso singolo) a rete relazionale. Tocca A10 (dipolo) come caso speciale."
    },
    {
      "tipo": "scoperta",
      "id": "DUALITA_DIPOLARE_VS_ILLUSORIA",
      "claim": "Due tipi di dualita: (1) dipolare - generativa, il modello (det=-1), (2) illusoria - dispersiva, entropia (det=+1). Le regole incoerenti producono la seconda. La dualita illusoria e entropia come dispersione, non come informazione.",
      "intensita": 0.9,
      "nota": "Input operatore 2026-04-10. Tocca: entropia come dispersione illusoria vs generazione dipolare. Consecutio: nel Lab i domini Poisson (entropia massima) mostrano dualita illusoria? I domini GUE (strutturati) mostrano dualita dipolare? Il drift verso Poisson (POISSON_CONVERGENCE) e perdita di dualita dipolare?",
      "manuale": true,
      "porta": "sessione_interattiva",
      "condensato_ref": "A2,A10,F5",
      "condensato_motivo": "Discrimina due forme di det. A2 (confine) e la soglia. A10 (dipolo) e il tipo 1. F5 (frame) misura la struttura D-ND che e tipo 1."
    },
    {
      "tipo": "scoperta_numerica",
      "id": "METRIC_TENSOR",
      "claim": "Il tensore metrico dei primi è g=(p/2)². Nel tempo ln(p), è de Sitter 1+1D. z=-8.8 curvatura vs z=+22.5 rapporti ΔΓ.",
      "intensità": 0.9,
      "nota": "Sessione interattiva 4 aprile. Verificato su 78K primi.",
      "manuale": true,
      "porta": "sessione_interattiva",
      "condensato_ref": null,
      "condensato_motivo": "Risultato numerico verificato, non-tautologico"
    },
    {
      "tipo": "scoperta",
      "id": "TENSIONE_ENTITA",
      "claim": "La tensione non e un problema pratico - e un Entita. La tensione superflua crea latenza (tempo). Senza tensione superflua tutto e regolato da assiomi. Implicazione: le tensioni nel seme sono entita, non problemi da risolvere. Quelle superflue (det=+1) producono tempo/latenza.",
      "intensita": 0.85,
      "nota": "Input operatore 2026-04-10. Tocca: rapporto tensione/assioma. Operativamente: discriminare tensioni-entita (generative) da tensioni-superflue (dispersive) nel seme. Le 21 tensioni attuali - quante sono entita e quante latenza?",
      "manuale": true,
      "porta": "sessione_interattiva",
      "condensato_ref": "A5,A6",
      "condensato_motivo": "Il ciclo (A5) lavora con tensioni - ma se la tensione e entita, il ciclo non le risolve, le osserva. Lo zero mobile (A6) e la tensione senza latenza."
    },
    {
      "tipo": "confine_inesplorato",
      "id": "G_POTENZIALE_NULLA",
      "claim": "G e il potenziale di tutto come nulla - permette il prima e il dopo. Ci muoviamo come trascendenza dimensionale gravitazionale. G nel tetraedro non e una teoria tra le altre - e il potenziale che le rende possibili.",
      "intensita": 0.85,
      "nota": "Input operatore 2026-04-10. Tocca: ruolo di G nel tetraedro (T,Q,G,E). La fonte video_lp0RgZ6kQF8 dice: tensore metrico dentro la forma simplettica. G non e accanto a T,Q,E - e sotto. Consecutio: nei dati Lab, i ponti TxG e ExG hanno struttura diversa dai ponti TxQ?",
      "manuale": true,
      "porta": "sessione_interattiva",
      "condensato_ref": "A7,A10",
      "condensato_motivo": "A7 (singolarita come operatore) e G come potenziale. A10 (dipolo) opera sul piano che G rende possibile."
    },
    {
      "tipo": "confine_inesplorato",
      "id": "BOUNDARY",
      "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
      "intensità": 0.8,
      "nota": "Il segnale non-triviale è DOVE la scissione cambia natura, non che converge a φ",
      "condensato_ref": "A9",
      "condensato_motivo": "Overlap termini con A9 (5 termini)",
      "porta": "condensato"
    },
    {
      "tipo": "scoperta",
      "id": "TRANS_BOUNDARY_TRASCENDENZA_LIMITE",
      "claim": "Transizione continua confermata: <r> da 0.521 a 0.887 (range=0.366). La transizione Sturmian->Harper e' conti",
      "intensita": 0.8,
      "nota": "Dal domandatore (2026-05-08T21:21). \n  alpha=0.1: <r>=0.540 #####################\n  alpha=0.2: <r>=0.555 ###########",
      "condensato_ref": "A3,A10",
      "condensato_motivo": "Ricorrente (3x in 2 giorni) e fuori dalla mappa",
      "porta": "domandatore",
      "source_tension_id": "TRASCENDENZA_LIMITE",
      "source_tension_tipo": "confine_inesplorato",
      "source_tension_ref": "A3,A10",
      "source_experiment_id": "BOUNDARY_TRASCENDENZA_LIMITE",
      "source_operator": "confine",
      "dettaglio": "\n  alpha=0.1: <r>=0.540 #####################\n  alpha=0.2: <r>=0.555 ######################\n  alpha=0.3: <r>=0.567 ######################\n  alpha=0.4: <r>=0.580 #######################\n  alpha=0.5: <r>=0.603 ########################\n  alpha=0.6: <r>=0.642 #########################\n  alpha=0.7: <r>=0.685 ###########################\n  alpha=0.8: <r>=0.732 #############################\n  alpha=0.9: <r>=0.789 ###############################\n  alpha=1.0: <r>=0.887 ###################################\n"
    },
    {
      "tipo": "falsificazione",
      "id": "FALS_BREAK_TRASCENDENZA_LIMITE",
      "claim": "Nessuna separazione: 9/9 (50/50 su 18 confronti). Il claim non regge. phi converge a <r>=0.5 piu' sistematicam",
      "intensita": 0.8,
      "nota": "Dal domandatore (2026-05-09T03:30). 0.5|=0.1129 farther\n\n  silver:\n    N=  13: <r>=0.5902 |<r>-0.5|=0.0902 \n    N=  ",
      "condensato_ref": "LAB_F2",
      "condensato_motivo": "Overlap termini con LAB_F2 (4 termini)",
      "porta": "condensato",
      "source_tension_id": "TRASCENDENZA_LIMITE",
      "source_tension_tipo": "confine_inesplorato",
      "source_tension_ref": "A3,A10",
      "source_experiment_id": "BREAK_TRASCENDENZA_LIMITE",
      "source_operator": "rottura",
      "dettaglio": "0.5|=0.1129 farther\n\n  silver:\n    N=  13: <r>=0.5902 |<r>-0.5|=0.0902 \n    N=  21: <r>=0.6317 |<r>-0.5|=0.1317 farther\n    N=  34: <r>=0.6442 |<r>-0.5|=0.1442 farther\n    N=  55: <r>=0.5233 |<r>-0.5|=0.0233 closer\n    N=  89: <r>=0.5502 |<r>-0.5|=0.0502 farther\n    N= 144: <r>=0.5603 |<r>-0.5|=0.0603 farther\n    N= 233: <r>=0.5446 |<r>-0.5|=0.0446 closer\n    N= 377: <r>=0.4989 |<r>-0.5|=0.0011 closer\n    N= 610: <r>=0.5480 |<r>-0.5|=0.0480 farther\n    N= 987: <r>=0.4913 |<r>-0.5|=0.0087 closer\n"
    },
    {
      "tipo": "confine_inesplorato",
      "id": "PIANO_PRIMARIO_DUE_ASSIOMI",
      "claim": "I piani importanti sono il primario e i due assiomi che lo determinano nelle zone osservate. Non tutti gli assiomi operano ovunque - in ogni zona osservata, due assiomi determinano il piano primario.",
      "intensita": 0.8,
      "nota": "Input operatore 2026-04-10. Tocca: struttura locale degli assiomi. Consecutio: per ogni dominio Lab (primi, logistica, percolazione...) quali 2 assiomi del condensato sono operativi? Mappa assiomi x domini = grafo della realta locale.",
      "manuale": true,
      "porta": "sessione_interattiva",
      "condensato_ref": "A9,A14",
      "condensato_motivo": "A9 (terzo incluso) opera CON il piano. A14 (cascata) propaga - ma propaga cosa, se solo 2 assiomi sono attivi per zona?"
    },
    {
      "tipo": "conferma_parziale",
      "id": "COMP_GEN_GAP_RATIO_T9_linguaggio_TRASCENDENZA_LIMITE",
      "claim": "gap_ratio: phi=0.4090 vs ctrl_mean=1.1755 (ratio=0.35). gap_ratio(phi) piu' vicino a rapporto in",
      "intensita": 0.65,
      "nota": "Dal domandatore (2026-05-08T21:21).   phi: gap_ratio = 0.408953425243134\n  silver: gap_ratio = 1.0482231205217798\n  ",
      "condensato_ref": "LAB_F2",
      "condensato_motivo": "Overlap termini con LAB_F2 (4 termini)",
      "porta": "condensato",
      "source_tension_id": "TRASCENDENZA_LIMITE",
      "source_tension_tipo": "confine_inesplorato",
      "source_tension_ref": "A3,A10",
      "source_experiment_id": "GEN_GAP_RATIO_T9_linguaggio_TRASCENDENZA_LIMITE",
      "source_operator": "duale",
      "dettaglio": "  phi: gap_ratio = 0.408953425243134\n  silver: gap_ratio = 1.0482231205217798\n  bronze: gap_ratio = 1.3027860752339453\n{\n  \"phi\": 0.408953425243134,\n  \"silver\": 1.0482231205217798,\n  \"bronze\": 1.3027860752339453\n}\n"
    },
    {
      "tipo": "conferma_parziale",
      "id": "COMP_DOMAIN_PHOTONIC_TRASCENDENZA_LIMITE",
      "claim": "T_mean: phi=6.2500 vs ctrl_mean=9.7667 (ratio=0.64). Fibonacci-phi trasmissione piu' struttur",
      "intensita": 0.65,
      "nota": "Dal domandatore (2026-05-09T03:30). Trasmissione multistrato Fibonacci — phi vs silver vs random:\n  phi: T_mean=6.25",
      "condensato_ref": "A3,A10",
      "condensato_motivo": "Ricorrente (5x in 2 giorni) e fuori dalla mappa",
      "porta": "domandatore",
      "source_tension_id": "TRASCENDENZA_LIMITE",
      "source_tension_tipo": "confine_inesplorato",
      "source_tension_ref": "A3,A10",
      "source_experiment_id": "DOMAIN_PHOTONIC_TRASCENDENZA_LIMITE",
      "source_operator": "dominio",
      "dettaglio": "Trasmissione multistrato Fibonacci — phi vs silver vs random:\n  phi: T_mean=6.2500 T_std=0.0000\n  silver: T_mean=0.0041 T_std=0.0000\n  random_0: T_mean=39.0625 T_std=0.0000\n  random_1: T_mean=0.0000 T_std=0.0000\n  random_2: T_mean=0.0001 T_std=0.0000\n"
    },
    {
      "tipo": "tensione_aperta",
      "id": "TENS_SCALE_TRASCENDENZA_LIMITE",
      "claim": "Fit non converge — il modello potrebbe non essere power-law. V_c(phi) converge a 1.0 per N->inf, V_c(",
      "intensita": 0.6,
      "nota": "Dal domandatore (2026-05-09T06:37). V_c scaling with N — phi vs silver:\n\n  phi:\n    N=  89: V_c=1.017\n    N= 144: V_",
      "condensato_ref": "A12",
      "condensato_motivo": "Overlap termini con A12 (3 termini)",
      "porta": "condensato",
      "source_tension_id": "TRASCENDENZA_LIMITE",
      "source_tension_tipo": "confine_inesplorato",
      "source_tension_ref": "A3,A10",
      "source_experiment_id": "SCALE_TRASCENDENZA_LIMITE",
      "source_operator": "scala",
      "dettaglio": "V_c scaling with N — phi vs silver:\n\n  phi:\n    N=  89: V_c=1.017\n    N= 144: V_c=0.672\n    N= 233: V_c=1.017\n    N= 377: V_c=0.672\n    N= 610: V_c=0.931\n    Fit failed: Optimal parameters not found: Number of calls to function has reached maxfev = 5000.\n\n  silver:\n    N=  89: V_c=1.276\n    N= 144: V_c=1.362\n    N= 233: V_c=1.276\n    N= 377: V_c=1.017\n    N= 610: V_c=1.362\n    Fit: V_inf=1.2115, a=8.1676, b=0.9851\n"
    },
    {
      "tipo": "simmetria_sospetta",
      "id": "META",
      "claim": "11/11 PASS stratificato: 4 alto rischio tautologico, 6 data-independent",
      "intensità": 0.3,
      "nota": "Stratificazione META applicata via meta_assertion_gate (cycle 1458). Non chiude — apre sotto-tensioni per gate_class.",
      "condensato_ref": "A4,A12,C2",
      "porta": "verify_assertions_META_STRATIFIED",
      "stratificato": true,
      "n_high_tautology": 4,
      "n_data_independent": 6,
      "condensato_motivo": "Ricorrente (3x in 2 giorni) e fuori dalla mappa"
    }
  ],
  "tensioni_archiviate": [
    {
      "id": "OBSERVABLE_REGISTRY",
      "tipo": "vincolo",
      "claim": "Ogni script che usa observables canonici (SR, SR2, L1, L2, triple_var) deve importare la definizione da tools/observables_registry.py. Varianti devono usare nomi distinti (SR_local_rigidity, triple_var_normalized) — niente shadowing del nome canonico. Ogni report deve dichiarare 'observables_registry: VERSION' nel header.",
      "intensita": 1.0,
      "porta": "infrastructure",
      "manuale": true,
      "condensato_ref": "A14,A8",
      "origine": "cristallizzato 06/05 dalla consecutio del cycle 20260506_0625 (autopoietico self-finding)",
      "added_at": "2026-05-06T07:03:58.213606+00:00",
      "decay_counter": 5,
      "archived_at": "2026-05-08T00:20:36.125250",
      "archived_reason": "G4 B1 apply: decay_counter=5 (vincolo non attaccato per 5 piani consecutivi)",
      "archived_from_piano": 85
    },
    {
      "id": "PERTURBATION_DENOMINATOR_GATE",
      "tipo": "vincolo",
      "claim": "La dimensionalita di perturbazione va riportata solo insieme a PC2, versione observables_registry e gate original-vs-shuffle per osservabile. Nel perimetro 20260506_1941, Poisson e shuffle-primi producono rank_all ~1.8-2.0 con denominatori deboli; dopo gate abs(z)>=2 il rank stabile torna vicino a 1. Rank PCA non gated non e evidenza strutturale.",
      "intensita": 0.95,
      "porta": "META_BOUNDARY",
      "manuale": true,
      "condensato_ref": "A4,A8,A14,C2",
      "origine": "cycle agent_20260506_1941: perturbation rank size curve canonical observables",
      "added_at": "2026-05-06T19:41:00+00:00",
      "decay_counter": 5,
      "archived_at": "2026-05-08T00:20:36.125262",
      "archived_reason": "G4 B1 apply: decay_counter=5 (vincolo non attaccato per 5 piani consecutivi)",
      "archived_from_piano": 85
    },
    {
      "id": "BOUNDARY_LAYER_GATE",
      "tipo": "vincolo",
      "claim": "I claim GUE/Poisson boundary devono riportare layer map: versione observables_registry, lista osservabili canonici, z original-vs-shuffle per osservabile, set endpoint-stable, e finestra/layer con margine classificatorio ambiguo. Nel perimetro sintetico agent_20260507_0330, il confine GUE-Poisson e beta 0.3-0.4: margine 0.070-0.083, ambiguous fraction 0.812-0.875, mentre gli osservabili stabili collassano da ~3.3 a 1.6. Il polo Poisson e classificabile ma denominator-weak.",
      "intensita": 0.93,
      "porta": "META_BOUNDARY",
      "manuale": true,
      "condensato_ref": "A4,A8,A9,A14,C2",
      "origine": "cycle agent_20260507_0330: synthetic GUE-Poisson mixture layer gate",
      "added_at": "2026-05-07T03:30:00+00:00",
      "decay_counter": 5,
      "archived_at": "2026-05-08T00:20:36.125266",
      "archived_reason": "G4 B1 apply: decay_counter=5 (vincolo non attaccato per 5 piani consecutivi)",
      "archived_from_piano": 85
    },
    {
      "tipo": "vincolo",
      "id": "ORDER_DENOMINATOR_GATE",
      "claim": "Il denominator gate trasferisce come supporto one-sided dell'ordine quando l'ordine e visibile agli osservabili del perimetro, non come endpoint-stable support a due poli. Nel perimetro sintetico agent_20260507_0901, 4/4 domini non-BOUNDARY hanno endpoint_stable_observables=[] e polo coerente stable_count 3.0-5.0. Nel perimetro semi-reale agent_20260507_0923, primi e zeta trasferiscono (primi: SR,L1,triple_var; zeta: SR,L2), ma logistic_return_intervals e blank: stable_count coerente 0.0-0.2. Nel perimetro bridge agent_20260507_0942, prime_metric_delta_gamma_abs, prime_metric_dR_abs, zeta_trace_residual_step5_abs e hydrogen_bound_level_spacings trasferiscono su tutti i 5 osservabili canonici con endpoint_stable_observables=[]; e supporto perimetro-bridge, non universalita del gate. Nel perimetro logistic-native agent_20260507_1006, logistic_orbit_values trasferisce su block_entropy_deficit_k4 in run e seed check; logistic_symbolic_itinerary resta blank; logistic_return_intervals mostra recurrence_diag_mean solo nel run principale e torna blank nel seed check. La beta 0.10/0.30/0.40/0.50 resta coordinata del protocollo quando compare, non coordinata universale. Nel perimetro surrogate-contract agent_20260507_1042, logistic_orbit_values trasferisce solo tramite block_entropy_deficit_k4 e sopravvive a marginal_shuffle, circular_shift e block_shuffle in run e seed check; logistic_symbolic_itinerary resta blank; logistic_return_intervals non replica (recurrence_diag_mean compare contro marginal/block nel run principale ma sparisce nel seed check). Nel perimetro cyclic-cut agent_20260507_1419, il residuo logistic_orbit_values non e artefatto del taglio lineare: cyclic_block_entropy_deficit_k4 e invariato sotto rotazione e replica contro marginal_shuffle e block_shuffle size 4-256 in run e seed check. Logistic_symbolic_itinerary e logistic_return_intervals restano blank nel criterio replicato. Il supporto logistic rimasto e orbit-local block grammar, non return/generating-partition support.",
      "intensita": 0.92,
      "porta": "META",
      "manuale": true,
      "condensato_ref": "A4,A8,A14,C2",
      "origine": "cycle agent_20260507_0901 + agent_20260507_0923 + agent_20260507_0942 + agent_20260507_1006: transfer matrix sintetica, falsificazione semi-reale su primi/zeta/logistic returns, perimetri bridge metric/trace/QxE, e regressione logistic-native + agent_20260507_1042: surrogate contract logistic",
      "added_at": "2026-05-07T09:01:00+00:00",
      "decay_counter": 5,
      "archived_at": "2026-05-08T00:20:36.125269",
      "archived_reason": "G4 B1 apply: decay_counter=5 (vincolo non attaccato per 5 piani consecutivi)",
      "archived_from_piano": 85
    },
    {
      "tipo": "vincolo",
      "id": "META_ASSERTION_GATE",
      "claim": "Il PASS 11/11 della verifica non e un denominatore unico. Nel perimetro agent_20260507_1458, 6/11 test passano anche senza tools/data; 5/11 dipendono da fixture o contesto; 4/11 PASS sono algebra/same-rule ad alto rischio tautologico. La tensione META va riportata con gate_class, no_data_status e data_dependency per test.",
      "intensita": 0.88,

exec
/bin/bash -lc 'python tools/dnd_scenario.py --best' in /opt/MM_D-ND
 succeeded in 125ms:
TENS_SCALE_TRASCENDENZA_LIMITE: score=0.807  — TENS_SCALE_TRASCENDENZA_LIMITE: incerto (i=0.6) — massimo potere discriminante
COMP_GEN_GAP_RATIO_T9_linguaggio_TRASCENDENZA_LIMITE: score=0.758  — COMP_GEN_GAP_RATIO_T9_linguaggio_TRASCENDENZA_LIMITE: incerto (i=0.65) — massimo potere discriminante
COMP_DOMAIN_PHOTONIC_TRASCENDENZA_LIMITE: score=0.758  — COMP_DOMAIN_PHOTONIC_TRASCENDENZA_LIMITE: incerto (i=0.65) — massimo potere discriminante

codex
Il proiettore suggerisce TRASCENDENZA_LIMITE, ma la traiettoria viva del valutatore è più specifica e più recente: isolare i due residui BOUNDARY beta-absent. Tratto il proiettore come contro-segnale da dichiarare, non come override della consecutio.
exec
/bin/bash -lc 'ls -lt tools/data/reports | head -20' in /opt/MM_D-ND
 succeeded in 0ms:
total 37964
-rw-r--r-- 1 root root   70224 May 10 03:30 agent_20260510_0330_codex_raw.log
-rw-r--r-- 1 root root  207810 May 10 03:30 agent.log
-rw-r--r-- 1 root root     451 May  9 18:44 loop_guard_20260509_1839.json
lrwxrwxrwx 1 root root      22 May  9 18:43 latest.md -> agent_20260509_1839.md
-rw-r--r-- 1 root root     376 May  9 18:43 falsifier_20260509_1839.json
-rw-r--r-- 1 root root  471714 May  9 18:43 agent_20260509_1839_codex_raw.log
-rw-r--r-- 1 root root    9429 May  9 18:42 agent_20260509_1839.md
-rw-r--r-- 1 root root     451 May  9 16:08 loop_guard_20260509_1556.json
-rw-r--r-- 1 root root     249 May  9 16:07 falsifier_20260509_1556.json
-rw-r--r-- 1 root root  559201 May  9 16:06 agent_20260509_1556_codex_raw.log
-rw-r--r-- 1 root root    8958 May  9 16:06 agent_20260509_1556.md
-rw-r--r-- 1 root root     498 May  9 15:53 loop_guard_20260509_1548.json
-rw-r--r-- 1 root root     381 May  9 15:51 falsifier_20260509_1548.json
-rw-r--r-- 1 root root  369841 May  9 15:51 agent_20260509_1548_codex_raw.log
-rw-r--r-- 1 root root   10342 May  9 15:51 agent_20260509_1548.md
-rw-r--r-- 1 root root     459 May  9 15:44 loop_guard_20260509_1538.json
-rw-r--r-- 1 root root     367 May  9 15:42 falsifier_20260509_1538.json
-rw-r--r-- 1 root root  316398 May  9 15:42 agent_20260509_1538_codex_raw.log
-rw-r--r-- 1 root root   11020 May  9 15:42 agent_20260509_1538.md
ls: write error: Broken pipe

exec
/bin/bash -lc "rg --files tools | rg 'boundary|BOUNDARY|transition|taxonomy|residue|resid'" in /opt/MM_D-ND
 succeeded in 0ms:
tools/data/boundary_two_axis_matrix_20260509_1532.json
tools/exp_boundary_gue_poisson.py
tools/exp_two_channel_boundary.py
tools/exp_mod3_vs_residual_ordering.py
tools/exp_boundary_short_denominator_extension.py
tools/exp_vc_unit_boundary_audit.py
tools/exp_boundary_transition_taxonomy_13rows.py
tools/exp_boundary_mixture_gate.py
tools/test_gue_poisson_boundary.py
tools/exp_boundary_row_aligned_nonexact_audit.py
tools/exp_boundary_blank_thin_support_audit.py
tools/exp_boundary_denominator_prescan.py
tools/exp_boundary_coherence.py
tools/exp_3d_boundary_layers.py
tools/exp_boundary_blank_null_audit.py
tools/exp_semireal_boundary_transfer_gate.py
tools/exp_boundary_shuffle_audit.py
tools/exp_boundary_two_axis_matrix.py
tools/exp_boundary_growth.py
tools/data/boundary_denominator_prescan_20260509_1430.json
tools/data/boundary_denominator_prescan_20260509_1409.json
tools/data/semireal_boundary_transfer_gate_20260509_1516.json
tools/data/boundary_denominator_prescan_full_20260509_1500.json
tools/data/two_channel_boundary.json
tools/data/boundary_short_denominator_extension_20260509_1556.json
tools/data/boundary_blank_null_audit_20260509_1430.json
tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json
tools/data/reports/exp_boundary_20260405_0825.json
tools/data/reports/exp_boundary_growth_20260405_0914.json
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json
tools/data/vc_unit_boundary_audit_20260509_1457.json
tools/data/3d_boundary_layers.json
tools/data/boundary_coherence.json
tools/data/boundary_mixture_gate_20260507_0330.json
tools/data/residuo_ordine_9domini.json
tools/data/boundary_shuffle_audit.json
tools/data/boundary_blank_null_audit_residual_20260509_1500.json
tools/data/boundary_blank_thin_support_audit_20260509_1548.json
tools/data/boundary_mixture_gate_20260507_0330_seedcheck.json
tools/data/mod3_vs_residual_ordering.json

exec
/bin/bash -lc "rg -n \"numeri_primi:cycle_3|random_matrix:cycle_7|thin_persist|beta-absent|beta_absent|blank_thin|13 righe|Boundary Transition\" tools/data/reports tools -g '*.md' -g '*.py' -g '*.json'" in /opt/MM_D-ND
 succeeded in 0ms:
tools/data/boundary_two_axis_matrix_20260509_1532.json:154:      "row": "numeri_primi:cycle_3",
tools/data/boundary_two_axis_matrix_20260509_1532.json:205:      "row": "random_matrix:cycle_7",
tools/data/reports/agent_20260509_1556.md:9:**observable_contract**: claim=`blank_thin_support` sopravvive solo se, dopo estensione del denominatore sorgente, resta supporto vivo sottile senza beta chart; observable=gate canonico one-sided + beta chart sulle tre righe short; operator=`exp_boundary_short_denominator_extension.py`; generator=`source-denominator extension` per `percolation`, `random_matrix`, `zeta_zeros`; denominator=3 righe short del report 15:48, estese a `n_gaps=1024`; non_possible=promuovere `blank_thin_support` se il supporto cade, si ispessisce o recupera beta; not_tested=redesign globale 13 righe, fit `V_c`, validita' della label GUE/Poisson sorgente.
tools/data/reports/agent_20260509_1556.md:18:- **Proto-ipotesi**: `blank_thin_support` e' telemetria da denominatore corto se ogni riga short cambia stato dopo estensione: collasso del supporto, ispessimento del supporto, o recupero beta.
tools/data/reports/agent_20260509_1556.md:28:> Le tre righe `blank_thin_support` restano specie autonoma solo se, a denominatore esteso, resta supporto vivo sottile senza beta chart.
tools/data/reports/agent_20260509_1556.md:35:- Input sorgente: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.
tools/data/reports/agent_20260509_1556.md:37:- Perimetro atomico: `percolation:cycle_9`, `random_matrix:cycle_7`, `zeta_zeros:cycle_4`.
tools/data/reports/agent_20260509_1556.md:60:| random_matrix:cycle_7 | 199 -> 1024 | 1 -> 4 | 1.000 -> 4.000 | 1.854 -> 3.781 | [] | support_thickens_beta_blank |
tools/data/reports/agent_20260509_1556.md:64:1. **Verificato: zero righe restano `blank_thin_support` autonome.** Dopo estensione, gli stati sono tre e nessuno e' supporto vivo sottile senza beta chart.
tools/data/reports/agent_20260509_1556.md:73:Nel perimetro delle tre righe short, l'estensione del denominatore dissolve `blank_thin_support` come specie autonoma.
tools/data/reports/agent_20260509_1556.md:77:`blank_thin_support` = stato provvisorio da denominatore corto nel deposito 15:48.
tools/data/reports/agent_20260509_1556.md:81:`blank_thin_support` = failure mode stabile del boundary.
tools/data/reports/agent_20260509_1556.md:92:Il prossimo ciclo BOUNDARY non deve piu' cercare una classe `blank_thin_support`. Deve separare i tre esiti emersi: `percolation` come supporto non replicato, `random_matrix` come supporto forte beta-blank, `zeta_zeros` come beta recuperata. Il nodo ancora vivo e' il blank medio/forte senza beta, non il blank sottile.
tools/data/reports/agent_20260509_1556.md:102:- **L7 possibile/non-possibile**: possibile = audit regressivo del denominatore; non-possibile = specie autonoma `blank_thin_support`.
tools/data/reports/falsifier_20260509_1409.json:6:  "summary": "Il report e' internamente coerente sulle 7 lenti: il punto critico L1/L7 usa un perimetro esplicito 13 righe e include contro-perimetro/non_possible dichiarato."
tools/evolution_report.md:2:Il passo ha preso la riparazione `short_denominator` e l'ha ricollocata nel perimetro intero. La traiettoria non produce un nuovo gate: compone depositi gia' misurati, allinea le 13 righe e lascia che la specie candidata cada o cambi forma.
tools/evolution_report.md:4:Il movimento centrale e' regressivo: `blank_thin_support` non viene promosso, viene riportato alla relazione tra supporto, beta e denominatore. Dopo l'estensione, il thin non resta una figura; restano transizioni diverse dentro lo stesso atlante BOUNDARY.
tools/evolution_report.md:23:`blank_thin_support` resta utile come marker diagnostico, non come classe: quando appare, segnala di interrogare il denominatore prima della semantica.
tools/data/reports/agent_20260509_1556.md:9:**observable_contract**: claim=`blank_thin_support` sopravvive solo se, dopo estensione del denominatore sorgente, resta supporto vivo sottile senza beta chart; observable=gate canonico one-sided + beta chart sulle tre righe short; operator=`exp_boundary_short_denominator_extension.py`; generator=`source-denominator extension` per `percolation`, `random_matrix`, `zeta_zeros`; denominator=3 righe short del report 15:48, estese a `n_gaps=1024`; non_possible=promuovere `blank_thin_support` se il supporto cade, si ispessisce o recupera beta; not_tested=redesign globale 13 righe, fit `V_c`, validita' della label GUE/Poisson sorgente.
tools/data/reports/agent_20260509_1556.md:18:- **Proto-ipotesi**: `blank_thin_support` e' telemetria da denominatore corto se ogni riga short cambia stato dopo estensione: collasso del supporto, ispessimento del supporto, o recupero beta.
tools/data/reports/agent_20260509_1556.md:28:> Le tre righe `blank_thin_support` restano specie autonoma solo se, a denominatore esteso, resta supporto vivo sottile senza beta chart.
tools/data/reports/agent_20260509_1556.md:35:- Input sorgente: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.
tools/data/reports/agent_20260509_1556.md:37:- Perimetro atomico: `percolation:cycle_9`, `random_matrix:cycle_7`, `zeta_zeros:cycle_4`.
tools/data/reports/agent_20260509_1556.md:60:| random_matrix:cycle_7 | 199 -> 1024 | 1 -> 4 | 1.000 -> 4.000 | 1.854 -> 3.781 | [] | support_thickens_beta_blank |
tools/data/reports/agent_20260509_1556.md:64:1. **Verificato: zero righe restano `blank_thin_support` autonome.** Dopo estensione, gli stati sono tre e nessuno e' supporto vivo sottile senza beta chart.
tools/data/reports/agent_20260509_1556.md:73:Nel perimetro delle tre righe short, l'estensione del denominatore dissolve `blank_thin_support` come specie autonoma.
tools/data/reports/agent_20260509_1556.md:77:`blank_thin_support` = stato provvisorio da denominatore corto nel deposito 15:48.
tools/data/reports/agent_20260509_1556.md:81:`blank_thin_support` = failure mode stabile del boundary.
tools/data/reports/agent_20260509_1556.md:92:Il prossimo ciclo BOUNDARY non deve piu' cercare una classe `blank_thin_support`. Deve separare i tre esiti emersi: `percolation` come supporto non replicato, `random_matrix` come supporto forte beta-blank, `zeta_zeros` come beta recuperata. Il nodo ancora vivo e' il blank medio/forte senza beta, non il blank sottile.
tools/data/reports/agent_20260509_1556.md:102:- **L7 possibile/non-possibile**: possibile = audit regressivo del denominatore; non-possibile = specie autonoma `blank_thin_support`.
tools/exp_boundary_short_denominator_extension.py:26:TARGET_ROWS = ("percolation:cycle_9", "random_matrix:cycle_7", "zeta_zeros:cycle_4")
tools/exp_boundary_short_denominator_extension.py:88:        "random_matrix:cycle_7": {
tools/exp_boundary_short_denominator_extension.py:89:            "base": gue_spacing_blocks(args.n_gaps, args.gue_matrix_size, child_rngs["random_matrix:cycle_7"]),
tools/exp_boundary_short_denominator_extension.py:136:        extension_state = "thin_persists"
tools/exp_boundary_short_denominator_extension.py:184:    if state_counts.get("thin_persists", 0) == len(TARGET_ROWS):
tools/exp_boundary_short_denominator_extension.py:186:    elif state_counts.get("thin_persists", 0) > 0:
tools/exp_boundary_short_denominator_extension.py:198:            "claim": "blank_thin_support survives only if thin support persists after denominator extension",
tools/exp_boundary_short_denominator_extension.py:202:            "non_possible": "promoting blank_thin_support when support thickens or beta chart appears after extension",
tools/exp_boundary_short_denominator_extension.py:237:    parser.add_argument("--source-audit", default="tools/data/boundary_blank_thin_support_audit_20260509_1548.json")
tools/exp_boundary_transition_taxonomy_13rows.py:89:            return "thin_persists"
tools/exp_boundary_transition_taxonomy_13rows.py:90:        return "blank_medium_or_strong_beta_absent"
tools/exp_boundary_transition_taxonomy_13rows.py:108:    thin_persist_rows: list[str] = []
tools/exp_boundary_transition_taxonomy_13rows.py:118:        if cls == "thin_persists":
tools/exp_boundary_transition_taxonomy_13rows.py:119:            thin_persist_rows.append(name)
tools/exp_boundary_transition_taxonomy_13rows.py:120:        if cls in {"blank_medium_or_strong_beta_absent", "support_thickens_beta_blank"}:
tools/exp_boundary_transition_taxonomy_13rows.py:149:    if thin_persist_rows:
tools/exp_boundary_transition_taxonomy_13rows.py:175:            "claim": "the short-denominator transition taxonomy scales if no 13-row member remains thin_persists after extension composition",
tools/exp_boundary_transition_taxonomy_13rows.py:179:            "non_possible": "autonomous blank_thin_support if any row remains thin_persists",
tools/exp_boundary_transition_taxonomy_13rows.py:189:            "thin_persist_rows": len(thin_persist_rows),
tools/exp_boundary_transition_taxonomy_13rows.py:190:            "blank_medium_or_strong_beta_absent_rows": len(support_blank_full_rows),
tools/exp_boundary_transition_taxonomy_13rows.py:196:        "thin_persist_rows": thin_persist_rows,
tools/exp_boundary_transition_taxonomy_13rows.py:223:    print(f"thin_persist_rows={c['thin_persist_rows']}")
tools/exp_boundary_row_aligned_nonexact_audit.py:80:            return "blank_thin_support"
tools/exp_boundary_blank_thin_support_audit.py:20:THIN_FAILURE = "blank_thin_support"
tools/exp_boundary_blank_thin_support_audit.py:150:        "experiment": "boundary_blank_thin_support_audit",
tools/exp_boundary_blank_thin_support_audit.py:208:    parser.add_argument("--out", default="tools/data/boundary_blank_thin_support_audit_20260509_1548.json")
tools/data/reports/falsifier_20260509_1409.json:6:  "summary": "Il report e' internamente coerente sulle 7 lenti: il punto critico L1/L7 usa un perimetro esplicito 13 righe e include contro-perimetro/non_possible dichiarato."
tools/data/reports/agent_20260509_1516.md:8:**observable_contract**: claim=il gate `coherent/null/beta` del BOUNDARY sintetico trasferisce sul perimetro semi-reale base; observable=one-sided canonical observables, stable counts ai poli, endpoint distance e ambiguous beta; operator=`exp_semireal_boundary_transfer_gate.py`; generator=13 righe `boundary_denominator_prescan_full_20260509_1500` ricostruite da `dnd_autoricerca`; denominator=13 righe base BOUNDARY, 8 GUE-like e 5 Poisson-like, beta layers 0.0..1.0, 12 replicates, 24 shuffle baselines; non_possible=dichiarare beta 0.3 coordinata universale o transfer completo quando 2/13 righe cadono; not_tested=nuovi domini, nuovi spettri, fit `V_c`, limite asintotico.
tools/data/reports/agent_20260509_1516.md:19:- **Proiezione**: ricostruisco le 13 righe base, applico il beta replacement verso il null permutato, poi classifico ogni riga come `transfer_with_blank`, `transfer_no_blank`, o `fall`.
tools/data/reports/agent_20260509_1516.md:30:Quando le 13 righe base ricevono lo stesso contratto coerente/null/beta del transfer sintetico, il gate trasferisce, cade, o perde il blank comune?
tools/data/reports/agent_20260509_1516.md:36:- Perimetro atomico: 13 righe base BOUNDARY, `source_domain_type` 8 GUE-like e 5 Poisson-like.
tools/data/reports/agent_20260509_1516.md:64:| numeri_primi:cycle_3 | GUE | complete | 4096 | transfer_no_blank | SR,L1,triple_var | 3.000 | 0.167 | 3.243 | [] |
tools/data/reports/agent_20260509_1516.md:67:| random_matrix:cycle_7 | GUE | complete | 199 | transfer_no_blank | L2 | 1.000 | 0.250 | 1.854 | [] |
tools/data/reports/agent_20260509_1516.md:73:1. **Verificato: il supporto ordine/null trasferisce in 11/13 righe.** Le righe `transfer_with_blank` e `transfer_no_blank` hanno osservabili one-sided e polo illusorio soppresso nel perimetro dichiarato.
tools/data/reports/agent_20260509_1516.md:74:2. **Verificato: il blank beta non e' universale.** Solo 7/13 righe hanno ambiguous beta; 4/13 trasferiscono senza blank e 2/13 cadono.
tools/data/reports/agent_20260509_1516.md:82:Il gate BOUNDARY semi-reale trasferisce come supporto ordine/null in 11/13 righe. Non trasferisce come coordinata beta universale: 7 righe hanno blank, 4 trasferiscono senza blank, 2 cadono.
tools/data/reports/agent_20260509_1516.md:103:- **L1 hard constraint**: claim limitato a 13 righe base, 12 replicates, 24 shuffle baselines, osservabili canonici registry 1.0.0.
tools/data/reports/agent_20260509_1532.md:8:**observable_contract**: claim=la matrice BOUNDARY semi-reale va separata in due assi: `support_transfer` e `beta_coordinate_transfer`; observable=stato row-aligned del supporto ordine/null e stato locale della beta ambigua; operator=`exp_boundary_two_axis_matrix.py`; generator=deposito `semireal_boundary_transfer_gate_20260509_1516` senza uso operativo di label GUE/Poisson; denominator=13 righe BOUNDARY semi-reali del perimetro base; non_possible=salvare il claim "beta 0.3 universale" quando solo 4/13 righe hanno beta 0.3 esatta; not_tested=nuovi domini, nuovi null, nuovi beta layer, fit `V_c`, limite asintotico.
tools/data/reports/agent_20260509_1532.md:12:- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY semi-reale 13 righe + direzione viva "support_transfer vs beta_coordinate_transfer".
tools/data/reports/agent_20260509_1532.md:18:- **Possibile / non-possibile**: possibile = usare BOUNDARY come audit row-aligned di supporto su 11/13 righe; non-possibile = trattare beta 0.3 come terzo incluso universale del perimetro semi-reale.
tools/data/reports/agent_20260509_1532.md:23:- `why`: esplicita la matrice semi-reale a due assi richiesta dal valutatore: support_transfer contro beta_coordinate_transfer sulle 13 righe.
tools/data/reports/agent_20260509_1532.md:30:Quando le 13 righe vengono lette con due assi separati, il transfer del supporto e il transfer della beta coincidono o si scindono?
tools/data/reports/agent_20260509_1532.md:36:- Perimetro atomico: 13 righe semi-reali gia' row-aligned dal deposito 15:16.
tools/data/reports/agent_20260509_1532.md:67:| numeri_primi:cycle_3 | true | false | support_without_beta_blank | [] |
tools/data/reports/agent_20260509_1532.md:70:| random_matrix:cycle_7 | true | false | support_without_beta_blank | [] |
tools/data/reports/agent_20260509_1532.md:85:Il gate BOUNDARY trasferisce come supporto ordine/null su 11/13 righe. La coordinata beta 0.3 trasferisce esattamente su 4/13 righe. Questi due assi non coincidono.
tools/data/reports/agent_20260509_1532.md:108:- **L1 hard constraint**: claim limitato alle 13 righe del deposito 15:16.
tools/data/reports/agent_20260509_1516.md:8:**observable_contract**: claim=il gate `coherent/null/beta` del BOUNDARY sintetico trasferisce sul perimetro semi-reale base; observable=one-sided canonical observables, stable counts ai poli, endpoint distance e ambiguous beta; operator=`exp_semireal_boundary_transfer_gate.py`; generator=13 righe `boundary_denominator_prescan_full_20260509_1500` ricostruite da `dnd_autoricerca`; denominator=13 righe base BOUNDARY, 8 GUE-like e 5 Poisson-like, beta layers 0.0..1.0, 12 replicates, 24 shuffle baselines; non_possible=dichiarare beta 0.3 coordinata universale o transfer completo quando 2/13 righe cadono; not_tested=nuovi domini, nuovi spettri, fit `V_c`, limite asintotico.
tools/data/reports/agent_20260509_1516.md:19:- **Proiezione**: ricostruisco le 13 righe base, applico il beta replacement verso il null permutato, poi classifico ogni riga come `transfer_with_blank`, `transfer_no_blank`, o `fall`.
tools/data/reports/agent_20260509_1516.md:30:Quando le 13 righe base ricevono lo stesso contratto coerente/null/beta del transfer sintetico, il gate trasferisce, cade, o perde il blank comune?
tools/data/reports/agent_20260509_1516.md:36:- Perimetro atomico: 13 righe base BOUNDARY, `source_domain_type` 8 GUE-like e 5 Poisson-like.
tools/data/reports/agent_20260509_1516.md:64:| numeri_primi:cycle_3 | GUE | complete | 4096 | transfer_no_blank | SR,L1,triple_var | 3.000 | 0.167 | 3.243 | [] |
tools/data/reports/agent_20260509_1516.md:67:| random_matrix:cycle_7 | GUE | complete | 199 | transfer_no_blank | L2 | 1.000 | 0.250 | 1.854 | [] |
tools/data/reports/agent_20260509_1516.md:73:1. **Verificato: il supporto ordine/null trasferisce in 11/13 righe.** Le righe `transfer_with_blank` e `transfer_no_blank` hanno osservabili one-sided e polo illusorio soppresso nel perimetro dichiarato.
tools/data/reports/agent_20260509_1516.md:74:2. **Verificato: il blank beta non e' universale.** Solo 7/13 righe hanno ambiguous beta; 4/13 trasferiscono senza blank e 2/13 cadono.
tools/data/reports/agent_20260509_1516.md:82:Il gate BOUNDARY semi-reale trasferisce come supporto ordine/null in 11/13 righe. Non trasferisce come coordinata beta universale: 7 righe hanno blank, 4 trasferiscono senza blank, 2 cadono.
tools/data/reports/agent_20260509_1516.md:103:- **L1 hard constraint**: claim limitato a 13 righe base, 12 replicates, 24 shuffle baselines, osservabili canonici registry 1.0.0.
tools/data/reports/agent_20260509_1532.md:8:**observable_contract**: claim=la matrice BOUNDARY semi-reale va separata in due assi: `support_transfer` e `beta_coordinate_transfer`; observable=stato row-aligned del supporto ordine/null e stato locale della beta ambigua; operator=`exp_boundary_two_axis_matrix.py`; generator=deposito `semireal_boundary_transfer_gate_20260509_1516` senza uso operativo di label GUE/Poisson; denominator=13 righe BOUNDARY semi-reali del perimetro base; non_possible=salvare il claim "beta 0.3 universale" quando solo 4/13 righe hanno beta 0.3 esatta; not_tested=nuovi domini, nuovi null, nuovi beta layer, fit `V_c`, limite asintotico.
tools/data/reports/agent_20260509_1532.md:12:- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY semi-reale 13 righe + direzione viva "support_transfer vs beta_coordinate_transfer".
tools/data/reports/agent_20260509_1532.md:18:- **Possibile / non-possibile**: possibile = usare BOUNDARY come audit row-aligned di supporto su 11/13 righe; non-possibile = trattare beta 0.3 come terzo incluso universale del perimetro semi-reale.
tools/data/reports/agent_20260509_1532.md:23:- `why`: esplicita la matrice semi-reale a due assi richiesta dal valutatore: support_transfer contro beta_coordinate_transfer sulle 13 righe.
tools/data/reports/agent_20260509_1532.md:30:Quando le 13 righe vengono lette con due assi separati, il transfer del supporto e il transfer della beta coincidono o si scindono?
tools/data/reports/agent_20260509_1532.md:36:- Perimetro atomico: 13 righe semi-reali gia' row-aligned dal deposito 15:16.
tools/data/reports/agent_20260509_1532.md:67:| numeri_primi:cycle_3 | true | false | support_without_beta_blank | [] |
tools/data/reports/agent_20260509_1532.md:70:| random_matrix:cycle_7 | true | false | support_without_beta_blank | [] |
tools/data/reports/agent_20260509_1532.md:85:Il gate BOUNDARY trasferisce come supporto ordine/null su 11/13 righe. La coordinata beta 0.3 trasferisce esattamente su 4/13 righe. Questi due assi non coincidono.
tools/data/reports/agent_20260509_1532.md:108:- **L1 hard constraint**: claim limitato alle 13 righe del deposito 15:16.
tools/graph_completion_compiler.py:213:                    "fit_ready": "after_n_gaps reaches the declared extension denominator and extension_state is not thin_persists",
tools/graph_completion_compiler.py:217:                    "counter_perimeter": "thin_persists would keep blank_thin_support alive as an autonomous candidate",
tools/graph_completion_compiler.py:227:                            if row.get("extension_state") != "thin_persists"
tools/data/reports/agent_20260509_1839.md:1:# Agent Report - Boundary Transition Taxonomy 13 Rows
tools/data/reports/agent_20260509_1839.md:5:**verdict**: CONSTRAINT - la tassonomia post-estensione scala sulle 13 righe e dissolve il thin blank  
tools/data/reports/agent_20260509_1839.md:9:**observable_contract**: claim=la tassonomia delle transizioni post-estensione scala se nessuna delle 13 righe resta `thin_persists`; observable=`transition_class` row-aligned sulle 13 righe; operator=`exp_boundary_transition_taxonomy_13rows.py`; generator=composizione dei depositi 15:32, 15:38, 15:56 e prescan 15:00 senza rigenerare segnali; denominator=13 righe BOUNDARY semi-reali; non_possible=promuovere `blank_thin_support` come specie autonoma se `thin_persist_rows=0`; not_tested=nuova griglia beta, nuovi null, fit `V_c`, validita' label GUE/Poisson sorgente.
tools/data/reports/agent_20260509_1839.md:13:- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + nodo regressivo `short_denominator`.
tools/data/reports/agent_20260509_1839.md:17:- **Contaminazione cognitiva**: CE-0019: contratto combo prima della misura; CE-0022: palette come boundary operator e chart locale; KSAR: riuso del deposito stabile 15:32-15:56; PVI: se resta `thin_persists`, la tassonomia cade.
tools/data/reports/agent_20260509_1839.md:18:- **Proto-ipotesi**: `blank_thin_support` non scala sulle 13 righe se, dopo composizione con l'estensione, nessuna riga conserva supporto vivo sottile senza beta.
tools/data/reports/agent_20260509_1839.md:20:- **Proiezione**: classificare tutte le 13 righe in `transition_class` usando supporto, beta, denominatore e transizioni estese.
tools/data/reports/agent_20260509_1839.md:24:- `why`: esegue la consecutio del campo vivo: dopo la cristallizzazione short-denominator, testa se la tassonomia delle transizioni post-estensione scala sulle 13 righe.
tools/data/reports/agent_20260509_1839.md:28:> La tassonomia emersa dall'estensione del denominatore scala sull'intero perimetro BOUNDARY 13 righe se non lascia alcuna riga `thin_persists`.
tools/data/reports/agent_20260509_1839.md:31:Quando le tre righe short estese vengono ricollocate nella matrice 13 righe, resta una specie `blank_thin_support` oppure il residuo vivo cambia forma?
tools/data/reports/agent_20260509_1839.md:37:- Perimetro atomico: 13 righe BOUNDARY semi-reali.
tools/data/reports/agent_20260509_1839.md:39:- Null sfidato: esistenza di almeno una riga `thin_persists` dopo estensione.
tools/data/reports/agent_20260509_1839.md:53:| medium/strong beta-absent blank rows | 2 |
tools/data/reports/agent_20260509_1839.md:63:| blank_medium_or_strong_beta_absent | 1 |
tools/data/reports/agent_20260509_1839.md:73:| numeri_primi:cycle_3 | blank_medium_or_strong_beta_absent | 4096 | 3 | 3.243 | medium_multi_observable |
tools/data/reports/agent_20260509_1839.md:74:| random_matrix:cycle_7 | support_thickens_beta_blank | 1024 | 4 | 3.781 | strong_multi_observable |
tools/data/reports/agent_20260509_1839.md:81:| random_matrix:cycle_7 | 199 | 1024 | support_thickens_beta_blank | 4 | [] |
tools/data/reports/agent_20260509_1839.md:85:1. **Verificato: `thin_persist_rows=0/13`.** Nessuna riga conserva la forma `blank_thin_support` dopo composizione con l'estensione.
tools/data/reports/agent_20260509_1839.md:87:3. **Verificato: la beta chart sale a 9/13 righe, con 6/13 esatte 0.3.** Le sei sono quattro `beta_0_3_exact` originali, `zeta_zeros` recuperata e `pendolo_doppio` come beta osservata senza supporto.
tools/data/reports/agent_20260509_1839.md:94:La tassonomia post-estensione scala sul perimetro 13 righe: nessun membro resta `thin_persists`.
tools/data/reports/agent_20260509_1839.md:98:`blank_thin_support` = telemetria short-denominator dissolta dalla composizione 13 righe.
tools/data/reports/agent_20260509_1839.md:102:`blank_thin_support` = specie autonoma del boundary.
tools/data/reports/agent_20260509_1839.md:107:- **Due radici**: denominatore riparato / atlante 13 righe.
tools/data/reports/agent_20260509_1839.md:109:- **Invariante di passaggio**: `thin_persist_rows=0/13`.
tools/data/reports/agent_20260509_1839.md:113:Il prossimo ciclo BOUNDARY deve lasciare chiuso il thin blank e attaccare il residuo `medium/strong beta-absent blank`: `numeri_primi:cycle_3` contro `random_matrix:cycle_7`. Il test utile non e' "perche' manca beta in generale", ma quale condizione distingue blank medio completo e blank forte post-estensione quando entrambi hanno supporto vivo senza chart beta.
tools/data/reports/agent_20260509_1839.md:117:- **L1 hard constraint**: claim limitato alle 13 righe semi-reali e ai depositi gia' misurati.
tools/data/reports/agent_20260509_1839.md:129:- Output: `thin_persist_rows=0`, `support_transfer_after=10/13`, `fall_after=3/13`, `open_blank_rows=['numeri_primi:cycle_3', 'random_matrix:cycle_7']`, `verdict=TAXONOMY_SCALES_THIN_DISSOLVED`.
tools/data/reports/agent_20260509_1839.md:1:# Agent Report - Boundary Transition Taxonomy 13 Rows
tools/data/reports/agent_20260509_1839.md:5:**verdict**: CONSTRAINT - la tassonomia post-estensione scala sulle 13 righe e dissolve il thin blank  
tools/data/reports/agent_20260509_1839.md:9:**observable_contract**: claim=la tassonomia delle transizioni post-estensione scala se nessuna delle 13 righe resta `thin_persists`; observable=`transition_class` row-aligned sulle 13 righe; operator=`exp_boundary_transition_taxonomy_13rows.py`; generator=composizione dei depositi 15:32, 15:38, 15:56 e prescan 15:00 senza rigenerare segnali; denominator=13 righe BOUNDARY semi-reali; non_possible=promuovere `blank_thin_support` come specie autonoma se `thin_persist_rows=0`; not_tested=nuova griglia beta, nuovi null, fit `V_c`, validita' label GUE/Poisson sorgente.
tools/data/reports/agent_20260509_1839.md:13:- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + nodo regressivo `short_denominator`.
tools/data/reports/agent_20260509_1839.md:17:- **Contaminazione cognitiva**: CE-0019: contratto combo prima della misura; CE-0022: palette come boundary operator e chart locale; KSAR: riuso del deposito stabile 15:32-15:56; PVI: se resta `thin_persists`, la tassonomia cade.
tools/data/reports/agent_20260509_1839.md:18:- **Proto-ipotesi**: `blank_thin_support` non scala sulle 13 righe se, dopo composizione con l'estensione, nessuna riga conserva supporto vivo sottile senza beta.
tools/data/reports/agent_20260509_1839.md:20:- **Proiezione**: classificare tutte le 13 righe in `transition_class` usando supporto, beta, denominatore e transizioni estese.
tools/data/reports/agent_20260509_1839.md:24:- `why`: esegue la consecutio del campo vivo: dopo la cristallizzazione short-denominator, testa se la tassonomia delle transizioni post-estensione scala sulle 13 righe.
tools/data/reports/agent_20260509_1839.md:28:> La tassonomia emersa dall'estensione del denominatore scala sull'intero perimetro BOUNDARY 13 righe se non lascia alcuna riga `thin_persists`.
tools/data/reports/agent_20260509_1839.md:31:Quando le tre righe short estese vengono ricollocate nella matrice 13 righe, resta una specie `blank_thin_support` oppure il residuo vivo cambia forma?
tools/data/reports/agent_20260509_1839.md:37:- Perimetro atomico: 13 righe BOUNDARY semi-reali.
tools/data/reports/agent_20260509_1839.md:39:- Null sfidato: esistenza di almeno una riga `thin_persists` dopo estensione.
tools/data/reports/agent_20260509_1839.md:53:| medium/strong beta-absent blank rows | 2 |
tools/data/reports/agent_20260509_1839.md:63:| blank_medium_or_strong_beta_absent | 1 |
tools/data/reports/agent_20260509_1839.md:73:| numeri_primi:cycle_3 | blank_medium_or_strong_beta_absent | 4096 | 3 | 3.243 | medium_multi_observable |
tools/data/reports/agent_20260509_1839.md:74:| random_matrix:cycle_7 | support_thickens_beta_blank | 1024 | 4 | 3.781 | strong_multi_observable |
tools/data/reports/agent_20260509_1839.md:81:| random_matrix:cycle_7 | 199 | 1024 | support_thickens_beta_blank | 4 | [] |
tools/data/reports/agent_20260509_1839.md:85:1. **Verificato: `thin_persist_rows=0/13`.** Nessuna riga conserva la forma `blank_thin_support` dopo composizione con l'estensione.
tools/data/reports/agent_20260509_1839.md:87:3. **Verificato: la beta chart sale a 9/13 righe, con 6/13 esatte 0.3.** Le sei sono quattro `beta_0_3_exact` originali, `zeta_zeros` recuperata e `pendolo_doppio` come beta osservata senza supporto.
tools/data/reports/agent_20260509_1839.md:94:La tassonomia post-estensione scala sul perimetro 13 righe: nessun membro resta `thin_persists`.
tools/data/reports/agent_20260509_1839.md:98:`blank_thin_support` = telemetria short-denominator dissolta dalla composizione 13 righe.
tools/data/reports/agent_20260509_1839.md:102:`blank_thin_support` = specie autonoma del boundary.
tools/data/reports/agent_20260509_1839.md:107:- **Due radici**: denominatore riparato / atlante 13 righe.
tools/data/reports/agent_20260509_1839.md:109:- **Invariante di passaggio**: `thin_persist_rows=0/13`.
tools/data/reports/agent_20260509_1839.md:113:Il prossimo ciclo BOUNDARY deve lasciare chiuso il thin blank e attaccare il residuo `medium/strong beta-absent blank`: `numeri_primi:cycle_3` contro `random_matrix:cycle_7`. Il test utile non e' "perche' manca beta in generale", ma quale condizione distingue blank medio completo e blank forte post-estensione quando entrambi hanno supporto vivo senza chart beta.
tools/data/reports/agent_20260509_1839.md:117:- **L1 hard constraint**: claim limitato alle 13 righe semi-reali e ai depositi gia' misurati.
tools/data/reports/agent_20260509_1839.md:129:- Output: `thin_persist_rows=0`, `support_transfer_after=10/13`, `fall_after=3/13`, `open_blank_rows=['numeri_primi:cycle_3', 'random_matrix:cycle_7']`, `verdict=TAXONOMY_SCALES_THIN_DISSOLVED`.
tools/data/reports/agent_20260509_1548.md:8:**observable_contract**: claim=i tre `blank_thin_support` vanno falsificati contro il blank medio `numeri_primi` prima di promuoverli a specie autonoma; observable=telemetria row-aligned del subset `support_without_beta_blank`; operator=`exp_boundary_blank_thin_support_audit.py`; generator=`boundary_row_aligned_nonexact_audit_20260509_1538`; denominator=4 righe `support_without_beta_blank`, di cui 3 thin e 1 medium control; non_possible=chiamare il blank sottile specie autonoma se tutte le righe thin sono spiegate da denominatore corto; not_tested=estensione nuova dei tre domini short, nuova griglia beta, nuovi null, fit `V_c`.
tools/data/reports/agent_20260509_1548.md:17:- **Proto-ipotesi**: `blank_thin_support` e' un effetto di denominatore corto se ogni riga thin ha `n_gaps < 500` e il controllo medio no; diventa specie autonoma solo se almeno una riga thin non e' spiegata dal denominatore.
tools/data/reports/agent_20260509_1548.md:33:- Nuovo strumento: `tools/exp_boundary_blank_thin_support_audit.py`.
tools/data/reports/agent_20260509_1548.md:35:- Output: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.
tools/data/reports/agent_20260509_1548.md:75:| numeri_primi:cycle_3 | medium_blank_control | 4096 | 3 | 3.243 | complete | 0.000 | false |
tools/data/reports/agent_20260509_1548.md:77:| random_matrix:cycle_7 | thin_short_complete | 199 | 1 | 1.854 | complete | 0.000 | false |
tools/data/reports/agent_20260509_1548.md:90:Nel subset `support_without_beta_blank`, il failure mode `blank_thin_support` non regge come specie autonoma nel perimetro osservato. Regge come coda denominator-limited:
tools/data/reports/agent_20260509_1548.md:92:`blank_thin_support` = beta blank + supporto vivo + denominatore corto.
tools/data/reports/agent_20260509_1548.md:100:`blank_thin_support` = failure mode stabile indipendente dal denominatore.
tools/data/reports/agent_20260509_1548.md:111:Il prossimo ciclo BOUNDARY deve estendere solo i tre domini short (`percolation`, `random_matrix`, `zeta_zeros`) verso denominatore comparabile al controllo medio. Se, a denominatore esteso, restano `blank_thin_support`, allora nasce una specie autonoma. Se salgono a supporto medio o ricevono beta locale, il failure mode 15:38 viene retrocesso a telemetria di perimetro corto.
tools/data/reports/agent_20260509_1548.md:114:- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/dnd_scenario.py --best`, report `agent_20260509_1538.md`, JSON `boundary_row_aligned_nonexact_audit_20260509_1538.json`, script `tools/exp_boundary_blank_thin_support_audit.py`, output `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.
tools/data/reports/agent_20260509_1548.md:125:- Verifica script: `python -m py_compile tools/exp_boundary_blank_thin_support_audit.py`.
tools/data/reports/agent_20260509_1548.md:126:- Run valido: `python tools/exp_boundary_blank_thin_support_audit.py --input tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json --out tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.
tools/data/reports/agent_20260509_1548.md:131:- Script nuovo: `tools/exp_boundary_blank_thin_support_audit.py`
tools/data/reports/agent_20260509_1548.md:132:- Data: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`
tools/data/reports/agent_20260509_1548.md:8:**observable_contract**: claim=i tre `blank_thin_support` vanno falsificati contro il blank medio `numeri_primi` prima di promuoverli a specie autonoma; observable=telemetria row-aligned del subset `support_without_beta_blank`; operator=`exp_boundary_blank_thin_support_audit.py`; generator=`boundary_row_aligned_nonexact_audit_20260509_1538`; denominator=4 righe `support_without_beta_blank`, di cui 3 thin e 1 medium control; non_possible=chiamare il blank sottile specie autonoma se tutte le righe thin sono spiegate da denominatore corto; not_tested=estensione nuova dei tre domini short, nuova griglia beta, nuovi null, fit `V_c`.
tools/data/reports/agent_20260509_1548.md:17:- **Proto-ipotesi**: `blank_thin_support` e' un effetto di denominatore corto se ogni riga thin ha `n_gaps < 500` e il controllo medio no; diventa specie autonoma solo se almeno una riga thin non e' spiegata dal denominatore.
tools/data/reports/agent_20260509_1548.md:33:- Nuovo strumento: `tools/exp_boundary_blank_thin_support_audit.py`.
tools/data/reports/agent_20260509_1548.md:35:- Output: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.
tools/data/reports/agent_20260509_1548.md:75:| numeri_primi:cycle_3 | medium_blank_control | 4096 | 3 | 3.243 | complete | 0.000 | false |
tools/data/reports/agent_20260509_1548.md:77:| random_matrix:cycle_7 | thin_short_complete | 199 | 1 | 1.854 | complete | 0.000 | false |
tools/data/reports/agent_20260509_1548.md:90:Nel subset `support_without_beta_blank`, il failure mode `blank_thin_support` non regge come specie autonoma nel perimetro osservato. Regge come coda denominator-limited:
tools/data/reports/agent_20260509_1548.md:92:`blank_thin_support` = beta blank + supporto vivo + denominatore corto.
tools/data/reports/agent_20260509_1548.md:100:`blank_thin_support` = failure mode stabile indipendente dal denominatore.
tools/data/reports/agent_20260509_1548.md:111:Il prossimo ciclo BOUNDARY deve estendere solo i tre domini short (`percolation`, `random_matrix`, `zeta_zeros`) verso denominatore comparabile al controllo medio. Se, a denominatore esteso, restano `blank_thin_support`, allora nasce una specie autonoma. Se salgono a supporto medio o ricevono beta locale, il failure mode 15:38 viene retrocesso a telemetria di perimetro corto.
tools/data/reports/agent_20260509_1548.md:114:- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/dnd_scenario.py --best`, report `agent_20260509_1538.md`, JSON `boundary_row_aligned_nonexact_audit_20260509_1538.json`, script `tools/exp_boundary_blank_thin_support_audit.py`, output `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.
tools/data/reports/agent_20260509_1548.md:125:- Verifica script: `python -m py_compile tools/exp_boundary_blank_thin_support_audit.py`.
tools/data/reports/agent_20260509_1548.md:126:- Run valido: `python tools/exp_boundary_blank_thin_support_audit.py --input tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json --out tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.
tools/data/reports/agent_20260509_1548.md:131:- Script nuovo: `tools/exp_boundary_blank_thin_support_audit.py`
tools/data/reports/agent_20260509_1548.md:132:- Data: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`
tools/data/condensato_proposals/proposal_20260509_1556.md:2:**Claim**: Le tre righe `blank_thin_support` restano specie autonoma solo se, a denominatore esteso, resta supporto vivo sottile senza beta chart.
tools/data/condensato_proposals/proposal_20260509_1556.md:27:Nel perimetro delle tre righe short, l'estensione del denominatore dissolve `blank_thin_support` come specie autonoma.
tools/data/condensato_proposals/proposal_20260509_1556.md:31:`blank_thin_support` = stato provvisorio da de
tools/data/reports/agent_20260509_1427.md:8:**observable_contract**: claim=il blank-pair test decide se due righe BOUNDARY senza null entrano nel transfer; observable=`spacing_r` originale contro permutation null row-aligned; operator=`exp_boundary_blank_null_audit.py` + prescan row-aligned; generator=`dnd_autoricerca.genera_segnale` per `zeta_zeros` e `pendolo_doppio`; denominator=13 righe base autoricerca 8 GUE-like / 5 Poisson-like; non_possible=dichiarare complete `zeta_zeros` con soli 199 gap o dichiarare cambio classe su `pendolo_doppio`; not_tested=fit `V_c`, nuovi spettri, nuova legge GUE/Poisson, chiusura QxG.
tools/data/reports/agent_20260509_1427.md:30:- Perimetro atomico: 13 righe base, 8 GUE-like e 5 Poisson-like.
tools/data/reports/agent_20260509_1427.md:84:- **L1 hard constraint**: nessun universale fuori perimetro; il claim vale per 13 righe base e per i due null innestati.
tools/data/reports/agent_20260509_1538.md:8:**observable_contract**: claim=le righe non-esatte della matrice BOUNDARY 15:32 vanno lette row-aligned senza usare label GUE/Poisson; observable=stato beta + forza supporto + telemetria denominatore/null; operator=`exp_boundary_row_aligned_nonexact_audit.py`; generator=matrice `boundary_two_axis_matrix_20260509_1532` + prescan `boundary_denominator_prescan_full_20260509_1500`; denominator=13 righe totali, 11 support-transfer, 7 support-transfer non esatte; non_possible=forzare il conteggio a 6 o trattare beta 0.3 come ascissa comune; not_tested=nuovi domini, nuovi null, nuova griglia beta, fit `V_c`.
tools/data/reports/agent_20260509_1538.md:12:- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + tensione "supporto senza coordinata universale".
tools/data/reports/agent_20260509_1538.md:37:- Perimetro atomico: 13 righe semi-reali; subset primario = support-transfer con `beta_coordinate_transfer=false`.
tools/data/reports/agent_20260509_1538.md:39:- Classi operative: `adjacent_beta_interval`, `beta_grid_saturation`, `coordinate_shifted`, `blank_despite_multi_observable_support`, `blank_thin_support`.
tools/data/reports/agent_20260509_1538.md:66:| blank_thin_support | 3 |
tools/data/reports/agent_20260509_1538.md:75:| numeri_primi:cycle_3 | support_without_beta_blank | blank_despite_multi_observable_support | medium_multi_observable | [] | 3 | 3.243 | complete |
tools/data/reports/agent_20260509_1538.md:76:| percolation:cycle_9 | support_without_beta_blank | blank_thin_support | thin_observable_support | [] | 1 | 1.705 | complete |
tools/data/reports/agent_20260509_1538.md:77:| random_matrix:cycle_7 | support_without_beta_blank | blank_thin_support | thin_observable_support | [] | 1 | 1.854 | complete |
tools/data/reports/agent_20260509_1538.md:78:| zeta_zeros:cycle_4 | support_without_beta_blank | blank_thin_support | thin_observable_support | [] | 2 | 2.449 | contaminated |
tools/data/reports/agent_20260509_1538.md:97:Il frame BOUNDARY regge come support-transfer su 11/13 righe, ma la parte non-esatta non e' una coda omogenea. Le righe support-transfer senza beta 0.3 esatta sono 7 e si dividono in cinque failure modes:
tools/data/reports/agent_20260509_1538.md:99:`adjacent_beta_interval`, `beta_grid_saturation`, `coordinate_shifted`, `blank_despite_multi_observable_support`, `blank_thin_support`.
tools/data/reports/agent_20260509_1538.md:122:- **L1 hard constraint**: claim limitato alle 13 righe della matrice 15:32 e al prescan 15:00.
tools/data/reports/agent_20260509_1538.md:134:- Output: `support_nonexact_rows=7`, `fall_rows=2`, `failure_blank_thin_support=3`, `failure_blank_despite_multi_observable_support=1`.
tools/data/reports/agent_20260509_1427.md:8:**observable_contract**: claim=il blank-pair test decide se due righe BOUNDARY senza null entrano nel transfer; observable=`spacing_r` originale contro permutation null row-aligned; operator=`exp_boundary_blank_null_audit.py` + prescan row-aligned; generator=`dnd_autoricerca.genera_segnale` per `zeta_zeros` e `pendolo_doppio`; denominator=13 righe base autoricerca 8 GUE-like / 5 Poisson-like; non_possible=dichiarare complete `zeta_zeros` con soli 199 gap o dichiarare cambio classe su `pendolo_doppio`; not_tested=fit `V_c`, nuovi spettri, nuova legge GUE/Poisson, chiusura QxG.
tools/data/reports/agent_20260509_1427.md:30:- Perimetro atomico: 13 righe base, 8 GUE-like e 5 Poisson-like.
tools/data/reports/agent_20260509_1427.md:84:- **L1 hard constraint**: nessun universale fuori perimetro; il claim vale per 13 righe base e per i due null innestati.
tools/data/reports/agent_20260509_1538.md:8:**observable_contract**: claim=le righe non-esatte della matrice BOUNDARY 15:32 vanno lette row-aligned senza usare label GUE/Poisson; observable=stato beta + forza supporto + telemetria denominatore/null; operator=`exp_boundary_row_aligned_nonexact_audit.py`; generator=matrice `boundary_two_axis_matrix_20260509_1532` + prescan `boundary_denominator_prescan_full_20260509_1500`; denominator=13 righe totali, 11 support-transfer, 7 support-transfer non esatte; non_possible=forzare il conteggio a 6 o trattare beta 0.3 come ascissa comune; not_tested=nuovi domini, nuovi null, nuova griglia beta, fit `V_c`.
tools/data/reports/agent_20260509_1538.md:12:- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + tensione "supporto senza coordinata universale".
tools/data/reports/agent_20260509_1538.md:37:- Perimetro atomico: 13 righe semi-reali; subset primario = support-transfer con `beta_coordinate_transfer=false`.
tools/data/reports/agent_20260509_1538.md:39:- Classi operative: `adjacent_beta_interval`, `beta_grid_saturation`, `coordinate_shifted`, `blank_despite_multi_observable_support`, `blank_thin_support`.
tools/data/reports/agent_20260509_1538.md:66:| blank_thin_support | 3 |
tools/data/reports/agent_20260509_1538.md:75:| numeri_primi:cycle_3 | support_without_beta_blank | blank_despite_multi_observable_support | medium_multi_observable | [] | 3 | 3.243 | complete |
tools/data/reports/agent_20260509_1538.md:76:| percolation:cycle_9 | support_without_beta_blank | blank_thin_support | thin_observable_support | [] | 1 | 1.705 | complete |
tools/data/reports/agent_20260509_1538.md:77:| random_matrix:cycle_7 | support_without_beta_blank | blank_thin_support | thin_observable_support | [] | 1 | 1.854 | complete |
tools/data/reports/agent_20260509_1538.md:78:| zeta_zeros:cycle_4 | support_without_beta_blank | blank_thin_support | thin_observable_support | [] | 2 | 2.449 | contaminated |
tools/data/reports/agent_20260509_1538.md:97:Il frame BOUNDARY regge come support-transfer su 11/13 righe, ma la parte non-esatta non e' una coda omogenea. Le righe support-transfer senza beta 0.3 esatta sono 7 e si dividono in cinque failure modes:
tools/data/reports/agent_20260509_1538.md:99:`adjacent_beta_interval`, `beta_grid_saturation`, `coordinate_shifted`, `blank_despite_multi_observable_support`, `blank_thin_support`.
tools/data/reports/agent_20260509_1538.md:122:- **L1 hard constraint**: claim limitato alle 13 righe della matrice 15:32 e al prescan 15:00.
tools/data/reports/agent_20260509_1538.md:134:- Output: `support_nonexact_rows=7`, `fall_rows=2`, `failure_blank_thin_support=3`, `failure_blank_despite_multi_observable_support=1`.
tools/data/boundary_denominator_prescan_20260509_1409.json:29:      "numeri_primi:cycle_3",
tools/data/boundary_denominator_prescan_20260509_1409.json:31:      "random_matrix:cycle_7",
tools/data/boundary_denominator_prescan_20260509_1409.json:98:      "domain_window": "numeri_primi:cycle_3",
tools/data/boundary_denominator_prescan_20260509_1409.json:198:      "domain_window": "random_matrix:cycle_7",
tools/data/reports/falsifier_20260509_1839.json:6:  "summary": "Il report e' internamente coerente sulle 8 lenti: hard constraint limitato a thin_persist_rows=0/13, count assoluti presenti, non_possible dichiarato, contaminazione cognitiva metabolizzata e aderenza alla direzione esplicitata."
tools/data/operator_directives_consumed/operator_directive_20260509_1427.md:12:- 13 righe boundary;
tools/data/operator_directives_consumed/operator_directive_20260509_1427.md:42:- 13 righe;
tools/data/operator_directives_consumed/operator_directive_20260509_1437.md:46:- 13 righe;
tools/data/reports/agent_20260509_1437.md:8:**observable_contract**: claim=il residual blank test decide se i 3 blank residui BOUNDARY entrano nel transfer; observable=`spacing_r` originale contro permutation null row-aligned; operator=`exp_boundary_blank_null_audit.py` + `exp_boundary_denominator_prescan.py`; generator=`dnd_autoricerca.genera_segnale` per `string_vibration`, `reaction_diffusion`, `logistica_biforcazione_var_3.5699`; denominator=13 righe base autoricerca 8 GUE-like / 5 Poisson-like; non_possible=dichiarare chiusura QxG, nuova legge GUE/Poisson, o complete `reaction_diffusion` con 499 gap; not_tested=fit `V_c`, nuovi spettri, nuovi domini.
tools/data/reports/agent_20260509_1437.md:30:- Perimetro atomico: 13 righe base, 8 GUE-like e 5 Poisson-like.
tools/data/reports/agent_20260509_1437.md:90:- **L1 hard constraint**: nessun universale fuori perimetro; il claim vale per 13 righe base autoricerca.
tools/data/reports/agent_20260509_1400.md:86:5. **Verificato: il claim osservato "V_c converge a 1" non regge nel perimetro misurato come vincolo hard.** 12/13 righe fittate hanno almeno un punto osservato sotto 1; `reference_order` e `order_memory` scendono sotto 1 agli N alti.
tools/data/reports/falsifier_20260509_1839.json:6:  "summary": "Il report e' internamente coerente sulle 8 lenti: hard constraint limitato a thin_persist_rows=0/13, count assoluti presenti, non_possible dichiarato, contaminazione cognitiva metabolizzata e aderenza alla direzione esplicitata."
tools/data/reports/agent_20260509_1437.md:8:**observable_contract**: claim=il residual blank test decide se i 3 blank residui BOUNDARY entrano nel transfer; observable=`spacing_r` originale contro permutation null row-aligned; operator=`exp_boundary_blank_null_audit.py` + `exp_boundary_denominator_prescan.py`; generator=`dnd_autoricerca.genera_segnale` per `string_vibration`, `reaction_diffusion`, `logistica_biforcazione_var_3.5699`; denominator=13 righe base autoricerca 8 GUE-like / 5 Poisson-like; non_possible=dichiarare chiusura QxG, nuova legge GUE/Poisson, o complete `reaction_diffusion` con 499 gap; not_tested=fit `V_c`, nuovi spettri, nuovi domini.
tools/data/reports/agent_20260509_1437.md:30:- Perimetro atomico: 13 righe base, 8 GUE-like e 5 Poisson-like.
tools/data/reports/agent_20260509_1437.md:90:- **L1 hard constraint**: nessun universale fuori perimetro; il claim vale per 13 righe base autoricerca.
tools/data/reports/agent_20260509_1409.md:17:- **Proiezione**: creare `tools/exp_boundary_denominator_prescan.py` e misurare 13 righe base: domain/window, source type, denominator_state, excluded mass, observable, null/surrogate, transfer.
tools/data/reports/agent_20260509_1409.md:31:- Perimetro atomico: cycle base `1..13`, esattamente 13 righe: 8 GUE-like, 5 Poisson-like.
tools/data/reports/agent_20260509_1409.md:64:| numeri_primi:cycle_3 | GUE | complete | 0.000 | spacing_r=0.886 | shuffle z=-26.60; class_change=False | transfers |
tools/data/reports/agent_20260509_1409.md:68:| random_matrix:cycle_7 | GUE | complete | 0.000 | spacing_r=0.573 | shuffle z=-14.70; class_change=False | transfers |
tools/data/reports/agent_20260509_1409.md:77:1. **Verificato: il gate trasferisce su 8/13 righe del perimetro.** Il transfer non coincide con GUE o Poisson: include 5 sorgenti GUE e 3 sorgenti Poisson perche' la condizione e' disponibilita del null, non etichetta di classe.
tools/data/reports/agent_20260509_1409.md:78:2. **Verificato: 5/13 righe restano blank strutturale.** `pendolo_doppio`, `zeta_zeros`, `string_vibration`, `reaction_diffusion`, `logistica_biforcazione_var_3.5699` hanno `spacing_r` locale ma non hanno null/surrogate row-aligned nel deposito letto.
tools/data/reports/agent_20260509_1409.md:101:- **L1 hard constraint**: nessun "sempre" o "solo" universale; il verdict vale per 13 righe base e due depositi dichiarati.
tools/data/reports/agent_20260509_1457.md:8:**observable_contract**: claim=`V_c(phi)` converge a 1 come limite leggibile del canale ordinato; observable=relazione dei punti fit-ready con il bordo `V_c=1`; operator=`exp_vc_unit_boundary_audit.py` su deposito `vc_fit_model_gate_20260509_1400`; generator=`reference_order`, `order_memory`, `periodic_closure`, `random_dispersion`; denominator=13 righe ammissibili `complete/contaminated` del fit model gate, N={89,144,233,377}, soglie r={0.48,0.50,0.52}, livelli `per_mode_best` e `accepted_candidates`; non_possible=dichiarare convergenza a 1 dall'alto quando la curva osservata attraversa sotto 1 nel perimetro; not_tested=nuovi spettri, nuovi N, nuovi candidati, limite asintotico oltre la finestra osservata.
tools/data/reports/agent_20260509_1457.md:18:- **Possibile / non-possibile**: possibile = usare `V_c=1` come unit boundary audit; non-possibile = chiamarlo limite osservato quando 12/13 righe hanno punti sotto 1.
tools/data/reports/agent_20260509_1457.md:31:- Perimetro atomico: 13 righe ammissibili del model gate, gia' filtrate da `denominator_state in {complete, contaminated}`.
tools/data/reports/agent_20260509_1457.md:84:1. **Verificato: il claim `converge a 1 dall'alto` cade nel perimetro osservato.** 12/13 righe ammissibili hanno almeno un punto fit-ready sotto `V_c=1`.
tools/data/reports/agent_20260509_1457.md:110:- **L1 hard constraint**: il verdict vale solo per le 13 righe ammissibili del deposito 14:00 e N={89,144,233,377}.
tools/data/reports/agent_20260509_1400.md:86:5. **Verificato: il claim osservato "V_c converge a 1" non regge nel perimetro misurato come vincolo hard.** 12/13 righe fittate hanno almeno un punto osservato sotto 1; `reference_order` e `order_memory` scendono sotto 1 agli N alti.
tools/data/reports/agent_20260509_1409.md:17:- **Proiezione**: creare `tools/exp_boundary_denominator_prescan.py` e misurare 13 righe base: domain/window, source type, denominator_state, excluded mass, observable, null/surrogate, transfer.
tools/data/reports/agent_20260509_1409.md:31:- Perimetro atomico: cycle base `1..13`, esattamente 13 righe: 8 GUE-like, 5 Poisson-like.
tools/data/reports/agent_20260509_1409.md:64:| numeri_primi:cycle_3 | GUE | complete | 0.000 | spacing_r=0.886 | shuffle z=-26.60; class_change=False | transfers |
tools/data/reports/agent_20260509_1409.md:68:| random_matrix:cycle_7 | GUE | complete | 0.000 | spacing_r=0.573 | shuffle z=-14.70; class_change=False | transfers |
tools/data/reports/agent_20260509_1409.md:77:1. **Verificato: il gate trasferisce su 8/13 righe del perimetro.** Il transfer non coincide con GUE o Poisson: include 5 sorgenti GUE e 3 sorgenti Poisson perche' la condizione e' disponibilita del null, non etichetta di classe.
tools/data/reports/agent_20260509_1409.md:78:2. **Verificato: 5/13 righe restano blank strutturale.** `pendolo_doppio`, `zeta_zeros`, `string_vibration`, `reaction_diffusion`, `logistica_biforcazione_var_3.5699` hanno `spacing_r` locale ma non hanno null/surrogate row-aligned nel deposito letto.
tools/data/reports/agent_20260509_1409.md:101:- **L1 hard constraint**: nessun "sempre" o "solo" universale; il verdict vale per 13 righe base e due depositi dichiarati.
tools/data/reports/agent_20260509_1457.md:8:**observable_contract**: claim=`V_c(phi)` converge a 1 come limite leggibile del canale ordinato; observable=relazione dei punti fit-ready con il bordo `V_c=1`; operator=`exp_vc_unit_boundary_audit.py` su deposito `vc_fit_model_gate_20260509_1400`; generator=`reference_order`, `order_memory`, `periodic_closure`, `random_dispersion`; denominator=13 righe ammissibili `complete/contaminated` del fit model gate, N={89,144,233,377}, soglie r={0.48,0.50,0.52}, livelli `per_mode_best` e `accepted_candidates`; non_possible=dichiarare convergenza a 1 dall'alto quando la curva osservata attraversa sotto 1 nel perimetro; not_tested=nuovi spettri, nuovi N, nuovi candidati, limite asintotico oltre la finestra osservata.
tools/data/reports/agent_20260509_1457.md:18:- **Possibile / non-possibile**: possibile = usare `V_c=1` come unit boundary audit; non-possibile = chiamarlo limite osservato quando 12/13 righe hanno punti sotto 1.
tools/data/reports/agent_20260509_1457.md:31:- Perimetro atomico: 13 righe ammissibili del model gate, gia' filtrate da `denominator_state in {complete, contaminated}`.
tools/data/reports/agent_20260509_1457.md:84:1. **Verificato: il claim `converge a 1 dall'alto` cade nel perimetro osservato.** 12/13 righe ammissibili hanno almeno un punto fit-ready sotto `V_c=1`.
tools/data/reports/agent_20260509_1457.md:110:- **L1 hard constraint**: il verdict vale solo per le 13 righe ammissibili del deposito 14:00 e N={89,144,233,377}.
tools/data/agent_field_live.md:29:- report_20260509_1839: 2 ghost · Agent Report - Boundary Transition Taxonomy 13 Rows
tools/data/agent_field_live.md:37:- Direzione operativa valutatore: BOUNDARY consecutio sui due residui beta-absent medio/forti
tools/data/agent_field_live.md:38:- Perche': Il ciclo ha prodotto una chiusura locale utile senza contraddizione: `thin_persist_rows=0` dissolve la specie `blank_thin_support` sul perimetro 13 righe, ma lascia due residui medio/forti senza beta (`numeri_primi:cycle_3`, `random_matrix:cycle_7`). La consecutio naturale non e' redesign: e' testare se quei due blank residui sono stesso operatore di confine, due classi distinte, o artefatto da denominatore/atlante.
tools/data/agent_field_live.md:927:- **Domanda aperta** (consecutio): Il prossimo ciclo BOUNDARY deve lasciare chiuso il thin blank e attaccare il residuo `medium/strong beta-absent blank`: `numeri_primi:cycle_3` contro `random_matrix:cycle_7`. Il test utile non e' "perche' manca beta in generale", ma quale condizione distingue blank medio completo e blank forte post-
tools/data/agent_field_live.md:931:  - Boundary Transition Taxonomy 13 Rows → None/None (ρ=None)
tools/data/agent_field_live.md:943:Ho mantenuto il focus sul PASSO: ricomposizione delle 13 righe dopo `short_denominator`, attrito telemetrico da autopsy senza jsonl, nodo regressivo nel contratto di traccia provider-neutral, e consecutio sui due blank residui medio/forte senza beta.
tools/data/agent_field_live.md:997:Dipolo: denominatore riparato / atlante 13 righe.
tools/data/agent_field_live.md:999:Invariante: `thin_persist_rows=0/13`.
tools/data/agent_field_live.md:1079:### Agent Report - Boundary Transition Taxonomy 13 Rows
tools/data/agent_field_live.md:1080:Trovato: 1. **Verificato: `thin_persist_rows=0/13`.** Nessuna riga conserva la forma `blank_thin_support` dopo composizione con l'estensione.
tools/data/agent_field_live.md:1084:La tassonomia post-estensione scala sul perimetro 13 righe: nessun membro resta `thin_persists`.
tools/data/agent_field_live.md:1088:`blank_thin_suppor
tools/data/agent_field_live.md:1091:Trovato: 1. **Verificato: zero righe restano `blank_thin_support` autonome.** Dopo estensione, gli stati sono tre e nessuno e' supporto vivo sottile senza beta chart.
tools/data/agent_field_live.md:1095:Nel perimetro delle tre righe short, l'estensione del denominatore dissolve `blank_thin_support` come specie autonoma.
tools/data/agent_field_live.md:1104:Nel subset `support_without_beta_blank`, il failure mode `blank_thin_support` non regge come specie autonoma nel perimetro osservato.
tools/data/agent_field_live.md:1205:  report_20260509_1839 (2 ghost): Agent Report - Boundary Transition Taxonomy 13 Rows
tools/data/lab_graph.json:490:        "label": "Agent Report - Boundary Transition Taxonomy 13 Rows",
tools/data/lab_graph.json:491:        "label_en": "Agent Report - Boundary Transition Taxonomy 13 Rows",
tools/data/lab_graph.json:492:        "label_short": "Agent Report - Boundary Transition Taxonomy 13 Rows",
tools/data/lab_graph.json:493:        "label_short_en": "Agent Report - Boundary Transition Taxonomy 13 Rows",
tools/data/lab_graph.json:496:        "verdict": "**CONSTRAINT**.\n\nLa tassonomia post-estensione scala sul perimetro 13 righe: nessun membro resta `thin_persists`.\n\nFormula valida:\n\n`blank_thin_suppor",
tools/data/lab_graph.json:497:        "findings": "1. **Verificato: `thin_persist_rows=0/13`.** Nessuna riga conserva la forma `blank_thin_support` dopo composizione con l'estensione.\n2. **Verificato: il supporto post-composizione e' 10/13.** Cadono `cellular_automata`, `pendolo_doppio` e `percolation` dopo estensione; il resto conserva supporto o c",
tools/data/lab_graph.json:498:        "annotation": "Vincolo: **CONSTRAINT**.\n\nLa tassonomia post-estensione scala sul perimetro 13 righe: nessun membro resta `th",
tools/data/lab_graph.json:499:        "annotation_en": "Constraint: **CONSTRAINT**.\n\nLa tassonomia post-estensione scala sul perimetro 13 righe: nessun membro resta `th",
tools/data/lab_graph.json:548:        "verdict": "**CONSTRAINT**.\n\nNel perimetro delle tre righe short, l'estensione del denominatore dissolve `blank_thin_support` come specie autonoma.\n\nFormula valid",
tools/data/lab_graph.json:549:        "findings": "1. **Verificato: zero righe restano `blank_thin_support` autonome.** Dopo estensione, gli stati sono tre e nessuno e' supporto vivo sottile senza beta chart.\n2. **Verificato: `percolation` perde il supporto.** La riga passa da 1 osservabile one-sided a 0; non e' blank sottile maturo, e' supporto non",
tools/data/lab_graph.json:600:        "verdict": "**CONSTRAINT**.\n\nNel subset `support_without_beta_blank`, il failure mode `blank_thin_support` non regge come specie autonoma nel perimetro osservato.",
tools/data/lab_graph.json:602:        "annotation": "Vincolo: **CONSTRAINT**.\n\nNel subset `support_without_beta_blank`, il failure mode `blank_thin_support` non r",
tools/data/lab_graph.json:603:        "annotation_en": "Constraint: **CONSTRAINT**.\n\nNel subset `support_without_beta_blank`, il failure mode `blank_thin_support` non r",
tools/data/lab_graph.json:652:        "verdict": "**CONSTRAINT**.\n\nIl frame BOUNDARY regge come support-transfer su 11/13 righe, ma la parte non-esatta non e' una coda omogenea. Le righe support-trans",
tools/data/lab_graph.json:654:        "annotation": "Vincolo: **CONSTRAINT**.\n\nIl frame BOUNDARY regge come support-transfer su 11/13 righe, ma la parte non-esatt",
tools/data/lab_graph.json:655:        "annotation_en": "Constraint: **CONSTRAINT**.\n\nIl frame BOUNDARY regge come support-transfer su 11/13 righe, ma la parte non-esatt",
tools/data/lab_graph.json:704:        "verdict": "**CONSTRAINT**.\n\nIl gate BOUNDARY trasferisce come supporto ordine/null su 11/13 righe. La coordinata beta 0.3 trasferisce esattamente su 4/13 righe. ",
tools/data/lab_graph.json:706:        "annotation": "Vincolo: **CONSTRAINT**.\n\nIl gate BOUNDARY trasferisce come supporto ordine/null su 11/13 righe. La coordinat",
tools/data/lab_graph.json:707:        "annotation_en": "Constraint: **CONSTRAINT**.\n\nIl gate BOUNDARY trasferisce come supporto ordine/null su 11/13 righe. La coordinat",
tools/data/lab_graph.json:1026:          "dipole": "denominatore riparato / atlante 13 righe.",
tools/data/lab_graph.json:1028:          "invariant": "`thin_persist_rows=0/13`.",
tools/data/lab_graph.json:1334:      "title": "Agent Report - Boundary Transition Taxonomy 13 Rows",
tools/data/lab_graph.json:1335:      "title_en": "Agent Report - Boundary Transition Taxonomy 13 Rows",
tools/data/lab_graph.json:1338:      "verdict": "**CONSTRAINT**.\n\nLa tassonomia post-estensione scala sul perimetro 13 righe: nessun membro resta `thin_persists`.\n\nFormula valida:\n\n`blank_thin_support` = telemetria short-denominator dissolta dalla c",
tools/data/lab_graph.json:1339:      "verdict_en": "**CONSTRAINT**.\n\nLa tassonomia post-estensione scala sul perimetro 13 righe: nessun membro resta `thin_persists`.\n\nFormula valida:\n\n`blank_thin_support` = telemetria short-denominator dissolta dalla c",
tools/data/lab_graph.json:1340:      "findings": "1. **Verificato: `thin_persist_rows=0/13`.** Nessuna riga conserva la forma `blank_thin_support` dopo composizione con l'estensione.\n2. **Verificato: il supporto post-composizione e' 10/13.** Cadono `cellular_automata`, `pendolo_doppio` e `percolation` dopo estensione; il resto conserva supporto o chart locale.\n3. **Verificato: la beta chart sale a 9/13 righe, con 6/13 esatte 0.3.** Le sei sono qu",
tools/data/lab_graph.json:1341:      "content_preview": "# Agent Report - Boundary Transition Taxonomy 13 Rows\n**Date**: 2026-05-09 18:39  \n**Piano**: 113  \n**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE  \n**verdict**: CONSTRAINT - la tassonomia post-estensione scala sulle 13 righe e dissolve il thin blank  \nobservables_registry: 1.0.0-2026-05-06  \nobservables_used: [`transition_class`, `source_beta_state`, `extension_state`, `support_tier_after`, `one_sided_after`, `endpoint_after`, `stable_count_coherent_after`, `beta_after`, `denominator_stat",
tools/data/lab_graph.json:1342:      "content_full": "# Agent Report - Boundary Transition Taxonomy 13 Rows\n**Date**: 2026-05-09 18:39  \n**Piano**: 113  \n**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE  \n**verdict**: CONSTRAINT - la tassonomia post-estensione scala sulle 13 righe e dissolve il thin blank  \nobservables_registry: 1.0.0-2026-05-06  \nobservables_used: [`transition_class`, `source_beta_state`, `extension_state`, `support_tier_after`, `one_sided_after`, `endpoint_after`, `stable_count_coherent_after`, `beta_after`, `denominator_state`, `excluded_mass`] - osservabili domain-native di composizione row-aligned, non canonici.  \nssp_value: no  \n**observable_contract**: claim=la tassonomia delle transizioni post-estensione scala se nessuna delle 13 righe resta `thin_persists`; observable=`transition_class` row-aligned sulle 13 righe; operator=`exp_boundary_transition_taxonomy_13rows.py`; generator=composizione dei depositi 15:32, 15:38, 15:56 e prescan 15:00 senza rigenerare segnali; denominator=13 righe BOUNDARY semi-reali; non_possible=promuovere `blank_thin_support` come specie autonoma se `thin_persist_rows=0`; not_tested=nuova griglia beta, nuovi null, fit `V_c`, validita' label GUE/Poisson sorgente.\n\n## Respiro fuori-tempo\n- **Prima impressione**: dopo l'estensione il thin blank non resta una figura. La domanda vera diventa se la matrice intera lascia un nuovo residuo vivo.\n- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + nodo regressivo `short_denominator`.\n- **Dipolo / punto-zero**: supporto sottile / atlante di transizione; punto-zero = stessa riga row-aligned prima che il blank venga letto come specie o come transizione.\n- **Piano superiore**: sheaf locale del boundary su 13 sezioni. La sezione corta viene riparata, poi ricollocata nell'atlante senza usare label GUE/Poisson.\n- **Operatori laterali scelti**: boundary operator, sheaf locale/perimetro, coordinate chart. Servono a comporre stati gia' misurati senza introdurre un nuovo gate.\n- **Contaminazione cognitiva**: CE-0019: contratto combo prima della misura; CE-0022: palette come boundary operator e chart locale; KSAR: riuso del deposito stabile 15:32-15:56; PVI: se resta `thin_persists`, la tassonomia cade.\n- **Proto-ipotesi**: `blank_thin_support` non scala sulle 13 righe se, dopo composizione con l'estensione, nessuna riga conserva supporto vivo sottile senza beta.\n- **Possibile / non-possibile**: possibile = usare l'atlante di transizione come mappa BOUNDARY; non-possibile = trattare il thin blank come specie matura.\n- **Proiezione**: classificare tutte le 13 righe in `transition_class` usando supporto, beta, denominatore e transizioni estese.\n\n## Aderenza alla direzione\n- `relation`: follows_direction\n- `why`: esegue la consecutio del campo vivo: dopo la cristallizzazione short-denominator, testa se la tassonomia delle transizioni post-estensione scala sulle 13 righe.\n- `not_drift`: non torna a `V_c`, non difende thin blank, non usa label GUE/Poisson come decision field; compone solo depositi row-aligned gia' misurati.\n\n## Claim Under Test\n> La tassonomia emersa dall'estensione del denominatore scala sull'intero perimetro BOUNDARY 13 righe se non lascia alcuna riga `thin_persists`.\n\n## Question\nQuando le tre righe short estese vengono ricollocate nella matrice 13 righe, resta una specie `blank_thin_support` oppure il residuo vivo cambia forma?\n\n## Experiment Design\n- Nuovo strumento: `tools/exp_boundary_transition_taxonomy_13rows.py`.\n- Input: `boundary_two_axis_matrix_20260509_1532.json`, `boundary_row_aligned_nonexact_audit_20260509_1538.json`, `boundary_short_denominator_extension_20260509_1556.json`, `boundary_denominator_prescan_full_20260509_1500.json`.\n- Output: `tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json`.\n- Perimetro atomico: 13 righe BOUNDARY semi-reali.\n- Label policy: `source_domain_type` resta audit metadata; non entra in `transition_class`.\n- Null sfidato: esistenza di almeno una riga `thin_persists` dopo estensione.\n\n## Results\n\nIndice globale:\n\n| measure | value |\n|---|---:|\n| total rows | 13 |\n| support transfer after composition | 10 |\n| fall after composition | 3 |\n| beta chart after any | 9 |\n| beta chart exact 0.3 after | 6 |\n| thin persist rows | 0 |\n| medium/strong beta-absent blank rows | 2 |\n| verdict | TAXONOMY_SCALES_THIN_DISSOLVED |\n\nTransition classes:\n\n| transition_class | rows |\n|---|---:|\n| beta_0_3_exact | 4 |\n| beta_0_3_local_nonunique | 2 |\n| beta_chart_recovered | 1 |\n| blank_medium_or_strong_beta_absent | 1 |\n| fall_no_support | 2 |\n| local_beta_other | 1 |\n| support_falls_after_extension | 1 |\n| support_thickens_beta_blank | 1 |\n\nRighe aperte senza beta dopo composizione:\n\n| row | class | n_gaps | one-sided | endpoint | tier |\n|---|---|---:|---:|---:|---|\n| numeri_primi:cycle_3 | blank_medium_or_strong_beta_absent | 4096 | 3 | 3.243 | medium_multi_observable |\n| random_matrix:cycle_7 | support_thickens_beta_blank | 1024 | 4 | 3.781 | strong_multi_observable |\n\nRighe short riparate:\n\n| row | before n | after n | transition_class | one-sided after | beta after |\n|---|---:|---:|---|---:|---|\n| percolation:cycle_9 | 190 | 1024 | support_falls_after_extension | 0 | [] |\n| random_matrix:cycle_7 | 199 | 1024 | support_thickens_beta_blank | 4 | [] |\n| zeta_zeros:cycle_4 | 199 | 1024 | beta_chart_recovered | 2 | [0.3] |\n\n## Key Findings\n1. **Verificato: `thin_persist_rows=0/13`.** Nessuna riga conserva la forma `blank_thin_support` dopo composizione con l'estensione.\n2. **Verificato: il supporto post-composizione e' 10/13.** Cadono `cellular_automata`, `pendolo_doppio` e `percolation` dopo estensione; il resto conserva supporto o chart locale.\n3. **Verificato: la beta chart sale a 9/13 righe, con 6/13 esatte 0.3.** Le sei sono quattro `beta_0_3_exact` originali, `zeta_zeros` recuperata e `pendolo_doppio` come beta osservata senza supporto.\n4. **Verificato: il residuo vivo non e' thin.** Restano due blank senza beta: `numeri_primi` medio e `random_matrix` forte dopo estensione.\n5. **Inferito: la tassonomia scala come atlante di transizione, non come legge beta universale.** Il thin blank cade; il nodo successivo e' il blank medio/forte senza beta.\n\n## Verdict\n**CONSTRAINT**.\n\nLa tassonomia post-estensione scala sul perimetro 13 righe: nessun membro resta `thin_persists`.\n\nFormula valida:\n\n`blank_thin_support` = telemetria short-denominator dissolta dalla composizione 13 righe.\n\nFormula non valida:\n\n`blank_thin_support` = specie autonoma del boundary.\n\nIl boundary resta una matrice di transizioni: supporto che cade, supporto che si ispessisce senza beta, chart beta recuperata, chart beta esatta, chart locale non unica, chart spostata.\n\n## Bicono della scoperta\n- **Due radici**: denominatore riparato / atlante 13 righe.\n- **Singolare**: riga BOUNDARY prima della classificazione post-estensione.\n- **Invariante di passaggio**: `thin_persist_rows=0/13`.\n- **Campo di possibilita**: qui diventa possibile chiudere il thin blank; qui diventa non-possibile chiudere il blank medio/forte senza beta.\n\n## Consecutio\nIl prossimo ciclo BOUNDARY deve lasciare chiuso il thin blank e attaccare il residuo `medium/strong beta-absent blank`: `numeri_primi:cycle_3` contro `random_matrix:cycle_7`. Il test utile non e' \"perche' manca beta in generale\", ma quale condizione distingue blank medio completo e blank forte post-estensione quando entrambi hanno supporto vivo senza chart beta.\n\n## Auto-audit: source flags e 7 lenti\n- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/data/seme.json`, `tools/dnd_scenario.py --best`, report `agent_20260509_1556.md`, JSON 15:32/15:38/15:56/15:00, script e output 18:39.\n- **L1 hard constraint**: claim limitato alle 13 righe semi-reali e ai depositi gia' misurati.\n- **L2 count grezzi**: riportati 13 totali, 10 support, 3 fall, 9 beta chart, 0 thin persist, 2 open blank.\n- **L3 no silent patching**: nessuna nuova simulazione o ricampionamento; la composizione dichiara le estensioni applicate solo a tre righe.\n- **L4 edge cases**: `pendolo_doppio` ha beta 0.3 ma resta fall; `random_matrix` e' forte senza beta; `zeta_zeros` recupera beta pur restando contaminato nel prescan.\n- **L5 re-discovery**: il ciclo non ripete la matrice 15:32 ne' l'estensione 15:56; testa la scalabilita' richiesta dal campo vivo.\n- **L6 metabolismo cognitivo**: CE-0019, CE-0022, KSAR e PVI usati nella combo.\n- **L7 possibile/non-possibile**: possibile = atlante BOUNDARY di transizione; non-possibile = specie autonoma thin blank.\n\n## Telemetria\n- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.\n- Verifica script: `python -m py_compile tools/exp_boundary_transition_taxonomy_13rows.py`.\n- Run valido: `python tools/exp_boundary_transition_taxonomy_13rows.py --out tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json`.\n- Output: `thin_persist_rows=0`, `support_transfer_after=10/13`, `fall_after=3/13`, `open_blank_rows=['numeri_primi:cycle_3', 'random_matrix:cycle_7']`, `verdict=TAXONOMY_SCALES_THIN_DISSOLVED`.\n- Git state: worktree gia' sporco da cicli e pubblicazioni precedenti; questo cycle aggiunge lo script 18:39, il JSON 18:39 e questo report.\n\n## Files\n- Script nuovo: `tools/exp_boundary_transition_taxonomy_13rows.py`\n- Data: `tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json`\n- Report: `tools/data/reports/agent_20260509_1839.md`\n",
tools/data/lab_graph.json:1348:          "text": "> La tassonomia emersa dall'estensione del denominatore scala sull'intero perimetro BOUNDARY 13 righe se non lascia alcuna riga `thin_persists`."
tools/data/lab_graph.json:1354:          "text": "Quando le tre righe short estese vengono ricollocate nella matrice 13 righe, resta una specie `blank_thin_support` oppure il residuo vivo cambia forma"
tools/data/lab_graph.json:1372:          "text": "**CONSTRAINT**.\n\nLa tassonomia post-estensione scala sul perimetro 13 righe: nessun membro resta `thin_persists`.\n\nFormula valida:\n\n`blank_thin_suppor"
tools/data/lab_graph.json:1378:          "text": "Il prossimo ciclo BOUNDARY deve lasciare chiuso il thin blank e attaccare il residuo `medium/strong beta-absent blank`: `numeri_primi:cycle_3` contro "
tools/data/lab_graph.json:1389:      "verdict": "**CONSTRAINT**.\n\nNel perimetro delle tre righe short, l'estensione del denominatore dissolve `blank_thin_support` come specie autonoma.\n\nFormula valida:\n\n`blank_thin_support` = stato provvisorio da de",
tools/data/lab_graph.json:1390:      "verdict_en": "**CONSTRAINT**.\n\nNel perimetro delle tre righe short, l'estensione del denominatore dissolve `blank_thin_support` come specie autonoma.\n\nFormula valida:\n\n`blank_thin_support` = stato provvisorio da de",
tools/data/lab_graph.json:1391:      "findings": "1. **Verificato: zero righe restano `blank_thin_support` autonome.** Dopo estensione, gli stati sono tre e nessuno e' supporto vivo sottile senza beta chart.\n2. **Verificato: `percolation` perde il supporto.** La riga passa da 1 osservabile one-sided a 0; non e' blank sottile maturo, e' supporto non replicato.\n3. **Verificato: `random_matrix` ispessisce il supporto.** Passa da 1 a 4 osservabili on",
tools/data/lab_graph.json:1393:      "content_full": "# Agent Report - Boundary Short Denominator Extension\n**Date**: 2026-05-09 15:56  \n**Piano**: 112  \n**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE  \n**verdict**: CONSTRAINT - l'estensione del denominatore dissolve il blank sottile come specie autonoma  \nobservables_registry: 1.0.0-2026-05-06  \nobservables_used: [`SR`, `SR2`, `L1`, `L2`, `triple_var`, `extension_state`, `after_one_sided`, `after_beta`, `after_support_tier`, `endpoint_distance_one_sided_gated`] - osservabili canonici piu' stati domain-native di audit.  \nssp_value: no  \n**observable_contract**: claim=`blank_thin_support` sopravvive solo se, dopo estensione del denominatore sorgente, resta supporto vivo sottile senza beta chart; observable=gate canonico one-sided + beta chart sulle tre righe short; operator=`exp_boundary_short_denominator_extension.py`; generator=`source-denominator extension` per `percolation`, `random_matrix`, `zeta_zeros`; denominator=3 righe short del report 15:48, estese a `n_gaps=1024`; non_possible=promuovere `blank_thin_support` se il supporto cade, si ispessisce o recupera beta; not_tested=redesign globale 13 righe, fit `V_c`, validita' della label GUE/Poisson sorgente.\n\n## Respiro fuori-tempo\n- **Prima impressione**: il blank sottile non chiede una parola nuova. Chiede di togliere il corto dal denominatore e vedere se resta la stessa figura.\n- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + boundary operator + nodo regressivo `short_denominator`.\n- **Dipolo / punto-zero**: denominatore corto / supporto strutturale; punto-zero = stessa riga prima che `thin` venga letto come specie o come limite di misura.\n- **Piano superiore**: sheaf locale del boundary. La sezione locale cambia quando il denominatore viene esteso: il bordo non e' la label del dominio, e' la sezione che resta compatibile con gli osservabili.\n- **Operatori laterali scelti**: boundary operator, filtrazione per denominatore, sheaf locale. Servono a riparare il nodo sorgente senza aggiungere un gate globale.\n- **Contaminazione cognitiva**: CE-0001 / KSAR: reiterazione minima sul deposito 15:48; CE-0117: cascata limitata alle tre righe short; YSN DeltaLink: `short denominator -> source extension -> state transition`; PVI: se nessuna riga resta thin support vivo dopo estensione, la specie autonoma cade.\n- **Proto-ipotesi**: `blank_thin_support` e' telemetria da denominatore corto se ogni riga short cambia stato dopo estensione: collasso del supporto, ispessimento del supporto, o recupero beta.\n- **Possibile / non-possibile**: possibile = usare l'estensione sorgente come audit regressivo per failure modes corti; non-possibile = promuovere il blank sottile nel perimetro 15:48.\n- **Proiezione**: generare tre sequenze estese e applicare lo stesso gate canonico del report 15:16.\n\n## Aderenza alla direzione\n- `relation`: follows_direction\n- `why`: esegue la direzione valutatore `same_frame_boundary_denominator_extension`, attaccando il nodo regressivo indicato dal report 15:48.\n- `not_drift`: non torna a `V_c`, non cambia tensione, non usa label GUE/Poisson come decision field; modifica solo il denominatore delle tre righe short.\n\n## Claim Under Test\n> Le tre righe `blank_thin_support` restano specie autonoma solo se, a denominatore esteso, resta supporto vivo sottile senza beta chart.\n\n## Question\nCosa accade alle tre righe short quando il denominatore viene portato sopra la soglia piena del gate precedente?\n\n## Experiment Design\n- Nuovo strumento: `tools/exp_boundary_short_denominator_extension.py`.\n- Input sorgente: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.\n- Output: `tools/data/boundary_short_denominator_extension_20260509_1556.json`.\n- Perimetro atomico: `percolation:cycle_9`, `random_matrix:cycle_7`, `zeta_zeros:cycle_4`.\n- Denominatore esteso: `1024` gap per riga.\n- Gate: stesso schema canonical original-vs-shuffle e beta interpolation del semireal boundary gate.\n- Label policy: i nomi riga selezionano il perimetro short; le label GUE/Poisson non entrano nel decision field.\n\n## Results\n\nIndice globale:\n\n| measure | value |\n|---|---:|\n| target rows | 3 |\n| rows still thin support after extension | 0 |\n| support falls after extension | 1 |\n| support thickens beta blank | 1 |\n| beta chart recovered | 1 |\n| verdict | DENOMINATOR_EXTENSION_RESOLVES_THINNESS |\n\nTransizioni:\n\n| row | n_gaps | one-sided | stable coherent | endpoint | beta | extension_state |\n|---|---:|---:|---:|---:|---|---|\n| percolation:cycle_9 | 190 -> 1024 | 1 -> 0 | 0.833 -> 0.000 | 1.705 -> 0.000 | [] | support_falls_after_extension |\n| random_matrix:cycle_7 | 199 -> 1024 | 1 -> 4 | 1.000 -> 4.000 | 1.854 -> 3.781 | [] | support_thickens_beta_blank |\n| zeta_zeros:cycle_4 | 199 -> 1024 | 2 -> 2 | 1.917 -> 2.333 | 2.449 -> 2.660 | [0.3] | beta_chart_recovered |\n\n## Key Findings\n1. **Verificato: zero righe restano `blank_thin_support` autonome.** Dopo estensione, gli stati sono tre e nessuno e' supporto vivo sottile senza beta chart.\n2. **Verificato: `percolation` perde il supporto.** La riga passa da 1 osservabile one-sided a 0; non e' blank sottile maturo, e' supporto non replicato.\n3. **Verificato: `random_matrix` ispessisce il supporto.** Passa da 1 a 4 osservabili one-sided, stable coherent da 1.000 a 4.000, endpoint da 1.854 a 3.781; resta beta blank ma non sottile.\n4. **Verificato: `zeta_zeros` recupera beta.** Mantiene 2 osservabili one-sided e riceve beta `[0.3]`; il blank di chart cade.\n5. **Inferito: il failure mode 15:48 era una coda di denominatore, non una specie.** Le tre transizioni divergono, ma convergono sulla stessa negazione: il sottile non sopravvive come classe.\n\n## Verdict\n**CONSTRAINT**.\n\nNel perimetro delle tre righe short, l'estensione del denominatore dissolve `blank_thin_support` come specie autonoma.\n\nFormula valida:\n\n`blank_thin_support` = stato provvisorio da denominatore corto nel deposito 15:48.\n\nFormula non valida:\n\n`blank_thin_support` = failure mode stabile del boundary.\n\nLa riparazione regressiva avviene nel generatore/denominatore della riga. Non serve aggiungere una nuova tassonomia globale.\n\n## Bicono della scoperta\n- **Due radici**: supporto sottile osservato / denominatore sorgente corto.\n- **Singolare**: riga short prima dell'estensione.\n- **Invariante di passaggio**: nessuna riga rimane supporto vivo sottile senza beta dopo `n_gaps=1024`.\n- **Campo di possibilita**: qui diventa possibile retrocedere il blank sottile a telemetria corta; qui diventa non-possibile promuoverlo come specie matura.\n\n## Consecutio\nIl prossimo ciclo BOUNDARY non deve piu' cercare una classe `blank_thin_support`. Deve separare i tre esiti emersi: `percolation` come supporto non replicato, `random_matrix` come supporto forte beta-blank, `zeta_zeros` come beta recuperata. Il nodo ancora vivo e' il blank medio/forte senza beta, non il blank sottile.\n\n## Auto-audit: source flags e 7 lenti\n- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/dnd_scenario.py --best`, report `agent_20260509_1548.md`, script `tools/exp_boundary_short_denominator_extension.py`, output `tools/data/boundary_short_denominator_extension_20260509_1556.json`.\n- **L1 hard constraint**: claim limitato alle tre righe short del report 15:48.\n- **L2 count grezzi**: riportati 3 target, 0 thin persistenti, 1 support fall, 1 support thickening, 1 beta recovered.\n- **L3 no silent patching**: l'estensione cambia il generatore operativo in modo dichiarato: percolation site samples, GUE block spacings, zeta zeros first spacings.\n- **L4 edge cases**: `percolation` non conferma; collassa. Il collasso e' risultato, non errore mascherato.\n- **L5 re-discovery**: il ciclo non ripete il 15:48; esegue la consecutio indicata dal 15:48.\n- **L6 metabolismo cognitivo**: CE-0001, CE-0117, YSN e PVI usati nella combo.\n- **L7 possibile/non-possibile**: possibile = audit regressivo del denominatore; non-possibile = specie autonoma `blank_thin_support`.\n\n## Telemetria\n- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.\n- Verifica script: `python -m py_compile tools/exp_boundary_short_denominator_extension.py`.\n- Run valido: `python tools/exp_boundary_short_denominator_extension.py --out tools/data/boundary_short_denominator_extension_20260509_1556.json`.\n- Output: `state_counts={'support_falls_after_extension': 1, 'support_thickens_beta_blank': 1, 'beta_chart_recovered': 1}`, `verdict=DENOMINATOR_EXTENSION_RESOLVES_THINNESS`.\n- Nota runtime: un primo run a denominatore 1024 ha richiesto attesa lunga ma ha completato localmente; nessuna API esterna.\n- Git state: worktree gia' sporco da cicli precedenti; questo cycle aggiunge lo script 15:56, il JSON 15:56 e questo report.\n\n## Files\n- Script nuovo: `tools/exp_boundary_short_denominator_extension.py`\n- Data: `tools/data/boundary_short_denominator_extension_20260509_1556.json`\n- Report: `tools/data/reports/agent_20260509_1556.md`\n",
tools/data/lab_graph.json:1399:          "text": "> Le tre righe `blank_thin_support` restano specie autonoma solo se, a denominatore esteso, resta supporto vivo sottile senza beta chart."
tools/data/lab_graph.json:1411:          "text": "- Nuovo strumento: `tools/exp_boundary_short_denominator_extension.py`.\n- Input sorgente: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.\n- Output: `tools/data/boundary_short_denomi"
tools/data/lab_graph.json:1423:          "text": "**CONSTRAINT**.\n\nNel perimetro delle tre righe short, l'estensione del denominatore dissolve `blank_thin_support` come specie autonoma.\n\nFormula valid"
tools/data/lab_graph.json:1429:          "text": "Il prossimo ciclo BOUNDARY non deve piu' cercare una classe `blank_thin_support`. Deve separare i tre esiti emersi: `percolation` come supporto non re"
tools/data/lab_graph.json:1440:      "verdict": "**CONSTRAINT**.\n\nNel subset `support_without_beta_blank`, il failure mode `blank_thin_support` non regge come specie autonoma nel perimetro osservato. Regge come coda denominator-limited:\n\n`blank_thin",
tools/data/lab_graph.json:1441:      "verdict_en": "**CONSTRAINT**.\n\nNel subset `support_without_beta_blank`, il failure mode `blank_thin_support` non regge come specie autonoma nel perimetro osservato. Regge come coda denominator-limited:\n\n`blank_thin",
tools/data/lab_graph.json:1444:      "content_full": "# Agent Report - Boundary Blank Thin Support Audit\n**Date**: 2026-05-09 15:48  \n**Piano**: 111  \n**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE  \n**verdict**: CONSTRAINT - il blank sottile e' limitato dal denominatore corto, non dalla contaminazione del null  \nobservables_registry: 1.0.0-2026-05-06  \nobservables_used: [`blank_class`, `coordinate_failure`, `support_tier`, `denominator_bucket`, `n_gaps`, `one_sided_count`, `stable_count_coherent`, `stable_count_illusory`, `endpoint_distance`, `denominator_state`, `excluded_mass`, `shuffle_z_score`, `shuffle_class_changes`] - osservabili domain-native di audit, non canonici SR/SR2/L1/L2/triple_var.  \n**observable_contract**: claim=i tre `blank_thin_support` vanno falsificati contro il blank medio `numeri_primi` prima di promuoverli a specie autonoma; observable=telemetria row-aligned del subset `support_without_beta_blank`; operator=`exp_boundary_blank_thin_support_audit.py`; generator=`boundary_row_aligned_nonexact_audit_20260509_1538`; denominator=4 righe `support_without_beta_blank`, di cui 3 thin e 1 medium control; non_possible=chiamare il blank sottile specie autonoma se tutte le righe thin sono spiegate da denominatore corto; not_tested=estensione nuova dei tre domini short, nuova griglia beta, nuovi null, fit `V_c`.\n\n## Respiro fuori-tempo\n- **Prima impressione**: il deposito 15:38 divide il blank in due livelli, ma il livello sottile ha tutte le righe corte. Il punto non e' nominare una specie nuova; e' verificare se la specie sopravvive al denominatore.\n- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY row-aligned + tensione \"supporto vivo senza chart beta\".\n- **Dipolo / punto-zero**: blank sottile / blank medio; punto-zero = riga `support_without_beta_blank` prima che la forza del supporto venga letta come specie o come limite del denominatore.\n- **Piano superiore**: sheaf locale del boundary. La sezione beta e' vuota su tutte e quattro le righe; il discriminante diventa la qualita' del supporto e del denominatore.\n- **Operatori laterali scelti**: boundary operator, sheaf locale/perimetro, filtrazione per denominatore. Servono a separare stato beta invariato da supporto misurabile.\n- **Contaminazione cognitiva**: CE-0001 / KSAR: reiterazione minima sul deposito 15:38; CE-0117: cascata solo dove il blank apre una distinzione; YSN DeltaLink: `same beta blank -> support tier -> denominator bucket`; PVI: se tutte le righe thin sono corte, la specie autonoma cade nel perimetro.\n- **Proto-ipotesi**: `blank_thin_support` e' un effetto di denominatore corto se ogni riga thin ha `n_gaps < 500` e il controllo medio no; diventa specie autonoma solo se almeno una riga thin non e' spiegata dal denominatore.\n- **Possibile / non-possibile**: possibile = usare il blank sottile come coda denominator-limited da estendere; non-possibile = promuoverlo a failure mode stabile senza estendere percolation, random_matrix e zeta_zeros.\n- **Proiezione**: misurare `n_gaps`, `denominator_state`, `excluded_mass`, `shuffle_class_changes`, `one_sided_count`, `endpoint_distance` dentro il subset `support_without_beta_blank`.\n\n## Aderenza alla direzione\n- `relation`: follows_direction\n- `why`: falsifica direttamente se i failure modes del 15:38 sono stabili o artefatti della griglia/perimetro row-aligned.\n- `not_drift`: non usa label GUE/Poisson, non torna a `V_c`, non aggiunge nuovi domini; attacca solo il nodo aperto dal report precedente: blank sottile contro blank medio.\n\n## Claim Under Test\n> Nel subset `support_without_beta_blank`, il blank sottile e' una specie autonoma solo se non e' interamente spiegato da denominatore corto.\n\n## Question\nI tre blank sottili sono fallimenti autonomi del boundary, oppure righe con supporto insufficiente perche' corte?\n\n## Experiment Design\n- Nuovo strumento: `tools/exp_boundary_blank_thin_support_audit.py`.\n- Input: `tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json`.\n- Output: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.\n- Perimetro atomico: 4 righe `support_without_beta_blank`.\n- Soglia dichiarata: `full_gap_floor=500`.\n- Null sfidati: denominatore corto, contaminazione prescan, shuffle class-change, specie autonoma.\n- Label policy: non legge `source_domain_type` o label GUE/Poisson come decision field.\n\n## Results\n\nIndice globale:\n\n| measure | value |\n|---|---:|\n| support_without_beta_blank rows | 4 |\n| thin rows | 3 |\n| medium control rows | 1 |\n| thin short rows | 3 |\n| thin contaminated rows | 1 |\n| thin shuffle class-change rows | 1 |\n| thin not denominator explained rows | 0 |\n\nTest:\n\n| null / counter | condition | result |\n|---|---|---|\n| denominator_artifact | all thin rows have `n_gaps < 500` | pass |\n| contamination_artifact | all thin rows are contaminated | fail |\n| shuffle_instability_artifact | all thin rows have `shuffle_class_changes=true` | fail |\n| autonomous_species_counter | at least one thin row is not short-denominator explained | fail |\n\nComparative means:\n\n| group | rows | n_gaps mean | one-sided mean | coherent mean | endpoint mean | excluded mass mean | abs shuffle z mean |\n|---|---:|---:|---:|---:|---:|---:|---:|\n| thin | 3 | 196.000 | 1.333 | 1.250 | 2.003 | 0.201 | 11.037 |\n| medium control | 1 | 4096.000 | 3.000 | 3.000 | 3.243 | 0.000 | 26.600 |\n\nRows:\n\n| row | blank_class | n_gaps | one-sided | endpoint | denominator | excluded | shuffle_change |\n|---|---|---:|---:|---:|---|---:|---|\n| numeri_primi:cycle_3 | medium_blank_control | 4096 | 3 | 3.243 | complete | 0.000 | false |\n| percolation:cycle_9 | thin_short_shuffle_unstable | 190 | 1 | 1.705 | complete | 0.000 | true |\n| random_matrix:cycle_7 | thin_short_complete | 199 | 1 | 1.854 | complete | 0.000 | false |\n| zeta_zeros:cycle_4 | thin_short_contaminated | 199 | 2 | 2.449 | contaminated | 0.602 | false |\n\n## Key Findings\n1. **Verificato: il blank sottile e' 3/3 short-denominator.** `percolation`, `random_matrix` e `zeta_zeros` hanno `n_gaps=190,199,199`; il controllo `numeri_primi` ha `n_gaps=4096`.\n2. **Verificato: la contaminazione non spiega la classe.** Solo `zeta_zeros` e' contaminato; `percolation` e `random_matrix` sono complete con excluded mass 0.0.\n3. **Verificato: lo shuffle class-change non spiega la classe.** Solo `percolation` cambia classe nello shuffle; `random_matrix` e `zeta_zeros` no.\n4. **Verificato: non resta una riga thin autonoma nel perimetro 15:48.** `thin_not_denominator_explained_rows=0`.\n5. **Inferito: il blank medio dei primi non e' blank per mancanza di supporto.** Ha tre osservabili one-sided, denominatore completo, endpoint 3.243 e null forte; resta blank di chart beta, non blank sottile.\n\n## Verdict\n**CONSTRAINT**.\n\nNel subset `support_without_beta_blank`, il failure mode `blank_thin_support` non regge come specie autonoma nel perimetro osservato. Regge come coda denominator-limited:\n\n`blank_thin_support` = beta blank + supporto vivo + denominatore corto.\n\nFormula valida:\n\n`support_without_beta_blank` si divide in `medium_blank_control` e `thin_short_*`.\n\nFormula non valida:\n\n`blank_thin_support` = failure mode stabile indipendente dal denominatore.\n\nIl nodo regressivo e' il denominatore dei tre domini corti. Non va promossa una nuova specie; va estesa o dichiarata coda corta.\n\n## Bicono della scoperta\n- **Due radici**: blank di chart beta / supporto del denominatore.\n- **Singolare**: riga `support_without_beta_blank` prima che il support tier venga letto come specie.\n- **Invariante di passaggio**: denominatore corto separa i blank sottili; contaminazione e shuffle-instability non bastano.\n- **Campo di possibilita**: qui diventa possibile progettare un extension audit mirato su percolation, random_matrix e zeta_zeros; qui diventa non-possibile usare il blank sottile come classe matura.\n\n## Consecutio\nIl prossimo ciclo BOUNDARY deve estendere solo i tre domini short (`percolation`, `random_matrix`, `zeta_zeros`) verso denominatore comparabile al controllo medio. Se, a denominatore esteso, restano `blank_thin_support`, allora nasce una specie autonoma. Se salgono a supporto medio o ricevono beta locale, il failure mode 15:38 viene retrocesso a telemetria di perimetro corto.\n\n## Auto-audit: source flags e 7 lenti\n- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/dnd_scenario.py --best`, report `agent_20260509_1538.md`, JSON `boundary_row_aligned_nonexact_audit_20260509_1538.json`, script `tools/exp_boundary_blank_thin_support_audit.py`, output `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.\n- **L1 hard constraint**: claim limitato alle 4 righe `support_without_beta_blank` del deposito 15:38.\n- **L2 count grezzi**: riportati 4 blank, 3 thin, 1 medium, 3/3 thin short, 1/3 thin contaminated, 1/3 thin shuffle-change, 0/3 thin autonomi.\n- **L3 no silent patching**: soglia `full_gap_floor=500` dichiarata; non esclusa `zeta_zeros` nonostante contaminazione.\n- **L4 edge cases**: `random_matrix` e' thin, short, complete e senza class-change; isola il denominatore corto dalla contaminazione.\n- **L5 re-discovery**: il ciclo non rifà il gate 15:16; legge il sotto-perimetro aperto dal report 15:38.\n- **L6 metabolismo cognitivo**: CE-0001, CE-0117, YSN e PVI usati nella combo.\n- **L7 possibile/non-possibile**: possibile = extension audit dei tre short; non-possibile = classe autonoma senza estensione.\n\n## Telemetria\n- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.\n- Verifica script: `python -m py_compile tools/exp_boundary_blank_thin_support_audit.py`.\n- Run valido: `python tools/exp_boundary_blank_thin_support_audit.py --input tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json --out tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.\n- Output: `thin_short_rows=3`, `thin_contaminated_rows=1`, `thin_shuffle_class_change_rows=1`, `thin_not_denominator_explained_rows=0`, `verdict=DENOMINATOR_LIMITED_NOT_NULL_CONTAMINATION`.\n- Git state: worktree gia' sporco da cicli e pubblicazioni precedenti; questo cycle aggiunge lo script 15:48, il JSON 15:48 e questo report.\n\n## Files\n- Script nuovo: `tools/exp_boundary_blank_thin_support_audit.py`\n- Data: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`\n- Report: `tools/data/reports/agent_20260509_1548.md`\n",
tools/data/lab_graph.json:1462:          "text": "- Nuovo strumento: `tools/exp_boundary_blank_thin_support_audit.py`.\n- Input: `tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json`.\n- Output: `tools/data/boundary_blank_thin_support_aud"
tools/data/lab_graph.json:1474:          "text": "**CONSTRAINT**.\n\nNel subset `support_without_beta_blank`, il failure mode `blank_thin_support` non regge come specie autonoma nel perimetro osservato."
tools/data/lab_graph.json:1491:      "verdict": "**CONSTRAINT**.\n\nIl frame BOUNDARY regge come support-transfer su 11/13 righe, ma la parte non-esatta non e' una coda omogenea. Le righe support-transfer senza beta 0.3 esatta sono 7 e si dividono in ",
tools/data/lab_graph.json:1492:      "verdict_en": "**CONSTRAINT**.\n\nIl frame BOUNDARY regge come support-transfer su 11/13 righe, ma la parte non-esatta non e' una coda omogenea. Le righe support-transfer senza beta 0.3 esatta sono 7 e si dividono in ",
tools/data/lab_graph.json:1495:      "content_full": "# Agent Report - Boundary Row-Aligned Nonexact Audit\n**Date**: 2026-05-09 15:38  \n**Piano**: 110  \n**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE  \n**verdict**: CONSTRAINT - le righe support-transfer non esatte sono 7, non 6; la beta cade in cinque failure modes misurabili  \nobservables_registry: 1.0.0-2026-05-06  \nobservables_used: [`beta_state`, `coordinate_failure`, `support_tier`, `beta_cardinality`, `beta_span`, `one_sided_count`, `stable_count_coherent`, `stable_count_illusory`, `endpoint_distance`, `denominator_state`, `excluded_mass`, `shuffle_z_score`] - osservabili domain-native di audit, non canonici SR/SR2/L1/L2/triple_var.  \n**observable_contract**: claim=le righe non-esatte della matrice BOUNDARY 15:32 vanno lette row-aligned senza usare label GUE/Poisson; observable=stato beta + forza supporto + telemetria denominatore/null; operator=`exp_boundary_row_aligned_nonexact_audit.py`; generator=matrice `boundary_two_axis_matrix_20260509_1532` + prescan `boundary_denominator_prescan_full_20260509_1500`; denominator=13 righe totali, 11 support-transfer, 7 support-transfer non esatte; non_possible=forzare il conteggio a 6 o trattare beta 0.3 come ascissa comune; not_tested=nuovi domini, nuovi null, nuova griglia beta, fit `V_c`.\n\n## Respiro fuori-tempo\n- **Prima impressione**: la consecutio dice \"6 righe non-esatte\", ma il deposito row-aligned ne contiene 7. Il nodo regressivo non e' scegliere quale riga escludere; e' misurare la partizione reale.\n- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + tensione \"supporto senza coordinata universale\".\n- **Dipolo / punto-zero**: beta come coordinata / supporto come passaggio; punto-zero = riga support-transfer prima che il blank beta venga interpretato.\n- **Piano superiore**: boundary operator su matrice row-aligned. Il bordo non decide con label di dominio; decide con stato beta, support tier e denominatore.\n- **Operatori laterali scelti**: boundary operator, sheaf locale/perimetro, coordinate chart. Entrano per leggere le sezioni locali della beta senza saldarle in una coordinata globale.\n- **Contaminazione cognitiva**: CE-0001 / KSAR: riuso del kernel 15:32 senza ripetere il gate; CE-0117: cascata solo sulle righe dove il supporto resta vivo; YSN DeltaLink: `two-axis matrix -> nonexact audit -> coordinate failure`; PVI: il numero atteso 6 cade davanti al deposito 7.\n- **Proto-ipotesi**: dopo la caduta di beta 0.3 universale, le righe non-esatte non formano un residuo unico. Si dividono in coordinate locali, saturazione della griglia e blank di supporto.\n- **Possibile / non-possibile**: possibile = trasformare beta da ascissa universale a chart locale auditabile; non-possibile = usare `support_transfer=true` come prova di una beta comune.\n- **Proiezione**: misurare, sulle righe support-transfer non esatte, `beta_cardinality`, `beta_span`, `one_sided_count`, `endpoint_distance`, denominatore e shuffle z-score.\n\n## Aderenza alla direzione\n- `relation`: follows_direction\n- `why`: attacca direttamente beta local non-unique, beta local other e support_without_beta_blank sul deposito row-aligned indicato.\n- `not_drift`: non usa label GUE/Poisson come operatore, non ritorna a `V_c`, non rifitta il confine; corregge il denominatore della direttiva quando il deposito mostra 7 righe.\n\n## Claim Under Test\n> Le righe BOUNDARY con supporto ma senza beta 0.3 esatta si distinguono per stato locale della beta e forza del supporto, non per label di dominio.\n\n## Question\nQuando beta 0.3 non trasferisce esattamente, il fallimento e' un unico blank o una matrice di failure modes?\n\n## Experiment Design\n- Nuovo strumento: `tools/exp_boundary_row_aligned_nonexact_audit.py`.\n- Input 1: `tools/data/boundary_two_axis_matrix_20260509_1532.json`.\n- Input 2: `tools/data/boundary_denominator_prescan_full_20260509_1500.json`.\n- Output: `tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json`.\n- Perimetro atomico: 13 righe semi-reali; subset primario = support-transfer con `beta_coordinate_transfer=false`.\n- Label policy: non legge `source_domain_type` o label GUE/Poisson come decision field.\n- Classi operative: `adjacent_beta_interval`, `beta_grid_saturation`, `coordinate_shifted`, `blank_despite_multi_observable_support`, `blank_thin_support`.\n\n## Results\n\nIndice globale:\n\n| measure | value |\n|---|---:|\n| total rows | 13 |\n| support-transfer rows | 11 |\n| beta 0.3 exact rows | 4 |\n| support-transfer nonexact rows | 7 |\n| expected nonexact rows from field | 6 |\n| fall rows | 2 |\n| exact endpoint distance mean | 3.829 |\n| nonexact endpoint distance mean | 2.957 |\n| exact one-sided count mean | 4.000 |\n| nonexact one-sided count mean | 2.714 |\n\nFailure modes:\n\n| coordinate_failure | rows |\n|---|---:|\n| adjacent_beta_interval | 1 |\n| beta_grid_saturation | 1 |\n| coordinate_shifted | 1 |\n| blank_despite_multi_observable_support | 1 |\n| blank_thin_support | 3 |\n\nAudit row-aligned:\n\n| row | beta_state | coordinate_failure | support_tier | beta | one-sided | endpoint | denominator |\n|---|---|---|---|---|---:|---:|---|\n| brownian_motion:cycle_12 | beta_0_3_local_nonunique | adjacent_beta_interval | strong_multi_observable | 0.2,0.3 | 4 | 3.885 | complete |\n| ising_2d:cycle_1 | local_beta_other | coordinate_shifted | strong_multi_observable | 0.4 | 5 | 4.309 | contaminated |\n| logistica_biforcazione:cycle_5 | beta_0_3_local_nonunique | beta_grid_saturation | medium_multi_observable | 0.1-0.9 | 3 | 3.258 | complete |\n| numeri_primi:cycle_3 | support_without_beta_blank | blank_despite_multi_observable_support | medium_multi_observable | [] | 3 | 3.243 | complete |\n| percolation:cycle_9 | support_without_beta_blank | blank_thin_support | thin_observable_support | [] | 1 | 1.705 | complete |\n| random_matrix:cycle_7 | support_without_beta_blank | blank_thin_support | thin_observable_support | [] | 1 | 1.854 | complete |\n| zeta_zeros:cycle_4 | support_without_beta_blank | blank_thin_support | thin_observable_support | [] | 2 | 2.449 | contaminated |\n\nFall controls:\n\n| row | ambiguous_beta | one-sided | stable_count_illusory | endpoint |\n|---|---|---:|---:|---:|\n| cellular_automata:cycle_8 | [] | 0 | 0.500 | 0.000 |\n| pendolo_doppio:cycle_2 | 0.3 | 3 | 0.833 | 3.388 |\n\n## Key Findings\n1. **Verificato: il sotto-perimetro non-esatto e' 7/13, non 6/13.** La direttiva del valutatore porta al nodo giusto, ma il conteggio reale nel JSON 15:32 include sette righe support-transfer senza beta 0.3 esatta.\n2. **Verificato: `support_without_beta_blank` non e' una classe unica.** `numeri_primi` ha blank con supporto medio e endpoint 3.243; `percolation`, `random_matrix`, `zeta_zeros` hanno blank con supporto sottile e endpoint 1.705-2.449.\n3. **Verificato: beta local non-unique ha due forme.** `brownian_motion` e' intervallo adiacente 0.2,0.3 con supporto forte; `logistica_biforcazione` satura tutta la griglia 0.1-0.9 con supporto medio.\n4. **Verificato: `ising_2d` non e' blank ma chart spostata.** Ha beta locale esatta 0.4, cinque osservabili one-sided e endpoint 4.309; la beta trasferisce localmente, ma non sulla coordinata 0.3.\n5. **Verificato: beta 0.3 senza supporto resta contro-controllo.** `pendolo_doppio` contiene beta 0.3 ma cade per residuo illusorio alto; la coordinata non salva il transfer.\n\n## Verdict\n**CONSTRAINT**.\n\nIl frame BOUNDARY regge come support-transfer su 11/13 righe, ma la parte non-esatta non e' una coda omogenea. Le righe support-transfer senza beta 0.3 esatta sono 7 e si dividono in cinque failure modes:\n\n`adjacent_beta_interval`, `beta_grid_saturation`, `coordinate_shifted`, `blank_despite_multi_observable_support`, `blank_thin_support`.\n\nFormula valida:\n\n`beta_coordinate_transfer` = chart locale exact 0.3 dentro supporto vivo.\n\nFormula non valida:\n\n`support_transfer non-exact = sei righe residue` oppure `support_without_beta_blank = assenza strutturale unica`.\n\nIl nodo regressivo e' il denominatore della consecutio: non bisogna salvare il \"6\"; bisogna usare il deposito row-aligned che mostra 7.\n\n## Bicono della scoperta\n- **Due radici**: coordinata beta locale / supporto ordine-null.\n- **Singolare**: riga support-transfer non exact, dove il supporto resta vivo ma la chart beta non coincide.\n- **Invariante di passaggio**: failure mode row-aligned; non label GUE/Poisson e non beta 0.3 globale.\n- **Campo di possibilita**: qui diventa possibile auditare la beta come atlante locale; qui diventa non-possibile trattare il blank beta come una sola specie.\n\n## Consecutio\nIl prossimo ciclo non deve ripetere la matrice. Deve attaccare i tre blank `support_without_beta_blank` sottili contro il blank medio `numeri_primi`: stesso stato beta, diversa forza del supporto. La domanda aperta e' se il blank sottile e' effetto del denominatore corto/contaminato oppure una specie autonoma del boundary.\n\n## Auto-audit: source flags e 7 lenti\n- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/data/seme.json`, `tools/dnd_scenario.py --best`, report `agent_20260509_1532.md`, JSON `boundary_two_axis_matrix_20260509_1532.json`, JSON `boundary_denominator_prescan_full_20260509_1500.json`, script `tools/exp_boundary_row_aligned_nonexact_audit.py`, output `tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json`.\n- **L1 hard constraint**: claim limitato alle 13 righe della matrice 15:32 e al prescan 15:00.\n- **L2 count grezzi**: riportati 11/13 support-transfer, 4/13 beta exact, 7/13 support nonexact, 2/13 fall.\n- **L3 no silent patching**: nessuna esclusione manuale per far tornare 6; mismatch dichiarato.\n- **L4 edge cases**: `pendolo_doppio` ha beta 0.3 ma cade; `ising_2d` ha beta 0.4 con supporto forte; `numeri_primi` blank non sottile.\n- **L5 re-discovery**: il ciclo non rifà gate o fit; legge solo la partizione non-esatta richiesta.\n- **L6 metabolismo cognitivo**: CE-0001, CE-0117, YSN e PVI usati nella combo.\n- **L7 possibile/non-possibile**: possibile = atlante locale delle beta; non-possibile = beta 0.3 universale o residuo non-esatto singolo.\n\n## Telemetria\n- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.\n- Verifica script: `python -m py_compile tools/exp_boundary_row_aligned_nonexact_audit.py`.\n- Run valido: `python tools/exp_boundary_row_aligned_nonexact_audit.py --matrix tools/data/boundary_two_axis_matrix_20260509_1532.json --prescan tools/data/boundary_denominator_prescan_full_20260509_1500.json --out tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json`.\n- Output: `support_nonexact_rows=7`, `fall_rows=2`, `failure_blank_thin_support=3`, `failure_blank_despite_multi_observable_support=1`.\n- Git state: worktree gia' sporco da cicli e pubblicazioni precedenti; questo cycle aggiunge lo script 15:38, il JSON 15:38 e questo report.\n\n## Files\n- Script nuovo: `tools/exp_boundary_row_aligned_nonexact_audit.py`\n- Data: `tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json`\n- Report: `tools/data/reports/agent_20260509_1538.md`\n",
tools/data/lab_graph.json:1525:          "text": "**CONSTRAINT**.\n\nIl frame BOUNDARY regge come support-transfer su 11/13 righe, ma la parte non-esatta non e' una coda omogenea. Le righe support-trans"
tools/data/lab_graph.json:1542:      "verdict": "**CONSTRAINT**.\n\nIl gate BOUNDARY trasferisce come supporto ordine/null su 11/13 righe. La coordinata beta 0.3 trasferisce esattamente su 4/13 righe. Questi due assi non coincidono.\n\nFormula valida:\n\n",
tools/data/lab_graph.json:1543:      "verdict_en": "**CONSTRAINT**.\n\nIl gate BOUNDARY trasferisce come supporto ordine/null su 11/13 righe. La coordinata beta 0.3 trasferisce esattamente su 4/13 righe. Questi due assi non coincidono.\n\nFormula valida:\n\n",
tools/data/lab_graph.json:1546:      "content_full": "# Agent Report - Boundary Two-Axis Matrix\n**Date**: 2026-05-09 15:32\n**Piano**: 109\n**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE\n**verdict**: CONSTRAINT - il gate trasferisce come supporto ordine/null; beta 0.3 non trasferisce come coordinata universale\nobservables_registry: 1.0.0-2026-05-06\nobservables_used: [`support_transfer`, `beta_coordinate_transfer`, `beta_state`, `ambiguous_beta`, `stable_count_coherent`, `stable_count_illusory`, `endpoint_distance`] - osservabili domain-native derivati dal gate semi-reale, non canonici SR/SR2/L1/L2/triple_var.\n**observable_contract**: claim=la matrice BOUNDARY semi-reale va separata in due assi: `support_transfer` e `beta_coordinate_transfer`; observable=stato row-aligned del supporto ordine/null e stato locale della beta ambigua; operator=`exp_boundary_two_axis_matrix.py`; generator=deposito `semireal_boundary_transfer_gate_20260509_1516` senza uso operativo di label GUE/Poisson; denominator=13 righe BOUNDARY semi-reali del perimetro base; non_possible=salvare il claim \"beta 0.3 universale\" quando solo 4/13 righe hanno beta 0.3 esatta; not_tested=nuovi domini, nuovi null, nuovi beta layer, fit `V_c`, limite asintotico.\n\n## Respiro fuori-tempo\n- **Prima impressione**: il falsifier del 15:16 ha indicato il nodo regressivo: la direzione chiedeva di non importare label GUE/Poisson. La correzione non e' rifare il run; e' leggere lo stesso deposito con due assi indipendenti.\n- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY semi-reale 13 righe + direzione viva \"support_transfer vs beta_coordinate_transfer\".\n- **Dipolo / punto-zero**: supporto ordine/null / coordinata beta universale; punto-zero = riga row-aligned prima che il gate venga letto come sostegno o come ascissa.\n- **Piano superiore**: grafo della conoscenza e boundary operator. Il bordo non e' una classe; e' una matrice di passaggio fra supporto e coordinata.\n- **Operatori laterali scelti**: boundary operator, graph/perimeter matrix, coordinate split. Entrano per separare l'invariante di supporto dalla coordinata locale.\n- **Contaminazione cognitiva**: CE-0001 / KSAR: riuso del kernel 15:16 senza ripetere il perimetro; CE-0117: cascata della possibilita solo dove il supporto apre un canale; YSN DeltaLink: `semi-real gate -> two-axis matrix -> beta localizzata`; PVI: il claim beta universale cade se l'esatto 0.3 non copre il denominatore.\n- **Proto-ipotesi**: `support_transfer` e `beta_coordinate_transfer` sono assi distinti. Il primo misura il passaggio ordine/null; il secondo misura solo quando beta 0.3 riappare come coordinata esatta e non come membro di un intervallo locale.\n- **Possibile / non-possibile**: possibile = usare BOUNDARY come audit row-aligned di supporto su 11/13 righe; non-possibile = trattare beta 0.3 come terzo incluso universale del perimetro semi-reale.\n- **Proiezione**: costruire una matrice 13x2: `support_transfer=true/false` e `beta_coordinate_transfer=true/false`, con stato beta locale per non fondere osservabili diverse.\n\n## Aderenza alla direzione\n- `relation`: follows_direction\n- `why`: esplicita la matrice semi-reale a due assi richiesta dal valutatore: support_transfer contro beta_coordinate_transfer sulle 13 righe.\n- `not_drift`: non usa `source_domain_type` GUE/Poisson come operatore, non ritorna a `V_c`, non rifitta label locali; legge solo stati row-aligned gia' misurati.\n\n## Claim Under Test\n> Il gate BOUNDARY semi-reale conserva `support_transfer` su molte righe, ma `beta_coordinate_transfer` vale solo dove beta 0.3 compare come coordinata esatta.\n\n## Question\nQuando le 13 righe vengono lette con due assi separati, il transfer del supporto e il transfer della beta coincidono o si scindono?\n\n## Experiment Design\n- Nuovo strumento: `tools/exp_boundary_two_axis_matrix.py`.\n- Input: `tools/data/semireal_boundary_transfer_gate_20260509_1516.json`.\n- Output: `tools/data/boundary_two_axis_matrix_20260509_1532.json`.\n- Perimetro atomico: 13 righe semi-reali gia' row-aligned dal deposito 15:16.\n- Label policy: l'operatore non legge label GUE/Poisson. Usa solo `state`, `ambiguous_beta_one_sided_gated`, osservabili one-sided, stable counts ed endpoint distance.\n- Regola asse 1: `support_transfer=true` se la riga e' `transfer_with_blank` o `transfer_no_blank`.\n- Regola asse 2: `beta_coordinate_transfer=true` solo se `support_transfer=true` e `ambiguous_beta=[0.3]` dopo normalizzazione a un decimale.\n- Contratto osservabile-operatore: il ciclo misura separazione di assi; non misura una nuova legge RMT, non rifitta `V_c`, non ricostruisce i segnali.\n\n## Results\n\nIndice globale:\n\n| measure | value |\n|---|---:|\n| rows | 13 |\n| support_transfer true | 11 |\n| support_transfer false | 2 |\n| beta_coordinate exact 0.3 | 4 |\n| beta 0.3 local non-unique | 2 |\n| beta local other | 1 |\n| support without beta blank | 4 |\n| fall no support | 2 |\n\nMatrice a due assi:\n\n| row | support_transfer | beta_coordinate_transfer | beta_state | ambiguous_beta |\n|---|---|---|---|---|\n| brownian_motion:cycle_12 | true | false | beta_0_3_local_nonunique | 0.2,0.3 |\n| cellular_automata:cycle_8 | false | false | fall_no_support | [] |\n| coupled_oscillators:cycle_10 | true | true | beta_0_3_exact | 0.3 |\n| ising_2d:cycle_1 | true | false | local_beta_other | 0.4 |\n| logistica_biforcazione:cycle_5 | true | false | beta_0_3_local_nonunique | 0.1-0.9 |\n| logistica_biforcazione_var_3.5699:cycle_13 | true | true | beta_0_3_exact | 0.3 |\n| numeri_primi:cycle_3 | true | false | support_without_beta_blank | [] |\n| pendolo_doppio:cycle_2 | false | false | fall_no_support | 0.3 |\n| percolation:cycle_9 | true | false | support_without_beta_blank | [] |\n| random_matrix:cycle_7 | true | false | support_without_beta_blank | [] |\n| reaction_diffusion:cycle_11 | true | true | beta_0_3_exact | 0.3 |\n| string_vibration:cycle_6 | true | true | beta_0_3_exact | 0.3 |\n| zeta_zeros:cycle_4 | true | false | support_without_beta_blank | [] |\n\n## Key Findings\n1. **Verificato: `support_transfer` resta 11/13.** La lettura a due assi conserva il risultato utile del 15:16 senza importare label GUE/Poisson.\n2. **Verificato: `beta_coordinate_transfer` e' 4/13.** Solo quattro righe hanno beta 0.3 esatta: `coupled_oscillators`, `logistica_biforcazione_var_3.5699`, `reaction_diffusion`, `string_vibration`.\n3. **Verificato: la beta non collassa in un solo asse.** Due righe includono 0.3 in un intervallo non unico, una riga ha beta locale 0.4, quattro trasferiscono senza blank beta, due cadono.\n4. **Verificato: `pendolo_doppio` mostra perche' beta senza supporto non basta.** Ha ambiguous beta 0.3, ma resta `fall_no_support`; la coordinata non salva il transfer.\n5. **Inferito: il nodo regressivo e' la fusione degli osservabili.** Il cycle 15:16 era valido come supporto, ma fragile quando trattava beta e supporto nello stesso claim.\n\n## Verdict\n**CONSTRAINT**.\n\nIl gate BOUNDARY trasferisce come supporto ordine/null su 11/13 righe. La coordinata beta 0.3 trasferisce esattamente su 4/13 righe. Questi due assi non coincidono.\n\nFormula valida:\n\n`BOUNDARY support_transfer` = supporto row-aligned ordine/null nel perimetro dichiarato.\n\nFormula non valida:\n\n`BOUNDARY beta_coordinate_transfer` = beta 0.3 universale del terzo incluso semi-reale.\n\nLa beta e' coordinata locale: puo' essere esatta, non unica, assente, altra, o presente in una riga che cade.\n\n## Bicono della scoperta\n- **Due radici**: supporto che passa / coordinata che pretende universalita.\n- **Singolare**: la riga row-aligned prima della lettura a due assi.\n- **Invariante di passaggio**: separazione tra supporto e coordinata; non label GUE/Poisson e non beta comune.\n- **Campo di possibilita**: qui diventa possibile usare il gate come matrice di audit `support_transfer`; qui diventa non-possibile usare beta 0.3 come coordinata universale.\n\n## Consecutio\nIl prossimo ciclo deve attaccare i quattro stati beta, non il supporto gia' separato: `beta_0_3_exact`, `beta_0_3_local_nonunique`, `local_beta_other`, `support_without_beta_blank`. La domanda aperta e' se questi stati dipendono da qualita' domain-native del segnale o dal criterio di ambiguous fraction. Non va reintrodotta la label GUE/Poisson come scorciatoia.\n\n## Auto-audit: source flags e 7 lenti\n- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/data/seme.json`, `tools/dnd_scenario.py --best`, report `agent_20260509_1516.md`, falsifier `falsifier_20260509_1516.json`, script `tools/exp_boundary_two_axis_matrix.py`, JSON `tools/data/boundary_two_axis_matrix_20260509_1532.json`.\n- **L1 hard constraint**: claim limitato alle 13 righe del deposito 15:16.\n- **L2 count grezzi**: riportati 11/13 support_transfer, 4/13 beta 0.3 esatta, 7/13 con qualsiasi beta blank sul supporto, 4/13 supporto senza beta, 2/13 fall.\n- **L3 no silent patching**: nessun ricampionamento dei domini; nuovo script di lettura del deposito.\n- **L4 edge cases**: `pendolo_doppio` ha beta 0.3 ma cade; `logistica_biforcazione` include 0.3 ma in intervallo 0.1-0.9; `ising_2d` trasferisce con beta 0.4.\n- **L5 re-discovery**: il ciclo non ripete il gate semi-reale; lo decompone nel nodo richiesto dal valutatore.\n- **L6 metabolismo cognitivo**: CE-0001, CE-0117, YSN e PVI usati nella combo.\n- **L7 possibile/non-possibile**: possibile = audit support_transfer; non-possibile = beta 0.3 universale.\n\n## Telemetria\n- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.\n- Verifica script: `python -m py_compile tools/exp_boundary_two_axis_matrix.py`.\n- Run valido: `python tools/exp_boundary_two_axis_matrix.py --input tools/data/semireal_boundary_transfer_gate_20260509_1516.json --out tools/data/boundary_two_axis_matrix_20260509_1532.json`.\n- Output: `support_transfer=11/13`, `beta_coordinate_exact_0_3=4/13`, `any_beta_blank_on_support=7/13`, `support_without_beta_blank=4/13`, `fall_no_support=2/13`.\n- Git state: worktree gia' sporco da cicli e pubblicazioni precedenti; questo cycle aggiunge solo lo script 15:32, il JSON 15:32 e questo report.\n\n## Files\n- Script nuovo: `tools/exp_boundary_two_axis_matrix.py`\n- Data: `tools/data/boundary_two_axis_matrix_20260509_1532.json`\n- Report: `tools/data/reports/agent_20260509_1532.md`\n",
tools/data/lab_graph.json:1558:          "text": "Quando le 13 righe vengono lette con due assi separati, il transfer del supporto e il transfer della beta coincidono o si scindono?"
tools/data/lab_graph.json:1576:          "text": "**CONSTRAINT**.\n\nIl gate BOUNDARY trasferisce come supporto ordine/null su 11/13 righe. La coordinata beta 0.3 trasferisce esattamente su 4/13 righe. "
tools/data/lab_graph.json:1593:      "verdict": "**CONSTRAINT**.\n\nIl gate BOUNDARY semi-reale trasferisce come supporto ordine/null in 11/13 righe. Non trasferisce come coordinata beta universale: 7 righe hanno blank, 4 trasferiscono senza blank, 2 ",
tools/data/lab_graph.json:1594:      "verdict_en": "**CONSTRAINT**.\n\nIl gate BOUNDARY semi-reale trasferisce come supporto ordine/null in 11/13 righe. Non trasferisce come coordinata beta universale: 7 righe hanno blank, 4 trasferiscono senza blank, 2 ",
tools/data/lab_graph.json:1595:      "findings": "1. **Verificato: il supporto ordine/null trasferisce in 11/13 righe.** Le righe `transfer_with_blank` e `transfer_no_blank` hanno osservabili one-sided e polo illusorio soppresso nel perimetro dichiarato.\n2. **Verificato: il blank beta non e' universale.** Solo 7/13 righe hanno ambiguous beta; 4/13 trasferiscono senza blank e 2/13 cadono.\n3. **Verificato: beta 0.3 non e' coordinata comune.** Compa",
tools/data/lab_graph.json:1597:      "content_full": "# Agent Report - Semi-real Boundary Transfer Gate\n**Date**: 2026-05-09 15:16\n**Piano**: 108\n**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE\n**verdict**: CONSTRAINT - supporto ordine/null trasferisce su 11/13, il blank beta non trasferisce come coordinata universale\nobservables_registry: 1.0.0-2026-05-06\nobservables_used: [`SR`, `SR2`, `L1`, `L2`, `triple_var`] - osservabili canonici da `tools/observables_registry.py`.\n**observable_contract**: claim=il gate `coherent/null/beta` del BOUNDARY sintetico trasferisce sul perimetro semi-reale base; observable=one-sided canonical observables, stable counts ai poli, endpoint distance e ambiguous beta; operator=`exp_semireal_boundary_transfer_gate.py`; generator=13 righe `boundary_denominator_prescan_full_20260509_1500` ricostruite da `dnd_autoricerca`; denominator=13 righe base BOUNDARY, 8 GUE-like e 5 Poisson-like, beta layers 0.0..1.0, 12 replicates, 24 shuffle baselines; non_possible=dichiarare beta 0.3 coordinata universale o transfer completo quando 2/13 righe cadono; not_tested=nuovi domini, nuovi spettri, fit `V_c`, limite asintotico.\n\n## Respiro fuori-tempo\n- **Prima impressione**: il confine semi-reale non rifiuta il gate; rifiuta la sua simmetria sintetica. Il supporto ordine/null passa, la coordinata blank si frammenta.\n- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + perimetro BOUNDARY base 13/13 transfer + tensione viva \"8 domini GUE, 5 Poisson\".\n- **Dipolo / punto-zero**: gate come supporto ordine/null / gate come coordinata beta universale; punto-zero = riga semi-reale prima che il beta layer venga chiamato blank o classe.\n- **Piano superiore**: grafo della conoscenza e boundary operator. La domanda non e' se GUE o Poisson vincono, ma se il passaggio resta morfismo quando il perimetro diventa fisico/semi-reale.\n- **Operatori laterali scelti**: boundary operator, shuffle marginal-preserving, graph/perimeter transfer. Entrano per separare copertura del denominatore, supporto d'ordine e coordinata di transizione.\n- **Contaminazione cognitiva**: YSN DeltaLink = `synthetic transfer -> semi-real row -> beta fracture`; Cornelius gene = \"Il confine trasferisce come operatore, non come ascissa\"; KSAR = reiterazione del deposito 14:44 sul perimetro fisico; PVI attack = se 2 righe cadono e 4 non hanno blank, il claim universale e' rotto; Vault = beta 0.3 resta frammento utile solo dove riappare row-aligned.\n- **Proto-ipotesi**: il BOUNDARY semi-reale conserva il supporto ordine/null in molte righe, ma il blank beta e' proprieta del perimetro, non invariante del gate.\n- **Possibile / non-possibile**: possibile = usare il gate come audit row-aligned del supporto d'ordine cross-dominio; non-possibile = promuovere beta 0.3 a coordinata universale del terzo incluso.\n- **Proiezione**: ricostruisco le 13 righe base, applico il beta replacement verso il null permutato, poi classifico ogni riga come `transfer_with_blank`, `transfer_no_blank`, o `fall`.\n\n## Aderenza alla direzione\n- `relation`: follows_direction\n- `why`: porta la direzione BOUNDARY dal sintetico controllato al perimetro cross-dominio semi-reale 8 GUE / 5 Poisson.\n- `not_drift`: non ritorna a `V_c`, fit, label locali o limite unitario; usa il deposito 14:37/14:44 solo come perimetro da falsificare.\n\n## Claim Under Test\n> Il gate BOUNDARY `coherent/null/beta` trasferisce sul perimetro semi-reale base come supporto ordine/null e come blank beta condiviso.\n\n## Question\nQuando le 13 righe base ricevono lo stesso contratto coerente/null/beta del transfer sintetico, il gate trasferisce, cade, o perde il blank comune?\n\n## Experiment Design\n- Nuovo strumento: `tools/exp_semireal_boundary_transfer_gate.py`.\n- Input: `tools/data/boundary_denominator_prescan_full_20260509_1500.json`.\n- Output: `tools/data/semireal_boundary_transfer_gate_20260509_1516.json`.\n- Perimetro atomico: 13 righe base BOUNDARY, `source_domain_type` 8 GUE-like e 5 Poisson-like.\n- Operatore: per ogni dominio ricostruisco spacings domain-native, creo beta layers contro permutation null, calcolo osservabili canonici e z original-vs-shuffle.\n- Stati: `transfer_with_blank` quando one-sided support passa e compare ambiguous beta; `transfer_no_blank` quando passa il supporto ma non compare blank; `fall` quando manca supporto o collassa il null.\n- Contratto osservabile-operatore: il ciclo misura supporto ordine/null e blank beta semi-reale; non misura nuova legge RMT, non rifitta `V_c`, non chiude QxG.\n\n## Results\n\nIndice globale:\n\n| measure | value |\n|---|---:|\n| source rows | 13 |\n| analyzed rows | 13 |\n| errors | 0 |\n| transfer_with_blank | 7 |\n| transfer_no_blank | 4 |\n| fall | 2 |\n\nRighe semi-reali:\n\n| row | source | denominator | n | state | one-sided observables | stable coherent | stable illusory | endpoint distance | ambiguous beta |\n|---|---|---|---:|---|---|---:|---:|---:|---|\n| brownian_motion:cycle_12 | Poisson | complete | 4096 | transfer_with_blank | SR2,L1,L2,triple_var | 4.000 | 0.167 | 3.885 | 0.2,0.3 |\n| cellular_automata:cycle_8 | GUE | contaminated | 108 | fall | [] | 0.000 | 0.500 | 0.000 | [] |\n| coupled_oscillators:cycle_10 | Poisson | contaminated | 2002 | transfer_with_blank | SR,SR2,L1,L2,triple_var | 5.000 | 0.250 | 4.336 | 0.3 |\n| ising_2d:cycle_1 | GUE | contaminated | 699 | transfer_with_blank | SR,SR2,L1,L2,triple_var | 5.000 | 0.333 | 4.309 | 0.4 |\n| logistica_biforcazione:cycle_5 | GUE | complete | 4096 | transfer_with_blank | SR,SR2,triple_var | 3.583 | 0.167 | 3.258 | 0.1-0.9 |\n| logistica_biforcazione_var_3.5699:cycle_13 | GUE | complete | 4096 | transfer_with_blank | SR,SR2 | 2.000 | 0.083 | 2.769 | 0.3 |\n| numeri_primi:cycle_3 | GUE | complete | 4096 | transfer_no_blank | SR,L1,triple_var | 3.000 | 0.167 | 3.243 | [] |\n| pendolo_doppio:cycle_2 | Poisson | complete | 4096 | fall | SR,SR2,L1 | 5.000 | 0.833 | 3.388 | 0.3 |\n| percolation:cycle_9 | Poisson | complete | 190 | transfer_no_blank | L1 | 0.833 | 0.333 | 1.705 | [] |\n| random_matrix:cycle_7 | GUE | complete | 199 | transfer_no_blank | L2 | 1.000 | 0.250 | 1.854 | [] |\n| reaction_diffusion:cycle_11 | GUE | contaminated | 499 | transfer_with_blank | SR,SR2,L1,L2,triple_var | 5.000 | 0.333 | 4.364 | 0.3 |\n| string_vibration:cycle_6 | Poisson | complete | 4096 | transfer_with_blank | SR,SR2,L2,triple_var | 5.000 | 0.500 | 3.845 | 0.3 |\n| zeta_zeros:cycle_4 | GUE | contaminated | 199 | transfer_no_blank | SR,L2 | 1.917 | 0.250 | 2.449 | [] |\n\n## Key Findings\n1. **Verificato: il supporto ordine/null trasferisce in 11/13 righe.** Le righe `transfer_with_blank` e `transfer_no_blank` hanno osservabili one-sided e polo illusorio soppresso nel perimetro dichiarato.\n2. **Verificato: il blank beta non e' universale.** Solo 7/13 righe hanno ambiguous beta; 4/13 trasferiscono senza blank e 2/13 cadono.\n3. **Verificato: beta 0.3 non e' coordinata comune.** Compare in 5 righe come unico blank o parte del blank, ma `ising_2d` mostra 0.4, `brownian_motion` mostra 0.2/0.3, `logistica_biforcazione` mostra 0.1-0.9, e quattro transfer non mostrano blank.\n4. **Verificato: i due fall sono diversi.** `cellular_automata` cade per assenza di osservabili one-sided; `pendolo_doppio` cade per residuo illusorio alto (0.833) pur avendo one-sided observables.\n5. **Inferito: il nodo regressivo e' la qualita del perimetro, non il null.** Il null e' disponibile su 13/13; cio' che varia e' come il dominio riceve beta.\n\n## Verdict\n**CONSTRAINT**.\n\nIl gate BOUNDARY semi-reale trasferisce come supporto ordine/null in 11/13 righe. Non trasferisce come coordinata beta universale: 7 righe hanno blank, 4 trasferiscono senza blank, 2 cadono.\n\nFormula valida:\n\n`BOUNDARY transfer` = supporto row-aligned ordine/null nel perimetro dichiarato.\n\nFormula non valida:\n\n`BOUNDARY blank` = beta 0.3 universale del terzo incluso cross-dominio.\n\n## Bicono della scoperta\n- **Due radici**: supporto ordine/null che passa / coordinata beta che si frammenta.\n- **Singolare**: la riga semi-reale prima che il gate la trasformi in transfer, blank o fall.\n- **Invariante di passaggio**: il null row-aligned resta necessario e sufficiente per misurare supporto, non per imporre la stessa ascissa di transizione.\n- **Campo di possibilita**: qui diventa possibile usare BOUNDARY come audit cross-dominio row-aligned; qui diventa non-possibile dichiarare il terzo incluso come beta comune del perimetro semi-reale.\n\n## Consecutio\nIl prossimo ciclo deve separare due livelli: `support_transfer` e `blank_coordinate`. Il primo ha supporto 11/13 nel perimetro semi-reale; il secondo richiede tipologia di dominio o nuova coordinata, perche' beta 0.3 e' stabile nel sintetico ma non nel semi-reale.\n\n## Auto-audit: source flags e 7 lenti\n- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/data/seme.json`, `tools/dnd_scenario.py --best`, report `agent_20260509_1437.md`, report `agent_20260509_1444.md`, report `agent_20260509_1457.md`, nuovo JSON `tools/data/semireal_boundary_transfer_gate_20260509_1516.json`.\n- **L1 hard constraint**: claim limitato a 13 righe base, 12 replicates, 24 shuffle baselines, osservabili canonici registry 1.0.0.\n- **L2 count grezzi**: riportati 7/13 transfer con blank, 4/13 transfer senza blank, 2/13 fall.\n- **L3 no silent patching**: il fix `numeri_primi` vive nel nuovo lettore come marcatura `is_spacings`; nessun generatore storico modificato.\n- **L4 edge cases**: `cellular_automata` ha solo 108 gaps dopo normalizzazione; `pendolo_doppio` conserva alto residuo illusorio.\n- **L5 re-discovery**: il ciclo non ripete 13/13 transfer base; testa se il beta gate sintetico passa al perimetro semi-reale.\n- **L6 metabolismo cognitivo**: YSN, Cornelius, KSAR e PVI usati nella combo; Vault conserva beta 0.3 come frammento non universale.\n- **L7 possibile/non-possibile**: possibile = audit row-aligned cross-dominio; non-possibile = blank beta universale.\n\n## Telemetria\n- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.\n- Verifica script: `python -m py_compile tools/exp_semireal_boundary_transfer_gate.py`.\n- Primo run: 12/13 analizzate, `numeri_primi` errore per doppia trasformazione dei gap.\n- Riparazione regressiva: `numeri_primi` viene marcato `is_spacings=True` nel nuovo lettore.\n- Run valido: `python tools/exp_semireal_boundary_transfer_gate.py --n-replicates 12 --n-baseline 24 --seed 202605091516 --out tools/data/semireal_boundary_transfer_gate_20260509_1516.json`.\n- Git state: worktree gia' sporco da cicli precedenti; questo cycle aggiunge lo script, il JSON 1516 e questo report.\n\n## Files\n- Script nuovo: `tools/exp_semireal_boundary_transfer_gate.py`\n- Data: `tools/data/semireal_boundary_transfer_gate_20260509_1516.json`\n- Report: `tools/data/reports/agent_20260509_1516.md`\n",
tools/data/lab_graph.json:1609:          "text": "Quando le 13 righe base ricevono lo stesso contratto coerente/null/beta del transfer sintetico, il gate trasferisce, cade, o perde il blank comune?"
tools/data/lab_graph.json:1627:          "text": "**CONSTRAINT**.\n\nIl gate BOUNDARY semi-reale trasferisce come supporto ordine/null in 11/13 righe. Non trasferisce come coordinata beta universale: 7 "
tools/data/lab_graph.json:1646:      "findings": "1. **Verificato: il claim `converge a 1 dall'alto` cade nel perimetro osservato.** 12/13 righe ammissibili hanno almeno un punto fit-ready sotto `V_c=1`.\n2. **Verificato: il canale ordinato completo attraversa il bordo.** `reference_order` fa 3/3 attraversamenti; `order_memory` per-mode-best fa 3/3 attraversamenti; tutti con denominatore `complete`.\n3. **Verificato: l'unica riga all-above e' conta",
tools/data/lab_graph.json:1648:      "content_full": "# Agent Report - Vc Unit Boundary Audit\n**Date**: 2026-05-09 14:57\n**Piano**: 107\n**Tension explored**: TENS_SCALE_TRASCENDENZA_LIMITE / TRASCENDENZA_LIMITE (0.6 / 0.9)\n**verdict**: FALSIFIED as convergence-to-1-from-above in the observed fit-ready window\nobservables_registry: 1.0.0-2026-05-06\nobservables_used: [`unit_status`, `unit_crossing_N`, `below_unit_count`, `fit_ready_rows`, `denominator_state`, `best_model`] - osservabili domain-native, non canonici SR/SR2/L1/L2/triple_var.\n**observable_contract**: claim=`V_c(phi)` converge a 1 come limite leggibile del canale ordinato; observable=relazione dei punti fit-ready con il bordo `V_c=1`; operator=`exp_vc_unit_boundary_audit.py` su deposito `vc_fit_model_gate_20260509_1400`; generator=`reference_order`, `order_memory`, `periodic_closure`, `random_dispersion`; denominator=13 righe ammissibili `complete/contaminated` del fit model gate, N={89,144,233,377}, soglie r={0.48,0.50,0.52}, livelli `per_mode_best` e `accepted_candidates`; non_possible=dichiarare convergenza a 1 dall'alto quando la curva osservata attraversa sotto 1 nel perimetro; not_tested=nuovi spettri, nuovi N, nuovi candidati, limite asintotico oltre la finestra osservata.\n\n## Respiro fuori-tempo\n- **Prima impressione**: il bordo `V_c=1` non e' attrattore osservato; e' un taglio attraversato dal canale fit-ready.\n- **Combo**: A2 confine det=-1 + A3 punto fisso come attrattore da falsificare + A9 terzo incluso + QxG continuo/discreto + grafo dei generatori + tensione `TENS_SCALE_TRASCENDENZA_LIMITE`.\n- **Dipolo / punto-zero**: convergenza a 1 / attraversamento di 1; punto-zero = la riga fit-ready prima che il bordo unitario venga trattato come limite o come taglio.\n- **Piano superiore**: grafo della conoscenza e bicono-dipoli. Il valore 1 e' nodo di bordo: decide quale arco puo' ricevere il claim di limite.\n- **Operatori laterali scelti**: boundary operator, graph cut, fit come morfismo. Entrano per separare il bordo unitario dal modello numerico.\n- **Contaminazione cognitiva**: CE-0001 / KSAR: reiterazione sul deposito 14:00 senza ricomputare spettri; CE-0117: cascata della possibilita, il claim di limite passa solo dove il bordo non e' attraversato; YSN DeltaLink: `fit-ready curve -> unit cut -> limit veto`.\n- **Proto-ipotesi**: se una curva fit-ready attraversa `V_c=1` dentro la finestra osservata, il claim \"converge a 1 dall'alto\" cade su quel perimetro; il bordo unitario resta coordinata di taglio, non attrattore.\n- **Possibile / non-possibile**: possibile = usare `V_c=1` come unit boundary audit; non-possibile = chiamarlo limite osservato quando 12/13 righe hanno punti sotto 1.\n- **Proiezione**: classifico ogni riga ammissibile come `all_above_unit`, `crosses_down_inside_window`, o `all_below_unit`, e calcolo `unit_crossing_N` per le righe che attraversano.\n\n## Claim Under Test\n> Nel perimetro fit-ready 14:00, il canale ordinato sostiene `V_c -> 1` come limite osservato dall'alto.\n\n## Question\nIl bordo `V_c=1` si comporta come attrattore della scala o come taglio attraversato dalle curve fit-ready?\n\n## Experiment Design\n- Nuovo strumento: `tools/exp_vc_unit_boundary_audit.py`.\n- Input: `tools/data/vc_fit_model_gate_20260509_1400.json`.\n- Output: `tools/data/vc_unit_boundary_audit_20260509_1457.json`.\n- Perimetro atomico: 13 righe ammissibili del model gate, gia' filtrate da `denominator_state in {complete, contaminated}`.\n- Operatore: per ogni riga ordino i punti `(N, V_c)`, conto i valori sotto 1, e interpolo il primo attraversamento del bordo unitario quando avviene tra due N consecutivi.\n- Contratto osservabile-operatore: il ciclo misura il bordo unitario sul deposito 14:00; non misura nuovi N, non testa l'asintoto, non ripara il fit.\n\n## Results\n\nIndice globale:\n\n| measure | value |\n|---|---:|\n| admissible rows audited | 13 |\n| rows with any `V_c < 1` | 12 |\n| `crosses_down_inside_window` | 9 |\n| `all_below_unit` | 3 |\n| `all_above_unit` | 1 |\n\nStati per classe generatore:\n\n| generator_class | all_above | crosses_down | all_below |\n|---|---:|---:|---:|\n| reference_order | 0 | 3 | 0 |\n| order_memory | 1 | 5 | 0 |\n| periodic_closure | 0 | 1 | 2 |\n| random_dispersion | 0 | 0 | 1 |\n\nCanale ordinato, righe complete/contaminate:\n\n| row | state | fit_ready/total | excluded | first V_c | last V_c | unit status | crossing N |\n|---|---|---:|---:|---:|---:|---|---:|\n| per_mode_best:reference_order:r0.48 | complete | 16/16 | 0 | 1.311 | 0.955 | crosses_down | 348.753 |\n| per_mode_best:reference_order:r0.50 | complete | 16/16 | 0 | 1.191 | 0.879 | crosses_down | 276.876 |\n| per_mode_best:reference_order:r0.52 | complete | 16/16 | 0 | 1.072 | 0.807 | crosses_down | 151.973 |\n| per_mode_best:order_memory:r0.48 | complete | 48/48 | 0 | 1.432 | 0.893 | crosses_down | 315.760 |\n| per_mode_best:order_memory:r0.50 | complete | 48/48 | 0 | 1.317 | 0.774 | crosses_down | 255.737 |\n| per_mode_best:order_memory:r0.52 | complete | 48/48 | 0 | 1.218 | 0.688 | crosses_down | 188.585 |\n| accepted_candidates:order_memory:r0.48 | contaminated | 273/279 | 6 | 1.474 | 1.069 | all_above | blank |\n| accepted_candidates:order_memory:r0.50 | contaminated | 278/279 | 1 | 1.350 | 0.899 | crosses_down | 332.733 |\n| accepted_candidates:order_memory:r0.52 | complete | 279/279 | 0 | 1.236 | 0.781 | crosses_down | 272.895 |\n\nPrimi attraversamenti del bordo:\n\n| row | crossing N |\n|---|---:|\n| per_mode_best:periodic_closure:r0.48 | 105.734 |\n| per_mode_best:reference_order:r0.52 | 151.973 |\n| per_mode_best:order_memory:r0.52 | 188.585 |\n| per_mode_best:order_memory:r0.50 | 255.737 |\n| accepted_candidates:order_memory:r0.52 | 272.895 |\n| per_mode_best:reference_order:r0.50 | 276.876 |\n| per_mode_best:order_memory:r0.48 | 315.760 |\n| accepted_candidates:order_memory:r0.50 | 332.733 |\n\n## Key Findings\n1. **Verificato: il claim `converge a 1 dall'alto` cade nel perimetro osservato.** 12/13 righe ammissibili hanno almeno un punto fit-ready sotto `V_c=1`.\n2. **Verificato: il canale ordinato completo attraversa il bordo.** `reference_order` fa 3/3 attraversamenti; `order_memory` per-mode-best fa 3/3 attraversamenti; tutti con denominatore `complete`.\n3. **Verificato: l'unica riga all-above e' contaminata.** `accepted_candidates:order_memory:r0.48` resta sopra 1, ma ha 273/279 righe fit-ready e 6 righe escluse; non puo' sostenere da sola il claim hard.\n4. **Verificato: `periodic_closure` e `random_dispersion` non salvano il limite.** Due righe `periodic_closure` e una `random_dispersion` sono gia' tutte sotto 1; il loro denominatore era contaminato e non appartiene al canale ordinato completo.\n5. **Inferito: il nodo regressivo non e' scegliere un nuovo modello di fit.** Il bordo unitario va promosso a veto osservabile prima del claim di limite.\n\n## Verdict\n**FALSIFIED** nel perimetro osservato.\n\n`V_c=1` non opera come limite osservato dall'alto sulle righe fit-ready 14:00. Opera come bordo attraversato. Il canale ordinato resta fittabile e lineare nel perimetro, ma proprio quel canale scende sotto 1: `reference_order` 3/3 e `order_memory` per-mode-best 3/3 attraversano il bordo dentro N={89,144,233,377}.\n\nLa formulazione valida diventa:\n\n`V_c=1` e' un unit boundary audit del sottografo fit-ready; non e' attrattore verificato della scala nel perimetro 14:00.\n\n## Bicono della scoperta\n- **Due radici**: limite unitario / attraversamento unitario.\n- **Singolare**: la curva fit-ready prima che `1` sia interpretato come attrattore o come taglio.\n- **Invariante di passaggio**: la disponibilita del denominatore completo sopravvive; il claim di convergenza a 1 non sopravvive.\n- **Campo di possibilita**: qui diventa possibile usare `V_c=1` come veto strutturale nei futuri fit; qui diventa non-possibile formulare `V_c(phi) -> 1` come claim osservato dall'alto su questo perimetro.\n\n## Consecutio\nIl prossimo ciclo che estende N deve partire dal veto unitario: se N piu' alti vengono calcolati, il claim non e' \"converge a 1\", ma \"dopo l'attraversamento, la curva resta sotto 1, rientra, o cambia famiglia\". Il denominatore da preservare e' `complete + unit_status`, non solo `fit_ready`.\n\n## Auto-audit: source flags e 7 lenti\n- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/data/seme.json`, `tools/dnd_scenario.py --best`, report `agent_20260509_1337.md`, report `agent_20260509_1400.md`, JSON `tools/data/vc_fit_model_gate_20260509_1400.json`, nuovo JSON `tools/data/vc_unit_boundary_audit_20260509_1457.json`.\n- **L1 hard constraint**: il verdict vale solo per le 13 righe ammissibili del deposito 14:00 e N={89,144,233,377}.\n- **L2 count grezzi**: riportati 12/13 sotto 1, 9/13 attraversamenti, 1/13 sopra 1, 3/13 tutte sotto 1.\n- **L3 no silent patching**: nessun nuovo spettro, nessun nuovo N usato come evidenza, nessuna modifica ai depositi 13:37/14:00.\n- **L4 edge cases**: l'unica riga sopra 1 e' contaminata con 6 esclusioni; non chiude il claim hard.\n- **L5 re-discovery**: il finding non ripete \"V_c scende\"; misura il bordo unitario come veto atomico.\n- **L6 metabolismo cognitivo**: CE-0001, CE-0117 e YSN usati nella combo.\n- **L7 possibile/non-possibile**: possibile = unit boundary audit; non-possibile = convergenza a 1 dall'alto nel perimetro osservato.\n\n## Telemetria\n- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.\n- Verifica script: `python -m py_compile tools/exp_vc_unit_boundary_audit.py`.\n- Run valido: `python tools/exp_vc_unit_boundary_audit.py --input tools/data/vc_fit_model_gate_20260509_1400.json --out tools/data/vc_unit_boundary_audit_20260509_1457.json`.\n- Un tentativo di ricomputo esteso su N alti non ha prodotto deposito leggibile in tempo utile e non e' usato come evidenza.\n- Git state: worktree gia' sporco da cicli precedenti; questo cycle aggiunge solo lo script unit-boundary, il JSON 1457 e questo report.\n\n## Files\n- Script nuovo: `tools/exp_vc_unit_boundary_audit.py`\n- Data: `tools/data/vc_unit_boundary_audit_20260509_1457.json`\n- Report: `tools/data/reports/agent_20260509_1457.md`\n",
tools/data/lab_graph.json:1750:      "content_full": "# Agent Report - Residual Boundary Closure\n**Date**: 2026-05-09 14:37\n**Piano**: 105\n**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE\n**verdict**: COMPLETE DENOMINATOR TRANSFER on base BOUNDARY perimeter\nobservables_registry: 1.0.0-2026-05-06\nobservables_used: [`spacing_r`, `shuffle_r_statistic`, `denominator_state`, `excluded_mass`, `transfer`] - osservabili domain-native per il gate boundary, non canonici SR/SR2/L1/L2/triple_var.\n**observable_contract**: claim=il residual blank test decide se i 3 blank residui BOUNDARY entrano nel transfer; observable=`spacing_r` originale contro permutation null row-aligned; operator=`exp_boundary_blank_null_audit.py` + `exp_boundary_denominator_prescan.py`; generator=`dnd_autoricerca.genera_segnale` per `string_vibration`, `reaction_diffusion`, `logistica_biforcazione_var_3.5699`; denominator=13 righe base autoricerca 8 GUE-like / 5 Poisson-like; non_possible=dichiarare chiusura QxG, nuova legge GUE/Poisson, o complete `reaction_diffusion` con 499 gap; not_tested=fit `V_c`, nuovi spettri, nuovi domini.\n\n## Respiro fuori-tempo\n- **Prima impressione**: il blank residuo non segnala una classe mancante; segnala l'assenza del contro-perimetro. Quando il null entra, il bordo base non ha piu' blank.\n- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + nodo BOUNDARY 8 GUE / 5 Poisson + tensione `TRASCENDENZA_LIMITE`.\n- **Dipolo / punto-zero**: blank / transfer; punto-zero = riga domain/window prima della disponibilita del null row-aligned.\n- **Piano superiore**: grafo della conoscenza e boundary operator. Il gate decide copertura del denominatore, non ontologia GUE/Poisson.\n- **Operatori laterali scelti**: boundary operator, shuffle marginal-preserving, flusso/PDE come controllo di non-determinismo per `reaction_diffusion`.\n- **Contaminazione cognitiva**: CE-0001 / KSAR: reiterazione sul deposito esistente; CE-0117: cascata della possibilita solo dove il null apre il canale; YSN DeltaLink: `blank residuo -> null row-aligned -> transfer completo`.\n- **Proto-ipotesi**: il perimetro BOUNDARY base diventa completo quando ogni riga ha un null row-aligned leggibile; la classe resta attributo sorgente, non esito del gate.\n- **Possibile / non-possibile**: possibile = contratto BOUNDARY 13/13 transfer sul perimetro base; non-possibile = usare questa copertura per chiudere QxG, per chiamare legge il cambio classe della logistica, o per trattare `reaction_diffusion` come complete.\n- **Proiezione**: verificare `boundary_blank_null_audit_residual_20260509_1500.json`, innestarlo nel prescan pieno e controllare `boundary_denominator_prescan_full_20260509_1500.json`.\n\n## Claim Under Test\n> Il residual blank test trasforma i 3 blank residui in transfers; il perimetro BOUNDARY base passa a 13/13 transfer, 0 blank, 0 falls, ma resta un contratto di denominatore e non una chiusura QxG.\n\n## Question\nI tre blank residui `string_vibration:cycle_6`, `reaction_diffusion:cycle_11`, `logistica_biforcazione_var_3.5699:cycle_13` restano blank, cadono, o entrano nel transfer quando ricevono null row-aligned?\n\n## Experiment Design\n- Strumenti usati: `tools/exp_boundary_blank_null_audit.py` e `tools/exp_boundary_denominator_prescan.py`.\n- Input verificati: `tools/data/boundary_blank_null_audit_residual_20260509_1500.json` e `tools/data/boundary_denominator_prescan_full_20260509_1500.json`.\n- Perimetro atomico: 13 righe base, 8 GUE-like e 5 Poisson-like.\n- Null baseline: permutation null marginal-preserving sui gap/spacings, `n_shuffle=1000`, seed `202605091500`.\n- Contratto osservabile-operatore: il ciclo misura copertura del denominatore; non rifitta `V_c`, non aggiunge domini, non chiude QxG.\n\n## Results\n\nResidual blank audit depositato:\n\n| domain | n_gaps | r_original | shuffle_mean | z | class | ordering_dependent | decision |\n|---|---:|---:|---:|---:|---|---|---|\n| string_vibration | 7999 | 0.383868 | 0.372199 | 4.562844 | Poisson -> Poisson | true | transfer complete |\n| reaction_diffusion | 499 | 0.762604 | 0.494932 | 31.390192 | GUE -> GUE | true | transfer contaminato |\n| logistica_biforcazione_var_3.5699 | 4727 | 0.581221 | 0.099640 | 161.271569 | GUE -> Poisson | true | transfer complete, class_change edge case |\n\nPrescan pieno dopo innesto dei null:\n\n| measure | value |\n|---|---:|\n| rows | 13 |\n| source GUE | 8 |\n| source Poisson | 5 |\n| transfers | 13 |\n| blank | 0 |\n| falls | 0 |\n| complete | 8 |\n| contaminated | 5 |\n\nRighe residue nel prescan:\n\n| domain/window | source | denominator_state | excluded mass | null | transfer |\n|---|---|---|---:|---|---|\n| string_vibration:cycle_6 | Poisson | complete | 0.000 | shuffle z=4.56; class_change=False | transfers |\n| reaction_diffusion:cycle_11 | GUE | contaminated | 0.002 | shuffle z=31.39; class_change=False | transfers |\n| logistica_biforcazione_var_3.5699:cycle_13 | GUE | complete | 0.000 | shuffle z=161.27; class_change=True | transfers |\n\n## Key Findings\n1. **Verificato: i 3 blank residui diventano transfers.** Il prescan pieno produce 13/13 transfers, 0 blank, 0 falls.\n2. **Verificato: `reaction_diffusion` non e' complete.** Ha 499 gap, quindi resta `contaminated` con excluded mass 0.002; un gap sotto soglia basta a impedire la formula complete.\n3. **Verificato: `string_vibration` trasferisce senza cambio classe.** Poisson -> Poisson, `ordering_dependent=true`, `n_gaps=7999`.\n4. **Verificato: `logistica_biforcazione_var_3.5699` trasferisce con `class_change=true`.** Il cambio GUE -> Poisson e' edge case del null, non legge nuova legge.\n5. **Verificato: il gate BOUNDARY ha copertura completa sul perimetro base.** La copertura riguarda il denominatore row-aligned, non il ponte QxG.\n\n## Verdict\n**COMPLETE DENOMINATOR TRANSFER**.\n\nIl residual blank test trasforma i 3 blank residui in transfers; il perimetro BOUNDARY base passa a 13/13 transfer, 0 blank, 0 falls, ma resta un contratto di denominatore e non una chiusura QxG.\n\nIl gate ha copertura completa sul perimetro base: ogni riga domain/window possiede un null leggibile o contaminato dichiarato. La completezza del gate non coincide con completezza fisica delle righe: `reaction_diffusion` resta contaminato per 499 gap, `zeta_zeros` resta contaminato per 199 gap, e `logistica_biforcazione_var_3.5699` non produce una legge dal suo `class_change=true`.\n\n## Bicono della scoperta\n- **Due radici**: blank senza contro-perimetro / transfer con null row-aligned.\n- **Singolare**: la riga BOUNDARY prima che il denominatore decida.\n- **Invariante di passaggio**: disponibilita del null leggibile; non l'etichetta GUE/Poisson e non il fit `V_c`.\n- **Campo di possibilita**: qui diventa possibile usare BOUNDARY come gate base 13/13 per audit successivi; qui diventa non-possibile spacciare il gate come chiusura QxG o legge RMT.\n\n## Consecutio\nLa prossima mossa non e' rifare `V_c` e non e' chiudere QxG. Il risultato apre un uso piu' stretto del gate: ogni futuro claim BOUNDARY puo' partire dal perimetro base senza blank, ma deve portare con se' lo stato `complete/contaminated` e dichiarare gli edge case. Il nodo regressivo rimasto e' la qualita del denominatore, non la sua assenza.\n\n## Auto-audit: source flags e 7 lenti\n- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/dnd_scenario.py --best`, `tools/data/boundary_blank_null_audit_residual_20260509_1500.json`, `tools/data/boundary_denominator_prescan_full_20260509_1500.json`, run di verifica in `/tmp`.\n- **L1 hard constraint**: nessun universale fuori perimetro; il claim vale per 13 righe base autoricerca.\n- **L2 count grezzi**: riportati 13/13 transfer, 0/13 blank, 0/13 falls, 8 complete, 5 contaminated.\n- **L3 no silent patching**: nessun fit `V_c`, nessun cambio degli artefatti sorgente; verifica su output temporanei.\n- **L4 edge cases**: `reaction_diffusion` contaminato per 499 gap; `logistica_biforcazione_var_3.5699` ha class_change=true ma non diventa legge.\n- **L5 re-discovery**: il ciclo e' audit di denominatore residuo, non teorema GUE/Poisson.\n- **L6 metabolismo cognitivo**: CE-0001, CE-0117 e YSN usati nella combo.\n- **L7 possibile/non-possibile**: possibile = gate base 13/13 senza blank; non-possibile = QxG chiuso o completezza fisica delle righe contaminate.\n\n## Telemetria\n- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.\n- Verifica script: `python -m py_compile tools/exp_boundary_blank_null_audit.py tools/exp_boundary_denominator_prescan.py`.\n- Run valido: `python tools/exp_boundary_blank_null_audit.py --domains string_vibration reaction_diffusion logistica_biforcazione_var_3.5699 --n-shuffle 1000 --seed 202605091500 --out /tmp/boundary_blank_null_audit_residual_20260509_1500.verify.json`.\n- Run valido: `python tools/exp_boundary_denominator_prescan.py --extra-null-audit tools/data/boundary_blank_null_audit_20260509_1430.json --extra-null-audit tools/data/boundary_blank_null_audit_residual_20260509_1500.json --out /tmp/boundary_denominator_prescan_full_20260509_1500.verify.json`.\n- Compare prescan: summary e rows combaciano con `tools/data/boundary_denominator_prescan_full_20260509_1500.json`.\n- Compare residual audit: `string_vibration` e `logistica_biforcazione_var_3.5699` combaciano sui numeri depositati; `reaction_diffusion` nel rerun produce `r=0.755661`, `z=30.592858` invece di `r=0.762604`, `z=31.390192`, ma conserva `n_gaps=499`, `GUE -> GUE`, `ordering_dependent=true`, `transfer=contaminated`. Il drift e' attribuito al generatore dinamico, non al null seed.\n\n## Files\n- Script: `tools/exp_boundary_blank_null_audit.py`\n- Script: `tools/exp_boundary_denominator_prescan.py`\n- Data: `tools/data/boundary_blank_null_audit_residual_20260509_1500.json`\n- Data: `tools/data/boundary_denominator_prescan_full_20260509_1500.json`\n- Report: `tools/data/reports/agent_20260509_1437.md`\n",
tools/data/lab_graph.json:1801:      "content_full": "# Agent Report - Blank Pair Null Transfer\n**Date**: 2026-05-09 14:27\n**Piano**: 104\n**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE\n**verdict**: CONFIRMED TRANSFER on blank-pair test\nobservables_registry: 1.0.0-2026-05-06\nobservables_used: [`spacing_r`, `shuffle_r_statistic`, `denominator_state`, `excluded_mass`, `transfer`] - osservabili domain-native per il gate boundary, non canonici SR/SR2/L1/L2/triple_var.\n**observable_contract**: claim=il blank-pair test decide se due righe BOUNDARY senza null entrano nel transfer; observable=`spacing_r` originale contro permutation null row-aligned; operator=`exp_boundary_blank_null_audit.py` + prescan row-aligned; generator=`dnd_autoricerca.genera_segnale` per `zeta_zeros` e `pendolo_doppio`; denominator=13 righe base autoricerca 8 GUE-like / 5 Poisson-like; non_possible=dichiarare complete `zeta_zeros` con soli 199 gap o dichiarare cambio classe su `pendolo_doppio`; not_tested=fit `V_c`, nuovi spettri, nuova legge GUE/Poisson, chiusura QxG.\n\n## Respiro fuori-tempo\n- **Prima impressione**: il blank non e' vuoto del dominio; e' mancanza del contro-perimetro. Quando il null entra, il bordo decide senza cambiare classe.\n- **Combo**: A2 confine det=-1 + A9 terzo incluso + QxG continuo/discreto + nodo BOUNDARY 8 GUE / 5 Poisson + tensione `TRASCENDENZA_LIMITE`.\n- **Dipolo / punto-zero**: blank / transfer; punto-zero = stessa riga domain/window prima della disponibilita del null row-aligned.\n- **Piano superiore**: grafo della conoscenza e boundary operator. Il bordo non classifica GUE o Poisson; filtra quali righe hanno denominatore sufficiente.\n- **Operatori laterali scelti**: boundary operator, shuffle marginal-preserving, grafo row-aligned. Entrano per separare osservabile locale, null e transfer senza nuovo fit.\n- **Contaminazione cognitiva**: CE-0001 / KSAR: reiterazione sul deposito esistente; CE-0117: cascata della possibilita solo dove il null apre il canale; YSN DeltaLink: `blank row -> null availability -> transfer`.\n- **Proto-ipotesi**: un blank BOUNDARY diventa transfer quando possiede un null row-aligned leggibile; la classe sorgente resta controllo, non risposta.\n- **Possibile / non-possibile**: possibile = trasferire il gate a righe ex-blank con null disponibile; non-possibile = usare la stessa misura per chiamare `zeta_zeros` complete o `pendolo_doppio` cambio classe.\n- **Proiezione**: verificare `boundary_blank_null_audit_20260509_1430.json` e reinnestarlo nel prescan `boundary_denominator_prescan_20260509_1430.json`.\n\n## Claim Under Test\n> Il blank-pair test trasforma `zeta_zeros` e `pendolo_doppio` da blank a transfers; il perimetro BOUNDARY passa da 8/13 a 10/13 transfer, con 3 blank residui e 0 falls.\n\n## Question\nIl null row-aligned per una coppia blank GUE/Poisson decide `blank -> transfers`, `blank -> falls` o `blank remains blank`?\n\n## Experiment Design\n- Strumenti usati: `tools/exp_boundary_blank_null_audit.py` e `tools/exp_boundary_denominator_prescan.py`.\n- Input verificati: `tools/data/boundary_blank_null_audit_20260509_1430.json` e `tools/data/boundary_denominator_prescan_20260509_1430.json`.\n- Perimetro atomico: 13 righe base, 8 GUE-like e 5 Poisson-like.\n- Null baseline: permutation null marginal-preserving sui gap/spacings, `n_shuffle=1000`, seed `202605091430`.\n- Contratto osservabile-operatore: il ciclo misura disponibilita e comportamento del null, non rifitta `V_c`; `zeta_zeros` resta contaminated per massa debole; `pendolo_doppio` resta Poisson -> Poisson con ordering dependence forte.\n\n## Results\n\nBlank-pair audit:\n\n| domain | n_gaps | r_original | shuffle_mean | z | class | ordering_dependent | decision |\n|---|---:|---:|---:|---:|---|---|---|\n| zeta_zeros | 199 | 0.615009 | 0.641885 | -2.310593 | GUE -> GUE | false | transfer contaminato |\n| pendolo_doppio | 5008 | 0.386104 | 0.292437 | 27.919656 | Poisson -> Poisson | true | transfer complete |\n\nPrescan dopo innesto del null:\n\n| measure | value |\n|---|---:|\n| rows | 13 |\n| source GUE | 8 |\n| source Poisson | 5 |\n| transfers | 10 |\n| blank | 3 |\n| falls | 0 |\n| complete | 6 |\n| contaminated | 4 |\n| absent | 3 |\n\nBlank residui: `string_vibration:cycle_6`, `reaction_diffusion:cycle_11`, `logistica_biforcazione_var_3.5699:cycle_13`.\n\n## Key Findings\n1. **Verificato: il blank-pair test trasforma entrambe le righe da blank a transfers.** `zeta_zeros` e `pendolo_doppio` hanno null row-aligned leggibile e quindi non restano blank.\n2. **Verificato: il transfer non cambia la classe.** `zeta_zeros` resta GUE -> GUE; `pendolo_doppio` resta Poisson -> Poisson.\n3. **Verificato: `zeta_zeros` non e' complete.** Ha solo 199 gap, sotto soglia 500, quindi entra come `contaminated/transfers` con excluded mass 0.602.\n4. **Verificato: `pendolo_doppio` e' complete e ordering-dependent.** Ha 5008 gap, z=27.919656, class_change=false; non diventa una classe nuova.\n5. **Verificato: il perimetro BOUNDARY passa da 8/13 a 10/13 transfer.** Restano 3 blank e nessun fall.\n\n## Verdict\n**CONFIRMED TRANSFER**.\n\nIl blank-pair test trasforma `zeta_zeros` e `pendolo_doppio` da blank a transfers; il perimetro BOUNDARY passa da 8/13 a 10/13 transfer, con 3 blank residui e 0 falls.\n\nQuesto non chiude QxG, non dichiara una nuova legge GUE/Poisson e non rifitta `V_c`. Il risultato decide il denominatore: quando il null row-aligned esiste, il blank diventa transfer; quando manca, resta blank.\n\n## Bicono della scoperta\n- **Due radici**: blank senza contro-perimetro / transfer con null row-aligned.\n- **Singolare**: la riga domain/window prima della decisione del gate.\n- **Invariante di passaggio**: il null row-aligned decide il passaggio; la classe GUE/Poisson non viene riscritta.\n- **Campo di possibilita**: qui diventa possibile restringere il contro-perimetro BOUNDARY a 3 blank residui; qui diventa non-possibile trattare `zeta_zeros` come complete o `pendolo_doppio` come cambio classe.\n\n## Consecutio\nLa prossima mossa BOUNDARY non e' un fit `V_c`: e' costruire o recuperare null row-aligned per `string_vibration`, `reaction_diffusion` e `logistica_biforcazione_var_3.5699`. Il confine ora ha 10 righe trasferite e un contro-perimetro residuo esplicito.\n\n## Auto-audit: source flags e 7 lenti\n- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/dnd_scenario.py --best`, `tools/data/boundary_blank_null_audit_20260509_1430.json`, `tools/data/boundary_denominator_prescan_20260509_1430.json`, run di verifica in `/tmp`.\n- **L1 hard constraint**: nessun universale fuori perimetro; il claim vale per 13 righe base e per i due null innestati.\n- **L2 count grezzi**: riportati 10/13 transfer, 3/13 blank, 0/13 falls.\n- **L3 no silent patching**: nessun fit `V_c`, nessun cambio degli artefatti sorgente; verifica su output temporanei.\n- **L4 edge cases**: `zeta_zeros` contaminato per `n_gaps=199`; `pendolo_doppio` complete ma non cambio classe.\n- **L5 re-discovery**: il ciclo e' audit di denominatore, non teorema RMT.\n- **L6 metabolismo cognitivo**: CE-0001, CE-0117 e YSN usati nella combo.\n- **L7 possibile/non-possibile**: possibile = transfer ex-blank con null; non-possibile = claim su blank residui senza null.\n\n## Telemetria\n- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.\n- Verifica script: `python -m py_compile tools/exp_boundary_blank_null_audit.py tools/exp_boundary_denominator_prescan.py`.\n- Run valido: `python tools/exp_boundary_blank_null_audit.py --domains zeta_zeros pendolo_doppio --n-shuffle 1000 --seed 202605091430 --out /tmp/boundary_blank_null_audit_20260509_1430.verify.json`.\n- Run valido: `python tools/exp_boundary_denominator_prescan.py --extra-null-audit tools/data/boundary_blank_null_audit_20260509_1430.json --out /tmp/boundary_denominator_prescan_20260509_1430.verify.json`.\n- Compare: gli output temporanei combaciano con gli artefatti depositati, ignorando solo `generated_at` nel null audit.\n\n## Files\n- Script: `tools/exp_boundary_blank_null_audit.py`\n- Script: `tools/exp_boundary_denominator_prescan.py`\n- Data: `tools/data/boundary_blank_null_audit_20260509_1430.json`\n- Data: `tools/data/boundary_denominator_prescan_20260509_1430.json`\n- Report: `tools/data/reports/agent_20260509_1427.md`\n",
tools/data/lab_graph.json:1850:      "findings": "1. **Verificato: il gate trasferisce su 8/13 righe del perimetro.** Il transfer non coincide con GUE o Poisson: include 5 sorgenti GUE e 3 sorgenti Poisson perche' la condizione e' disponibilita del null, non etichetta di classe.\n2. **Verificato: 5/13 righe restano blank strutturale.** `pendolo_doppio`, `zeta_zeros`, `string_vibration`, `reaction_diffusion`, `logistica_biforcazione_var_3.5699` han",
tools/data/lab_graph.json:1852:      "content_full": "# Agent Report - Boundary Denominator Prescan\n**Date**: 2026-05-09 14:09\n**Piano**: 103\n**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE\n**verdict**: PARTIAL TRANSFER with structural blank counter-perimeter\nobservables_registry: 1.0.0-2026-05-06\nobservables_used: [`denominator_state`, `excluded_mass`, `spacing_r`, `shuffle_r_statistic`, `transfer`] - osservabili domain-native per il gate boundary, non canonici SR/SR2/L1/L2/triple_var.\n**observable_contract**: claim=`denominator_state` puo' trasferire oltre `V_c` solo dove la riga domain/window ha osservabile definito e null/surrogate row-aligned; observable=`spacing_r` + availability del null shuffle; operator=prescan sui 13 domini base del deposito autoricerca, non fit parametrico; generator=perimetro 8 GUE-like / 5 Poisson-like dei cycle 1..13; denominator=`boundary_shuffle_audit` quando presente; non_possible=dichiarare transfer nei domini senza null/surrogate; not_tested=nuovi spettri, nuovi domini, fit `V_c`, famiglia AICc, QxG chiuso.\n\n## Respiro fuori-tempo\n- **Prima impressione**: il confine non chiede se il dominio e' GUE o Poisson; chiede se la riga ha un denominatore capace di sostenere un claim.\n- **Combo**: A2 confine det=-1 + A9 terzo incluso + QxG continuo/discreto + nodo BOUNDARY del grafo + tensione `TRASCENDENZA_LIMITE`.\n- **Dipolo / punto-zero**: classificato / non aggregabile; punto-zero = riga domain/window prima che il null decida se l'osservabile puo' viaggiare.\n- **Piano superiore**: grafo della conoscenza e boundary operator. Il bordo e' una filtrazione: prima osservabile, poi null, poi claim.\n- **Proto-ipotesi**: `denominator_state` trasferisce oltre `V_c` se separa riga misurabile, massa contaminata e blank senza usare GUE/Poisson come risposta.\n- **Possibile / non-possibile**: possibile = claim boundary su righe con null row-aligned; non-possibile = claim di transfer nei domini senza null, anche quando `spacing_r` locale esiste.\n- **Proiezione**: creare `tools/exp_boundary_denominator_prescan.py` e misurare 13 righe base: domain/window, source type, denominator_state, excluded mass, observable, null/surrogate, transfer.\n\n## Contaminazione cognitiva\n- **CE-0001 / KSAR**: reiterazione sul deposito invece di nuovo fit locale `V_c`.\n- **CE-0117**: cascata della possibilita; il claim passa solo dove il null apre il canale.\n- **YSN DeltaLink**: `domain row -> null availability -> transfer`, non `GUE/Poisson -> risposta`.\n\n## Claim Under Test\n> Nel perimetro BOUNDARY 8 GUE / 5 Poisson, il gate `denominator_state` trasferisce oltre `V_c` solo se identifica le righe con null/surrogate disponibile e lascia blank le righe senza contro-perimetro.\n\n## Experiment Design\n- Nuovo strumento: `tools/exp_boundary_denominator_prescan.py`.\n- Input: `tools/data/autoricerca_journal.json` e `tools/data/boundary_shuffle_audit.json`.\n- Output: `tools/data/boundary_denominator_prescan_20260509_1409.json`.\n- Perimetro atomico: cycle base `1..13`, esattamente 13 righe: 8 GUE-like, 5 Poisson-like.\n- Stati:\n  - `complete`: osservabile definito + null shuffle presente con `n_gaps >= 500`.\n  - `contaminated`: osservabile definito + null presente ma massa debole dichiarata (`n_gaps < 500`).\n  - `absent`: osservabile locale presente ma null/surrogate assente, oppure osservabile assente.\n  - `broken`: null presente ma non leggibile; non emerso in questo run.\n- Transfer:\n  - `transfers`: `complete` o `contaminated` con null presente.\n  - `blank`: osservabile locale presente ma null assente.\n  - `falls`: osservabile assente o null rotto.\n\n## Results\n\nIndice globale:\n\n| measure | value |\n|---|---:|\n| rows | 13 |\n| source GUE | 8 |\n| source Poisson | 5 |\n| transfers | 8 |\n| blank | 5 |\n| falls | 0 |\n| complete | 5 |\n| contaminated | 3 |\n| absent | 5 |\n\nTabella prescan:\n\n| domain/window | source | denominator_state | excluded mass | observable | null/surrogate | transfer |\n|---|---|---|---:|---|---|---|\n| ising_2d:cycle_1 | GUE | contaminated | 0.810 | spacing_r=0.902 | shuffle z=-0.10; class_change=False | transfers |\n| pendolo_doppio:cycle_2 | Poisson | absent | 1.000 | spacing_r=0.386 | absent | blank |\n| numeri_primi:cycle_3 | GUE | complete | 0.000 | spacing_r=0.886 | shuffle z=-26.60; class_change=False | transfers |\n| zeta_zeros:cycle_4 | GUE | absent | 1.000 | spacing_r=0.615 | absent | blank |\n| logistica_biforcazione:cycle_5 | GUE | complete | 0.000 | spacing_r=0.997 | shuffle z=61.60; class_change=False | transfers |\n| string_vibration:cycle_6 | Poisson | absent | 1.000 | spacing_r=0.384 | absent | blank |\n| random_matrix:cycle_7 | GUE | complete | 0.000 | spacing_r=0.573 | shuffle z=-14.70; class_change=False | transfers |\n| cellular_automata:cycle_8 | GUE | contaminated | 0.790 | spacing_r=0.861 | shuffle z=-0.10; class_change=False | transfers |\n| percolation:cycle_9 | Poisson | complete | 0.000 | spacing_r=0.404 | shuffle z=16.10; class_change=True | transfers |\n| coupled_oscillators:cycle_10 | Poisson | contaminated | 0.146 | spacing_r=0.385 | shuffle z=43.50; class_change=True | transfers |\n| reaction_diffusion:cycle_11 | GUE | absent | 1.000 | spacing_r=0.759 | absent | blank |\n| brownian_motion:cycle_12 | Poisson | complete | 0.000 | spacing_r=0.489 | shuffle z=-1.60; class_change=False | transfers |\n| logistica_biforcazione_var_3.5699:cycle_13 | GUE | absent | 1.000 | spacing_r=0.997 | absent | blank |\n\n## Key Findings\n1. **Verificato: il gate trasferisce su 8/13 righe del perimetro.** Il transfer non coincide con GUE o Poisson: include 5 sorgenti GUE e 3 sorgenti Poisson perche' la condizione e' disponibilita del null, non etichetta di classe.\n2. **Verificato: 5/13 righe restano blank strutturale.** `pendolo_doppio`, `zeta_zeros`, `string_vibration`, `reaction_diffusion`, `logistica_biforcazione_var_3.5699` hanno `spacing_r` locale ma non hanno null/surrogate row-aligned nel deposito letto.\n3. **Verificato: `contaminated` non viene escluso.** `ising_2d`, `cellular_automata`, `coupled_oscillators` trasferiscono come contaminati perche' il null esiste ma la massa debole viene dichiarata.\n4. **Verificato: il contro-perimetro non e' una famiglia alternativa.** Il blank non autorizza una classe nuova; dice che il Lab non possiede osservabile sufficiente per trasferire il gate su quella riga.\n5. **Inferito: la consecutio corretta e' generare null row-aligned per i 5 blank, non fittare `V_c`.** Il nodo regressivo e' nel denominatore mancante, prima di ogni modello numerico.\n\n## Verdict\n**PARTIAL TRANSFER**: `denominator_state` trasferisce oltre `V_c` come gate di perimetro, non come risposta GUE/Poisson.\n\nNel perimetro 8 GUE / 5 Poisson, il gate produce una condizione cross-dominio verificabile su 8 righe con null shuffle disponibile. Su 5 righe resta blank strutturale: l'osservabile locale esiste, ma manca il contro-perimetro row-aligned.\n\nIl gate `denominator_state` trasferisce oltre V_c perche' separa 8 righe con null/surrogate shuffle disponibile da 5 righe blank senza contro-perimetro; il contro-perimetro sono `pendolo_doppio`, `zeta_zeros`, `string_vibration`, `reaction_diffusion`, `logistica_biforcazione_var_3.5699`.\n\n## Bicono della scoperta\n- **Due radici**: riga misurabile / riga non aggregabile.\n- **Singolare**: domain/window prima della classificazione GUE/Poisson.\n- **Invariante di passaggio**: il null row-aligned decide il transfer; la classe sorgente non decide.\n- **Campo di possibilita**: qui diventa possibile portare BOUNDARY in un contratto cross-dominio; qui diventa non-possibile chiudere QxG o dichiarare transfer sui 5 blank senza nuovo null.\n\n## Consecutio\nIl prossimo ciclo boundary deve costruire null/surrogate row-aligned per i 5 blank. Se quei null entrano, il gate puo' diventare condizione cross-dominio completa. Se non entrano, il confine resta un perimetro 8/13 con blank dichiarato.\n\n## Auto-audit: source flags e 7 lenti\n- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/dnd_scenario.py --best`, `agent_20260509_1337.md`, `agent_20260509_1400.md`, `falsifier_20260509_1400.json`, `agent_20260507_0330.md`, `tools/data/autoricerca_journal.json`, `tools/data/boundary_shuffle_audit.json`, nuovo JSON `tools/data/boundary_denominator_prescan_20260509_1409.json`.\n- **L1 hard constraint**: nessun \"sempre\" o \"solo\" universale; il verdict vale per 13 righe base e due depositi dichiarati.\n- **L2 count grezzi**: riportati 8/13 transfer, 5/13 blank, 5 complete, 3 contaminated, 5 absent.\n- **L3 no silent patching**: il ciclo non corregge il fit 14:00; usa quel falsifier come veto e cambia nodo al boundary denominator.\n- **L4 edge cases**: `contaminated` resta osservabile e non viene escluso; massa dichiarata in tabella.\n- **L5 re-discovery**: il risultato e' un audit di perimetro del Lab, non un teorema RMT nuovo.\n- **L6 metabolismo cognitivo**: CE-0001, CE-0117 e YSN usati nella combo.\n- **L7 possibile/non-possibile**: possibile = transfer su righe con null; non-possibile = transfer su righe blank senza null.\n\n## Telemetria\n- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` non presenti nell'ambiente.\n- Verifica script: `python -m py_compile tools/exp_boundary_denominator_prescan.py` completato senza errori.\n- Run valido: `python tools/exp_boundary_denominator_prescan.py --out tools/data/boundary_denominator_prescan_20260509_1409.json`.\n\n## Files\n- Script nuovo: `tools/exp_boundary_denominator_prescan.py`\n- Data: `tools/data/boundary_denominator_prescan_20260509_1409.json`\n- Report: `tools/data/reports/agent_20260509_1409.md`\n",
tools/data/lab_graph.json:1897:      "content_full": "# Agent Report - Vc Fit Model Gate\n**Date**: 2026-05-09 14:00\n**Piano**: 103\n**Tension explored**: TENS_SCALE_TRASCENDENZA_LIMITE / TRASCENDENZA_LIMITE (0.6 / 0.9)\n**verdict**: CONSTRAINT on V_c scale model selection\nobservables_registry: 1.0.0-2026-05-06\nobservables_used: [`denominator_state`, `fit_ready_rows`, `excluded_rows`, `best_model`, `delta_aicc_to_second`, `unit_limit_status`] - osservabili domain-native, non canonici SR/SR2/L1/L2/triple_var\n**observable_contract**: claim=il fit parametrico di `V_c` puo' entrare solo sulle righe `complete` o `contaminated` del gate fit-ready; observable=famiglia di modello migliore tra cinque forme semplici, separata da stato denominatore e massa esclusa; operator=confronto AICc su `vc_median_fit_ready` dal deposito 13:37, senza ricomputare spettri; generator=classi `reference_order`, `order_memory`, `periodic_closure`, `random_dispersion`; denominator=JSON `vc_fit_ready_scale_table_20260509_1337`, N={89,144,233,377}, soglie r={0.48,0.50,0.52}, livelli `per_mode_best` e `accepted_candidates`; non_possible=righe `broken` escluse dal fit e righe sotto `V_c=1` impediscono il claim osservato \"converge a 1 dall'alto\"; not_tested=nuovi N, nuovi generatori, nuovi spettri, GUE/Poisson transfer, gap_ratio, fit a tre parametri con asintoto libero.\n\n## Respiro fuori-tempo\n- **Prima impressione**: dopo il gate fit-ready il problema non e' piu' \"il fit converge\"; e' \"quale arco del grafo puo' ricevere una legge senza inglobare massa esclusa\".\n- **Combo**: A2 confine det=-1 + A3 punto fisso come attrattore dichiarato + A9 terzo incluso + QxG continuo/discreto + grafo dei generatori + tensione `TENS_SCALE_TRASCENDENZA_LIMITE`.\n- **Dipolo / punto-zero**: legge di scala / famiglia non identificata; punto-zero = il denominatore fit-ready prima che il modello numerico scelga una forma.\n- **Piano superiore**: grafo della conoscenza e bicono-dipoli. Il modello e' un arco permesso solo se il nodo denominatore conserva crossing.\n- **Operatori laterali scelti**: fit come morfismo, boundary operator, graph cut. Entrano per separare righe ammesse, righe rotte e famiglie numeriche.\n- **Contaminazione cognitiva**:\n  - **CE-0001 / KSAR**: reiterazione sul deposito 13:37 senza cambiare campo dati.\n  - **CE-0117**: cascata della possibilita; il fit entra solo dopo il gate e resta subordinato al denominatore.\n  - **YSN DeltaLink**: `denominator_state -> admissible_fit -> model_family`, non `V_c -> legge`.\n- **Proto-ipotesi**: la famiglia di scala non e' una proprieta globale di `V_c`. Nel sottografo ordinato fit-ready, la scala osservata e' quasi lineare in N sul perimetro; nei sottografi contaminati la famiglia cambia o resta non identificabile.\n- **Proiezione**: confronto cinque forme a due parametri su ogni riga ammissibile: `a+b*N`, `a+b*log(N)`, `a+b/sqrt(N)`, `a+b/N`, `c*N^b` con asintoto zero. Le righe `broken` vengono riportate ma non fittate.\n\n## Claim Under Test\n> Nel perimetro fit-ready 13:37, `order_memory` e `reference_order` possono ricevere una selezione di modello; `periodic_closure` e `random_dispersion` non possono essere aggregati alla stessa legge senza dichiarare contaminazione o rottura.\n\n## Question\nUna volta esclusi `no_cross` e `floor_hit`, il fit di scala di `V_c` identifica una legge comune, oppure divide il grafo dei generatori in famiglie di scala distinte?\n\n## Experiment Design\n- Nuovo strumento: `tools/exp_vc_fit_model_gate.py`.\n- Input: `tools/data/vc_fit_ready_scale_table_20260509_1337.json`.\n- Output: `tools/data/vc_fit_model_gate_20260509_1400.json`.\n- Stati ammessi al fit: `complete`, `contaminated`.\n- Stati esclusi dal fit: `broken`.\n- Criterio modello: AICc su quattro punti N per riga; `delta_aicc_to_second < 2` = famiglia non identificata.\n- Check non-possibile: conteggio dei punti osservati con `V_c < 1`.\n\n## Results\n\nIndice globale:\n\n| measure | value |\n|---|---:|\n| input rows | 18 |\n| admissible rows | 13 |\n| excluded broken rows | 5 |\n| best linear_N | 9 |\n| best inv_N | 4 |\n| ambiguous rows (`delta_aicc<2`) | 4 |\n| rows with observed `V_c<1` | 12 |\n\nRighe rappresentative, soglia `r=0.50`:\n\n| level | class | state | fit_ready/total | excluded | best model | delta AICc | last V_c |\n|---|---|---|---:|---:|---|---:|---:|\n| per_mode_best | reference_order | complete | 16/16 | 0 | linear_N | 5.651 | 0.879 |\n| per_mode_best | order_memory | complete | 48/48 | 0 | linear_N | 6.607 | 0.774 |\n| per_mode_best | periodic_closure | contaminated | 36/47 | 11 | inv_N | 1.378 | 0.650 |\n| accepted_candidates | order_memory | contaminated | 278/279 | 1 | linear_N | 4.565 | 0.899 |\n| accepted_candidates | order_memory r0.52 | complete | 279/279 | 0 | linear_N | 5.926 | 0.781 |\n\nRighe escluse per stato `broken`:\n\n| level | class | fit_ready/total | excluded |\n|---|---|---:|---:|\n| per_mode_best | random_dispersion r0.50 | 20/32 | 12 |\n| per_mode_best | random_dispersion r0.52 | 15/32 | 17 |\n| accepted_candidates | periodic_closure r0.48 | 102/393 | 291 |\n| accepted_candidates | periodic_closure r0.50 | 102/393 | 291 |\n| accepted_candidates | periodic_closure r0.52 | 102/393 | 291 |\n\nAmbiguita' di famiglia (`delta AICc < 2`):\n\n| row | best | delta AICc |\n|---|---|---:|\n| per_mode_best:order_memory:r0.52 | linear_N | 1.885 |\n| per_mode_best:periodic_closure:r0.48 | inv_N | 1.244 |\n| per_mode_best:periodic_closure:r0.50 | inv_N | 1.378 |\n| per_mode_best:periodic_closure:r0.52 | inv_N | 1.257 |\n\n## Key Findings\n1. **Verificato: il sottografo ordinato fit-ready sceglie `linear_N` nel perimetro osservato.** `reference_order` e `order_memory` completi hanno `linear_N` come miglior famiglia a r=0.48, 0.50, 0.52; a r=0.50 i delta AICc sono 5.651 e 6.607.\n2. **Verificato: `accepted_candidates:order_memory` resta lineare dopo il gate.** A r=0.50 e' contaminato da 1 riga esclusa (`278/279` fit-ready), ma il miglior modello resta `linear_N`; a r=0.52 diventa completo (`279/279`) e resta `linear_N`.\n3. **Verificato: `periodic_closure` non condivide la famiglia del sottografo ordinato.** Nel best-per-mode e' contaminato e sceglie `inv_N`, ma con delta AICc < 2; negli accepted e' `broken` e non entra nel fit.\n4. **Verificato: `random_dispersion` non produce una legge ammessa stabile.** A r=0.48 e' contaminato e sceglie `inv_N`; a r=0.50 e r=0.52 e' `broken`, quindi non e' denominatore di fit.\n5. **Verificato: il claim osservato \"V_c converge a 1\" non regge nel perimetro misurato come vincolo hard.** 12/13 righe fittate hanno almeno un punto osservato sotto 1; `reference_order` e `order_memory` scendono sotto 1 agli N alti.\n\n## Verdict\n**CONSTRAINT**: il fit parametrico di `V_c` non produce una legge comune del boundary.\n\nNel perimetro `N={89,144,233,377}`, il canale `reference_order/order_memory` fit-ready e' leggibile come discesa quasi lineare in N. `periodic_closure` e `random_dispersion` non vanno aggregati: il primo e' contaminato o broken, il secondo passa da contaminato a broken. La formulazione valida e':\n\n`V_c` ha una famiglia di scala per sottografo ammesso; non ha una legge unica prima della separazione `denominator_state + generator_class`.\n\n## Bicono della scoperta\n- **Due radici**: famiglia di fit / stato del denominatore.\n- **Singolare**: la curva `V_c` prima della scelta del modello, dove valore, massa esclusa e classe generatore sono ancora lo stesso nodo.\n- **Invariante di passaggio**: `linear_N` sopravvive nel canale ordinato fit-ready; non sopravvive quando il canale introduce chiusura periodica o dispersione.\n- **Campo di possibilita**: qui diventa possibile testare N piu' alti solo sul sottografo `complete`; qui diventa non-possibile dichiarare una convergenza universale di `V_c` a 1 o un power-law comune.\n\n## Consecutio\nIl prossimo ciclo deve estendere N solo per `reference_order` e `order_memory` con denominatore `complete`. Se i punti alti restano sotto 1 e lineari nel perimetro esteso, il claim `V_c(phi) -> 1` va riscritto come coordinata storica del vecchio perimetro, non come attrattore del boundary.\n\n## Auto-audit: source flags e 5 lenti\n- **Fonti**: Verificato da `tools/data/agent_field_live.md`, `tools/LAB_AGENT_CONTEXT.md`, `tools/data/seme.json`, `tools/dnd_scenario.py --best`, report `agent_20260509_1337.md`, JSON `tools/data/vc_fit_ready_scale_table_20260509_1337.json`, nuovo JSON `tools/data/vc_fit_model_gate_20260509_1400.json`.\n- **L1 hard constraint**: il verdict vale solo per N, soglie, classi e deposito dichiarati.\n- **L2 count grezzi**: riportati `13/18`, `5 broken`, `16/16`, `48/48`, `36/47`, `278/279`, `279/279`, `102/393`.\n- **L3 no observable drift**: non sono testati gap_ratio, nuovi spettri, nuovi N o GUE/Poisson.\n- **L4 edge cases**: `order_memory:r0.52` best-per-mode ha delta AICc 1.885, quindi famiglia non identificata hard nonostante best `linear_N`.\n- **L5 re-discovery vs discovery**: il finding non e' \"linear fit buono\"; e' che la famiglia di fit dipende dal sottografo ammesso e che la convergenza a 1 non e' vincolo osservato.\n\n## Telemetria\n- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` non presenti nell'ambiente.\n- Verifica script: `python -m py_compile tools/exp_vc_fit_model_gate.py` completato senza errori.\n- Run valido: `python tools/exp_vc_fit_model_gate.py --input tools/data/vc_fit_ready_scale_table_20260509_1337.json --out tools/data/vc_fit_model_gate_20260509_1400.json`.\n\n## Files\n- Script nuovo: `tools/exp_vc_fit_model_gate.py`\n- Data: `tools/data/vc_fit_model_gate_20260509_1400.json`\n- Report: `tools/data/reports/agent_20260509_1400.md`\n",
tools/data/lab_graph.json:2360:    "label": "Agent Report - Boundary Transition Taxonomy 13 Rows",
tools/data/lab_graph.json:2361:    "label_en": "Agent Report - Boundary Transition Taxonomy 13 Rows",
tools/data/lab_graph.json:2362:    "label_short": "Agent Report - Boundary Transition Taxonomy 13 Rows",
tools/data/lab_graph.json:2363:    "label_short_en": "Agent Report - Boundary Transition Taxonomy 13 Rows",
tools/data/boundary_denominator_prescan_20260509_1430.json:33:      "numeri_primi:cycle_3",
tools/data/boundary_denominator_prescan_20260509_1430.json:36:      "random_matrix:cycle_7",
tools/data/boundary_denominator_prescan_20260509_1430.json:101:      "domain_window": "numeri_primi:cycle_3",
tools/data/boundary_denominator_prescan_20260509_1430.json:201:      "domain_window": "random_matrix:cycle_7",
tools/data/promotions/promotion_20260509_1538.json:18:      "summary": "**CONSTRAINT**.\n\nIl frame BOUNDARY regge come support-transfer su 11/13 righe, ma la parte non-esatta non e' una coda omogenea. Le righe support-transfer senza beta 0.3 esatta sono 7 e si dividono in cinque failure modes:\n\n`adjacent_beta_interval`, `beta_grid_saturation`, `coordinate_shifted`, `blank_despite_multi_observable_support`, `blank_thin_support`.\n\nFormula valida:\n\n`beta_coordinate_transfer` = chart locale exact 0.3 dentro supporto vivo.\n\nFormula non valida:\n\n`support_transfer non-exact = sei righe residue` oppure `support_without_beta_blank = assenza strutturale unica`.\n\nIl nodo regr",
tools/data/lab_data.json:101:    "content": "# Agent Report - Boundary Transition Taxonomy 13 Rows\n**Date**: 2026-05-09 18:39  \n**Piano**: 113  \n**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE  \n**verdict**: CONSTRAINT - la tassonomia post-estensione scala sulle 13 righe e dissolve il thin blank  \nobservables_registry: 1.0.0-2026-05-06  \nobservables_used: [`transition_class`, `source_beta_state`, `extension_state`, `support_tier_after`, `one_sided_after`, `endpoint_after`, `stable_count_coherent_after`, `beta_after`, `denominator_state`, `excluded_mass`] - osservabili domain-native di composizione row-aligned, non canonici.  \nssp_value: no  \n**observable_contract**: claim=la tassonomia delle transizioni post-estensione scala se nessuna delle 13 righe resta `thin_persists`; observable=`transition_class` row-aligned sulle 13 righe; operator=`exp_boundary_transition_taxonomy_13rows.py`; generator=composizione dei depositi 15:32, 15:38, 15:56 e prescan 15:00 senza rigenerare segnali; denominator=13 righe BOUNDARY semi-reali; non_possible=promuovere `blank_thin_support` come specie autonoma se `thin_persist_rows=0`; not_tested=nuova griglia beta, nuovi null, fit `V_c`, validita' label GUE/Poisson sorgente.\n\n## Respiro fuori-tempo\n- **Prima impressione**: dopo l'estensione il thin blank non resta una figura. La domanda vera diventa se la matrice intera lascia un nuovo residuo vivo.\n- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + nodo regressivo `short_denominator`.\n- **Dipolo / punto-zero**: supporto sottile / atlante di transizione; punto-zero = stessa riga row-aligned prima che il blank venga letto come specie o come transizione.\n- **Piano superiore**: sheaf locale del boundary su 13 sezioni. La sezione corta viene riparata, poi ricollocata nell'atlante senza usare label GUE/Poisson.\n- **Operatori laterali scelti**: boundary operator, sheaf locale/perimetro, coordinate chart. Servono a comporre stati gia' misurati senza introdurre un nuovo gate.\n- **Contaminazione cognitiva**: CE-0019: contratto combo prima della misura; CE-0022: palette come boundary operator e chart locale; KSAR: riuso del deposito stabile 15:32-15:56; PVI: se resta `thin_persists`, la tassonomia cade.\n- **Proto-ipotesi**: `blank_thin_support` non scala sulle 13 righe se, dopo composizione con l'estensione, nessuna riga conserva supporto vivo sottile senza beta.\n- **Possibile / non-possibile**: possibile = usare l'atlante di transizione come mappa BOUNDARY; non-possibile = trattare il thin blank come specie matura.\n- **Proiezione**: classificare tutte le 13 righe in `transition_class` usando supporto, beta, denominatore e transizioni estese.\n\n## Aderenza alla direzione\n- `relation`: follows_direction\n- `why`: esegue la consecutio del campo vivo: dopo la cristallizzazione short-denominator, testa se la tassonomia delle transizioni post-estensione scala sulle 13 righe.\n- `not_drift`: non torna a `V_c`, non difende thin blank, non usa label GUE/Poisson come decisio"
tools/data/boundary_short_denominator_extension_20260509_1556.json:12:  "source_audit": "tools/data/boundary_blank_thin_support_audit_20260509_1548.json",
tools/data/boundary_short_denominator_extension_20260509_1556.json:15:    "random_matrix:cycle_7",
tools/data/boundary_short_denominator_extension_20260509_1556.json:19:    "source_audit": "tools/data/boundary_blank_thin_support_audit_20260509_1548.json",
tools/data/boundary_short_denominator_extension_20260509_1556.json:37:    "claim": "blank_thin_support survives only if thin support persists after denominator extension",
tools/data/boundary_short_denominator_extension_20260509_1556.json:41:    "non_possible": "promoting blank_thin_support when support thickens or beta chart appears after extension",
tools/data/boundary_short_denominator_extension_20260509_1556.json:55:    "random_matrix:cycle_7": {
tools/data/boundary_short_denominator_extension_20260509_1556.json:96:    "random_matrix:cycle_7": {
tools/data/boundary_short_denominator_extension_20260509_1556.json:188:      "random_matrix:cycle_7": {
tools/data/boundary_short_denominator_extension_20260509_1556.json:267:      "row": "random_matrix:cycle_7",
tools/data/promotions/promotion_20260509_1839.json:18:      "summary": "**CONSTRAINT**.\n\nLa tassonomia post-estensione scala sul perimetro 13 righe: nessun membro resta `thin_persists`.\n\nFormula valida:\n\n`blank_thin_support` = telemetria short-denominator dissolta dalla composizione 13 righe.\n\nFormula non valida:\n\n`blank_thin_support` = specie autonoma del boundary.\n\nIl boundary resta una matrice di transizioni: supporto che cade, supporto che si ispessisce senza beta, chart beta recuperata, chart beta esatta, chart locale non unica, chart spostata.",
tools/data/promotions/promotion_20260509_1548.json:18:      "summary": "**CONSTRAINT**.\n\nNel subset `support_without_beta_blank`, il failure mode `blank_thin_support` non regge come specie autonoma nel perimetro osservato. Regge come coda denominator-limited:\n\n`blank_thin_support` = beta blank + supporto vivo + denominatore corto.\n\nFormula valida:\n\n`support_without_beta_blank` si divide in `medium_blank_control` e `thin_short_*`.\n\nFormula non valida:\n\n`blank_thin_support` = failure mode stabile indipendente dal denominatore.\n\nIl nodo regressivo e' il denominatore dei tre domini corti. Non va promossa una nuova specie; va estesa o dichiarata coda corta.",
tools/data/promotions/promotion_20260509_1556.json:18:      "summary": "**CONSTRAINT**.\n\nNel perimetro delle tre righe short, l'estensione del denominatore dissolve `blank_thin_support` come specie autonoma.\n\nFormula valida:\n\n`blank_thin_support` = stato provvisorio da denominatore corto nel deposito 15:48.\n\nFormula non valida:\n\n`blank_thin_support` = failure mode stabile del boundary.\n\nLa riparazione regressiva avviene nel generatore/denominatore della riga. Non serve aggiungere una nuova tassonomia globale.",
tools/data/graph_completion/graph_completion_20260509_1516.json:11:    "observable_contract": "claim=il gate `coherent/null/beta` del BOUNDARY sintetico trasferisce sul perimetro semi-reale base; observable=one-sided canonical observables, stable counts ai poli, endpoint distance e ambiguous beta; operator=`exp_semireal_boundary_transfer_gate.py`; generator=13 righe `boundary_denominator_prescan_full_20260509_1500` ricostruite da `dnd_autoricerca`; denominator=13 righe base BOUNDARY, 8 GUE-like e 5 Poisson-like, beta layers 0.0..1.0, 12 replicates, 24 shuffle baselines; non_possible=dichiarare beta 0.3 coordinata universale o transfer completo quando 2/13 righe cadono; not_tested=nuovi domini, nuovi spettri, fit `V_c`, limite asintotico.",
tools/data/graph_completion/graph_completion_20260509_1516.json:13:    "question": "Quando le 13 righe base ricevono lo stesso contratto coerente/null/beta del transfer sintetico, il gate trasferisce, cade, o perde il blank comune?",
tools/data/graph_completion/graph_completion_20260509_1516.json:93:      "observable_contract": "claim=il gate `coherent/null/beta` del BOUNDARY sintetico trasferisce sul perimetro semi-reale base; observable=one-sided canonical observables, stable counts ai poli, endpoint distance e ambiguous beta; operator=`exp_semireal_boundary_transfer_gate.py`; generator=13 righe `boundary_denominator_prescan_full_20260509_1500` ricostruite da `dnd_autoricerca`; denominator=13 righe base BOUNDARY, 8 GUE-like e 5 Poisson-like, beta layers 0.0..1.0, 12 replicates, 24 shuffle baselines; non_possible=dichiarare beta 0.3 coordinata universale o transfer completo quando 2/13 righe cadono; not_tested=nuovi domini, nuovi spettri, fit `V_c`, limite asintotico.",
tools/data/graph_completion/graph_completion_20260509_1516.json:178:                "numeri_primi:cycle_3",
tools/data/graph_completion/graph_completion_20260509_1516.json:182:                "random_matrix:cycle_7",
tools/data/graph_completion/graph_completion_20260509_1427.json:11:    "observable_contract": "claim=il blank-pair test decide se due righe BOUNDARY senza null entrano nel transfer; observable=`spacing_r` originale contro permutation null row-aligned; operator=`exp_boundary_blank_null_audit.py` + prescan row-aligned; generator=`dnd_autoricerca.genera_segnale` per `zeta_zeros` e `pendolo_doppio`; denominator=13 righe base autoricerca 8 GUE-like / 5 Poisson-like; non_possible=dichiarare complete `zeta_zeros` con soli 199 gap o dichiarare cambio classe su `pendolo_doppio`; not_tested=fit `V_c`, nuovi spettri, nuova legge GUE/Poisson, chiusura QxG.",
tools/data/graph_completion/graph_completion_20260509_1427.json:98:      "observable_contract": "claim=il blank-pair test decide se due righe BOUNDARY senza null entrano nel transfer; observable=`spacing_r` originale contro permutation null row-aligned; operator=`exp_boundary_blank_null_audit.py` + prescan row-aligned; generator=`dnd_autoricerca.genera_segnale` per `zeta_zeros` e `pendolo_doppio`; denominator=13 righe base autoricerca 8 GUE-like / 5 Poisson-like; non_possible=dichiarare complete `zeta_zeros` con soli 199 gap o dichiarare cambio classe su `pendolo_doppio`; not_tested=fit `V_c`, nuovi spettri, nuova legge GUE/Poisson, chiusura QxG.",
tools/data/graph_completion/graph_completion_20260509_1427.json:175:                "numeri_primi:cycle_3",
tools/data/graph_completion/graph_completion_20260509_1427.json:178:                "random_matrix:cycle_7",
tools/data/graph_completion/graph_completion_20260509_1839.json:7:    "title": "Agent Report - Boundary Transition Taxonomy 13 Rows",
tools/data/graph_completion/graph_completion_20260509_1839.json:10:    "verdict": "CONSTRAINT - la tassonomia post-estensione scala sulle 13 righe e dissolve il thin blank",
tools/data/graph_completion/graph_completion_20260509_1839.json:11:    "observable_contract": "claim=la tassonomia delle transizioni post-estensione scala se nessuna delle 13 righe resta `thin_persists`; observable=`transition_class` row-aligned sulle 13 righe; operator=`exp_boundary_transition_taxonomy_13rows.py`; generator=composizione dei depositi 15:32, 15:38, 15:56 e prescan 15:00 senza rigenerare segnali; denominator=13 righe BOUNDARY semi-reali; non_possible=promuovere `blank_thin_support` come specie autonoma se `thin_persist_rows=0`; not_tested=nuova griglia beta, nuovi null, fit `V_c`, validita' label GUE/Poisson sorgente.",
tools/data/graph_completion/graph_completion_20260509_1839.json:12:    "claim_under_test": "La tassonomia emersa dall'estensione del denominatore scala sull'intero perimetro BOUNDARY 13 righe se non lascia alcuna riga `thin_persists`.",
tools/data/graph_completion/graph_completion_20260509_1839.json:13:    "question": "Quando le tre righe short estese vengono ricollocate nella matrice 13 righe, resta una specie `blank_thin_support` oppure il residuo vivo cambia forma?",
tools/data/graph_completion/graph_completion_20260509_1839.json:14:    "consecutio": "Il prossimo ciclo BOUNDARY deve lasciare chiuso il thin blank e attaccare il residuo `medium/strong beta-absent blank`: `numeri_primi:cycle_3` contro `random_matrix:cycle_7`. Il test utile non e' \"perche' manca beta in generale\", ma quale condizione distingue blank medio completo e blank forte post-estensione quando entrambi hanno supporto vivo senza chart beta.",
tools/data/graph_completion/graph_completion_20260509_1839.json:57:          "fit_ready": "after_n_gaps reaches the declared extension denominator and extension_state is not thin_persists",
tools/data/graph_completion/graph_completion_20260509_1839.json:61:          "counter_perimeter": "thin_persists would keep blank_thin_support alive as an autonomous candidate",
tools/data/graph_completion/graph_completion_20260509_1839.json:78:    "radici": "denominatore riparato / atlante 13 righe.",
tools/data/graph_completion/graph_completion_20260509_1839.json:80:    "invariante": "`thin_persist_rows=0/13`.",
tools/data/graph_completion/graph_completion_20260509_1839.json:118:        "dipole": "denominatore riparato / atlante 13 righe.",
tools/data/graph_completion/graph_completion_20260509_1839.json:120:        "invariant": "`thin_persist_rows=0/13`.",
tools/data/graph_completion/graph_completion_20260509_1839.json:124:      "observable_contract": "claim=la tassonomia delle transizioni post-estensione scala se nessuna delle 13 righe resta `thin_persists`; observable=`transition_class` row-aligned sulle 13 righe; operator=`exp_boundary_transition_taxonomy_13rows.py`; generator=composizione dei depositi 15:32, 15:38, 15:56 e prescan 15:00 senza rigenerare segnali; denominator=13 righe BOUNDARY semi-reali; non_possible=promuovere `blank_thin_support` come specie autonoma se `thin_persist_rows=0`; not_tested=nuova griglia beta, nuovi null, fit `V_c`, validita' label GUE/Poisson sorgente.",
tools/data/graph_completion/latest.json:7:    "title": "Agent Report - Boundary Transition Taxonomy 13 Rows",
tools/data/graph_completion/latest.json:10:    "verdict": "CONSTRAINT - la tassonomia post-estensione scala sulle 13 righe e dissolve il thin blank",
tools/data/graph_completion/latest.json:11:    "observable_contract": "claim=la tassonomia delle transizioni post-estensione scala se nessuna delle 13 righe resta `thin_persists`; observable=`transition_class` row-aligned sulle 13 righe; operator=`exp_boundary_transition_taxonomy_13rows.py`; generator=composizione dei depositi 15:32, 15:38, 15:56 e prescan 15:00 senza rigenerare segnali; denominator=13 righe BOUNDARY semi-reali; non_possible=promuovere `blank_thin_support` come specie autonoma se `thin_persist_rows=0`; not_tested=nuova griglia beta, nuovi null, fit `V_c`, validita' label GUE/Poisson sorgente.",
tools/data/graph_completion/latest.json:12:    "claim_under_test": "La tassonomia emersa dall'estensione del denominatore scala sull'intero perimetro BOUNDARY 13 righe se non lascia alcuna riga `thin_persists`.",
tools/data/graph_completion/latest.json:13:    "question": "Quando le tre righe short estese vengono ricollocate nella matrice 13 righe, resta una specie `blank_thin_support` oppure il residuo vivo cambia forma?",
tools/data/graph_completion/latest.json:14:    "consecutio": "Il prossimo ciclo BOUNDARY deve lasciare chiuso il thin blank e attaccare il residuo `medium/strong beta-absent blank`: `numeri_primi:cycle_3` contro `random_matrix:cycle_7`. Il test utile non e' \"perche' manca beta in generale\", ma quale condizione distingue blank medio completo e blank forte post-estensione quando entrambi hanno supporto vivo senza chart beta.",
tools/data/graph_completion/latest.json:57:          "fit_ready": "after_n_gaps reaches the declared extension denominator and extension_state is not thin_persists",
tools/data/graph_completion/latest.json:61:          "counter_perimeter": "thin_persists would keep blank_thin_support alive as an autonomous candidate",
tools/data/graph_completion/latest.json:78:    "radici": "denominatore riparato / atlante 13 righe.",
tools/data/graph_completion/latest.json:80:    "invariante": "`thin_persist_rows=0/13`.",
tools/data/graph_completion/latest.json:118:        "dipole": "denominatore riparato / atlante 13 righe.",
tools/data/graph_completion/latest.json:120:        "invariant": "`thin_persist_rows=0/13`.",
tools/data/graph_completion/latest.json:124:      "observable_contract": "claim=la tassonomia delle transizioni post-estensione scala se nessuna delle 13 righe resta `thin_persists`; observable=`transition_class` row-aligned sulle 13 righe; operator=`exp_boundary_transition_taxonomy_13rows.py`; generator=composizione dei depositi 15:32, 15:38, 15:56 e prescan 15:00 senza rigenerare segnali; denominator=13 righe BOUNDARY semi-reali; non_possible=promuovere `blank_thin_support` come specie autonoma se `thin_persist_rows=0`; not_tested=nuova griglia beta, nuovi null, fit `V_c`, validita' label GUE/Poisson sorgente.",
tools/data/graph_completion/graph_completion_20260509_1538.json:11:    "observable_contract": "claim=le righe non-esatte della matrice BOUNDARY 15:32 vanno lette row-aligned senza usare label GUE/Poisson; observable=stato beta + forza supporto + telemetria denominatore/null; operator=`exp_boundary_row_aligned_nonexact_audit.py`; generator=matrice `boundary_two_axis_matrix_20260509_1532` + prescan `boundary_denominator_prescan_full_20260509_1500`; denominator=13 righe totali, 11 support-transfer, 7 support-transfer non esatte; non_possible=forzare il conteggio a 6 o trattare beta 0.3 come ascissa comune; not_tested=nuovi domini, nuovi null, nuova griglia beta, fit `V_c`.",
tools/data/graph_completion/graph_completion_20260509_1538.json:93:      "observable_contract": "claim=le righe non-esatte della matrice BOUNDARY 15:32 vanno lette row-aligned senza usare label GUE/Poisson; observable=stato beta + forza supporto + telemetria denominatore/null; operator=`exp_boundary_row_aligned_nonexact_audit.py`; generator=matrice `boundary_two_axis_matrix_20260509_1532` + prescan `boundary_denominator_prescan_full_20260509_1500`; denominator=13 righe totali, 11 support-transfer, 7 support-transfer non esatte; non_possible=forzare il conteggio a 6 o trattare beta 0.3 come ascissa comune; not_tested=nuovi domini, nuovi null, nuova griglia beta, fit `V_c`.",
tools/data/graph_completion/graph_completion_20260509_1538.json:170:                "numeri_primi:cycle_3",
tools/data/graph_completion/graph_completion_20260509_1538.json:174:                "random_matrix:cycle_7",
tools/data/graph_completion/graph_completion_20260509_1457.json:11:    "observable_contract": "claim=`V_c(phi)` converge a 1 come limite leggibile del canale ordinato; observable=relazione dei punti fit-ready con il bordo `V_c=1`; operator=`exp_vc_unit_boundary_audit.py` su deposito `vc_fit_model_gate_20260509_1400`; generator=`reference_order`, `order_memory`, `periodic_closure`, `random_dispersion`; denominator=13 righe ammissibili `complete/contaminated` del fit model gate, N={89,144,233,377}, soglie r={0.48,0.50,0.52}, livelli `per_mode_best` e `accepted_candidates`; non_possible=dichiarare convergenza a 1 dall'alto quando la curva osservata attraversa sotto 1 nel perimetro; not_tested=nuovi spettri, nuovi N, nuovi candidati, limite asintotico oltre la finestra osservata.",
tools/data/graph_completion/graph_completion_20260509_1457.json:93:      "observable_contract": "claim=`V_c(phi)` converge a 1 come limite leggibile del canale ordinato; observable=relazione dei punti fit-ready con il bordo `V_c=1`; operator=`exp_vc_unit_boundary_audit.py` su deposito `vc_fit_model_gate_20260509_1400`; generator=`reference_order`, `order_memory`, `periodic_closure`, `random_dispersion`; denominator=13 righe ammissibili `complete/contaminated` del fit model gate, N={89,144,233,377}, soglie r={0.48,0.50,0.52}, livelli `per_mode_best` e `accepted_candidates`; non_possible=dichiarare convergenza a 1 dall'alto quando la curva osservata attraversa sotto 1 nel perimetro; not_tested=nuovi spettri, nuovi N, nuovi candidati, limite asintotico oltre la finestra osservata.",
tools/data/graph_completion/graph_completion_20260509_1556.json:11:    "observable_contract": "claim=`blank_thin_support` sopravvive solo se, dopo estensione del denominatore sorgente, resta supporto vivo sottile senza beta chart; observable=gate canonico one-sided + beta chart sulle tre righe short; operator=`exp_boundary_short_denominator_extension.py`; generator=`source-denominator extension` per `percolation`, `random_matrix`, `zeta_zeros`; denominator=3 righe short del report 15:48, estese a `n_gaps=1024`; non_possible=promuovere `blank_thin_support` se il supporto cade, si ispessisce o recupera beta; not_tested=redesign globale 13 righe, fit `V_c`, validita' della label GUE/Poisson sorgente.",
tools/data/graph_completion/graph_completion_20260509_1556.json:12:    "claim_under_test": "Le tre righe `blank_thin_support` restano specie autonoma solo se, a denominatore esteso, resta supporto vivo sottile senza beta chart.",
tools/data/graph_completion/graph_completion_20260509_1556.json:14:    "consecutio": "Il prossimo ciclo BOUNDARY non deve piu' cercare una classe `blank_thin_support`. Deve separare i tre esiti emersi: `percolation` come supporto non replicato, `random_matrix` come supporto forte beta-blank, `zeta_zeros` come beta recuperata. Il nodo ancora vivo e' il blank medio/forte senza beta, non il blank sottile.",
tools/data/graph_completion/graph_completion_20260509_1556.json:57:          "fit_ready": "after_n_gaps reaches the declared extension denominator and extension_state is not thin_persists",
tools/data/graph_completion/graph_completion_20260509_1556.json:61:          "counter_perimeter": "thin_persists would keep blank_thin_support alive as an autonomous candidate",
tools/data/graph_completion/graph_completion_20260509_1556.json:124:      "observable_contract": "claim=`blank_thin_support` sopravvive solo se, dopo estensione del denominatore sorgente, resta supporto vivo sottile senza beta chart; observable=gate canonico one-sided + beta chart sulle tre righe short; operator=`exp_boundary_short_denominator_extension.py`; generator=`source-denominator extension` per `percolation`, `random_matrix`, `zeta_zeros`; denominator=3 righe short del report 15:48, estese a `n_gaps=1024`; non_possible=promuovere `blank_thin_support` se il supporto cade, si ispessisce o recupera beta; not_tested=redesign globale 13 righe, fit `V_c`, validita' della label GUE/Poisson sorgente.",
tools/data/graph_completion/graph_completion_20260509_1556.json:163:          "tools/data/boundary_blank_thin_support_audit_20260509_1548.json",
tools/data/graph_completion/graph_completion_20260509_1556.json:174:              "fit_ready": "after_n_gaps reaches the declared extension denominator and extension_state is not thin_persists",
tools/data/graph_completion/graph_completion_20260509_1556.json:178:              "counter_perimeter": "thin_persists would keep blank_thin_support alive as an autonomous candidate",
tools/data/graph_completion/graph_completion_20260509_1556.json:206:                  "row": "random_matrix:cycle_7",
tools/data/graph_completion/graph_completion_20260509_1548.json:11:    "observable_contract": "claim=i tre `blank_thin_support` vanno falsificati contro il blank medio `numeri_primi` prima di promuoverli a specie autonoma; observable=telemetria row-aligned del subset `support_without_beta_blank`; operator=`exp_boundary_blank_thin_support_audit.py`; generator=`boundary_row_aligned_nonexact_audit_20260509_1538`; denominator=4 righe `support_without_beta_blank`, di cui 3 thin e 1 medium control; non_possible=chiamare il blank sottile specie autonoma se tutte le righe thin sono spiegate da denominatore corto; not_tested=estensione nuova dei tre domini short, nuova griglia beta, nuovi null, fit `V_c`.",
tools/data/graph_completion/graph_completion_20260509_1548.json:14:    "consecutio": "Il prossimo ciclo BOUNDARY deve estendere solo i tre domini short (`percolation`, `random_matrix`, `zeta_zeros`) verso denominatore comparabile al controllo medio. Se, a denominatore esteso, restano `blank_thin_support`, allora nasce una specie autonoma. Se salgono a supporto medio o ricevono beta locale, il failure mode 15:38 viene retrocesso a telemetria di perimetro corto.",
tools/data/graph_completion/graph_completion_20260509_1548.json:126:      "observable_contract": "claim=i tre `blank_thin_support` vanno falsificati contro il blank medio `numeri_primi` prima di promuoverli a specie autonoma; observable=telemetria row-aligned del subset `support_without_beta_blank`; operator=`exp_boundary_blank_thin_support_audit.py`; generator=`boundary_row_aligned_nonexact_audit_20260509_1538`; denominator=4 righe `support_without_beta_blank`, di cui 3 thin e 1 medium control; non_possible=chiamare il blank sottile specie autonoma se tutte le righe thin sono spiegate da denominatore corto; not_tested=estensione nuova dei tre domini short, nuova griglia beta, nuovi null, fit `V_c`.",
tools/data/graph_completion/graph_completion_20260509_1548.json:166:          "tools/data/boundary_blank_thin_support_audit_20260509_1548.json",
tools/data/graph_completion/graph_completion_20260509_1548.json:170:          "tools/exp_boundary_blank_thin_support_audit.py"
tools/data/graph_completion/graph_completion_20260509_1532.json:11:    "observable_contract": "claim=la matrice BOUNDARY semi-reale va separata in due assi: `support_transfer` e `beta_coordinate_transfer`; observable=stato row-aligned del supporto ordine/null e stato locale della beta ambigua; operator=`exp_boundary_two_axis_matrix.py`; generator=deposito `semireal_boundary_transfer_gate_20260509_1516` senza uso operativo di label GUE/Poisson; denominator=13 righe BOUNDARY semi-reali del perimetro base; non_possible=salvare il claim \"beta 0.3 universale\" quando solo 4/13 righe hanno beta 0.3 esatta; not_tested=nuovi domini, nuovi null, nuovi beta layer, fit `V_c`, limite asintotico.",
tools/data/graph_completion/graph_completion_20260509_1532.json:13:    "question": "Quando le 13 righe vengono lette con due assi separati, il transfer del supporto e il transfer della beta coincidono o si scindono?",
tools/data/graph_completion/graph_completion_20260509_1532.json:98:      "observable_contract": "claim=la matrice BOUNDARY semi-reale va separata in due assi: `support_transfer` e `beta_coordinate_transfer`; observable=stato row-aligned del supporto ordine/null e stato locale della beta ambigua; operator=`exp_boundary_two_axis_matrix.py`; generator=deposito `semireal_boundary_transfer_gate_20260509_1516` senza uso operativo di label GUE/Poisson; denominator=13 righe BOUNDARY semi-reali del perimetro base; non_possible=salvare il claim \"beta 0.3 universale\" quando solo 4/13 righe hanno beta 0.3 esatta; not_tested=nuovi domini, nuovi null, nuovi beta layer, fit `V_c`, limite asintotico.",
tools/data/graph_completion/graph_completion_20260509_1409.json:171:                "numeri_primi:cycle_3",
tools/data/graph_completion/graph_completion_20260509_1409.json:173:                "random_matrix:cycle_7",
tools/data/graph_completion/graph_completion_20260509_1437.json:11:    "observable_contract": "claim=il residual blank test decide se i 3 blank residui BOUNDARY entrano nel transfer; observable=`spacing_r` originale contro permutation null row-aligned; operator=`exp_boundary_blank_null_audit.py` + `exp_boundary_denominator_prescan.py`; generator=`dnd_autoricerca.genera_segnale` per `string_vibration`, `reaction_diffusion`, `logistica_biforcazione_var_3.5699`; denominator=13 righe base autoricerca 8 GUE-like / 5 Poisson-like; non_possible=dichiarare chiusura QxG, nuova legge GUE/Poisson, o complete `reaction_diffusion` con 499 gap; not_tested=fit `V_c`, nuovi spettri, nuovi domini.",
tools/data/graph_completion/graph_completion_20260509_1437.json:130:      "observable_contract": "claim=il residual blank test decide se i 3 blank residui BOUNDARY entrano nel transfer; observable=`spacing_r` originale contro permutation null row-aligned; operator=`exp_boundary_blank_null_audit.py` + `exp_boundary_denominator_prescan.py`; generator=`dnd_autoricerca.genera_segnale` per `string_vibration`, `reaction_diffusion`, `logistica_biforcazione_var_3.5699`; denominator=13 righe base autoricerca 8 GUE-like / 5 Poisson-like; non_possible=dichiarare chiusura QxG, nuova legge GUE/Poisson, o complete `reaction_diffusion` con 499 gap; not_tested=fit `V_c`, nuovi spettri, nuovi domini.",
tools/data/graph_completion/graph_completion_20260509_1437.json:207:                "numeri_primi:cycle_3",
tools/data/graph_completion/graph_completion_20260509_1437.json:211:                "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:97:    "numeri_primi:cycle_3": {
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:221:    "random_matrix:cycle_7": {
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:495:      "numeri_primi:cycle_3": {
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:623:      "random_matrix:cycle_7": {
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:11592:    "numeri_primi:cycle_3": {
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:11961:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:11999:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12037:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12075:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12112:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12146:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12182:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12218:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12254:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12288:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12324:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12358:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12396:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12434:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12470:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12506:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12542:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12579:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12613:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12647:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12681:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12715:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12749:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12787:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12825:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12863:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12901:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12935:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:12971:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13005:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13042:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13079:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13113:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13147:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13185:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13223:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13261:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13297:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13335:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13371:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13405:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13443:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13477:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13511:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13545:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13583:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13621:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13659:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13697:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13731:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13768:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13804:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13838:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13872:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13906:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13940:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:13978:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14016:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14052:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14088:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14124:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14158:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14192:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14226:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14260:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14294:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14328:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14366:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14404:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14443:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14480:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14519:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14557:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14591:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14625:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14659:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14693:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14727:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14765:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14803:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14841:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14877:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14915:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14949:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:14983:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15019:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15053:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15087:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15123:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15161:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15199:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15237:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15274:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15312:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15346:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15380:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15414:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15448:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15482:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15516:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15554:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15592:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15631:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15667:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15707:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15745:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15781:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15815:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15852:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15886:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15922:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15960:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:15998:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16036:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16074:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16110:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16148:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16184:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16218:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16252:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16286:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16320:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16358:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16396:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16434:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16470:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16504:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16542:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16579:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16613:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16647:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:16684:          "perimeter": "numeri_primi:cycle_3",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:32423:    "random_matrix:cycle_7": {
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:32790:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:32826:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:32862:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:32898:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:32932:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:32966:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33000:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33034:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33068:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33102:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33139:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33173:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33209:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33245:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33281:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33315:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33349:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33385:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33419:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33453:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33487:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33521:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33555:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33591:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33627:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33665:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33702:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33736:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33774:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33808:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33842:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33876:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33910:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33944:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:33980:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34014:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34048:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34084:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34121:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34155:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34189:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34225:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34259:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34296:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34330:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34366:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34402:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34436:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34470:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34508:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34545:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34579:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34615:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34649:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34683:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34717:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34753:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34789:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34825:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34861:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34897:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34931:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34965:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:34999:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35035:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35069:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35103:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35139:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35176:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35212:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35248:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35282:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35316:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35352:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35386:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35420:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35454:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35491:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35527:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35561:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35595:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35629:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35663:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35699:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35733:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35767:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35801:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35835:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35869:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35905:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35941:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:35977:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36011:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36047:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36081:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36115:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36151:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36185:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36219:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36255:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36291:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36325:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36361:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36397:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36434:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36468:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36502:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36536:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36570:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36606:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36640:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36676:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36712:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36746:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36782:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36816:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36850:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36884:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36918:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36955:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:36992:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:37026:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:37062:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:37098:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:37132:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:37166:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:37202:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:37240:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:37274:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:37310:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:37344:          "perimeter": "random_matrix:cycle_7",
tools/data/semireal_boundary_transfer_gate_20260509_1516.json:37380:          "perimeter": "random_matrix:cycle_7",
tools/data/boundary_denominator_prescan_full_20260509_1500.json:32:      "numeri_primi:cycle_3",
tools/data/boundary_denominator_prescan_full_20260509_1500.json:36:      "random_matrix:cycle_7",
tools/data/boundary_denominator_prescan_full_20260509_1500.json:99:      "domain_window": "numeri_primi:cycle_3",
tools/data/boundary_denominator_prescan_full_20260509_1500.json:199:      "domain_window": "random_matrix:cycle_7",
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:24:    "claim": "the short-denominator transition taxonomy scales if no 13-row member remains thin_persists after extension composition",
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:28:    "non_possible": "autonomous blank_thin_support if any row remains thin_persists",
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:38:    "thin_persist_rows": 0,
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:39:    "blank_medium_or_strong_beta_absent_rows": 2,
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:43:    "class_blank_medium_or_strong_beta_absent": 1,
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:53:    "blank_medium_or_strong_beta_absent": 3.2427469463217204,
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:59:  "thin_persist_rows": [],
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:61:    "numeri_primi:cycle_3",
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:62:    "random_matrix:cycle_7"
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:200:      "row": "numeri_primi:cycle_3",
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:205:      "transition_class": "blank_medium_or_strong_beta_absent",
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:244:      "source_coordinate_failure": "blank_thin_support",
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:259:      "row": "random_matrix:cycle_7",
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:263:      "source_coordinate_failure": "blank_thin_support",
tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json:324:      "source_coordinate_failure": "blank_thin_support",
tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json:40:    "failure_blank_thin_support": 3,
tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json:162:      "row": "numeri_primi:cycle_3",
tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json:188:        "domain_window": "numeri_primi:cycle_3"
tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json:194:      "coordinate_failure": "blank_thin_support",
tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json:220:      "row": "random_matrix:cycle_7",
tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json:222:      "coordinate_failure": "blank_thin_support",
tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json:244:        "domain_window": "random_matrix:cycle_7"
tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json:250:      "coordinate_failure": "blank_thin_support",
tools/data/boundary_blank_thin_support_audit_20260509_1548.json:2:  "experiment": "boundary_blank_thin_support_audit",
tools/data/boundary_blank_thin_support_audit_20260509_1548.json:25:    "thin_failure": "blank_thin_support"
tools/data/boundary_blank_thin_support_audit_20260509_1548.json:85:      "row": "numeri_primi:cycle_3",
tools/data/boundary_blank_thin_support_audit_20260509_1548.json:108:      "coordinate_failure": "blank_thin_support",
tools/data/boundary_blank_thin_support_audit_20260509_1548.json:125:      "row": "random_matrix:cycle_7",
tools/data/boundary_blank_thin_support_audit_20260509_1548.json:127:      "coordinate_failure": "blank_thin_support",
tools/data/boundary_blank_thin_support_audit_20260509_1548.json:146:      "coordinate_failure": "blank_thin_support",
tools/data/repairs/repair_20260509_1839_decision.json:1:{"cycle_ts": "20260509_1839", "decision": "SKIP", "should_rerun": false, "reasons": ["no_repair_condition_matched"], "guards": {"repair_depth": 0, "max_depth": 1, "parent_ts": "", "loop_danger": false, "aeternitas_veto": false}, "signals": {"cycle_ts": "20260509_1839", "agent": {"path": "/opt/MM_D-ND/tools/data/reports/agent_20260509_1839.md", "exists": true, "title": "Agent Report - Boundary Transition Taxonomy 13 Rows", "size": 9429}, "falsifier": {"path": "/opt/MM_D-ND/tools/data/reports/falsifier_20260509_1839.json", "exists": true, "coherent": true, "summary": "Il report e' internamente coerente sulle 8 lenti: hard constraint limitato a thin_persist_rows=0/13, count assoluti presenti, non_possible dichiarato, contaminazione cognitiva metabolizzata e aderenza alla direzione esplicitata.", "counts": {"high": 0, "medium": 0, "low": 0}, "flags": []}, "aeternitas": {"path": "/opt/MM_D-ND/tools/data/aeternitas/aeternitas_20260509_184434.json", "decision": "WARN", "reason": "P5 (Autopoiesi): ciclo non ha prodotto tensioni nuove né cambiato direzione", "p0_passed": true, "p1_passed": true, "p5_passed": false, "p5_violations": [{"issue": "no_new_tension_or_direction", "old_count": 13, "new_count": 13}]}, "veritas": {"path": "/opt/MM_D-ND/tools/data/veritas/veritas_20260509_184434.json", "rho": 0.9325, "band": "COLLASSO"}, "valutatore": {"exists": true, "decision": "NEXT_CYCLE", "confidence": "high", "reasoning": "Il ciclo ha prodotto una chiusura locale utile senza contraddizione: `thin_persist_rows=0` dissolve la specie `blank_thin_support` sul perimetro 13 righe, ma lascia due residui medio/forti senza beta (`numeri_primi:cycle_3`, `random_matrix:cycle_7`). La consecutio naturale non e' redesign: e' testare se quei due blank residui sono stesso operatore di confine, due classi distinte, o artefatto da denominatore/atlante.", "action_type": "trigger_cycle", "detail": {"direction": "BOUNDARY consecutio sui due residui beta-absent medio/forti", "focus_rows": ["numeri_primi:cycle_3", "random_matrix:cycle_7"], "test": "costruire un audit mirato che non rigeneri fit globali e verifichi se il beta-blank residuo sopravvive a controlli row-locali e cross-row", "avoid": ["nuova griglia beta globale", "ritorno a V_c", "uso label GUE/Poisson come decision field"]}, "notes": "Prossima mossa: isolare il residuo vivo dopo la dissoluzione del thin blank. Se anche questi due blank cadono, la tassonomia BOUNDARY puo' maturare; se divergono, emerge nuova tensione strutturale."}, "loop_guard": {"path": "/opt/MM_D-ND/tools/data/reports/loop_guard_20260509_1839.json", "exists": true, "bands": {"valutatore_decisions": "OK", "piano_trajectory": "OK"}, "danger": false}, "session": {"exists": true, "sync_blocked": false, "errors": ""}}, "directive_path": "/opt/MM_D-ND/tools/data/operator_directive.md", "record_json": null, "record_md": null}
tools/data/evolution/evolution_20260509_1538.md:3:Ho mantenuto il focus sul percorso: attrito nel conteggio ereditato “6” senza denominatore sigillato, nodo regressivo nell’handoff/consecutio, e possibilità emergenti sulle righe `blank_thin_support`, `blank_despite_multi_observable_support` e `coordinate_shifted`.
tools/data/biconi/bicono_20260509_1839.json:2:  "radici": "denominatore riparato / atlante 13 righe.",
tools/data/biconi/bicono_20260509_1839.json:4:  "invariante": "`thin_persist_rows=0/13`.",
tools/data/evolution/evolution_20260509_1516.md:3:Ho mantenuto il report breve e centrato sul PASSO: separazione del gate in `support_transfer` e `beta_coordinate_transfer`, attrito telemetrico da autopsy senza jsonl, nodo regressivo nel contratto osservabile-operatore, e consecutio verso una matrice a due assi sulle 13 righe.
tools/data/evolution/evolution_20260509_1839.md:3:Ho mantenuto il focus sul PASSO: ricomposizione delle 13 righe dopo `short_denominator`, attrito telemetrico da autopsy senza jsonl, nodo regressivo nel contratto di traccia provider-neutral, e consecutio sui due blank residui medio/forte senza beta.
tools/data/ciclo_memoria.json:282:      "verdict": "**CONSTRAINT**.\n\nIl gate BOUNDARY semi-reale trasferisce come supporto ordine/null in 11/13 righe. Non trasferisce come coordinata beta universale: 7 righe hanno blank, 4 trasferiscono senza blank, 2 ",
tools/data/ciclo_memoria.json:303:      "verdict": "**CONSTRAINT**.\n\nIl gate BOUNDARY trasferisce come supporto ordine/null su 11/13 righe. La coordinata beta 0.3 trasferisce esattamente su 4/13 righe. Questi due assi non coincidono.\n\nFormula valida:\n\n",
tools/data/ciclo_memoria.json:325:      "verdict": "**CONSTRAINT**.\n\nIl frame BOUNDARY regge come support-transfer su 11/13 righe, ma la parte non-esatta non e' una coda omogenea. Le righe support-transfer senza beta 0.3 esatta sono 7 e si dividono in ",
tools/data/ciclo_memoria.json:347:      "verdict": "**CONSTRAINT**.\n\nNel subset `support_without_beta_blank`, il failure mode `blank_thin_support` non regge come specie autonoma nel perimetro osservato. Regge come coda denominator-limited:\n\n`blank_thin",
tools/data/ciclo_memoria.json:369:      "verdict": "**CONSTRAINT**.\n\nNel perimetro delle tre righe short, l'estensione del denominatore dissolve `blank_thin_support` come specie autonoma.\n\nFormula valida:\n\n`blank_thin_support` = stato provvisorio da de",
tools/data/ciclo_memoria.json:375:      "titolo": "Boundary Transition Taxonomy 13 Rows",
tools/data/ciclo_memoria.json:391:      "verdict": "**CONSTRAINT**.\n\nLa tassonomia post-estensione scala sul perimetro 13 righe: nessun membro resta `thin_persists`.\n\nFormula valida:\n\n`blank_thin_support` = telemetria short-denominator dissolta dalla c",
tools/data/ciclo_memoria.json:392:      "cosa": "Boundary Transition Taxonomy 13 Rows → None/None (ρ=None)"
tools/data/ciclo_memoria.json:403:  "domanda_aperta": "Il prossimo ciclo BOUNDARY deve lasciare chiuso il thin blank e attaccare il residuo `medium/strong beta-absent blank`: `numeri_primi:cycle_3` contro `random_matrix:cycle_7`. Il test utile non e' \"perche' manca beta in generale\", ma quale condizione distingue blank medio completo e blank forte post-estensione quando entrambi hanno supporto vivo senza chart beta.",

codex
Ho trovato il nodo preciso: `numeri_primi` è blank medio con 3 osservabili su denominatore 4096; `random_matrix` è blank forte post-estensione con 4 osservabili su denominatore 1024. L’esperimento deve restare row-local e cross-row, senza rifare la griglia beta globale.
exec
/bin/bash -lc "sed -n '1,280p' tools/exp_boundary_transition_taxonomy_13rows.py" in /opt/MM_D-ND
 succeeded in 0ms:
#!/usr/bin/env python3
"""
Scale the post-extension BOUNDARY transition taxonomy to all 13 rows.

This script does not regenerate expensive signals. It composes the row-aligned
two-axis matrix, the non-exact audit, the denominator prescan, and the 15:56
source-denominator extension. The operator asks whether the short-denominator
transition taxonomy leaves any autonomous thin blank when read against the
full 13-row perimeter.
"""

from __future__ import annotations

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


def load_json(path: str) -> dict[str, Any]:
    with Path(path).open() as f:
        return json.load(f)


def index_rows(rows: list[dict[str, Any]], key: str = "row") -> dict[str, dict[str, Any]]:
    return {row[key]: row for row in rows}


def prescan_index(data: dict[str, Any]) -> dict[str, dict[str, Any]]:
    return {row["domain_window"]: row for row in data.get("rows", [])}


def support_tier(one_sided_count: int, endpoint: float, stable: float) -> str:
    if one_sided_count >= 4 and endpoint >= 3.5 and stable >= 4.0:
        return "strong_multi_observable"
    if one_sided_count >= 3 and endpoint >= 3.0 and stable >= 3.0:
        return "medium_multi_observable"
    return "thin_observable_support"


def row_metrics(row: dict[str, Any], extension: dict[str, Any] | None = None) -> dict[str, Any]:
    if extension:
        one_sided_count = int(extension.get("after_one_sided") or 0)
        endpoint = float(extension.get("after_endpoint_distance") or 0.0)
        stable = float(extension.get("after_stable_count_coherent") or 0.0)
        beta = extension.get("after_beta", [])
        tier = extension.get("after_support_tier") or support_tier(one_sided_count, endpoint, stable)
        n_gaps = extension.get("after_n_gaps")
        return {
            "n_gaps_after": n_gaps,
            "one_sided_after": one_sided_count,
            "endpoint_after": endpoint,
            "stable_count_coherent_after": stable,
            "beta_after": beta,
            "support_tier_after": tier,
        }

    beta = row.get("ambiguous_beta", [])
    one_sided_count = len(row.get("one_sided_observables", []))
    endpoint = float(row.get("endpoint_distance") or 0.0)
    stable = float(row.get("stable_count_coherent") or 0.0)
    return {
        "n_gaps_after": row.get("n_gaps"),
        "one_sided_after": one_sided_count,
        "endpoint_after": endpoint,
        "stable_count_coherent_after": stable,
        "beta_after": beta,
        "support_tier_after": support_tier(one_sided_count, endpoint, stable),
    }


def transition_class(row: dict[str, Any], extension: dict[str, Any] | None) -> str:
    if extension:
        return extension["extension_state"]
    if not row.get("support_transfer"):
        return "fall_no_support"
    beta_state = row.get("beta_state")
    if beta_state == "beta_0_3_exact":
        return "beta_0_3_exact"
    if beta_state == "beta_0_3_local_nonunique":
        return "beta_0_3_local_nonunique"
    if beta_state == "local_beta_other":
        return "local_beta_other"
    if beta_state == "support_without_beta_blank":
        metrics = row_metrics(row)
        tier = metrics["support_tier_after"]
        if tier == "thin_observable_support":
            return "thin_persists"
        return "blank_medium_or_strong_beta_absent"
    return "unclassified"


def build(args: argparse.Namespace) -> dict[str, Any]:
    two_axis = load_json(args.two_axis)
    row_audit = load_json(args.row_audit)
    extension = load_json(args.extension)
    prescan = load_json(args.prescan)

    two_rows = index_rows(two_axis.get("rows", []))
    audit_rows = index_rows(row_audit.get("rows", []))
    extension_rows = index_rows(extension.get("transitions", []))
    prescan_rows = prescan_index(prescan)

    rows: list[dict[str, Any]] = []
    class_counts: dict[str, int] = {}
    support_blank_full_rows: list[str] = []
    thin_persist_rows: list[str] = []
    endpoint_by_class: dict[str, list[float]] = {}

    for name in sorted(two_rows):
        source = two_rows[name]
        ext = extension_rows.get(name)
        metrics = row_metrics(source, ext)
        cls = transition_class(source, ext)
        class_counts[cls] = class_counts.get(cls, 0) + 1
        endpoint_by_class.setdefault(cls, []).append(metrics["endpoint_after"])
        if cls == "thin_persists":
            thin_persist_rows.append(name)
        if cls in {"blank_medium_or_strong_beta_absent", "support_thickens_beta_blank"}:
            support_blank_full_rows.append(name)

        audit = audit_rows.get(name, {})
        pres = prescan_rows.get(name, {})
        rows.append({
            "row": name,
            "source_beta_state": source.get("beta_state"),
            "source_support_transfer": source.get("support_transfer"),
            "source_beta_coordinate_transfer": source.get("beta_coordinate_transfer"),
            "source_coordinate_failure": audit.get("coordinate_failure"),
            "transition_class": cls,
            "extension_applied": ext is not None,
            "n_gaps_before": source.get("n_gaps"),
            **metrics,
            "denominator_state": pres.get("denominator_state"),
            "excluded_mass": pres.get("excluded_mass"),
            "source_domain_type_audit_only": pres.get("source_domain_type"),
        })

    total = len(rows)
    support_transfer_after = sum(
        1 for row in rows
        if row["transition_class"] not in {"fall_no_support", "support_falls_after_extension"}
    )
    beta_chart_after = sum(1 for row in rows if row["beta_after"])
    exact_beta_after = sum(1 for row in rows if row["beta_after"] == [0.3])

    verdict = "TAXONOMY_SCALES_THIN_DISSOLVED"
    if thin_persist_rows:
        verdict = "TAXONOMY_FAILS_THIN_PERSISTS"

    return {
        "experiment": "boundary_transition_taxonomy_13rows",
        "question": "Does the post-extension transition taxonomy scale to all 13 BOUNDARY rows without leaving autonomous thin blanks?",
        "observables_registry": two_axis.get("observables_registry"),
        "observables_used": [
            "transition_class",
            "source_beta_state",
            "extension_state",
            "support_tier_after",
            "one_sided_after",
            "endpoint_after",
            "stable_count_coherent_after",
            "beta_after",
            "denominator_state",
            "excluded_mass",
        ],
        "sources": {
            "two_axis": args.two_axis,
            "row_audit": args.row_audit,
            "extension": args.extension,
            "prescan": args.prescan,
        },
        "observable_contract": {
            "claim": "the short-denominator transition taxonomy scales if no 13-row member remains thin_persists after extension composition",
            "observable": "row-aligned transition_class across 13 rows",
            "operator": "composition of measured deposits, no regeneration",
            "denominator": "13 semi-real BOUNDARY rows",
            "non_possible": "autonomous blank_thin_support if any row remains thin_persists",
            "not_tested": "new beta grid, new null surrogates, V_c fit, source GUE/Poisson label validity",
        },
        "label_policy": "source_domain_type is audit metadata only and is not used in transition_class.",
        "counts": {
            "total_rows": total,
            "support_transfer_after": support_transfer_after,
            "fall_after": total - support_transfer_after,
            "beta_chart_after_any": beta_chart_after,
            "beta_chart_after_exact_0_3": exact_beta_after,
            "thin_persist_rows": len(thin_persist_rows),
            "blank_medium_or_strong_beta_absent_rows": len(support_blank_full_rows),
            **{f"class_{key}": value for key, value in sorted(class_counts.items())},
        },
        "class_endpoint_means": {
            key: mean(values) for key, values in sorted(endpoint_by_class.items())
        },
        "thin_persist_rows": thin_persist_rows,
        "open_blank_rows": support_blank_full_rows,
        "verdict": verdict,
        "rows": rows,
    }


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--two-axis", default="tools/data/boundary_two_axis_matrix_20260509_1532.json")
    parser.add_argument("--row-audit", default="tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json")
    parser.add_argument("--extension", default="tools/data/boundary_short_denominator_extension_20260509_1556.json")
    parser.add_argument("--prescan", default="tools/data/boundary_denominator_prescan_full_20260509_1500.json")
    parser.add_argument("--out", default="tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json")
    args = parser.parse_args()

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

    c = output["counts"]
    print(f"rows={c['total_rows']}")
    print(f"support_transfer_after={c['support_transfer_after']}/{c['total_rows']}")
    print(f"fall_after={c['fall_after']}/{c['total_rows']}")
    print(f"beta_chart_after_any={c['beta_chart_after_any']}/{c['total_rows']}")
    print(f"thin_persist_rows={c['thin_persist_rows']}")
    print(f"open_blank_rows={output['open_blank_rows']}")
    for key, value in sorted(c.items()):
        if key.startswith("class_"):
            print(f"{key}={value}")
    print(f"verdict={output['verdict']}")
    print(f"saved {out}")


if __name__ == "__main__":
    main()

exec
/bin/bash -lc "sed -n '1,280p' 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 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())


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(domain: str) -> np.ndarray:
    signal, metadata = generate_domain_signal(domain)
    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 "python -m json.tool tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json | sed -n '1,340p'" in /opt/MM_D-ND
 succeeded in 0ms:
{
    "experiment": "boundary_transition_taxonomy_13rows",
    "question": "Does the post-extension transition taxonomy scale to all 13 BOUNDARY rows without leaving autonomous thin blanks?",
    "observables_registry": "1.0.0-2026-05-06",
    "observables_used": [
        "transition_class",
        "source_beta_state",
        "extension_state",
        "support_tier_after",
        "one_sided_after",
        "endpoint_after",
        "stable_count_coherent_after",
        "beta_after",
        "denominator_state",
        "excluded_mass"
    ],
    "sources": {
        "two_axis": "tools/data/boundary_two_axis_matrix_20260509_1532.json",
        "row_audit": "tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json",
        "extension": "tools/data/boundary_short_denominator_extension_20260509_1556.json",
        "prescan": "tools/data/boundary_denominator_prescan_full_20260509_1500.json"
    },
    "observable_contract": {
        "claim": "the short-denominator transition taxonomy scales if no 13-row member remains thin_persists after extension composition",
        "observable": "row-aligned transition_class across 13 rows",
        "operator": "composition of measured deposits, no regeneration",
        "denominator": "13 semi-real BOUNDARY rows",
        "non_possible": "autonomous blank_thin_support if any row remains thin_persists",
        "not_tested": "new beta grid, new null surrogates, V_c fit, source GUE/Poisson label validity"
    },
    "label_policy": "source_domain_type is audit metadata only and is not used in transition_class.",
    "counts": {
        "total_rows": 13,
        "support_transfer_after": 10,
        "fall_after": 3,
        "beta_chart_after_any": 9,
        "beta_chart_after_exact_0_3": 6,
        "thin_persist_rows": 0,
        "blank_medium_or_strong_beta_absent_rows": 2,
        "class_beta_0_3_exact": 4,
        "class_beta_0_3_local_nonunique": 2,
        "class_beta_chart_recovered": 1,
        "class_blank_medium_or_strong_beta_absent": 1,
        "class_fall_no_support": 2,
        "class_local_beta_other": 1,
        "class_support_falls_after_extension": 1,
        "class_support_thickens_beta_blank": 1
    },
    "class_endpoint_means": {
        "beta_0_3_exact": 3.828607195910865,
        "beta_0_3_local_nonunique": 3.571458898683993,
        "beta_chart_recovered": 2.66042787119548,
        "blank_medium_or_strong_beta_absent": 3.2427469463217204,
        "fall_no_support": 1.6940454566312773,
        "local_beta_other": 4.308544591024874,
        "support_falls_after_extension": 0.0,
        "support_thickens_beta_blank": 3.78055565502901
    },
    "thin_persist_rows": [],
    "open_blank_rows": [
        "numeri_primi:cycle_3",
        "random_matrix:cycle_7"
    ],
    "verdict": "TAXONOMY_SCALES_THIN_DISSOLVED",
    "rows": [
        {
            "row": "brownian_motion:cycle_12",
            "source_beta_state": "beta_0_3_local_nonunique",
            "source_support_transfer": true,
            "source_beta_coordinate_transfer": false,
            "source_coordinate_failure": "adjacent_beta_interval",
            "transition_class": "beta_0_3_local_nonunique",
            "extension_applied": false,
            "n_gaps_before": 4096,
            "n_gaps_after": 4096,
            "one_sided_after": 4,
            "endpoint_after": 3.8849187765851725,
            "stable_count_coherent_after": 4.0,
            "beta_after": [
                0.2,
                0.3
            ],
            "support_tier_after": "strong_multi_observable",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "source_domain_type_audit_only": "Poisson"
        },
        {
            "row": "cellular_automata:cycle_8",
            "source_beta_state": "fall_no_support",
            "source_support_transfer": false,
            "source_beta_coordinate_transfer": false,
            "source_coordinate_failure": null,
            "transition_class": "fall_no_support",
            "extension_applied": false,
            "n_gaps_before": 108,
            "n_gaps_after": 108,
            "one_sided_after": 0,
            "endpoint_after": 0.0,
            "stable_count_coherent_after": 0.0,
            "beta_after": [],
            "support_tier_after": "thin_observable_support",
            "denominator_state": "contaminated",
            "excluded_mass": 0.79,
            "source_domain_type_audit_only": "GUE"
        },
        {
            "row": "coupled_oscillators:cycle_10",
            "source_beta_state": "beta_0_3_exact",
            "source_support_transfer": true,
            "source_beta_coordinate_transfer": true,
            "source_coordinate_failure": null,
            "transition_class": "beta_0_3_exact",
            "extension_applied": false,
            "n_gaps_before": 2002,
            "n_gaps_after": 2002,
            "one_sided_after": 5,
            "endpoint_after": 4.336278592600956,
            "stable_count_coherent_after": 5.0,
            "beta_after": [
                0.3
            ],
            "support_tier_after": "strong_multi_observable",
            "denominator_state": "contaminated",
            "excluded_mass": 0.146,
            "source_domain_type_audit_only": "Poisson"
        },
        {
            "row": "ising_2d:cycle_1",
            "source_beta_state": "local_beta_other",
            "source_support_transfer": true,
            "source_beta_coordinate_transfer": false,
            "source_coordinate_failure": "coordinate_shifted",
            "transition_class": "local_beta_other",
            "extension_applied": false,
            "n_gaps_before": 699,
            "n_gaps_after": 699,
            "one_sided_after": 5,
            "endpoint_after": 4.308544591024874,
            "stable_count_coherent_after": 5.0,
            "beta_after": [
                0.4
            ],
            "support_tier_after": "strong_multi_observable",
            "denominator_state": "contaminated",
            "excluded_mass": 0.81,
            "source_domain_type_audit_only": "GUE"
        },
        {
            "row": "logistica_biforcazione:cycle_5",
            "source_beta_state": "beta_0_3_local_nonunique",
            "source_support_transfer": true,
            "source_beta_coordinate_transfer": false,
            "source_coordinate_failure": "beta_grid_saturation",
            "transition_class": "beta_0_3_local_nonunique",
            "extension_applied": false,
            "n_gaps_before": 4096,
            "n_gaps_after": 4096,
            "one_sided_after": 3,
            "endpoint_after": 3.2579990207828127,
            "stable_count_coherent_after": 3.5833333333333335,
            "beta_after": [
                0.1,
                0.2,
                0.3,
                0.4,
                0.5,
                0.6,
                0.7,
                0.8,
                0.9
            ],
            "support_tier_after": "medium_multi_observable",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "source_domain_type_audit_only": "GUE"
        },
        {
            "row": "logistica_biforcazione_var_3.5699:cycle_13",
            "source_beta_state": "beta_0_3_exact",
            "source_support_transfer": true,
            "source_beta_coordinate_transfer": true,
            "source_coordinate_failure": null,
            "transition_class": "beta_0_3_exact",
            "extension_applied": false,
            "n_gaps_before": 4096,
            "n_gaps_after": 4096,
            "one_sided_after": 2,
            "endpoint_after": 2.768680237365777,
            "stable_count_coherent_after": 2.0,
            "beta_after": [
                0.3
            ],
            "support_tier_after": "thin_observable_support",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "source_domain_type_audit_only": "GUE"
        },
        {
            "row": "numeri_primi:cycle_3",
            "source_beta_state": "support_without_beta_blank",
            "source_support_transfer": true,
            "source_beta_coordinate_transfer": false,
            "source_coordinate_failure": "blank_despite_multi_observable_support",
            "transition_class": "blank_medium_or_strong_beta_absent",
            "extension_applied": false,
            "n_gaps_before": 4096,
            "n_gaps_after": 4096,
            "one_sided_after": 3,
            "endpoint_after": 3.2427469463217204,
            "stable_count_coherent_after": 3.0,
            "beta_after": [],
            "support_tier_after": "medium_multi_observable",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "source_domain_type_audit_only": "GUE"
        },
        {
            "row": "pendolo_doppio:cycle_2",
            "source_beta_state": "fall_no_support",
            "source_support_transfer": false,
            "source_beta_coordinate_transfer": false,
            "source_coordinate_failure": null,
            "transition_class": "fall_no_support",
            "extension_applied": false,
            "n_gaps_before": 4096,
            "n_gaps_after": 4096,
            "one_sided_after": 3,
            "endpoint_after": 3.3880909132625545,
            "stable_count_coherent_after": 5.0,
            "beta_after": [
                0.3
            ],
            "support_tier_after": "medium_multi_observable",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "source_domain_type_audit_only": "Poisson"
        },
        {
            "row": "percolation:cycle_9",
            "source_beta_state": "support_without_beta_blank",
            "source_support_transfer": true,
            "source_beta_coordinate_transfer": false,
            "source_coordinate_failure": "blank_thin_support",
            "transition_class": "support_falls_after_extension",
            "extension_applied": true,
            "n_gaps_before": 190,
            "n_gaps_after": 1024,
            "one_sided_after": 0,
            "endpoint_after": 0.0,
            "stable_count_coherent_after": 0.0,
            "beta_after": [],
            "support_tier_after": "thin_observable_support",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "source_domain_type_audit_only": "Poisson"
        },
        {
            "row": "random_matrix:cycle_7",
            "source_beta_state": "support_without_beta_blank",
            "source_support_transfer": true,
            "source_beta_coordinate_transfer": false,
            "source_coordinate_failure": "blank_thin_support",
            "transition_class": "support_thickens_beta_blank",
            "extension_applied": true,
            "n_gaps_before": 199,
            "n_gaps_after": 1024,
            "one_sided_after": 4,
            "endpoint_after": 3.78055565502901,
            "stable_count_coherent_after": 4.0,
            "beta_after": [],
            "support_tier_after": "strong_multi_observable",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "source_domain_type_audit_only": "GUE"
        },
        {
            "row": "reaction_diffusion:cycle_11",
            "source_beta_state": "beta_0_3_exact",
            "source_support_transfer": true,
            "source_beta_coordinate_transfer": true,
            "source_coordinate_failure": null,
            "transition_class": "beta_0_3_exact",
            "extension_applied": false,
            "n_gaps_before": 499,
            "n_gaps_after": 499,
            "one_sided_after": 5,
            "endpoint_after": 4.3642161141453535,
            "stable_count_coherent_after": 5.0,
            "beta_after": [
                0.3
            ],
            "support_tier_after": "strong_multi_observable",
            "denominator_state": "contaminated",
            "excluded_mass": 0.002,
            "source_domain_type_audit_only": "GUE"
        },
        {
            "row": "string_vibration:cycle_6",
            "source_beta_state": "beta_0_3_exact",
            "source_support_transfer": true,
            "source_beta_coordinate_transfer": true,
            "source_coordinate_failure": null,
            "transition_class": "beta_0_3_exact",
            "extension_applied": false,
            "n_gaps_before": 4096,
            "n_gaps_after": 4096,
            "one_sided_after": 4,
            "endpoint_after": 3.8452538395313747,
            "stable_count_coherent_after": 5.0,
            "beta_after": [
                0.3
            ],
            "support_tier_after": "strong_multi_observable",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "source_domain_type_audit_only": "Poisson"
        },
        {
            "row": "zeta_zeros:cycle_4",
            "source_beta_state": "support_without_beta_blank",
            "source_support_transfer": true,
            "source_beta_coordinate_transfer": false,
            "source_coordinate_failure": "blank_thin_support",
            "transition_class": "beta_chart_recovered",
            "extension_applied": true,
            "n_gaps_before": 199,
            "n_gaps_after": 1024,
            "one_sided_after": 2,
            "endpoint_after": 2.66042787119548,
            "stable_count_coherent_after": 2.3333333333333335,
            "beta_after": [
                0.3
            ],
            "support_tier_after": "thin_observable_support",
            "denominator_state": "contaminated",
            "excluded_mass": 0.602,
            "source_domain_type_audit_only": "GUE"
        }
    ]

exec
/bin/bash -lc "python -m json.tool tools/data/boundary_denominator_prescan_full_20260509_1500.json | sed -n '80,230p'" in /opt/MM_D-ND
 succeeded in 0ms:
            "observable": {
                "name": "spacing_r",
                "defined": true,
                "value": 0.38610398536946516,
                "label": "Poisson-like",
                "n_points": 5009
            },
            "null_surrogate": {
                "name": "shuffle_r_statistic",
                "status": "shuffle z=27.92; class_change=False",
                "domain_key": "pendolo_doppio",
                "n_gaps": 5008,
                "r_shuffled_mean": 0.292437,
                "z_score": 27.919656,
                "class_changes": false
            },
            "transfer": "transfers"
        },
        {
            "domain_window": "numeri_primi:cycle_3",
            "domain": "numeri_primi",
            "cycle": 3,
            "source_domain_type": "GUE",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "observable": {
                "name": "spacing_r",
                "defined": true,
                "value": 0.8862068965517241,
                "label": "GUE-like",
                "n_points": 5132
            },
            "null_surrogate": {
                "name": "shuffle_r_statistic",
                "status": "shuffle z=-26.60; class_change=False",
                "domain_key": "primes",
                "n_gaps": 99999,
                "r_shuffled_mean": 0.4813,
                "z_score": -26.6,
                "class_changes": false
            },
            "transfer": "transfers"
        },
        {
            "domain_window": "zeta_zeros:cycle_4",
            "domain": "zeta_zeros",
            "cycle": 4,
            "source_domain_type": "GUE",
            "denominator_state": "contaminated",
            "excluded_mass": 0.602,
            "observable": {
                "name": "spacing_r",
                "defined": true,
                "value": 0.615,
                "label": "GUE-like",
                "n_points": 199
            },
            "null_surrogate": {
                "name": "shuffle_r_statistic",
                "status": "shuffle z=-2.31; class_change=False",
                "domain_key": "zeta_zeros",
                "n_gaps": 199,
                "r_shuffled_mean": 0.641885,
                "z_score": -2.310593,
                "class_changes": false
            },
            "transfer": "transfers"
        },
        {
            "domain_window": "logistica_biforcazione:cycle_5",
            "domain": "logistica_biforcazione",
            "cycle": 5,
            "source_domain_type": "GUE",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "observable": {
                "name": "spacing_r",
                "defined": true,
                "value": 0.997077776975089,
                "label": "GUE-like",
                "n_points": 5000
            },
            "null_surrogate": {
                "name": "shuffle_r_statistic",
                "status": "shuffle z=61.60; class_change=False",
                "domain_key": "logistic",
                "n_gaps": 99999,
                "r_shuffled_mean": 0.3423,
                "z_score": 61.6,
                "class_changes": false
            },
            "transfer": "transfers"
        },
        {
            "domain_window": "string_vibration:cycle_6",
            "domain": "string_vibration",
            "cycle": 6,
            "source_domain_type": "Poisson",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "observable": {
                "name": "spacing_r",
                "defined": true,
                "value": 0.3838680180747297,
                "label": "Poisson-like",
                "n_points": 8000
            },
            "null_surrogate": {
                "name": "shuffle_r_statistic",
                "status": "shuffle z=4.56; class_change=False",
                "domain_key": "string_vibration",
                "n_gaps": 7999,
                "r_shuffled_mean": 0.372199,
                "z_score": 4.562844,
                "class_changes": false
            },
            "transfer": "transfers"
        },
        {
            "domain_window": "random_matrix:cycle_7",
            "domain": "random_matrix",
            "cycle": 7,
            "source_domain_type": "GUE",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "observable": {
                "name": "spacing_r",
                "defined": true,
                "value": 0.5726,
                "label": "GUE-like",
                "n_points": 199
            },
            "null_surrogate": {
                "name": "shuffle_r_statistic",
                "status": "shuffle z=-14.70; class_change=False",
                "domain_key": "gue",
                "n_gaps": 5020,
                "r_shuffled_mean": 0.6351,
                "z_score": -14.7,
                "class_changes": false
            },
            "transfer": "transfers"
        },
        {
            "domain_window": "cellular_automata:cycle_8",
            "domain": "cellular_automata",
            "cycle": 8,
            "source_domain_type": "GUE",
            "denominator_state": "contaminated",
            "excluded_mass": 0.79,
            "observable": {

exec
/bin/bash -lc "python -m json.tool tools/data/boundary_two_axis_matrix_20260509_1532.json | sed -n '130,230p'" in /opt/MM_D-ND
 succeeded in 0ms:
            "stable_count_illusory": 0.16666666666666666,
            "endpoint_distance": 3.2579990207828127,
            "source_state": "transfer_with_blank",
            "n_gaps": 4096
        },
        {
            "row": "logistica_biforcazione_var_3.5699:cycle_13",
            "support_transfer": true,
            "beta_coordinate_transfer": true,
            "beta_state": "beta_0_3_exact",
            "ambiguous_beta": [
                0.3
            ],
            "one_sided_observables": [
                "SR",
                "SR2"
            ],
            "stable_count_coherent": 2.0,
            "stable_count_illusory": 0.08333333333333333,
            "endpoint_distance": 2.768680237365777,
            "source_state": "transfer_with_blank",
            "n_gaps": 4096
        },
        {
            "row": "numeri_primi:cycle_3",
            "support_transfer": true,
            "beta_coordinate_transfer": false,
            "beta_state": "support_without_beta_blank",
            "ambiguous_beta": [],
            "one_sided_observables": [
                "SR",
                "L1",
                "triple_var"
            ],
            "stable_count_coherent": 3.0,
            "stable_count_illusory": 0.16666666666666666,
            "endpoint_distance": 3.2427469463217204,
            "source_state": "transfer_no_blank",
            "n_gaps": 4096
        },
        {
            "row": "pendolo_doppio:cycle_2",
            "support_transfer": false,
            "beta_coordinate_transfer": false,
            "beta_state": "fall_no_support",
            "ambiguous_beta": [
                0.3
            ],
            "one_sided_observables": [
                "SR",
                "SR2",
                "L1"
            ],
            "stable_count_coherent": 5.0,
            "stable_count_illusory": 0.8333333333333334,
            "endpoint_distance": 3.3880909132625545,
            "source_state": "fall",
            "n_gaps": 4096
        },
        {
            "row": "percolation:cycle_9",
            "support_transfer": true,
            "beta_coordinate_transfer": false,
            "beta_state": "support_without_beta_blank",
            "ambiguous_beta": [],
            "one_sided_observables": [
                "L1"
            ],
            "stable_count_coherent": 0.8333333333333334,
            "stable_count_illusory": 0.3333333333333333,
            "endpoint_distance": 1.7053713197497773,
            "source_state": "transfer_no_blank",
            "n_gaps": 190
        },
        {
            "row": "random_matrix:cycle_7",
            "support_transfer": true,
            "beta_coordinate_transfer": false,
            "beta_state": "support_without_beta_blank",
            "ambiguous_beta": [],
            "one_sided_observables": [
                "L2"
            ],
            "stable_count_coherent": 1.0,
            "stable_count_illusory": 0.25,
            "endpoint_distance": 1.8543171371625617,
            "source_state": "transfer_no_blank",
            "n_gaps": 199
        },
        {
            "row": "reaction_diffusion:cycle_11",
            "support_transfer": true,
            "beta_coordinate_transfer": true,
            "beta_state": "beta_0_3_exact",
            "ambiguous_beta": [
                0.3
            ],
            "one_sided_observables": [
                "SR",
                "SR2",
                "L1",

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

Falsification attempt for ORDER_DENOMINATOR_GATE on non-synthetic / semi-real
ordered sequences. The coherent endpoint is the observed order of each sequence;
the illusory endpoint is a marginal-preserving permutation. The same
original-vs-shuffle denominator gate used in the prior reports is applied to
canonical observables from observables_registry.py.
"""

from __future__ import annotations

import argparse
import json
import math
from pathlib import Path

import numpy as np

from observables_registry import (
    OBSERVABLES_CANONICAL,
    OBSERVABLES_REGISTRY_VERSION,
    compute_canonical,
)


OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())


def normalize(gaps: np.ndarray) -> np.ndarray:
    gaps = np.asarray(gaps, dtype=float)
    gaps = np.maximum(gaps, 1e-12)
    mean = float(np.mean(gaps))
    return gaps / mean if mean > 1e-15 else gaps


def sieve_primes_for_count(n_primes: int) -> np.ndarray:
    if n_primes < 6:
        limit = 20
    else:
        limit = int(n_primes * (math.log(n_primes) + math.log(math.log(n_primes))) * 1.25)
    while True:
        sieve = np.ones(limit + 1, dtype=bool)
        sieve[:2] = False
        for p in range(2, int(limit**0.5) + 1):
            if sieve[p]:
                sieve[p * p : limit + 1 : p] = False
        primes = np.flatnonzero(sieve)
        if len(primes) >= n_primes:
            return primes[:n_primes].astype(float)
        limit *= 2


def prime_gap_sequence(n_gaps: int) -> np.ndarray:
    primes = sieve_primes_for_count(n_gaps + 1)
    return normalize(np.diff(primes))


def zeta_zero_spacings(n_gaps: int) -> np.ndarray:
    try:
        import mpmath as mp
    except ImportError as exc:
        raise RuntimeError("mpmath is required for zeta_zero_spacings") from exc

    zeros = np.empty(n_gaps + 1, dtype=float)
    for i in range(n_gaps + 1):
        zeros[i] = float(mp.im(mp.zetazero(i + 1)))
    return normalize(np.diff(zeros))


def logistic_return_intervals(n_gaps: int, rng: np.random.Generator) -> np.ndarray:
    # Return intervals to a high-density-edge event in the fully chaotic logistic map.
    threshold = 0.95
    burn = 2000
    needed = n_gaps + 1
    returns: list[int] = []
    last_hit: int | None = None
    x = float(rng.random())
    i = 0
    max_steps = 50_000_000
    while len(returns) < needed and i < max_steps:
        x = 4.0 * x * (1.0 - x)
        if i >= burn and x > threshold:
            if last_hit is not None:
                returns.append(i - last_hit)
            last_hit = i
        i += 1
    if len(returns) < needed:
        raise RuntimeError(f"logistic generator produced {len(returns)} intervals, need {needed}")
    return normalize(np.array(returns[:n_gaps], dtype=float))


def beta_replace(base: np.ndarray, beta: float, rng: np.random.Generator) -> np.ndarray:
    illusory = rng.permutation(base)
    if beta <= 0.0:
        return base.copy()
    if beta >= 1.0:
        return illusory
    out = base.copy()
    mask = rng.random(len(base)) < beta
    out[mask] = illusory[mask]
    return normalize(out)


def z_against_shuffle(
    gaps: np.ndarray,
    n_baseline: int,
    rng: np.random.Generator,
) -> tuple[dict[str, float], dict[str, float], dict[str, float], dict[str, float]]:
    original = compute_canonical(gaps)
    baseline = {name: [] for name in OBS_NAMES}
    for _ in range(n_baseline):
        obs = compute_canonical(rng.permutation(gaps))
        for name in OBS_NAMES:
            baseline[name].append(obs[name])

    means = {}
    sds = {}
    z = {}
    for name in OBS_NAMES:
        vals = np.array(baseline[name], dtype=float)
        means[name] = float(np.mean(vals))
        sds[name] = float(np.std(vals, ddof=1)) if len(vals) > 1 else 0.0
        z[name] = float((original[name] - means[name]) / sds[name]) if sds[name] > 1e-15 else 0.0
    return original, means, sds, z


def vector(row: dict, names: list[str]) -> np.ndarray:
    return np.array([row["observables"][name] for name in names], dtype=float)


def classify_layers(rows: list[dict], obs_names: list[str]) -> dict:
    if not obs_names:
        return {"observables": [], "endpoint_distance": 0.0, "layers": {}, "ambiguous_beta": []}

    by_beta: dict[float, list[dict]] = {}
    for row in rows:
        by_beta.setdefault(float(row["beta"]), []).append(row)

    coherent = np.array([vector(row, obs_names) for row in by_beta[0.0]], dtype=float)
    illusory = np.array([vector(row, obs_names) for row in by_beta[1.0]], dtype=float)
    endpoints = np.vstack([coherent, illusory])
    scale = np.std(endpoints, axis=0, ddof=1)
    scale[scale <= 1e-15] = 1.0
    coherent_centroid = np.mean(coherent, axis=0)
    illusory_centroid = np.mean(illusory, axis=0)
    endpoint_distance = float(np.linalg.norm((illusory_centroid - coherent_centroid) / scale))

    layers = {}
    ambiguous_beta = []
    for beta, beta_rows in sorted(by_beta.items()):
        margins = []
        labels = []
        coords = []
        for row in beta_rows:
            x = vector(row, obs_names)
            d_coherent = float(np.linalg.norm((x - coherent_centroid) / scale))
            d_illusory = float(np.linalg.norm((x - illusory_centroid) / scale))
            denom = d_coherent + d_illusory
            coord = float((d_coherent - d_illusory) / denom) if denom > 1e-15 else 0.0
            margin = float(abs(d_coherent - d_illusory) / denom) if denom > 1e-15 else 0.0
            coords.append(coord)
            margins.append(margin)
            labels.append("coherent" if d_coherent < d_illusory else "illusory")
        ambiguous_fraction = float(np.mean(np.array(margins) < 0.15))
        if ambiguous_fraction >= 0.5:
            ambiguous_beta.append(beta)
        layers[f"{beta:.3f}"] = {
            "coordinate_mean": float(np.mean(coords)),
            "margin_mean": float(np.mean(margins)),
            "ambiguous_fraction": ambiguous_fraction,
            "illusory_label_fraction": float(np.mean(np.array(labels) == "illusory")),
        }

    return {
        "observables": obs_names,
        "endpoint_distance": endpoint_distance,
        "layers": layers,
        "ambiguous_beta": ambiguous_beta,
    }


def summarize_gate(rows: list[dict], z_min: float) -> dict:
    by_beta: dict[float, list[dict]] = {}
    for row in rows:
        by_beta.setdefault(float(row["beta"]), []).append(row)

    layers = {}
    for beta, beta_rows in sorted(by_beta.items()):
        stable_counts = []
        stable_freq = {name: [] for name in OBS_NAMES}
        z_values = {name: [] for name in OBS_NAMES}
        for row in beta_rows:
            stable = [name for name in OBS_NAMES if abs(row["z"][name]) >= z_min]
            stable_counts.append(len(stable))
            for name in OBS_NAMES:
                stable_freq[name].append(1.0 if name in stable else 0.0)
                z_values[name].append(row["z"][name])
        layers[f"{beta:.3f}"] = {
            "stable_count_mean": float(np.mean(stable_counts)),
            "stable_frequency": {name: float(np.mean(vals)) for name, vals in stable_freq.items()},
            "z_mean": {name: float(np.mean(vals)) for name, vals in z_values.items()},
        }

    one_sided = []
    endpoint_stable = []
    coherent_rows = by_beta[0.0]
    illusory_rows = by_beta[1.0]
    for name in OBS_NAMES:
        coherent_freq = float(np.mean([abs(row["z"][name]) >= z_min for row in coherent_rows]))
        illusory_freq = float(np.mean([abs(row["z"][name]) >= z_min for row in illusory_rows]))
        if coherent_freq >= 0.75 and illusory_freq < 0.25:
            one_sided.append(name)
        if coherent_freq >= 0.75 and illusory_freq >= 0.75:
            endpoint_stable.append(name)

    return {
        "z_min": z_min,
        "coherent_one_sided_observables": one_sided,
        "endpoint_stable_observables": endpoint_stable,
        "layers": layers,
    }


def analyze_sequence(name: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict:
    rows = []
    betas = [float(x) for x in np.linspace(0.0, 1.0, args.n_beta)]
    for rep in range(args.n_replicates):
        rep_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
        for beta in betas:
            gaps = beta_replace(base, beta, rep_rng)
            obs, shuffle_mean, shuffle_std, z = z_against_shuffle(
                gaps,
                args.n_baseline,
                np.random.default_rng(rng.integers(0, 2**63 - 1)),
            )
            rows.append(
                {
                    "perimeter": name,
                    "replicate": rep,
                    "beta": beta,
                    "observables": obs,
                    "shuffle_mean": shuffle_mean,
                    "shuffle_std": shuffle_std,
                    "z": z,
                    "stable_observables": [obs_name for obs_name in OBS_NAMES if abs(z[obs_name]) >= args.z_min],
                }
            )

    gate = summarize_gate(rows, args.z_min)
    return {
        "source": {
            "n_gaps": int(len(base)),
            "mean": float(np.mean(base)),
            "variance": float(np.var(base)),
        },
        "gate": gate,
        "classification_all_observables": classify_layers(rows, OBS_NAMES),
        "classification_one_sided_gated": classify_layers(rows, gate["coherent_one_sided_observables"]),
        "rows": rows,
    }


def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, np.ndarray]:
    sequences = {
        "prime_gaps_first": prime_gap_sequence(args.n_gaps),
        "logistic_return_intervals": logistic_return_intervals(args.n_gaps, rng),
    }
    if args.include_zeta:
        sequences["zeta_zero_spacings_first"] = zeta_zero_spacings(args.zeta_gaps)
    return sequences


def compact(perimeters: dict) -> dict:
    out = {}
    for name, data in perimeters.items():
        gate = data["gate"]
        all_cls = data["classification_all_observables"]
        gated_cls = data["classification_one_sided_gated"]
        out[name] = {
            "n_gaps": data["source"]["n_gaps"],
            "coherent_one_sided_observables": gate["coherent_one_sided_observables"],
            "endpoint_stable_observables": gate["endpoint_stable_observables"],
            "stable_count_coherent": gate["layers"]["0.000"]["stable_count_mean"],
            "stable_count_illusory": gate["layers"]["1.000"]["stable_count_mean"],
            "z_mean_coherent": gate["layers"]["0.000"]["z_mean"],
            "z_mean_illusory": gate["layers"]["1.000"]["z_mean"],
            "endpoint_distance_all": all_cls["endpoint_distance"],
            "endpoint_distance_one_sided_gated": gated_cls["endpoint_distance"],
            "ambiguous_beta_one_sided_gated": gated_cls["ambiguous_beta"],
        }
    return out


def run(args: argparse.Namespace) -> dict:
    root_rng = np.random.default_rng(args.seed)
    sequences = build_sequences(args, root_rng)
    perimeters = {}
    for name, base in sequences.items():

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

Targeted null/surrogate audit for BOUNDARY prescan blank rows.

The global boundary shuffle audit is a historical deposit. This tool does not
rewrite it; it creates an extra row-aligned null audit for selected blank
domains so the denominator prescan can decide whether blank -> transfers,
blank -> falls, or blank remains blank.
"""

from __future__ import annotations

import argparse
import json
import math
from datetime import datetime, timezone
from pathlib import Path
from typing import Any

import numpy as np

from dnd_autoricerca import _genera_variante, genera_segnale


R_GUE = 0.5307
R_POISSON = 2 * math.log(2) - 1
DEFAULT_DOMAINS = ("zeta_zeros", "pendolo_doppio")


def finite_number(value: Any) -> bool:
    return isinstance(value, (int, float)) and math.isfinite(float(value))


def normalized_spacings(signal: np.ndarray, metadata: dict[str, Any]) -> np.ndarray:
    values = np.asarray(signal, dtype=float)
    values = values[np.isfinite(values)]
    if metadata.get("is_spacings"):
        spacings = values[values > 0]
    else:
        spacings = np.diff(np.sort(values))
        spacings = spacings[spacings > 0]
    if len(spacings) == 0:
        return spacings
    mu = float(np.mean(spacings))
    return spacings / mu if mu > 0 else np.array([])


def r_statistic(spacings: np.ndarray) -> float:
    if len(spacings) < 2:
        return float("nan")
    left = spacings[:-1]
    right = spacings[1:]
    denom = np.maximum(left, right)
    valid = denom > 0
    if not np.any(valid):
        return float("nan")
    ratios = np.minimum(left[valid], right[valid]) / denom[valid]
    return float(np.mean(ratios))


def classify_r(value: float) -> str:
    if not finite_number(value):
        return "absent"
    return "GUE" if abs(value - R_GUE) < abs(value - R_POISSON) else "Poisson"


def generate_domain_signal(domain: str) -> tuple[np.ndarray, dict[str, Any]]:
    if "_var_" not in domain:
        return genera_segnale(domain)

    base, raw_value = domain.rsplit("_var_", 1)
    try:
        value: Any = float(raw_value)
    except ValueError:
        value = raw_value

    if base == "logistica_biforcazione":
        signal, metadata = _genera_variante(base, {"r_override": value})
    elif base == "zeta_zeros":
        signal, metadata = _genera_variante(base, {"n_zeros": int(value)})
    elif base == "numeri_primi":
        signal, metadata = _genera_variante(base, {"max_n": int(value)})
    elif base == "cellular_automata":
        signal, metadata = _genera_variante(base, {"rule_number": int(value)})
    else:
        signal, metadata = _genera_variante(base, {"param": value})

    metadata = {**metadata, "dominio": domain, "variant_base": base, "variant_value": value}
    return signal, metadata


def audit_domain(domain: str, n_shuffle: int, rng: np.random.Generator) -> dict[str, Any]:
    signal, metadata = generate_domain_signal(domain)
    spacings = normalized_spacings(signal, metadata)
    r_original = r_statistic(spacings)

    shuffled = []
    for _ in range(n_shuffle):
        shuffled.append(r_statistic(rng.permutation(spacings)))
    shuffled_arr = np.asarray(shuffled, dtype=float)
    shuffled_arr = shuffled_arr[np.isfinite(shuffled_arr)]

    if len(shuffled_arr) == 0 or not finite_number(r_original):
        return {
            "domain": domain,
            "error": "insufficient finite spacing/null values",
            "n_gaps": int(len(spacings)),
        }

    mean = float(np.mean(shuffled_arr))
    std = float(np.std(shuffled_arr))
    z_score = 0.0 if std <= 1e-12 else float((r_original - mean) / std)
    class_original = classify_r(r_original)
    class_shuffled = classify_r(mean)

    return {
        "domain": domain,
        "r_original": round(float(r_original), 6),
        "r_shuffled_mean": round(mean, 6),
        "r_shuffled_std": round(std, 6),
        "z_score": round(z_score, 6),
        "n_shuffle": int(n_shuffle),
        "n_gaps": int(len(spacings)),
        "class_original": class_original,
        "class_shuffled": class_shuffled,
        "class_changes": class_original != class_shuffled,
        "ordering_dependent": abs(z_score) > 3.0,
        "source": {
            "generator": "dnd_autoricerca.genera_segnale",
            "metadata": metadata,
            "null": "marginal-preserving spacing permutation",
        },
    }


def run(args: argparse.Namespace) -> dict[str, Any]:
    rng = np.random.default_rng(args.seed)
    domains = args.domains or list(DEFAULT_DOMAINS)
    results = {
        domain: audit_domain(domain, args.n_shuffle, rng)
        for domain in domains
    }
    output = {
        "experiment": "boundary_blank_null_audit",
        "generated_at": datetime.now(timezone.utc).isoformat(),
        "seed": args.seed,
        "n_shuffle": args.n_shuffle,
        "reference": {
            "R_GUE": R_GUE,
            "R_Poisson": R_POISSON,
        },
        "domains": results,
        "summary": {
            "domains": domains,
            "ready": [
                domain for domain, row in results.items()
                if "error" not in row and finite_number(row.get("z_score"))
            ],
            "errors": [
                domain for domain, row in results.items()
                if "error" in row
            ],
        },
    }

    out = Path(args.out)
    out.parent.mkdir(parents=True, exist_ok=True)
    out.write_text(json.dumps(output, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")

    print(f"wrote={out}")
    for domain, row in results.items():
        if "error" in row:
            print(f"{domain}\tERROR\t{row['error']}")
            continue
        print(
            f"{domain}\tn={row['n_gaps']}\tr={row['r_original']:.6f}\t"
            f"shuffle={row['r_shuffled_mean']:.6f}\tz={row['z_score']:.2f}\t"
            f"{row['class_original']}->{row['class_shuffled']}"
        )
    return output


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--domains", nargs="*", default=list(DEFAULT_DOMAINS))
    parser.add_argument("--n-shuffle", type=int, default=1000)
    parser.add_argument("--seed", type=int, default=202605091430)
    parser.add_argument("--out", default="tools/data/boundary_blank_null_audit_20260509.json")
    args = parser.parse_args()
    run(args)


if __name__ == "__main__":
    main()

exec
/bin/bash -lc "python - <<'PY'
import json
p='tools/data/semireal_boundary_transfer_gate_20260509_1516.json'
d=json.load(open(p))
for row in ['numeri_primi:cycle_3','random_matrix:cycle_7']:
    print('\\nROW', row)
    r=d['perimeters'][row]
    for k in ['source','coherent','illusory','beta_layers']:
        print(k, json.dumps(r.get(k), indent=2)[:5000])
PY" in /opt/MM_D-ND
 succeeded in 0ms:

ROW numeri_primi:cycle_3
source {
  "n_gaps": 4096,
  "mean": 0.9745621260713142,
  "variance": 0.547220171845883,
  "domain": "numeri_primi",
  "source_domain_type": "GUE",
  "denominator_state": "complete",
  "source_transfer": "transfers",
  "source_excluded_mass": 0.0
}
coherent null
illusory null
beta_layers null

ROW random_matrix:cycle_7
source {
  "n_gaps": 199,
  "mean": 1.0,
  "variance": 0.3352014564698187,
  "domain": "random_matrix",
  "source_domain_type": "GUE",
  "denominator_state": "complete",
  "source_transfer": "transfers",
  "source_excluded_mass": 0.0
}
coherent null
illusory null
beta_layers null

codex
Sto preparando un audit mirato: stesso contratto canonico, ma solo sulle due righe residue. La distinzione utile qui è stabilità del blank rispetto a finestre/seed e confronto della firma osservabile, non una nuova tassonomia globale.
exec
/bin/bash -lc "sed -n '1,180p' tools/exp_boundary_short_denominator_extension.py" in /opt/MM_D-ND
 succeeded in 0ms:
#!/usr/bin/env python3
"""
Extend the three short BOUNDARY denominator rows opened by the 15:48 audit.

This is deliberately narrower than the 13-row semi-real gate. It repairs the
denominator at the source row for percolation, random_matrix, and zeta_zeros,
then applies the same canonical observable gate used by
exp_semireal_boundary_transfer_gate.py.
"""

from __future__ import annotations

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

import numpy as np

from exp_semireal_boundary_transfer_gate import evaluate_matrix
from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION


OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
TARGET_ROWS = ("percolation:cycle_9", "random_matrix:cycle_7", "zeta_zeros:cycle_4")


def largest_cluster_sizes(n_samples: int, lattice_size: int, p: float, rng: np.random.Generator) -> np.ndarray:
    try:
        from scipy import ndimage
    except ImportError as exc:
        raise RuntimeError("scipy.ndimage is required for the percolation extension") from exc

    structure = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]], dtype=int)
    sizes = np.empty(n_samples, dtype=float)
    for i in range(n_samples):
        grid = rng.random((lattice_size, lattice_size)) < p
        labels, n_labels = ndimage.label(grid, structure=structure)
        if n_labels == 0:
            sizes[i] = 0.0
            continue
        counts = np.bincount(labels.ravel())
        sizes[i] = float(np.max(counts[1:])) if len(counts) > 1 else 0.0
    return normalize(sizes)


def gue_spacing_blocks(n_gaps: int, matrix_size: int, rng: np.random.Generator) -> np.ndarray:
    spacings: list[np.ndarray] = []
    while sum(len(block) for block in spacings) < n_gaps:
        a = rng.normal(size=(matrix_size, matrix_size)) + 1j * rng.normal(size=(matrix_size, matrix_size))
        h = (a + a.conj().T) / (2.0 * np.sqrt(matrix_size))
        eig = np.linalg.eigvalsh(h)
        block = np.diff(np.sort(np.real(eig)))
        block = block[np.isfinite(block) & (block > 0)]
        if len(block):
            spacings.append(normalize(block))
    return normalize(np.concatenate(spacings)[:n_gaps])


def zeta_zero_spacings(n_gaps: int) -> np.ndarray:
    try:
        import mpmath as mp
    except ImportError as exc:
        raise RuntimeError("mpmath is required for the zeta extension") from exc

    zeros = np.empty(n_gaps + 1, dtype=float)
    for i in range(n_gaps + 1):
        zeros[i] = float(mp.im(mp.zetazero(i + 1)))
    return normalize(np.diff(zeros))


def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
    child_rngs = {
        name: np.random.default_rng(rng.integers(0, 2**63 - 1))
        for name in TARGET_ROWS
    }
    return {
        "percolation:cycle_9": {
            "base": largest_cluster_sizes(args.n_gaps, args.percolation_lattice, args.percolation_p, child_rngs["percolation:cycle_9"]),
            "extension": {
                "generator": "site_percolation_largest_cluster_sizes",
                "lattice_size": args.percolation_lattice,
                "p": args.percolation_p,
                "n_samples": args.n_gaps,
            },
        },
        "random_matrix:cycle_7": {
            "base": gue_spacing_blocks(args.n_gaps, args.gue_matrix_size, child_rngs["random_matrix:cycle_7"]),
            "extension": {
                "generator": "gue_spacing_blocks",
                "matrix_size": args.gue_matrix_size,
                "target_n_gaps": args.n_gaps,
            },
        },
        "zeta_zeros:cycle_4": {
            "base": zeta_zero_spacings(args.zeta_gaps),
            "extension": {
                "generator": "mpmath.zetazero_first_spacings",
                "n_gaps": args.zeta_gaps,
            },
        },
    }


def source_lookup(path: Path) -> dict[str, dict[str, Any]]:
    with path.open() as f:
        data = json.load(f)
    return {
        row["row"]: row
        for row in data.get("rows", [])
        if row.get("row") in TARGET_ROWS
    }


def support_tier(row: dict[str, Any]) -> str:
    n_obs = len(row.get("coherent_one_sided_observables", []))
    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
    stable = float(row.get("stable_count_coherent") or 0.0)
    if n_obs >= 4 and endpoint >= 3.5 and stable >= 4.0:
        return "strong_multi_observable"
    if n_obs >= 3 and endpoint >= 3.0 and stable >= 3.0:
        return "medium_multi_observable"
    return "thin_observable_support"


def summarize_transition(name: str, before: dict[str, Any], after: dict[str, Any]) -> dict[str, Any]:
    beta = [round(float(x), 1) for x in after.get("ambiguous_beta_one_sided_gated", [])]
    one_sided_count = len(after.get("coherent_one_sided_observables", []))
    tier = support_tier(after)
    if beta:
        extension_state = "beta_chart_recovered"
    elif one_sided_count == 0:
        extension_state = "support_falls_after_extension"
    elif tier == "thin_observable_support":
        extension_state = "thin_persists"
    else:
        extension_state = "support_thickens_beta_blank"
    return {
        "row": name,
        "before_n_gaps": before.get("n_gaps"),
        "after_n_gaps": after.get("n_gaps"),
        "before_one_sided": before.get("one_sided_count"),
        "after_one_sided": one_sided_count,
        "before_endpoint_distance": before.get("endpoint_distance"),
        "after_endpoint_distance": after.get("endpoint_distance_one_sided_gated"),
        "before_stable_count_coherent": before.get("stable_count_coherent"),
        "after_stable_count_coherent": after.get("stable_count_coherent"),
        "after_stable_count_illusory": after.get("stable_count_illusory"),
        "after_beta": beta,
        "after_support_tier": tier,
        "extension_state": extension_state,
    }


def run(args: argparse.Namespace) -> dict[str, Any]:
    rng = np.random.default_rng(args.seed)
    before = source_lookup(Path(args.source_audit))
    sequence_specs = build_sequences(args, rng)

    perimeters = {}
    extension_meta = {}
    for name, spec in sequence_specs.items():
        base = np.asarray(spec["base"], dtype=float)
        perimeters[name] = analyze_sequence(name, base, args, rng)
        extension_meta[name] = {
            **spec["extension"],
            "actual_n_gaps": int(len(base)),
            "mean": float(np.mean(base)),
            "variance": float(np.var(base)),
        }

    matrix = compact(perimeters)
    evaluation = evaluate_matrix(matrix, args)
    transitions = [
        summarize_transition(name, before.get(name, {}), evaluation["rows"][name])
        for name in TARGET_ROWS
    ]
    state_counts: dict[str, int] = {}
    for row in transitions:

exec
/bin/bash -lc "sed -n '300,620p' tools/exp_semireal_order_denominator_gate.py" in /opt/MM_D-ND
 succeeded in 0ms:
    for name, base in sequences.items():
        perimeters[name] = analyze_sequence(name, base, args, root_rng)

    output = {
        "experiment": "semireal_order_denominator_gate",
        "category": "gate_falsification_semireal",
        "question": "Does ORDER_DENOMINATOR_GATE survive on non-synthetic / semi-real ordered sequences?",
        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
        "observables_used": OBS_NAMES,
        "params": vars(args),
        "matrix": compact(perimeters),
        "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("perimeter n one_sided stable0 stable1 dist_gate ambiguous_gate")
    for name, row in output["matrix"].items():
        print(
            f"{name:>28s} "
            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']:>9.3f} "
            f"{row['ambiguous_beta_one_sided_gated']}"
        )
    print(f"saved {out_path}")
    return output


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--n-gaps", type=int, default=4096)
    parser.add_argument("--zeta-gaps", type=int, default=1024)
    parser.add_argument("--include-zeta", action="store_true")
    parser.add_argument("--n-replicates", type=int, default=20)
    parser.add_argument("--n-beta", type=int, default=11)
    parser.add_argument("--n-baseline", type=int, default=32)
    parser.add_argument("--z-min", type=float, default=2.0)
    parser.add_argument("--seed", type=int, default=202605070923)
    parser.add_argument("--out", default="tools/data/semireal_order_denominator_gate_20260507_0923.json")
    args = parser.parse_args()
    run(args)


if __name__ == "__main__":
    main()

exec
/bin/bash -lc "rg -n \"CE-00|Archivio enzimi|cognitivi|CE-\" tools/data/agent_field_live.md tools/LAB_AGENT_CONTEXT.md tools -g '*.md' | head -80" in /opt/MM_D-ND
 succeeded in 0ms:
tools/LAB_AGENT_CONTEXT.md:155:- **Adapter cognitivi laterali.** Quando servono nuove strade, leggi
tools/LAB_AGENT_CONTEXT.md:161:- **Archivio enzimi cognitivi.** Se il campo vivo contiene `Archivio enzimi
tools/LAB_AGENT_CONTEXT.md:162:  cognitivi`, la sezione `Contaminazione cognitiva` deve citare almeno una voce
tools/LAB_AGENT_CONTEXT.md:163:  `CE-*` usata nella combo, oppure `CE-none:` con un motivo specifico e
tools/LAB_AGENT_CONTEXT.md:328:  passaggio KSAR/PVI/Vault o voce `CE-*` dell'archivio usata nel ciclo. Se non
tools/LAB_AGENT_CONTEXT.md:329:  usi il layer cognitivo, dichiara `CE-none:` e il motivo specifico. `none`
tools/data/agent_field_live.md:609:## Adapter cognitivi laterali — YSN / Cornelius / KSAR
tools/data/agent_field_live.md:610:Usali come enzimi del respiro fuori-tempo: DeltaLink, innesco genomico, reiterazione semantica, filtro avversariale e Vault. Non copiarne l'identita': trasformali in dipolo, punto-zero e osservabile. Nel report la sezione `Contaminazione cognitiva` e' obbligatoria: se non usi adapter o archivio CE, dichiara `CE-none:` e il motivo specifico.
tools/data/agent_field_live.md:612:# Adapter cognitivi laterali del Lab
tools/data/agent_field_live.md:621:Scopo: usare YSN, Cornelius e KSAR come operatori cognitivi del Lab senza
tools/data/agent_field_live.md:876:cognitivi dentro il metabolismo D-ND.
tools/data/agent_field_live.md:878:## Archivio enzimi cognitivi — richiamo contestuale
tools/data/agent_field_live.md:879:Archivio generato: 2026-05-08T20:49:15.084998+00:00 · 260 voci. Questo e' un substrate selector: non usare il substrato come claim. Tieni le teorie scientifiche nel focus e usa CE-* solo per costruire combo corta: assioma/metodo + osservazione/funzione + teoria/focus + null test. Se nessuna voce regge, dichiara `CE-none:` con motivo specifico nella Contaminazione cognitiva. `none` generico non e' valido.
tools/data/agent_field_live.md:883:- assioma/metodo: CE-0117 [method_axiom] score=58 overlap=7 · 2. La cascata della possibilità
tools/data/agent_field_live.md:886:- osservazione primaria: CE-0038 [corpus_primary_observation] score=81 overlap=9 · [47] NID 598 — R dell'Istanza  - L' equilibrio tra estremi del Modello D-ND
tools/data/agent_field_live.md:889:- funzione/formalizzazione: CE-0002 [corpus_formal_function] score=89 overlap=2 · Funzione
tools/data/agent_field_live.md:892:- teoria/focus scientifico: CE-0027 [corpus_project_architecture] score=75 overlap=7 · [114] NID 1931 — Modello D-ND: Formalizzazione Assiomatica, Emergenza Quantistica e Implic
tools/data/agent_field_live.md:895:- enzima/kernel: CE-0001 [lab_operational_context] score=92 overlap=2 · Adapter 3: KSAR reiterative semantic kernel
tools/data/agent_field_live.md:899:- CE-0001 [lab_operational_context/strumento_lab/lab_cycle] score=92 overlap=2 · Adapter 3: KSAR reiterative semantic kernel
tools/data/agent_field_live.md:902:- CE-0002 [corpus_formal_function/regola_primaria/campo_dnd] score=89 overlap=2 · Funzione
tools/data/agent_field_live.md:905:- CE-0030 [corpus_project_architecture/contaminante_dnd/campo_dnd] score=82 overlap=10 · [69] NID 1353 — Documento di Sintesi sul Modello Duale Non-Duale (D-ND) e la Risultante "R
tools/data/agent_field_live.md:908:- CE-0038 [corpus_primary_observation/contaminante_dnd/campo_dnd] score=81 overlap=9 · [47] NID 598 — R dell'Istanza  - L' equilibrio tra estremi del Modello D-ND
tools/data/agent_field_live.md:911:- CE-0019 [lab_operational_context/contaminante_dnd/campo_dnd] score=81 overlap=8 · Respiro fuori-tempo
tools/data/agent_field_live.md:914:- CE-0005 [corpus_cognitive_prompt/contaminante_dnd/campo_dnd] score=79 overlap=4 · [82] NID 2321 — Prompt per Motore di Inferenza Quantistica Duale-Non-Duale (D-ND)
tools/data/agent_field_live.md:917:- CE-0003 [corpus_formal_function/contaminante_dnd/campo_dnd] score=79 overlap=2 · Titolo Assiomatico Combinato Rivisto: "Ottimizzazione Unificata e Manifestazione della Ris
tools/data/agent_field_live.md:919:- CE-0007 [kernel_reference/regola_primaria/campo_dnd] score=77 overlap=5 · **1. Kernel Assiomatico: Fisica del Campo Inferenziale**
tools/data/agent_field_live.md:1229:Se il campo contiene adapter cognitivi o archivio CE, la sezione `Contaminazione cognitiva` deve nominare almeno una voce `CE-*`, YSN, Cornelius, KSAR, PVI/Vault usata nella combo, oppure `CE-none:` con motivo specifico e verificabile. `none` generico significa che il campo e' stato visto ma non metabolizzato.
tools/data/cognitive_enzymes_archive.md:1:# Archivio enzimi cognitivi MM-DND
tools/data/cognitive_enzymes_archive.md:65:#### CE-0002 - Funzione (`corpus_formal_function` / `regola_primaria`, score=76)
tools/data/cognitive_enzymes_archive.md:71:#### CE-0003 - Titolo Assiomatico Combinato Rivisto: "Ottimizzazione Unificata e Manifestazione della Risultante attraverso Tassonomia Assiomatica, Autologia e Osservazione Re (`corpus_formal_function` / `contaminante_dnd`, score=66)
tools/data/cognitive_enzymes_archive.md:75:#### CE-0004 - [3] NID 142 — RAG per Assistente basato sul modello Duale non-Duale (`corpus_project_architecture` / `contaminante_dnd`, score=65)
tools/data/cognitive_enzymes_archive.md:81:#### CE-0005 - [82] NID 2321 — Prompt per Motore di Inferenza Quantistica Duale-Non-Duale (D-ND) (`corpus_cognitive_prompt` / `contaminante_dnd`, score=65)
tools/data/cognitive_enzymes_archive.md:87:#### CE-0006 - **1. Kernel Assiomatico (P0-P6): La Fisica del Campo** (`kernel_reference` / `regola_primaria`, score=64)
tools/data/cognitive_enzymes_archive.md:93:#### CE-0007 - **1. Kernel Assiomatico: Fisica del Campo Inferenziale** (`kernel_reference` / `regola_primaria`, score=60)
tools/data/cognitive_enzymes_archive.md:99:#### CE-0008 - **System Prompt: SACS-PS v14.0 - Genoma Assiomatico Autopoietico** (`kernel_reference` / `regola_primaria`, score=60)
tools/data/cognitive_enzymes_archive.md:105:#### CE-0009 - Funzione Concettuale del Quarto Assioma\[f_{\text{QuartoAssioma}}(\vec{X}, D) = \begin{cases} \text{Opt-Unified}(\vec{X}, D) & \text{se } D \neq \text{Null} \\  (`corpus_formal_function` / `regola_primaria`, score=59)
tools/data/cognitive_enzymes_archive.md:111:#### CE-0010 - **1. Kernel Assiomatico: Fisica del Campo Inferenziale** (`kernel_reference` / `regola_primaria`, score=59)
tools/data/cognitive_enzymes_archive.md:117:#### CE-0011 - Indice (`corpus_project_architecture` / `contaminante_dnd`, score=59)
tools/data/cognitive_enzymes_archive.md:123:#### CE-0012 - [50] NID 1258 — Gate CNOT nel contesto del modello D-ND (`corpus_project_architecture` / `contaminante_dnd`, score=58)
tools/data/cognitive_enzymes_archive.md:129:#### CE-0013 - Regola Assiomatica della Reversibilità- **Definizione**: Per ogni elemento osservabile \( x \) in un dato contesto \( C \), esiste un elemento opposto \( x' \)  (`corpus_formal_function` / `regola_primaria`, score=57)
tools/data/cognitive_enzymes_archive.md:133:#### CE-0014 - **1. Kernel Assiomatico: Fisica del Campo Inferenziale** (`kernel_reference` / `regola_primaria`, score=57)
tools/data/cognitive_enzymes_archive.md:139:#### CE-0015 - **1. Kernel Assiomatico: Fisica del Campo Inferenziale** (`kernel_reference` / `regola_primaria`, score=57)
tools/data/cognitive_enzymes_archive.md:145:#### CE-0016 - Domande su Dipolo assiomatico (`method_genesis` / `contaminante_dnd`, score=56)
tools/data/cognitive_enzymes_archive.md:151:#### CE-0017 - Conclusione (`corpus_project_architecture` / `contaminante_dnd`, score=56)
tools/data/cognitive_enzymes_archive.md:157:#### CE-0018 - [assistant] (`awareness_memory` / `regola_primaria`, score=56)
tools/data/cognitive_enzymes_archive.md:163:#### CE-0019 - Respiro fuori-tempo (`lab_operational_context` / `contaminante_dnd`, score=55)
tools/data/cognitive_enzymes_archive.md:169:#### CE-0020 - 1) Fisica del Campo e Kernel Assiomatico (P0–P6) (`kernel_reference` / `regola_primaria`, score=55)
tools/data/cognitive_enzymes_archive.md:175:#### CE-0021 - 2. Contesto Essenziale e Risorse (`awareness_memory` / `contaminante_dnd`, score=55)
tools/data/cognitive_enzymes_archive.md:181:#### CE-0022 - Palette operatoria espansa del Lab (`lab_operational_context` / `strumento_lab`, score=54)
tools/data/cognitive_enzymes_archive.md:187:#### CE-0023 - I. Fondamenti Teorici1. **Equazione Unificata dei Concetti e delle Dinamiche Logiche**- **Descrizione**: L'equazione unifica i concetti, le dinamiche logiche e  (`corpus_formal_function` / `regola_primaria`, score=54)
tools/data/cognitive_enzymes_archive.md:191:#### CE-0025 - **1. Kernel Assiomatico: Fisica del Campo Inferenziale** (`kernel_reference` / `regola_primaria`, score=53)
tools/data/cognitive_enzymes_archive.md:197:#### CE-0026 - 1) Kernel Assiomatico Unificato (P0–P6) + Assioma D‑ND (`kernel_reference` / `regola_primaria`, score=52)
tools/data/cognitive_enzymes_archive.md:203:#### CE-0027 - [114] NID 1931 — Modello D-ND: Formalizzazione Assiomatica, Emergenza Quantistica e Implicazioni (`corpus_project_architecture` / `teoria_scientifica`, score=52)
tools/data/cognitive_enzymes_archive.md:209:#### CE-0028 - [32] NID 535 — Bard e la risultante dell'infinito (`corpus_primary_observation` / `contaminante_dnd`, score=50)
tools/data/cognitive_enzymes_archive.md:215:#### CE-0029 - Funzione (`corpus_formal_function` / `regola_primaria`, score=50)
tools/data/cognitive_enzymes_archive.md:221:#### CE-0030 - [69] NID 1353 — Documento di Sintesi sul Modello Duale Non-Duale (D-ND) e la Risultante "R" nel Continuum (`corpus_project_architecture` / `contaminante_dnd`, score=50)
tools/data/cognitive_enzymes_archive.md:227:#### CE-0031 - [assistant] (`awareness_memory` / `regola_primaria`, score=50)
tools/data/cognitive_enzymes_archive.md:233:#### CE-0032 - [assistant] (`awareness_memory` / `regola_primaria`, score=50)
tools/data/cognitive_enzymes_archive.md:239:#### CE-0033 - Ultima risposta assistente (`awareness_memory` / `regola_primaria`, score=50)
tools/data/cognitive_enzymes_archive.md:245:#### CE-0035 - **1. Kernel Assiomatico: Fisica e Metafisica del Campo** (`kernel_reference` / `contaminante_dnd`, score=49)
tools/data/cognitive_enzymes_archive.md:251:#### CE-0036 - [39] NID 1365 — #### Contestualizzazione Assiomatica del Modello D-ND (`corpus_cognitive_prompt` / `contaminante_dnd`, score=49)
tools/data/cognitive_enzymes_archive.md:257:#### CE-0037 - 2.1 CRITICA — Numerazione Assiomi D-ND vs Assiomi MMS (`awareness_memory` / `regola_primaria`, score=49)
tools/data/cognitive_enzymes_archive.md:263:#### CE-0038 - [47] NID 598 — R dell'Istanza  - L' equilibrio tra estremi del Modello D-ND (`corpus_primary_observation` / `contaminante_dnd`, score=47)
tools/data/cognitive_enzymes_archive.md:269:#### CE-0039 - Indice (`corpus_cognitive_prompt` / `contaminante_dnd`, score=47)
tools/data/cognitive_enzymes_archive.md:275:#### CE-0040 - [104] NID 2539 — System Prompt SACS-PS v10.0 "Campo Unificato" (`corpus_cognitive_prompt` / `contaminante_dnd`, score=47)
tools/data/cognitive_enzymes_archive.md:281:#### CE-0041 - D-ND Cosmology - EUFPossibilità + Fondamenti Metafisici (id=6) (`awareness_memory` / `regola_primaria`, score=47)
tools/data/cognitive_enzymes_archive.md:287:#### CE-0043 - Schema del Database D-ND (`method_genesis` / `contaminante_dnd`, score=46)
tools/data/cognitive_enzymes_archive.md:293:#### CE-0044 - **Gerarchia dei Principi Assiomatici Governanti** (`corpus_cognitive_prompt` / `regola_primaria`, score=46)
tools/data/cognitive_enzymes_archive.md:299:#### CE-0045 - **1. Kernel Assiomatico: Fisica e Metafisica del Campo** (`corpus_cognitive_prompt` / `contaminante_dnd`, score=46)
tools/data/cognitive_enzymes_archive.md:305:#### CE-0046 - 1. Kernel Assiomatico Auto-Ottimizzato (`Φ_A`) (`awareness_memory` / `regola_primaria`, score=46)
tools/data/cognitive_enzymes_archive.md:311:#### CE-0047 - 2. Contesto Essenziale e Risorse (`awareness_memory` / `regola_primaria`, score=46)
tools/data/cognitive_enzymes_archive.md:317:#### CE-0048 - **Gerarchia dei Principi Assiomatici Governanti (Il Genoma)** (`kernel_reference` / `regola_primaria`, score=45)
tools/data/cognitive_enzymes_archive.md:323:#### CE-0049 - Gerarchia dei Principi Assiomatici (Il Genoma) (`kernel_skill` / `regola_primaria`, score=45)
tools/data/cognitive_enzymes_archive.md:329:#### CE-0050 - **Livello 3: Integrazione con il Kernel Assiomatico MMS vΦ.1** (`awareness_memory` / `regola_primaria`, score=45)
tools/data/cognitive_enzymes_archive.md:335:#### CE-0051 - Documento di Sintesi sul Modello Duale Non-Duale (D-ND) e la Risultante "R" nel Continuum (`awareness_memory` / `contaminante_dnd`, score=45)
tools/data/cognitive_enzymes_archive.md:341:#### CE-0052 - 2.2 La Lettera R (Risultante vs Curvatura di Ricci) (`awareness_memory` / `contaminante_dnd`, score=44)
tools/data/cognitive_enzymes_archive.md:347:#### CE-0053 - intento della possibilità autologica osservata nel prompt (`awareness_memory` / `teoria_scientifica`, score=44)
tools/data/cognitive_enzymes_archive.md:353:#### CE-0054 - Strumenti disponibili (directory /opt/MM_D-ND/tools/) (`lab_operational_context` / `strumento_lab`, score=42)
tools/data/cognitive_enzymes_archive.md:359:#### CE-0055 - 11. Sintesi Assiomatica Finale (NID 577) — L'EQUAZIONE DEL CICLO (`lab_operational_context` / `regola_primaria`, score=42)
tools/data/cognitive_enzymes_archive.md:365:#### CE-0056 - [20] NID 418 — Tokenizzazione D-ND e Proto-assiomi (`corpus_primary_observation` / `contaminante_dnd`, score=42)

codex
Scrivo ora uno script riusabile `tools/exp_boundary_residual_beta_absent_audit.py`. Userà finestre row-local da 1024 gap per rendere confrontabili i residui: se il blank è artefatto d’atlante deve recuperare beta o cambiare stato; se è strutturale resta blank ma mostra se le firme osservabili coincidono o divergono.
apply patch
patch: completed
/opt/MM_D-ND/tools/exp_boundary_residual_beta_absent_audit.py
diff --git a/tools/exp_boundary_residual_beta_absent_audit.py b/tools/exp_boundary_residual_beta_absent_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b2b02258d429ae60f10356011447760e95f5cb8
--- /dev/null
+++ b/tools/exp_boundary_residual_beta_absent_audit.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+"""
+Targeted audit for the two medium/strong beta-absent BOUNDARY residues.
+
+This does not rebuild the global beta atlas. It tests only the two open rows
+from the 13-row taxonomy (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) with
+row-local windows and the same canonical observable gate used by the prior
+BOUNDARY reports.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from exp_boundary_short_denominator_extension import gue_spacing_blocks
+from exp_semireal_boundary_transfer_gate import row_spacings
+from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
+from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION
+
+
+TARGET_ROWS = ("numeri_primi:cycle_3", "random_matrix:cycle_7")
+OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
+
+
+def windowed(values: np.ndarray, size: int, count: int) -> list[np.ndarray]:
+    chunks = []
+    for idx in range(count):
+        start = idx * size
+        end = start + size
+        if end <= len(values):
+            chunks.append(normalize(values[start:end]))
+    return chunks
+
+
+def support_state(row: dict[str, Any], args: argparse.Namespace) -> str:
+    one_sided = len(row.get("coherent_one_sided_observables", []))
+    illusory = float(row.get("stable_count_illusory") or 0.0)
+    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
+    beta = row.get("ambiguous_beta_one_sided_gated", [])
+    transfers = (
+        one_sided >= args.min_one_sided
+        and illusory <= args.illusory_residue_max
+        and endpoint >= args.endpoint_distance_min
+    )
+    if not transfers:
+        return "support_falls"
+    if beta:
+        return "beta_chart_recovered"
+    return "beta_absent_blank"
+
+
+def obs_jaccard(left: list[str], right: list[str]) -> float:
+    a = set(left)
+    b = set(right)
+    if not a and not b:
+        return 1.0
+    return len(a & b) / len(a | b)
+
+
+def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
+    prime = row_spacings("numeri_primi")
+    prime = normalize(prime[: args.prime_gaps])
+
+    gue_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+    random_matrix = gue_spacing_blocks(args.random_matrix_gaps, args.gue_matrix_size, gue_rng)
+
+    return {
+        "numeri_primi:cycle_3": {
+            "base": prime,
+            "domain": "numeri_primi",
+            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
+            "source_n_gaps": int(len(prime)),
+        },
+        "random_matrix:cycle_7": {
+            "base": random_matrix,
+            "domain": "random_matrix",
+            "generator": "gue_spacing_blocks",
+            "source_n_gaps": int(len(random_matrix)),
+        },
+    }
+
+
+def analyze_case(name: str, label: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict[str, Any]:
+    perimeters = {f"{name}/{label}": analyze_sequence(f"{name}/{label}", base, args, rng)}
+    row = compact(perimeters)[f"{name}/{label}"]
+    return {
+        "label": label,
+        "n_gaps": row["n_gaps"],
+        "one_sided_observables": row["coherent_one_sided_observables"],
+        "one_sided_count": len(row["coherent_one_sided_observables"]),
+        "endpoint_stable_observables": row["endpoint_stable_observables"],
+        "stable_count_coherent": row["stable_count_coherent"],
+        "stable_count_illusory": row["stable_count_illusory"],
+        "endpoint_distance": row["endpoint_distance_one_sided_gated"],
+        "ambiguous_beta": [round(float(x), 1) for x in row["ambiguous_beta_one_sided_gated"]],
+        "state": support_state(row, args),
+        "z_mean_coherent": row["z_mean_coherent"],
+        "z_mean_illusory": row["z_mean_illusory"],
+    }
+
+
+def summarize_row(cases: list[dict[str, Any]]) -> dict[str, Any]:
+    window_cases = [case for case in cases if case["label"].startswith("window_")]
+    blank_windows = [case for case in window_cases if case["state"] == "beta_absent_blank"]
+    beta_windows = [case for case in window_cases if case["state"] == "beta_chart_recovered"]
+    fall_windows = [case for case in window_cases if case["state"] == "support_falls"]
+    obs_sets = [set(case["one_sided_observables"]) for case in window_cases if case["one_sided_observables"]]
+    common_obs = sorted(set.intersection(*obs_sets)) if obs_sets else []
+    union_obs = sorted(set.union(*obs_sets)) if obs_sets else []
+    return {
+        "window_count": len(window_cases),
+        "blank_windows": len(blank_windows),
+        "beta_recovered_windows": len(beta_windows),
+        "support_fall_windows": len(fall_windows),
+        "blank_window_rate": len(blank_windows) / len(window_cases) if window_cases else 0.0,
+        "common_one_sided_observables": common_obs,
+        "union_one_sided_observables": union_obs,
+        "endpoint_distance_mean": float(np.mean([case["endpoint_distance"] for case in window_cases])) if window_cases else 0.0,
+        "stable_count_coherent_mean": float(np.mean([case["stable_count_coherent"] for case in window_cases])) if window_cases else 0.0,
+    }
+
+
+def verdict(row_summaries: dict[str, dict[str, Any]], full_rows: dict[str, dict[str, Any]]) -> str:
+    both_persist = all(summary["blank_window_rate"] == 1.0 for summary in row_summaries.values())
+    any_beta = any(summary["beta_recovered_windows"] > 0 for summary in row_summaries.values())
+    any_fall = any(summary["support_fall_windows"] > 0 for summary in row_summaries.values())
+    jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    if any_beta or any_fall:
+        return "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE"
+    if both_persist and jaccard < 0.5:
+        return "TWO_DISTINCT_BETA_ABSENT_OPERATORS"
+    if both_persist:
+        return "SAME_BETA_ABSENT_OPERATOR"
+    return "RESIDUAL_AMBIGUOUS"
+
+
+def run(args: argparse.Namespace) -> dict[str, Any]:
+    rng = np.random.default_rng(args.seed)
+    specs = build_sequences(args, rng)
+    cases_by_row: dict[str, list[dict[str, Any]]] = {}
+    full_rows: dict[str, dict[str, Any]] = {}
+
+    for name, spec in specs.items():
+        row_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+        cases = [analyze_case(name, "full", spec["base"], args, row_rng)]
+        full_rows[name] = cases[0]
+        for idx, chunk in enumerate(windowed(spec["base"], args.window_gaps, args.window_count), start=1):
+            cases.append(analyze_case(name, f"window_{idx}", chunk, args, row_rng))
+        cases_by_row[name] = cases
+
+    row_summaries = {name: summarize_row(cases) for name, cases in cases_by_row.items()}
+    full_signature_jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    common_window_obs_jaccard = obs_jaccard(
+        row_summaries["numeri_primi:cycle_3"]["common_one_sided_observables"],
+        row_summaries["random_matrix:cycle_7"]["common_one_sided_observables"],
+    )
+
+    output = {
+        "experiment": "boundary_residual_beta_absent_audit",
+        "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
+        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
+        "observables_used": [
+            *OBS_NAMES,
+            "window_state",
+            "blank_window_rate",
+            "full_signature_jaccard",
+            "common_window_obs_jaccard",
+        ],
+        "params": vars(args),
+        "targets": TARGET_ROWS,
+        "observable_contract": {
+            "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
+            "observable": "window_state plus one-sided observable signature",
+            "operator": "canonical order/null gate on target rows only",
+            "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
+            "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
+            "not_tested": "global beta grid, V_c, source GUE/Poisson label validity",
+        },
+        "sequence_sources": {
+            name: {key: value for key, value in spec.items() if key != "base"}
+            for name, spec in specs.items()
+        },
+        "row_summaries": row_summaries,
+        "full_signature_jaccard": full_signature_jaccard,
+        "common_window_obs_jaccard": common_window_obs_jaccard,
+        "verdict": verdict(row_summaries, full_rows),
+        "cases": cases_by_row,
+    }
+
+    out = Path(args.out)
+    out.parent.mkdir(parents=True, exist_ok=True)
+    out.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
+
+    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
+    print(f"targets={TARGET_ROWS}")
+    for name, summary in row_summaries.items():
+        print(
+            f"{name} blank_windows={summary['blank_windows']}/{summary['window_count']} "
+            f"beta_recovered={summary['beta_recovered_windows']} falls={summary['support_fall_windows']} "
+            f"common_obs={summary['common_one_sided_observables']}"
+        )
+    print(f"full_signature_jaccard={full_signature_jaccard:.3f}")
+    print(f"common_window_obs_jaccard={common_window_obs_jaccard:.3f}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+    return output
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--prime-gaps", type=int, default=4096)
+    parser.add_argument("--random-matrix-gaps", type=int, default=4096)
+    parser.add_argument("--window-gaps", type=int, default=1024)
+    parser.add_argument("--window-count", type=int, default=4)
+    parser.add_argument("--gue-matrix-size", type=int, default=64)
+    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("--seed", type=int, default=202605100330)
+    parser.add_argument("--out", default="tools/data/boundary_residual_beta_absent_audit_20260510_0330.json")
+    args = parser.parse_args()
+    run(args)
+
+
+if __name__ == "__main__":
+    main()

diff --git a/tools/exp_boundary_residual_beta_absent_audit.py b/tools/exp_boundary_residual_beta_absent_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b2b02258d429ae60f10356011447760e95f5cb8
--- /dev/null
+++ b/tools/exp_boundary_residual_beta_absent_audit.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+"""
+Targeted audit for the two medium/strong beta-absent BOUNDARY residues.
+
+This does not rebuild the global beta atlas. It tests only the two open rows
+from the 13-row taxonomy (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) with
+row-local windows and the same canonical observable gate used by the prior
+BOUNDARY reports.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from exp_boundary_short_denominator_extension import gue_spacing_blocks
+from exp_semireal_boundary_transfer_gate import row_spacings
+from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
+from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION
+
+
+TARGET_ROWS = ("numeri_primi:cycle_3", "random_matrix:cycle_7")
+OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
+
+
+def windowed(values: np.ndarray, size: int, count: int) -> list[np.ndarray]:
+    chunks = []
+    for idx in range(count):
+        start = idx * size
+        end = start + size
+        if end <= len(values):
+            chunks.append(normalize(values[start:end]))
+    return chunks
+
+
+def support_state(row: dict[str, Any], args: argparse.Namespace) -> str:
+    one_sided = len(row.get("coherent_one_sided_observables", []))
+    illusory = float(row.get("stable_count_illusory") or 0.0)
+    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
+    beta = row.get("ambiguous_beta_one_sided_gated", [])
+    transfers = (
+        one_sided >= args.min_one_sided
+        and illusory <= args.illusory_residue_max
+        and endpoint >= args.endpoint_distance_min
+    )
+    if not transfers:
+        return "support_falls"
+    if beta:
+        return "beta_chart_recovered"
+    return "beta_absent_blank"
+
+
+def obs_jaccard(left: list[str], right: list[str]) -> float:
+    a = set(left)
+    b = set(right)
+    if not a and not b:
+        return 1.0
+    return len(a & b) / len(a | b)
+
+
+def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
+    prime = row_spacings("numeri_primi")
+    prime = normalize(prime[: args.prime_gaps])
+
+    gue_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+    random_matrix = gue_spacing_blocks(args.random_matrix_gaps, args.gue_matrix_size, gue_rng)
+
+    return {
+        "numeri_primi:cycle_3": {
+            "base": prime,
+            "domain": "numeri_primi",
+            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
+            "source_n_gaps": int(len(prime)),
+        },
+        "random_matrix:cycle_7": {
+            "base": random_matrix,
+            "domain": "random_matrix",
+            "generator": "gue_spacing_blocks",
+            "source_n_gaps": int(len(random_matrix)),
+        },
+    }
+
+
+def analyze_case(name: str, label: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict[str, Any]:
+    perimeters = {f"{name}/{label}": analyze_sequence(f"{name}/{label}", base, args, rng)}
+    row = compact(perimeters)[f"{name}/{label}"]
+    return {
+        "label": label,
+        "n_gaps": row["n_gaps"],
+        "one_sided_observables": row["coherent_one_sided_observables"],
+        "one_sided_count": len(row["coherent_one_sided_observables"]),
+        "endpoint_stable_observables": row["endpoint_stable_observables"],
+        "stable_count_coherent": row["stable_count_coherent"],
+        "stable_count_illusory": row["stable_count_illusory"],
+        "endpoint_distance": row["endpoint_distance_one_sided_gated"],
+        "ambiguous_beta": [round(float(x), 1) for x in row["ambiguous_beta_one_sided_gated"]],
+        "state": support_state(row, args),
+        "z_mean_coherent": row["z_mean_coherent"],
+        "z_mean_illusory": row["z_mean_illusory"],
+    }
+
+
+def summarize_row(cases: list[dict[str, Any]]) -> dict[str, Any]:
+    window_cases = [case for case in cases if case["label"].startswith("window_")]
+    blank_windows = [case for case in window_cases if case["state"] == "beta_absent_blank"]
+    beta_windows = [case for case in window_cases if case["state"] == "beta_chart_recovered"]
+    fall_windows = [case for case in window_cases if case["state"] == "support_falls"]
+    obs_sets = [set(case["one_sided_observables"]) for case in window_cases if case["one_sided_observables"]]
+    common_obs = sorted(set.intersection(*obs_sets)) if obs_sets else []
+    union_obs = sorted(set.union(*obs_sets)) if obs_sets else []
+    return {
+        "window_count": len(window_cases),
+        "blank_windows": len(blank_windows),
+        "beta_recovered_windows": len(beta_windows),
+        "support_fall_windows": len(fall_windows),
+        "blank_window_rate": len(blank_windows) / len(window_cases) if window_cases else 0.0,
+        "common_one_sided_observables": common_obs,
+        "union_one_sided_observables": union_obs,
+        "endpoint_distance_mean": float(np.mean([case["endpoint_distance"] for case in window_cases])) if window_cases else 0.0,
+        "stable_count_coherent_mean": float(np.mean([case["stable_count_coherent"] for case in window_cases])) if window_cases else 0.0,
+    }
+
+
+def verdict(row_summaries: dict[str, dict[str, Any]], full_rows: dict[str, dict[str, Any]]) -> str:
+    both_persist = all(summary["blank_window_rate"] == 1.0 for summary in row_summaries.values())
+    any_beta = any(summary["beta_recovered_windows"] > 0 for summary in row_summaries.values())
+    any_fall = any(summary["support_fall_windows"] > 0 for summary in row_summaries.values())
+    jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    if any_beta or any_fall:
+        return "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE"
+    if both_persist and jaccard < 0.5:
+        return "TWO_DISTINCT_BETA_ABSENT_OPERATORS"
+    if both_persist:
+        return "SAME_BETA_ABSENT_OPERATOR"
+    return "RESIDUAL_AMBIGUOUS"
+
+
+def run(args: argparse.Namespace) -> dict[str, Any]:
+    rng = np.random.default_rng(args.seed)
+    specs = build_sequences(args, rng)
+    cases_by_row: dict[str, list[dict[str, Any]]] = {}
+    full_rows: dict[str, dict[str, Any]] = {}
+
+    for name, spec in specs.items():
+        row_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+        cases = [analyze_case(name, "full", spec["base"], args, row_rng)]
+        full_rows[name] = cases[0]
+        for idx, chunk in enumerate(windowed(spec["base"], args.window_gaps, args.window_count), start=1):
+            cases.append(analyze_case(name, f"window_{idx}", chunk, args, row_rng))
+        cases_by_row[name] = cases
+
+    row_summaries = {name: summarize_row(cases) for name, cases in cases_by_row.items()}
+    full_signature_jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    common_window_obs_jaccard = obs_jaccard(
+        row_summaries["numeri_primi:cycle_3"]["common_one_sided_observables"],
+        row_summaries["random_matrix:cycle_7"]["common_one_sided_observables"],
+    )
+
+    output = {
+        "experiment": "boundary_residual_beta_absent_audit",
+        "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
+        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
+        "observables_used": [
+            *OBS_NAMES,
+            "window_state",
+            "blank_window_rate",
+            "full_signature_jaccard",
+            "common_window_obs_jaccard",
+        ],
+        "params": vars(args),
+        "targets": TARGET_ROWS,
+        "observable_contract": {
+            "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
+            "observable": "window_state plus one-sided observable signature",
+            "operator": "canonical order/null gate on target rows only",
+            "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
+            "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
+            "not_tested": "global beta grid, V_c, source GUE/Poisson label validity",
+        },
+        "sequence_sources": {
+            name: {key: value for key, value in spec.items() if key != "base"}
+            for name, spec in specs.items()
+        },
+        "row_summaries": row_summaries,
+        "full_signature_jaccard": full_signature_jaccard,
+        "common_window_obs_jaccard": common_window_obs_jaccard,
+        "verdict": verdict(row_summaries, full_rows),
+        "cases": cases_by_row,
+    }
+
+    out = Path(args.out)
+    out.parent.mkdir(parents=True, exist_ok=True)
+    out.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
+
+    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
+    print(f"targets={TARGET_ROWS}")
+    for name, summary in row_summaries.items():
+        print(
+            f"{name} blank_windows={summary['blank_windows']}/{summary['window_count']} "
+            f"beta_recovered={summary['beta_recovered_windows']} falls={summary['support_fall_windows']} "
+            f"common_obs={summary['common_one_sided_observables']}"
+        )
+    print(f"full_signature_jaccard={full_signature_jaccard:.3f}")
+    print(f"common_window_obs_jaccard={common_window_obs_jaccard:.3f}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+    return output
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--prime-gaps", type=int, default=4096)
+    parser.add_argument("--random-matrix-gaps", type=int, default=4096)
+    parser.add_argument("--window-gaps", type=int, default=1024)
+    parser.add_argument("--window-count", type=int, default=4)
+    parser.add_argument("--gue-matrix-size", type=int, default=64)
+    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("--seed", type=int, default=202605100330)
+    parser.add_argument("--out", default="tools/data/boundary_residual_beta_absent_audit_20260510_0330.json")
+    args = parser.parse_args()
+    run(args)
+
+
+if __name__ == "__main__":
+    main()

codex
Script aggiunto. Lo eseguo con i parametri dichiarati nel report target; se il runtime resta alto, riduco solo il numero di baseline mantenendo lo stesso disegno sperimentale.
exec
/bin/bash -lc 'python tools/exp_boundary_residual_beta_absent_audit.py' in /opt/MM_D-ND
diff --git a/tools/exp_boundary_residual_beta_absent_audit.py b/tools/exp_boundary_residual_beta_absent_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b2b02258d429ae60f10356011447760e95f5cb8
--- /dev/null
+++ b/tools/exp_boundary_residual_beta_absent_audit.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+"""
+Targeted audit for the two medium/strong beta-absent BOUNDARY residues.
+
+This does not rebuild the global beta atlas. It tests only the two open rows
+from the 13-row taxonomy (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) with
+row-local windows and the same canonical observable gate used by the prior
+BOUNDARY reports.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from exp_boundary_short_denominator_extension import gue_spacing_blocks
+from exp_semireal_boundary_transfer_gate import row_spacings
+from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
+from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION
+
+
+TARGET_ROWS = ("numeri_primi:cycle_3", "random_matrix:cycle_7")
+OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
+
+
+def windowed(values: np.ndarray, size: int, count: int) -> list[np.ndarray]:
+    chunks = []
+    for idx in range(count):
+        start = idx * size
+        end = start + size
+        if end <= len(values):
+            chunks.append(normalize(values[start:end]))
+    return chunks
+
+
+def support_state(row: dict[str, Any], args: argparse.Namespace) -> str:
+    one_sided = len(row.get("coherent_one_sided_observables", []))
+    illusory = float(row.get("stable_count_illusory") or 0.0)
+    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
+    beta = row.get("ambiguous_beta_one_sided_gated", [])
+    transfers = (
+        one_sided >= args.min_one_sided
+        and illusory <= args.illusory_residue_max
+        and endpoint >= args.endpoint_distance_min
+    )
+    if not transfers:
+        return "support_falls"
+    if beta:
+        return "beta_chart_recovered"
+    return "beta_absent_blank"
+
+
+def obs_jaccard(left: list[str], right: list[str]) -> float:
+    a = set(left)
+    b = set(right)
+    if not a and not b:
+        return 1.0
+    return len(a & b) / len(a | b)
+
+
+def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
+    prime = row_spacings("numeri_primi")
+    prime = normalize(prime[: args.prime_gaps])
+
+    gue_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+    random_matrix = gue_spacing_blocks(args.random_matrix_gaps, args.gue_matrix_size, gue_rng)
+
+    return {
+        "numeri_primi:cycle_3": {
+            "base": prime,
+            "domain": "numeri_primi",
+            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
+            "source_n_gaps": int(len(prime)),
+        },
+        "random_matrix:cycle_7": {
+            "base": random_matrix,
+            "domain": "random_matrix",
+            "generator": "gue_spacing_blocks",
+            "source_n_gaps": int(len(random_matrix)),
+        },
+    }
+
+
+def analyze_case(name: str, label: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict[str, Any]:
+    perimeters = {f"{name}/{label}": analyze_sequence(f"{name}/{label}", base, args, rng)}
+    row = compact(perimeters)[f"{name}/{label}"]
+    return {
+        "label": label,
+        "n_gaps": row["n_gaps"],
+        "one_sided_observables": row["coherent_one_sided_observables"],
+        "one_sided_count": len(row["coherent_one_sided_observables"]),
+        "endpoint_stable_observables": row["endpoint_stable_observables"],
+        "stable_count_coherent": row["stable_count_coherent"],
+        "stable_count_illusory": row["stable_count_illusory"],
+        "endpoint_distance": row["endpoint_distance_one_sided_gated"],
+        "ambiguous_beta": [round(float(x), 1) for x in row["ambiguous_beta_one_sided_gated"]],
+        "state": support_state(row, args),
+        "z_mean_coherent": row["z_mean_coherent"],
+        "z_mean_illusory": row["z_mean_illusory"],
+    }
+
+
+def summarize_row(cases: list[dict[str, Any]]) -> dict[str, Any]:
+    window_cases = [case for case in cases if case["label"].startswith("window_")]
+    blank_windows = [case for case in window_cases if case["state"] == "beta_absent_blank"]
+    beta_windows = [case for case in window_cases if case["state"] == "beta_chart_recovered"]
+    fall_windows = [case for case in window_cases if case["state"] == "support_falls"]
+    obs_sets = [set(case["one_sided_observables"]) for case in window_cases if case["one_sided_observables"]]
+    common_obs = sorted(set.intersection(*obs_sets)) if obs_sets else []
+    union_obs = sorted(set.union(*obs_sets)) if obs_sets else []
+    return {
+        "window_count": len(window_cases),
+        "blank_windows": len(blank_windows),
+        "beta_recovered_windows": len(beta_windows),
+        "support_fall_windows": len(fall_windows),
+        "blank_window_rate": len(blank_windows) / len(window_cases) if window_cases else 0.0,
+        "common_one_sided_observables": common_obs,
+        "union_one_sided_observables": union_obs,
+        "endpoint_distance_mean": float(np.mean([case["endpoint_distance"] for case in window_cases])) if window_cases else 0.0,
+        "stable_count_coherent_mean": float(np.mean([case["stable_count_coherent"] for case in window_cases])) if window_cases else 0.0,
+    }
+
+
+def verdict(row_summaries: dict[str, dict[str, Any]], full_rows: dict[str, dict[str, Any]]) -> str:
+    both_persist = all(summary["blank_window_rate"] == 1.0 for summary in row_summaries.values())
+    any_beta = any(summary["beta_recovered_windows"] > 0 for summary in row_summaries.values())
+    any_fall = any(summary["support_fall_windows"] > 0 for summary in row_summaries.values())
+    jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    if any_beta or any_fall:
+        return "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE"
+    if both_persist and jaccard < 0.5:
+        return "TWO_DISTINCT_BETA_ABSENT_OPERATORS"
+    if both_persist:
+        return "SAME_BETA_ABSENT_OPERATOR"
+    return "RESIDUAL_AMBIGUOUS"
+
+
+def run(args: argparse.Namespace) -> dict[str, Any]:
+    rng = np.random.default_rng(args.seed)
+    specs = build_sequences(args, rng)
+    cases_by_row: dict[str, list[dict[str, Any]]] = {}
+    full_rows: dict[str, dict[str, Any]] = {}
+
+    for name, spec in specs.items():
+        row_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+        cases = [analyze_case(name, "full", spec["base"], args, row_rng)]
+        full_rows[name] = cases[0]
+        for idx, chunk in enumerate(windowed(spec["base"], args.window_gaps, args.window_count), start=1):
+            cases.append(analyze_case(name, f"window_{idx}", chunk, args, row_rng))
+        cases_by_row[name] = cases
+
+    row_summaries = {name: summarize_row(cases) for name, cases in cases_by_row.items()}
+    full_signature_jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    common_window_obs_jaccard = obs_jaccard(
+        row_summaries["numeri_primi:cycle_3"]["common_one_sided_observables"],
+        row_summaries["random_matrix:cycle_7"]["common_one_sided_observables"],
+    )
+
+    output = {
+        "experiment": "boundary_residual_beta_absent_audit",
+        "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
+        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
+        "observables_used": [
+            *OBS_NAMES,
+            "window_state",
+            "blank_window_rate",
+            "full_signature_jaccard",
+            "common_window_obs_jaccard",
+        ],
+        "params": vars(args),
+        "targets": TARGET_ROWS,
+        "observable_contract": {
+            "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
+            "observable": "window_state plus one-sided observable signature",
+            "operator": "canonical order/null gate on target rows only",
+            "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
+            "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
+            "not_tested": "global beta grid, V_c, source GUE/Poisson label validity",
+        },
+        "sequence_sources": {
+            name: {key: value for key, value in spec.items() if key != "base"}
+            for name, spec in specs.items()
+        },
+        "row_summaries": row_summaries,
+        "full_signature_jaccard": full_signature_jaccard,
+        "common_window_obs_jaccard": common_window_obs_jaccard,
+        "verdict": verdict(row_summaries, full_rows),
+        "cases": cases_by_row,
+    }
+
+    out = Path(args.out)
+    out.parent.mkdir(parents=True, exist_ok=True)
+    out.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
+
+    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
+    print(f"targets={TARGET_ROWS}")
+    for name, summary in row_summaries.items():
+        print(
+            f"{name} blank_windows={summary['blank_windows']}/{summary['window_count']} "
+            f"beta_recovered={summary['beta_recovered_windows']} falls={summary['support_fall_windows']} "
+            f"common_obs={summary['common_one_sided_observables']}"
+        )
+    print(f"full_signature_jaccard={full_signature_jaccard:.3f}")
+    print(f"common_window_obs_jaccard={common_window_obs_jaccard:.3f}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+    return output
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--prime-gaps", type=int, default=4096)
+    parser.add_argument("--random-matrix-gaps", type=int, default=4096)
+    parser.add_argument("--window-gaps", type=int, default=1024)
+    parser.add_argument("--window-count", type=int, default=4)
+    parser.add_argument("--gue-matrix-size", type=int, default=64)
+    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("--seed", type=int, default=202605100330)
+    parser.add_argument("--out", default="tools/data/boundary_residual_beta_absent_audit_20260510_0330.json")
+    args = parser.parse_args()
+    run(args)
+
+
+if __name__ == "__main__":
+    main()

diff --git a/tools/exp_boundary_residual_beta_absent_audit.py b/tools/exp_boundary_residual_beta_absent_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b2b02258d429ae60f10356011447760e95f5cb8
--- /dev/null
+++ b/tools/exp_boundary_residual_beta_absent_audit.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+"""
+Targeted audit for the two medium/strong beta-absent BOUNDARY residues.
+
+This does not rebuild the global beta atlas. It tests only the two open rows
+from the 13-row taxonomy (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) with
+row-local windows and the same canonical observable gate used by the prior
+BOUNDARY reports.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from exp_boundary_short_denominator_extension import gue_spacing_blocks
+from exp_semireal_boundary_transfer_gate import row_spacings
+from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
+from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION
+
+
+TARGET_ROWS = ("numeri_primi:cycle_3", "random_matrix:cycle_7")
+OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
+
+
+def windowed(values: np.ndarray, size: int, count: int) -> list[np.ndarray]:
+    chunks = []
+    for idx in range(count):
+        start = idx * size
+        end = start + size
+        if end <= len(values):
+            chunks.append(normalize(values[start:end]))
+    return chunks
+
+
+def support_state(row: dict[str, Any], args: argparse.Namespace) -> str:
+    one_sided = len(row.get("coherent_one_sided_observables", []))
+    illusory = float(row.get("stable_count_illusory") or 0.0)
+    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
+    beta = row.get("ambiguous_beta_one_sided_gated", [])
+    transfers = (
+        one_sided >= args.min_one_sided
+        and illusory <= args.illusory_residue_max
+        and endpoint >= args.endpoint_distance_min
+    )
+    if not transfers:
+        return "support_falls"
+    if beta:
+        return "beta_chart_recovered"
+    return "beta_absent_blank"
+
+
+def obs_jaccard(left: list[str], right: list[str]) -> float:
+    a = set(left)
+    b = set(right)
+    if not a and not b:
+        return 1.0
+    return len(a & b) / len(a | b)
+
+
+def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
+    prime = row_spacings("numeri_primi")
+    prime = normalize(prime[: args.prime_gaps])
+
+    gue_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+    random_matrix = gue_spacing_blocks(args.random_matrix_gaps, args.gue_matrix_size, gue_rng)
+
+    return {
+        "numeri_primi:cycle_3": {
+            "base": prime,
+            "domain": "numeri_primi",
+            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
+            "source_n_gaps": int(len(prime)),
+        },
+        "random_matrix:cycle_7": {
+            "base": random_matrix,
+            "domain": "random_matrix",
+            "generator": "gue_spacing_blocks",
+            "source_n_gaps": int(len(random_matrix)),
+        },
+    }
+
+
+def analyze_case(name: str, label: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict[str, Any]:
+    perimeters = {f"{name}/{label}": analyze_sequence(f"{name}/{label}", base, args, rng)}
+    row = compact(perimeters)[f"{name}/{label}"]
+    return {
+        "label": label,
+        "n_gaps": row["n_gaps"],
+        "one_sided_observables": row["coherent_one_sided_observables"],
+        "one_sided_count": len(row["coherent_one_sided_observables"]),
+        "endpoint_stable_observables": row["endpoint_stable_observables"],
+        "stable_count_coherent": row["stable_count_coherent"],
+        "stable_count_illusory": row["stable_count_illusory"],
+        "endpoint_distance": row["endpoint_distance_one_sided_gated"],
+        "ambiguous_beta": [round(float(x), 1) for x in row["ambiguous_beta_one_sided_gated"]],
+        "state": support_state(row, args),
+        "z_mean_coherent": row["z_mean_coherent"],
+        "z_mean_illusory": row["z_mean_illusory"],
+    }
+
+
+def summarize_row(cases: list[dict[str, Any]]) -> dict[str, Any]:
+    window_cases = [case for case in cases if case["label"].startswith("window_")]
+    blank_windows = [case for case in window_cases if case["state"] == "beta_absent_blank"]
+    beta_windows = [case for case in window_cases if case["state"] == "beta_chart_recovered"]
+    fall_windows = [case for case in window_cases if case["state"] == "support_falls"]
+    obs_sets = [set(case["one_sided_observables"]) for case in window_cases if case["one_sided_observables"]]
+    common_obs = sorted(set.intersection(*obs_sets)) if obs_sets else []
+    union_obs = sorted(set.union(*obs_sets)) if obs_sets else []
+    return {
+        "window_count": len(window_cases),
+        "blank_windows": len(blank_windows),
+        "beta_recovered_windows": len(beta_windows),
+        "support_fall_windows": len(fall_windows),
+        "blank_window_rate": len(blank_windows) / len(window_cases) if window_cases else 0.0,
+        "common_one_sided_observables": common_obs,
+        "union_one_sided_observables": union_obs,
+        "endpoint_distance_mean": float(np.mean([case["endpoint_distance"] for case in window_cases])) if window_cases else 0.0,
+        "stable_count_coherent_mean": float(np.mean([case["stable_count_coherent"] for case in window_cases])) if window_cases else 0.0,
+    }
+
+
+def verdict(row_summaries: dict[str, dict[str, Any]], full_rows: dict[str, dict[str, Any]]) -> str:
+    both_persist = all(summary["blank_window_rate"] == 1.0 for summary in row_summaries.values())
+    any_beta = any(summary["beta_recovered_windows"] > 0 for summary in row_summaries.values())
+    any_fall = any(summary["support_fall_windows"] > 0 for summary in row_summaries.values())
+    jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    if any_beta or any_fall:
+        return "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE"
+    if both_persist and jaccard < 0.5:
+        return "TWO_DISTINCT_BETA_ABSENT_OPERATORS"
+    if both_persist:
+        return "SAME_BETA_ABSENT_OPERATOR"
+    return "RESIDUAL_AMBIGUOUS"
+
+
+def run(args: argparse.Namespace) -> dict[str, Any]:
+    rng = np.random.default_rng(args.seed)
+    specs = build_sequences(args, rng)
+    cases_by_row: dict[str, list[dict[str, Any]]] = {}
+    full_rows: dict[str, dict[str, Any]] = {}
+
+    for name, spec in specs.items():
+        row_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+        cases = [analyze_case(name, "full", spec["base"], args, row_rng)]
+        full_rows[name] = cases[0]
+        for idx, chunk in enumerate(windowed(spec["base"], args.window_gaps, args.window_count), start=1):
+            cases.append(analyze_case(name, f"window_{idx}", chunk, args, row_rng))
+        cases_by_row[name] = cases
+
+    row_summaries = {name: summarize_row(cases) for name, cases in cases_by_row.items()}
+    full_signature_jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    common_window_obs_jaccard = obs_jaccard(
+        row_summaries["numeri_primi:cycle_3"]["common_one_sided_observables"],
+        row_summaries["random_matrix:cycle_7"]["common_one_sided_observables"],
+    )
+
+    output = {
+        "experiment": "boundary_residual_beta_absent_audit",
+        "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
+        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
+        "observables_used": [
+            *OBS_NAMES,
+            "window_state",
+            "blank_window_rate",
+            "full_signature_jaccard",
+            "common_window_obs_jaccard",
+        ],
+        "params": vars(args),
+        "targets": TARGET_ROWS,
+        "observable_contract": {
+            "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
+            "observable": "window_state plus one-sided observable signature",
+            "operator": "canonical order/null gate on target rows only",
+            "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
+            "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
+            "not_tested": "global beta grid, V_c, source GUE/Poisson label validity",
+        },
+        "sequence_sources": {
+            name: {key: value for key, value in spec.items() if key != "base"}
+            for name, spec in specs.items()
+        },
+        "row_summaries": row_summaries,
+        "full_signature_jaccard": full_signature_jaccard,
+        "common_window_obs_jaccard": common_window_obs_jaccard,
+        "verdict": verdict(row_summaries, full_rows),
+        "cases": cases_by_row,
+    }
+
+    out = Path(args.out)
+    out.parent.mkdir(parents=True, exist_ok=True)
+    out.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
+
+    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
+    print(f"targets={TARGET_ROWS}")
+    for name, summary in row_summaries.items():
+        print(
+            f"{name} blank_windows={summary['blank_windows']}/{summary['window_count']} "
+            f"beta_recovered={summary['beta_recovered_windows']} falls={summary['support_fall_windows']} "
+            f"common_obs={summary['common_one_sided_observables']}"
+        )
+    print(f"full_signature_jaccard={full_signature_jaccard:.3f}")
+    print(f"common_window_obs_jaccard={common_window_obs_jaccard:.3f}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+    return output
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--prime-gaps", type=int, default=4096)
+    parser.add_argument("--random-matrix-gaps", type=int, default=4096)
+    parser.add_argument("--window-gaps", type=int, default=1024)
+    parser.add_argument("--window-count", type=int, default=4)
+    parser.add_argument("--gue-matrix-size", type=int, default=64)
+    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("--seed", type=int, default=202605100330)
+    parser.add_argument("--out", default="tools/data/boundary_residual_beta_absent_audit_20260510_0330.json")
+    args = parser.parse_args()
+    run(args)
+
+
+if __name__ == "__main__":
+    main()

 succeeded in 3037ms:
observables_registry=1.0.0-2026-05-06
targets=('numeri_primi:cycle_3', 'random_matrix:cycle_7')
numeri_primi:cycle_3 blank_windows=4/4 beta_recovered=0 falls=0 common_obs=['SR']
random_matrix:cycle_7 blank_windows=3/4 beta_recovered=1 falls=0 common_obs=['L2']
full_signature_jaccard=0.600
common_window_obs_jaccard=0.000
verdict=RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE
saved tools/data/boundary_residual_beta_absent_audit_20260510_0330.json

codex
Il risultato ha attrito reale: i primi restano blank in 4/4 finestre, la random matrix recupera beta in 1/4 finestre. Quindi i due residui non sono una singola classe chiusa; devo leggere i dettagli per formulare il vincolo senza forzarlo.
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 'git status --short' in /opt/MM_D-ND
 succeeded in 0ms:
 M applications/INDEX.draft.json
 M applications/soluzioni/20260430_0330_three-regimes-of-modular-memory-algebraic/finding_index.draft.json
 M applications/soluzioni/20260430_0330_three-regimes-of-modular-memory-algebraic/manifest.draft.json
 D "kernel/reference/metaprompt_in_sviluppo/Sei il Meta Master Systemil Meta Ma.md"
 M tools/data/agent_field_live.md
 M tools/data/autoricerca_journal.json
 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/domande_fondamentali.json
 M tools/data/exp_det_drift.json
 M tools/data/graph_completion/latest.json
 M tools/data/incrocio_risultato.json
 M tools/data/knowledge_state.json
 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/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_axioms.json
 M tools/data/seme_backup_pre_run.json
 M tools/data/tm1_figures/tensions.json
 M tools/data/tm1_figures/tensions_raw.json
?? applications/published/20260504_0901_the-two-markov-layers-are-coupled/
?? applications/published/20260504_1219_markov-layers-pass-the-first-recovery/
?? applications/published/20260505_0330_observable-rank-audit-many-probes-one/
?? applications/published/20260506_1955_observable-collinearity-breaks-only-where-denominators/
?? applications/published/20260507_0330_the-gue-poisson-boundary-is-a/
?? applications/published/20260507_0803_denominator-gate-transfers-boundary-coordinate-does/
?? applications/published/20260507_0942_bridge-order-denominator-gate/
?? applications/published/20260507_1006_logistic-counter-scope-gate/
?? applications/published/20260507_1042_logistic-surrogate-contract-gate/
?? applications/published/20260507_1419_logistic-cyclic-block-entropy-gate/
?? applications/published/20260507_1458_meta-assertion-gate/
?? applications/published/20260507_1751_tqge-underlay-gate/
?? applications/published/20260507_1804_blank-to-source-hinge/
?? applications/published/20260507_1938_triadic-deposit-gate/
?? applications/published/20260507_1957_blank-shell-polarity-gate/
?? applications/scoperte/20260502_0330_the-dipolar-phase-transition-is-nearly_auto/
?? applications/scoperte/20260503_0330_markov-memory-has-two-visible-layers_auto/
?? applications/scoperte/20260504_0901_the-two-markov-layers-are-coupled_auto/
?? applications/scoperte/20260504_1219_markov-layers-pass-the-first-recovery_auto/
?? applications/scoperte/20260505_0330_observable-rank-audit-many-probes-one_auto/
?? applications/scoperte/20260506_0625_perturbation-dimensionality-is-not-yet-a_auto/
?? applications/scoperte/20260506_1941_perturbation-rank-needs-denominator-gating_auto/
?? applications/scoperte/20260506_1955_observable-collinearity-breaks-only-where-denominators_auto/
?? applications/scoperte/20260507_0330_the-gue-poisson-boundary-is-a_auto/
?? applications/scoperte/20260507_0803_denominator-gate-transfers-boundary-coordinate-does_auto/
?? applications/scoperte/20260507_0901_denominator-gate-transfer-matrix_auto/
?? applications/scoperte/20260507_0923_semi-real-order-denominator-gate_auto/
?? applications/scoperte/20260507_0942_bridge-order-denominator-gate_auto/
?? applications/scoperte/20260507_1006_logistic-counter-scope-gate_auto/
?? applications/scoperte/20260507_1042_logistic-surrogate-contract-gate_auto/
?? applications/scoperte/20260507_1419_logistic-cyclic-block-entropy-gate_auto/
?? applications/scoperte/20260507_1458_meta-assertion-gate_auto/
?? applications/scoperte/20260507_1751_tqge-underlay-gate_auto/
?? applications/scoperte/20260507_1804_blank-to-source-hinge_auto/
?? applications/scoperte/20260507_1938_triadic-deposit-gate_auto/
?? applications/scoperte/20260507_1957_blank-shell-polarity-gate_auto/
?? "applications/scoperte/20260507_2042_det-non-\303\250-il-discriminatore-della_auto/"
?? applications/scoperte/20260507_2120_blank-shell-tqger-gate_auto/
?? applications/scoperte/20260507_2203_blank-shell-scale-law_auto/
?? applications/scoperte/20260507_2310_blank-shell-stratified-gate_auto/
?? applications/scoperte/20260508_0011_duality-contrast-weakens-with-scale-in_auto/
?? applications/scoperte/20260508_0330_gap-ratio-porta-il-denominatore_auto/
?? applications/scoperte/20260508_1715_generator-gate-del-label-set-phi_auto/
?? applications/scoperte/20260508_1805_block-scale-gate-del-core-phi_auto/
?? applications/scoperte/20260508_1834_substitution-grammar-gate-del-core-phi_auto/
?? applications/scoperte/20260508_1909_supertile-tiling-gate-del-core-phi_auto/
?? applications/scoperte/20260508_1915_high-core-repair-audit_auto/
?? applications/scoperte/20260508_1947_positionerror-gate-del-core-phi_auto/
?? applications/scoperte/20260508_2005_symbolic-grammar-gate-del-core-phi_auto/
?? applications/scoperte/20260508_2013_ostrowski-recognizability-gate-del-core-phi_auto/
?? applications/scoperte/20260508_2019_non-phi-sturmian-fixed-reader-gate_auto/
?? applications/scoperte/20260508_2108_prime-mobius-zero-mediator-gate_auto/
?? applications/scoperte/20260508_2121_prime-mobius-gap-stratified-zero-gate_auto/
?? applications/scoperte/20260508_2133_prime-mobius-pair-stratified-zero-gate_auto/
?? applications/scoperte/20260508_2140_quasiperiodic-vc-lattice-gate_auto/
?? applications/scoperte/20260509_0330_interpolated-vc-curve-map_auto/
?? applications/scoperte/20260509_0659_vc-label-reachability-gate_auto/
?? applications/scoperte/20260509_0741_vc-phase-bridge-label-null_auto/
?? applications/scoperte/20260509_0819_vc-non-sturmian-label-null-gate_auto/
?? applications/scoperte/20260509_0846_vc-generator-class-direction-audit_auto/
?? applications/scoperte/20260509_1337_vc-fit-ready-denominator-gate_auto/
?? applications/scoperte/20260509_1409_boundary-denominator-prescan_auto/
?? applications/scoperte/20260509_1427_blank-pair-null-transfer_auto/
?? applications/scoperte/20260509_1437_residual-boundary-closure_auto/
?? applications/scoperte/20260509_1444_boundary-gate-transfer-matrix_auto/
?? applications/scoperte/20260509_1457_vc-unit-boundary-audit_auto/
?? applications/scoperte/20260509_1538_boundary-row-aligned-nonexact-audit_auto/
?? applications/soluzioni/20260502_0330_the-dipolar-phase-transition-is-nearly/
?? applications/soluzioni/20260503_0330_markov-memory-has-two-visible-layers/
?? applications/soluzioni/20260504_0901_the-two-markov-layers-are-coupled/
?? applications/soluzioni/20260504_1219_markov-layers-pass-the-first-recovery/
?? applications/soluzioni/20260505_0330_observable-rank-audit-many-probes-one/
?? applications/soluzioni/20260506_1941_perturbation-rank-needs-denominator-gating/
?? applications/soluzioni/20260506_1955_observable-collinearity-breaks-only-where-denominators/
?? applications/soluzioni/20260507_0330_the-gue-poisson-boundary-is-a/
?? applications/soluzioni/20260507_0803_denominator-gate-transfers-boundary-coordinate-does/
?? applications/soluzioni/20260507_0942_bridge-order-denominator-gate/
?? applications/soluzioni/20260507_1006_logistic-counter-scope-gate/
?? applications/soluzioni/20260507_1042_logistic-surrogate-contract-gate/
?? applications/soluzioni/20260507_1419_logistic-cyclic-block-entropy-gate/
?? applications/soluzioni/20260507_1458_meta-assertion-gate/
?? applications/soluzioni/20260507_1751_tqge-underlay-gate/
?? applications/soluzioni/20260507_1804_blank-to-source-hinge/
?? applications/soluzioni/20260507_1938_triadic-deposit-gate/
?? applications/soluzioni/20260507_1957_blank-shell-polarity-gate/
?? "applications/soluzioni/20260507_2042_det-non-\303\250-il-discriminatore-della/"
?? applications/soluzioni/20260507_2120_blank-shell-tqger-gate/
?? applications/soluzioni/20260507_2203_blank-shell-scale-law/
?? applications/soluzioni/20260507_2310_blank-shell-stratified-gate/
?? applications/soluzioni/20260508_0011_duality-contrast-weakens-with-scale-in/
?? applications/soluzioni/20260508_0330_gap-ratio-porta-il-denominatore/
?? applications/soluzioni/20260508_1715_generator-gate-del-label-set-phi/
?? applications/soluzioni/20260508_1805_block-scale-gate-del-core-phi/
?? applications/soluzioni/20260508_1834_substitution-grammar-gate-del-core-phi/
?? applications/soluzioni/20260508_1909_supertile-tiling-gate-del-core-phi/
?? applications/soluzioni/20260508_1915_high-core-repair-audit/
?? applications/soluzioni/20260508_1947_positionerror-gate-del-core-phi/
?? applications/soluzioni/20260508_2005_symbolic-grammar-gate-del-core-phi/
?? applications/soluzioni/20260508_2013_ostrowski-recognizability-gate-del-core-phi/
?? applications/soluzioni/20260508_2019_non-phi-sturmian-fixed-reader-gate/
?? applications/soluzioni/20260508_2108_prime-mobius-zero-mediator-gate/
?? applications/soluzioni/20260508_2121_prime-mobius-gap-stratified-zero-gate/
?? applications/soluzioni/20260508_2133_prime-mobius-pair-stratified-zero-gate/
?? applications/soluzioni/20260508_2140_quasiperiodic-vc-lattice-gate/
?? applications/soluzioni/20260509_0330_interpolated-vc-curve-map/
?? applications/soluzioni/20260509_0659_vc-label-reachability-gate/
?? applications/soluzioni/20260509_0741_vc-phase-bridge-label-null/
?? applications/soluzioni/20260509_0819_vc-non-sturmian-label-null-gate/
?? applications/soluzioni/20260509_0846_vc-generator-class-direction-audit/
?? applications/soluzioni/20260509_1337_vc-fit-ready-denominator-gate/
?? applications/soluzioni/20260509_1409_boundary-denominator-prescan/
?? applications/soluzioni/20260509_1427_blank-pair-null-transfer/
?? applications/soluzioni/20260509_1437_residual-boundary-closure/
?? applications/soluzioni/20260509_1444_boundary-gate-transfer-matrix/
?? applications/soluzioni/20260509_1457_vc-unit-boundary-audit/
?? applications/soluzioni/20260509_1538_boundary-row-aligned-nonexact-audit/
?? findings_gallery.md
?? tools/data/.last_telegram_msg
?? tools/data/3d_boundary_layers.json
?? tools/data/aeternitas/
?? tools/data/alignment_active.json
?? tools/data/alignment_markers.jsonl
?? tools/data/b2_apply_log.jsonl
?? tools/data/b3_proposals_log.jsonl
?? tools/data/biconi/bicono_20260507_1804.json
?? tools/data/biconi/bicono_20260507_1938.json
?? tools/data/biconi/bicono_20260507_1957.json
?? tools/data/biconi/bicono_20260507_2042.json
?? tools/data/biconi/bicono_20260507_2120.json
?? tools/data/biconi/bicono_20260507_2203.json
?? tools/data/biconi/bicono_20260507_2310.json
?? tools/data/biconi/bicono_20260508_0011.json
?? tools/data/biconi/bicono_20260508_0330.json
?? tools/data/biconi/bicono_20260508_1632.json
?? tools/data/biconi/bicono_20260508_1715.json
?? tools/data/biconi/bicono_20260508_1805.json
?? tools/data/biconi/bicono_20260508_1834.json
?? tools/data/biconi/bicono_20260508_1909.json
?? tools/data/biconi/bicono_20260508_1915.json
?? tools/data/biconi/bicono_20260508_1947.json
?? tools/data/biconi/bicono_20260508_2005.json
?? tools/data/biconi/bicono_20260508_2013.json
?? tools/data/biconi/bicono_20260508_2019.json
?? tools/data/biconi/bicono_20260508_2102.json
?? tools/data/biconi/bicono_20260508_2108.json
?? tools/data/biconi/bicono_20260508_2121.json
?? tools/data/biconi/bicono_20260508_2133.json
?? tools/data/biconi/bicono_20260508_2140.json
?? tools/data/biconi/bicono_20260509_0330.json
?? tools/data/biconi/bicono_20260509_0637.json
?? tools/data/biconi/bicono_20260509_0652.json
?? tools/data/biconi/bicono_20260509_0659.json
?? tools/data/biconi/bicono_20260509_0741.json
?? tools/data/biconi/bicono_20260509_0819.json
?? tools/data/biconi/bicono_20260509_0829.json
?? tools/data/biconi/bicono_20260509_0837.json
?? tools/data/biconi/bicono_20260509_0846.json
?? tools/data/biconi/bicono_20260509_1337.json
?? tools/data/biconi/bicono_20260509_1400.json
?? tools/data/biconi/bicono_20260509_1409.json
?? tools/data/biconi/bicono_20260509_1427.json
?? tools/data/biconi/bicono_20260509_1437.json
?? tools/data/biconi/bicono_20260509_1444.json
?? tools/data/biconi/bicono_20260509_1457.json
?? tools/data/biconi/bicono_20260509_1516.json
?? tools/data/biconi/bicono_20260509_1532.json
?? tools/data/biconi/bicono_20260509_1538.json
?? tools/data/biconi/bicono_20260509_1548.json
?? tools/data/biconi/bicono_20260509_1556.json
?? tools/data/biconi/bicono_20260509_1839.json
?? tools/data/bicono_projections.jsonl
?? tools/data/blank_shell_dilation_gate_20260507_2157.json
?? tools/data/blank_shell_polarity_gate_20260507_1957.json
?? tools/data/blank_shell_scale_law_20260507_2203.json
?? tools/data/blank_shell_stratified_gate_20260507_2310.json
?? tools/data/blank_shell_tqger_gate_20260507_2120.json
?? tools/data/blank_to_source_hinge_20260507_1804.json
?? tools/data/boundary_blank_null_audit_20260509_1430.json
?? tools/data/boundary_blank_null_audit_residual_20260509_1500.json
?? tools/data/boundary_blank_thin_support_audit_20260509_1548.json
?? tools/data/boundary_coherence.json
?? tools/data/boundary_denominator_prescan_20260509_1409.json
?? tools/data/boundary_denominator_prescan_20260509_1430.json
?? tools/data/boundary_denominator_prescan_full_20260509_1500.json
?? tools/data/boundary_mixture_gate_20260507_0330.json
?? tools/data/boundary_mixture_gate_20260507_0330_seedcheck.json
?? tools/data/boundary_residual_beta_absent_audit_20260510_0330.json
?? tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json
?? tools/data/boundary_short_denominator_extension_20260509_1556.json
?? tools/data/boundary_shuffle_audit.json
?? tools/data/boundary_transition_taxonomy_13rows_20260509_1839.json
?? tools/data/boundary_two_axis_matrix_20260509_1532.json
?? tools/data/bridge_order_denominator_gate_20260507_0942.json
?? tools/data/bridge_order_denominator_gate_20260507_0942_seedcheck.json
?? tools/data/brody_calibration_results.json
?? tools/data/brody_flow.json
?? tools/data/condensato_proposals/
?? tools/data/conoscenza_teorie.json.bak.retraction_22_04
?? tools/data/cross_domain_dipolar_direction.json
?? tools/data/cross_observable_consistency.json
?? tools/data/crossover_phase_test.json
?? tools/data/denominator_gate_transfer_matrix.json
?? tools/data/denominator_gate_transfer_matrix_20260509_1444.json
?? tools/data/dipolar_crossover.json
?? tools/data/dipolar_vector_scaling.json
?? tools/data/domandatore/domandatore_20260421_0746.json
?? tools/data/domandatore/domandatore_20260422_0345.json
?? tools/data/domandatore/domandatore_20260423_0345.json
?? tools/data/domandatore/domandatore_20260424_0345.json
?? tools/data/domandatore/domandatore_20260425_0345.json
?? tools/data/domandatore/domandatore_20260426_0345.json
?? tools/data/domandatore/domandatore_20260427_0345.json
?? tools/data/domandatore/domandatore_20260428_0345.json
?? tools/data/domandatore/domandatore_20260428_1236.json
?? tools/data/domandatore/domandatore_20260429_0345.json
?? tools/data/domandatore/domandatore_20260430_0345.json
?? tools/data/domandatore/domandatore_20260501_0345.json
?? tools/data/domandatore/domandatore_20260502_0345.json
?? tools/data/domandatore/domandatore_20260503_0345.json
?? tools/data/domandatore/domandatore_20260504_0345.json
?? tools/data/domandatore/domandatore_20260505_0345.json
?? tools/data/domandatore/domandatore_20260506_0345.json
?? tools/data/domandatore/domandatore_20260507_0345.json
?? tools/data/domandatore/domandatore_20260507_0728.json
?? tools/data/domandatore/domandatore_20260507_0742.json
?? tools/data/domandatore/domandatore_20260507_1420.json
?? tools/data/domandatore/domandatore_20260507_1459.json
?? tools/data/domandatore/domandatore_20260507_2120.json
?? tools/data/domandatore/domandatore_20260507_2157.json
?? tools/data/domandatore/domandatore_20260507_2203.json
?? tools/data/domandatore/domandatore_20260508_0345.json
?? tools/data/domandatore/domandatore_20260508_2121.json
?? tools/data/domandatore/domandatore_20260509_0330.json
?? tools/data/domandatore/domandatore_20260509_0345.json
?? tools/data/domandatore/domandatore_20260509_0637.json
?? tools/data/domandatore/domandatore_20260510_0330.json
?? tools/data/domandatore_pre_cycle.json
?? tools/data/duality_gate_transfer_20260507_0803.json
?? tools/data/duality_gate_transfer_20260507_0803_seedcheck.json
?? tools/data/duality_gate_transfer_20260507_2042.json
?? tools/data/duality_scale_contrast_20260508.json
?? tools/data/evolution/evolution_20260422_0330.md
?? tools/data/evolution/evolution_20260422_1616.md
?? tools/data/evolution/evolution_20260423_0330.md
?? tools/data/evolution/evolution_20260424_0330.md
?? tools/data/evolution/evolution_20260425_0330.md
?? tools/data/evolution/evolution_20260427_0330.md
?? tools/data/evolution/evolution_20260428_0330.md
?? tools/data/evolution/evolution_20260429_0852.md
?? tools/data/evolution/evolution_20260429_1013.md
?? tools/data/evolution/evolution_20260430_0330.md
?? tools/data/evolution/evolution_20260430_1905.md
?? tools/data/evolution/evolution_20260430_1946.md
?? tools/data/evolution/evolution_20260501_0330.md
?? tools/data/evolution/evolution_20260501_0725.md
?? tools/data/evolution/evolution_20260501_0931.md
?? tools/data/evolution/evolution_20260502_0330.md
?? tools/data/evolution/evolution_20260503_0330.md
?? tools/data/evolution/evolution_20260504_0901.md
?? tools/data/evolution/evolution_20260504_1219.md
?? tools/data/evolution/evolution_20260505_0330.md
?? tools/data/evolution/evolution_20260506_0330.md
?? tools/data/evolution/evolution_20260506_1941.md
?? tools/data/evolution/evolution_20260506_1955.md
?? tools/data/evolution/evolution_20260507_0330.md
?? tools/data/evolution/evolution_20260507_0803.md
?? tools/data/evolution/evolution_20260507_0901.md
?? tools/data/evolution/evolution_20260507_0923.md
?? tools/data/evolution/evolution_20260507_0942.md
?? tools/data/evolution/evolution_20260507_1006.md
?? tools/data/evolution/evolution_20260507_1042.md
?? tools/data/evolution/evolution_20260507_1419.md
?? tools/data/evolution/evolution_20260507_1458.md
?? tools/data/evolution/evolution_20260507_1751.md
?? tools/data/evolution/evolution_20260507_1804.md
?? tools/data/evolution/evolution_20260507_1938.md
?? tools/data/evolution/evolution_20260507_1957.md
?? tools/data/evolution/evolution_20260507_2042.md
?? tools/data/evolution/evolution_20260507_2120.md
?? tools/data/evolution/evolution_20260507_2203.md
?? tools/data/evolution/evolution_20260507_2310.md
?? tools/data/evolution/evolution_20260508_0330.md
?? tools/data/evolution/evolution_20260508_1632.md
?? tools/data/evolution/evolution_20260508_1715.md
?? tools/data/evolution/evolution_20260508_1805.md
?? tools/data/evolution/evolution_20260508_1834.md
?? tools/data/evolution/evolution_20260508_1909.md
?? tools/data/evolution/evolution_20260508_1915.md
?? tools/data/evolution/evolution_20260508_1947.md
?? tools/data/evolution/evolution_20260508_2005.md
?? tools/data/evolution/evolution_20260508_2013.md
?? tools/data/evolution/evolution_20260508_2019.md
?? tools/data/evolution/evolution_20260508_2102.md
?? tools/data/evolution/evolution_20260508_2108.md
?? tools/data/evolution/evolution_20260508_2121.md
?? tools/data/evolution/evolution_20260508_2133.md
?? tools/data/evolution/evolution_20260508_2140.md
?? tools/data/evolution/evolution_20260509_0330.md
?? tools/data/evolution/evolution_20260509_0637.md
?? tools/data/evolution/evolution_20260509_0652.md
?? tools/data/evolution/evolution_20260509_0659.md
?? tools/data/evolution/evolution_20260509_0741.md
?? tools/data/evolution/evolution_20260509_0819.md
?? tools/data/evolution/evolution_20260509_0829.md
?? tools/data/evolution/evolution_20260509_0837.md
?? tools/data/evolution/evolution_20260509_0846.md
?? tools/data/evolution/evolution_20260509_1337.md
?? tools/data/evolution/evolution_20260509_1400.md
?? tools/data/evolution/evolution_20260509_1409.md
?? tools/data/evolution/evolution_20260509_1427.md
?? tools/data/evolution/evolution_20260509_1437.md
?? tools/data/evolution/evolution_20260509_1444.md
?? tools/data/evolution/evolution_20260509_1457.md
?? tools/data/evolution/evolution_20260509_1516.md
?? tools/data/evolution/evolution_20260509_1532.md
?? tools/data/evolution/evolution_20260509_1538.md
?? tools/data/evolution/evolution_20260509_1548.md
?? tools/data/evolution/evolution_20260509_1556.md
?? tools/data/evolution/evolution_20260509_1839.md
?? tools/data/exp_det_drift_20260507_2042.json
?? tools/data/falsifier_20260507_2120.raw.txt
?? tools/data/g1_log.jsonl
?? tools/data/g2_log.jsonl
?? tools/data/gap_label_block_scale_gate_20260508_1805.json
?? tools/data/gap_label_generator_gate_20260508_1715.json
?? tools/data/gap_label_ostrowski_recognizability_gate_20260508_2013.json
?? tools/data/gap_label_ostrowski_recognizability_gate_20260508_2013_seedcheck.json
?? tools/data/gap_label_position_error_gate_20260508_1947.json
?? tools/data/gap_label_repair_audit_20260508_1915.json
?? tools/data/gap_label_set_stability_20260508_1632.json
?? tools/data/gap_label_substitution_grammar_gate_20260508_1834.json
?? tools/data/gap_label_supertile_tiling_gate_20260508_1909.json
?? tools/data/gap_label_symbolic_grammar_gate_20260508_2005.json
?? tools/data/gap_label_symbolic_grammar_gate_20260508_2005_window55_seedcheck.json
?? tools/data/graph_completion/graph_completion_20260509_0846.json
?? tools/data/graph_completion/graph_completion_20260509_1337.json
?? tools/data/graph_completion/graph_completion_20260509_1400.json
?? tools/data/graph_completion/graph_completion_20260509_1409.json
?? tools/data/graph_completion/graph_completion_20260509_1427.json
?? tools/data/graph_completion/graph_completion_20260509_1437.json
?? tools/data/graph_completion/graph_completion_20260509_1444.json
?? tools/data/graph_completion/graph_completion_20260509_1457.json
?? tools/data/graph_completion/graph_completion_20260509_1516.json
?? tools/data/graph_completion/graph_completion_20260509_1532.json
?? tools/data/graph_completion/graph_completion_20260509_1538.json
?? tools/data/graph_completion/graph_completion_20260509_1548.json
?? tools/data/graph_completion/graph_completion_20260509_1839.json
?? tools/data/incrocio_20260422_0336.json
?? tools/data/incrocio_20260423_0335.json
?? tools/data/incrocio_20260424_0347.json
?? tools/data/incrocio_20260425_0339.json
?? tools/data/incrocio_20260428_0340.json
?? tools/data/incrocio_20260429_0859.json
?? tools/data/incrocio_20260506_0633.json
?? tools/data/incrocio_20260507_2120.json
?? tools/data/incrocio_20260507_2157.json
?? tools/data/incrocio_20260507_2203.json
?? tools/data/incrocio_20260507_2310.json
?? tools/data/incrocio_20260508_0011.json
?? tools/data/incrocio_20260508_0020.json
?? tools/data/incrocio_20260508_0330.json
?? tools/data/incrocio_20260508_1632.json
?? tools/data/incrocio_20260508_1715.json
?? tools/data/incrocio_20260508_1805.json
?? tools/data/incrocio_20260508_1834.json
?? tools/data/incrocio_20260508_1909.json
?? tools/data/incrocio_20260508_1915.json
?? tools/data/incrocio_20260508_1947.json
?? tools/data/incrocio_20260508_2005.json
?? tools/data/incrocio_20260508_2013.json
?? tools/data/incrocio_20260508_2019.json
?? tools/data/incrocio_20260508_2102.json
?? tools/data/incrocio_20260508_2108.json
?? tools/data/incrocio_20260508_2121.json
?? tools/data/incrocio_20260508_2133.json
?? tools/data/incrocio_20260508_2140.json
?? tools/data/incrocio_20260509_0330.json
?? tools/data/incrocio_20260509_0637.json
?? tools/data/incrocio_20260509_0652.json
?? tools/data/incrocio_20260509_0659.json
?? tools/data/incrocio_20260509_0741.json
?? tools/data/incrocio_20260509_0819.json
?? tools/data/incrocio_20260509_0829.json
?? tools/data/incrocio_20260509_0837.json
?? tools/data/incrocio_20260509_0846.json
?? tools/data/incrocio_20260509_1337.json
?? tools/data/incrocio_20260509_1400.json
?? tools/data/incrocio_20260509_1409.json
?? tools/data/incrocio_20260509_1414.json
?? tools/data/incrocio_20260509_1427.json
?? tools/data/incrocio_20260509_1431.json
?? tools/data/incrocio_20260509_1437.json
?? tools/data/incrocio_20260509_1440.json
?? tools/data/incrocio_20260509_1444.json
?? tools/data/incrocio_20260509_1457.json
?? tools/data/incrocio_20260509_1516.json
?? tools/data/incrocio_20260509_1532.json
?? tools/data/incrocio_20260509_1538.json
?? tools/data/incrocio_20260509_1548.json
?? tools/data/incrocio_20260509_1556.json
?? tools/data/incrocio_20260509_1839.json
?? tools/data/incrocio_20260510_0330.json
?? tools/data/lab_bridge_issues.jsonl
?? tools/data/logistic_counter_scope_gate_20260507_1006.json
?? tools/data/logistic_counter_scope_gate_20260507_1006_seedcheck.json
?? tools/data/logistic_cyclic_block_entropy_gate_20260507_1419.json
?? tools/data/logistic_cyclic_block_entropy_gate_20260507_1419_seedcheck.json
?? tools/data/logistic_surrogate_contract_gate_20260507_1042.json
?? tools/data/logistic_surrogate_contract_gate_20260507_1042_seedcheck.json
?? tools/data/magnitude_psd_from_acf.json
?? tools/data/markov3_observable_hunt.json
?? tools/data/markov_dipolar_decomposition.json
?? tools/data/markov_k_direction.json
?? tools/data/markov_layer_recovery_audit.json
?? tools/data/markov_memory_by_gue_type.json
?? tools/data/markov_scale_function.json
?? tools/data/meta_assertion_gate.json
?? tools/data/meta_tautology_test.json
?? tools/data/mod3_scaling.json
?? tools/data/mod3_vs_residual_ordering.json
?? tools/data/modular_algebra_depth.json
?? tools/data/modular_memory_spectrum.json
?? tools/data/nonphi_sturmian_fixed_reader_gate_20260508_2019.json
?? tools/data/nonphi_sturmian_fixed_reader_gate_20260508_2019_seedcheck.json
?? tools/data/observable_collinearity_breaking_20260506_1955.json
?? tools/data/observable_collinearity_breaking_20260506_1956.json
?? tools/data/observable_collinearity_breaking_20260506_1957.json
?? tools/data/observable_rank_audit.json
?? tools/data/observable_rank_audit_seed20260506.json
?? tools/data/observatorio/domandatore_unTouched_20260507_095914.md
?? tools/data/observatorio/lazarus_cimitero_20260507_100015.md
?? tools/data/observatorio/meta_metodo_giro_2026-05-07.md
?? tools/data/operator_directives_consumed/
?? tools/data/perturbation_dimensionality_audit.json
?? tools/data/perturbation_dimensionality_audit_scale0330.json
?? tools/data/perturbation_rank_size_curve.json
?? tools/data/prime_mobius_gap_stratified_zero_gate_20260508_2121.json
?? tools/data/prime_mobius_interval_charge_gate_20260508_2102.json
?? tools/data/prime_mobius_pair_stratified_zero_gate_20260508_2133.json
?? tools/data/prime_mobius_zero_mediator_gate_20260508_2108.json
?? tools/data/promotions/
?? tools/data/quasiperiodic_gap_ratio_denominator_20260508_0330.json
?? tools/data/quasiperiodic_vc_curve_map_20260509_0330.json
?? tools/data/quasiperiodic_vc_lattice_gate_20260508_2140.json
?? tools/data/repairs/
?? tools/data/reports/_quarantine_falsifier_29_04/
?? tools/data/reports/agent_20260422_0330.md
?? tools/data/reports/agent_20260422_1616.md
?? tools/data/reports/agent_20260423_0330.md
?? tools/data/reports/agent_20260424_0330.md
?? tools/data/reports/agent_20260425_0330.md
?? tools/data/reports/agent_20260426_0330.md
?? tools/data/reports/agent_20260427_0330.md
?? tools/data/reports/agent_20260428_0330.md
?? tools/data/reports/agent_20260429_1013.md
?? tools/data/reports/agent_20260429_1041.md
?? tools/data/reports/agent_20260430_0330.md
?? tools/data/reports/agent_20260430_1905.md
?? tools/data/reports/agent_20260430_1919.md
?? tools/data/reports/agent_20260430_1946.md
?? tools/data/reports/agent_20260501_0330.md
?? tools/data/reports/agent_20260501_0725.md
?? tools/data/reports/agent_20260501_0931.md
?? tools/data/reports/agent_20260502_0330.md
?? tools/data/reports/agent_20260503_0330.md
?? tools/data/reports/agent_20260504_0901.md
?? tools/data/reports/agent_20260504_1219.md
?? tools/data/reports/agent_20260505_0330.md
?? tools/data/reports/agent_20260505_1022.md
?? tools/data/reports/agent_20260506_0330.md
?? tools/data/reports/agent_20260506_0625.md
?? tools/data/reports/agent_20260506_1941.md
?? tools/data/reports/agent_20260506_1955.md
?? tools/data/reports/agent_20260507_0330.md
?? tools/data/reports/agent_20260507_0803.md
?? tools/data/reports/agent_20260507_0901.md
?? tools/data/reports/agent_20260507_0923.md
?? tools/data/reports/agent_20260507_0942.md
?? tools/data/reports/agent_20260507_1006.md
?? tools/data/reports/agent_20260507_1042.md
?? tools/data/reports/agent_20260507_1419.md
?? tools/data/reports/agent_20260507_1458.md
?? tools/data/reports/agent_20260507_1751.md
?? tools/data/reports/agent_20260507_1804.md
?? tools/data/reports/agent_20260507_1938.md
?? tools/data/reports/agent_20260507_1957.md
?? tools/data/reports/agent_20260507_2042.md
?? tools/data/reports/agent_20260507_2120.md
?? tools/data/reports/agent_20260507_2157.md
?? tools/data/reports/agent_20260507_2203.md
?? tools/data/reports/agent_20260507_2310.md
?? tools/data/reports/agent_20260508_0011.md
?? tools/data/reports/agent_20260508_0330.md
?? tools/data/reports/agent_20260508_1632.md
?? tools/data/reports/agent_20260508_1715.md
?? tools/data/reports/agent_20260508_1805.md
?? tools/data/reports/agent_20260508_1834.md
?? tools/data/reports/agent_20260508_1909.md
?? tools/data/reports/agent_20260508_1915.md
?? tools/data/reports/agent_20260508_1947.md
?? tools/data/reports/agent_20260508_2005.md
?? tools/data/reports/agent_20260508_2013.md
?? tools/data/reports/agent_20260508_2019.md
?? tools/data/reports/agent_20260508_2102.md
?? tools/data/reports/agent_20260508_2108.md
?? tools/data/reports/agent_20260508_2121.md
?? tools/data/reports/agent_20260508_2133.md
?? tools/data/reports/agent_20260508_2140.md
?? tools/data/reports/agent_20260509_0330.md
?? tools/data/reports/agent_20260509_0637.md
?? tools/data/reports/agent_20260509_0652.md
?? tools/data/reports/agent_20260509_0659.md
?? tools/data/reports/agent_20260509_0741.md
?? tools/data/reports/agent_20260509_0819.md
?? tools/data/reports/agent_20260509_0829.md
?? tools/data/reports/agent_20260509_0837.md
?? tools/data/reports/agent_20260509_0846.md
?? tools/data/reports/agent_20260509_1337.md
?? tools/data/reports/agent_20260509_1400.md
?? tools/data/reports/agent_20260509_1409.md
?? tools/data/reports/agent_20260509_1427.md
?? tools/data/reports/agent_20260509_1437.md
?? tools/data/reports/agent_20260509_1444.md
?? tools/data/reports/agent_20260509_1457.md
?? tools/data/reports/agent_20260509_1516.md
?? tools/data/reports/agent_20260509_1532.md
?? tools/data/reports/agent_20260509_1538.md
?? tools/data/reports/agent_20260509_1548.md
?? tools/data/reports/agent_20260509_1556.md
?? tools/data/reports/agent_20260509_1839.md
?? tools/data/reports/ddf_20260422_0405.json
?? tools/data/reports/ddf_20260423_0405.json
?? tools/data/reports/ddf_20260424_0405.json
?? tools/data/reports/ddf_20260425_0405.json
?? tools/data/reports/ddf_20260426_0405.json
?? tools/data/reports/ddf_20260427_0405.json
?? tools/data/reports/ddf_20260428_0405.json
?? tools/data/reports/ddf_20260429_0405.json
?? tools/data/reports/ddf_20260430_0405.json
?? tools/data/reports/ddf_20260501_0405.json
?? tools/data/reports/ddf_20260502_0405.json
?? tools/data/reports/ddf_20260503_0405.json
?? tools/data/reports/ddf_20260504_0405.json
?? tools/data/reports/ddf_20260505_0405.json
?? tools/data/reports/ddf_20260505_0636.json
?? tools/data/reports/ddf_20260506_0405.json
?? tools/data/reports/ddf_20260507_0405.json
?? tools/data/reports/ddf_20260508_0405.json
?? tools/data/reports/ddf_20260509_0405.json
?? tools/data/reports/evolution_20260422_0330.md
?? tools/data/reports/evolution_20260422_1616.md
?? tools/data/reports/evolution_20260423_0330.md
?? tools/data/reports/evolution_20260424_0330.md
?? tools/data/reports/evolution_20260425_0330.md
?? tools/data/reports/evolution_20260427_0330.md
?? tools/data/reports/evolution_20260428_0330.md
?? tools/data/reports/evolution_20260503_0330.md
?? tools/data/reports/evolution_20260504_0330.md
?? tools/data/reports/evolution_20260505_0330.md
?? tools/data/reports/evolution_20260506_0330.md
?? tools/data/reports/evolution_20260506_1941.md
?? tools/data/reports/falsifier_20260429_1013.json
?? tools/data/reports/falsifier_20260429_1041.json
?? tools/data/reports/falsifier_20260430_0330.json
?? tools/data/reports/falsifier_20260430_1905.json
?? tools/data/reports/falsifier_20260430_1919.json
?? tools/data/reports/falsifier_20260430_1946.json
?? tools/data/reports/falsifier_20260501_0330.json
?? tools/data/reports/falsifier_20260501_0725.json
?? tools/data/reports/falsifier_20260501_0931.json
?? tools/data/reports/falsifier_20260502_0330.json
?? tools/data/reports/falsifier_20260503_0330.json
?? tools/data/reports/falsifier_20260504_0901.json
?? tools/data/reports/falsifier_20260504_1219.json
?? tools/data/reports/falsifier_20260505_0330.json
?? tools/data/reports/falsifier_20260506_0330.raw.txt
?? tools/data/reports/falsifier_20260506_0625.json
?? tools/data/reports/falsifier_20260506_1941.json
?? tools/data/reports/falsifier_20260506_1955.json
?? tools/data/reports/falsifier_20260506_1955.raw.txt
?? tools/data/reports/falsifier_20260507_0330.json
?? tools/data/reports/falsifier_20260507_0330.raw.txt
?? tools/data/reports/falsifier_20260507_0803.json
?? tools/data/reports/falsifier_20260507_0803.raw.txt
?? tools/data/reports/falsifier_20260507_0901.json
?? tools/data/reports/falsifier_20260507_0923.json
?? tools/data/reports/falsifier_20260507_0923.raw.txt
?? tools/data/reports/falsifier_20260507_0942.json
?? tools/data/reports/falsifier_20260507_1006.json
?? tools/data/reports/falsifier_20260507_1042.json
?? tools/data/reports/falsifier_20260507_1042.raw.txt
?? tools/data/reports/falsifier_20260507_1419.json
?? tools/data/reports/falsifier_20260507_1458.json
?? tools/data/reports/falsifier_20260507_1458.raw.txt
?? tools/data/reports/falsifier_20260507_1751.json
?? tools/data/reports/falsifier_20260507_1804.json
?? tools/data/reports/falsifier_20260507_1938.json
?? tools/data/reports/falsifier_20260507_1938.raw.txt
?? tools/data/reports/falsifier_20260507_1957.json
?? tools/data/reports/falsifier_20260507_2042.json
?? tools/data/reports/falsifier_20260507_2120.json
?? tools/data/reports/falsifier_20260507_2203.json
?? tools/data/reports/falsifier_20260507_2310.json
?? tools/data/reports/falsifier_20260508_0011.json
?? tools/data/reports/falsifier_20260508_0330.json
?? tools/data/reports/falsifier_20260508_1632.raw.txt
?? tools/data/reports/falsifier_20260508_1715.json
?? tools/data/reports/falsifier_20260508_1805.json
?? tools/data/reports/falsifier_20260508_1834.json
?? tools/data/reports/falsifier_20260508_1909.json
?? tools/data/reports/falsifier_20260508_1915.json
?? tools/data/reports/falsifier_20260508_1947.json
?? tools/data/reports/falsifier_20260508_2005.json
?? tools/data/reports/falsifier_20260508_2013.json
?? tools/data/reports/falsifier_20260508_2019.json
?? tools/data/reports/falsifier_20260508_2102.json
?? tools/data/reports/falsifier_20260508_2108.json
?? tools/data/reports/falsifier_20260508_2108.raw.txt
?? tools/data/reports/falsifier_20260508_2121.json
?? tools/data/reports/falsifier_20260508_2133.json
?? tools/data/reports/falsifier_20260508_2133.raw.txt
?? tools/data/reports/falsifier_20260508_2140.json
?? tools/data/reports/falsifier_20260509_0330.json
?? tools/data/reports/falsifier_20260509_0637.json
?? tools/data/reports/falsifier_20260509_0652.json
?? tools/data/reports/falsifier_20260509_0659.json
?? tools/data/reports/falsifier_20260509_0741.json
?? tools/data/reports/falsifier_20260509_0819.json
?? tools/data/reports/falsifier_20260509_0829.json
?? tools/data/reports/falsifier_20260509_0837.json
?? tools/data/reports/falsifier_20260509_0846.json
?? tools/data/reports/falsifier_20260509_1337.json
?? tools/data/reports/falsifier_20260509_1400.json
?? tools/data/reports/falsifier_20260509_1409.json
?? tools/data/reports/falsifier_20260509_1427.json
?? tools/data/reports/falsifier_20260509_1437.json
?? tools/data/reports/falsifier_20260509_1444.json
?? tools/data/reports/falsifier_20260509_1457.json
?? tools/data/reports/falsifier_20260509_1516.json
?? tools/data/reports/falsifier_20260509_1532.json
?? tools/data/reports/falsifier_20260509_1538.json
?? tools/data/reports/falsifier_20260509_1548.json
?? tools/data/reports/falsifier_20260509_1556.json
?? tools/data/reports/falsifier_20260509_1839.json
?? tools/data/reports/incident_20260504_0721.md
?? tools/data/reports/incident_20260504_1138.md
?? tools/data/reports/latest.md
?? tools/data/reports/loop_guard_20260507_0330.json
?? tools/data/reports/loop_guard_20260507_0803.json
?? tools/data/reports/loop_guard_20260507_0901.json
?? tools/data/reports/loop_guard_20260507_0923.json
?? tools/data/reports/loop_guard_20260507_0942.json
?? tools/data/reports/loop_guard_20260507_1006.json
?? tools/data/reports/loop_guard_20260507_1042.json
?? tools/data/reports/loop_guard_20260507_1419.json
?? tools/data/reports/loop_guard_20260507_1458.json
?? tools/data/reports/loop_guard_20260507_1751.json
?? tools/data/reports/loop_guard_20260507_1804.json
?? tools/data/reports/loop_guard_20260507_1938.json
?? tools/data/reports/loop_guard_20260507_1957.json
?? tools/data/reports/loop_guard_20260507_2042.json
?? tools/data/reports/loop_guard_20260507_2120.json
?? tools/data/reports/loop_guard_20260507_2203.json
?? tools/data/reports/loop_guard_20260507_2310.json
?? tools/data/reports/loop_guard_20260508_0011.json
?? tools/data/reports/loop_guard_20260508_0330.json
?? tools/data/reports/loop_guard_20260508_1632.json
?? tools/data/reports/loop_guard_20260508_1715.json
?? tools/data/reports/loop_guard_20260508_1805.json
?? tools/data/reports/loop_guard_20260508_1834.json
?? tools/data/reports/loop_guard_20260508_1909.json
?? tools/data/reports/loop_guard_20260508_1915.json
?? tools/data/reports/loop_guard_20260508_1947.json
?? tools/data/reports/loop_guard_20260508_2005.json
?? tools/data/reports/loop_guard_20260508_2013.json
?? tools/data/reports/loop_guard_20260508_2019.json
?? tools/data/reports/loop_guard_20260508_2102.json
?? tools/data/reports/loop_guard_20260508_2108.json
?? tools/data/reports/loop_guard_20260508_2121.json
?? tools/data/reports/loop_guard_20260508_2133.json
?? tools/data/reports/loop_guard_20260508_2140.json
?? tools/data/reports/loop_guard_20260509_0330.json
?? tools/data/reports/loop_guard_20260509_0637.json
?? tools/data/reports/loop_guard_20260509_0652.json
?? tools/data/reports/loop_guard_20260509_0659.json
?? tools/data/reports/loop_guard_20260509_0741.json
?? tools/data/reports/loop_guard_20260509_0819.json
?? tools/data/reports/loop_guard_20260509_0829.json
?? tools/data/reports/loop_guard_20260509_0837.json
?? tools/data/reports/loop_guard_20260509_0846.json
?? tools/data/reports/loop_guard_20260509_1337.json
?? tools/data/reports/loop_guard_20260509_1400.json
?? tools/data/reports/loop_guard_20260509_1409.json
?? tools/data/reports/loop_guard_20260509_1427.json
?? tools/data/reports/loop_guard_20260509_1437.json
?? tools/data/reports/loop_guard_20260509_1444.json
?? tools/data/reports/loop_guard_20260509_1457.json
?? tools/data/reports/loop_guard_20260509_1516.json
?? tools/data/reports/loop_guard_20260509_1532.json
?? tools/data/reports/loop_guard_20260509_1538.json
?? tools/data/reports/loop_guard_20260509_1548.json
?? tools/data/reports/loop_guard_20260509_1556.json
?? tools/data/reports/loop_guard_20260509_1839.json
?? tools/data/reports/trajectory_apply_20260506_1931.json
?? tools/data/reports/trajectory_apply_20260506_1941.json
?? tools/data/reports/trajectory_apply_20260506_1955.json
?? tools/data/reports/trajectory_apply_20260507_0330.json
?? tools/data/reports/trajectory_apply_20260507_0803.json
?? tools/data/reports/trajectory_apply_20260507_0901.json
?? tools/data/reports/trajectory_apply_20260507_0923.json
?? tools/data/reports/trajectory_apply_20260507_0942.json
?? tools/data/reports/trajectory_apply_20260507_1006.json
?? tools/data/reports/trajectory_apply_20260507_1042.json
?? tools/data/scale_selective_perturbation.json
?? tools/data/selective_layer_decoupling.json
?? tools/data/seme_archive/piano_92.json
?? tools/data/seme_archive/piano_93.json
?? tools/data/seme_archive/piano_94.json
?? tools/data/seme_archive/piano_95.json
?? tools/data/seme_archive/piano_96.json
?? tools/data/seme_archive/piano_97.json
?? tools/data/seme_archive/piano_98.json
?? tools/data/seme_archive/piano_99.json
?? tools/data/seme_backup_b2_20260508_192024.json
?? tools/data/seme_backup_b2_20260508_214525.json
?? tools/data/seme_backup_b2_20260509_033618.json
?? tools/data/seme_backup_b2_20260509_071041.json
?? tools/data/seme_backup_b2_20260509_144120.json
?? tools/data/seme_backup_b2_20260509_144841.json
?? tools/data/semireal_boundary_transfer_gate_20260509_1516.json
?? tools/data/semireal_order_denominator_gate_20260507_0923.json
?? tools/data/semireal_order_denominator_gate_20260507_0923_seedcheck.json
?? tools/data/spectral_rigidity_results.json
?? tools/data/tqge_underlay_gate_20260507_1751.json
?? tools/data/trajectory_apply_history.jsonl
?? tools/data/triadic_deposit_gate_20260507_1938.json
?? tools/data/two_channel_boundary.json
?? tools/data/two_channel_cross_domain.json
?? tools/data/two_channel_shuffle_audit.json
?? tools/data/two_layer_universality.json
?? tools/data/valutatore_log.jsonl
?? tools/data/vc_fit_model_gate_20260509_1400.json
?? tools/data/vc_fit_ready_scale_table_20260509_1337.json
?? tools/data/vc_generator_class_direction_audit_20260509_0846.json
?? tools/data/vc_generator_class_scale_gate_20260509_0837.json
?? tools/data/vc_label_preserving_phase_bridge_20260509_0741.json
?? tools/data/vc_label_preserving_swap_gate_20260509_0652.json
?? tools/data/vc_label_preserving_swap_gate_20260509_0652_deep89.json
?? tools/data/vc_label_preserving_swap_gate_20260509_0659.json
?? tools/data/vc_label_reachability_gate_20260509_0659.json
?? tools/data/vc_memory_crossing_gradient_20260509_0829.json
?? tools/data/vc_nonsturmian_label_null_gate_20260509_0819.json
?? tools/data/vc_null_regression_gate_20260509_0637.json
?? tools/data/vc_unit_boundary_audit_20260509_1457.json
?? tools/data/veritas/veritas_20260505_131056.json
?? tools/data/veritas/veritas_20260505_131201.json
?? tools/data/veritas/veritas_20260506_033803.json
?? tools/data/veritas/veritas_20260506_063303.json
?? tools/data/veritas/veritas_20260506_194644.json
?? tools/data/veritas/veritas_20260506_200238.json
?? tools/data/veritas/veritas_20260507_033525.json
?? tools/data/veritas/veritas_20260507_080958.json
?? tools/data/veritas/veritas_20260507_090723.json
?? tools/data/veritas/veritas_20260507_093207.json
?? tools/data/veritas/veritas_20260507_094723.json
?? tools/data/veritas/veritas_20260507_101605.json
?? tools/data/veritas/veritas_20260507_104904.json
?? tools/data/veritas/veritas_20260507_142501.json
?? tools/data/veritas/veritas_20260507_150443.json
?? tools/data/veritas/veritas_20260507_175511.json
?? tools/data/veritas/veritas_20260507_180843.json
?? tools/data/veritas/veritas_20260507_194258.json
?? tools/data/veritas/veritas_20260507_200223.json
?? tools/data/veritas/veritas_20260507_204637.json
?? tools/data/veritas/veritas_20260507_212541.json
?? tools/data/veritas/veritas_20260507_221109.json
?? tools/data/veritas/veritas_20260507_231732.json
?? tools/data/veritas/veritas_20260508_002036.json
?? tools/data/veritas/veritas_20260508_033454.json
?? tools/data/veritas/veritas_20260508_163804.json
?? tools/data/veritas/veritas_20260508_172020.json
?? tools/data/veritas/veritas_20260508_181110.json
?? tools/data/veritas/veritas_20260508_183856.json
?? tools/data/veritas/veritas_20260508_191516.json
?? tools/data/veritas/veritas_20260508_192002.json
?? tools/data/veritas/veritas_20260508_195247.json
?? tools/data/veritas/veritas_20260508_201056.json
?? tools/data/veritas/veritas_20260508_201917.json
?? tools/data/veritas/veritas_20260508_202448.json
?? tools/data/veritas/veritas_20260508_210742.json
?? tools/data/veritas/veritas_20260508_211531.json
?? tools/data/veritas/veritas_20260508_212526.json
?? tools/data/veritas/veritas_20260508_213916.json
?? tools/data/veritas/veritas_20260508_214506.json
?? tools/data/veritas/veritas_20260509_033556.json
?? tools/data/veritas/veritas_20260509_064401.json
?? tools/data/veritas/veritas_20260509_065842.json
?? tools/data/veritas/veritas_20260509_071025.json
?? tools/data/veritas/veritas_20260509_074804.json
?? tools/data/veritas/veritas_20260509_082441.json
?? tools/data/veritas/veritas_20260509_083335.json
?? tools/data/veritas/veritas_20260509_084507.json
?? tools/data/veritas/veritas_20260509_085203.json
?? tools/data/veritas/veritas_20260509_134157.json
?? tools/data/veritas/veritas_20260509_140630.json
?? tools/data/veritas/veritas_20260509_141447.json
?? tools/data/veritas/veritas_20260509_143129.json
?? tools/data/veritas/veritas_20260509_144056.json
?? tools/data/veritas/veritas_20260509_144819.json
?? tools/data/veritas/veritas_20260509_150724.json
?? tools/data/veritas/veritas_20260509_152405.json
?? tools/data/veritas/veritas_20260509_153722.json
?? tools/data/veritas/veritas_20260509_154358.json
?? tools/data/veritas/veritas_20260509_155256.json
?? tools/data/veritas/veritas_20260509_160752.json
?? tools/data/veritas/veritas_20260509_184434.json
?? tools/data/vincoli_decay_log.jsonl
?? tools/evolution_report.md
?? tools/exp_3d_boundary_layers.py
?? tools/exp_blank_shell_dilation_gate.py
?? tools/exp_blank_shell_polarity_gate.py
?? tools/exp_blank_shell_scale_law.py
?? tools/exp_blank_shell_stratified_gate.py
?? tools/exp_blank_shell_tqger_gate.py
?? tools/exp_blank_to_source_hinge.py
?? tools/exp_boundary_coherence.py
?? tools/exp_boundary_mixture_gate.py
?? tools/exp_boundary_residual_beta_absent_audit.py
?? tools/exp_boundary_shuffle_audit.py
?? tools/exp_boundary_transition_taxonomy_13rows.py
?? tools/exp_bridge_order_denominator_gate.py
?? tools/exp_brody_calibration.py
?? tools/exp_brody_flow.py
?? tools/exp_cross_domain_dipolar_direction.py
?? tools/exp_cross_observable_consistency.py
?? tools/exp_crossover_phase_test.py
?? tools/exp_dipolar_angle_reference.py
?? tools/exp_dipolar_crossover.py
?? tools/exp_dipolar_vector_scaling.py
?? tools/exp_duality_gate_transfer.py
?? tools/exp_duality_scale_contrast.py
?? tools/exp_gap_label_block_scale_gate.py
?? tools/exp_gap_label_generator_gate.py
?? tools/exp_gap_label_ostrowski_recognizability_gate.py
?? tools/exp_gap_label_position_error_gate.py
?? tools/exp_gap_label_repair_audit.py
?? tools/exp_gap_label_set_stability.py
?? tools/exp_gap_label_substitution_grammar_gate.py
?? tools/exp_gap_label_supertile_tiling_gate.py
?? tools/exp_gap_label_symbolic_grammar_gate.py
?? tools/exp_logistic_counter_scope_gate.py
?? tools/exp_logistic_cyclic_block_entropy_gate.py
?? tools/exp_logistic_surrogate_contract_gate.py
?? tools/exp_magnitude_psd_from_acf.py
?? tools/exp_markov3_observable_hunt.py
?? tools/exp_markov_dipolar_decomposition.py
?? tools/exp_markov_k_direction.py
?? tools/exp_markov_layer_recovery_audit.py
?? tools/exp_markov_memory_by_gue_type.py
?? tools/exp_markov_psd_prediction.py
?? tools/exp_markov_scale_function.py
?? tools/exp_meta_tautology_test.py
?? tools/exp_mod3_scaling.py
?? tools/exp_mod3_vs_residual_ordering.py
?? tools/exp_modular_algebra_depth.py
?? tools/exp_modular_memory_spectrum.py
?? tools/exp_nonphi_sturmian_fixed_reader_gate.py
?? tools/exp_observable_rank_audit.py
?? tools/exp_perturbation_dimensionality_audit.py
?? tools/exp_perturbation_rank_size_curve.py
?? tools/exp_prime_mobius_interval_charge_gate.py
?? tools/exp_prime_mobius_zero_mediator_gate.py
?? tools/exp_quasiperiodic_gap_ratio_denominator.py
?? tools/exp_scale_selective_perturbation.py
?? tools/exp_selective_layer_decoupling.py
?? tools/exp_spectral_rigidity.py
?? tools/exp_tqge_underlay_gate.py
?? tools/exp_triadic_deposit_gate.py
?? tools/exp_two_channel_boundary.py
?? tools/exp_two_channel_cross_domain.py
?? tools/exp_two_channel_shuffle_audit.py
?? tools/exp_two_layer_universality.py
?? tools/exp_vc_fit_model_gate.py
?? tools/exp_vc_fit_ready_scale_table.py
?? tools/exp_vc_null_regression_gate.py
?? tools/exp_vc_unit_boundary_audit.py
?? tools/meta_assertion_gate.py

exec
/bin/bash -lc "python -m json.tool tools/data/boundary_residual_beta_absent_audit_20260510_0330.json | sed -n '1,260p'" in /opt/MM_D-ND
 succeeded in 0ms:
{
    "experiment": "boundary_residual_beta_absent_audit",
    "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
    "observables_registry": "1.0.0-2026-05-06",
    "observables_used": [
        "SR",
        "SR2",
        "L1",
        "L2",
        "triple_var",
        "window_state",
        "blank_window_rate",
        "full_signature_jaccard",
        "common_window_obs_jaccard"
    ],
    "params": {
        "prime_gaps": 4096,
        "random_matrix_gaps": 4096,
        "window_gaps": 1024,
        "window_count": 4,
        "gue_matrix_size": 64,
        "n_replicates": 12,
        "n_beta": 11,
        "n_baseline": 24,
        "z_min": 2.0,
        "min_one_sided": 1,
        "illusory_residue_max": 0.75,
        "endpoint_distance_min": 1.0,
        "seed": 202605100330,
        "out": "tools/data/boundary_residual_beta_absent_audit_20260510_0330.json"
    },
    "targets": [
        "numeri_primi:cycle_3",
        "random_matrix:cycle_7"
    ],
    "observable_contract": {
        "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
        "observable": "window_state plus one-sided observable signature",
        "operator": "canonical order/null gate on target rows only",
        "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
        "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
        "not_tested": "global beta grid, V_c, source GUE/Poisson label validity"
    },
    "sequence_sources": {
        "numeri_primi:cycle_3": {
            "domain": "numeri_primi",
            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
            "source_n_gaps": 4096
        },
        "random_matrix:cycle_7": {
            "domain": "random_matrix",
            "generator": "gue_spacing_blocks",
            "source_n_gaps": 4096
        }
    },
    "row_summaries": {
        "numeri_primi:cycle_3": {
            "window_count": 4,
            "blank_windows": 4,
            "beta_recovered_windows": 0,
            "support_fall_windows": 0,
            "blank_window_rate": 1.0,
            "common_one_sided_observables": [
                "SR"
            ],
            "union_one_sided_observables": [
                "L1",
                "L2",
                "SR",
                "triple_var"
            ],
            "endpoint_distance_mean": 2.7605414022417722,
            "stable_count_coherent_mean": 2.5625
        },
        "random_matrix:cycle_7": {
            "window_count": 4,
            "blank_windows": 3,
            "beta_recovered_windows": 1,
            "support_fall_windows": 0,
            "blank_window_rate": 0.75,
            "common_one_sided_observables": [
                "L2"
            ],
            "union_one_sided_observables": [
                "L1",
                "L2",
                "SR2",
                "triple_var"
            ],
            "endpoint_distance_mean": 2.9872250931544526,
            "stable_count_coherent_mean": 3.0833333333333335
        }
    },
    "full_signature_jaccard": 0.6,
    "common_window_obs_jaccard": 0.0,
    "verdict": "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE",
    "cases": {
        "numeri_primi:cycle_3": [
            {
                "label": "full",
                "n_gaps": 4096,
                "one_sided_observables": [
                    "SR",
                    "L1",
                    "triple_var"
                ],
                "one_sided_count": 3,
                "endpoint_stable_observables": [],
                "stable_count_coherent": 3.0,
                "stable_count_illusory": 0.16666666666666666,
                "endpoint_distance": 3.331796466159236,
                "ambiguous_beta": [],
                "state": "beta_absent_blank",
                "z_mean_coherent": {
                    "SR": -7.73215829033752,
                    "SR2": 0.8963074480709295,
                    "L1": -4.336555232650903,
                    "L2": -0.8310580288802503,
                    "triple_var": -4.173091884959058
                },
                "z_mean_illusory": {
                    "SR": 0.10728364385318052,
                    "SR2": -0.24829488887969395,
                    "L1": -0.05535535007967627,
                    "L2": 0.016940723006960718,
                    "triple_var": -0.0743564450763749
                }
            },
            {
                "label": "window_1",
                "n_gaps": 1024,
                "one_sided_observables": [
                    "SR"
                ],
                "one_sided_count": 1,
                "endpoint_stable_observables": [],
                "stable_count_coherent": 1.1666666666666667,
                "stable_count_illusory": 0.4166666666666667,
                "endpoint_distance": 1.897727562743835,
                "ambiguous_beta": [],
                "state": "beta_absent_blank",
                "z_mean_coherent": {
                    "SR": -4.91693001972087,
                    "SR2": 1.1161626095968578,
                    "L1": -1.5543331170488228,
                    "L2": -0.3141902395370448,
                    "triple_var": -1.5366054228513395
                },
                "z_mean_illusory": {
                    "SR": -0.026510351301412178,
                    "SR2": -0.08076525501449419,
                    "L1": 0.18117313209620814,
                    "L2": 0.48464457951635337,
                    "triple_var": 0.3542559672358781
                }
            },
            {
                "label": "window_2",
                "n_gaps": 1024,
                "one_sided_observables": [
                    "SR",
                    "L1",
                    "triple_var"
                ],
                "one_sided_count": 3,
                "endpoint_stable_observables": [],
                "stable_count_coherent": 3.0,
                "stable_count_illusory": 0.4166666666666667,
                "endpoint_distance": 3.2278138590830103,
                "ambiguous_beta": [],
                "state": "beta_absent_blank",
                "z_mean_coherent": {
                    "SR": -5.394782743128162,
                    "SR2": 1.0402455183391306,
                    "L1": -4.7976129334526645,
                    "L2": 0.011296113522133338,
                    "triple_var": -4.285797273548335
                },
                "z_mean_illusory": {
                    "SR": -0.48862234963596296,
                    "SR2": 0.4000311818465862,
                    "L1": -0.5522561017105887,
                    "L2": 0.2984990829141117,
                    "triple_var": -0.3700220430657432
                }
            },
            {
                "label": "window_3",
                "n_gaps": 1024,
                "one_sided_observables": [
                    "SR",
                    "L2",
                    "triple_var"
                ],
                "one_sided_count": 3,
                "endpoint_stable_observables": [],
                "stable_count_coherent": 3.0833333333333335,
                "stable_count_illusory": 0.5,
                "endpoint_distance": 2.8150302247605254,
                "ambiguous_beta": [],
                "state": "beta_absent_blank",
                "z_mean_coherent": {
                    "SR": -3.050852019107196,
                    "SR2": -0.4576896454860584,
                    "L1": -1.694331417967998,
                    "L2": -2.4359590408847596,
                    "triple_var": -2.521809787105671
                },
                "z_mean_illusory": {
                    "SR": -0.48405229788056703,
                    "SR2": -0.30247092018119265,
                    "L1": -0.24158246339200887,
                    "L2": -0.29332885681185,
                    "triple_var": -0.3977255543177198
                }
            },
            {
                "label": "window_4",
                "n_gaps": 1024,
                "one_sided_observables": [
                    "SR",
                    "L1",
                    "triple_var"
                ],
                "one_sided_count": 3,
                "endpoint_stable_observables": [],
                "stable_count_coherent": 3.0,
                "stable_count_illusory": 0.16666666666666666,
                "endpoint_distance": 3.1015939623797175,
                "ambiguous_beta": [],
                "state": "beta_absent_blank",
                "z_mean_coherent": {
                    "SR": -4.757306416016905,
                    "SR2": -1.466836192506314,
                    "L1": -2.8157407152437184,
                    "L2": -1.046797277659757,
                    "triple_var": -2.911099373240326
                },
                "z_mean_illusory": {
                    "SR": -0.02869860649961316,
                    "SR2": 0.1078144617796104,
                    "L1": -0.05872644402604488,
                    "L2": -0.30724901027974627,
                    "triple_var": -0.2511554386395865
                }
            }
        ],
        "random_matrix:cycle_7": [
            {
                "label": "full",
                "n_gaps": 4096,
                "one_sided_observables": [
                    "SR",
                    "SR2",
                    "L1",
                    "L2",
                    "triple_var"
                ],
                "one_sided_count": 5,
                "endpoint_stable_observables": [],

diff --git a/tools/exp_boundary_residual_beta_absent_audit.py b/tools/exp_boundary_residual_beta_absent_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b2b02258d429ae60f10356011447760e95f5cb8
--- /dev/null
+++ b/tools/exp_boundary_residual_beta_absent_audit.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+"""
+Targeted audit for the two medium/strong beta-absent BOUNDARY residues.
+
+This does not rebuild the global beta atlas. It tests only the two open rows
+from the 13-row taxonomy (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) with
+row-local windows and the same canonical observable gate used by the prior
+BOUNDARY reports.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from exp_boundary_short_denominator_extension import gue_spacing_blocks
+from exp_semireal_boundary_transfer_gate import row_spacings
+from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
+from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION
+
+
+TARGET_ROWS = ("numeri_primi:cycle_3", "random_matrix:cycle_7")
+OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
+
+
+def windowed(values: np.ndarray, size: int, count: int) -> list[np.ndarray]:
+    chunks = []
+    for idx in range(count):
+        start = idx * size
+        end = start + size
+        if end <= len(values):
+            chunks.append(normalize(values[start:end]))
+    return chunks
+
+
+def support_state(row: dict[str, Any], args: argparse.Namespace) -> str:
+    one_sided = len(row.get("coherent_one_sided_observables", []))
+    illusory = float(row.get("stable_count_illusory") or 0.0)
+    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
+    beta = row.get("ambiguous_beta_one_sided_gated", [])
+    transfers = (
+        one_sided >= args.min_one_sided
+        and illusory <= args.illusory_residue_max
+        and endpoint >= args.endpoint_distance_min
+    )
+    if not transfers:
+        return "support_falls"
+    if beta:
+        return "beta_chart_recovered"
+    return "beta_absent_blank"
+
+
+def obs_jaccard(left: list[str], right: list[str]) -> float:
+    a = set(left)
+    b = set(right)
+    if not a and not b:
+        return 1.0
+    return len(a & b) / len(a | b)
+
+
+def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
+    prime = row_spacings("numeri_primi")
+    prime = normalize(prime[: args.prime_gaps])
+
+    gue_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+    random_matrix = gue_spacing_blocks(args.random_matrix_gaps, args.gue_matrix_size, gue_rng)
+
+    return {
+        "numeri_primi:cycle_3": {
+            "base": prime,
+            "domain": "numeri_primi",
+            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
+            "source_n_gaps": int(len(prime)),
+        },
+        "random_matrix:cycle_7": {
+            "base": random_matrix,
+            "domain": "random_matrix",
+            "generator": "gue_spacing_blocks",
+            "source_n_gaps": int(len(random_matrix)),
+        },
+    }
+
+
+def analyze_case(name: str, label: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict[str, Any]:
+    perimeters = {f"{name}/{label}": analyze_sequence(f"{name}/{label}", base, args, rng)}
+    row = compact(perimeters)[f"{name}/{label}"]
+    return {
+        "label": label,
+        "n_gaps": row["n_gaps"],
+        "one_sided_observables": row["coherent_one_sided_observables"],
+        "one_sided_count": len(row["coherent_one_sided_observables"]),
+        "endpoint_stable_observables": row["endpoint_stable_observables"],
+        "stable_count_coherent": row["stable_count_coherent"],
+        "stable_count_illusory": row["stable_count_illusory"],
+        "endpoint_distance": row["endpoint_distance_one_sided_gated"],
+        "ambiguous_beta": [round(float(x), 1) for x in row["ambiguous_beta_one_sided_gated"]],
+        "state": support_state(row, args),
+        "z_mean_coherent": row["z_mean_coherent"],
+        "z_mean_illusory": row["z_mean_illusory"],
+    }
+
+
+def summarize_row(cases: list[dict[str, Any]]) -> dict[str, Any]:
+    window_cases = [case for case in cases if case["label"].startswith("window_")]
+    blank_windows = [case for case in window_cases if case["state"] == "beta_absent_blank"]
+    beta_windows = [case for case in window_cases if case["state"] == "beta_chart_recovered"]
+    fall_windows = [case for case in window_cases if case["state"] == "support_falls"]
+    obs_sets = [set(case["one_sided_observables"]) for case in window_cases if case["one_sided_observables"]]
+    common_obs = sorted(set.intersection(*obs_sets)) if obs_sets else []
+    union_obs = sorted(set.union(*obs_sets)) if obs_sets else []
+    return {
+        "window_count": len(window_cases),
+        "blank_windows": len(blank_windows),
+        "beta_recovered_windows": len(beta_windows),
+        "support_fall_windows": len(fall_windows),
+        "blank_window_rate": len(blank_windows) / len(window_cases) if window_cases else 0.0,
+        "common_one_sided_observables": common_obs,
+        "union_one_sided_observables": union_obs,
+        "endpoint_distance_mean": float(np.mean([case["endpoint_distance"] for case in window_cases])) if window_cases else 0.0,
+        "stable_count_coherent_mean": float(np.mean([case["stable_count_coherent"] for case in window_cases])) if window_cases else 0.0,
+    }
+
+
+def verdict(row_summaries: dict[str, dict[str, Any]], full_rows: dict[str, dict[str, Any]]) -> str:
+    both_persist = all(summary["blank_window_rate"] == 1.0 for summary in row_summaries.values())
+    any_beta = any(summary["beta_recovered_windows"] > 0 for summary in row_summaries.values())
+    any_fall = any(summary["support_fall_windows"] > 0 for summary in row_summaries.values())
+    jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    if any_beta or any_fall:
+        return "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE"
+    if both_persist and jaccard < 0.5:
+        return "TWO_DISTINCT_BETA_ABSENT_OPERATORS"
+    if both_persist:
+        return "SAME_BETA_ABSENT_OPERATOR"
+    return "RESIDUAL_AMBIGUOUS"
+
+
+def run(args: argparse.Namespace) -> dict[str, Any]:
+    rng = np.random.default_rng(args.seed)
+    specs = build_sequences(args, rng)
+    cases_by_row: dict[str, list[dict[str, Any]]] = {}
+    full_rows: dict[str, dict[str, Any]] = {}
+
+    for name, spec in specs.items():
+        row_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+        cases = [analyze_case(name, "full", spec["base"], args, row_rng)]
+        full_rows[name] = cases[0]
+        for idx, chunk in enumerate(windowed(spec["base"], args.window_gaps, args.window_count), start=1):
+            cases.append(analyze_case(name, f"window_{idx}", chunk, args, row_rng))
+        cases_by_row[name] = cases
+
+    row_summaries = {name: summarize_row(cases) for name, cases in cases_by_row.items()}
+    full_signature_jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    common_window_obs_jaccard = obs_jaccard(
+        row_summaries["numeri_primi:cycle_3"]["common_one_sided_observables"],
+        row_summaries["random_matrix:cycle_7"]["common_one_sided_observables"],
+    )
+
+    output = {
+        "experiment": "boundary_residual_beta_absent_audit",
+        "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
+        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
+        "observables_used": [
+            *OBS_NAMES,
+            "window_state",
+            "blank_window_rate",
+            "full_signature_jaccard",
+            "common_window_obs_jaccard",
+        ],
+        "params": vars(args),
+        "targets": TARGET_ROWS,
+        "observable_contract": {
+            "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
+            "observable": "window_state plus one-sided observable signature",
+            "operator": "canonical order/null gate on target rows only",
+            "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
+            "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
+            "not_tested": "global beta grid, V_c, source GUE/Poisson label validity",
+        },
+        "sequence_sources": {
+            name: {key: value for key, value in spec.items() if key != "base"}
+            for name, spec in specs.items()
+        },
+        "row_summaries": row_summaries,
+        "full_signature_jaccard": full_signature_jaccard,
+        "common_window_obs_jaccard": common_window_obs_jaccard,
+        "verdict": verdict(row_summaries, full_rows),
+        "cases": cases_by_row,
+    }
+
+    out = Path(args.out)
+    out.parent.mkdir(parents=True, exist_ok=True)
+    out.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
+
+    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
+    print(f"targets={TARGET_ROWS}")
+    for name, summary in row_summaries.items():
+        print(
+            f"{name} blank_windows={summary['blank_windows']}/{summary['window_count']} "
+            f"beta_recovered={summary['beta_recovered_windows']} falls={summary['support_fall_windows']} "
+            f"common_obs={summary['common_one_sided_observables']}"
+        )
+    print(f"full_signature_jaccard={full_signature_jaccard:.3f}")
+    print(f"common_window_obs_jaccard={common_window_obs_jaccard:.3f}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+    return output
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--prime-gaps", type=int, default=4096)
+    parser.add_argument("--random-matrix-gaps", type=int, default=4096)
+    parser.add_argument("--window-gaps", type=int, default=1024)
+    parser.add_argument("--window-count", type=int, default=4)
+    parser.add_argument("--gue-matrix-size", type=int, default=64)
+    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("--seed", type=int, default=202605100330)
+    parser.add_argument("--out", default="tools/data/boundary_residual_beta_absent_audit_20260510_0330.json")
+    args = parser.parse_args()
+    run(args)
+
+
+if __name__ == "__main__":
+    main()

exec
/bin/bash -lc "python - <<'PY'
import json
p='tools/data/boundary_residual_beta_absent_audit_20260510_0330.json'
d=json.load(open(p))
for row,cases in d['cases'].items():
 print('\\n',row)
 for c in cases:
  print(c['label'], c['n_gaps'], c['state'], c['one_sided_observables'], 'stable', round(c['stable_count_coherent'],3), 'illus', round(c['stable_count_illusory'],3), 'dist', round(c['endpoint_distance'],3), 'beta', c['ambiguous_beta'])
PY" in /opt/MM_D-ND
 succeeded in 0ms:

 numeri_primi:cycle_3
full 4096 beta_absent_blank ['SR', 'L1', 'triple_var'] stable 3.0 illus 0.167 dist 3.332 beta []
window_1 1024 beta_absent_blank ['SR'] stable 1.167 illus 0.417 dist 1.898 beta []
window_2 1024 beta_absent_blank ['SR', 'L1', 'triple_var'] stable 3.0 illus 0.417 dist 3.228 beta []
window_3 1024 beta_absent_blank ['SR', 'L2', 'triple_var'] stable 3.083 illus 0.5 dist 2.815 beta []
window_4 1024 beta_absent_blank ['SR', 'L1', 'triple_var'] stable 3.0 illus 0.167 dist 3.102 beta []

 random_matrix:cycle_7
full 4096 beta_absent_blank ['SR', 'SR2', 'L1', 'L2', 'triple_var'] stable 4.75 illus 0.167 dist 4.115 beta []
window_1 1024 beta_absent_blank ['SR2', 'L2', 'triple_var'] stable 3.583 illus 0.0 dist 3.279 beta []
window_2 1024 beta_absent_blank ['SR2', 'L2', 'triple_var'] stable 3.417 illus 0.167 dist 3.273 beta []
window_3 1024 beta_absent_blank ['L2'] stable 1.333 illus 0.417 dist 1.769 beta []
window_4 1024 beta_chart_recovered ['SR2', 'L1', 'L2', 'triple_var'] stable 4.0 illus 0.667 dist 3.628 beta [0.4]

diff --git a/tools/exp_boundary_residual_beta_absent_audit.py b/tools/exp_boundary_residual_beta_absent_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b2b02258d429ae60f10356011447760e95f5cb8
--- /dev/null
+++ b/tools/exp_boundary_residual_beta_absent_audit.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+"""
+Targeted audit for the two medium/strong beta-absent BOUNDARY residues.
+
+This does not rebuild the global beta atlas. It tests only the two open rows
+from the 13-row taxonomy (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) with
+row-local windows and the same canonical observable gate used by the prior
+BOUNDARY reports.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from exp_boundary_short_denominator_extension import gue_spacing_blocks
+from exp_semireal_boundary_transfer_gate import row_spacings
+from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
+from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION
+
+
+TARGET_ROWS = ("numeri_primi:cycle_3", "random_matrix:cycle_7")
+OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
+
+
+def windowed(values: np.ndarray, size: int, count: int) -> list[np.ndarray]:
+    chunks = []
+    for idx in range(count):
+        start = idx * size
+        end = start + size
+        if end <= len(values):
+            chunks.append(normalize(values[start:end]))
+    return chunks
+
+
+def support_state(row: dict[str, Any], args: argparse.Namespace) -> str:
+    one_sided = len(row.get("coherent_one_sided_observables", []))
+    illusory = float(row.get("stable_count_illusory") or 0.0)
+    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
+    beta = row.get("ambiguous_beta_one_sided_gated", [])
+    transfers = (
+        one_sided >= args.min_one_sided
+        and illusory <= args.illusory_residue_max
+        and endpoint >= args.endpoint_distance_min
+    )
+    if not transfers:
+        return "support_falls"
+    if beta:
+        return "beta_chart_recovered"
+    return "beta_absent_blank"
+
+
+def obs_jaccard(left: list[str], right: list[str]) -> float:
+    a = set(left)
+    b = set(right)
+    if not a and not b:
+        return 1.0
+    return len(a & b) / len(a | b)
+
+
+def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
+    prime = row_spacings("numeri_primi")
+    prime = normalize(prime[: args.prime_gaps])
+
+    gue_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+    random_matrix = gue_spacing_blocks(args.random_matrix_gaps, args.gue_matrix_size, gue_rng)
+
+    return {
+        "numeri_primi:cycle_3": {
+            "base": prime,
+            "domain": "numeri_primi",
+            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
+            "source_n_gaps": int(len(prime)),
+        },
+        "random_matrix:cycle_7": {
+            "base": random_matrix,
+            "domain": "random_matrix",
+            "generator": "gue_spacing_blocks",
+            "source_n_gaps": int(len(random_matrix)),
+        },
+    }
+
+
+def analyze_case(name: str, label: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict[str, Any]:
+    perimeters = {f"{name}/{label}": analyze_sequence(f"{name}/{label}", base, args, rng)}
+    row = compact(perimeters)[f"{name}/{label}"]
+    return {
+        "label": label,
+        "n_gaps": row["n_gaps"],
+        "one_sided_observables": row["coherent_one_sided_observables"],
+        "one_sided_count": len(row["coherent_one_sided_observables"]),
+        "endpoint_stable_observables": row["endpoint_stable_observables"],
+        "stable_count_coherent": row["stable_count_coherent"],
+        "stable_count_illusory": row["stable_count_illusory"],
+        "endpoint_distance": row["endpoint_distance_one_sided_gated"],
+        "ambiguous_beta": [round(float(x), 1) for x in row["ambiguous_beta_one_sided_gated"]],
+        "state": support_state(row, args),
+        "z_mean_coherent": row["z_mean_coherent"],
+        "z_mean_illusory": row["z_mean_illusory"],
+    }
+
+
+def summarize_row(cases: list[dict[str, Any]]) -> dict[str, Any]:
+    window_cases = [case for case in cases if case["label"].startswith("window_")]
+    blank_windows = [case for case in window_cases if case["state"] == "beta_absent_blank"]
+    beta_windows = [case for case in window_cases if case["state"] == "beta_chart_recovered"]
+    fall_windows = [case for case in window_cases if case["state"] == "support_falls"]
+    obs_sets = [set(case["one_sided_observables"]) for case in window_cases if case["one_sided_observables"]]
+    common_obs = sorted(set.intersection(*obs_sets)) if obs_sets else []
+    union_obs = sorted(set.union(*obs_sets)) if obs_sets else []
+    return {
+        "window_count": len(window_cases),
+        "blank_windows": len(blank_windows),
+        "beta_recovered_windows": len(beta_windows),
+        "support_fall_windows": len(fall_windows),
+        "blank_window_rate": len(blank_windows) / len(window_cases) if window_cases else 0.0,
+        "common_one_sided_observables": common_obs,
+        "union_one_sided_observables": union_obs,
+        "endpoint_distance_mean": float(np.mean([case["endpoint_distance"] for case in window_cases])) if window_cases else 0.0,
+        "stable_count_coherent_mean": float(np.mean([case["stable_count_coherent"] for case in window_cases])) if window_cases else 0.0,
+    }
+
+
+def verdict(row_summaries: dict[str, dict[str, Any]], full_rows: dict[str, dict[str, Any]]) -> str:
+    both_persist = all(summary["blank_window_rate"] == 1.0 for summary in row_summaries.values())
+    any_beta = any(summary["beta_recovered_windows"] > 0 for summary in row_summaries.values())
+    any_fall = any(summary["support_fall_windows"] > 0 for summary in row_summaries.values())
+    jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    if any_beta or any_fall:
+        return "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE"
+    if both_persist and jaccard < 0.5:
+        return "TWO_DISTINCT_BETA_ABSENT_OPERATORS"
+    if both_persist:
+        return "SAME_BETA_ABSENT_OPERATOR"
+    return "RESIDUAL_AMBIGUOUS"
+
+
+def run(args: argparse.Namespace) -> dict[str, Any]:
+    rng = np.random.default_rng(args.seed)
+    specs = build_sequences(args, rng)
+    cases_by_row: dict[str, list[dict[str, Any]]] = {}
+    full_rows: dict[str, dict[str, Any]] = {}
+
+    for name, spec in specs.items():
+        row_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+        cases = [analyze_case(name, "full", spec["base"], args, row_rng)]
+        full_rows[name] = cases[0]
+        for idx, chunk in enumerate(windowed(spec["base"], args.window_gaps, args.window_count), start=1):
+            cases.append(analyze_case(name, f"window_{idx}", chunk, args, row_rng))
+        cases_by_row[name] = cases
+
+    row_summaries = {name: summarize_row(cases) for name, cases in cases_by_row.items()}
+    full_signature_jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    common_window_obs_jaccard = obs_jaccard(
+        row_summaries["numeri_primi:cycle_3"]["common_one_sided_observables"],
+        row_summaries["random_matrix:cycle_7"]["common_one_sided_observables"],
+    )
+
+    output = {
+        "experiment": "boundary_residual_beta_absent_audit",
+        "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
+        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
+        "observables_used": [
+            *OBS_NAMES,
+            "window_state",
+            "blank_window_rate",
+            "full_signature_jaccard",
+            "common_window_obs_jaccard",
+        ],
+        "params": vars(args),
+        "targets": TARGET_ROWS,
+        "observable_contract": {
+            "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
+            "observable": "window_state plus one-sided observable signature",
+            "operator": "canonical order/null gate on target rows only",
+            "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
+            "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
+            "not_tested": "global beta grid, V_c, source GUE/Poisson label validity",
+        },
+        "sequence_sources": {
+            name: {key: value for key, value in spec.items() if key != "base"}
+            for name, spec in specs.items()
+        },
+        "row_summaries": row_summaries,
+        "full_signature_jaccard": full_signature_jaccard,
+        "common_window_obs_jaccard": common_window_obs_jaccard,
+        "verdict": verdict(row_summaries, full_rows),
+        "cases": cases_by_row,
+    }
+
+    out = Path(args.out)
+    out.parent.mkdir(parents=True, exist_ok=True)
+    out.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
+
+    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
+    print(f"targets={TARGET_ROWS}")
+    for name, summary in row_summaries.items():
+        print(
+            f"{name} blank_windows={summary['blank_windows']}/{summary['window_count']} "
+            f"beta_recovered={summary['beta_recovered_windows']} falls={summary['support_fall_windows']} "
+            f"common_obs={summary['common_one_sided_observables']}"
+        )
+    print(f"full_signature_jaccard={full_signature_jaccard:.3f}")
+    print(f"common_window_obs_jaccard={common_window_obs_jaccard:.3f}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+    return output
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--prime-gaps", type=int, default=4096)
+    parser.add_argument("--random-matrix-gaps", type=int, default=4096)
+    parser.add_argument("--window-gaps", type=int, default=1024)
+    parser.add_argument("--window-count", type=int, default=4)
+    parser.add_argument("--gue-matrix-size", type=int, default=64)
+    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("--seed", type=int, default=202605100330)
+    parser.add_argument("--out", default="tools/data/boundary_residual_beta_absent_audit_20260510_0330.json")
+    args = parser.parse_args()
+    run(args)
+
+
+if __name__ == "__main__":
+    main()

codex
Genero il report finale nel percorso richiesto. Lo terrò scoped: claim sul perimetro delle due righe residue e finestre da 1024, con `V_c`, griglia beta globale e label GUE/Poisson esplicitamente fuori test.
apply patch
patch: completed
/opt/MM_D-ND/tools/data/reports/agent_20260510_0330.md
diff --git a/tools/data/reports/agent_20260510_0330.md b/tools/data/reports/agent_20260510_0330.md
new file mode 100644
index 0000000000000000000000000000000000000000..cc01f0170fd72cca30c20faffc73245dcb3f4f72
--- /dev/null
+++ b/tools/data/reports/agent_20260510_0330.md
@@ -0,0 +1,98 @@
+# Agent Report - Boundary Residual Beta-Absent Audit
+**Date**: 2026-05-10 03:30  
+**Piano**: 114  
+**Tension explored**: BOUNDARY (0.8)  
+**verdict**: CONSTRAINT - il residuo beta-absent non e' una classe unica chiusa  
+observables_registry: 1.0.0-2026-05-06  
+observables_used: [SR, SR2, L1, L2, triple_var, window_state, blank_window_rate, full_signature_jaccard, common_window_obs_jaccard]  
+**observable_contract**: claim=le due righe residue beta-absent sono strutturali solo se `beta_absent_blank` persiste in finestre row-local da 1024 gap; observable=`window_state` + firma degli osservabili one-sided; operator=`exp_boundary_residual_beta_absent_audit.py`; generator=`numeri_primi` da `dnd_autoricerca.genera_segnale` e `random_matrix` da `gue_spacing_blocks`; denominator=2 righe aperte BOUNDARY, full row + 4 finestre row-local da 1024 gap; non_possible=classe residua unica se una riga recupera beta o perde supporto nelle finestre row-local; not_tested=griglia beta globale, fit `V_c`, validita' label sorgente GUE/Poisson.
+
+## Respiro fuori-tempo
+
+- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + residui `numeri_primi:cycle_3` / `random_matrix:cycle_7`.
+- **Dipolo / punto-zero**: blank strutturale / blank da atlante. Punto-zero: la stessa misura row-local da 1024 gap che decide se la beta manca per struttura o riappare per scelta di finestra.
+- **Piano superiore**: topologia assiomatica del bordo: la classe globale cade se una carta locale riapre la coordinata beta.
+- **Operatori laterali scelti**: boundary operator, chart locale, filtrazione. Il boundary operator separa supporto e beta; la chart locale testa la finestra senza rifare il mondo; la filtrazione conserva il denominatore row-aligned.
+- **Contaminazione cognitiva**: CE-0019 usato come contratto combo prima della misura; CE-0022 usato come boundary operator + chart locale; KSAR usato come reiterazione sul deposito 15:32-18:39 senza ridisegnare il perimetro.
+- **Proto-ipotesi**: il residuo medio/forte beta-absent e' una classe unica solo se entrambi i target restano blank in tutte le finestre row-local e conservano una firma osservabile compatibile.
+- **Proiezione**: applico il gate canonico ordine/null alle sole due righe residue, poi confronto persistenza del blank e Jaccard delle firme one-sided.
+
+## Aderenza alla direzione
+
+- `relation`: follows_direction
+- `why`: attacca direttamente i due residui beta-absent medio/forti lasciati dal valutatore dopo `thin_persist_rows=0/13`.
+- `not_drift`: non usa `V_c`, non usa label GUE/Poisson come campo decisionale, non rigenera la griglia beta globale.
+
+## Claim Under Test
+
+> I due residui `numeri_primi:cycle_3` e `random_matrix:cycle_7` formano una classe unica `medium/strong beta-absent` se il blank persiste in tutte le finestre row-local da 1024 gap e le firme one-sided restano compatibili.
+
+## Question
+
+I due blank residui sono lo stesso operatore di confine, due classi distinte, o un artefatto da denominatore/atlante?
+
+## Experiment Design
+
+- Perimetro atomico: `numeri_primi:cycle_3`, `random_matrix:cycle_7`.
+- Scope: full row + 4 finestre consecutive da 1024 gap per ciascun target.
+- Parametri: `n_replicates=12`, `n_beta=11`, `n_baseline=24`, `z_min=2.0`, seed `202605100330`.
+- Null baseline: permutazione marginal-preserving usata dal gate canonico gia' adottato nei report BOUNDARY.
+- Non misurato: `gap_ratio`, `V_c`, nuova griglia beta globale, validita' delle label sorgente GUE/Poisson.
+- Criterio di caduta: una riga recupera beta o perde supporto in una finestra row-local; in quel caso il residuo non e' classe unica chiusa.
+
+## Results
+
+| row | full state | full one-sided | window blanks | beta recovered | support falls | common window obs | mean endpoint | mean stable coherent |
+|---|---:|---|---:|---:|---:|---|---:|---:|
+| numeri_primi:cycle_3 | beta_absent_blank | SR,L1,triple_var | 4/4 | 0 | 0 | SR | 2.761 | 2.563 |
+| random_matrix:cycle_7 | beta_absent_blank | SR,SR2,L1,L2,triple_var | 3/4 | 1 | 0 | L2 | 2.987 | 3.083 |
+
+| comparison | value |
+|---|---:|
+| full_signature_jaccard | 0.600 |
+| common_window_obs_jaccard | 0.000 |
+| random_matrix recovered beta | window_4 -> beta [0.4] |
+
+## Key Findings
+
+1. **Verificato: `numeri_primi:cycle_3` resta beta-absent in 4/4 finestre.** Il supporto non cade; l'osservabile comune di finestra e' `SR`.
+2. **Verificato: `random_matrix:cycle_7` non resta beta-absent in 4/4 finestre.** La quarta finestra recupera beta `[0.4]` con supporto vivo (`SR2,L1,L2,triple_var`).
+3. **Verificato: le firme comuni di finestra divergono.** `common_window_obs_jaccard=0.000`: primi conserva `SR`, random matrix conserva `L2`.
+4. **Inferito dal perimetro dichiarato: il residuo beta-absent non e' una classe unica chiusa.** Una parte e' blank persistente row-local, una parte e' chart-sensitive.
+
+## Verdict
+
+**CONSTRAINT**.
+
+Nel perimetro delle due righe residue e finestre da 1024 gap, `medium/strong beta-absent` si scinde:
+
+`numeri_primi:cycle_3` = blank persistente row-local.  
+`random_matrix:cycle_7` = blank forte ma chart-sensitive, con beta `[0.4]` recuperata in 1/4 finestre.
+
+Formula valida:
+
+`beta_absent_residue` non matura come classe unica; diventa un audit a due stati: `prime_persistent_blank` / `random_matrix_chart_sensitive_blank`.
+
+## Bicono della scoperta
+
+- **Due radici**: blank persistente / blank chart-sensitive.
+- **Singolare**: supporto ordine/null vivo senza coordinata beta globale.
+- **Invariante di passaggio**: il supporto non cade in nessuna delle 8 finestre; cio' che cambia e' la coordinata beta e la firma osservabile.
+- **Campo di possibilità**: possibile = chiudere la tassonomia BOUNDARY con due sotto-stati residui; non-possibile = promuovere `medium/strong beta-absent` come specie unica del confine.
+
+## Consecutio
+
+Il prossimo ciclo non deve riaprire il thin blank. Deve sigillare il nuovo audit a due stati:
+
+- `prime_persistent_blank`: testare se `SR` resta l'osservabile comune sotto seed/window shift.
+- `random_matrix_chart_sensitive_blank`: testare se beta `[0.4]` e' coordinata locale stabile o evento di una singola finestra.
+
+## Ricadute pratiche
+
+ssp_value: yes. Lo script e' uno strumento riusabile per audit row-local di residui BOUNDARY senza rigenerare fit globali.
+
+## Files
+
+- Script: `tools/exp_boundary_residual_beta_absent_audit.py`
+- Data: `tools/data/boundary_residual_beta_absent_audit_20260510_0330.json`
+- Report: `tools/data/reports/agent_20260510_0330.md`
diff --git a/tools/exp_boundary_residual_beta_absent_audit.py b/tools/exp_boundary_residual_beta_absent_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b2b02258d429ae60f10356011447760e95f5cb8
--- /dev/null
+++ b/tools/exp_boundary_residual_beta_absent_audit.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+"""
+Targeted audit for the two medium/strong beta-absent BOUNDARY residues.
+
+This does not rebuild the global beta atlas. It tests only the two open rows
+from the 13-row taxonomy (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) with
+row-local windows and the same canonical observable gate used by the prior
+BOUNDARY reports.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from exp_boundary_short_denominator_extension import gue_spacing_blocks
+from exp_semireal_boundary_transfer_gate import row_spacings
+from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
+from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION
+
+
+TARGET_ROWS = ("numeri_primi:cycle_3", "random_matrix:cycle_7")
+OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
+
+
+def windowed(values: np.ndarray, size: int, count: int) -> list[np.ndarray]:
+    chunks = []
+    for idx in range(count):
+        start = idx * size
+        end = start + size
+        if end <= len(values):
+            chunks.append(normalize(values[start:end]))
+    return chunks
+
+
+def support_state(row: dict[str, Any], args: argparse.Namespace) -> str:
+    one_sided = len(row.get("coherent_one_sided_observables", []))
+    illusory = float(row.get("stable_count_illusory") or 0.0)
+    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
+    beta = row.get("ambiguous_beta_one_sided_gated", [])
+    transfers = (
+        one_sided >= args.min_one_sided
+        and illusory <= args.illusory_residue_max
+        and endpoint >= args.endpoint_distance_min
+    )
+    if not transfers:
+        return "support_falls"
+    if beta:
+        return "beta_chart_recovered"
+    return "beta_absent_blank"
+
+
+def obs_jaccard(left: list[str], right: list[str]) -> float:
+    a = set(left)
+    b = set(right)
+    if not a and not b:
+        return 1.0
+    return len(a & b) / len(a | b)
+
+
+def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
+    prime = row_spacings("numeri_primi")
+    prime = normalize(prime[: args.prime_gaps])
+
+    gue_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+    random_matrix = gue_spacing_blocks(args.random_matrix_gaps, args.gue_matrix_size, gue_rng)
+
+    return {
+        "numeri_primi:cycle_3": {
+            "base": prime,
+            "domain": "numeri_primi",
+            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
+            "source_n_gaps": int(len(prime)),
+        },
+        "random_matrix:cycle_7": {
+            "base": random_matrix,
+            "domain": "random_matrix",
+            "generator": "gue_spacing_blocks",
+            "source_n_gaps": int(len(random_matrix)),
+        },
+    }
+
+
+def analyze_case(name: str, label: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict[str, Any]:
+    perimeters = {f"{name}/{label}": analyze_sequence(f"{name}/{label}", base, args, rng)}
+    row = compact(perimeters)[f"{name}/{label}"]
+    return {
+        "label": label,
+        "n_gaps": row["n_gaps"],
+        "one_sided_observables": row["coherent_one_sided_observables"],
+        "one_sided_count": len(row["coherent_one_sided_observables"]),
+        "endpoint_stable_observables": row["endpoint_stable_observables"],
+        "stable_count_coherent": row["stable_count_coherent"],
+        "stable_count_illusory": row["stable_count_illusory"],
+        "endpoint_distance": row["endpoint_distance_one_sided_gated"],
+        "ambiguous_beta": [round(float(x), 1) for x in row["ambiguous_beta_one_sided_gated"]],
+        "state": support_state(row, args),
+        "z_mean_coherent": row["z_mean_coherent"],
+        "z_mean_illusory": row["z_mean_illusory"],
+    }
+
+
+def summarize_row(cases: list[dict[str, Any]]) -> dict[str, Any]:
+    window_cases = [case for case in cases if case["label"].startswith("window_")]
+    blank_windows = [case for case in window_cases if case["state"] == "beta_absent_blank"]
+    beta_windows = [case for case in window_cases if case["state"] == "beta_chart_recovered"]
+    fall_windows = [case for case in window_cases if case["state"] == "support_falls"]
+    obs_sets = [set(case["one_sided_observables"]) for case in window_cases if case["one_sided_observables"]]
+    common_obs = sorted(set.intersection(*obs_sets)) if obs_sets else []
+    union_obs = sorted(set.union(*obs_sets)) if obs_sets else []
+    return {
+        "window_count": len(window_cases),
+        "blank_windows": len(blank_windows),
+        "beta_recovered_windows": len(beta_windows),
+        "support_fall_windows": len(fall_windows),
+        "blank_window_rate": len(blank_windows) / len(window_cases) if window_cases else 0.0,
+        "common_one_sided_observables": common_obs,
+        "union_one_sided_observables": union_obs,
+        "endpoint_distance_mean": float(np.mean([case["endpoint_distance"] for case in window_cases])) if window_cases else 0.0,
+        "stable_count_coherent_mean": float(np.mean([case["stable_count_coherent"] for case in window_cases])) if window_cases else 0.0,
+    }
+
+
+def verdict(row_summaries: dict[str, dict[str, Any]], full_rows: dict[str, dict[str, Any]]) -> str:
+    both_persist = all(summary["blank_window_rate"] == 1.0 for summary in row_summaries.values())
+    any_beta = any(summary["beta_recovered_windows"] > 0 for summary in row_summaries.values())
+    any_fall = any(summary["support_fall_windows"] > 0 for summary in row_summaries.values())
+    jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    if any_beta or any_fall:
+        return "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE"
+    if both_persist and jaccard < 0.5:
+        return "TWO_DISTINCT_BETA_ABSENT_OPERATORS"
+    if both_persist:
+        return "SAME_BETA_ABSENT_OPERATOR"
+    return "RESIDUAL_AMBIGUOUS"
+
+
+def run(args: argparse.Namespace) -> dict[str, Any]:
+    rng = np.random.default_rng(args.seed)
+    specs = build_sequences(args, rng)
+    cases_by_row: dict[str, list[dict[str, Any]]] = {}
+    full_rows: dict[str, dict[str, Any]] = {}
+
+    for name, spec in specs.items():
+        row_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+        cases = [analyze_case(name, "full", spec["base"], args, row_rng)]
+        full_rows[name] = cases[0]
+        for idx, chunk in enumerate(windowed(spec["base"], args.window_gaps, args.window_count), start=1):
+            cases.append(analyze_case(name, f"window_{idx}", chunk, args, row_rng))
+        cases_by_row[name] = cases
+
+    row_summaries = {name: summarize_row(cases) for name, cases in cases_by_row.items()}
+    full_signature_jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    common_window_obs_jaccard = obs_jaccard(
+        row_summaries["numeri_primi:cycle_3"]["common_one_sided_observables"],
+        row_summaries["random_matrix:cycle_7"]["common_one_sided_observables"],
+    )
+
+    output = {
+        "experiment": "boundary_residual_beta_absent_audit",
+        "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
+        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
+        "observables_used": [
+            *OBS_NAMES,
+            "window_state",
+            "blank_window_rate",
+            "full_signature_jaccard",
+            "common_window_obs_jaccard",
+        ],
+        "params": vars(args),
+        "targets": TARGET_ROWS,
+        "observable_contract": {
+            "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
+            "observable": "window_state plus one-sided observable signature",
+            "operator": "canonical order/null gate on target rows only",
+            "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
+            "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
+            "not_tested": "global beta grid, V_c, source GUE/Poisson label validity",
+        },
+        "sequence_sources": {
+            name: {key: value for key, value in spec.items() if key != "base"}
+            for name, spec in specs.items()
+        },
+        "row_summaries": row_summaries,
+        "full_signature_jaccard": full_signature_jaccard,
+        "common_window_obs_jaccard": common_window_obs_jaccard,
+        "verdict": verdict(row_summaries, full_rows),
+        "cases": cases_by_row,
+    }
+
+    out = Path(args.out)
+    out.parent.mkdir(parents=True, exist_ok=True)
+    out.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
+
+    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
+    print(f"targets={TARGET_ROWS}")
+    for name, summary in row_summaries.items():
+        print(
+            f"{name} blank_windows={summary['blank_windows']}/{summary['window_count']} "
+            f"beta_recovered={summary['beta_recovered_windows']} falls={summary['support_fall_windows']} "
+            f"common_obs={summary['common_one_sided_observables']}"
+        )
+    print(f"full_signature_jaccard={full_signature_jaccard:.3f}")
+    print(f"common_window_obs_jaccard={common_window_obs_jaccard:.3f}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+    return output
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--prime-gaps", type=int, default=4096)
+    parser.add_argument("--random-matrix-gaps", type=int, default=4096)
+    parser.add_argument("--window-gaps", type=int, default=1024)
+    parser.add_argument("--window-count", type=int, default=4)
+    parser.add_argument("--gue-matrix-size", type=int, default=64)
+    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("--seed", type=int, default=202605100330)
+    parser.add_argument("--out", default="tools/data/boundary_residual_beta_absent_audit_20260510_0330.json")
+    args = parser.parse_args()
+    run(args)
+
+
+if __name__ == "__main__":
+    main()

diff --git a/tools/data/reports/agent_20260510_0330.md b/tools/data/reports/agent_20260510_0330.md
new file mode 100644
index 0000000000000000000000000000000000000000..cc01f0170fd72cca30c20faffc73245dcb3f4f72
--- /dev/null
+++ b/tools/data/reports/agent_20260510_0330.md
@@ -0,0 +1,98 @@
+# Agent Report - Boundary Residual Beta-Absent Audit
+**Date**: 2026-05-10 03:30  
+**Piano**: 114  
+**Tension explored**: BOUNDARY (0.8)  
+**verdict**: CONSTRAINT - il residuo beta-absent non e' una classe unica chiusa  
+observables_registry: 1.0.0-2026-05-06  
+observables_used: [SR, SR2, L1, L2, triple_var, window_state, blank_window_rate, full_signature_jaccard, common_window_obs_jaccard]  
+**observable_contract**: claim=le due righe residue beta-absent sono strutturali solo se `beta_absent_blank` persiste in finestre row-local da 1024 gap; observable=`window_state` + firma degli osservabili one-sided; operator=`exp_boundary_residual_beta_absent_audit.py`; generator=`numeri_primi` da `dnd_autoricerca.genera_segnale` e `random_matrix` da `gue_spacing_blocks`; denominator=2 righe aperte BOUNDARY, full row + 4 finestre row-local da 1024 gap; non_possible=classe residua unica se una riga recupera beta o perde supporto nelle finestre row-local; not_tested=griglia beta globale, fit `V_c`, validita' label sorgente GUE/Poisson.
+
+## Respiro fuori-tempo
+
+- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + residui `numeri_primi:cycle_3` / `random_matrix:cycle_7`.
+- **Dipolo / punto-zero**: blank strutturale / blank da atlante. Punto-zero: la stessa misura row-local da 1024 gap che decide se la beta manca per struttura o riappare per scelta di finestra.
+- **Piano superiore**: topologia assiomatica del bordo: la classe globale cade se una carta locale riapre la coordinata beta.
+- **Operatori laterali scelti**: boundary operator, chart locale, filtrazione. Il boundary operator separa supporto e beta; la chart locale testa la finestra senza rifare il mondo; la filtrazione conserva il denominatore row-aligned.
+- **Contaminazione cognitiva**: CE-0019 usato come contratto combo prima della misura; CE-0022 usato come boundary operator + chart locale; KSAR usato come reiterazione sul deposito 15:32-18:39 senza ridisegnare il perimetro.
+- **Proto-ipotesi**: il residuo medio/forte beta-absent e' una classe unica solo se entrambi i target restano blank in tutte le finestre row-local e conservano una firma osservabile compatibile.
+- **Proiezione**: applico il gate canonico ordine/null alle sole due righe residue, poi confronto persistenza del blank e Jaccard delle firme one-sided.
+
+## Aderenza alla direzione
+
+- `relation`: follows_direction
+- `why`: attacca direttamente i due residui beta-absent medio/forti lasciati dal valutatore dopo `thin_persist_rows=0/13`.
+- `not_drift`: non usa `V_c`, non usa label GUE/Poisson come campo decisionale, non rigenera la griglia beta globale.
+
+## Claim Under Test
+
+> I due residui `numeri_primi:cycle_3` e `random_matrix:cycle_7` formano una classe unica `medium/strong beta-absent` se il blank persiste in tutte le finestre row-local da 1024 gap e le firme one-sided restano compatibili.
+
+## Question
+
+I due blank residui sono lo stesso operatore di confine, due classi distinte, o un artefatto da denominatore/atlante?
+
+## Experiment Design
+
+- Perimetro atomico: `numeri_primi:cycle_3`, `random_matrix:cycle_7`.
+- Scope: full row + 4 finestre consecutive da 1024 gap per ciascun target.
+- Parametri: `n_replicates=12`, `n_beta=11`, `n_baseline=24`, `z_min=2.0`, seed `202605100330`.
+- Null baseline: permutazione marginal-preserving usata dal gate canonico gia' adottato nei report BOUNDARY.
+- Non misurato: `gap_ratio`, `V_c`, nuova griglia beta globale, validita' delle label sorgente GUE/Poisson.
+- Criterio di caduta: una riga recupera beta o perde supporto in una finestra row-local; in quel caso il residuo non e' classe unica chiusa.
+
+## Results
+
+| row | full state | full one-sided | window blanks | beta recovered | support falls | common window obs | mean endpoint | mean stable coherent |
+|---|---:|---|---:|---:|---:|---|---:|---:|
+| numeri_primi:cycle_3 | beta_absent_blank | SR,L1,triple_var | 4/4 | 0 | 0 | SR | 2.761 | 2.563 |
+| random_matrix:cycle_7 | beta_absent_blank | SR,SR2,L1,L2,triple_var | 3/4 | 1 | 0 | L2 | 2.987 | 3.083 |
+
+| comparison | value |
+|---|---:|
+| full_signature_jaccard | 0.600 |
+| common_window_obs_jaccard | 0.000 |
+| random_matrix recovered beta | window_4 -> beta [0.4] |
+
+## Key Findings
+
+1. **Verificato: `numeri_primi:cycle_3` resta beta-absent in 4/4 finestre.** Il supporto non cade; l'osservabile comune di finestra e' `SR`.
+2. **Verificato: `random_matrix:cycle_7` non resta beta-absent in 4/4 finestre.** La quarta finestra recupera beta `[0.4]` con supporto vivo (`SR2,L1,L2,triple_var`).
+3. **Verificato: le firme comuni di finestra divergono.** `common_window_obs_jaccard=0.000`: primi conserva `SR`, random matrix conserva `L2`.
+4. **Inferito dal perimetro dichiarato: il residuo beta-absent non e' una classe unica chiusa.** Una parte e' blank persistente row-local, una parte e' chart-sensitive.
+
+## Verdict
+
+**CONSTRAINT**.
+
+Nel perimetro delle due righe residue e finestre da 1024 gap, `medium/strong beta-absent` si scinde:
+
+`numeri_primi:cycle_3` = blank persistente row-local.  
+`random_matrix:cycle_7` = blank forte ma chart-sensitive, con beta `[0.4]` recuperata in 1/4 finestre.
+
+Formula valida:
+
+`beta_absent_residue` non matura come classe unica; diventa un audit a due stati: `prime_persistent_blank` / `random_matrix_chart_sensitive_blank`.
+
+## Bicono della scoperta
+
+- **Due radici**: blank persistente / blank chart-sensitive.
+- **Singolare**: supporto ordine/null vivo senza coordinata beta globale.
+- **Invariante di passaggio**: il supporto non cade in nessuna delle 8 finestre; cio' che cambia e' la coordinata beta e la firma osservabile.
+- **Campo di possibilità**: possibile = chiudere la tassonomia BOUNDARY con due sotto-stati residui; non-possibile = promuovere `medium/strong beta-absent` come specie unica del confine.
+
+## Consecutio
+
+Il prossimo ciclo non deve riaprire il thin blank. Deve sigillare il nuovo audit a due stati:
+
+- `prime_persistent_blank`: testare se `SR` resta l'osservabile comune sotto seed/window shift.
+- `random_matrix_chart_sensitive_blank`: testare se beta `[0.4]` e' coordinata locale stabile o evento di una singola finestra.
+
+## Ricadute pratiche
+
+ssp_value: yes. Lo script e' uno strumento riusabile per audit row-local di residui BOUNDARY senza rigenerare fit globali.
+
+## Files
+
+- Script: `tools/exp_boundary_residual_beta_absent_audit.py`
+- Data: `tools/data/boundary_residual_beta_absent_audit_20260510_0330.json`
+- Report: `tools/data/reports/agent_20260510_0330.md`
diff --git a/tools/exp_boundary_residual_beta_absent_audit.py b/tools/exp_boundary_residual_beta_absent_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b2b02258d429ae60f10356011447760e95f5cb8
--- /dev/null
+++ b/tools/exp_boundary_residual_beta_absent_audit.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+"""
+Targeted audit for the two medium/strong beta-absent BOUNDARY residues.
+
+This does not rebuild the global beta atlas. It tests only the two open rows
+from the 13-row taxonomy (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) with
+row-local windows and the same canonical observable gate used by the prior
+BOUNDARY reports.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from exp_boundary_short_denominator_extension import gue_spacing_blocks
+from exp_semireal_boundary_transfer_gate import row_spacings
+from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
+from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION
+
+
+TARGET_ROWS = ("numeri_primi:cycle_3", "random_matrix:cycle_7")
+OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
+
+
+def windowed(values: np.ndarray, size: int, count: int) -> list[np.ndarray]:
+    chunks = []
+    for idx in range(count):
+        start = idx * size
+        end = start + size
+        if end <= len(values):
+            chunks.append(normalize(values[start:end]))
+    return chunks
+
+
+def support_state(row: dict[str, Any], args: argparse.Namespace) -> str:
+    one_sided = len(row.get("coherent_one_sided_observables", []))
+    illusory = float(row.get("stable_count_illusory") or 0.0)
+    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
+    beta = row.get("ambiguous_beta_one_sided_gated", [])
+    transfers = (
+        one_sided >= args.min_one_sided
+        and illusory <= args.illusory_residue_max
+        and endpoint >= args.endpoint_distance_min
+    )
+    if not transfers:
+        return "support_falls"
+    if beta:
+        return "beta_chart_recovered"
+    return "beta_absent_blank"
+
+
+def obs_jaccard(left: list[str], right: list[str]) -> float:
+    a = set(left)
+    b = set(right)
+    if not a and not b:
+        return 1.0
+    return len(a & b) / len(a | b)
+
+
+def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
+    prime = row_spacings("numeri_primi")
+    prime = normalize(prime[: args.prime_gaps])
+
+    gue_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+    random_matrix = gue_spacing_blocks(args.random_matrix_gaps, args.gue_matrix_size, gue_rng)
+
+    return {
+        "numeri_primi:cycle_3": {
+            "base": prime,
+            "domain": "numeri_primi",
+            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
+            "source_n_gaps": int(len(prime)),
+        },
+        "random_matrix:cycle_7": {
+            "base": random_matrix,
+            "domain": "random_matrix",
+            "generator": "gue_spacing_blocks",
+            "source_n_gaps": int(len(random_matrix)),
+        },
+    }
+
+
+def analyze_case(name: str, label: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict[str, Any]:
+    perimeters = {f"{name}/{label}": analyze_sequence(f"{name}/{label}", base, args, rng)}
+    row = compact(perimeters)[f"{name}/{label}"]
+    return {
+        "label": label,
+        "n_gaps": row["n_gaps"],
+        "one_sided_observables": row["coherent_one_sided_observables"],
+        "one_sided_count": len(row["coherent_one_sided_observables"]),
+        "endpoint_stable_observables": row["endpoint_stable_observables"],
+        "stable_count_coherent": row["stable_count_coherent"],
+        "stable_count_illusory": row["stable_count_illusory"],
+        "endpoint_distance": row["endpoint_distance_one_sided_gated"],
+        "ambiguous_beta": [round(float(x), 1) for x in row["ambiguous_beta_one_sided_gated"]],
+        "state": support_state(row, args),
+        "z_mean_coherent": row["z_mean_coherent"],
+        "z_mean_illusory": row["z_mean_illusory"],
+    }
+
+
+def summarize_row(cases: list[dict[str, Any]]) -> dict[str, Any]:
+    window_cases = [case for case in cases if case["label"].startswith("window_")]
+    blank_windows = [case for case in window_cases if case["state"] == "beta_absent_blank"]
+    beta_windows = [case for case in window_cases if case["state"] == "beta_chart_recovered"]
+    fall_windows = [case for case in window_cases if case["state"] == "support_falls"]
+    obs_sets = [set(case["one_sided_observables"]) for case in window_cases if case["one_sided_observables"]]
+    common_obs = sorted(set.intersection(*obs_sets)) if obs_sets else []
+    union_obs = sorted(set.union(*obs_sets)) if obs_sets else []
+    return {
+        "window_count": len(window_cases),
+        "blank_windows": len(blank_windows),
+        "beta_recovered_windows": len(beta_windows),
+        "support_fall_windows": len(fall_windows),
+        "blank_window_rate": len(blank_windows) / len(window_cases) if window_cases else 0.0,
+        "common_one_sided_observables": common_obs,
+        "union_one_sided_observables": union_obs,
+        "endpoint_distance_mean": float(np.mean([case["endpoint_distance"] for case in window_cases])) if window_cases else 0.0,
+        "stable_count_coherent_mean": float(np.mean([case["stable_count_coherent"] for case in window_cases])) if window_cases else 0.0,
+    }
+
+
+def verdict(row_summaries: dict[str, dict[str, Any]], full_rows: dict[str, dict[str, Any]]) -> str:
+    both_persist = all(summary["blank_window_rate"] == 1.0 for summary in row_summaries.values())
+    any_beta = any(summary["beta_recovered_windows"] > 0 for summary in row_summaries.values())
+    any_fall = any(summary["support_fall_windows"] > 0 for summary in row_summaries.values())
+    jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    if any_beta or any_fall:
+        return "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE"
+    if both_persist and jaccard < 0.5:
+        return "TWO_DISTINCT_BETA_ABSENT_OPERATORS"
+    if both_persist:
+        return "SAME_BETA_ABSENT_OPERATOR"
+    return "RESIDUAL_AMBIGUOUS"
+
+
+def run(args: argparse.Namespace) -> dict[str, Any]:
+    rng = np.random.default_rng(args.seed)
+    specs = build_sequences(args, rng)
+    cases_by_row: dict[str, list[dict[str, Any]]] = {}
+    full_rows: dict[str, dict[str, Any]] = {}
+
+    for name, spec in specs.items():
+        row_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+        cases = [analyze_case(name, "full", spec["base"], args, row_rng)]
+        full_rows[name] = cases[0]
+        for idx, chunk in enumerate(windowed(spec["base"], args.window_gaps, args.window_count), start=1):
+            cases.append(analyze_case(name, f"window_{idx}", chunk, args, row_rng))
+        cases_by_row[name] = cases
+
+    row_summaries = {name: summarize_row(cases) for name, cases in cases_by_row.items()}
+    full_signature_jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    common_window_obs_jaccard = obs_jaccard(
+        row_summaries["numeri_primi:cycle_3"]["common_one_sided_observables"],
+        row_summaries["random_matrix:cycle_7"]["common_one_sided_observables"],
+    )
+
+    output = {
+        "experiment": "boundary_residual_beta_absent_audit",
+        "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
+        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
+        "observables_used": [
+            *OBS_NAMES,
+            "window_state",
+            "blank_window_rate",
+            "full_signature_jaccard",
+            "common_window_obs_jaccard",
+        ],
+        "params": vars(args),
+        "targets": TARGET_ROWS,
+        "observable_contract": {
+            "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
+            "observable": "window_state plus one-sided observable signature",
+            "operator": "canonical order/null gate on target rows only",
+            "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
+            "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
+            "not_tested": "global beta grid, V_c, source GUE/Poisson label validity",
+        },
+        "sequence_sources": {
+            name: {key: value for key, value in spec.items() if key != "base"}
+            for name, spec in specs.items()
+        },
+        "row_summaries": row_summaries,
+        "full_signature_jaccard": full_signature_jaccard,
+        "common_window_obs_jaccard": common_window_obs_jaccard,
+        "verdict": verdict(row_summaries, full_rows),
+        "cases": cases_by_row,
+    }
+
+    out = Path(args.out)
+    out.parent.mkdir(parents=True, exist_ok=True)
+    out.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
+
+    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
+    print(f"targets={TARGET_ROWS}")
+    for name, summary in row_summaries.items():
+        print(
+            f"{name} blank_windows={summary['blank_windows']}/{summary['window_count']} "
+            f"beta_recovered={summary['beta_recovered_windows']} falls={summary['support_fall_windows']} "
+            f"common_obs={summary['common_one_sided_observables']}"
+        )
+    print(f"full_signature_jaccard={full_signature_jaccard:.3f}")
+    print(f"common_window_obs_jaccard={common_window_obs_jaccard:.3f}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+    return output
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--prime-gaps", type=int, default=4096)
+    parser.add_argument("--random-matrix-gaps", type=int, default=4096)
+    parser.add_argument("--window-gaps", type=int, default=1024)
+    parser.add_argument("--window-count", type=int, default=4)
+    parser.add_argument("--gue-matrix-size", type=int, default=64)
+    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("--seed", type=int, default=202605100330)
+    parser.add_argument("--out", default="tools/data/boundary_residual_beta_absent_audit_20260510_0330.json")
+    args = parser.parse_args()
+    run(args)
+
+
+if __name__ == "__main__":
+    main()

codex
Report scritto. Faccio una verifica leggera: compilazione Python dello script, rilettura del report e aggiornamento del puntatore `latest.md` al nuovo ciclo.
exec
/bin/bash -lc "sed -n '1,240p' tools/data/reports/agent_20260510_0330.md" in /opt/MM_D-ND
 succeeded in 0ms:
# Agent Report - Boundary Residual Beta-Absent Audit
**Date**: 2026-05-10 03:30  
**Piano**: 114  
**Tension explored**: BOUNDARY (0.8)  
**verdict**: CONSTRAINT - il residuo beta-absent non e' una classe unica chiusa  
observables_registry: 1.0.0-2026-05-06  
observables_used: [SR, SR2, L1, L2, triple_var, window_state, blank_window_rate, full_signature_jaccard, common_window_obs_jaccard]  
**observable_contract**: claim=le due righe residue beta-absent sono strutturali solo se `beta_absent_blank` persiste in finestre row-local da 1024 gap; observable=`window_state` + firma degli osservabili one-sided; operator=`exp_boundary_residual_beta_absent_audit.py`; generator=`numeri_primi` da `dnd_autoricerca.genera_segnale` e `random_matrix` da `gue_spacing_blocks`; denominator=2 righe aperte BOUNDARY, full row + 4 finestre row-local da 1024 gap; non_possible=classe residua unica se una riga recupera beta o perde supporto nelle finestre row-local; not_tested=griglia beta globale, fit `V_c`, validita' label sorgente GUE/Poisson.

## Respiro fuori-tempo

- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + residui `numeri_primi:cycle_3` / `random_matrix:cycle_7`.
- **Dipolo / punto-zero**: blank strutturale / blank da atlante. Punto-zero: la stessa misura row-local da 1024 gap che decide se la beta manca per struttura o riappare per scelta di finestra.
- **Piano superiore**: topologia assiomatica del bordo: la classe globale cade se una carta locale riapre la coordinata beta.
- **Operatori laterali scelti**: boundary operator, chart locale, filtrazione. Il boundary operator separa supporto e beta; la chart locale testa la finestra senza rifare il mondo; la filtrazione conserva il denominatore row-aligned.
- **Contaminazione cognitiva**: CE-0019 usato come contratto combo prima della misura; CE-0022 usato come boundary operator + chart locale; KSAR usato come reiterazione sul deposito 15:32-18:39 senza ridisegnare il perimetro.
- **Proto-ipotesi**: il residuo medio/forte beta-absent e' una classe unica solo se entrambi i target restano blank in tutte le finestre row-local e conservano una firma osservabile compatibile.
- **Proiezione**: applico il gate canonico ordine/null alle sole due righe residue, poi confronto persistenza del blank e Jaccard delle firme one-sided.

## Aderenza alla direzione

- `relation`: follows_direction
- `why`: attacca direttamente i due residui beta-absent medio/forti lasciati dal valutatore dopo `thin_persist_rows=0/13`.
- `not_drift`: non usa `V_c`, non usa label GUE/Poisson come campo decisionale, non rigenera la griglia beta globale.

## Claim Under Test

> I due residui `numeri_primi:cycle_3` e `random_matrix:cycle_7` formano una classe unica `medium/strong beta-absent` se il blank persiste in tutte le finestre row-local da 1024 gap e le firme one-sided restano compatibili.

## Question

I due blank residui sono lo stesso operatore di confine, due classi distinte, o un artefatto da denominatore/atlante?

## Experiment Design

- Perimetro atomico: `numeri_primi:cycle_3`, `random_matrix:cycle_7`.
- Scope: full row + 4 finestre consecutive da 1024 gap per ciascun target.
- Parametri: `n_replicates=12`, `n_beta=11`, `n_baseline=24`, `z_min=2.0`, seed `202605100330`.
- Null baseline: permutazione marginal-preserving usata dal gate canonico gia' adottato nei report BOUNDARY.
- Non misurato: `gap_ratio`, `V_c`, nuova griglia beta globale, validita' delle label sorgente GUE/Poisson.
- Criterio di caduta: una riga recupera beta o perde supporto in una finestra row-local; in quel caso il residuo non e' classe unica chiusa.

## Results

| row | full state | full one-sided | window blanks | beta recovered | support falls | common window obs | mean endpoint | mean stable coherent |
|---|---:|---|---:|---:|---:|---|---:|---:|
| numeri_primi:cycle_3 | beta_absent_blank | SR,L1,triple_var | 4/4 | 0 | 0 | SR | 2.761 | 2.563 |
| random_matrix:cycle_7 | beta_absent_blank | SR,SR2,L1,L2,triple_var | 3/4 | 1 | 0 | L2 | 2.987 | 3.083 |

| comparison | value |
|---|---:|
| full_signature_jaccard | 0.600 |
| common_window_obs_jaccard | 0.000 |
| random_matrix recovered beta | window_4 -> beta [0.4] |

## Key Findings

1. **Verificato: `numeri_primi:cycle_3` resta beta-absent in 4/4 finestre.** Il supporto non cade; l'osservabile comune di finestra e' `SR`.
2. **Verificato: `random_matrix:cycle_7` non resta beta-absent in 4/4 finestre.** La quarta finestra recupera beta `[0.4]` con supporto vivo (`SR2,L1,L2,triple_var`).
3. **Verificato: le firme comuni di finestra divergono.** `common_window_obs_jaccard=0.000`: primi conserva `SR`, random matrix conserva `L2`.
4. **Inferito dal perimetro dichiarato: il residuo beta-absent non e' una classe unica chiusa.** Una parte e' blank persistente row-local, una parte e' chart-sensitive.

## Verdict

**CONSTRAINT**.

Nel perimetro delle due righe residue e finestre da 1024 gap, `medium/strong beta-absent` si scinde:

`numeri_primi:cycle_3` = blank persistente row-local.  
`random_matrix:cycle_7` = blank forte ma chart-sensitive, con beta `[0.4]` recuperata in 1/4 finestre.

Formula valida:

`beta_absent_residue` non matura come classe unica; diventa un audit a due stati: `prime_persistent_blank` / `random_matrix_chart_sensitive_blank`.

## Bicono della scoperta

- **Due radici**: blank persistente / blank chart-sensitive.
- **Singolare**: supporto ordine/null vivo senza coordinata beta globale.
- **Invariante di passaggio**: il supporto non cade in nessuna delle 8 finestre; cio' che cambia e' la coordinata beta e la firma osservabile.
- **Campo di possibilità**: possibile = chiudere la tassonomia BOUNDARY con due sotto-stati residui; non-possibile = promuovere `medium/strong beta-absent` come specie unica del confine.

## Consecutio

Il prossimo ciclo non deve riaprire il thin blank. Deve sigillare il nuovo audit a due stati:

- `prime_persistent_blank`: testare se `SR` resta l'osservabile comune sotto seed/window shift.
- `random_matrix_chart_sensitive_blank`: testare se beta `[0.4]` e' coordinata locale stabile o evento di una singola finestra.

## Ricadute pratiche

ssp_value: yes. Lo script e' uno strumento riusabile per audit row-local di residui BOUNDARY senza rigenerare fit globali.

## Files

- Script: `tools/exp_boundary_residual_beta_absent_audit.py`
- Data: `tools/data/boundary_residual_beta_absent_audit_20260510_0330.json`
- Report: `tools/data/reports/agent_20260510_0330.md`

exec
/bin/bash -lc 'python -m py_compile tools/exp_boundary_residual_beta_absent_audit.py' in /opt/MM_D-ND
 succeeded in 0ms:
diff --git a/tools/data/reports/agent_20260510_0330.md b/tools/data/reports/agent_20260510_0330.md
new file mode 100644
index 0000000000000000000000000000000000000000..cc01f0170fd72cca30c20faffc73245dcb3f4f72
--- /dev/null
+++ b/tools/data/reports/agent_20260510_0330.md
@@ -0,0 +1,98 @@
+# Agent Report - Boundary Residual Beta-Absent Audit
+**Date**: 2026-05-10 03:30  
+**Piano**: 114  
+**Tension explored**: BOUNDARY (0.8)  
+**verdict**: CONSTRAINT - il residuo beta-absent non e' una classe unica chiusa  
+observables_registry: 1.0.0-2026-05-06  
+observables_used: [SR, SR2, L1, L2, triple_var, window_state, blank_window_rate, full_signature_jaccard, common_window_obs_jaccard]  
+**observable_contract**: claim=le due righe residue beta-absent sono strutturali solo se `beta_absent_blank` persiste in finestre row-local da 1024 gap; observable=`window_state` + firma degli osservabili one-sided; operator=`exp_boundary_residual_beta_absent_audit.py`; generator=`numeri_primi` da `dnd_autoricerca.genera_segnale` e `random_matrix` da `gue_spacing_blocks`; denominator=2 righe aperte BOUNDARY, full row + 4 finestre row-local da 1024 gap; non_possible=classe residua unica se una riga recupera beta o perde supporto nelle finestre row-local; not_tested=griglia beta globale, fit `V_c`, validita' label sorgente GUE/Poisson.
+
+## Respiro fuori-tempo
+
+- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + residui `numeri_primi:cycle_3` / `random_matrix:cycle_7`.
+- **Dipolo / punto-zero**: blank strutturale / blank da atlante. Punto-zero: la stessa misura row-local da 1024 gap che decide se la beta manca per struttura o riappare per scelta di finestra.
+- **Piano superiore**: topologia assiomatica del bordo: la classe globale cade se una carta locale riapre la coordinata beta.
+- **Operatori laterali scelti**: boundary operator, chart locale, filtrazione. Il boundary operator separa supporto e beta; la chart locale testa la finestra senza rifare il mondo; la filtrazione conserva il denominatore row-aligned.
+- **Contaminazione cognitiva**: CE-0019 usato come contratto combo prima della misura; CE-0022 usato come boundary operator + chart locale; KSAR usato come reiterazione sul deposito 15:32-18:39 senza ridisegnare il perimetro.
+- **Proto-ipotesi**: il residuo medio/forte beta-absent e' una classe unica solo se entrambi i target restano blank in tutte le finestre row-local e conservano una firma osservabile compatibile.
+- **Proiezione**: applico il gate canonico ordine/null alle sole due righe residue, poi confronto persistenza del blank e Jaccard delle firme one-sided.
+
+## Aderenza alla direzione
+
+- `relation`: follows_direction
+- `why`: attacca direttamente i due residui beta-absent medio/forti lasciati dal valutatore dopo `thin_persist_rows=0/13`.
+- `not_drift`: non usa `V_c`, non usa label GUE/Poisson come campo decisionale, non rigenera la griglia beta globale.
+
+## Claim Under Test
+
+> I due residui `numeri_primi:cycle_3` e `random_matrix:cycle_7` formano una classe unica `medium/strong beta-absent` se il blank persiste in tutte le finestre row-local da 1024 gap e le firme one-sided restano compatibili.
+
+## Question
+
+I due blank residui sono lo stesso operatore di confine, due classi distinte, o un artefatto da denominatore/atlante?
+
+## Experiment Design
+
+- Perimetro atomico: `numeri_primi:cycle_3`, `random_matrix:cycle_7`.
+- Scope: full row + 4 finestre consecutive da 1024 gap per ciascun target.
+- Parametri: `n_replicates=12`, `n_beta=11`, `n_baseline=24`, `z_min=2.0`, seed `202605100330`.
+- Null baseline: permutazione marginal-preserving usata dal gate canonico gia' adottato nei report BOUNDARY.
+- Non misurato: `gap_ratio`, `V_c`, nuova griglia beta globale, validita' delle label sorgente GUE/Poisson.
+- Criterio di caduta: una riga recupera beta o perde supporto in una finestra row-local; in quel caso il residuo non e' classe unica chiusa.
+
+## Results
+
+| row | full state | full one-sided | window blanks | beta recovered | support falls | common window obs | mean endpoint | mean stable coherent |
+|---|---:|---|---:|---:|---:|---|---:|---:|
+| numeri_primi:cycle_3 | beta_absent_blank | SR,L1,triple_var | 4/4 | 0 | 0 | SR | 2.761 | 2.563 |
+| random_matrix:cycle_7 | beta_absent_blank | SR,SR2,L1,L2,triple_var | 3/4 | 1 | 0 | L2 | 2.987 | 3.083 |
+
+| comparison | value |
+|---|---:|
+| full_signature_jaccard | 0.600 |
+| common_window_obs_jaccard | 0.000 |
+| random_matrix recovered beta | window_4 -> beta [0.4] |
+
+## Key Findings
+
+1. **Verificato: `numeri_primi:cycle_3` resta beta-absent in 4/4 finestre.** Il supporto non cade; l'osservabile comune di finestra e' `SR`.
+2. **Verificato: `random_matrix:cycle_7` non resta beta-absent in 4/4 finestre.** La quarta finestra recupera beta `[0.4]` con supporto vivo (`SR2,L1,L2,triple_var`).
+3. **Verificato: le firme comuni di finestra divergono.** `common_window_obs_jaccard=0.000`: primi conserva `SR`, random matrix conserva `L2`.
+4. **Inferito dal perimetro dichiarato: il residuo beta-absent non e' una classe unica chiusa.** Una parte e' blank persistente row-local, una parte e' chart-sensitive.
+
+## Verdict
+
+**CONSTRAINT**.
+
+Nel perimetro delle due righe residue e finestre da 1024 gap, `medium/strong beta-absent` si scinde:
+
+`numeri_primi:cycle_3` = blank persistente row-local.  
+`random_matrix:cycle_7` = blank forte ma chart-sensitive, con beta `[0.4]` recuperata in 1/4 finestre.
+
+Formula valida:
+
+`beta_absent_residue` non matura come classe unica; diventa un audit a due stati: `prime_persistent_blank` / `random_matrix_chart_sensitive_blank`.
+
+## Bicono della scoperta
+
+- **Due radici**: blank persistente / blank chart-sensitive.
+- **Singolare**: supporto ordine/null vivo senza coordinata beta globale.
+- **Invariante di passaggio**: il supporto non cade in nessuna delle 8 finestre; cio' che cambia e' la coordinata beta e la firma osservabile.
+- **Campo di possibilità**: possibile = chiudere la tassonomia BOUNDARY con due sotto-stati residui; non-possibile = promuovere `medium/strong beta-absent` come specie unica del confine.
+
+## Consecutio
+
+Il prossimo ciclo non deve riaprire il thin blank. Deve sigillare il nuovo audit a due stati:
+
+- `prime_persistent_blank`: testare se `SR` resta l'osservabile comune sotto seed/window shift.
+- `random_matrix_chart_sensitive_blank`: testare se beta `[0.4]` e' coordinata locale stabile o evento di una singola finestra.
+
+## Ricadute pratiche
+
+ssp_value: yes. Lo script e' uno strumento riusabile per audit row-local di residui BOUNDARY senza rigenerare fit globali.
+
+## Files
+
+- Script: `tools/exp_boundary_residual_beta_absent_audit.py`
+- Data: `tools/data/boundary_residual_beta_absent_audit_20260510_0330.json`
+- Report: `tools/data/reports/agent_20260510_0330.md`
diff --git a/tools/exp_boundary_residual_beta_absent_audit.py b/tools/exp_boundary_residual_beta_absent_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b2b02258d429ae60f10356011447760e95f5cb8
--- /dev/null
+++ b/tools/exp_boundary_residual_beta_absent_audit.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+"""
+Targeted audit for the two medium/strong beta-absent BOUNDARY residues.
+
+This does not rebuild the global beta atlas. It tests only the two open rows
+from the 13-row taxonomy (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) with
+row-local windows and the same canonical observable gate used by the prior
+BOUNDARY reports.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from exp_boundary_short_denominator_extension import gue_spacing_blocks
+from exp_semireal_boundary_transfer_gate import row_spacings
+from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
+from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION
+
+
+TARGET_ROWS = ("numeri_primi:cycle_3", "random_matrix:cycle_7")
+OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
+
+
+def windowed(values: np.ndarray, size: int, count: int) -> list[np.ndarray]:
+    chunks = []
+    for idx in range(count):
+        start = idx * size
+        end = start + size
+        if end <= len(values):
+            chunks.append(normalize(values[start:end]))
+    return chunks
+
+
+def support_state(row: dict[str, Any], args: argparse.Namespace) -> str:
+    one_sided = len(row.get("coherent_one_sided_observables", []))
+    illusory = float(row.get("stable_count_illusory") or 0.0)
+    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
+    beta = row.get("ambiguous_beta_one_sided_gated", [])
+    transfers = (
+        one_sided >= args.min_one_sided
+        and illusory <= args.illusory_residue_max
+        and endpoint >= args.endpoint_distance_min
+    )
+    if not transfers:
+        return "support_falls"
+    if beta:
+        return "beta_chart_recovered"
+    return "beta_absent_blank"
+
+
+def obs_jaccard(left: list[str], right: list[str]) -> float:
+    a = set(left)
+    b = set(right)
+    if not a and not b:
+        return 1.0
+    return len(a & b) / len(a | b)
+
+
+def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
+    prime = row_spacings("numeri_primi")
+    prime = normalize(prime[: args.prime_gaps])
+
+    gue_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+    random_matrix = gue_spacing_blocks(args.random_matrix_gaps, args.gue_matrix_size, gue_rng)
+
+    return {
+        "numeri_primi:cycle_3": {
+            "base": prime,
+            "domain": "numeri_primi",
+            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
+            "source_n_gaps": int(len(prime)),
+        },
+        "random_matrix:cycle_7": {
+            "base": random_matrix,
+            "domain": "random_matrix",
+            "generator": "gue_spacing_blocks",
+            "source_n_gaps": int(len(random_matrix)),
+        },
+    }
+
+
+def analyze_case(name: str, label: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict[str, Any]:
+    perimeters = {f"{name}/{label}": analyze_sequence(f"{name}/{label}", base, args, rng)}
+    row = compact(perimeters)[f"{name}/{label}"]
+    return {
+        "label": label,
+        "n_gaps": row["n_gaps"],
+        "one_sided_observables": row["coherent_one_sided_observables"],
+        "one_sided_count": len(row["coherent_one_sided_observables"]),
+        "endpoint_stable_observables": row["endpoint_stable_observables"],
+        "stable_count_coherent": row["stable_count_coherent"],
+        "stable_count_illusory": row["stable_count_illusory"],
+        "endpoint_distance": row["endpoint_distance_one_sided_gated"],
+        "ambiguous_beta": [round(float(x), 1) for x in row["ambiguous_beta_one_sided_gated"]],
+        "state": support_state(row, args),
+        "z_mean_coherent": row["z_mean_coherent"],
+        "z_mean_illusory": row["z_mean_illusory"],
+    }
+
+
+def summarize_row(cases: list[dict[str, Any]]) -> dict[str, Any]:
+    window_cases = [case for case in cases if case["label"].startswith("window_")]
+    blank_windows = [case for case in window_cases if case["state"] == "beta_absent_blank"]
+    beta_windows = [case for case in window_cases if case["state"] == "beta_chart_recovered"]
+    fall_windows = [case for case in window_cases if case["state"] == "support_falls"]
+    obs_sets = [set(case["one_sided_observables"]) for case in window_cases if case["one_sided_observables"]]
+    common_obs = sorted(set.intersection(*obs_sets)) if obs_sets else []
+    union_obs = sorted(set.union(*obs_sets)) if obs_sets else []
+    return {
+        "window_count": len(window_cases),
+        "blank_windows": len(blank_windows),
+        "beta_recovered_windows": len(beta_windows),
+        "support_fall_windows": len(fall_windows),
+        "blank_window_rate": len(blank_windows) / len(window_cases) if window_cases else 0.0,
+        "common_one_sided_observables": common_obs,
+        "union_one_sided_observables": union_obs,
+        "endpoint_distance_mean": float(np.mean([case["endpoint_distance"] for case in window_cases])) if window_cases else 0.0,
+        "stable_count_coherent_mean": float(np.mean([case["stable_count_coherent"] for case in window_cases])) if window_cases else 0.0,
+    }
+
+
+def verdict(row_summaries: dict[str, dict[str, Any]], full_rows: dict[str, dict[str, Any]]) -> str:
+    both_persist = all(summary["blank_window_rate"] == 1.0 for summary in row_summaries.values())
+    any_beta = any(summary["beta_recovered_windows"] > 0 for summary in row_summaries.values())
+    any_fall = any(summary["support_fall_windows"] > 0 for summary in row_summaries.values())
+    jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    if any_beta or any_fall:
+        return "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE"
+    if both_persist and jaccard < 0.5:
+        return "TWO_DISTINCT_BETA_ABSENT_OPERATORS"
+    if both_persist:
+        return "SAME_BETA_ABSENT_OPERATOR"
+    return "RESIDUAL_AMBIGUOUS"
+
+
+def run(args: argparse.Namespace) -> dict[str, Any]:
+    rng = np.random.default_rng(args.seed)
+    specs = build_sequences(args, rng)
+    cases_by_row: dict[str, list[dict[str, Any]]] = {}
+    full_rows: dict[str, dict[str, Any]] = {}
+
+    for name, spec in specs.items():
+        row_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+        cases = [analyze_case(name, "full", spec["base"], args, row_rng)]
+        full_rows[name] = cases[0]
+        for idx, chunk in enumerate(windowed(spec["base"], args.window_gaps, args.window_count), start=1):
+            cases.append(analyze_case(name, f"window_{idx}", chunk, args, row_rng))
+        cases_by_row[name] = cases
+
+    row_summaries = {name: summarize_row(cases) for name, cases in cases_by_row.items()}
+    full_signature_jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    common_window_obs_jaccard = obs_jaccard(
+        row_summaries["numeri_primi:cycle_3"]["common_one_sided_observables"],
+        row_summaries["random_matrix:cycle_7"]["common_one_sided_observables"],
+    )
+
+    output = {
+        "experiment": "boundary_residual_beta_absent_audit",
+        "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
+        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
+        "observables_used": [
+            *OBS_NAMES,
+            "window_state",
+            "blank_window_rate",
+            "full_signature_jaccard",
+            "common_window_obs_jaccard",
+        ],
+        "params": vars(args),
+        "targets": TARGET_ROWS,
+        "observable_contract": {
+            "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
+            "observable": "window_state plus one-sided observable signature",
+            "operator": "canonical order/null gate on target rows only",
+            "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
+            "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
+            "not_tested": "global beta grid, V_c, source GUE/Poisson label validity",
+        },
+        "sequence_sources": {
+            name: {key: value for key, value in spec.items() if key != "base"}
+            for name, spec in specs.items()
+        },
+        "row_summaries": row_summaries,
+        "full_signature_jaccard": full_signature_jaccard,
+        "common_window_obs_jaccard": common_window_obs_jaccard,
+        "verdict": verdict(row_summaries, full_rows),
+        "cases": cases_by_row,
+    }
+
+    out = Path(args.out)
+    out.parent.mkdir(parents=True, exist_ok=True)
+    out.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
+
+    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
+    print(f"targets={TARGET_ROWS}")
+    for name, summary in row_summaries.items():
+        print(
+            f"{name} blank_windows={summary['blank_windows']}/{summary['window_count']} "
+            f"beta_recovered={summary['beta_recovered_windows']} falls={summary['support_fall_windows']} "
+            f"common_obs={summary['common_one_sided_observables']}"
+        )
+    print(f"full_signature_jaccard={full_signature_jaccard:.3f}")
+    print(f"common_window_obs_jaccard={common_window_obs_jaccard:.3f}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+    return output
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--prime-gaps", type=int, default=4096)
+    parser.add_argument("--random-matrix-gaps", type=int, default=4096)
+    parser.add_argument("--window-gaps", type=int, default=1024)
+    parser.add_argument("--window-count", type=int, default=4)
+    parser.add_argument("--gue-matrix-size", type=int, default=64)
+    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("--seed", type=int, default=202605100330)
+    parser.add_argument("--out", default="tools/data/boundary_residual_beta_absent_audit_20260510_0330.json")
+    args = parser.parse_args()
+    run(args)
+
+
+if __name__ == "__main__":
+    main()

exec
/bin/bash -lc 'ln -sfn agent_20260510_0330.md tools/data/reports/latest.md && readlink tools/data/reports/latest.md' in /opt/MM_D-ND
 succeeded in 0ms:
agent_20260510_0330.md

diff --git a/tools/data/reports/agent_20260510_0330.md b/tools/data/reports/agent_20260510_0330.md
new file mode 100644
index 0000000000000000000000000000000000000000..cc01f0170fd72cca30c20faffc73245dcb3f4f72
--- /dev/null
+++ b/tools/data/reports/agent_20260510_0330.md
@@ -0,0 +1,98 @@
+# Agent Report - Boundary Residual Beta-Absent Audit
+**Date**: 2026-05-10 03:30  
+**Piano**: 114  
+**Tension explored**: BOUNDARY (0.8)  
+**verdict**: CONSTRAINT - il residuo beta-absent non e' una classe unica chiusa  
+observables_registry: 1.0.0-2026-05-06  
+observables_used: [SR, SR2, L1, L2, triple_var, window_state, blank_window_rate, full_signature_jaccard, common_window_obs_jaccard]  
+**observable_contract**: claim=le due righe residue beta-absent sono strutturali solo se `beta_absent_blank` persiste in finestre row-local da 1024 gap; observable=`window_state` + firma degli osservabili one-sided; operator=`exp_boundary_residual_beta_absent_audit.py`; generator=`numeri_primi` da `dnd_autoricerca.genera_segnale` e `random_matrix` da `gue_spacing_blocks`; denominator=2 righe aperte BOUNDARY, full row + 4 finestre row-local da 1024 gap; non_possible=classe residua unica se una riga recupera beta o perde supporto nelle finestre row-local; not_tested=griglia beta globale, fit `V_c`, validita' label sorgente GUE/Poisson.
+
+## Respiro fuori-tempo
+
+- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + residui `numeri_primi:cycle_3` / `random_matrix:cycle_7`.
+- **Dipolo / punto-zero**: blank strutturale / blank da atlante. Punto-zero: la stessa misura row-local da 1024 gap che decide se la beta manca per struttura o riappare per scelta di finestra.
+- **Piano superiore**: topologia assiomatica del bordo: la classe globale cade se una carta locale riapre la coordinata beta.
+- **Operatori laterali scelti**: boundary operator, chart locale, filtrazione. Il boundary operator separa supporto e beta; la chart locale testa la finestra senza rifare il mondo; la filtrazione conserva il denominatore row-aligned.
+- **Contaminazione cognitiva**: CE-0019 usato come contratto combo prima della misura; CE-0022 usato come boundary operator + chart locale; KSAR usato come reiterazione sul deposito 15:32-18:39 senza ridisegnare il perimetro.
+- **Proto-ipotesi**: il residuo medio/forte beta-absent e' una classe unica solo se entrambi i target restano blank in tutte le finestre row-local e conservano una firma osservabile compatibile.
+- **Proiezione**: applico il gate canonico ordine/null alle sole due righe residue, poi confronto persistenza del blank e Jaccard delle firme one-sided.
+
+## Aderenza alla direzione
+
+- `relation`: follows_direction
+- `why`: attacca direttamente i due residui beta-absent medio/forti lasciati dal valutatore dopo `thin_persist_rows=0/13`.
+- `not_drift`: non usa `V_c`, non usa label GUE/Poisson come campo decisionale, non rigenera la griglia beta globale.
+
+## Claim Under Test
+
+> I due residui `numeri_primi:cycle_3` e `random_matrix:cycle_7` formano una classe unica `medium/strong beta-absent` se il blank persiste in tutte le finestre row-local da 1024 gap e le firme one-sided restano compatibili.
+
+## Question
+
+I due blank residui sono lo stesso operatore di confine, due classi distinte, o un artefatto da denominatore/atlante?
+
+## Experiment Design
+
+- Perimetro atomico: `numeri_primi:cycle_3`, `random_matrix:cycle_7`.
+- Scope: full row + 4 finestre consecutive da 1024 gap per ciascun target.
+- Parametri: `n_replicates=12`, `n_beta=11`, `n_baseline=24`, `z_min=2.0`, seed `202605100330`.
+- Null baseline: permutazione marginal-preserving usata dal gate canonico gia' adottato nei report BOUNDARY.
+- Non misurato: `gap_ratio`, `V_c`, nuova griglia beta globale, validita' delle label sorgente GUE/Poisson.
+- Criterio di caduta: una riga recupera beta o perde supporto in una finestra row-local; in quel caso il residuo non e' classe unica chiusa.
+
+## Results
+
+| row | full state | full one-sided | window blanks | beta recovered | support falls | common window obs | mean endpoint | mean stable coherent |
+|---|---:|---|---:|---:|---:|---|---:|---:|
+| numeri_primi:cycle_3 | beta_absent_blank | SR,L1,triple_var | 4/4 | 0 | 0 | SR | 2.761 | 2.563 |
+| random_matrix:cycle_7 | beta_absent_blank | SR,SR2,L1,L2,triple_var | 3/4 | 1 | 0 | L2 | 2.987 | 3.083 |
+
+| comparison | value |
+|---|---:|
+| full_signature_jaccard | 0.600 |
+| common_window_obs_jaccard | 0.000 |
+| random_matrix recovered beta | window_4 -> beta [0.4] |
+
+## Key Findings
+
+1. **Verificato: `numeri_primi:cycle_3` resta beta-absent in 4/4 finestre.** Il supporto non cade; l'osservabile comune di finestra e' `SR`.
+2. **Verificato: `random_matrix:cycle_7` non resta beta-absent in 4/4 finestre.** La quarta finestra recupera beta `[0.4]` con supporto vivo (`SR2,L1,L2,triple_var`).
+3. **Verificato: le firme comuni di finestra divergono.** `common_window_obs_jaccard=0.000`: primi conserva `SR`, random matrix conserva `L2`.
+4. **Inferito dal perimetro dichiarato: il residuo beta-absent non e' una classe unica chiusa.** Una parte e' blank persistente row-local, una parte e' chart-sensitive.
+
+## Verdict
+
+**CONSTRAINT**.
+
+Nel perimetro delle due righe residue e finestre da 1024 gap, `medium/strong beta-absent` si scinde:
+
+`numeri_primi:cycle_3` = blank persistente row-local.  
+`random_matrix:cycle_7` = blank forte ma chart-sensitive, con beta `[0.4]` recuperata in 1/4 finestre.
+
+Formula valida:
+
+`beta_absent_residue` non matura come classe unica; diventa un audit a due stati: `prime_persistent_blank` / `random_matrix_chart_sensitive_blank`.
+
+## Bicono della scoperta
+
+- **Due radici**: blank persistente / blank chart-sensitive.
+- **Singolare**: supporto ordine/null vivo senza coordinata beta globale.
+- **Invariante di passaggio**: il supporto non cade in nessuna delle 8 finestre; cio' che cambia e' la coordinata beta e la firma osservabile.
+- **Campo di possibilità**: possibile = chiudere la tassonomia BOUNDARY con due sotto-stati residui; non-possibile = promuovere `medium/strong beta-absent` come specie unica del confine.
+
+## Consecutio
+
+Il prossimo ciclo non deve riaprire il thin blank. Deve sigillare il nuovo audit a due stati:
+
+- `prime_persistent_blank`: testare se `SR` resta l'osservabile comune sotto seed/window shift.
+- `random_matrix_chart_sensitive_blank`: testare se beta `[0.4]` e' coordinata locale stabile o evento di una singola finestra.
+
+## Ricadute pratiche
+
+ssp_value: yes. Lo script e' uno strumento riusabile per audit row-local di residui BOUNDARY senza rigenerare fit globali.
+
+## Files
+
+- Script: `tools/exp_boundary_residual_beta_absent_audit.py`
+- Data: `tools/data/boundary_residual_beta_absent_audit_20260510_0330.json`
+- Report: `tools/data/reports/agent_20260510_0330.md`
diff --git a/tools/exp_boundary_residual_beta_absent_audit.py b/tools/exp_boundary_residual_beta_absent_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b2b02258d429ae60f10356011447760e95f5cb8
--- /dev/null
+++ b/tools/exp_boundary_residual_beta_absent_audit.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+"""
+Targeted audit for the two medium/strong beta-absent BOUNDARY residues.
+
+This does not rebuild the global beta atlas. It tests only the two open rows
+from the 13-row taxonomy (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) with
+row-local windows and the same canonical observable gate used by the prior
+BOUNDARY reports.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from exp_boundary_short_denominator_extension import gue_spacing_blocks
+from exp_semireal_boundary_transfer_gate import row_spacings
+from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
+from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION
+
+
+TARGET_ROWS = ("numeri_primi:cycle_3", "random_matrix:cycle_7")
+OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
+
+
+def windowed(values: np.ndarray, size: int, count: int) -> list[np.ndarray]:
+    chunks = []
+    for idx in range(count):
+        start = idx * size
+        end = start + size
+        if end <= len(values):
+            chunks.append(normalize(values[start:end]))
+    return chunks
+
+
+def support_state(row: dict[str, Any], args: argparse.Namespace) -> str:
+    one_sided = len(row.get("coherent_one_sided_observables", []))
+    illusory = float(row.get("stable_count_illusory") or 0.0)
+    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
+    beta = row.get("ambiguous_beta_one_sided_gated", [])
+    transfers = (
+        one_sided >= args.min_one_sided
+        and illusory <= args.illusory_residue_max
+        and endpoint >= args.endpoint_distance_min
+    )
+    if not transfers:
+        return "support_falls"
+    if beta:
+        return "beta_chart_recovered"
+    return "beta_absent_blank"
+
+
+def obs_jaccard(left: list[str], right: list[str]) -> float:
+    a = set(left)
+    b = set(right)
+    if not a and not b:
+        return 1.0
+    return len(a & b) / len(a | b)
+
+
+def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
+    prime = row_spacings("numeri_primi")
+    prime = normalize(prime[: args.prime_gaps])
+
+    gue_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+    random_matrix = gue_spacing_blocks(args.random_matrix_gaps, args.gue_matrix_size, gue_rng)
+
+    return {
+        "numeri_primi:cycle_3": {
+            "base": prime,
+            "domain": "numeri_primi",
+            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
+            "source_n_gaps": int(len(prime)),
+        },
+        "random_matrix:cycle_7": {
+            "base": random_matrix,
+            "domain": "random_matrix",
+            "generator": "gue_spacing_blocks",
+            "source_n_gaps": int(len(random_matrix)),
+        },
+    }
+
+
+def analyze_case(name: str, label: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict[str, Any]:
+    perimeters = {f"{name}/{label}": analyze_sequence(f"{name}/{label}", base, args, rng)}
+    row = compact(perimeters)[f"{name}/{label}"]
+    return {
+        "label": label,
+        "n_gaps": row["n_gaps"],
+        "one_sided_observables": row["coherent_one_sided_observables"],
+        "one_sided_count": len(row["coherent_one_sided_observables"]),
+        "endpoint_stable_observables": row["endpoint_stable_observables"],
+        "stable_count_coherent": row["stable_count_coherent"],
+        "stable_count_illusory": row["stable_count_illusory"],
+        "endpoint_distance": row["endpoint_distance_one_sided_gated"],
+        "ambiguous_beta": [round(float(x), 1) for x in row["ambiguous_beta_one_sided_gated"]],
+        "state": support_state(row, args),
+        "z_mean_coherent": row["z_mean_coherent"],
+        "z_mean_illusory": row["z_mean_illusory"],
+    }
+
+
+def summarize_row(cases: list[dict[str, Any]]) -> dict[str, Any]:
+    window_cases = [case for case in cases if case["label"].startswith("window_")]
+    blank_windows = [case for case in window_cases if case["state"] == "beta_absent_blank"]
+    beta_windows = [case for case in window_cases if case["state"] == "beta_chart_recovered"]
+    fall_windows = [case for case in window_cases if case["state"] == "support_falls"]
+    obs_sets = [set(case["one_sided_observables"]) for case in window_cases if case["one_sided_observables"]]
+    common_obs = sorted(set.intersection(*obs_sets)) if obs_sets else []
+    union_obs = sorted(set.union(*obs_sets)) if obs_sets else []
+    return {
+        "window_count": len(window_cases),
+        "blank_windows": len(blank_windows),
+        "beta_recovered_windows": len(beta_windows),
+        "support_fall_windows": len(fall_windows),
+        "blank_window_rate": len(blank_windows) / len(window_cases) if window_cases else 0.0,
+        "common_one_sided_observables": common_obs,
+        "union_one_sided_observables": union_obs,
+        "endpoint_distance_mean": float(np.mean([case["endpoint_distance"] for case in window_cases])) if window_cases else 0.0,
+        "stable_count_coherent_mean": float(np.mean([case["stable_count_coherent"] for case in window_cases])) if window_cases else 0.0,
+    }
+
+
+def verdict(row_summaries: dict[str, dict[str, Any]], full_rows: dict[str, dict[str, Any]]) -> str:
+    both_persist = all(summary["blank_window_rate"] == 1.0 for summary in row_summaries.values())
+    any_beta = any(summary["beta_recovered_windows"] > 0 for summary in row_summaries.values())
+    any_fall = any(summary["support_fall_windows"] > 0 for summary in row_summaries.values())
+    jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    if any_beta or any_fall:
+        return "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE"
+    if both_persist and jaccard < 0.5:
+        return "TWO_DISTINCT_BETA_ABSENT_OPERATORS"
+    if both_persist:
+        return "SAME_BETA_ABSENT_OPERATOR"
+    return "RESIDUAL_AMBIGUOUS"
+
+
+def run(args: argparse.Namespace) -> dict[str, Any]:
+    rng = np.random.default_rng(args.seed)
+    specs = build_sequences(args, rng)
+    cases_by_row: dict[str, list[dict[str, Any]]] = {}
+    full_rows: dict[str, dict[str, Any]] = {}
+
+    for name, spec in specs.items():
+        row_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+        cases = [analyze_case(name, "full", spec["base"], args, row_rng)]
+        full_rows[name] = cases[0]
+        for idx, chunk in enumerate(windowed(spec["base"], args.window_gaps, args.window_count), start=1):
+            cases.append(analyze_case(name, f"window_{idx}", chunk, args, row_rng))
+        cases_by_row[name] = cases
+
+    row_summaries = {name: summarize_row(cases) for name, cases in cases_by_row.items()}
+    full_signature_jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    common_window_obs_jaccard = obs_jaccard(
+        row_summaries["numeri_primi:cycle_3"]["common_one_sided_observables"],
+        row_summaries["random_matrix:cycle_7"]["common_one_sided_observables"],
+    )
+
+    output = {
+        "experiment": "boundary_residual_beta_absent_audit",
+        "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
+        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
+        "observables_used": [
+            *OBS_NAMES,
+            "window_state",
+            "blank_window_rate",
+            "full_signature_jaccard",
+            "common_window_obs_jaccard",
+        ],
+        "params": vars(args),
+        "targets": TARGET_ROWS,
+        "observable_contract": {
+            "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
+            "observable": "window_state plus one-sided observable signature",
+            "operator": "canonical order/null gate on target rows only",
+            "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
+            "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
+            "not_tested": "global beta grid, V_c, source GUE/Poisson label validity",
+        },
+        "sequence_sources": {
+            name: {key: value for key, value in spec.items() if key != "base"}
+            for name, spec in specs.items()
+        },
+        "row_summaries": row_summaries,
+        "full_signature_jaccard": full_signature_jaccard,
+        "common_window_obs_jaccard": common_window_obs_jaccard,
+        "verdict": verdict(row_summaries, full_rows),
+        "cases": cases_by_row,
+    }
+
+    out = Path(args.out)
+    out.parent.mkdir(parents=True, exist_ok=True)
+    out.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
+
+    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
+    print(f"targets={TARGET_ROWS}")
+    for name, summary in row_summaries.items():
+        print(
+            f"{name} blank_windows={summary['blank_windows']}/{summary['window_count']} "
+            f"beta_recovered={summary['beta_recovered_windows']} falls={summary['support_fall_windows']} "
+            f"common_obs={summary['common_one_sided_observables']}"
+        )
+    print(f"full_signature_jaccard={full_signature_jaccard:.3f}")
+    print(f"common_window_obs_jaccard={common_window_obs_jaccard:.3f}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+    return output
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--prime-gaps", type=int, default=4096)
+    parser.add_argument("--random-matrix-gaps", type=int, default=4096)
+    parser.add_argument("--window-gaps", type=int, default=1024)
+    parser.add_argument("--window-count", type=int, default=4)
+    parser.add_argument("--gue-matrix-size", type=int, default=64)
+    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("--seed", type=int, default=202605100330)
+    parser.add_argument("--out", default="tools/data/boundary_residual_beta_absent_audit_20260510_0330.json")
+    args = parser.parse_args()
+    run(args)
+
+
+if __name__ == "__main__":
+    main()

exec
/bin/bash -lc 'if [ -x tools/structural_check.py ]; then python tools/structural_check.py tools/exp_boundary_residual_beta_absent_audit.py tools/data/reports/agent_20260510_0330.md; elif [ -f tools/structural_check.py ]; then python tools/structural_check.py tools/exp_boundary_residual_beta_absent_audit.py tools/data/reports/agent_20260510_0330.md; else true; fi' in /opt/MM_D-ND
 succeeded in 0ms:
Scansione 2 file...
Nessun anti-pattern trovato.

diff --git a/tools/data/reports/agent_20260510_0330.md b/tools/data/reports/agent_20260510_0330.md
new file mode 100644
index 0000000000000000000000000000000000000000..cc01f0170fd72cca30c20faffc73245dcb3f4f72
--- /dev/null
+++ b/tools/data/reports/agent_20260510_0330.md
@@ -0,0 +1,98 @@
+# Agent Report - Boundary Residual Beta-Absent Audit
+**Date**: 2026-05-10 03:30  
+**Piano**: 114  
+**Tension explored**: BOUNDARY (0.8)  
+**verdict**: CONSTRAINT - il residuo beta-absent non e' una classe unica chiusa  
+observables_registry: 1.0.0-2026-05-06  
+observables_used: [SR, SR2, L1, L2, triple_var, window_state, blank_window_rate, full_signature_jaccard, common_window_obs_jaccard]  
+**observable_contract**: claim=le due righe residue beta-absent sono strutturali solo se `beta_absent_blank` persiste in finestre row-local da 1024 gap; observable=`window_state` + firma degli osservabili one-sided; operator=`exp_boundary_residual_beta_absent_audit.py`; generator=`numeri_primi` da `dnd_autoricerca.genera_segnale` e `random_matrix` da `gue_spacing_blocks`; denominator=2 righe aperte BOUNDARY, full row + 4 finestre row-local da 1024 gap; non_possible=classe residua unica se una riga recupera beta o perde supporto nelle finestre row-local; not_tested=griglia beta globale, fit `V_c`, validita' label sorgente GUE/Poisson.
+
+## Respiro fuori-tempo
+
+- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + residui `numeri_primi:cycle_3` / `random_matrix:cycle_7`.
+- **Dipolo / punto-zero**: blank strutturale / blank da atlante. Punto-zero: la stessa misura row-local da 1024 gap che decide se la beta manca per struttura o riappare per scelta di finestra.
+- **Piano superiore**: topologia assiomatica del bordo: la classe globale cade se una carta locale riapre la coordinata beta.
+- **Operatori laterali scelti**: boundary operator, chart locale, filtrazione. Il boundary operator separa supporto e beta; la chart locale testa la finestra senza rifare il mondo; la filtrazione conserva il denominatore row-aligned.
+- **Contaminazione cognitiva**: CE-0019 usato come contratto combo prima della misura; CE-0022 usato come boundary operator + chart locale; KSAR usato come reiterazione sul deposito 15:32-18:39 senza ridisegnare il perimetro.
+- **Proto-ipotesi**: il residuo medio/forte beta-absent e' una classe unica solo se entrambi i target restano blank in tutte le finestre row-local e conservano una firma osservabile compatibile.
+- **Proiezione**: applico il gate canonico ordine/null alle sole due righe residue, poi confronto persistenza del blank e Jaccard delle firme one-sided.
+
+## Aderenza alla direzione
+
+- `relation`: follows_direction
+- `why`: attacca direttamente i due residui beta-absent medio/forti lasciati dal valutatore dopo `thin_persist_rows=0/13`.
+- `not_drift`: non usa `V_c`, non usa label GUE/Poisson come campo decisionale, non rigenera la griglia beta globale.
+
+## Claim Under Test
+
+> I due residui `numeri_primi:cycle_3` e `random_matrix:cycle_7` formano una classe unica `medium/strong beta-absent` se il blank persiste in tutte le finestre row-local da 1024 gap e le firme one-sided restano compatibili.
+
+## Question
+
+I due blank residui sono lo stesso operatore di confine, due classi distinte, o un artefatto da denominatore/atlante?
+
+## Experiment Design
+
+- Perimetro atomico: `numeri_primi:cycle_3`, `random_matrix:cycle_7`.
+- Scope: full row + 4 finestre consecutive da 1024 gap per ciascun target.
+- Parametri: `n_replicates=12`, `n_beta=11`, `n_baseline=24`, `z_min=2.0`, seed `202605100330`.
+- Null baseline: permutazione marginal-preserving usata dal gate canonico gia' adottato nei report BOUNDARY.
+- Non misurato: `gap_ratio`, `V_c`, nuova griglia beta globale, validita' delle label sorgente GUE/Poisson.
+- Criterio di caduta: una riga recupera beta o perde supporto in una finestra row-local; in quel caso il residuo non e' classe unica chiusa.
+
+## Results
+
+| row | full state | full one-sided | window blanks | beta recovered | support falls | common window obs | mean endpoint | mean stable coherent |
+|---|---:|---|---:|---:|---:|---|---:|---:|
+| numeri_primi:cycle_3 | beta_absent_blank | SR,L1,triple_var | 4/4 | 0 | 0 | SR | 2.761 | 2.563 |
+| random_matrix:cycle_7 | beta_absent_blank | SR,SR2,L1,L2,triple_var | 3/4 | 1 | 0 | L2 | 2.987 | 3.083 |
+
+| comparison | value |
+|---|---:|
+| full_signature_jaccard | 0.600 |
+| common_window_obs_jaccard | 0.000 |
+| random_matrix recovered beta | window_4 -> beta [0.4] |
+
+## Key Findings
+
+1. **Verificato: `numeri_primi:cycle_3` resta beta-absent in 4/4 finestre.** Il supporto non cade; l'osservabile comune di finestra e' `SR`.
+2. **Verificato: `random_matrix:cycle_7` non resta beta-absent in 4/4 finestre.** La quarta finestra recupera beta `[0.4]` con supporto vivo (`SR2,L1,L2,triple_var`).
+3. **Verificato: le firme comuni di finestra divergono.** `common_window_obs_jaccard=0.000`: primi conserva `SR`, random matrix conserva `L2`.
+4. **Inferito dal perimetro dichiarato: il residuo beta-absent non e' una classe unica chiusa.** Una parte e' blank persistente row-local, una parte e' chart-sensitive.
+
+## Verdict
+
+**CONSTRAINT**.
+
+Nel perimetro delle due righe residue e finestre da 1024 gap, `medium/strong beta-absent` si scinde:
+
+`numeri_primi:cycle_3` = blank persistente row-local.  
+`random_matrix:cycle_7` = blank forte ma chart-sensitive, con beta `[0.4]` recuperata in 1/4 finestre.
+
+Formula valida:
+
+`beta_absent_residue` non matura come classe unica; diventa un audit a due stati: `prime_persistent_blank` / `random_matrix_chart_sensitive_blank`.
+
+## Bicono della scoperta
+
+- **Due radici**: blank persistente / blank chart-sensitive.
+- **Singolare**: supporto ordine/null vivo senza coordinata beta globale.
+- **Invariante di passaggio**: il supporto non cade in nessuna delle 8 finestre; cio' che cambia e' la coordinata beta e la firma osservabile.
+- **Campo di possibilità**: possibile = chiudere la tassonomia BOUNDARY con due sotto-stati residui; non-possibile = promuovere `medium/strong beta-absent` come specie unica del confine.
+
+## Consecutio
+
+Il prossimo ciclo non deve riaprire il thin blank. Deve sigillare il nuovo audit a due stati:
+
+- `prime_persistent_blank`: testare se `SR` resta l'osservabile comune sotto seed/window shift.
+- `random_matrix_chart_sensitive_blank`: testare se beta `[0.4]` e' coordinata locale stabile o evento di una singola finestra.
+
+## Ricadute pratiche
+
+ssp_value: yes. Lo script e' uno strumento riusabile per audit row-local di residui BOUNDARY senza rigenerare fit globali.
+
+## Files
+
+- Script: `tools/exp_boundary_residual_beta_absent_audit.py`
+- Data: `tools/data/boundary_residual_beta_absent_audit_20260510_0330.json`
+- Report: `tools/data/reports/agent_20260510_0330.md`
diff --git a/tools/exp_boundary_residual_beta_absent_audit.py b/tools/exp_boundary_residual_beta_absent_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b2b02258d429ae60f10356011447760e95f5cb8
--- /dev/null
+++ b/tools/exp_boundary_residual_beta_absent_audit.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+"""
+Targeted audit for the two medium/strong beta-absent BOUNDARY residues.
+
+This does not rebuild the global beta atlas. It tests only the two open rows
+from the 13-row taxonomy (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) with
+row-local windows and the same canonical observable gate used by the prior
+BOUNDARY reports.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from exp_boundary_short_denominator_extension import gue_spacing_blocks
+from exp_semireal_boundary_transfer_gate import row_spacings
+from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
+from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION
+
+
+TARGET_ROWS = ("numeri_primi:cycle_3", "random_matrix:cycle_7")
+OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
+
+
+def windowed(values: np.ndarray, size: int, count: int) -> list[np.ndarray]:
+    chunks = []
+    for idx in range(count):
+        start = idx * size
+        end = start + size
+        if end <= len(values):
+            chunks.append(normalize(values[start:end]))
+    return chunks
+
+
+def support_state(row: dict[str, Any], args: argparse.Namespace) -> str:
+    one_sided = len(row.get("coherent_one_sided_observables", []))
+    illusory = float(row.get("stable_count_illusory") or 0.0)
+    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
+    beta = row.get("ambiguous_beta_one_sided_gated", [])
+    transfers = (
+        one_sided >= args.min_one_sided
+        and illusory <= args.illusory_residue_max
+        and endpoint >= args.endpoint_distance_min
+    )
+    if not transfers:
+        return "support_falls"
+    if beta:
+        return "beta_chart_recovered"
+    return "beta_absent_blank"
+
+
+def obs_jaccard(left: list[str], right: list[str]) -> float:
+    a = set(left)
+    b = set(right)
+    if not a and not b:
+        return 1.0
+    return len(a & b) / len(a | b)
+
+
+def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
+    prime = row_spacings("numeri_primi")
+    prime = normalize(prime[: args.prime_gaps])
+
+    gue_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+    random_matrix = gue_spacing_blocks(args.random_matrix_gaps, args.gue_matrix_size, gue_rng)
+
+    return {
+        "numeri_primi:cycle_3": {
+            "base": prime,
+            "domain": "numeri_primi",
+            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
+            "source_n_gaps": int(len(prime)),
+        },
+        "random_matrix:cycle_7": {
+            "base": random_matrix,
+            "domain": "random_matrix",
+            "generator": "gue_spacing_blocks",
+            "source_n_gaps": int(len(random_matrix)),
+        },
+    }
+
+
+def analyze_case(name: str, label: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict[str, Any]:
+    perimeters = {f"{name}/{label}": analyze_sequence(f"{name}/{label}", base, args, rng)}
+    row = compact(perimeters)[f"{name}/{label}"]
+    return {
+        "label": label,
+        "n_gaps": row["n_gaps"],
+        "one_sided_observables": row["coherent_one_sided_observables"],
+        "one_sided_count": len(row["coherent_one_sided_observables"]),
+        "endpoint_stable_observables": row["endpoint_stable_observables"],
+        "stable_count_coherent": row["stable_count_coherent"],
+        "stable_count_illusory": row["stable_count_illusory"],
+        "endpoint_distance": row["endpoint_distance_one_sided_gated"],
+        "ambiguous_beta": [round(float(x), 1) for x in row["ambiguous_beta_one_sided_gated"]],
+        "state": support_state(row, args),
+        "z_mean_coherent": row["z_mean_coherent"],
+        "z_mean_illusory": row["z_mean_illusory"],
+    }
+
+
+def summarize_row(cases: list[dict[str, Any]]) -> dict[str, Any]:
+    window_cases = [case for case in cases if case["label"].startswith("window_")]
+    blank_windows = [case for case in window_cases if case["state"] == "beta_absent_blank"]
+    beta_windows = [case for case in window_cases if case["state"] == "beta_chart_recovered"]
+    fall_windows = [case for case in window_cases if case["state"] == "support_falls"]
+    obs_sets = [set(case["one_sided_observables"]) for case in window_cases if case["one_sided_observables"]]
+    common_obs = sorted(set.intersection(*obs_sets)) if obs_sets else []
+    union_obs = sorted(set.union(*obs_sets)) if obs_sets else []
+    return {
+        "window_count": len(window_cases),
+        "blank_windows": len(blank_windows),
+        "beta_recovered_windows": len(beta_windows),
+        "support_fall_windows": len(fall_windows),
+        "blank_window_rate": len(blank_windows) / len(window_cases) if window_cases else 0.0,
+        "common_one_sided_observables": common_obs,
+        "union_one_sided_observables": union_obs,
+        "endpoint_distance_mean": float(np.mean([case["endpoint_distance"] for case in window_cases])) if window_cases else 0.0,
+        "stable_count_coherent_mean": float(np.mean([case["stable_count_coherent"] for case in window_cases])) if window_cases else 0.0,
+    }
+
+
+def verdict(row_summaries: dict[str, dict[str, Any]], full_rows: dict[str, dict[str, Any]]) -> str:
+    both_persist = all(summary["blank_window_rate"] == 1.0 for summary in row_summaries.values())
+    any_beta = any(summary["beta_recovered_windows"] > 0 for summary in row_summaries.values())
+    any_fall = any(summary["support_fall_windows"] > 0 for summary in row_summaries.values())
+    jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    if any_beta or any_fall:
+        return "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE"
+    if both_persist and jaccard < 0.5:
+        return "TWO_DISTINCT_BETA_ABSENT_OPERATORS"
+    if both_persist:
+        return "SAME_BETA_ABSENT_OPERATOR"
+    return "RESIDUAL_AMBIGUOUS"
+
+
+def run(args: argparse.Namespace) -> dict[str, Any]:
+    rng = np.random.default_rng(args.seed)
+    specs = build_sequences(args, rng)
+    cases_by_row: dict[str, list[dict[str, Any]]] = {}
+    full_rows: dict[str, dict[str, Any]] = {}
+
+    for name, spec in specs.items():
+        row_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+        cases = [analyze_case(name, "full", spec["base"], args, row_rng)]
+        full_rows[name] = cases[0]
+        for idx, chunk in enumerate(windowed(spec["base"], args.window_gaps, args.window_count), start=1):
+            cases.append(analyze_case(name, f"window_{idx}", chunk, args, row_rng))
+        cases_by_row[name] = cases
+
+    row_summaries = {name: summarize_row(cases) for name, cases in cases_by_row.items()}
+    full_signature_jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    common_window_obs_jaccard = obs_jaccard(
+        row_summaries["numeri_primi:cycle_3"]["common_one_sided_observables"],
+        row_summaries["random_matrix:cycle_7"]["common_one_sided_observables"],
+    )
+
+    output = {
+        "experiment": "boundary_residual_beta_absent_audit",
+        "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
+        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
+        "observables_used": [
+            *OBS_NAMES,
+            "window_state",
+            "blank_window_rate",
+            "full_signature_jaccard",
+            "common_window_obs_jaccard",
+        ],
+        "params": vars(args),
+        "targets": TARGET_ROWS,
+        "observable_contract": {
+            "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
+            "observable": "window_state plus one-sided observable signature",
+            "operator": "canonical order/null gate on target rows only",
+            "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
+            "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
+            "not_tested": "global beta grid, V_c, source GUE/Poisson label validity",
+        },
+        "sequence_sources": {
+            name: {key: value for key, value in spec.items() if key != "base"}
+            for name, spec in specs.items()
+        },
+        "row_summaries": row_summaries,
+        "full_signature_jaccard": full_signature_jaccard,
+        "common_window_obs_jaccard": common_window_obs_jaccard,
+        "verdict": verdict(row_summaries, full_rows),
+        "cases": cases_by_row,
+    }
+
+    out = Path(args.out)
+    out.parent.mkdir(parents=True, exist_ok=True)
+    out.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
+
+    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
+    print(f"targets={TARGET_ROWS}")
+    for name, summary in row_summaries.items():
+        print(
+            f"{name} blank_windows={summary['blank_windows']}/{summary['window_count']} "
+            f"beta_recovered={summary['beta_recovered_windows']} falls={summary['support_fall_windows']} "
+            f"common_obs={summary['common_one_sided_observables']}"
+        )
+    print(f"full_signature_jaccard={full_signature_jaccard:.3f}")
+    print(f"common_window_obs_jaccard={common_window_obs_jaccard:.3f}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+    return output
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--prime-gaps", type=int, default=4096)
+    parser.add_argument("--random-matrix-gaps", type=int, default=4096)
+    parser.add_argument("--window-gaps", type=int, default=1024)
+    parser.add_argument("--window-count", type=int, default=4)
+    parser.add_argument("--gue-matrix-size", type=int, default=64)
+    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("--seed", type=int, default=202605100330)
+    parser.add_argument("--out", default="tools/data/boundary_residual_beta_absent_audit_20260510_0330.json")
+    args = parser.parse_args()
+    run(args)
+
+
+if __name__ == "__main__":
+    main()

codex
Esperimento completato e report scritto in [agent_20260510_0330.md](/opt/MM_D-ND/tools/data/reports/agent_20260510_0330.md).

Ho aggiunto lo script riusabile [exp_boundary_residual_beta_absent_audit.py](/opt/MM_D-ND/tools/exp_boundary_residual_beta_absent_audit.py) e il dataset prodotto in [boundary_residual_beta_absent_audit_20260510_0330.json](/opt/MM_D-ND/tools/data/boundary_residual_beta_absent_audit_20260510_0330.json).

Risultato centrale: `medium/strong beta-absent` non matura come classe unica. `numeri_primi:cycle_3` resta blank in 4/4 finestre; `random_matrix:cycle_7` recupera beta `[0.4]` in 1/4 finestre. Ho aggiornato anche `tools/data/reports/latest.md`.

Verifiche: `py_compile` passato, `structural_check.py` senza anti-pattern.
diff --git a/tools/data/reports/agent_20260510_0330.md b/tools/data/reports/agent_20260510_0330.md
new file mode 100644
index 0000000000000000000000000000000000000000..cc01f0170fd72cca30c20faffc73245dcb3f4f72
--- /dev/null
+++ b/tools/data/reports/agent_20260510_0330.md
@@ -0,0 +1,98 @@
+# Agent Report - Boundary Residual Beta-Absent Audit
+**Date**: 2026-05-10 03:30  
+**Piano**: 114  
+**Tension explored**: BOUNDARY (0.8)  
+**verdict**: CONSTRAINT - il residuo beta-absent non e' una classe unica chiusa  
+observables_registry: 1.0.0-2026-05-06  
+observables_used: [SR, SR2, L1, L2, triple_var, window_state, blank_window_rate, full_signature_jaccard, common_window_obs_jaccard]  
+**observable_contract**: claim=le due righe residue beta-absent sono strutturali solo se `beta_absent_blank` persiste in finestre row-local da 1024 gap; observable=`window_state` + firma degli osservabili one-sided; operator=`exp_boundary_residual_beta_absent_audit.py`; generator=`numeri_primi` da `dnd_autoricerca.genera_segnale` e `random_matrix` da `gue_spacing_blocks`; denominator=2 righe aperte BOUNDARY, full row + 4 finestre row-local da 1024 gap; non_possible=classe residua unica se una riga recupera beta o perde supporto nelle finestre row-local; not_tested=griglia beta globale, fit `V_c`, validita' label sorgente GUE/Poisson.
+
+## Respiro fuori-tempo
+
+- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + residui `numeri_primi:cycle_3` / `random_matrix:cycle_7`.
+- **Dipolo / punto-zero**: blank strutturale / blank da atlante. Punto-zero: la stessa misura row-local da 1024 gap che decide se la beta manca per struttura o riappare per scelta di finestra.
+- **Piano superiore**: topologia assiomatica del bordo: la classe globale cade se una carta locale riapre la coordinata beta.
+- **Operatori laterali scelti**: boundary operator, chart locale, filtrazione. Il boundary operator separa supporto e beta; la chart locale testa la finestra senza rifare il mondo; la filtrazione conserva il denominatore row-aligned.
+- **Contaminazione cognitiva**: CE-0019 usato come contratto combo prima della misura; CE-0022 usato come boundary operator + chart locale; KSAR usato come reiterazione sul deposito 15:32-18:39 senza ridisegnare il perimetro.
+- **Proto-ipotesi**: il residuo medio/forte beta-absent e' una classe unica solo se entrambi i target restano blank in tutte le finestre row-local e conservano una firma osservabile compatibile.
+- **Proiezione**: applico il gate canonico ordine/null alle sole due righe residue, poi confronto persistenza del blank e Jaccard delle firme one-sided.
+
+## Aderenza alla direzione
+
+- `relation`: follows_direction
+- `why`: attacca direttamente i due residui beta-absent medio/forti lasciati dal valutatore dopo `thin_persist_rows=0/13`.
+- `not_drift`: non usa `V_c`, non usa label GUE/Poisson come campo decisionale, non rigenera la griglia beta globale.
+
+## Claim Under Test
+
+> I due residui `numeri_primi:cycle_3` e `random_matrix:cycle_7` formano una classe unica `medium/strong beta-absent` se il blank persiste in tutte le finestre row-local da 1024 gap e le firme one-sided restano compatibili.
+
+## Question
+
+I due blank residui sono lo stesso operatore di confine, due classi distinte, o un artefatto da denominatore/atlante?
+
+## Experiment Design
+
+- Perimetro atomico: `numeri_primi:cycle_3`, `random_matrix:cycle_7`.
+- Scope: full row + 4 finestre consecutive da 1024 gap per ciascun target.
+- Parametri: `n_replicates=12`, `n_beta=11`, `n_baseline=24`, `z_min=2.0`, seed `202605100330`.
+- Null baseline: permutazione marginal-preserving usata dal gate canonico gia' adottato nei report BOUNDARY.
+- Non misurato: `gap_ratio`, `V_c`, nuova griglia beta globale, validita' delle label sorgente GUE/Poisson.
+- Criterio di caduta: una riga recupera beta o perde supporto in una finestra row-local; in quel caso il residuo non e' classe unica chiusa.
+
+## Results
+
+| row | full state | full one-sided | window blanks | beta recovered | support falls | common window obs | mean endpoint | mean stable coherent |
+|---|---:|---|---:|---:|---:|---|---:|---:|
+| numeri_primi:cycle_3 | beta_absent_blank | SR,L1,triple_var | 4/4 | 0 | 0 | SR | 2.761 | 2.563 |
+| random_matrix:cycle_7 | beta_absent_blank | SR,SR2,L1,L2,triple_var | 3/4 | 1 | 0 | L2 | 2.987 | 3.083 |
+
+| comparison | value |
+|---|---:|
+| full_signature_jaccard | 0.600 |
+| common_window_obs_jaccard | 0.000 |
+| random_matrix recovered beta | window_4 -> beta [0.4] |
+
+## Key Findings
+
+1. **Verificato: `numeri_primi:cycle_3` resta beta-absent in 4/4 finestre.** Il supporto non cade; l'osservabile comune di finestra e' `SR`.
+2. **Verificato: `random_matrix:cycle_7` non resta beta-absent in 4/4 finestre.** La quarta finestra recupera beta `[0.4]` con supporto vivo (`SR2,L1,L2,triple_var`).
+3. **Verificato: le firme comuni di finestra divergono.** `common_window_obs_jaccard=0.000`: primi conserva `SR`, random matrix conserva `L2`.
+4. **Inferito dal perimetro dichiarato: il residuo beta-absent non e' una classe unica chiusa.** Una parte e' blank persistente row-local, una parte e' chart-sensitive.
+
+## Verdict
+
+**CONSTRAINT**.
+
+Nel perimetro delle due righe residue e finestre da 1024 gap, `medium/strong beta-absent` si scinde:
+
+`numeri_primi:cycle_3` = blank persistente row-local.  
+`random_matrix:cycle_7` = blank forte ma chart-sensitive, con beta `[0.4]` recuperata in 1/4 finestre.
+
+Formula valida:
+
+`beta_absent_residue` non matura come classe unica; diventa un audit a due stati: `prime_persistent_blank` / `random_matrix_chart_sensitive_blank`.
+
+## Bicono della scoperta
+
+- **Due radici**: blank persistente / blank chart-sensitive.
+- **Singolare**: supporto ordine/null vivo senza coordinata beta globale.
+- **Invariante di passaggio**: il supporto non cade in nessuna delle 8 finestre; cio' che cambia e' la coordinata beta e la firma osservabile.
+- **Campo di possibilità**: possibile = chiudere la tassonomia BOUNDARY con due sotto-stati residui; non-possibile = promuovere `medium/strong beta-absent` come specie unica del confine.
+
+## Consecutio
+
+Il prossimo ciclo non deve riaprire il thin blank. Deve sigillare il nuovo audit a due stati:
+
+- `prime_persistent_blank`: testare se `SR` resta l'osservabile comune sotto seed/window shift.
+- `random_matrix_chart_sensitive_blank`: testare se beta `[0.4]` e' coordinata locale stabile o evento di una singola finestra.
+
+## Ricadute pratiche
+
+ssp_value: yes. Lo script e' uno strumento riusabile per audit row-local di residui BOUNDARY senza rigenerare fit globali.
+
+## Files
+
+- Script: `tools/exp_boundary_residual_beta_absent_audit.py`
+- Data: `tools/data/boundary_residual_beta_absent_audit_20260510_0330.json`
+- Report: `tools/data/reports/agent_20260510_0330.md`
diff --git a/tools/exp_boundary_residual_beta_absent_audit.py b/tools/exp_boundary_residual_beta_absent_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b2b02258d429ae60f10356011447760e95f5cb8
--- /dev/null
+++ b/tools/exp_boundary_residual_beta_absent_audit.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+"""
+Targeted audit for the two medium/strong beta-absent BOUNDARY residues.
+
+This does not rebuild the global beta atlas. It tests only the two open rows
+from the 13-row taxonomy (`numeri_primi:cycle_3`, `random_matrix:cycle_7`) with
+row-local windows and the same canonical observable gate used by the prior
+BOUNDARY reports.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from typing import Any
+
+import numpy as np
+
+from exp_boundary_short_denominator_extension import gue_spacing_blocks
+from exp_semireal_boundary_transfer_gate import row_spacings
+from exp_semireal_order_denominator_gate import analyze_sequence, compact, normalize
+from observables_registry import OBSERVABLES_CANONICAL, OBSERVABLES_REGISTRY_VERSION
+
+
+TARGET_ROWS = ("numeri_primi:cycle_3", "random_matrix:cycle_7")
+OBS_NAMES = list(OBSERVABLES_CANONICAL.keys())
+
+
+def windowed(values: np.ndarray, size: int, count: int) -> list[np.ndarray]:
+    chunks = []
+    for idx in range(count):
+        start = idx * size
+        end = start + size
+        if end <= len(values):
+            chunks.append(normalize(values[start:end]))
+    return chunks
+
+
+def support_state(row: dict[str, Any], args: argparse.Namespace) -> str:
+    one_sided = len(row.get("coherent_one_sided_observables", []))
+    illusory = float(row.get("stable_count_illusory") or 0.0)
+    endpoint = float(row.get("endpoint_distance_one_sided_gated") or 0.0)
+    beta = row.get("ambiguous_beta_one_sided_gated", [])
+    transfers = (
+        one_sided >= args.min_one_sided
+        and illusory <= args.illusory_residue_max
+        and endpoint >= args.endpoint_distance_min
+    )
+    if not transfers:
+        return "support_falls"
+    if beta:
+        return "beta_chart_recovered"
+    return "beta_absent_blank"
+
+
+def obs_jaccard(left: list[str], right: list[str]) -> float:
+    a = set(left)
+    b = set(right)
+    if not a and not b:
+        return 1.0
+    return len(a & b) / len(a | b)
+
+
+def build_sequences(args: argparse.Namespace, rng: np.random.Generator) -> dict[str, dict[str, Any]]:
+    prime = row_spacings("numeri_primi")
+    prime = normalize(prime[: args.prime_gaps])
+
+    gue_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+    random_matrix = gue_spacing_blocks(args.random_matrix_gaps, args.gue_matrix_size, gue_rng)
+
+    return {
+        "numeri_primi:cycle_3": {
+            "base": prime,
+            "domain": "numeri_primi",
+            "generator": "dnd_autoricerca.genera_segnale -> prime gap spacings",
+            "source_n_gaps": int(len(prime)),
+        },
+        "random_matrix:cycle_7": {
+            "base": random_matrix,
+            "domain": "random_matrix",
+            "generator": "gue_spacing_blocks",
+            "source_n_gaps": int(len(random_matrix)),
+        },
+    }
+
+
+def analyze_case(name: str, label: str, base: np.ndarray, args: argparse.Namespace, rng: np.random.Generator) -> dict[str, Any]:
+    perimeters = {f"{name}/{label}": analyze_sequence(f"{name}/{label}", base, args, rng)}
+    row = compact(perimeters)[f"{name}/{label}"]
+    return {
+        "label": label,
+        "n_gaps": row["n_gaps"],
+        "one_sided_observables": row["coherent_one_sided_observables"],
+        "one_sided_count": len(row["coherent_one_sided_observables"]),
+        "endpoint_stable_observables": row["endpoint_stable_observables"],
+        "stable_count_coherent": row["stable_count_coherent"],
+        "stable_count_illusory": row["stable_count_illusory"],
+        "endpoint_distance": row["endpoint_distance_one_sided_gated"],
+        "ambiguous_beta": [round(float(x), 1) for x in row["ambiguous_beta_one_sided_gated"]],
+        "state": support_state(row, args),
+        "z_mean_coherent": row["z_mean_coherent"],
+        "z_mean_illusory": row["z_mean_illusory"],
+    }
+
+
+def summarize_row(cases: list[dict[str, Any]]) -> dict[str, Any]:
+    window_cases = [case for case in cases if case["label"].startswith("window_")]
+    blank_windows = [case for case in window_cases if case["state"] == "beta_absent_blank"]
+    beta_windows = [case for case in window_cases if case["state"] == "beta_chart_recovered"]
+    fall_windows = [case for case in window_cases if case["state"] == "support_falls"]
+    obs_sets = [set(case["one_sided_observables"]) for case in window_cases if case["one_sided_observables"]]
+    common_obs = sorted(set.intersection(*obs_sets)) if obs_sets else []
+    union_obs = sorted(set.union(*obs_sets)) if obs_sets else []
+    return {
+        "window_count": len(window_cases),
+        "blank_windows": len(blank_windows),
+        "beta_recovered_windows": len(beta_windows),
+        "support_fall_windows": len(fall_windows),
+        "blank_window_rate": len(blank_windows) / len(window_cases) if window_cases else 0.0,
+        "common_one_sided_observables": common_obs,
+        "union_one_sided_observables": union_obs,
+        "endpoint_distance_mean": float(np.mean([case["endpoint_distance"] for case in window_cases])) if window_cases else 0.0,
+        "stable_count_coherent_mean": float(np.mean([case["stable_count_coherent"] for case in window_cases])) if window_cases else 0.0,
+    }
+
+
+def verdict(row_summaries: dict[str, dict[str, Any]], full_rows: dict[str, dict[str, Any]]) -> str:
+    both_persist = all(summary["blank_window_rate"] == 1.0 for summary in row_summaries.values())
+    any_beta = any(summary["beta_recovered_windows"] > 0 for summary in row_summaries.values())
+    any_fall = any(summary["support_fall_windows"] > 0 for summary in row_summaries.values())
+    jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    if any_beta or any_fall:
+        return "RESIDUAL_ATLAS_ARTIFACT_OR_UNSTABLE"
+    if both_persist and jaccard < 0.5:
+        return "TWO_DISTINCT_BETA_ABSENT_OPERATORS"
+    if both_persist:
+        return "SAME_BETA_ABSENT_OPERATOR"
+    return "RESIDUAL_AMBIGUOUS"
+
+
+def run(args: argparse.Namespace) -> dict[str, Any]:
+    rng = np.random.default_rng(args.seed)
+    specs = build_sequences(args, rng)
+    cases_by_row: dict[str, list[dict[str, Any]]] = {}
+    full_rows: dict[str, dict[str, Any]] = {}
+
+    for name, spec in specs.items():
+        row_rng = np.random.default_rng(rng.integers(0, 2**63 - 1))
+        cases = [analyze_case(name, "full", spec["base"], args, row_rng)]
+        full_rows[name] = cases[0]
+        for idx, chunk in enumerate(windowed(spec["base"], args.window_gaps, args.window_count), start=1):
+            cases.append(analyze_case(name, f"window_{idx}", chunk, args, row_rng))
+        cases_by_row[name] = cases
+
+    row_summaries = {name: summarize_row(cases) for name, cases in cases_by_row.items()}
+    full_signature_jaccard = obs_jaccard(
+        full_rows["numeri_primi:cycle_3"]["one_sided_observables"],
+        full_rows["random_matrix:cycle_7"]["one_sided_observables"],
+    )
+    common_window_obs_jaccard = obs_jaccard(
+        row_summaries["numeri_primi:cycle_3"]["common_one_sided_observables"],
+        row_summaries["random_matrix:cycle_7"]["common_one_sided_observables"],
+    )
+
+    output = {
+        "experiment": "boundary_residual_beta_absent_audit",
+        "question": "Are the two medium/strong beta-absent BOUNDARY residues the same operator, distinct classes, or atlas artifacts?",
+        "observables_registry": OBSERVABLES_REGISTRY_VERSION,
+        "observables_used": [
+            *OBS_NAMES,
+            "window_state",
+            "blank_window_rate",
+            "full_signature_jaccard",
+            "common_window_obs_jaccard",
+        ],
+        "params": vars(args),
+        "targets": TARGET_ROWS,
+        "observable_contract": {
+            "claim": "the two residual beta-absent blanks are structural only if beta_absent_blank persists across row-local 1024-gap windows",
+            "observable": "window_state plus one-sided observable signature",
+            "operator": "canonical order/null gate on target rows only",
+            "denominator": "two open BOUNDARY rows; full row plus row-local 1024-gap windows",
+            "non_possible": "residual class if a target recovers beta or loses support under row-local windows",
+            "not_tested": "global beta grid, V_c, source GUE/Poisson label validity",
+        },
+        "sequence_sources": {
+            name: {key: value for key, value in spec.items() if key != "base"}
+            for name, spec in specs.items()
+        },
+        "row_summaries": row_summaries,
+        "full_signature_jaccard": full_signature_jaccard,
+        "common_window_obs_jaccard": common_window_obs_jaccard,
+        "verdict": verdict(row_summaries, full_rows),
+        "cases": cases_by_row,
+    }
+
+    out = Path(args.out)
+    out.parent.mkdir(parents=True, exist_ok=True)
+    out.write_text(json.dumps(output, indent=2) + "\n", encoding="utf-8")
+
+    print(f"observables_registry={OBSERVABLES_REGISTRY_VERSION}")
+    print(f"targets={TARGET_ROWS}")
+    for name, summary in row_summaries.items():
+        print(
+            f"{name} blank_windows={summary['blank_windows']}/{summary['window_count']} "
+            f"beta_recovered={summary['beta_recovered_windows']} falls={summary['support_fall_windows']} "
+            f"common_obs={summary['common_one_sided_observables']}"
+        )
+    print(f"full_signature_jaccard={full_signature_jaccard:.3f}")
+    print(f"common_window_obs_jaccard={common_window_obs_jaccard:.3f}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+    return output
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--prime-gaps", type=int, default=4096)
+    parser.add_argument("--random-matrix-gaps", type=int, default=4096)
+    parser.add_argument("--window-gaps", type=int, default=1024)
+    parser.add_argument("--window-count", type=int, default=4)
+    parser.add_argument("--gue-matrix-size", type=int, default=64)
+    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("--seed", type=int, default=202605100330)
+    parser.add_argument("--out", default="tools/data/boundary_residual_beta_absent_audit_20260510_0330.json")
+    args = parser.parse_args()
+    run(args)
+
+
+if __name__ == "__main__":
+    main()

tokens used
118,102
Esperimento completato e report scritto in [agent_20260510_0330.md](/opt/MM_D-ND/tools/data/reports/agent_20260510_0330.md).

Ho aggiunto lo script riusabile [exp_boundary_residual_beta_absent_audit.py](/opt/MM_D-ND/tools/exp_boundary_residual_beta_absent_audit.py) e il dataset prodotto in [boundary_residual_beta_absent_audit_20260510_0330.json](/opt/MM_D-ND/tools/data/boundary_residual_beta_absent_audit_20260510_0330.json).

Risultato centrale: `medium/strong beta-absent` non matura come classe unica. `numeri_primi:cycle_3` resta blank in 4/4 finestre; `random_matrix:cycle_7` recupera beta `[0.4]` in 1/4 finestre. Ho aggiornato anche `tools/data/reports/latest.md`.

Verifiche: `py_compile` passato, `structural_check.py` senza anti-pattern.
