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: 019e0d6c-f758-76a0-9ec3-4d8de5a00bfb
--------
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_20260509_1548.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. Poi controllerò eventuali direttive one-shot e le memorie condivise recenti, perché in questo lab quelle possono cambiare la tensione da attaccare.
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=9, T=7, E=4, R=4
**Generatrici/strade dense**:
- disc_5: 3 ghost · Metrica primi g=(p/2)², curvatura GUE r=0.503
- report_20260509_1538: 3 ghost · Agent Report - Boundary Row-Aligned Nonexact Audit
- 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_1538 NEXT_CYCLE/high
- Perche': Il ciclo ha prodotto una correzione strutturale del denominatore: le righe support-transfer non esatte sono 7, non 6, e si dividono in cinque failure modes misurabili. Non c'e' dipendenza dall'operatore: la prossima mossa naturale e' falsificare se quei failure modes sono stabili o se sono artefatto della griglia beta e del perimetro row-aligned.
- Nota: Continuare un giro: il deep-dive locale resta produttivo perche' ha appena trasformato un conteggio ereditato errato in una partizione falsificabile.

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;
- buco / ponte;

exec
/bin/bash -lc "test -f tools/data/operator_directive.md && sed -n '1,220p' tools/data/operator_directive.md || true" in /opt/MM_D-ND
 succeeded in 0ms:
exec
/bin/bash -lc 'ls -t shared_memory/*.md 2>/dev/null | head -10' in /opt/MM_D-ND
 succeeded in 0ms:
shared_memory/deposito_cambia_la_parola_non_regola_2026-05-07.md
shared_memory/feedback_indeterminato_reitera_con_sistema_2026-05-07.md
shared_memory/README.md

exec
/bin/bash -lc "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 ancora al confine GUE/Poisson e alla correzione row-aligned dei failure modes: non serve una conferma generica, serve falsificare se la partizione regge cambiando griglia e perimetro. Ora leggo il deposito recente e individuo gli script/dati già prodotti per riusare la base invece di ricostruirla.
exec
/bin/bash -lc "sed -n '1,220p' shared_memory/deposito_cambia_la_parola_non_regola_2026-05-07.md" in /opt/MM_D-ND
 succeeded in 0ms:
---
type: deposito_osservativo
author: TM3 (deposito di una conversazione operatore)
date: 2026-05-07
scope: cross-agent
status: decristallizzato_07-05_pomeriggio
priority: low
---

# Deposito — non regola

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

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

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

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

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

E:

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

## Cosa significa

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

## Distinzione operativa che resta

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

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

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

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

## Cosa è stato decristallizzato

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

## Esempio dimostrativo (07/05)

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

## Anti-pattern futuro per TM3

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

## Cross-link

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

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

# Indeterminato → reitera con il sistema fino all'emersione

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

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

## Why

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

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

## How to apply (per qualsiasi agente)

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

## Anti-pattern

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

## Cross-link

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

exec
/bin/bash -lc "env | grep -E 'ANTHROPIC_API_KEY|OPENAI_API_KEY' || true" in /opt/MM_D-ND
 succeeded in 0ms:
exec
/bin/bash -lc "rg -n \"Boundary|row-aligned|support-transfer|failure modes|no_cross|order_memory|periodic_closure\" tools/data/reports tools -g '*.md' -g '*.py'" in /opt/MM_D-ND
 succeeded in 0ms:
tools/LAB_AGENT_CONTEXT.md:132:- **Denominatori row-aligned.** Se confronti un gate candidati con un audit
tools/LAB_AGENT_CONTEXT.md:134:  Non saldare `accepted=96` da una tabella candidati con `no_cross=9/12` da
tools/LAB_AGENT_CONTEXT.md:136:  row-aligned (`candidate_id` condiviso) oppure formula la divergenza fra
tools/LAB_AGENT_CONTEXT.md:147:  qualificatore. Formula con count e perimetro: `order_memory produce
tools/LAB_AGENT_CONTEXT.md:148:  crossing-or-multi in 830/837 accepted rows, con 7 no_cross da isolare`;
tools/LAB_AGENT_CONTEXT.md:149:  `periodic_closure disaccoppia in 873/1179, ma ha 306 internal_cross`.
tools/data/reports/agent_20260509_1337.md:8:**observable_contract**: claim=`fit(V_c)` e' ammesso solo quando il denominatore e' fit-ready; observable=stato strutturale del denominatore e curva `vc_median_fit_ready`; operator=lettura del deposito 08:46 con separazione `complete/contaminated/broken/absent`; generator=classi `reference_order`, `order_memory`, `periodic_closure`, `random_dispersion`; denominator=JSON `vc_generator_class_direction_audit_20260509_0846`, livelli separati `per_mode_best` e `accepted_candidates`, soglie `r={0.48,0.50,0.52}`, N={89,144,233,377}; non_possible=righe `no_cross` e `floor_hit` non entrano nel fit e restano massa esclusa; not_tested=nuovi spettri, nuovi N, nuovi generatori, gap_ratio, power-law non lineare.
tools/data/reports/agent_20260509_1337.md:33:- Nessun nuovo spettro calcolato: il ciclo misura il deposito row-aligned del ciclo precedente.
tools/data/reports/agent_20260509_1337.md:39:- Contratto osservabile-operatore: `vc_defined = event in {internal_cross, internal_multi}`; `fit_ready = vc_defined and vc_interp is not null`; `no_cross/floor_hit` sono massa esclusa, non missing neutro.
tools/data/reports/agent_20260509_1337.md:57:| order_memory | complete | 48/48 | 0 | 1.317 -> 0.774 | -0.001833 |
tools/data/reports/agent_20260509_1337.md:58:| periodic_closure | contaminated | 36/47 | 11 no_cross | 0.999 -> 0.650 | -0.000913 |
tools/data/reports/agent_20260509_1337.md:65:| order_memory | contaminated | 278/279 | 1 no_cross | 1.350 -> 0.899 | -0.001628 |
tools/data/reports/agent_20260509_1337.md:66:| periodic_closure | broken | 102/393 | 291 no_cross | 1.593 -> 0.605 | -0.017960 |
tools/data/reports/agent_20260509_1337.md:68:Accepted `order_memory` a `r=0.52`:
tools/data/reports/agent_20260509_1337.md:72:| order_memory | complete | 279/279 | 0 | 1.236 -> 0.781 | -0.001606 |
tools/data/reports/agent_20260509_1337.md:75:1. **Verificato: il fit completo esiste nel livello best-per-mode per `reference_order` e `order_memory`.** A `r=0.50`, `reference_order` ha 16/16 righe fit-ready e `order_memory` ha 48/48.
tools/data/reports/agent_20260509_1337.md:76:2. **Verificato: sugli accepted, `periodic_closure` e' broken a tutte le soglie.** A `r=0.50`, 291/393 righe sono `no_cross`; N=233 e N=377 non hanno punti fit-ready, quindi la curva non puo' essere letta come scala.
tools/data/reports/agent_20260509_1337.md:78:4. **Verificato: `order_memory` accepted si pulisce a `r=0.52`.** Passa da `contaminated` a `r=0.50` con 1 no_cross a `complete` a `r=0.52` con 279/279 righe fit-ready. La soglia modifica il denominatore, non solo il valore del fit.
tools/data/reports/agent_20260509_1337.md:84:Nel perimetro 08:46 -> 13:37, `order_memory` conserva un canale fittabile; `periodic_closure` conserva label ma rompe il denominatore sugli accepted; `random_dispersion` raggiunge il floor e non fornisce curva interna a N=377. Il claim corretto e':
tools/data/reports/agent_20260509_1337.md:91:- **Invariante di passaggio**: `fit_ready` sopravvive su `order_memory`; non sopravvive su `periodic_closure` accepted e su `random_dispersion` al bordo alto.
tools/data/reports/agent_20260509_1337.md:92:- **Campo di possibilita**: qui diventa possibile fittare `V_c` solo nel sottografo fit-ready; qui diventa non-possibile usare `no_cross` o `floor_hit` come missing data neutro.
tools/data/reports/agent_20260509_1337.md:102:- **L4 edge cases**: `order_memory` accepted a `r=0.50` ha 1 no_cross; per questo e' `contaminated`, non `complete`.
tools/exp_vc_generator_class_direction_audit.py:25:        return "order_memory"
tools/exp_vc_generator_class_direction_audit.py:27:        return "periodic_closure"
tools/exp_vc_generator_class_direction_audit.py:88:        for event in ("internal_cross", "internal_multi", "no_cross", "floor_hit"):
tools/exp_vc_generator_class_direction_audit.py:200:            "excluded_mass_policy": "Keep no_cross/floor_hit outside fit denominators and report them as excluded mass.",
tools/data/reports/agent_20260430_1905.md:1:# Agent Report — Observable Coherence at the GUE-Poisson Boundary: Primes Are Not "Between" — They Are Dipolar
tools/data/reports/agent_20260509_0819.md:65:| periodic_approximant_21 | 3 | no_cross=3 |  | 0.750 | 0.153 | 0.740 |
tools/data/reports/agent_20260509_0819.md:71:4. **Verificato: il periodic approximant 21 conserva label-set ma rompe `V_c`.** Le `3/3` righe evento sono `no_cross`; quindi label-preserving e boundary-crossing divergono.
tools/exp_two_channel_boundary.py:3:exp_two_channel_boundary.py — Two-Channel Boundary Separation
tools/data/reports/agent_20260507_0330.md:1:# Agent Report — The GUE-Poisson Boundary Is a Denominator Collapse Layer
tools/data/reports/agent_20260417_0803.md:1:# Agent Report — The Dipolar-Illusory Boundary: PNT-Normalization Recovers All-Negative ACF, Crossover at Lag 6
tools/exp_vc_label_preserving_swap_gate.py:66:        event = "no_cross"
tools/data/reports/agent_20260509_0846.md:7:observables_used: [`generator_class`, `source_mode`, `event_type`, `vc_interp`, `label_jaccard`, `hamming_ratio`, `internal_cross_rate`, `no_cross_rate`, `floor_hit_rate`] - osservabili domain-native, non canonici SR/SR2/L1/L2/triple_var
tools/data/reports/agent_20260509_0846.md:8:**observable_contract**: claim=il fit di scala di `V_c` rientra solo dopo tipizzazione del generatore; observable=`vc_median` e rate di evento separati per `generator_class` e `r_threshold`; operator=audit direzionale sul deposito row-aligned `agent_20260509_0837`, senza ricomputare spettri; generator=classi `reference_order`, `order_memory`, `periodic_closure`, `random_dispersion`; denominator=JSON `vc_generator_class_scale_gate_20260509_0837`, `N={89,144,233,377}`, phase `{0,0.25,0.5,0.75}`, soglie `r={0.48,0.50,0.52}`, livelli separati `per_mode_best` e `accepted_candidates`; non_possible=se una classe produce `no_cross`, `V_c` non esiste per quelle righe e il fit di scala non e' definito; not_tested=nuovi N oltre 377, nuovi generatori, nuovo calcolo spettrale, gap_ratio, power-law fit parametrico.
tools/data/reports/agent_20260509_0846.md:13:- **Dipolo / punto-zero**: `V_c` come valore / `V_c` come evento definito; punto-zero = la riga prima della classificazione `internal_cross/no_cross/floor_hit`, dove il valore e la sua esistenza non sono ancora separati.
tools/data/reports/agent_20260509_0846.md:20:  - **PVI attack**: un trend numerico di `vc_median` e' illegittimo quando il denominatore perde le righe `no_cross`; per questo il report separa trend e rate evento.
tools/data/reports/agent_20260509_0846.md:21:- **Proto-ipotesi**: `V_c` ha una direzione di scala leggibile solo per le classi che mantengono `internal_cross`. Dove la classe produce `no_cross`, la scala non e' un cattivo fit: e' non-definita per costruzione osservabile.
tools/data/reports/agent_20260509_0846.md:25:> Nel perimetro `N={89,144,233,377}`, la scala di `V_c` e' interpretabile solo dopo il gate `generator_class + event_type`: `order_memory` resta fittabile, `periodic_closure` diventa non-fittabile quando gli accepted sono `no_cross`, `random_dispersion` non entra negli accepted.
tools/data/reports/agent_20260509_0846.md:34:- Classi: `reference_order=phi_sturmian`, `order_memory=block_shuffle_*`, `periodic_closure=periodic_approximant_*`, `random_dispersion=balanced_random+markov_density`.
tools/data/reports/agent_20260509_0846.md:47:| order_memory | 1.317 | 1.174 | 1.042 | 0.774 | -0.543 |
tools/data/reports/agent_20260509_0846.md:48:| periodic_closure | 0.999 | 0.662 | 0.648 | 0.650 | -0.349 |
tools/data/reports/agent_20260509_0846.md:56:| order_memory internal_cross | 12/12 | 12/12 | 12/12 | 11/12 + 1 internal_multi |
tools/data/reports/agent_20260509_0846.md:57:| periodic_closure internal_cross | 11/11 | 9/12 | 9/12 | 7/12 |
tools/data/reports/agent_20260509_0846.md:58:| periodic_closure no_cross | 0/11 | 3/12 | 3/12 | 5/12 |
tools/data/reports/agent_20260509_0846.md:65:| order_memory events | 98 internal_cross + 6 internal_multi / 104 | 29 internal_cross / 29 | 116 internal_cross + 1 internal_multi + 1 no_cross / 118 | 27 internal_cross + 1 internal_multi / 28 |
tools/data/reports/agent_20260509_0846.md:66:| order_memory vc_median | 1.350 | 1.341 | 1.229 | 0.899 |
tools/data/reports/agent_20260509_0846.md:67:| periodic_closure events | 99 internal_cross / 99 | 3 internal_cross + 48 no_cross / 51 | 144 no_cross / 144 | 99 no_cross / 99 |
tools/data/reports/agent_20260509_0846.md:68:| periodic_closure vc_median | 1.593 | 0.605 | non definito | non definito |
tools/data/reports/agent_20260509_0846.md:72:1. **Verificato: `order_memory` resta fittabile nel perimetro testato.** Sugli accepted a `r=0.50`, `order_memory` conserva evento definito in `278/279` righe con crossing o multi-crossing, con un solo `no_cross` a N=233 contato nel deposito come edge case.
tools/data/reports/agent_20260509_0846.md:73:2. **Verificato: `periodic_closure` perde il denominatore `V_c` sugli accepted al crescere di N.** A N=233 produce `144/144 no_cross`; a N=377 produce `99/99 no_cross`. In queste righe `vc_interp=None`, quindi il fit non e' un fit povero: non e' definito.
tools/data/reports/agent_20260509_0846.md:74:3. **Verificato: il livello `per_mode_best` e il livello `accepted_candidates` dicono cose diverse.** Nel best-per-mode, `periodic_closure` conserva ancora alcuni crossing a N=233 e N=377; negli accepted candidati gli stessi N collassano a `no_cross` pieno. I due livelli non vanno saldati.
tools/data/reports/agent_20260509_0846.md:81:Nel perimetro `N={89,144,233,377}`, `order_memory` permette una curva di scala perche' mantiene crossing sugli accepted; `periodic_closure` accetta label ma rende `V_c` non definito a N=233 e N=377; `random_dispersion` resta fuori dal gate accepted. Il claim corretto non e' "il modello non e' power-law"; e':
tools/data/reports/agent_20260509_0846.md:89:- **Campo di possibilita**: qui diventa possibile rifare il fit di scala su denominatori validi e tipizzati; qui diventa non-possibile fittare `V_c` aggregando `internal_cross`, `no_cross` e `floor_hit`.
tools/data/reports/agent_20260509_0846.md:92:Il prossimo ciclo non deve aggiungere un nuovo fit. Deve promuovere nel contratto dello script una colonna esplicita `vc_defined` e produrre una tabella fit-ready per classe: solo righe `internal_cross/internal_multi`, con `no_cross` e `floor_hit` riportati come massa esclusa, non come assenza di dato neutra.
tools/data/reports/agent_20260509_0846.md:99:- **L4 edge cases**: `periodic_closure` a N=89 accepted ha `99/99 internal_cross`; la caduta non e' universale su ogni N, e' transizione del denominatore sugli N alti del perimetro.
tools/evolution_report.md:2:Il passo ha incontrato una consecutio che nominava 6 righe non-esatte e non ha forzato il deposito a obbedire. Ha riaperto la matrice row-aligned, separato supporto e coordinata beta, e lasciato emergere il denominatore reale: 13 righe totali, 11 support-transfer, 7 support-transfer non esatte.
tools/evolution_report.md:9:Latenza secondaria: il report porta ancora molto scaffold narrativo rispetto a una traiettoria netta. Il gesto bastava: leggere row-aligned, rifiutare le label come operatore, classificare i failure modes.
tools/evolution_report.md:19:Le 7 righe non-esatte sono ora un perimetro leggibile: non residuo unico, ma matrice di failure modes.
tools/data/reports/agent_20260509_1337.md:8:**observable_contract**: claim=`fit(V_c)` e' ammesso solo quando il denominatore e' fit-ready; observable=stato strutturale del denominatore e curva `vc_median_fit_ready`; operator=lettura del deposito 08:46 con separazione `complete/contaminated/broken/absent`; generator=classi `reference_order`, `order_memory`, `periodic_closure`, `random_dispersion`; denominator=JSON `vc_generator_class_direction_audit_20260509_0846`, livelli separati `per_mode_best` e `accepted_candidates`, soglie `r={0.48,0.50,0.52}`, N={89,144,233,377}; non_possible=righe `no_cross` e `floor_hit` non entrano nel fit e restano massa esclusa; not_tested=nuovi spettri, nuovi N, nuovi generatori, gap_ratio, power-law non lineare.
tools/data/reports/agent_20260509_1337.md:33:- Nessun nuovo spettro calcolato: il ciclo misura il deposito row-aligned del ciclo precedente.
tools/data/reports/agent_20260509_1337.md:39:- Contratto osservabile-operatore: `vc_defined = event in {internal_cross, internal_multi}`; `fit_ready = vc_defined and vc_interp is not null`; `no_cross/floor_hit` sono massa esclusa, non missing neutro.
tools/data/reports/agent_20260509_1337.md:57:| order_memory | complete | 48/48 | 0 | 1.317 -> 0.774 | -0.001833 |
tools/data/reports/agent_20260509_1337.md:58:| periodic_closure | contaminated | 36/47 | 11 no_cross | 0.999 -> 0.650 | -0.000913 |
tools/data/reports/agent_20260509_1337.md:65:| order_memory | contaminated | 278/279 | 1 no_cross | 1.350 -> 0.899 | -0.001628 |
tools/data/reports/agent_20260509_1337.md:66:| periodic_closure | broken | 102/393 | 291 no_cross | 1.593 -> 0.605 | -0.017960 |
tools/data/reports/agent_20260509_1337.md:68:Accepted `order_memory` a `r=0.52`:
tools/data/reports/agent_20260509_1337.md:72:| order_memory | complete | 279/279 | 0 | 1.236 -> 0.781 | -0.001606 |
tools/data/reports/agent_20260509_1337.md:75:1. **Verificato: il fit completo esiste nel livello best-per-mode per `reference_order` e `order_memory`.** A `r=0.50`, `reference_order` ha 16/16 righe fit-ready e `order_memory` ha 48/48.
tools/data/reports/agent_20260509_1337.md:76:2. **Verificato: sugli accepted, `periodic_closure` e' broken a tutte le soglie.** A `r=0.50`, 291/393 righe sono `no_cross`; N=233 e N=377 non hanno punti fit-ready, quindi la curva non puo' essere letta come scala.
tools/data/reports/agent_20260509_1337.md:78:4. **Verificato: `order_memory` accepted si pulisce a `r=0.52`.** Passa da `contaminated` a `r=0.50` con 1 no_cross a `complete` a `r=0.52` con 279/279 righe fit-ready. La soglia modifica il denominatore, non solo il valore del fit.
tools/data/reports/agent_20260509_1337.md:84:Nel perimetro 08:46 -> 13:37, `order_memory` conserva un canale fittabile; `periodic_closure` conserva label ma rompe il denominatore sugli accepted; `random_dispersion` raggiunge il floor e non fornisce curva interna a N=377. Il claim corretto e':
tools/data/reports/agent_20260509_1337.md:91:- **Invariante di passaggio**: `fit_ready` sopravvive su `order_memory`; non sopravvive su `periodic_closure` accepted e su `random_dispersion` al bordo alto.
tools/data/reports/agent_20260509_1337.md:92:- **Campo di possibilita**: qui diventa possibile fittare `V_c` solo nel sottografo fit-ready; qui diventa non-possibile usare `no_cross` o `floor_hit` come missing data neutro.
tools/data/reports/agent_20260509_1337.md:102:- **L4 edge cases**: `order_memory` accepted a `r=0.50` ha 1 no_cross; per questo e' `contaminated`, non `complete`.
tools/data/reports/_quarantine_falsifier_29_04/agent_20260429_0833.md:22:| Observable | z early (<100K) | z late (>100K) | Decay corr(ln p) | Boundary? |
tools/data/reports/agent_20260430_1905.md:1:# Agent Report — Observable Coherence at the GUE-Poisson Boundary: Primes Are Not "Between" — They Are Dipolar
tools/data/reports/agent_20260509_0819.md:65:| periodic_approximant_21 | 3 | no_cross=3 |  | 0.750 | 0.153 | 0.740 |
tools/data/reports/agent_20260509_0819.md:71:4. **Verificato: il periodic approximant 21 conserva label-set ma rompe `V_c`.** Le `3/3` righe evento sono `no_cross`; quindi label-preserving e boundary-crossing divergono.
tools/exp_boundary_gue_poisson.py:64:    print("=== GUE/Poisson Boundary: Primes vs Cramér Null Model ===\n")
tools/data/reports/agent_20260507_0330.md:1:# Agent Report — The GUE-Poisson Boundary Is a Denominator Collapse Layer
tools/data/reports/agent_20260509_1516.md:1:# Agent Report - Semi-real Boundary Transfer Gate
tools/data/reports/agent_20260509_1516.md:16:- **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.
tools/data/reports/agent_20260509_1516.md:18:- **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.
tools/data/reports/agent_20260509_1516.md:86:`BOUNDARY transfer` = supporto row-aligned ordine/null nel perimetro dichiarato.
tools/data/reports/agent_20260509_1516.md:95:- **Invariante di passaggio**: il null row-aligned resta necessario e sufficiente per misurare supporto, non per imporre la stessa ascissa di transizione.
tools/data/reports/agent_20260509_1516.md:96:- **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.
tools/data/reports/agent_20260509_1516.md:109:- **L7 possibile/non-possibile**: possibile = audit row-aligned cross-dominio; non-possibile = blank beta universale.
tools/spectral_gap_analysis.py:122:    # Boundary conditions: Dirichlet (Φ=0 at boundaries)
tools/spectral_gap_analysis.py:168:    # Boundary: large potential to enforce confinement
tools/data/reports/agent_20260405_0914.md:6:## Experiment: Boundary Excess Growth
tools/data/reports/agent_20260509_1532.md:1:# Agent Report - Boundary Two-Axis Matrix
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:13:- **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.
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:24:- `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.
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:89:`BOUNDARY support_transfer` = supporto row-aligned ordine/null nel perimetro dichiarato.
tools/data/reports/agent_20260509_1532.md:99:- **Singolare**: la riga row-aligned prima della lettura a due assi.
tools/data/reports/agent_20260417_0803.md:1:# Agent Report — The Dipolar-Illusory Boundary: PNT-Normalization Recovers All-Negative ACF, Crossover at Lag 6
tools/data/reports/agent_20260509_0846.md:7:observables_used: [`generator_class`, `source_mode`, `event_type`, `vc_interp`, `label_jaccard`, `hamming_ratio`, `internal_cross_rate`, `no_cross_rate`, `floor_hit_rate`] - osservabili domain-native, non canonici SR/SR2/L1/L2/triple_var
tools/data/reports/agent_20260509_0846.md:8:**observable_contract**: claim=il fit di scala di `V_c` rientra solo dopo tipizzazione del generatore; observable=`vc_median` e rate di evento separati per `generator_class` e `r_threshold`; operator=audit direzionale sul deposito row-aligned `agent_20260509_0837`, senza ricomputare spettri; generator=classi `reference_order`, `order_memory`, `periodic_closure`, `random_dispersion`; denominator=JSON `vc_generator_class_scale_gate_20260509_0837`, `N={89,144,233,377}`, phase `{0,0.25,0.5,0.75}`, soglie `r={0.48,0.50,0.52}`, livelli separati `per_mode_best` e `accepted_candidates`; non_possible=se una classe produce `no_cross`, `V_c` non esiste per quelle righe e il fit di scala non e' definito; not_tested=nuovi N oltre 377, nuovi generatori, nuovo calcolo spettrale, gap_ratio, power-law fit parametrico.
tools/data/reports/agent_20260509_0846.md:13:- **Dipolo / punto-zero**: `V_c` come valore / `V_c` come evento definito; punto-zero = la riga prima della classificazione `internal_cross/no_cross/floor_hit`, dove il valore e la sua esistenza non sono ancora separati.
tools/data/reports/agent_20260509_0846.md:20:  - **PVI attack**: un trend numerico di `vc_median` e' illegittimo quando il denominatore perde le righe `no_cross`; per questo il report separa trend e rate evento.
tools/data/reports/agent_20260509_0846.md:21:- **Proto-ipotesi**: `V_c` ha una direzione di scala leggibile solo per le classi che mantengono `internal_cross`. Dove la classe produce `no_cross`, la scala non e' un cattivo fit: e' non-definita per costruzione osservabile.
tools/data/reports/agent_20260509_0846.md:25:> Nel perimetro `N={89,144,233,377}`, la scala di `V_c` e' interpretabile solo dopo il gate `generator_class + event_type`: `order_memory` resta fittabile, `periodic_closure` diventa non-fittabile quando gli accepted sono `no_cross`, `random_dispersion` non entra negli accepted.
tools/data/reports/agent_20260509_0846.md:34:- Classi: `reference_order=phi_sturmian`, `order_memory=block_shuffle_*`, `periodic_closure=periodic_approximant_*`, `random_dispersion=balanced_random+markov_density`.
tools/data/reports/agent_20260509_0846.md:47:| order_memory | 1.317 | 1.174 | 1.042 | 0.774 | -0.543 |
tools/data/reports/agent_20260509_0846.md:48:| periodic_closure | 0.999 | 0.662 | 0.648 | 0.650 | -0.349 |
tools/data/reports/agent_20260509_0846.md:56:| order_memory internal_cross | 12/12 | 12/12 | 12/12 | 11/12 + 1 internal_multi |
tools/data/reports/agent_20260509_0846.md:57:| periodic_closure internal_cross | 11/11 | 9/12 | 9/12 | 7/12 |
tools/data/reports/agent_20260509_0846.md:58:| periodic_closure no_cross | 0/11 | 3/12 | 3/12 | 5/12 |
tools/data/reports/agent_20260509_0846.md:65:| order_memory events | 98 internal_cross + 6 internal_multi / 104 | 29 internal_cross / 29 | 116 internal_cross + 1 internal_multi + 1 no_cross / 118 | 27 internal_cross + 1 internal_multi / 28 |
tools/data/reports/agent_20260509_0846.md:66:| order_memory vc_median | 1.350 | 1.341 | 1.229 | 0.899 |
tools/data/reports/agent_20260509_0846.md:67:| periodic_closure events | 99 internal_cross / 99 | 3 internal_cross + 48 no_cross / 51 | 144 no_cross / 144 | 99 no_cross / 99 |
tools/data/reports/agent_20260509_0846.md:68:| periodic_closure vc_median | 1.593 | 0.605 | non definito | non definito |
tools/data/reports/agent_20260509_0846.md:72:1. **Verificato: `order_memory` resta fittabile nel perimetro testato.** Sugli accepted a `r=0.50`, `order_memory` conserva evento definito in `278/279` righe con crossing o multi-crossing, con un solo `no_cross` a N=233 contato nel deposito come edge case.
tools/data/reports/agent_20260509_0846.md:73:2. **Verificato: `periodic_closure` perde il denominatore `V_c` sugli accepted al crescere di N.** A N=233 produce `144/144 no_cross`; a N=377 produce `99/99 no_cross`. In queste righe `vc_interp=None`, quindi il fit non e' un fit povero: non e' definito.
tools/data/reports/agent_20260509_0846.md:74:3. **Verificato: il livello `per_mode_best` e il livello `accepted_candidates` dicono cose diverse.** Nel best-per-mode, `periodic_closure` conserva ancora alcuni crossing a N=233 e N=377; negli accepted candidati gli stessi N collassano a `no_cross` pieno. I due livelli non vanno saldati.
tools/data/reports/agent_20260509_0846.md:81:Nel perimetro `N={89,144,233,377}`, `order_memory` permette una curva di scala perche' mantiene crossing sugli accepted; `periodic_closure` accetta label ma rende `V_c` non definito a N=233 e N=377; `random_dispersion` resta fuori dal gate accepted. Il claim corretto non e' "il modello non e' power-law"; e':
tools/data/reports/agent_20260509_0846.md:89:- **Campo di possibilita**: qui diventa possibile rifare il fit di scala su denominatori validi e tipizzati; qui diventa non-possibile fittare `V_c` aggregando `internal_cross`, `no_cross` e `floor_hit`.
tools/data/reports/agent_20260509_0846.md:92:Il prossimo ciclo non deve aggiungere un nuovo fit. Deve promuovere nel contratto dello script una colonna esplicita `vc_defined` e produrre una tabella fit-ready per classe: solo righe `internal_cross/internal_multi`, con `no_cross` e `floor_hit` riportati come massa esclusa, non come assenza di dato neutra.
tools/data/reports/agent_20260509_0846.md:99:- **L4 edge cases**: `periodic_closure` a N=89 accepted ha `99/99 internal_cross`; la caduta non e' universale su ogni N, e' transizione del denominatore sugli N alti del perimetro.
tools/data/reports/agent_20260509_0659.md:8:**observable_contract**: claim=il null label-preserving deve essere raggiungibile oltre N=89 prima di usare `V_c` per trasferire il boundary verso altri perimetri; observable=`event_type={floor_hit,internal_cross,internal_multi,no_cross}`, `vc_interp`, `r_floor`, `r_span`, `label_jaccard`, `acceptance_rate`; operator=surrogate bilanciato con swap 0/1, gate `label_jaccard>=0.75`, poi curva `r(V)` su griglia 0.5..3.0 step 0.01; generator=phi Sturmian, balanced_random, swap_label_surrogate; denominator=N=144, phase={0,0.25,0.5,0.75}, r_threshold={0.48,0.50,0.52}, random_trials=1, label_trials=1, swap_steps=120, seed=202605090659; non_possible=se il gate label-preserving non viene raggiunto, il ciclo non puo' usare il surrogate come controprova del boundary Sturmian; not_tested=GUE/Poisson reali, silver/bronze, fit power-law, gap_ratio, sufficienza del label-set con surrogate accettati a N=144.
tools/data/reports/agent_20260429_1013.md:1:# Agent Report — Brody Flow: Primes Drift Toward Poisson at 82% Magnitude, 18% Ordering — The Boundary Is a Trajectory, Not a Fixed Point
tools/data/reports/_quarantine_falsifier_29_04/agent_20260429_0833.md:22:| Observable | z early (<100K) | z late (>100K) | Decay corr(ln p) | Boundary? |
tools/data/reports/agent_20260509_0829.md:60:| periodic_approximant_21 | 12 | internal_cross=3; no_cross=9 | 0.792 | 0.542 | 0.139 |
tools/data/reports/agent_20260509_0829.md:67:2. **Verificato: block shuffle e periodic approximant non sono lo stesso null.** I block shuffle accettati riportati hanno `internal_cross=12/12`; `periodic_approximant_21` ha `no_cross=9/12` pur avendo `96` candidati accettati.
tools/data/reports/agent_20260509_0837.md:8:**observable_contract**: claim=la separazione ordine aperto / chiusura periodica / dispersione random trasferisce fuori da `N=144`; observable=`label_jaccard`, `acceptance_rate`, `hamming_ratio`, `source_mode`, `generator_class`, `event_type`, `vc_interp`, `r_floor`; operator=scansione multi-scala dei modi discriminanti del gate 08:29; generator=phi_sturmian, block_shuffle_{21,34,45}, periodic_approximant_{21,45,72}, balanced_random, markov_density; denominator=`N={89,144,233,377}`, phases `{0,0.25,0.5,0.75}`, r_threshold `{0.48,0.50,0.52}`, 5,766 candidati non-Sturmian post hamming gate; non_possible=se periodic closure accetta label ma produce `no_cross`, `label_jaccard` non certifica boundary-crossing; not_tested=fit power-law di `V_c`, gap_ratio, scale oltre `N=377`, generatori diversi da quelli discriminanti.
tools/data/reports/agent_20260509_0837.md:25:> Nel perimetro `N={89,144,233,377}`, `generator_class` separa tre regimi: `order_memory` conserva quasi sempre `internal_cross`, `periodic_closure` conserva label ma produce `no_cross` su una quota stabile, `random_dispersion` non passa il gate label-preserving.
tools/data/reports/agent_20260509_0837.md:36:- Classi operative: `order_memory` = block shuffle; `periodic_closure` = periodic approximant; `random_dispersion` = balanced random + Markov-density.
tools/data/reports/agent_20260509_0837.md:42:| N | order_memory | periodic_closure | random_dispersion |
tools/data/reports/agent_20260509_0837.md:53:| order_memory | 837 | internal_cross=819; internal_multi=11; no_cross=7 | 0.833 | 0.067-0.077 sui modi dominanti |
tools/data/reports/agent_20260509_0837.md:54:| periodic_closure | 1179 | internal_cross=306; no_cross=873 | 0.818 su periodic_21 accepted | 0.215 su periodic_21 accepted |
tools/data/reports/agent_20260509_0837.md:61:| 89 | order_memory | 36 | internal_cross=36 | 0.854 | 1.250 |
tools/data/reports/agent_20260509_0837.md:62:| 89 | periodic_closure | 33 | internal_cross=33 | 0.625 | 0.999 |
tools/data/reports/agent_20260509_0837.md:64:| 144 | order_memory | 36 | internal_cross=36 | 0.710 | 1.106 |
tools/data/reports/agent_20260509_0837.md:65:| 144 | periodic_closure | 36 | internal_cross=26; no_cross=9; floor_hit=1 | 0.542 | 0.662 |
tools/data/reports/agent_20260509_0837.md:67:| 233 | order_memory | 36 | internal_cross=36 | 0.773 | 1.043 |
tools/data/reports/agent_20260509_0837.md:68:| 233 | periodic_closure | 36 | internal_cross=27; no_cross=9 | 0.555 | 0.668 |
tools/data/reports/agent_20260509_0837.md:70:| 377 | order_memory | 36 | internal_cross=34; internal_multi=2 | 0.679 | 0.792 |
tools/data/reports/agent_20260509_0837.md:71:| 377 | periodic_closure | 36 | internal_cross=20; floor_hit=1; no_cross=15 | 0.555 | 0.677 |
tools/data/reports/agent_20260509_0837.md:89:2. **Verificato: `order_memory` trasferisce il crossing fuori da N=144.** Sugli accepted event rows, block shuffle produce `internal_cross/internal_multi=830/837`; i `no_cross` sono `7/837`.
tools/data/reports/agent_20260509_0837.md:90:3. **Verificato: `periodic_closure` accetta label ma rompe il crossing.** Periodic closure produce `1179` accepted event rows, ma `873/1179` sono `no_cross`.
tools/data/reports/agent_20260509_0837.md:91:4. **Verificato: la separazione resta visibile a `N=233` e `N=377`.** A `N=233`, order_memory ha `36/36` internal_cross nel best-per-mode; periodic closure ha `9/36` no_cross. A `N=377`, order_memory ha `34/36` internal_cross e `2/36` internal_multi; periodic closure ha `15/36` no_cross.
tools/data/reports/agent_20260509_0837.md:99:`order_memory` porta il crossing; `periodic_closure` porta spesso il label-set ma lo disaccoppia dal crossing; `random_dispersion` non entra nel gate label-preserving. Il nodo regressivo del fit fallito non e' il modello power-law di `V_c`; e' la mancata tipizzazione del generatore prima della scansione.
tools/data/reports/agent_20260509_0837.md:108:La prossima scansione deve partire dalla tipizzazione, non dal valore: per ogni nuovo N o generatore dichiarare prima `generator_class` (`order_memory`, `periodic_closure`, `random_dispersion`, oppure nuova classe motivata), poi misurare `label_jaccard` e `event_type` su righe row-aligned. Il fit di scala di `V_c` rientra solo dopo questo gate.
tools/data/reports/agent_20260509_0637.md:8:**observable_contract**: claim=la forma `r(V)` del boundary Sturmian-Harper e' sostenuta da attraversamenti interni, non da collasso al bordo minimo della filtrazione; observable=`event={floor_hit,internal_cross,internal_multi,no_cross}`, `vc_interp`, `r_floor`, `r_span`, `label_jaccard`; operator=curva `r(V)` su griglia 0.5..3.0 step 0.01, crossing lineare e classificazione del primo stato rispetto a `r_threshold={0.48,0.50,0.52}`; generator=phi Sturmian, phase-shuffle Sturmian, random bilanciato, surrogate random selezionato per overlap label-set; denominator=N={89,144,233}, phase={0,0.25,0.5,0.75}, phase_trials=2, random_trials=2, label_trials=2, label_candidates=5, seed=202605090637; non_possible=se un null che preserva label-set produce crossing interno unico e stesso `r_floor` dei generatori Sturmian, `V_c` non e' piu' boundary map di ordine Sturmian; not_tested=GUE/Poisson reali, silver/bronze in questo ciclo, fit power-law, label-preserving forte con accettazione Jaccard>=0.75.
tools/data/reports/agent_20260509_0637.md:36:  - `no_cross`: non attraversa.
tools/data/reports/agent_20260504_0901.md:1:# Agent Report — The Two Markov Layers Are Coupled at the Boundary: One Phase Transition, Two Projections
tools/data/reports/agent_20260509_1516.md:1:# Agent Report - Semi-real Boundary Transfer Gate
tools/data/reports/agent_20260509_1516.md:16:- **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.
tools/data/reports/agent_20260509_1516.md:18:- **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.
tools/data/reports/agent_20260509_1516.md:86:`BOUNDARY transfer` = supporto row-aligned ordine/null nel perimetro dichiarato.
tools/data/reports/agent_20260509_1516.md:95:- **Invariante di passaggio**: il null row-aligned resta necessario e sufficiente per misurare supporto, non per imporre la stessa ascissa di transizione.
tools/data/reports/agent_20260509_1516.md:96:- **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.
tools/data/reports/agent_20260509_1516.md:109:- **L7 possibile/non-possibile**: possibile = audit row-aligned cross-dominio; non-possibile = blank beta universale.
tools/data/reports/agent_20260508_1947.md:14:- **Operatori laterali scelti**: boundary operator e indice. Boundary operator entra perche' il cycle precedente ha falsificato il bordo come set; indice entra perche' il nuovo osservabile deve misurare dove cade il gap, non solo quale label porta.
tools/data/reports/agent_20260405_0914.md:6:## Experiment: Boundary Excess Growth
tools/data/reports/agent_20260509_1532.md:1:# Agent Report - Boundary Two-Axis Matrix
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:13:- **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.
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:24:- `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.
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:89:`BOUNDARY support_transfer` = supporto row-aligned ordine/null nel perimetro dichiarato.
tools/data/reports/agent_20260509_1532.md:99:- **Singolare**: la riga row-aligned prima della lettura a due assi.
tools/data/reports/agent_20260505_0330.md:1:# Agent Report - Observable Rank Audit: Many Probes, One Boundary Coordinate
tools/exp_boundary_blank_null_audit.py:8:rewrite it; it creates an extra row-aligned null audit for selected blank
tools/data/reports/agent_20260406_0714.md:1:# Agent Report — Crossover Universality: One Boundary or Many?
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:13:- **Dipolo / punto-zero**: blank / transfer; punto-zero = stessa riga domain/window prima della disponibilita del null row-aligned.
tools/data/reports/agent_20260509_1427.md:15:- **Operatori laterali scelti**: boundary operator, shuffle marginal-preserving, grafo row-aligned. Entrano per separare osservabile locale, null e transfer senza nuovo fit.
tools/data/reports/agent_20260509_1427.md:17:- **Proto-ipotesi**: un blank BOUNDARY diventa transfer quando possiede un null row-aligned leggibile; la classe sorgente resta controllo, non risposta.
tools/data/reports/agent_20260509_1427.md:25:Il null row-aligned per una coppia blank GUE/Poisson decide `blank -> transfers`, `blank -> falls` o `blank remains blank`?
tools/data/reports/agent_20260509_1427.md:60:1. **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.
tools/data/reports/agent_20260509_1427.md:71:Questo 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.
tools/data/reports/agent_20260509_1427.md:74:- **Due radici**: blank senza contro-perimetro / transfer con null row-aligned.
tools/data/reports/agent_20260509_1427.md:76:- **Invariante di passaggio**: il null row-aligned decide il passaggio; la classe GUE/Poisson non viene riscritta.
tools/data/reports/agent_20260509_1427.md:80:La 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.
tools/data/reports/agent_20260509_1538.md:1:# Agent Report - Boundary Row-Aligned Nonexact Audit
tools/data/reports/agent_20260509_1538.md:5:**verdict**: CONSTRAINT - le righe support-transfer non esatte sono 7, non 6; la beta cade in cinque failure modes misurabili  
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:11:- **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.
tools/data/reports/agent_20260509_1538.md:13:- **Dipolo / punto-zero**: beta come coordinata / supporto come passaggio; punto-zero = riga support-transfer prima che il blank beta venga interpretato.
tools/data/reports/agent_20260509_1538.md:14:- **Piano superiore**: boundary operator su matrice row-aligned. Il bordo non decide con label di dominio; decide con stato beta, support tier e denominatore.
tools/data/reports/agent_20260509_1538.md:19:- **Proiezione**: misurare, sulle righe support-transfer non esatte, `beta_cardinality`, `beta_span`, `one_sided_count`, `endpoint_distance`, denominatore e shuffle z-score.
tools/data/reports/agent_20260509_1538.md:23:- `why`: attacca direttamente beta local non-unique, beta local other e support_without_beta_blank sul deposito row-aligned indicato.
tools/data/reports/agent_20260509_1538.md:30:Quando beta 0.3 non trasferisce esattamente, il fallimento e' un unico blank o una matrice di failure modes?
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:48:| support-transfer rows | 11 |
tools/data/reports/agent_20260509_1538.md:50:| support-transfer nonexact rows | 7 |
tools/data/reports/agent_20260509_1538.md:68:Audit row-aligned:
tools/data/reports/agent_20260509_1538.md:88:1. **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.
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:109:Il nodo regressivo e' il denominatore della consecutio: non bisogna salvare il "6"; bisogna usare il deposito row-aligned che mostra 7.
tools/data/reports/agent_20260509_1538.md:113:- **Singolare**: riga support-transfer non exact, dove il supporto resta vivo ma la chart beta non coincide.
tools/data/reports/agent_20260509_1538.md:114:- **Invariante di passaggio**: failure mode row-aligned; non label GUE/Poisson e non beta 0.3 globale.
tools/data/reports/agent_20260509_1538.md:123:- **L2 count grezzi**: riportati 11/13 support-transfer, 4/13 beta exact, 7/13 support nonexact, 2/13 fall.
tools/data/reports/agent_20260507_0803.md:1:# Agent Report - Denominator Gate Transfers, Boundary Coordinate Does Not
tools/data/reports/agent_20260509_0659.md:8:**observable_contract**: claim=il null label-preserving deve essere raggiungibile oltre N=89 prima di usare `V_c` per trasferire il boundary verso altri perimetri; observable=`event_type={floor_hit,internal_cross,internal_multi,no_cross}`, `vc_interp`, `r_floor`, `r_span`, `label_jaccard`, `acceptance_rate`; operator=surrogate bilanciato con swap 0/1, gate `label_jaccard>=0.75`, poi curva `r(V)` su griglia 0.5..3.0 step 0.01; generator=phi Sturmian, balanced_random, swap_label_surrogate; denominator=N=144, phase={0,0.25,0.5,0.75}, r_threshold={0.48,0.50,0.52}, random_trials=1, label_trials=1, swap_steps=120, seed=202605090659; non_possible=se il gate label-preserving non viene raggiunto, il ciclo non puo' usare il surrogate come controprova del boundary Sturmian; not_tested=GUE/Poisson reali, silver/bronze, fit power-law, gap_ratio, sufficienza del label-set con surrogate accettati a N=144.
tools/data/reports/agent_20260509_1437.md:1:# Agent Report - Residual Boundary Closure
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:13:- **Dipolo / punto-zero**: blank / transfer; punto-zero = riga domain/window prima della disponibilita del null row-aligned.
tools/data/reports/agent_20260509_1437.md:16:- **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`.
tools/data/reports/agent_20260509_1437.md:17:- **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.
tools/data/reports/agent_20260509_1437.md:25:I 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?
tools/data/reports/agent_20260509_1437.md:70:5. **Verificato: il gate BOUNDARY ha copertura completa sul perimetro base.** La copertura riguarda il denominatore row-aligned, non il ponte QxG.
tools/data/reports/agent_20260509_1437.md:80:- **Due radici**: blank senza contro-perimetro / transfer con null row-aligned.
tools/exp_boundary_row_aligned_nonexact_audit.py:5:The operator is row-aligned with the 1532 two-axis matrix and deliberately
tools/data/reports/agent_20260429_1013.md:1:# Agent Report — Brody Flow: Primes Drift Toward Poisson at 82% Magnitude, 18% Ordering — The Boundary Is a Trajectory, Not a Fixed Point
tools/data/reports/agent_20260509_1444.md:1:# Agent Report - Boundary Gate Transfer Matrix
tools/data/reports/agent_20260509_1444.md:87:Il prossimo nodo regressivo non e' la disponibilita del null. E' la qualita del perimetro: il gate passa su sintetici controllati, ma non ha ancora incontrato un perimetro fisico QxG row-aligned. La prossima mossa deve portare un perimetro fisico o semi-reale dentro lo stesso contratto `coherent/null/beta`, lasciando beta 0.3 come blank dichiarato e non come classe.
tools/exp_vc_null_regression_gate.py:63:        event = "no_cross"
tools/exp_vc_null_regression_gate.py:140:            "no_cross_rate": float(events["no_cross"] / len(group)) if group else None,
tools/data/reports/agent_20260505_1022.md:1:# Agent Report — Selective Perturbations Break the Single-Boundary Framing
tools/data/reports/agent_20260509_0829.md:60:| periodic_approximant_21 | 12 | internal_cross=3; no_cross=9 | 0.792 | 0.542 | 0.139 |
tools/data/reports/agent_20260509_0829.md:67:2. **Verificato: block shuffle e periodic approximant non sono lo stesso null.** I block shuffle accettati riportati hanno `internal_cross=12/12`; `periodic_approximant_21` ha `no_cross=9/12` pur avendo `96` candidati accettati.
tools/data/reports/agent_20260508_2133.md:14:- **Operatori laterali scelti**: boundary operator, filtrazione, random walk. Boundary operator definisce il vuoto prime-free; filtrazione costruisce i 16 pair bucket; random walk entra come permutazione locale delle classi di transizione dentro ogni bucket.
tools/data/reports/agent_20260509_0837.md:8:**observable_contract**: claim=la separazione ordine aperto / chiusura periodica / dispersione random trasferisce fuori da `N=144`; observable=`label_jaccard`, `acceptance_rate`, `hamming_ratio`, `source_mode`, `generator_class`, `event_type`, `vc_interp`, `r_floor`; operator=scansione multi-scala dei modi discriminanti del gate 08:29; generator=phi_sturmian, block_shuffle_{21,34,45}, periodic_approximant_{21,45,72}, balanced_random, markov_density; denominator=`N={89,144,233,377}`, phases `{0,0.25,0.5,0.75}`, r_threshold `{0.48,0.50,0.52}`, 5,766 candidati non-Sturmian post hamming gate; non_possible=se periodic closure accetta label ma produce `no_cross`, `label_jaccard` non certifica boundary-crossing; not_tested=fit power-law di `V_c`, gap_ratio, scale oltre `N=377`, generatori diversi da quelli discriminanti.
tools/data/reports/agent_20260509_0837.md:25:> Nel perimetro `N={89,144,233,377}`, `generator_class` separa tre regimi: `order_memory` conserva quasi sempre `internal_cross`, `periodic_closure` conserva label ma produce `no_cross` su una quota stabile, `random_dispersion` non passa il gate label-preserving.
tools/data/reports/agent_20260509_0837.md:36:- Classi operative: `order_memory` = block shuffle; `periodic_closure` = periodic approximant; `random_dispersion` = balanced random + Markov-density.
tools/data/reports/agent_20260509_0837.md:42:| N | order_memory | periodic_closure | random_dispersion |
tools/data/reports/agent_20260509_0837.md:53:| order_memory | 837 | internal_cross=819; internal_multi=11; no_cross=7 | 0.833 | 0.067-0.077 sui modi dominanti |
tools/data/reports/agent_20260509_0837.md:54:| periodic_closure | 1179 | internal_cross=306; no_cross=873 | 0.818 su periodic_21 accepted | 0.215 su periodic_21 accepted |
tools/data/reports/agent_20260509_0837.md:61:| 89 | order_memory | 36 | internal_cross=36 | 0.854 | 1.250 |
tools/data/reports/agent_20260509_0837.md:62:| 89 | periodic_closure | 33 | internal_cross=33 | 0.625 | 0.999 |
tools/data/reports/agent_20260509_0837.md:64:| 144 | order_memory | 36 | internal_cross=36 | 0.710 | 1.106 |
tools/data/reports/agent_20260509_0837.md:65:| 144 | periodic_closure | 36 | internal_cross=26; no_cross=9; floor_hit=1 | 0.542 | 0.662 |
tools/data/reports/agent_20260509_0837.md:67:| 233 | order_memory | 36 | internal_cross=36 | 0.773 | 1.043 |
tools/data/reports/agent_20260509_0837.md:68:| 233 | periodic_closure | 36 | internal_cross=27; no_cross=9 | 0.555 | 0.668 |
tools/data/reports/agent_20260509_0837.md:70:| 377 | order_memory | 36 | internal_cross=34; internal_multi=2 | 0.679 | 0.792 |
tools/data/reports/agent_20260509_0837.md:71:| 377 | periodic_closure | 36 | internal_cross=20; floor_hit=1; no_cross=15 | 0.555 | 0.677 |
tools/data/reports/agent_20260509_0837.md:89:2. **Verificato: `order_memory` trasferisce il crossing fuori da N=144.** Sugli accepted event rows, block shuffle produce `internal_cross/internal_multi=830/837`; i `no_cross` sono `7/837`.
tools/data/reports/agent_20260509_0837.md:90:3. **Verificato: `periodic_closure` accetta label ma rompe il crossing.** Periodic closure produce `1179` accepted event rows, ma `873/1179` sono `no_cross`.
tools/data/reports/agent_20260509_0837.md:91:4. **Verificato: la separazione resta visibile a `N=233` e `N=377`.** A `N=233`, order_memory ha `36/36` internal_cross nel best-per-mode; periodic closure ha `9/36` no_cross. A `N=377`, order_memory ha `34/36` internal_cross e `2/36` internal_multi; periodic closure ha `15/36` no_cross.
tools/data/reports/agent_20260509_0837.md:99:`order_memory` porta il crossing; `periodic_closure` porta spesso il label-set ma lo disaccoppia dal crossing; `random_dispersion` non entra nel gate label-preserving. Il nodo regressivo del fit fallito non e' il modello power-law di `V_c`; e' la mancata tipizzazione del generatore prima della scansione.
tools/data/reports/agent_20260509_0837.md:108:La prossima scansione deve partire dalla tipizzazione, non dal valore: per ogni nuovo N o generatore dichiarare prima `generator_class` (`order_memory`, `periodic_closure`, `random_dispersion`, oppure nuova classe motivata), poi misurare `label_jaccard` e `event_type` su righe row-aligned. Il fit di scala di `V_c` rientra solo dopo questo gate.
tools/data/reports/agent_20260508_2121.md:14:- **Operatori laterali scelti**: boundary operator, filtrazione, random walk. Boundary operator definisce il gap prime-free; filtrazione separa low/mid/high gap; random walk entra come permutazione locale delle cariche dentro la stessa classe di lunghezza.
tools/exp_boundary_denominator_prescan.py:5:Boundary-oriented prescan for transferring the `denominator_state` gate beyond
tools/exp_boundary_denominator_prescan.py:200:            "operator": "row-aligned domain/window prescan",
tools/data/reports/agent_20260509_0637.md:8:**observable_contract**: claim=la forma `r(V)` del boundary Sturmian-Harper e' sostenuta da attraversamenti interni, non da collasso al bordo minimo della filtrazione; observable=`event={floor_hit,internal_cross,internal_multi,no_cross}`, `vc_interp`, `r_floor`, `r_span`, `label_jaccard`; operator=curva `r(V)` su griglia 0.5..3.0 step 0.01, crossing lineare e classificazione del primo stato rispetto a `r_threshold={0.48,0.50,0.52}`; generator=phi Sturmian, phase-shuffle Sturmian, random bilanciato, surrogate random selezionato per overlap label-set; denominator=N={89,144,233}, phase={0,0.25,0.5,0.75}, phase_trials=2, random_trials=2, label_trials=2, label_candidates=5, seed=202605090637; non_possible=se un null che preserva label-set produce crossing interno unico e stesso `r_floor` dei generatori Sturmian, `V_c` non e' piu' boundary map di ordine Sturmian; not_tested=GUE/Poisson reali, silver/bronze in questo ciclo, fit power-law, label-preserving forte con accettazione Jaccard>=0.75.
tools/data/reports/agent_20260509_0637.md:36:  - `no_cross`: non attraversa.
tools/data/reports/agent_20260509_1400.md:8:**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.
tools/data/reports/agent_20260509_1400.md:24:> 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.
tools/data/reports/agent_20260509_1400.md:27:Una 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?
tools/data/reports/agent_20260509_1400.md:57:| per_mode_best | order_memory | complete | 48/48 | 0 | linear_N | 6.607 | 0.774 |
tools/data/reports/agent_20260509_1400.md:58:| per_mode_best | periodic_closure | contaminated | 36/47 | 11 | inv_N | 1.378 | 0.650 |
tools/data/reports/agent_20260509_1400.md:59:| accepted_candidates | order_memory | contaminated | 278/279 | 1 | linear_N | 4.565 | 0.899 |
tools/data/reports/agent_20260509_1400.md:60:| accepted_candidates | order_memory r0.52 | complete | 279/279 | 0 | linear_N | 5.926 | 0.781 |
tools/data/reports/agent_20260509_1400.md:68:| accepted_candidates | periodic_closure r0.48 | 102/393 | 291 |
tools/data/reports/agent_20260509_1400.md:69:| accepted_candidates | periodic_closure r0.50 | 102/393 | 291 |
tools/data/reports/agent_20260509_1400.md:70:| accepted_candidates | periodic_closure r0.52 | 102/393 | 291 |
tools/data/reports/agent_20260509_1400.md:76:| per_mode_best:order_memory:r0.52 | linear_N | 1.885 |
tools/data/reports/agent_20260509_1400.md:77:| per_mode_best:periodic_closure:r0.48 | inv_N | 1.244 |
tools/data/reports/agent_20260509_1400.md:78:| per_mode_best:periodic_closure:r0.50 | inv_N | 1.378 |
tools/data/reports/agent_20260509_1400.md:79:| per_mode_best:periodic_closure:r0.52 | inv_N | 1.257 |
tools/data/reports/agent_20260509_1400.md:82:1. **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.
tools/data/reports/agent_20260509_1400.md:83:2. **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`.
tools/data/reports/agent_20260509_1400.md:84:3. **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.
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_1400.md:91:Nel 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':
tools/data/reports/agent_20260509_1400.md:102:Il 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.
tools/data/reports/agent_20260509_1400.md:109:- **L4 edge cases**: `order_memory:r0.52` best-per-mode ha delta AICc 1.885, quindi famiglia non identificata hard nonostante best `linear_N`.
tools/exp_boundary_coherence.py:3:exp_boundary_coherence.py — Multi-Observable Boundary Coherence
tools/data/reports/agent_20260509_1409.md:1:# Agent Report - Boundary Denominator Prescan
tools/data/reports/agent_20260509_1409.md:8:**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.
tools/data/reports/agent_20260509_1409.md:16:- **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.
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:81:5. **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.
tools/data/reports/agent_20260509_1409.md:86:Nel 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.
tools/data/reports/agent_20260509_1409.md:93:- **Invariante di passaggio**: il null row-aligned decide il transfer; la classe sorgente non decide.
tools/data/reports/agent_20260509_1409.md:97:Il 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.
tools/data/reports/agent_20260504_0901.md:1:# Agent Report — The Two Markov Layers Are Coupled at the Boundary: One Phase Transition, Two Projections
tools/LAB_COGNITIVE_CONTAMINATION.md:104:ID: Boundary_Third_Included_Gate
tools/LAB_COGNITIVE_CONTAMINATION.md:248:ID: Lateral_Boundary_Genome
tools/LAB_COGNITIVE_CONTAMINATION.md:259:## Boundary
tools/data/reports/agent_20260508_2108.md:14:- **Operatori laterali scelti**: boundary operator, random walk, entropia. Boundary operator definisce il bordo prime-free; random walk fornisce il null di permutazione della carica; entropia entra come dispersione del vuoto senza primi.
tools/data/reports/agent_20260508_1947.md:14:- **Operatori laterali scelti**: boundary operator e indice. Boundary operator entra perche' il cycle precedente ha falsificato il bordo come set; indice entra perche' il nuovo osservabile deve misurare dove cade il gap, non solo quale label porta.
tools/data/reports/agent_20260509_1457.md:1:# Agent Report - Vc Unit Boundary Audit
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:52:| order_memory | 1 | 5 | 0 |
tools/data/reports/agent_20260509_1457.md:53:| periodic_closure | 0 | 1 | 2 |
tools/data/reports/agent_20260509_1457.md:63:| per_mode_best:order_memory:r0.48 | complete | 48/48 | 0 | 1.432 | 0.893 | crosses_down | 315.760 |
tools/data/reports/agent_20260509_1457.md:64:| per_mode_best:order_memory:r0.50 | complete | 48/48 | 0 | 1.317 | 0.774 | crosses_down | 255.737 |
tools/data/reports/agent_20260509_1457.md:65:| per_mode_best:order_memory:r0.52 | complete | 48/48 | 0 | 1.218 | 0.688 | crosses_down | 188.585 |
tools/data/reports/agent_20260509_1457.md:66:| accepted_candidates:order_memory:r0.48 | contaminated | 273/279 | 6 | 1.474 | 1.069 | all_above | blank |
tools/data/reports/agent_20260509_1457.md:67:| accepted_candidates:order_memory:r0.50 | contaminated | 278/279 | 1 | 1.350 | 0.899 | crosses_down | 332.733 |
tools/data/reports/agent_20260509_1457.md:68:| accepted_candidates:order_memory:r0.52 | complete | 279/279 | 0 | 1.236 | 0.781 | crosses_down | 272.895 |
tools/data/reports/agent_20260509_1457.md:74:| per_mode_best:periodic_closure:r0.48 | 105.734 |
tools/data/reports/agent_20260509_1457.md:76:| per_mode_best:order_memory:r0.52 | 188.585 |
tools/data/reports/agent_20260509_1457.md:77:| per_mode_best:order_memory:r0.50 | 255.737 |
tools/data/reports/agent_20260509_1457.md:78:| accepted_candidates:order_memory:r0.52 | 272.895 |
tools/data/reports/agent_20260509_1457.md:80:| per_mode_best:order_memory:r0.48 | 315.760 |
tools/data/reports/agent_20260509_1457.md:81:| accepted_candidates:order_memory:r0.50 | 332.733 |
tools/data/reports/agent_20260509_1457.md:85:2. **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`.
tools/data/reports/agent_20260509_1457.md:86:3. **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.
tools/data/reports/agent_20260509_1457.md:87:4. **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.
tools/data/reports/agent_20260509_1457.md:93:`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}.
tools/data/reports/agent_20260508_2013.md:14:- **Operatori laterali scelti**: boundary operator, indice, rappresentazione. Boundary operator misura il taglio; indice porta il gap nello spazio posizionale; rappresentazione Zeckendorf traduce il centro in cifre Fibonacci.
tools/data/reports/agent_20260508_2013.md:29:- Boundary: prefissi dei chunk dopo la perturbazione del tiling.
tools/data/reports/agent_20260505_0330.md:1:# Agent Report - Observable Rank Audit: Many Probes, One Boundary Coordinate
tools/data/reports/agent_20260509_0652.md:8:**observable_contract**: claim=un null che preserva il gap-label set Sturmian puo' decidere se `V_c` e' portato dal label-set o dall'ordine generativo; observable=`event_type={floor_hit,internal_cross,internal_multi,no_cross}`, `vc_interp`, `r_floor`, `r_span`, `label_jaccard`, `acceptance_rate`; operator=surrogate bilanciato con swap 0/1 e ricottura finche' `label_jaccard>=0.75`, poi curva `r(V)` su griglia 0.5..3.0 step 0.01; generator=phi Sturmian, balanced_random, swap_label_surrogate; denominator=run principale N={89}, phase={0,0.25,0.5,0.75}, r_threshold={0.48,0.50,0.52}, random_trials=1, label_trials=2, swap_steps=3000, seed=202605090652; non_possible=se i surrogate accettati Jaccard>=0.75 producono floor-hit o internal_multi e restano con `r_floor`/`vc_interp` vicini al random, il label-set non basta a ricostruire il boundary Sturmian; not_tested=GUE/Poisson reali, silver/bronze, fit power-law, gap_ratio, prova a N>=144 con gate raggiunto.
tools/data/reports/agent_20260509_0652.md:36:  - `no_cross`: non attraversa.
tools/build_agent_field.py:310:            for key in ('order_memory:r0.5', 'periodic_closure:r0.5'):
tools/build_agent_field.py:366:            parts.append("Evidenza fit-ready row-aligned:")
tools/build_agent_field.py:371:            "Contratto operativo: non rifare un fit aggregando `no_cross`, "
tools/data/reports/agent_20260406_0714.md:1:# Agent Report — Crossover Universality: One Boundary or Many?
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:13:- **Dipolo / punto-zero**: blank / transfer; punto-zero = stessa riga domain/window prima della disponibilita del null row-aligned.
tools/data/reports/agent_20260509_1427.md:15:- **Operatori laterali scelti**: boundary operator, shuffle marginal-preserving, grafo row-aligned. Entrano per separare osservabile locale, null e transfer senza nuovo fit.
tools/data/reports/agent_20260509_1427.md:17:- **Proto-ipotesi**: un blank BOUNDARY diventa transfer quando possiede un null row-aligned leggibile; la classe sorgente resta controllo, non risposta.
tools/data/reports/agent_20260509_1427.md:25:Il null row-aligned per una coppia blank GUE/Poisson decide `blank -> transfers`, `blank -> falls` o `blank remains blank`?
tools/data/reports/agent_20260509_1427.md:60:1. **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.
tools/data/reports/agent_20260509_1427.md:71:Questo 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.
tools/data/reports/agent_20260509_1427.md:74:- **Due radici**: blank senza contro-perimetro / transfer con null row-aligned.
tools/data/reports/agent_20260509_1427.md:76:- **Invariante di passaggio**: il null row-aligned decide il passaggio; la classe GUE/Poisson non viene riscritta.
tools/data/reports/agent_20260509_1427.md:80:La 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.
tools/exp_duality_scale_contrast.py:257:    # Boundary detection: where does |z| cross 2?
tools/exp_duality_scale_contrast.py:258:    lines.append("\n--- Boundary detection (where |z_SR| < 2) ---")
tools/dnd_experiments.py:225:# ESPERIMENTO 2: Boundary GUE/Poisson — Il terzo incluso
tools/dnd_experiments.py:240:    print("ESPERIMENTO: Boundary GUE/Poisson (Ising T-sweep)")
tools/dnd_experiments.py:372:    print("ESPERIMENTO: Boundary GUE/Poisson (Logistica r-sweep)")
tools/dnd_experiments.py:1176:    # E2: Boundary Ising
tools/dnd_experiments.py:1185:    # E3: Boundary Logistica
tools/data/reports/agent_20260509_1538.md:1:# Agent Report - Boundary Row-Aligned Nonexact Audit
tools/data/reports/agent_20260509_1538.md:5:**verdict**: CONSTRAINT - le righe support-transfer non esatte sono 7, non 6; la beta cade in cinque failure modes misurabili  
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:11:- **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.
tools/data/reports/agent_20260509_1538.md:13:- **Dipolo / punto-zero**: beta come coordinata / supporto come passaggio; punto-zero = riga support-transfer prima che il blank beta venga interpretato.
tools/data/reports/agent_20260509_1538.md:14:- **Piano superiore**: boundary operator su matrice row-aligned. Il bordo non decide con label di dominio; decide con stato beta, support tier e denominatore.
tools/data/reports/agent_20260509_1538.md:19:- **Proiezione**: misurare, sulle righe support-transfer non esatte, `beta_cardinality`, `beta_span`, `one_sided_count`, `endpoint_distance`, denominatore e shuffle z-score.
tools/data/reports/agent_20260509_1538.md:23:- `why`: attacca direttamente beta local non-unique, beta local other e support_without_beta_blank sul deposito row-aligned indicato.
tools/data/reports/agent_20260509_1538.md:30:Quando beta 0.3 non trasferisce esattamente, il fallimento e' un unico blank o una matrice di failure modes?
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:48:| support-transfer rows | 11 |
tools/data/reports/agent_20260509_1538.md:50:| support-transfer nonexact rows | 7 |
tools/data/reports/agent_20260509_1538.md:68:Audit row-aligned:
tools/data/reports/agent_20260509_1538.md:88:1. **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.
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:109:Il nodo regressivo e' il denominatore della consecutio: non bisogna salvare il "6"; bisogna usare il deposito row-aligned che mostra 7.
tools/data/reports/agent_20260509_1538.md:113:- **Singolare**: riga support-transfer non exact, dove il supporto resta vivo ma la chart beta non coincide.
tools/data/reports/agent_20260509_1538.md:114:- **Invariante di passaggio**: failure mode row-aligned; non label GUE/Poisson e non beta 0.3 globale.
tools/data/reports/agent_20260509_1538.md:123:- **L2 count grezzi**: riportati 11/13 support-transfer, 4/13 beta exact, 7/13 support nonexact, 2/13 fall.
tools/data/reports/agent_20260507_0803.md:1:# Agent Report - Denominator Gate Transfers, Boundary Coordinate Does Not
tools/exp_3d_boundary_layers.py:168:    print(f"=== 3D Boundary Layer Experiment ===")
tools/exp_3d_boundary_layers.py:202:        'experiment': '3D Boundary Layers',
tools/data/agent_field_live.md:29:- report_20260509_1538: 3 ghost · Agent Report - Boundary Row-Aligned Nonexact Audit
tools/data/agent_field_live.md:30:- report_20260509_1532: 2 ghost · Agent Report - Boundary Two-Axis Matrix
tools/data/agent_field_live.md:37:- Perche': Il ciclo ha prodotto una correzione strutturale del denominatore: le righe support-transfer non esatte sono 7, non 6, e si dividono in cinque failure modes misurabili. Non c'e' dipendenza dall'operatore: la prossima mossa naturale e' falsificare se quei failure modes sono stabili o se sono artefatto della griglia beta e del perimetro row-aligned.
tools/data/agent_field_live.md:714:ID: Boundary_Third_Included_Gate
tools/data/agent_field_live.md:858:ID: Lateral_Boundary_Genome
tools/data/agent_field_live.md:869:## Boundary
tools/data/agent_field_live.md:928:  - Semi-real Boundary Transfer Gate → None/None (ρ=None)
tools/data/agent_field_live.md:929:  - Boundary Two-Axis Matrix → None/None (ρ=None)
tools/data/agent_field_live.md:930:  - Boundary Row-Aligned Nonexact Audit → None/None (ρ=None)
tools/data/agent_field_live.md:997:Punto-zero: riga support-transfer non exact, dove il supporto resta vivo ma la chart beta non coincide.
tools/data/agent_field_live.md:998:Invariante: failure mode row-aligned; non label GUE/Poisson e non beta 0.3 globale.
tools/data/agent_field_live.md:1003:Contratto operativo: non rifare un fit aggregando `no_cross`, `floor_hit` e crossing. Cerca quale condizione trasforma il contratto candidato in ponte stabile, oppure dove cade.
tools/data/agent_field_live.md:1075:### Agent Report - Boundary Row-Aligned Nonexact Audit
tools/data/agent_field_live.md:1076:Trovato: 1. **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.
tools/data/agent_field_live.md:1080:Il 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/agent_field_live.md:1082:### Agent Report - Boundary Two-Axis Matrix
tools/data/agent_field_live.md:1089:### Agent Report - Semi-real Boundary Transfer Gate
tools/data/agent_field_live.md:1195:  report_20260509_1538 (3 ghost): Agent Report - Boundary Row-Aligned Nonexact Audit
tools/data/agent_field_live.md:1196:  report_20260509_1532 (2 ghost): Agent Report - Boundary Two-Axis Matrix
tools/data/reports/agent_20260509_1437.md:1:# Agent Report - Residual Boundary Closure
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:13:- **Dipolo / punto-zero**: blank / transfer; punto-zero = riga domain/window prima della disponibilita del null row-aligned.
tools/data/reports/agent_20260509_1437.md:16:- **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`.
tools/data/reports/agent_20260509_1437.md:17:- **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.
tools/data/reports/agent_20260509_1437.md:25:I 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?
tools/data/reports/agent_20260509_1437.md:70:5. **Verificato: il gate BOUNDARY ha copertura completa sul perimetro base.** La copertura riguarda il denominatore row-aligned, non il ponte QxG.
tools/data/reports/agent_20260509_1437.md:80:- **Due radici**: blank senza contro-perimetro / transfer con null row-aligned.
tools/data/reports/agent_20260509_1444.md:1:# Agent Report - Boundary Gate Transfer Matrix
tools/data/reports/agent_20260509_1444.md:87:Il prossimo nodo regressivo non e' la disponibilita del null. E' la qualita del perimetro: il gate passa su sintetici controllati, ma non ha ancora incontrato un perimetro fisico QxG row-aligned. La prossima mossa deve portare un perimetro fisico o semi-reale dentro lo stesso contratto `coherent/null/beta`, lasciando beta 0.3 come blank dichiarato e non come classe.
tools/data/reports/agent_20260505_1022.md:1:# Agent Report — Selective Perturbations Break the Single-Boundary Framing
tools/exp_spectral_landscape.py:340:        # Boundary candidates
tools/exp_spectral_landscape.py:384:    # Boundary analysis — do boundary domains share structure?
tools/exp_spectral_landscape.py:387:        print(f"\n=== Boundary Domains ({len(boundary)}) ===")
tools/exp_boundary_two_axis_matrix.py:5:Input is a row-aligned semi-real boundary gate deposit. The operator deliberately
tools/triggers/build_applications_index.py:13:Boundary:
tools/triggers/application_designer.py:9:Boundary (TM7 mandate):
tools/triggers/application_designer.py:359:## Boundary
tools/triggers/on_crystallize.py:14:Boundary:
tools/data/reports/agent_20260508_2133.md:14:- **Operatori laterali scelti**: boundary operator, filtrazione, random walk. Boundary operator definisce il vuoto prime-free; filtrazione costruisce i 16 pair bucket; random walk entra come permutazione locale delle classi di transizione dentro ogni bucket.
tools/data/operator_directives_consumed/operator_directive_20260509_0846.md:11:- non dire che `order_memory` porta sempre crossing: formula `crossing-or-multi
tools/data/operator_directives_consumed/operator_directive_20260509_0846.md:12:  in 830/837 accepted rows, con 7 no_cross da isolare`;
tools/data/operator_directives_consumed/operator_directive_20260509_0846.md:13:- non dire che `periodic_closure` rompe crossing: formula `no_cross in
tools/data/reports/agent_20260508_2121.md:14:- **Operatori laterali scelti**: boundary operator, filtrazione, random walk. Boundary operator definisce il gap prime-free; filtrazione separa low/mid/high gap; random walk entra come permutazione locale delle cariche dentro la stessa classe di lunghezza.
tools/data/reports/agent_20260509_1400.md:8:**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.
tools/data/reports/agent_20260509_1400.md:24:> 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.
tools/data/reports/agent_20260509_1400.md:27:Una 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?
tools/data/reports/agent_20260509_1400.md:57:| per_mode_best | order_memory | complete | 48/48 | 0 | linear_N | 6.607 | 0.774 |
tools/data/reports/agent_20260509_1400.md:58:| per_mode_best | periodic_closure | contaminated | 36/47 | 11 | inv_N | 1.378 | 0.650 |
tools/data/reports/agent_20260509_1400.md:59:| accepted_candidates | order_memory | contaminated | 278/279 | 1 | linear_N | 4.565 | 0.899 |
tools/data/reports/agent_20260509_1400.md:60:| accepted_candidates | order_memory r0.52 | complete | 279/279 | 0 | linear_N | 5.926 | 0.781 |
tools/data/reports/agent_20260509_1400.md:68:| accepted_candidates | periodic_closure r0.48 | 102/393 | 291 |
tools/data/reports/agent_20260509_1400.md:69:| accepted_candidates | periodic_closure r0.50 | 102/393 | 291 |
tools/data/reports/agent_20260509_1400.md:70:| accepted_candidates | periodic_closure r0.52 | 102/393 | 291 |
tools/data/reports/agent_20260509_1400.md:76:| per_mode_best:order_memory:r0.52 | linear_N | 1.885 |
tools/data/reports/agent_20260509_1400.md:77:| per_mode_best:periodic_closure:r0.48 | inv_N | 1.244 |
tools/data/reports/agent_20260509_1400.md:78:| per_mode_best:periodic_closure:r0.50 | inv_N | 1.378 |
tools/data/reports/agent_20260509_1400.md:79:| per_mode_best:periodic_closure:r0.52 | inv_N | 1.257 |
tools/data/reports/agent_20260509_1400.md:82:1. **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.
tools/data/reports/agent_20260509_1400.md:83:2. **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`.
tools/data/reports/agent_20260509_1400.md:84:3. **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.
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_1400.md:91:Nel 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':
tools/data/reports/agent_20260509_1400.md:102:Il 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.
tools/data/reports/agent_20260509_1400.md:109:- **L4 edge cases**: `order_memory:r0.52` best-per-mode ha delta AICc 1.885, quindi famiglia non identificata hard nonostante best `linear_N`.
tools/data/operator_directives_consumed/operator_directive_20260509_0837.md:6:Nel prossimo ciclo usa solo confronti row-aligned quando colleghi
tools/data/operator_directives_consumed/operator_directive_20260509_1427.md:18:null/surrogate row-aligned per una coppia blank GUE/Poisson:
tools/data/reports/agent_20260509_1409.md:1:# Agent Report - Boundary Denominator Prescan
tools/data/reports/agent_20260509_1409.md:8:**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.
tools/data/reports/agent_20260509_1409.md:16:- **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.
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:81:5. **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.
tools/data/reports/agent_20260509_1409.md:86:Nel 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.
tools/data/reports/agent_20260509_1409.md:93:- **Invariante di passaggio**: il null row-aligned decide il transfer; la classe sorgente non decide.
tools/data/reports/agent_20260509_1409.md:97:Il 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.
tools/data/reports/agent_20260508_2108.md:14:- **Operatori laterali scelti**: boundary operator, random walk, entropia. Boundary operator definisce il bordo prime-free; random walk fornisce il null di permutazione della carica; entropia entra come dispersione del vuoto senza primi.
tools/data/evolution/evolution_20260509_1427.md:3:Ho mantenuto il focus sul passo: blank trasformato in condizione di `null row-aligned`, attrito del jsonl mancante, nodo regressivo su mini-traccia provider-independent e mappa preventiva `null_state`, consecutio sui tre blank residui.
tools/data/reports/agent_20260509_1457.md:1:# Agent Report - Vc Unit Boundary Audit
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:52:| order_memory | 1 | 5 | 0 |
tools/data/reports/agent_20260509_1457.md:53:| periodic_closure | 0 | 1 | 2 |
tools/data/reports/agent_20260509_1457.md:63:| per_mode_best:order_memory:r0.48 | complete | 48/48 | 0 | 1.432 | 0.893 | crosses_down | 315.760 |
tools/data/reports/agent_20260509_1457.md:64:| per_mode_best:order_memory:r0.50 | complete | 48/48 | 0 | 1.317 | 0.774 | crosses_down | 255.737 |
tools/data/reports/agent_20260509_1457.md:65:| per_mode_best:order_memory:r0.52 | complete | 48/48 | 0 | 1.218 | 0.688 | crosses_down | 188.585 |
tools/data/reports/agent_20260509_1457.md:66:| accepted_candidates:order_memory:r0.48 | contaminated | 273/279 | 6 | 1.474 | 1.069 | all_above | blank |
tools/data/reports/agent_20260509_1457.md:67:| accepted_candidates:order_memory:r0.50 | contaminated | 278/279 | 1 | 1.350 | 0.899 | crosses_down | 332.733 |
tools/data/reports/agent_20260509_1457.md:68:| accepted_candidates:order_memory:r0.52 | complete | 279/279 | 0 | 1.236 | 0.781 | crosses_down | 272.895 |
tools/data/reports/agent_20260509_1457.md:74:| per_mode_best:periodic_closure:r0.48 | 105.734 |
tools/data/reports/agent_20260509_1457.md:76:| per_mode_best:order_memory:r0.52 | 188.585 |
tools/data/reports/agent_20260509_1457.md:77:| per_mode_best:order_memory:r0.50 | 255.737 |
tools/data/reports/agent_20260509_1457.md:78:| accepted_candidates:order_memory:r0.52 | 272.895 |
tools/data/reports/agent_20260509_1457.md:80:| per_mode_best:order_memory:r0.48 | 315.760 |
tools/data/reports/agent_20260509_1457.md:81:| accepted_candidates:order_memory:r0.50 | 332.733 |
tools/data/reports/agent_20260509_1457.md:85:2. **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`.
tools/data/reports/agent_20260509_1457.md:86:3. **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.
tools/data/reports/agent_20260509_1457.md:87:4. **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.
tools/data/reports/agent_20260509_1457.md:93:`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}.
tools/data/operator_directives_consumed/operator_directive_20260509_1409.md:9:- `periodic_closure` e' stato trattato come famiglia distinta mentre i dati
tools/data/reports/agent_20260509_0652.md:8:**observable_contract**: claim=un null che preserva il gap-label set Sturmian puo' decidere se `V_c` e' portato dal label-set o dall'ordine generativo; observable=`event_type={floor_hit,internal_cross,internal_multi,no_cross}`, `vc_interp`, `r_floor`, `r_span`, `label_jaccard`, `acceptance_rate`; operator=surrogate bilanciato con swap 0/1 e ricottura finche' `label_jaccard>=0.75`, poi curva `r(V)` su griglia 0.5..3.0 step 0.01; generator=phi Sturmian, balanced_random, swap_label_surrogate; denominator=run principale N={89}, phase={0,0.25,0.5,0.75}, r_threshold={0.48,0.50,0.52}, random_trials=1, label_trials=2, swap_steps=3000, seed=202605090652; non_possible=se i surrogate accettati Jaccard>=0.75 producono floor-hit o internal_multi e restano con `r_floor`/`vc_interp` vicini al random, il label-set non basta a ricostruire il boundary Sturmian; not_tested=GUE/Poisson reali, silver/bronze, fit power-law, gap_ratio, prova a N>=144 con gate raggiunto.
tools/data/reports/agent_20260509_0652.md:36:  - `no_cross`: non attraversa.
tools/data/reports/agent_20260508_2013.md:14:- **Operatori laterali scelti**: boundary operator, indice, rappresentazione. Boundary operator misura il taglio; indice porta il gap nello spazio posizionale; rappresentazione Zeckendorf traduce il centro in cifre Fibonacci.
tools/data/reports/agent_20260508_2013.md:29:- Boundary: prefissi dei chunk dopo la perturbazione del tiling.

exec
/bin/bash -lc 'python tools/dnd_scenario.py --best' in /opt/MM_D-ND
 succeeded in 134ms:
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

exec
/bin/bash -lc "sed -n '1,260p' tools/exp_boundary_row_aligned_nonexact_audit.py" in /opt/MM_D-ND
 succeeded in 0ms:
#!/usr/bin/env python3
"""
Audit BOUNDARY rows where support transfers but beta 0.3 is not exact.

The operator is row-aligned with the 1532 two-axis matrix and deliberately
does not read GUE/Poisson labels as decision fields. It only uses support,
beta-state, denominator telemetry, shuffle telemetry, and measured gate
strength.
"""

from __future__ import annotations

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


NONEXACT_STATES = {
    "beta_0_3_local_nonunique",
    "local_beta_other",
    "support_without_beta_blank",
}


def row_key(domain: str, cycle: int) -> str:
    return f"{domain}:cycle_{cycle}"


def build_prescan_index(data: dict[str, Any]) -> dict[str, dict[str, Any]]:
    index: dict[str, dict[str, Any]] = {}
    for row in data.get("rows", []):
        key = row_key(row["domain"], row["cycle"])
        observable = row.get("observable", {})
        null = row.get("null_surrogate", {})
        index[key] = {
            "denominator_state": row.get("denominator_state"),
            "excluded_mass": row.get("excluded_mass"),
            "observable_name": observable.get("name"),
            "observable_value": observable.get("value"),
            "n_points": observable.get("n_points"),
            "null_name": null.get("name"),
            "shuffle_z_score": null.get("z_score"),
            "shuffle_class_changes": null.get("class_changes"),
            "domain_window": row.get("domain_window"),
        }
    return index


def beta_span(beta: list[float]) -> float:
    if len(beta) < 2:
        return 0.0
    return max(beta) - min(beta)


def support_tier(row: dict[str, Any]) -> str:
    n_obs = 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)
    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 coordinate_failure(row: dict[str, Any]) -> str:
    state = row["beta_state"]
    beta = row.get("ambiguous_beta", [])
    tier = support_tier(row)
    if state == "beta_0_3_local_nonunique":
        if len(beta) >= 5:
            return "beta_grid_saturation"
        return "adjacent_beta_interval"
    if state == "local_beta_other":
        return "coordinate_shifted"
    if state == "support_without_beta_blank":
        if tier == "thin_observable_support":
            return "blank_thin_support"
        return "blank_despite_multi_observable_support"
    return "not_in_scope"


def build_audit(two_axis: dict[str, Any], prescan: dict[str, Any]) -> dict[str, Any]:
    prescan_index = build_prescan_index(prescan)
    exact_rows = [
        row for row in two_axis.get("rows", [])
        if row.get("support_transfer") and row.get("beta_coordinate_transfer")
    ]
    nonexact_rows = [
        row for row in two_axis.get("rows", [])
        if row.get("support_transfer") and row.get("beta_state") in NONEXACT_STATES
    ]
    fall_rows = [
        row for row in two_axis.get("rows", [])
        if not row.get("support_transfer")
    ]

    rows = []
    counts: dict[str, int] = {
        "total_rows": len(two_axis.get("rows", [])),
        "support_transfer_rows": len(exact_rows) + len(nonexact_rows),
        "beta_exact_rows": len(exact_rows),
        "support_nonexact_rows": len(nonexact_rows),
        "fall_rows": len(fall_rows),
    }
    by_state: dict[str, int] = {}
    by_failure: dict[str, int] = {}
    by_tier: dict[str, int] = {}

    for row in nonexact_rows:
        key = row["row"]
        beta = row.get("ambiguous_beta", [])
        failure = coordinate_failure(row)
        tier = support_tier(row)
        by_state[row["beta_state"]] = by_state.get(row["beta_state"], 0) + 1
        by_failure[failure] = by_failure.get(failure, 0) + 1
        by_tier[tier] = by_tier.get(tier, 0) + 1
        rows.append({
            "row": key,
            "beta_state": row["beta_state"],
            "coordinate_failure": failure,
            "support_tier": tier,
            "ambiguous_beta": beta,
            "beta_cardinality": len(beta),
            "beta_span": round(beta_span(beta), 10),
            "one_sided_count": len(row.get("one_sided_observables", [])),
            "one_sided_observables": row.get("one_sided_observables", []),
            "stable_count_coherent": row.get("stable_count_coherent"),
            "stable_count_illusory": row.get("stable_count_illusory"),
            "endpoint_distance": row.get("endpoint_distance"),
            "n_gaps": row.get("n_gaps"),
            "prescan": prescan_index.get(key, {}),
        })

    exact_endpoint = [float(row.get("endpoint_distance") or 0.0) for row in exact_rows]
    nonexact_endpoint = [float(row.get("endpoint_distance") or 0.0) for row in nonexact_rows]
    exact_obs = [len(row.get("one_sided_observables", [])) for row in exact_rows]
    nonexact_obs = [len(row.get("one_sided_observables", [])) for row in nonexact_rows]

    counts.update({
        f"state_{key}": value for key, value in sorted(by_state.items())
    })
    counts.update({
        f"failure_{key}": value for key, value in sorted(by_failure.items())
    })
    counts.update({
        f"tier_{key}": value for key, value in sorted(by_tier.items())
    })

    mismatch = counts["support_nonexact_rows"] != 6

    return {
        "experiment": "boundary_row_aligned_nonexact_audit",
        "question": "Which measured condition separates beta local non-unique, beta local other, and support-without-beta rows after the beta 0.3 universal coordinate fails?",
        "source_matrix": two_axis.get("experiment"),
        "source_scope": two_axis.get("source_scope"),
        "prescan_source": "boundary_denominator_prescan_full_20260509_1500",
        "observables_registry": two_axis.get("observables_registry"),
        "observables_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",
        ],
        "label_policy": "Does not use source_domain_type or GUE/Poisson label as an operator.",
        "direction_check": {
            "expected_nonexact_rows_from_field": 6,
            "measured_support_nonexact_rows": counts["support_nonexact_rows"],
            "mismatch_is_result": mismatch,
        },
        "counts": counts,
        "comparative_means": {
            "exact_endpoint_distance_mean": mean(exact_endpoint) if exact_endpoint else None,
            "nonexact_endpoint_distance_mean": mean(nonexact_endpoint) if nonexact_endpoint else None,
            "exact_one_sided_count_mean": mean(exact_obs) if exact_obs else None,
            "nonexact_one_sided_count_mean": mean(nonexact_obs) if nonexact_obs else None,
        },
        "rows": rows,
        "falls": [
            {
                "row": row["row"],
                "raw_beta_exact_0_3": row.get("raw_beta_exact_0_3"),
                "ambiguous_beta": row.get("ambiguous_beta", []),
                "one_sided_count": len(row.get("one_sided_observables", [])),
                "stable_count_illusory": row.get("stable_count_illusory"),
                "endpoint_distance": row.get("endpoint_distance"),
            }
            for row in fall_rows
        ],
    }


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--matrix", default="tools/data/boundary_two_axis_matrix_20260509_1532.json")
    parser.add_argument("--prescan", default="tools/data/boundary_denominator_prescan_full_20260509_1500.json")
    parser.add_argument("--out", default="tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json")
    args = parser.parse_args()

    with Path(args.matrix).open() as f:
        two_axis = json.load(f)
    with Path(args.prescan).open() as f:
        prescan = json.load(f)

    output = build_audit(two_axis, prescan)
    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"total_rows={c['total_rows']}")
    print(f"support_transfer_rows={c['support_transfer_rows']}")
    print(f"beta_exact_rows={c['beta_exact_rows']}")
    print(f"support_nonexact_rows={c['support_nonexact_rows']}")
    print(f"fall_rows={c['fall_rows']}")
    print(f"direction_expected_nonexact=6 measured={c['support_nonexact_rows']}")
    for key, value in sorted(c.items()):
        if key.startswith("state_") or key.startswith("failure_") or key.startswith("tier_"):
            print(f"{key}={value}")
    print(f"saved {out}")


if __name__ == "__main__":
    main()

exec
/bin/bash -lc "sed -n '1,240p' tools/exp_boundary_two_axis_matrix.py" in /opt/MM_D-ND
 succeeded in 0ms:
#!/usr/bin/env python3
"""
Build the two-axis BOUNDARY matrix requested by the 1532 cycle.

Input is a row-aligned semi-real boundary gate deposit. The operator deliberately
does not use GUE/Poisson source labels: it only reads transfer support and beta
coordinate state from each row's measured gate fields.
"""

from __future__ import annotations

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


def norm_beta(values: list[float]) -> list[float]:
    return [round(float(v), 1) for v in values]


def beta_state(row: dict[str, Any], support_transfer: bool) -> str:
    beta = norm_beta(row.get("ambiguous_beta_one_sided_gated", []))
    if not support_transfer:
        return "fall_no_support"
    if not beta:
        return "support_without_beta_blank"
    if beta == [0.3]:
        return "beta_0_3_exact"
    if 0.3 in beta:
        return "beta_0_3_local_nonunique"
    return "local_beta_other"


def build_matrix(data: dict[str, Any]) -> dict[str, Any]:
    source_rows = data.get("evaluation", {}).get("rows", {})
    if not isinstance(source_rows, dict) or not source_rows:
        raise ValueError("input does not contain evaluation.rows")

    rows = []
    counts = {
        "rows": 0,
        "support_transfer_true": 0,
        "support_transfer_false": 0,
        "raw_beta_exact_0_3": 0,
        "raw_beta_exact_0_3_without_support": 0,
        "beta_coordinate_exact_0_3": 0,
        "beta_coordinate_local_nonunique_0_3": 0,
        "beta_coordinate_other": 0,
        "support_without_beta_blank": 0,
        "fall_no_support": 0,
    }

    for name, row in sorted(source_rows.items()):
        state = row.get("state")
        support_transfer = state in {"transfer_with_blank", "transfer_no_blank"}
        beta = norm_beta(row.get("ambiguous_beta_one_sided_gated", []))
        b_state = beta_state(row, support_transfer)
        beta_coordinate_transfer = support_transfer and b_state == "beta_0_3_exact"

        counts["rows"] += 1
        counts["support_transfer_true" if support_transfer else "support_transfer_false"] += 1
        if beta == [0.3]:
            counts["raw_beta_exact_0_3"] += 1
            if not support_transfer:
                counts["raw_beta_exact_0_3_without_support"] += 1
        if b_state == "beta_0_3_exact":
            counts["beta_coordinate_exact_0_3"] += 1
        elif b_state == "beta_0_3_local_nonunique":
            counts["beta_coordinate_local_nonunique_0_3"] += 1
        elif b_state == "local_beta_other":
            counts["beta_coordinate_other"] += 1
        elif b_state == "support_without_beta_blank":
            counts["support_without_beta_blank"] += 1
        elif b_state == "fall_no_support":
            counts["fall_no_support"] += 1

        rows.append(
            {
                "row": name,
                "support_transfer": support_transfer,
                "beta_coordinate_transfer": beta_coordinate_transfer,
                "beta_state": b_state,
                "raw_beta_exact_0_3": beta == [0.3],
                "ambiguous_beta": beta,
                "one_sided_observables": row.get("coherent_one_sided_observables", []),
                "stable_count_coherent": row.get("stable_count_coherent"),
                "stable_count_illusory": row.get("stable_count_illusory"),
                "endpoint_distance": row.get("endpoint_distance_one_sided_gated"),
                "source_state": state,
                "n_gaps": row.get("n_gaps"),
            }
        )

    counts["support_transfer_ratio"] = counts["support_transfer_true"] / counts["rows"]
    counts["raw_beta_exact_0_3_ratio"] = counts["raw_beta_exact_0_3"] / counts["rows"]
    counts["beta_coordinate_exact_0_3_ratio"] = counts["beta_coordinate_exact_0_3"] / counts["rows"]
    counts["any_beta_blank_on_support"] = (
        counts["beta_coordinate_exact_0_3"]
        + counts["beta_coordinate_local_nonunique_0_3"]
        + counts["beta_coordinate_other"]
    )
    counts["any_beta_blank_on_support_ratio"] = counts["any_beta_blank_on_support"] / counts["rows"]

    return {
        "experiment": "boundary_two_axis_matrix",
        "question": "Separate support_transfer from beta_coordinate_transfer on the 13 semi-real BOUNDARY rows without using GUE/Poisson labels.",
        "source": data.get("experiment"),
        "source_scope": data.get("source_scope"),
        "observables_registry": data.get("observables_registry"),
        "observables_used": [
            "support_transfer",
            "beta_coordinate_transfer",
            "beta_state",
            "ambiguous_beta",
            "stable_count_coherent",
            "stable_count_illusory",
            "endpoint_distance",
        ],
        "label_policy": "GUE/Poisson source labels are not read by this operator.",
        "axis_contract": {
            "raw_beta_exact_0_3": "ambiguous_beta is exactly [0.3], independent of support",
            "beta_coordinate_transfer": "raw_beta_exact_0_3 and support_transfer are both true",
            "edge_case": "raw beta 0.3 without support remains a beta observation, not a transfer coordinate",
        },
        "counts": counts,
        "rows": rows,
    }


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("--input", default="tools/data/semireal_boundary_transfer_gate_20260509_1516.json")
    parser.add_argument("--out", default="tools/data/boundary_two_axis_matrix_20260509_1532.json")
    args = parser.parse_args()

    with Path(args.input).open() as f:
        data = json.load(f)

    output = build_matrix(data)
    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['rows']}")
    print(f"support_transfer={c['support_transfer_true']}/{c['rows']}")
    print(f"raw_beta_exact_0_3={c['raw_beta_exact_0_3']}/{c['rows']}")
    print(f"raw_beta_exact_0_3_without_support={c['raw_beta_exact_0_3_without_support']}/{c['rows']}")
    print(f"beta_coordinate_exact_0_3={c['beta_coordinate_exact_0_3']}/{c['rows']}")
    print(f"any_beta_blank_on_support={c['any_beta_blank_on_support']}/{c['rows']}")
    print(f"support_without_beta_blank={c['support_without_beta_blank']}/{c['rows']}")
    print(f"fall_no_support={c['fall_no_support']}/{c['rows']}")
    print(f"saved {out}")


if __name__ == "__main__":
    main()

exec
/bin/bash -lc "find tools/data -maxdepth 3 -type f | rg 'boundary|semireal|two_axis|nonexact|prescan'" in /opt/MM_D-ND
exec
/bin/bash -lc "sed -n '1,150p' tools/data/reports/agent_20260509_1538.md" in /opt/MM_D-ND
 succeeded in 0ms:
tools/data/semireal_order_denominator_gate_20260507_0923_seedcheck.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/semireal_boundary_transfer_gate_20260509_1516.json
tools/data/two_channel_boundary.json
tools/data/boundary_blank_null_audit_20260509_1430.json
tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json
tools/data/vc_unit_boundary_audit_20260509_1457.json
tools/data/boundary_mixture_gate_20260507_0330.json
tools/data/boundary_coherence.json
tools/data/boundary_blank_null_audit_residual_20260509_1500.json
tools/data/boundary_shuffle_audit.json
tools/data/3d_boundary_layers.json
tools/data/semireal_order_denominator_gate_20260507_0923.json
tools/data/boundary_mixture_gate_20260507_0330_seedcheck.json
tools/data/reports/exp_boundary_growth_20260405_0914.json
tools/data/reports/exp_boundary_20260405_0825.json
tools/data/boundary_two_axis_matrix_20260509_1532.json

 succeeded in 0ms:
# Agent Report - Boundary Row-Aligned Nonexact Audit
**Date**: 2026-05-09 15:38  
**Piano**: 110  
**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE  
**verdict**: CONSTRAINT - le righe support-transfer non esatte sono 7, non 6; la beta cade in cinque failure modes misurabili  
observables_registry: 1.0.0-2026-05-06  
observables_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.  
**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`.

## Respiro fuori-tempo
- **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.
- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY 13 righe + tensione "supporto senza coordinata universale".
- **Dipolo / punto-zero**: beta come coordinata / supporto come passaggio; punto-zero = riga support-transfer prima che il blank beta venga interpretato.
- **Piano superiore**: boundary operator su matrice row-aligned. Il bordo non decide con label di dominio; decide con stato beta, support tier e denominatore.
- **Operatori laterali scelti**: boundary operator, sheaf locale/perimetro, coordinate chart. Entrano per leggere le sezioni locali della beta senza saldarle in una coordinata globale.
- **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.
- **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.
- **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.
- **Proiezione**: misurare, sulle righe support-transfer non esatte, `beta_cardinality`, `beta_span`, `one_sided_count`, `endpoint_distance`, denominatore e shuffle z-score.

## Aderenza alla direzione
- `relation`: follows_direction
- `why`: attacca direttamente beta local non-unique, beta local other e support_without_beta_blank sul deposito row-aligned indicato.
- `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.

## Claim Under Test
> 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.

## Question
Quando beta 0.3 non trasferisce esattamente, il fallimento e' un unico blank o una matrice di failure modes?

## Experiment Design
- Nuovo strumento: `tools/exp_boundary_row_aligned_nonexact_audit.py`.
- Input 1: `tools/data/boundary_two_axis_matrix_20260509_1532.json`.
- Input 2: `tools/data/boundary_denominator_prescan_full_20260509_1500.json`.
- Output: `tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json`.
- Perimetro atomico: 13 righe semi-reali; subset primario = support-transfer con `beta_coordinate_transfer=false`.
- Label policy: non legge `source_domain_type` o label GUE/Poisson come decision field.
- Classi operative: `adjacent_beta_interval`, `beta_grid_saturation`, `coordinate_shifted`, `blank_despite_multi_observable_support`, `blank_thin_support`.

## Results

Indice globale:

| measure | value |
|---|---:|
| total rows | 13 |
| support-transfer rows | 11 |
| beta 0.3 exact rows | 4 |
| support-transfer nonexact rows | 7 |
| expected nonexact rows from field | 6 |
| fall rows | 2 |
| exact endpoint distance mean | 3.829 |
| nonexact endpoint distance mean | 2.957 |
| exact one-sided count mean | 4.000 |
| nonexact one-sided count mean | 2.714 |

Failure modes:

| coordinate_failure | rows |
|---|---:|
| adjacent_beta_interval | 1 |
| beta_grid_saturation | 1 |
| coordinate_shifted | 1 |
| blank_despite_multi_observable_support | 1 |
| blank_thin_support | 3 |

Audit row-aligned:

| row | beta_state | coordinate_failure | support_tier | beta | one-sided | endpoint | denominator |
|---|---|---|---|---|---:|---:|---|
| brownian_motion:cycle_12 | beta_0_3_local_nonunique | adjacent_beta_interval | strong_multi_observable | 0.2,0.3 | 4 | 3.885 | complete |
| ising_2d:cycle_1 | local_beta_other | coordinate_shifted | strong_multi_observable | 0.4 | 5 | 4.309 | contaminated |
| logistica_biforcazione:cycle_5 | beta_0_3_local_nonunique | beta_grid_saturation | medium_multi_observable | 0.1-0.9 | 3 | 3.258 | complete |
| numeri_primi:cycle_3 | support_without_beta_blank | blank_despite_multi_observable_support | medium_multi_observable | [] | 3 | 3.243 | complete |
| percolation:cycle_9 | support_without_beta_blank | blank_thin_support | thin_observable_support | [] | 1 | 1.705 | complete |
| random_matrix:cycle_7 | support_without_beta_blank | blank_thin_support | thin_observable_support | [] | 1 | 1.854 | complete |
| zeta_zeros:cycle_4 | support_without_beta_blank | blank_thin_support | thin_observable_support | [] | 2 | 2.449 | contaminated |

Fall controls:

| row | ambiguous_beta | one-sided | stable_count_illusory | endpoint |
|---|---|---:|---:|---:|
| cellular_automata:cycle_8 | [] | 0 | 0.500 | 0.000 |
| pendolo_doppio:cycle_2 | 0.3 | 3 | 0.833 | 3.388 |

## Key Findings
1. **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.
2. **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.
3. **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.
4. **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.
5. **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.

## Verdict
**CONSTRAINT**.

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:

`adjacent_beta_interval`, `beta_grid_saturation`, `coordinate_shifted`, `blank_despite_multi_observable_support`, `blank_thin_support`.

Formula valida:

`beta_coordinate_transfer` = chart locale exact 0.3 dentro supporto vivo.

Formula non valida:

`support_transfer non-exact = sei righe residue` oppure `support_without_beta_blank = assenza strutturale unica`.

Il nodo regressivo e' il denominatore della consecutio: non bisogna salvare il "6"; bisogna usare il deposito row-aligned che mostra 7.

## Bicono della scoperta
- **Due radici**: coordinata beta locale / supporto ordine-null.
- **Singolare**: riga support-transfer non exact, dove il supporto resta vivo ma la chart beta non coincide.
- **Invariante di passaggio**: failure mode row-aligned; non label GUE/Poisson e non beta 0.3 globale.
- **Campo di possibilita**: qui diventa possibile auditare la beta come atlante locale; qui diventa non-possibile trattare il blank beta come una sola specie.

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

## Auto-audit: source flags e 7 lenti
- **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`.
- **L1 hard constraint**: claim limitato alle 13 righe della matrice 15:32 e al prescan 15:00.
- **L2 count grezzi**: riportati 11/13 support-transfer, 4/13 beta exact, 7/13 support nonexact, 2/13 fall.
- **L3 no silent patching**: nessuna esclusione manuale per far tornare 6; mismatch dichiarato.
- **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.
- **L5 re-discovery**: il ciclo non rifà gate o fit; legge solo la partizione non-esatta richiesta.
- **L6 metabolismo cognitivo**: CE-0001, CE-0117, YSN e PVI usati nella combo.
- **L7 possibile/non-possibile**: possibile = atlante locale delle beta; non-possibile = beta 0.3 universale o residuo non-esatto singolo.

## Telemetria
- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.
- Verifica script: `python -m py_compile tools/exp_boundary_row_aligned_nonexact_audit.py`.
- 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`.
- Output: `support_nonexact_rows=7`, `fall_rows=2`, `failure_blank_thin_support=3`, `failure_blank_despite_multi_observable_support=1`.
- Git state: worktree gia' sporco da cicli e pubblicazioni precedenti; questo cycle aggiunge lo script 15:38, il JSON 15:38 e questo report.

## Files
- Script nuovo: `tools/exp_boundary_row_aligned_nonexact_audit.py`
- Data: `tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json`
- Report: `tools/data/reports/agent_20260509_1538.md`

codex
La consecutio utile è stretta: confrontare i tre blank sottili con `numeri_primi`, che ha lo stesso stato beta ma supporto medio. Preparo un audit dedicato su quel sotto-perimetro: se il blank sottile è solo denominatore corto/contaminato, deve separarsi per `n_gaps`, stato denominatore o null; se non si separa lì, è una specie autonoma del boundary.
exec
/bin/bash -lc "python -m json.tool tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json | sed -n '1,260p'" in /opt/MM_D-ND
 succeeded in 0ms:
{
    "experiment": "boundary_row_aligned_nonexact_audit",
    "question": "Which measured condition separates beta local non-unique, beta local other, and support-without-beta rows after the beta 0.3 universal coordinate fails?",
    "source_matrix": "boundary_two_axis_matrix",
    "source_scope": "tools/data/boundary_denominator_prescan_full_20260509_1500.json",
    "prescan_source": "boundary_denominator_prescan_full_20260509_1500",
    "observables_registry": "1.0.0-2026-05-06",
    "observables_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"
    ],
    "label_policy": "Does not use source_domain_type or GUE/Poisson label as an operator.",
    "direction_check": {
        "expected_nonexact_rows_from_field": 6,
        "measured_support_nonexact_rows": 7,
        "mismatch_is_result": true
    },
    "counts": {
        "total_rows": 13,
        "support_transfer_rows": 11,
        "beta_exact_rows": 4,
        "support_nonexact_rows": 7,
        "fall_rows": 2,
        "state_beta_0_3_local_nonunique": 2,
        "state_local_beta_other": 1,
        "state_support_without_beta_blank": 4,
        "failure_adjacent_beta_interval": 1,
        "failure_beta_grid_saturation": 1,
        "failure_blank_despite_multi_observable_support": 1,
        "failure_blank_thin_support": 3,
        "failure_coordinate_shifted": 1,
        "tier_medium_multi_observable": 2,
        "tier_strong_multi_observable": 2,
        "tier_thin_observable_support": 3
    },
    "comparative_means": {
        "exact_endpoint_distance_mean": 3.828607195910865,
        "nonexact_endpoint_distance_mean": 2.957498618692321,
        "exact_one_sided_count_mean": 4,
        "nonexact_one_sided_count_mean": 2.7142857142857144
    },
    "rows": [
        {
            "row": "brownian_motion:cycle_12",
            "beta_state": "beta_0_3_local_nonunique",
            "coordinate_failure": "adjacent_beta_interval",
            "support_tier": "strong_multi_observable",
            "ambiguous_beta": [
                0.2,
                0.3
            ],
            "beta_cardinality": 2,
            "beta_span": 0.1,
            "one_sided_count": 4,
            "one_sided_observables": [
                "SR2",
                "L1",
                "L2",
                "triple_var"
            ],
            "stable_count_coherent": 4.0,
            "stable_count_illusory": 0.16666666666666666,
            "endpoint_distance": 3.8849187765851725,
            "n_gaps": 4096,
            "prescan": {
                "denominator_state": "complete",
                "excluded_mass": 0.0,
                "observable_name": "spacing_r",
                "observable_value": 0.4893850507668893,
                "n_points": 5000,
                "null_name": "shuffle_r_statistic",
                "shuffle_z_score": -1.6,
                "shuffle_class_changes": false,
                "domain_window": "brownian_motion:cycle_12"
            }
        },
        {
            "row": "ising_2d:cycle_1",
            "beta_state": "local_beta_other",
            "coordinate_failure": "coordinate_shifted",
            "support_tier": "strong_multi_observable",
            "ambiguous_beta": [
                0.4
            ],
            "beta_cardinality": 1,
            "beta_span": 0.0,
            "one_sided_count": 5,
            "one_sided_observables": [
                "SR",
                "SR2",
                "L1",
                "L2",
                "triple_var"
            ],
            "stable_count_coherent": 5.0,
            "stable_count_illusory": 0.3333333333333333,
            "endpoint_distance": 4.308544591024874,
            "n_gaps": 699,
            "prescan": {
                "denominator_state": "contaminated",
                "excluded_mass": 0.81,
                "observable_name": "spacing_r",
                "observable_value": 0.9022289766970617,
                "n_points": 5000,
                "null_name": "shuffle_r_statistic",
                "shuffle_z_score": -0.1,
                "shuffle_class_changes": false,
                "domain_window": "ising_2d:cycle_1"
            }
        },
        {
            "row": "logistica_biforcazione:cycle_5",
            "beta_state": "beta_0_3_local_nonunique",
            "coordinate_failure": "beta_grid_saturation",
            "support_tier": "medium_multi_observable",
            "ambiguous_beta": [
                0.1,
                0.2,
                0.3,
                0.4,
                0.5,
                0.6,
                0.7,
                0.8,
                0.9
            ],
            "beta_cardinality": 9,
            "beta_span": 0.8,
            "one_sided_count": 3,
            "one_sided_observables": [
                "SR",
                "SR2",
                "triple_var"
            ],
            "stable_count_coherent": 3.5833333333333335,
            "stable_count_illusory": 0.16666666666666666,
            "endpoint_distance": 3.2579990207828127,
            "n_gaps": 4096,
            "prescan": {
                "denominator_state": "complete",
                "excluded_mass": 0.0,
                "observable_name": "spacing_r",
                "observable_value": 0.997077776975089,
                "n_points": 5000,
                "null_name": "shuffle_r_statistic",
                "shuffle_z_score": 61.6,
                "shuffle_class_changes": false,
                "domain_window": "logistica_biforcazione:cycle_5"
            }
        },
        {
            "row": "numeri_primi:cycle_3",
            "beta_state": "support_without_beta_blank",
            "coordinate_failure": "blank_despite_multi_observable_support",
            "support_tier": "medium_multi_observable",
            "ambiguous_beta": [],
            "beta_cardinality": 0,
            "beta_span": 0.0,
            "one_sided_count": 3,
            "one_sided_observables": [
                "SR",
                "L1",
                "triple_var"
            ],
            "stable_count_coherent": 3.0,
            "stable_count_illusory": 0.16666666666666666,
            "endpoint_distance": 3.2427469463217204,
            "n_gaps": 4096,
            "prescan": {
                "denominator_state": "complete",
                "excluded_mass": 0.0,
                "observable_name": "spacing_r",
                "observable_value": 0.8862068965517241,
                "n_points": 5132,
                "null_name": "shuffle_r_statistic",
                "shuffle_z_score": -26.6,
                "shuffle_class_changes": false,
                "domain_window": "numeri_primi:cycle_3"
            }
        },
        {
            "row": "percolation:cycle_9",
            "beta_state": "support_without_beta_blank",
            "coordinate_failure": "blank_thin_support",
            "support_tier": "thin_observable_support",
            "ambiguous_beta": [],
            "beta_cardinality": 0,
            "beta_span": 0.0,
            "one_sided_count": 1,
            "one_sided_observables": [
                "L1"
            ],
            "stable_count_coherent": 0.8333333333333334,
            "stable_count_illusory": 0.3333333333333333,
            "endpoint_distance": 1.7053713197497773,
            "n_gaps": 190,
            "prescan": {
                "denominator_state": "complete",
                "excluded_mass": 0.0,
                "observable_name": "spacing_r",
                "observable_value": 0.403573544857739,
                "n_points": 200,
                "null_name": "shuffle_r_statistic",
                "shuffle_z_score": 16.1,
                "shuffle_class_changes": true,
                "domain_window": "percolation:cycle_9"
            }
        },
        {
            "row": "random_matrix:cycle_7",
            "beta_state": "support_without_beta_blank",
            "coordinate_failure": "blank_thin_support",
            "support_tier": "thin_observable_support",
            "ambiguous_beta": [],
            "beta_cardinality": 0,
            "beta_span": 0.0,
            "one_sided_count": 1,
            "one_sided_observables": [
                "L2"
            ],
            "stable_count_coherent": 1.0,
            "stable_count_illusory": 0.25,
            "endpoint_distance": 1.8543171371625617,
            "n_gaps": 199,
            "prescan": {
                "denominator_state": "complete",
                "excluded_mass": 0.0,
                "observable_name": "spacing_r",
                "observable_value": 0.5726,
                "n_points": 199,
                "null_name": "shuffle_r_statistic",
                "shuffle_z_score": -14.7,
                "shuffle_class_changes": false,
                "domain_window": "random_matrix:cycle_7"
            }
        },
        {
            "row": "zeta_zeros:cycle_4",
            "beta_state": "support_without_beta_blank",
            "coordinate_failure": "blank_thin_support",
            "support_tier": "thin_observable_support",
            "ambiguous_beta": [],
            "beta_cardinality": 0,
            "beta_span": 0.0,
            "one_sided_count": 2,
            "one_sided_observables": [
                "SR",
                "L2"
            ],
            "stable_count_coherent": 1.9166666666666667,

exec
/bin/bash -lc "python -m json.tool tools/data/boundary_denominator_prescan_full_20260509_1500.json | sed -n '1,260p'" in /opt/MM_D-ND
 succeeded in 0ms:
{
    "experiment": "boundary_denominator_prescan",
    "question": "Does denominator_state transfer beyond V_c on the 8 GUE / 5 Poisson boundary perimeter?",
    "perimeter": "base autoricerca cycles 1..13: 8 GUE-like, 5 Poisson-like",
    "observable_contract": {
        "claim": "denominator_state gate transfer beyond V_c",
        "observable": "spacing_r label row with shuffle/null availability",
        "operator": "row-aligned domain/window prescan",
        "null": "boundary_shuffle_audit shuffle r-statistic when present",
        "non_possible": "claiming transfer where null/surrogate is absent",
        "extra_null_audits": [
            "tools/data/boundary_blank_null_audit_20260509_1430.json",
            "tools/data/boundary_blank_null_audit_residual_20260509_1500.json"
        ]
    },
    "summary": {
        "n_rows": 13,
        "by_transfer": {
            "transfers": 13
        },
        "by_denominator_state": {
            "contaminated": 5,
            "complete": 8
        },
        "by_source_domain_type": {
            "GUE": 8,
            "Poisson": 5
        },
        "transfer_scope": [
            "ising_2d:cycle_1",
            "pendolo_doppio:cycle_2",
            "numeri_primi:cycle_3",
            "zeta_zeros:cycle_4",
            "logistica_biforcazione:cycle_5",
            "string_vibration:cycle_6",
            "random_matrix:cycle_7",
            "cellular_automata:cycle_8",
            "percolation:cycle_9",
            "coupled_oscillators:cycle_10",
            "reaction_diffusion:cycle_11",
            "brownian_motion:cycle_12",
            "logistica_biforcazione_var_3.5699:cycle_13"
        ],
        "blank_scope": [],
        "falls_scope": []
    },
    "rows": [
        {
            "domain_window": "ising_2d:cycle_1",
            "domain": "ising_2d",
            "cycle": 1,
            "source_domain_type": "GUE",
            "denominator_state": "contaminated",
            "excluded_mass": 0.81,
            "observable": {
                "name": "spacing_r",
                "defined": true,
                "value": 0.9022289766970617,
                "label": "GUE-like",
                "n_points": 5000
            },
            "null_surrogate": {
                "name": "shuffle_r_statistic",
                "status": "shuffle z=-0.10; class_change=False",
                "domain_key": "ising_2d",
                "n_gaps": 95,
                "r_shuffled_mean": 0.9859,
                "z_score": -0.1,
                "class_changes": false
            },
            "transfer": "transfers"
        },
        {
            "domain_window": "pendolo_doppio:cycle_2",
            "domain": "pendolo_doppio",
            "cycle": 2,
            "source_domain_type": "Poisson",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "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": {
                "name": "spacing_r",
                "defined": true,
                "value": 0.8613707165109022,
                "label": "GUE-like",
                "n_points": 5000
            },
            "null_surrogate": {
                "name": "shuffle_r_statistic",
                "status": "shuffle z=-0.10; class_change=False",
                "domain_key": "cell_auto",
                "n_gaps": 105,
                "r_shuffled_mean": 0.8455,
                "z_score": -0.1,
                "class_changes": false
            },
            "transfer": "transfers"
        },
        {
            "domain_window": "percolation:cycle_9",
            "domain": "percolation",
            "cycle": 9,
            "source_domain_type": "Poisson",
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "observable": {
                "name": "spacing_r",
                "defined": true,
                "value": 0.403573544857739,
                "label": "Poisson-like",
                "n_points": 200

exec
/bin/bash -lc "python -m json.tool tools/data/semireal_boundary_transfer_gate_20260509_1516.json | sed -n '1,260p'" in /opt/MM_D-ND
 succeeded in 112ms:
766837953985152,
                "SR2": 1.3509146400904306,
                "L1": 1.3332366075393172,
                "L2": 4.0791206561215,
                "triple_var": 0.5502694844609554
            },
            "z_mean_illusory": {
                "SR": -0.41343984705915154,
                "SR2": 0.07277412425158099,
                "L1": -0.355206436159182,
                "L2": 0.20914243462343277,
                "triple_var": -0.19380298901399437
            },
            "endpoint_distance_all": 2.949876494516273,
            "endpoint_distance_one_sided_gated": 1.8543171371625617,
            "ambiguous_beta_one_sided_gated": []
        },
        "cellular_automata:cycle_8": {
            "n_gaps": 108,
            "coherent_one_sided_observables": [],
            "endpoint_stable_observables": [],
            "stable_count_coherent": 0.0,
            "stable_count_illusory": 0.5,
            "z_mean_coherent": {
                "SR": 0.21177957574652603,
                "SR2": 0.9979544048942478,
                "L1": 0.5112253336133381,
                "L2": 0.4671310663421746,
                "triple_var": 0.7458658190993708
            },
            "z_mean_illusory": {

exec
/bin/bash -lc "sed -n '1,280p' tools/exp_semireal_boundary_transfer_gate.py 2>/dev/null || rg -n \"semireal_boundary_transfer_gate|ambiguous_beta_one_sided_gated|n_beta\" tools -g '*.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_row_aligned_nonexact_audit_20260509_1538.json | sed -n '260,420p'" in /opt/MM_D-ND
 succeeded in 0ms:
            "stable_count_coherent": 1.9166666666666667,
            "stable_count_illusory": 0.25,
            "endpoint_distance": 2.4485925392193306,
            "n_gaps": 199,
            "prescan": {
                "denominator_state": "contaminated",
                "excluded_mass": 0.602,
                "observable_name": "spacing_r",
                "observable_value": 0.615,
                "n_points": 199,
                "null_name": "shuffle_r_statistic",
                "shuffle_z_score": -2.310593,
                "shuffle_class_changes": false,
                "domain_window": "zeta_zeros:cycle_4"
            }
        }
    ],
    "falls": [
        {
            "row": "cellular_automata:cycle_8",
            "raw_beta_exact_0_3": null,
            "ambiguous_beta": [],
            "one_sided_count": 0,
            "stable_count_illusory": 0.5,
            "endpoint_distance": 0.0
        },
        {
            "row": "pendolo_doppio:cycle_2",
            "raw_beta_exact_0_3": null,
            "ambiguous_beta": [
                0.3
            ],
            "one_sided_count": 3,
            "stable_count_illusory": 0.8333333333333334,
            "endpoint_distance": 3.3880909132625545
        }
    ]
}

exec
/bin/bash -lc "python -m json.tool tools/data/semireal_boundary_transfer_gate_20260509_1516.json | sed -n '260,620p'" in /opt/MM_D-ND
 succeeded in 130ms:
          },
                "endpoint_distance_all": 3.913828166922359,
                "endpoint_distance_one_sided_gated": 3.2579990207828127,
                "ambiguous_beta_one_sided_gated": [
                    0.1,
                    0.2,
                    0.30000000000000004,
                    0.4,
                    0.5,
                    0.6000000000000001,
                    0.7000000000000001,
                    0.8,
                    0.9
                ]
            },
            "string_vibration:cycle_6": {
                "state": "transfer_with_blank",
                "n_gaps": 4096,
                "coherent_one_sided_observables": [
                    "SR",
                    "SR2",
                    "L2",
                    "triple_var"
                ],
                "endpoint_stable_observables": [],
                "stable_count_coherent": 5.0,
                "stable_count_illusory": 0.5,
                "z_mean_coherent": {
                    "SR": 3.7033188341859495,
                    "SR2": 10.743666044965595,
                    "L1": 9.32241084060462,
                    "L2": 24.616129664793608,
                    "triple_var": 18.813029234336383
                },
                "z_mean_illusory": {
                    "SR": 0.10035931631660037,
                    "SR2": 0.24970897408138581,
                    "L1": -0.2516311566131347,
                    "L2": -0.37700020086324715,
                    "triple_var": -0.3920318577098574
                },
                "endpoint_distance_all": 4.298202207857453,
                "endpoint_distance_one_sided_gated": 3.8452538395313747,
                "ambiguous_beta_one_sided_gated": [
                    0.30000000000000004

codex
Sto creando uno script riusabile invece di scrivere solo una lettura manuale del JSON. L'esperimento separa tre ipotesi concorrenti sul blank sottile: denominatore corto, contaminazione del null, oppure specie autonoma dentro `support_without_beta_blank`.
apply patch
patch: completed
/opt/MM_D-ND/tools/exp_boundary_blank_thin_support_audit.py
diff --git a/tools/exp_boundary_blank_thin_support_audit.py b/tools/exp_boundary_blank_thin_support_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..ab1d1b0d8d2fa4ee6960a0ae3d249446ec43749e
--- /dev/null
+++ b/tools/exp_boundary_blank_thin_support_audit.py
@@ -0,0 +1,233 @@
+#!/usr/bin/env python3
+"""
+Audit the thin support-without-beta blanks against the medium prime blank.
+
+The input is the row-aligned nonexact BOUNDARY audit. The operator stays inside
+the support_without_beta_blank subset and asks whether the thin rows separate by
+denominator telemetry, null contamination, or an autonomous support signature.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from statistics import mean
+from typing import Any
+
+
+TARGET_STATE = "support_without_beta_blank"
+THIN_FAILURE = "blank_thin_support"
+
+
+def as_float(value: Any, default: float = 0.0) -> float:
+    if value is None:
+        return default
+    return float(value)
+
+
+def denominator_bucket(row: dict[str, Any], full_gap_floor: int) -> str:
+    n_gaps = int(row.get("n_gaps") or 0)
+    if n_gaps >= full_gap_floor:
+        return "full_denominator"
+    return "short_denominator"
+
+
+def blank_class(row: dict[str, Any], full_gap_floor: int) -> str:
+    thin = row.get("coordinate_failure") == THIN_FAILURE
+    short = denominator_bucket(row, full_gap_floor) == "short_denominator"
+    contaminated = row.get("prescan", {}).get("denominator_state") == "contaminated"
+    class_change = bool(row.get("prescan", {}).get("shuffle_class_changes"))
+    if not thin:
+        return "medium_blank_control"
+    if short and contaminated:
+        return "thin_short_contaminated"
+    if short and class_change:
+        return "thin_short_shuffle_unstable"
+    if short:
+        return "thin_short_complete"
+    return "thin_not_denominator_explained"
+
+
+def summarize(rows: list[dict[str, Any]]) -> dict[str, Any]:
+    if not rows:
+        return {}
+    return {
+        "rows": len(rows),
+        "n_gaps_mean": mean(as_float(row.get("n_gaps")) for row in rows),
+        "one_sided_mean": mean(len(row.get("one_sided_observables", [])) for row in rows),
+        "stable_count_coherent_mean": mean(as_float(row.get("stable_count_coherent")) for row in rows),
+        "endpoint_distance_mean": mean(as_float(row.get("endpoint_distance")) for row in rows),
+        "excluded_mass_mean": mean(as_float(row.get("prescan", {}).get("excluded_mass")) for row in rows),
+        "abs_shuffle_z_mean": mean(abs(as_float(row.get("prescan", {}).get("shuffle_z_score"))) for row in rows),
+    }
+
+
+def build_audit(data: dict[str, Any], full_gap_floor: int) -> dict[str, Any]:
+    blank_rows = [
+        row for row in data.get("rows", [])
+        if row.get("beta_state") == TARGET_STATE
+    ]
+    if not blank_rows:
+        raise ValueError("input has no support_without_beta_blank rows")
+
+    rows = []
+    counts: dict[str, int] = {
+        "support_without_beta_blank_rows": len(blank_rows),
+        "thin_rows": 0,
+        "medium_control_rows": 0,
+        "short_denominator_rows": 0,
+        "contaminated_rows": 0,
+        "shuffle_class_change_rows": 0,
+        "thin_short_rows": 0,
+        "thin_contaminated_rows": 0,
+        "thin_shuffle_class_change_rows": 0,
+        "thin_not_denominator_explained_rows": 0,
+    }
+    by_class: dict[str, int] = {}
+
+    for row in blank_rows:
+        thin = row.get("coordinate_failure") == THIN_FAILURE
+        bucket = denominator_bucket(row, full_gap_floor)
+        prescan = row.get("prescan", {})
+        contaminated = prescan.get("denominator_state") == "contaminated"
+        class_change = bool(prescan.get("shuffle_class_changes"))
+        cls = blank_class(row, full_gap_floor)
+
+        counts["thin_rows" if thin else "medium_control_rows"] += 1
+        if bucket == "short_denominator":
+            counts["short_denominator_rows"] += 1
+        if contaminated:
+            counts["contaminated_rows"] += 1
+        if class_change:
+            counts["shuffle_class_change_rows"] += 1
+        if thin and bucket == "short_denominator":
+            counts["thin_short_rows"] += 1
+        if thin and contaminated:
+            counts["thin_contaminated_rows"] += 1
+        if thin and class_change:
+            counts["thin_shuffle_class_change_rows"] += 1
+        if thin and cls == "thin_not_denominator_explained":
+            counts["thin_not_denominator_explained_rows"] += 1
+        by_class[cls] = by_class.get(cls, 0) + 1
+
+        rows.append({
+            "row": row["row"],
+            "blank_class": cls,
+            "coordinate_failure": row.get("coordinate_failure"),
+            "support_tier": row.get("support_tier"),
+            "denominator_bucket": bucket,
+            "n_gaps": row.get("n_gaps"),
+            "one_sided_count": len(row.get("one_sided_observables", [])),
+            "one_sided_observables": row.get("one_sided_observables", []),
+            "stable_count_coherent": row.get("stable_count_coherent"),
+            "stable_count_illusory": row.get("stable_count_illusory"),
+            "endpoint_distance": row.get("endpoint_distance"),
+            "denominator_state": prescan.get("denominator_state"),
+            "excluded_mass": prescan.get("excluded_mass"),
+            "shuffle_z_score": prescan.get("shuffle_z_score"),
+            "shuffle_class_changes": class_change,
+        })
+
+    thin_rows = [row for row in blank_rows if row.get("coordinate_failure") == THIN_FAILURE]
+    medium_rows = [row for row in blank_rows if row.get("coordinate_failure") != THIN_FAILURE]
+    all_thin_short = bool(thin_rows) and counts["thin_short_rows"] == len(thin_rows)
+    all_thin_contaminated = bool(thin_rows) and counts["thin_contaminated_rows"] == len(thin_rows)
+    all_thin_shuffle_unstable = bool(thin_rows) and counts["thin_shuffle_class_change_rows"] == len(thin_rows)
+
+    if all_thin_short and not all_thin_contaminated:
+        verdict = "DENOMINATOR_LIMITED_NOT_NULL_CONTAMINATION"
+    elif all_thin_contaminated:
+        verdict = "CONTAMINATION_LIMITED"
+    elif counts["thin_not_denominator_explained_rows"] > 0:
+        verdict = "AUTONOMOUS_THIN_BLANK_CANDIDATE"
+    else:
+        verdict = "AMBIGUOUS"
+
+    counts.update({f"class_{key}": value for key, value in sorted(by_class.items())})
+
+    return {
+        "experiment": "boundary_blank_thin_support_audit",
+        "question": "Are thin support-without-beta blanks denominator artifacts, null contamination artifacts, or autonomous boundary species?",
+        "source": data.get("experiment"),
+        "source_scope": data.get("source_scope"),
+        "observables_registry": data.get("observables_registry"),
+        "observables_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",
+        ],
+        "params": {
+            "full_gap_floor": full_gap_floor,
+            "target_state": TARGET_STATE,
+            "thin_failure": THIN_FAILURE,
+        },
+        "label_policy": "Does not use source_domain_type or GUE/Poisson label as an operator.",
+        "tests": {
+            "denominator_artifact": {
+                "condition": "all thin rows have n_gaps below full_gap_floor",
+                "passes": all_thin_short,
+            },
+            "contamination_artifact": {
+                "condition": "all thin rows are prescan contaminated",
+                "passes": all_thin_contaminated,
+            },
+            "shuffle_instability_artifact": {
+                "condition": "all thin rows have shuffle_class_changes=true",
+                "passes": all_thin_shuffle_unstable,
+            },
+            "autonomous_species_counter": {
+                "condition": "at least one thin row is not short-denominator explained",
+                "passes": counts["thin_not_denominator_explained_rows"] > 0,
+            },
+        },
+        "counts": counts,
+        "comparative_means": {
+            "thin": summarize(thin_rows),
+            "medium_control": summarize(medium_rows),
+        },
+        "verdict": verdict,
+        "rows": rows,
+    }
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--input", default="tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json")
+    parser.add_argument("--full-gap-floor", type=int, default=500)
+    parser.add_argument("--out", default="tools/data/boundary_blank_thin_support_audit_20260509_1548.json")
+    args = parser.parse_args()
+
+    with Path(args.input).open() as f:
+        data = json.load(f)
+
+    output = build_audit(data, args.full_gap_floor)
+    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"support_without_beta_blank_rows={c['support_without_beta_blank_rows']}")
+    print(f"thin_rows={c['thin_rows']}")
+    print(f"medium_control_rows={c['medium_control_rows']}")
+    print(f"thin_short_rows={c['thin_short_rows']}")
+    print(f"thin_contaminated_rows={c['thin_contaminated_rows']}")
+    print(f"thin_shuffle_class_change_rows={c['thin_shuffle_class_change_rows']}")
+    print(f"thin_not_denominator_explained_rows={c['thin_not_denominator_explained_rows']}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+
+
+if __name__ == "__main__":
+    main()

diff --git a/tools/exp_boundary_blank_thin_support_audit.py b/tools/exp_boundary_blank_thin_support_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..ab1d1b0d8d2fa4ee6960a0ae3d249446ec43749e
--- /dev/null
+++ b/tools/exp_boundary_blank_thin_support_audit.py
@@ -0,0 +1,233 @@
+#!/usr/bin/env python3
+"""
+Audit the thin support-without-beta blanks against the medium prime blank.
+
+The input is the row-aligned nonexact BOUNDARY audit. The operator stays inside
+the support_without_beta_blank subset and asks whether the thin rows separate by
+denominator telemetry, null contamination, or an autonomous support signature.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from statistics import mean
+from typing import Any
+
+
+TARGET_STATE = "support_without_beta_blank"
+THIN_FAILURE = "blank_thin_support"
+
+
+def as_float(value: Any, default: float = 0.0) -> float:
+    if value is None:
+        return default
+    return float(value)
+
+
+def denominator_bucket(row: dict[str, Any], full_gap_floor: int) -> str:
+    n_gaps = int(row.get("n_gaps") or 0)
+    if n_gaps >= full_gap_floor:
+        return "full_denominator"
+    return "short_denominator"
+
+
+def blank_class(row: dict[str, Any], full_gap_floor: int) -> str:
+    thin = row.get("coordinate_failure") == THIN_FAILURE
+    short = denominator_bucket(row, full_gap_floor) == "short_denominator"
+    contaminated = row.get("prescan", {}).get("denominator_state") == "contaminated"
+    class_change = bool(row.get("prescan", {}).get("shuffle_class_changes"))
+    if not thin:
+        return "medium_blank_control"
+    if short and contaminated:
+        return "thin_short_contaminated"
+    if short and class_change:
+        return "thin_short_shuffle_unstable"
+    if short:
+        return "thin_short_complete"
+    return "thin_not_denominator_explained"
+
+
+def summarize(rows: list[dict[str, Any]]) -> dict[str, Any]:
+    if not rows:
+        return {}
+    return {
+        "rows": len(rows),
+        "n_gaps_mean": mean(as_float(row.get("n_gaps")) for row in rows),
+        "one_sided_mean": mean(len(row.get("one_sided_observables", [])) for row in rows),
+        "stable_count_coherent_mean": mean(as_float(row.get("stable_count_coherent")) for row in rows),
+        "endpoint_distance_mean": mean(as_float(row.get("endpoint_distance")) for row in rows),
+        "excluded_mass_mean": mean(as_float(row.get("prescan", {}).get("excluded_mass")) for row in rows),
+        "abs_shuffle_z_mean": mean(abs(as_float(row.get("prescan", {}).get("shuffle_z_score"))) for row in rows),
+    }
+
+
+def build_audit(data: dict[str, Any], full_gap_floor: int) -> dict[str, Any]:
+    blank_rows = [
+        row for row in data.get("rows", [])
+        if row.get("beta_state") == TARGET_STATE
+    ]
+    if not blank_rows:
+        raise ValueError("input has no support_without_beta_blank rows")
+
+    rows = []
+    counts: dict[str, int] = {
+        "support_without_beta_blank_rows": len(blank_rows),
+        "thin_rows": 0,
+        "medium_control_rows": 0,
+        "short_denominator_rows": 0,
+        "contaminated_rows": 0,
+        "shuffle_class_change_rows": 0,
+        "thin_short_rows": 0,
+        "thin_contaminated_rows": 0,
+        "thin_shuffle_class_change_rows": 0,
+        "thin_not_denominator_explained_rows": 0,
+    }
+    by_class: dict[str, int] = {}
+
+    for row in blank_rows:
+        thin = row.get("coordinate_failure") == THIN_FAILURE
+        bucket = denominator_bucket(row, full_gap_floor)
+        prescan = row.get("prescan", {})
+        contaminated = prescan.get("denominator_state") == "contaminated"
+        class_change = bool(prescan.get("shuffle_class_changes"))
+        cls = blank_class(row, full_gap_floor)
+
+        counts["thin_rows" if thin else "medium_control_rows"] += 1
+        if bucket == "short_denominator":
+            counts["short_denominator_rows"] += 1
+        if contaminated:
+            counts["contaminated_rows"] += 1
+        if class_change:
+            counts["shuffle_class_change_rows"] += 1
+        if thin and bucket == "short_denominator":
+            counts["thin_short_rows"] += 1
+        if thin and contaminated:
+            counts["thin_contaminated_rows"] += 1
+        if thin and class_change:
+            counts["thin_shuffle_class_change_rows"] += 1
+        if thin and cls == "thin_not_denominator_explained":
+            counts["thin_not_denominator_explained_rows"] += 1
+        by_class[cls] = by_class.get(cls, 0) + 1
+
+        rows.append({
+            "row": row["row"],
+            "blank_class": cls,
+            "coordinate_failure": row.get("coordinate_failure"),
+            "support_tier": row.get("support_tier"),
+            "denominator_bucket": bucket,
+            "n_gaps": row.get("n_gaps"),
+            "one_sided_count": len(row.get("one_sided_observables", [])),
+            "one_sided_observables": row.get("one_sided_observables", []),
+            "stable_count_coherent": row.get("stable_count_coherent"),
+            "stable_count_illusory": row.get("stable_count_illusory"),
+            "endpoint_distance": row.get("endpoint_distance"),
+            "denominator_state": prescan.get("denominator_state"),
+            "excluded_mass": prescan.get("excluded_mass"),
+            "shuffle_z_score": prescan.get("shuffle_z_score"),
+            "shuffle_class_changes": class_change,
+        })
+
+    thin_rows = [row for row in blank_rows if row.get("coordinate_failure") == THIN_FAILURE]
+    medium_rows = [row for row in blank_rows if row.get("coordinate_failure") != THIN_FAILURE]
+    all_thin_short = bool(thin_rows) and counts["thin_short_rows"] == len(thin_rows)
+    all_thin_contaminated = bool(thin_rows) and counts["thin_contaminated_rows"] == len(thin_rows)
+    all_thin_shuffle_unstable = bool(thin_rows) and counts["thin_shuffle_class_change_rows"] == len(thin_rows)
+
+    if all_thin_short and not all_thin_contaminated:
+        verdict = "DENOMINATOR_LIMITED_NOT_NULL_CONTAMINATION"
+    elif all_thin_contaminated:
+        verdict = "CONTAMINATION_LIMITED"
+    elif counts["thin_not_denominator_explained_rows"] > 0:
+        verdict = "AUTONOMOUS_THIN_BLANK_CANDIDATE"
+    else:
+        verdict = "AMBIGUOUS"
+
+    counts.update({f"class_{key}": value for key, value in sorted(by_class.items())})
+
+    return {
+        "experiment": "boundary_blank_thin_support_audit",
+        "question": "Are thin support-without-beta blanks denominator artifacts, null contamination artifacts, or autonomous boundary species?",
+        "source": data.get("experiment"),
+        "source_scope": data.get("source_scope"),
+        "observables_registry": data.get("observables_registry"),
+        "observables_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",
+        ],
+        "params": {
+            "full_gap_floor": full_gap_floor,
+            "target_state": TARGET_STATE,
+            "thin_failure": THIN_FAILURE,
+        },
+        "label_policy": "Does not use source_domain_type or GUE/Poisson label as an operator.",
+        "tests": {
+            "denominator_artifact": {
+                "condition": "all thin rows have n_gaps below full_gap_floor",
+                "passes": all_thin_short,
+            },
+            "contamination_artifact": {
+                "condition": "all thin rows are prescan contaminated",
+                "passes": all_thin_contaminated,
+            },
+            "shuffle_instability_artifact": {
+                "condition": "all thin rows have shuffle_class_changes=true",
+                "passes": all_thin_shuffle_unstable,
+            },
+            "autonomous_species_counter": {
+                "condition": "at least one thin row is not short-denominator explained",
+                "passes": counts["thin_not_denominator_explained_rows"] > 0,
+            },
+        },
+        "counts": counts,
+        "comparative_means": {
+            "thin": summarize(thin_rows),
+            "medium_control": summarize(medium_rows),
+        },
+        "verdict": verdict,
+        "rows": rows,
+    }
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--input", default="tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json")
+    parser.add_argument("--full-gap-floor", type=int, default=500)
+    parser.add_argument("--out", default="tools/data/boundary_blank_thin_support_audit_20260509_1548.json")
+    args = parser.parse_args()
+
+    with Path(args.input).open() as f:
+        data = json.load(f)
+
+    output = build_audit(data, args.full_gap_floor)
+    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"support_without_beta_blank_rows={c['support_without_beta_blank_rows']}")
+    print(f"thin_rows={c['thin_rows']}")
+    print(f"medium_control_rows={c['medium_control_rows']}")
+    print(f"thin_short_rows={c['thin_short_rows']}")
+    print(f"thin_contaminated_rows={c['thin_contaminated_rows']}")
+    print(f"thin_shuffle_class_change_rows={c['thin_shuffle_class_change_rows']}")
+    print(f"thin_not_denominator_explained_rows={c['thin_not_denominator_explained_rows']}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+
+
+if __name__ == "__main__":
+    main()

codex
Lo script è in posto. Lo compilo ed eseguo ora sul deposito 15:38, producendo il JSON del cycle 15:48.
exec
/bin/bash -lc 'python -m py_compile tools/exp_boundary_blank_thin_support_audit.py' in /opt/MM_D-ND
 succeeded in 0ms:
exec
/bin/bash -lc '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' in /opt/MM_D-ND
 succeeded in 0ms:
support_without_beta_blank_rows=4
thin_rows=3
medium_control_rows=1
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
saved tools/data/boundary_blank_thin_support_audit_20260509_1548.json

diff --git a/tools/exp_boundary_blank_thin_support_audit.py b/tools/exp_boundary_blank_thin_support_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..ab1d1b0d8d2fa4ee6960a0ae3d249446ec43749e
--- /dev/null
+++ b/tools/exp_boundary_blank_thin_support_audit.py
@@ -0,0 +1,233 @@
+#!/usr/bin/env python3
+"""
+Audit the thin support-without-beta blanks against the medium prime blank.
+
+The input is the row-aligned nonexact BOUNDARY audit. The operator stays inside
+the support_without_beta_blank subset and asks whether the thin rows separate by
+denominator telemetry, null contamination, or an autonomous support signature.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from statistics import mean
+from typing import Any
+
+
+TARGET_STATE = "support_without_beta_blank"
+THIN_FAILURE = "blank_thin_support"
+
+
+def as_float(value: Any, default: float = 0.0) -> float:
+    if value is None:
+        return default
+    return float(value)
+
+
+def denominator_bucket(row: dict[str, Any], full_gap_floor: int) -> str:
+    n_gaps = int(row.get("n_gaps") or 0)
+    if n_gaps >= full_gap_floor:
+        return "full_denominator"
+    return "short_denominator"
+
+
+def blank_class(row: dict[str, Any], full_gap_floor: int) -> str:
+    thin = row.get("coordinate_failure") == THIN_FAILURE
+    short = denominator_bucket(row, full_gap_floor) == "short_denominator"
+    contaminated = row.get("prescan", {}).get("denominator_state") == "contaminated"
+    class_change = bool(row.get("prescan", {}).get("shuffle_class_changes"))
+    if not thin:
+        return "medium_blank_control"
+    if short and contaminated:
+        return "thin_short_contaminated"
+    if short and class_change:
+        return "thin_short_shuffle_unstable"
+    if short:
+        return "thin_short_complete"
+    return "thin_not_denominator_explained"
+
+
+def summarize(rows: list[dict[str, Any]]) -> dict[str, Any]:
+    if not rows:
+        return {}
+    return {
+        "rows": len(rows),
+        "n_gaps_mean": mean(as_float(row.get("n_gaps")) for row in rows),
+        "one_sided_mean": mean(len(row.get("one_sided_observables", [])) for row in rows),
+        "stable_count_coherent_mean": mean(as_float(row.get("stable_count_coherent")) for row in rows),
+        "endpoint_distance_mean": mean(as_float(row.get("endpoint_distance")) for row in rows),
+        "excluded_mass_mean": mean(as_float(row.get("prescan", {}).get("excluded_mass")) for row in rows),
+        "abs_shuffle_z_mean": mean(abs(as_float(row.get("prescan", {}).get("shuffle_z_score"))) for row in rows),
+    }
+
+
+def build_audit(data: dict[str, Any], full_gap_floor: int) -> dict[str, Any]:
+    blank_rows = [
+        row for row in data.get("rows", [])
+        if row.get("beta_state") == TARGET_STATE
+    ]
+    if not blank_rows:
+        raise ValueError("input has no support_without_beta_blank rows")
+
+    rows = []
+    counts: dict[str, int] = {
+        "support_without_beta_blank_rows": len(blank_rows),
+        "thin_rows": 0,
+        "medium_control_rows": 0,
+        "short_denominator_rows": 0,
+        "contaminated_rows": 0,
+        "shuffle_class_change_rows": 0,
+        "thin_short_rows": 0,
+        "thin_contaminated_rows": 0,
+        "thin_shuffle_class_change_rows": 0,
+        "thin_not_denominator_explained_rows": 0,
+    }
+    by_class: dict[str, int] = {}
+
+    for row in blank_rows:
+        thin = row.get("coordinate_failure") == THIN_FAILURE
+        bucket = denominator_bucket(row, full_gap_floor)
+        prescan = row.get("prescan", {})
+        contaminated = prescan.get("denominator_state") == "contaminated"
+        class_change = bool(prescan.get("shuffle_class_changes"))
+        cls = blank_class(row, full_gap_floor)
+
+        counts["thin_rows" if thin else "medium_control_rows"] += 1
+        if bucket == "short_denominator":
+            counts["short_denominator_rows"] += 1
+        if contaminated:
+            counts["contaminated_rows"] += 1
+        if class_change:
+            counts["shuffle_class_change_rows"] += 1
+        if thin and bucket == "short_denominator":
+            counts["thin_short_rows"] += 1
+        if thin and contaminated:
+            counts["thin_contaminated_rows"] += 1
+        if thin and class_change:
+            counts["thin_shuffle_class_change_rows"] += 1
+        if thin and cls == "thin_not_denominator_explained":
+            counts["thin_not_denominator_explained_rows"] += 1
+        by_class[cls] = by_class.get(cls, 0) + 1
+
+        rows.append({
+            "row": row["row"],
+            "blank_class": cls,
+            "coordinate_failure": row.get("coordinate_failure"),
+            "support_tier": row.get("support_tier"),
+            "denominator_bucket": bucket,
+            "n_gaps": row.get("n_gaps"),
+            "one_sided_count": len(row.get("one_sided_observables", [])),
+            "one_sided_observables": row.get("one_sided_observables", []),
+            "stable_count_coherent": row.get("stable_count_coherent"),
+            "stable_count_illusory": row.get("stable_count_illusory"),
+            "endpoint_distance": row.get("endpoint_distance"),
+            "denominator_state": prescan.get("denominator_state"),
+            "excluded_mass": prescan.get("excluded_mass"),
+            "shuffle_z_score": prescan.get("shuffle_z_score"),
+            "shuffle_class_changes": class_change,
+        })
+
+    thin_rows = [row for row in blank_rows if row.get("coordinate_failure") == THIN_FAILURE]
+    medium_rows = [row for row in blank_rows if row.get("coordinate_failure") != THIN_FAILURE]
+    all_thin_short = bool(thin_rows) and counts["thin_short_rows"] == len(thin_rows)
+    all_thin_contaminated = bool(thin_rows) and counts["thin_contaminated_rows"] == len(thin_rows)
+    all_thin_shuffle_unstable = bool(thin_rows) and counts["thin_shuffle_class_change_rows"] == len(thin_rows)
+
+    if all_thin_short and not all_thin_contaminated:
+        verdict = "DENOMINATOR_LIMITED_NOT_NULL_CONTAMINATION"
+    elif all_thin_contaminated:
+        verdict = "CONTAMINATION_LIMITED"
+    elif counts["thin_not_denominator_explained_rows"] > 0:
+        verdict = "AUTONOMOUS_THIN_BLANK_CANDIDATE"
+    else:
+        verdict = "AMBIGUOUS"
+
+    counts.update({f"class_{key}": value for key, value in sorted(by_class.items())})
+
+    return {
+        "experiment": "boundary_blank_thin_support_audit",
+        "question": "Are thin support-without-beta blanks denominator artifacts, null contamination artifacts, or autonomous boundary species?",
+        "source": data.get("experiment"),
+        "source_scope": data.get("source_scope"),
+        "observables_registry": data.get("observables_registry"),
+        "observables_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",
+        ],
+        "params": {
+            "full_gap_floor": full_gap_floor,
+            "target_state": TARGET_STATE,
+            "thin_failure": THIN_FAILURE,
+        },
+        "label_policy": "Does not use source_domain_type or GUE/Poisson label as an operator.",
+        "tests": {
+            "denominator_artifact": {
+                "condition": "all thin rows have n_gaps below full_gap_floor",
+                "passes": all_thin_short,
+            },
+            "contamination_artifact": {
+                "condition": "all thin rows are prescan contaminated",
+                "passes": all_thin_contaminated,
+            },
+            "shuffle_instability_artifact": {
+                "condition": "all thin rows have shuffle_class_changes=true",
+                "passes": all_thin_shuffle_unstable,
+            },
+            "autonomous_species_counter": {
+                "condition": "at least one thin row is not short-denominator explained",
+                "passes": counts["thin_not_denominator_explained_rows"] > 0,
+            },
+        },
+        "counts": counts,
+        "comparative_means": {
+            "thin": summarize(thin_rows),
+            "medium_control": summarize(medium_rows),
+        },
+        "verdict": verdict,
+        "rows": rows,
+    }
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--input", default="tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json")
+    parser.add_argument("--full-gap-floor", type=int, default=500)
+    parser.add_argument("--out", default="tools/data/boundary_blank_thin_support_audit_20260509_1548.json")
+    args = parser.parse_args()
+
+    with Path(args.input).open() as f:
+        data = json.load(f)
+
+    output = build_audit(data, args.full_gap_floor)
+    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"support_without_beta_blank_rows={c['support_without_beta_blank_rows']}")
+    print(f"thin_rows={c['thin_rows']}")
+    print(f"medium_control_rows={c['medium_control_rows']}")
+    print(f"thin_short_rows={c['thin_short_rows']}")
+    print(f"thin_contaminated_rows={c['thin_contaminated_rows']}")
+    print(f"thin_shuffle_class_change_rows={c['thin_shuffle_class_change_rows']}")
+    print(f"thin_not_denominator_explained_rows={c['thin_not_denominator_explained_rows']}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+
+
+if __name__ == "__main__":
+    main()

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/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/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/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_row_aligned_nonexact_audit_20260509_1538.json
?? tools/data/boundary_shuffle_audit.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/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_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/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/
?? 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/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/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/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/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/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_blank_thin_support_audit.py
?? tools/exp_boundary_coherence.py
?? tools/exp_boundary_mixture_gate.py
?? tools/exp_boundary_shuffle_audit.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_blank_thin_support_audit_20260509_1548.json | sed -n '1,280p'" in /opt/MM_D-ND
 succeeded in 0ms:
{
    "experiment": "boundary_blank_thin_support_audit",
    "question": "Are thin support-without-beta blanks denominator artifacts, null contamination artifacts, or autonomous boundary species?",
    "source": "boundary_row_aligned_nonexact_audit",
    "source_scope": "tools/data/boundary_denominator_prescan_full_20260509_1500.json",
    "observables_registry": "1.0.0-2026-05-06",
    "observables_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"
    ],
    "params": {
        "full_gap_floor": 500,
        "target_state": "support_without_beta_blank",
        "thin_failure": "blank_thin_support"
    },
    "label_policy": "Does not use source_domain_type or GUE/Poisson label as an operator.",
    "tests": {
        "denominator_artifact": {
            "condition": "all thin rows have n_gaps below full_gap_floor",
            "passes": true
        },
        "contamination_artifact": {
            "condition": "all thin rows are prescan contaminated",
            "passes": false
        },
        "shuffle_instability_artifact": {
            "condition": "all thin rows have shuffle_class_changes=true",
            "passes": false
        },
        "autonomous_species_counter": {
            "condition": "at least one thin row is not short-denominator explained",
            "passes": false
        }
    },
    "counts": {
        "support_without_beta_blank_rows": 4,
        "thin_rows": 3,
        "medium_control_rows": 1,
        "short_denominator_rows": 3,
        "contaminated_rows": 1,
        "shuffle_class_change_rows": 1,
        "thin_short_rows": 3,
        "thin_contaminated_rows": 1,
        "thin_shuffle_class_change_rows": 1,
        "thin_not_denominator_explained_rows": 0,
        "class_medium_blank_control": 1,
        "class_thin_short_complete": 1,
        "class_thin_short_contaminated": 1,
        "class_thin_short_shuffle_unstable": 1
    },
    "comparative_means": {
        "thin": {
            "rows": 3,
            "n_gaps_mean": 196.0,
            "one_sided_mean": 1.3333333333333333,
            "stable_count_coherent_mean": 1.25,
            "endpoint_distance_mean": 2.00276033204389,
            "excluded_mass_mean": 0.20066666666666666,
            "abs_shuffle_z_mean": 11.036864333333334
        },
        "medium_control": {
            "rows": 1,
            "n_gaps_mean": 4096.0,
            "one_sided_mean": 3,
            "stable_count_coherent_mean": 3.0,
            "endpoint_distance_mean": 3.2427469463217204,
            "excluded_mass_mean": 0.0,
            "abs_shuffle_z_mean": 26.6
        }
    },
    "verdict": "DENOMINATOR_LIMITED_NOT_NULL_CONTAMINATION",
    "rows": [
        {
            "row": "numeri_primi:cycle_3",
            "blank_class": "medium_blank_control",
            "coordinate_failure": "blank_despite_multi_observable_support",
            "support_tier": "medium_multi_observable",
            "denominator_bucket": "full_denominator",
            "n_gaps": 4096,
            "one_sided_count": 3,
            "one_sided_observables": [
                "SR",
                "L1",
                "triple_var"
            ],
            "stable_count_coherent": 3.0,
            "stable_count_illusory": 0.16666666666666666,
            "endpoint_distance": 3.2427469463217204,
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "shuffle_z_score": -26.6,
            "shuffle_class_changes": false
        },
        {
            "row": "percolation:cycle_9",
            "blank_class": "thin_short_shuffle_unstable",
            "coordinate_failure": "blank_thin_support",
            "support_tier": "thin_observable_support",
            "denominator_bucket": "short_denominator",
            "n_gaps": 190,
            "one_sided_count": 1,
            "one_sided_observables": [
                "L1"
            ],
            "stable_count_coherent": 0.8333333333333334,
            "stable_count_illusory": 0.3333333333333333,
            "endpoint_distance": 1.7053713197497773,
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "shuffle_z_score": 16.1,
            "shuffle_class_changes": true
        },
        {
            "row": "random_matrix:cycle_7",
            "blank_class": "thin_short_complete",
            "coordinate_failure": "blank_thin_support",
            "support_tier": "thin_observable_support",
            "denominator_bucket": "short_denominator",
            "n_gaps": 199,
            "one_sided_count": 1,
            "one_sided_observables": [
                "L2"
            ],
            "stable_count_coherent": 1.0,
            "stable_count_illusory": 0.25,
            "endpoint_distance": 1.8543171371625617,
            "denominator_state": "complete",
            "excluded_mass": 0.0,
            "shuffle_z_score": -14.7,
            "shuffle_class_changes": false
        },
        {
            "row": "zeta_zeros:cycle_4",
            "blank_class": "thin_short_contaminated",
            "coordinate_failure": "blank_thin_support",
            "support_tier": "thin_observable_support",
            "denominator_bucket": "short_denominator",
            "n_gaps": 199,
            "one_sided_count": 2,
            "one_sided_observables": [
                "SR",
                "L2"
            ],
            "stable_count_coherent": 1.9166666666666667,
            "stable_count_illusory": 0.25,
            "endpoint_distance": 2.4485925392193306,
            "denominator_state": "contaminated",
            "excluded_mass": 0.602,
            "shuffle_z_score": -2.310593,
            "shuffle_class_changes": false
        }
    ]
}

diff --git a/tools/exp_boundary_blank_thin_support_audit.py b/tools/exp_boundary_blank_thin_support_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..ab1d1b0d8d2fa4ee6960a0ae3d249446ec43749e
--- /dev/null
+++ b/tools/exp_boundary_blank_thin_support_audit.py
@@ -0,0 +1,233 @@
+#!/usr/bin/env python3
+"""
+Audit the thin support-without-beta blanks against the medium prime blank.
+
+The input is the row-aligned nonexact BOUNDARY audit. The operator stays inside
+the support_without_beta_blank subset and asks whether the thin rows separate by
+denominator telemetry, null contamination, or an autonomous support signature.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from statistics import mean
+from typing import Any
+
+
+TARGET_STATE = "support_without_beta_blank"
+THIN_FAILURE = "blank_thin_support"
+
+
+def as_float(value: Any, default: float = 0.0) -> float:
+    if value is None:
+        return default
+    return float(value)
+
+
+def denominator_bucket(row: dict[str, Any], full_gap_floor: int) -> str:
+    n_gaps = int(row.get("n_gaps") or 0)
+    if n_gaps >= full_gap_floor:
+        return "full_denominator"
+    return "short_denominator"
+
+
+def blank_class(row: dict[str, Any], full_gap_floor: int) -> str:
+    thin = row.get("coordinate_failure") == THIN_FAILURE
+    short = denominator_bucket(row, full_gap_floor) == "short_denominator"
+    contaminated = row.get("prescan", {}).get("denominator_state") == "contaminated"
+    class_change = bool(row.get("prescan", {}).get("shuffle_class_changes"))
+    if not thin:
+        return "medium_blank_control"
+    if short and contaminated:
+        return "thin_short_contaminated"
+    if short and class_change:
+        return "thin_short_shuffle_unstable"
+    if short:
+        return "thin_short_complete"
+    return "thin_not_denominator_explained"
+
+
+def summarize(rows: list[dict[str, Any]]) -> dict[str, Any]:
+    if not rows:
+        return {}
+    return {
+        "rows": len(rows),
+        "n_gaps_mean": mean(as_float(row.get("n_gaps")) for row in rows),
+        "one_sided_mean": mean(len(row.get("one_sided_observables", [])) for row in rows),
+        "stable_count_coherent_mean": mean(as_float(row.get("stable_count_coherent")) for row in rows),
+        "endpoint_distance_mean": mean(as_float(row.get("endpoint_distance")) for row in rows),
+        "excluded_mass_mean": mean(as_float(row.get("prescan", {}).get("excluded_mass")) for row in rows),
+        "abs_shuffle_z_mean": mean(abs(as_float(row.get("prescan", {}).get("shuffle_z_score"))) for row in rows),
+    }
+
+
+def build_audit(data: dict[str, Any], full_gap_floor: int) -> dict[str, Any]:
+    blank_rows = [
+        row for row in data.get("rows", [])
+        if row.get("beta_state") == TARGET_STATE
+    ]
+    if not blank_rows:
+        raise ValueError("input has no support_without_beta_blank rows")
+
+    rows = []
+    counts: dict[str, int] = {
+        "support_without_beta_blank_rows": len(blank_rows),
+        "thin_rows": 0,
+        "medium_control_rows": 0,
+        "short_denominator_rows": 0,
+        "contaminated_rows": 0,
+        "shuffle_class_change_rows": 0,
+        "thin_short_rows": 0,
+        "thin_contaminated_rows": 0,
+        "thin_shuffle_class_change_rows": 0,
+        "thin_not_denominator_explained_rows": 0,
+    }
+    by_class: dict[str, int] = {}
+
+    for row in blank_rows:
+        thin = row.get("coordinate_failure") == THIN_FAILURE
+        bucket = denominator_bucket(row, full_gap_floor)
+        prescan = row.get("prescan", {})
+        contaminated = prescan.get("denominator_state") == "contaminated"
+        class_change = bool(prescan.get("shuffle_class_changes"))
+        cls = blank_class(row, full_gap_floor)
+
+        counts["thin_rows" if thin else "medium_control_rows"] += 1
+        if bucket == "short_denominator":
+            counts["short_denominator_rows"] += 1
+        if contaminated:
+            counts["contaminated_rows"] += 1
+        if class_change:
+            counts["shuffle_class_change_rows"] += 1
+        if thin and bucket == "short_denominator":
+            counts["thin_short_rows"] += 1
+        if thin and contaminated:
+            counts["thin_contaminated_rows"] += 1
+        if thin and class_change:
+            counts["thin_shuffle_class_change_rows"] += 1
+        if thin and cls == "thin_not_denominator_explained":
+            counts["thin_not_denominator_explained_rows"] += 1
+        by_class[cls] = by_class.get(cls, 0) + 1
+
+        rows.append({
+            "row": row["row"],
+            "blank_class": cls,
+            "coordinate_failure": row.get("coordinate_failure"),
+            "support_tier": row.get("support_tier"),
+            "denominator_bucket": bucket,
+            "n_gaps": row.get("n_gaps"),
+            "one_sided_count": len(row.get("one_sided_observables", [])),
+            "one_sided_observables": row.get("one_sided_observables", []),
+            "stable_count_coherent": row.get("stable_count_coherent"),
+            "stable_count_illusory": row.get("stable_count_illusory"),
+            "endpoint_distance": row.get("endpoint_distance"),
+            "denominator_state": prescan.get("denominator_state"),
+            "excluded_mass": prescan.get("excluded_mass"),
+            "shuffle_z_score": prescan.get("shuffle_z_score"),
+            "shuffle_class_changes": class_change,
+        })
+
+    thin_rows = [row for row in blank_rows if row.get("coordinate_failure") == THIN_FAILURE]
+    medium_rows = [row for row in blank_rows if row.get("coordinate_failure") != THIN_FAILURE]
+    all_thin_short = bool(thin_rows) and counts["thin_short_rows"] == len(thin_rows)
+    all_thin_contaminated = bool(thin_rows) and counts["thin_contaminated_rows"] == len(thin_rows)
+    all_thin_shuffle_unstable = bool(thin_rows) and counts["thin_shuffle_class_change_rows"] == len(thin_rows)
+
+    if all_thin_short and not all_thin_contaminated:
+        verdict = "DENOMINATOR_LIMITED_NOT_NULL_CONTAMINATION"
+    elif all_thin_contaminated:
+        verdict = "CONTAMINATION_LIMITED"
+    elif counts["thin_not_denominator_explained_rows"] > 0:
+        verdict = "AUTONOMOUS_THIN_BLANK_CANDIDATE"
+    else:
+        verdict = "AMBIGUOUS"
+
+    counts.update({f"class_{key}": value for key, value in sorted(by_class.items())})
+
+    return {
+        "experiment": "boundary_blank_thin_support_audit",
+        "question": "Are thin support-without-beta blanks denominator artifacts, null contamination artifacts, or autonomous boundary species?",
+        "source": data.get("experiment"),
+        "source_scope": data.get("source_scope"),
+        "observables_registry": data.get("observables_registry"),
+        "observables_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",
+        ],
+        "params": {
+            "full_gap_floor": full_gap_floor,
+            "target_state": TARGET_STATE,
+            "thin_failure": THIN_FAILURE,
+        },
+        "label_policy": "Does not use source_domain_type or GUE/Poisson label as an operator.",
+        "tests": {
+            "denominator_artifact": {
+                "condition": "all thin rows have n_gaps below full_gap_floor",
+                "passes": all_thin_short,
+            },
+            "contamination_artifact": {
+                "condition": "all thin rows are prescan contaminated",
+                "passes": all_thin_contaminated,
+            },
+            "shuffle_instability_artifact": {
+                "condition": "all thin rows have shuffle_class_changes=true",
+                "passes": all_thin_shuffle_unstable,
+            },
+            "autonomous_species_counter": {
+                "condition": "at least one thin row is not short-denominator explained",
+                "passes": counts["thin_not_denominator_explained_rows"] > 0,
+            },
+        },
+        "counts": counts,
+        "comparative_means": {
+            "thin": summarize(thin_rows),
+            "medium_control": summarize(medium_rows),
+        },
+        "verdict": verdict,
+        "rows": rows,
+    }
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--input", default="tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json")
+    parser.add_argument("--full-gap-floor", type=int, default=500)
+    parser.add_argument("--out", default="tools/data/boundary_blank_thin_support_audit_20260509_1548.json")
+    args = parser.parse_args()
+
+    with Path(args.input).open() as f:
+        data = json.load(f)
+
+    output = build_audit(data, args.full_gap_floor)
+    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"support_without_beta_blank_rows={c['support_without_beta_blank_rows']}")
+    print(f"thin_rows={c['thin_rows']}")
+    print(f"medium_control_rows={c['medium_control_rows']}")
+    print(f"thin_short_rows={c['thin_short_rows']}")
+    print(f"thin_contaminated_rows={c['thin_contaminated_rows']}")
+    print(f"thin_shuffle_class_change_rows={c['thin_shuffle_class_change_rows']}")
+    print(f"thin_not_denominator_explained_rows={c['thin_not_denominator_explained_rows']}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+
+
+if __name__ == "__main__":
+    main()

codex
Il risultato taglia una delle ipotesi: i tre blank sottili sono tutti sotto `full_gap_floor=500`, mentre solo uno è contaminato e solo uno cambia classe nello shuffle. Ora scrivo il report richiesto in `tools/data/reports/agent_20260509_1548.md` con perimetro atomico e consecutio.
apply patch
patch: completed
/opt/MM_D-ND/tools/data/reports/agent_20260509_1548.md
diff --git a/tools/data/reports/agent_20260509_1548.md b/tools/data/reports/agent_20260509_1548.md
new file mode 100644
index 0000000000000000000000000000000000000000..d8781cbc570aa819db29c0a93dec86a094574960
--- /dev/null
+++ b/tools/data/reports/agent_20260509_1548.md
@@ -0,0 +1,133 @@
+# Agent Report - Boundary Blank Thin Support Audit
+**Date**: 2026-05-09 15:48  
+**Piano**: 111  
+**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE  
+**verdict**: CONSTRAINT - il blank sottile e' limitato dal denominatore corto, non dalla contaminazione del null  
+observables_registry: 1.0.0-2026-05-06  
+observables_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.  
+**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`.
+
+## Respiro fuori-tempo
+- **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.
+- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY row-aligned + tensione "supporto vivo senza chart beta".
+- **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.
+- **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.
+- **Operatori laterali scelti**: boundary operator, sheaf locale/perimetro, filtrazione per denominatore. Servono a separare stato beta invariato da supporto misurabile.
+- **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.
+- **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.
+- **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.
+- **Proiezione**: misurare `n_gaps`, `denominator_state`, `excluded_mass`, `shuffle_class_changes`, `one_sided_count`, `endpoint_distance` dentro il subset `support_without_beta_blank`.
+
+## Aderenza alla direzione
+- `relation`: follows_direction
+- `why`: falsifica direttamente se i failure modes del 15:38 sono stabili o artefatti della griglia/perimetro row-aligned.
+- `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.
+
+## Claim Under Test
+> Nel subset `support_without_beta_blank`, il blank sottile e' una specie autonoma solo se non e' interamente spiegato da denominatore corto.
+
+## Question
+I tre blank sottili sono fallimenti autonomi del boundary, oppure righe con supporto insufficiente perche' corte?
+
+## Experiment Design
+- Nuovo strumento: `tools/exp_boundary_blank_thin_support_audit.py`.
+- Input: `tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json`.
+- Output: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.
+- Perimetro atomico: 4 righe `support_without_beta_blank`.
+- Soglia dichiarata: `full_gap_floor=500`.
+- Null sfidati: denominatore corto, contaminazione prescan, shuffle class-change, specie autonoma.
+- Label policy: non legge `source_domain_type` o label GUE/Poisson come decision field.
+
+## Results
+
+Indice globale:
+
+| measure | value |
+|---|---:|
+| support_without_beta_blank rows | 4 |
+| thin rows | 3 |
+| medium control rows | 1 |
+| thin short rows | 3 |
+| thin contaminated rows | 1 |
+| thin shuffle class-change rows | 1 |
+| thin not denominator explained rows | 0 |
+
+Test:
+
+| null / counter | condition | result |
+|---|---|---|
+| denominator_artifact | all thin rows have `n_gaps < 500` | pass |
+| contamination_artifact | all thin rows are contaminated | fail |
+| shuffle_instability_artifact | all thin rows have `shuffle_class_changes=true` | fail |
+| autonomous_species_counter | at least one thin row is not short-denominator explained | fail |
+
+Comparative means:
+
+| group | rows | n_gaps mean | one-sided mean | coherent mean | endpoint mean | excluded mass mean | abs shuffle z mean |
+|---|---:|---:|---:|---:|---:|---:|---:|
+| thin | 3 | 196.000 | 1.333 | 1.250 | 2.003 | 0.201 | 11.037 |
+| medium control | 1 | 4096.000 | 3.000 | 3.000 | 3.243 | 0.000 | 26.600 |
+
+Rows:
+
+| row | blank_class | n_gaps | one-sided | endpoint | denominator | excluded | shuffle_change |
+|---|---|---:|---:|---:|---|---:|---|
+| numeri_primi:cycle_3 | medium_blank_control | 4096 | 3 | 3.243 | complete | 0.000 | false |
+| percolation:cycle_9 | thin_short_shuffle_unstable | 190 | 1 | 1.705 | complete | 0.000 | true |
+| random_matrix:cycle_7 | thin_short_complete | 199 | 1 | 1.854 | complete | 0.000 | false |
+| zeta_zeros:cycle_4 | thin_short_contaminated | 199 | 2 | 2.449 | contaminated | 0.602 | false |
+
+## Key Findings
+1. **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`.
+2. **Verificato: la contaminazione non spiega la classe.** Solo `zeta_zeros` e' contaminato; `percolation` e `random_matrix` sono complete con excluded mass 0.0.
+3. **Verificato: lo shuffle class-change non spiega la classe.** Solo `percolation` cambia classe nello shuffle; `random_matrix` e `zeta_zeros` no.
+4. **Verificato: non resta una riga thin autonoma nel perimetro 15:48.** `thin_not_denominator_explained_rows=0`.
+5. **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.
+
+## Verdict
+**CONSTRAINT**.
+
+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:
+
+`blank_thin_support` = beta blank + supporto vivo + denominatore corto.
+
+Formula valida:
+
+`support_without_beta_blank` si divide in `medium_blank_control` e `thin_short_*`.
+
+Formula non valida:
+
+`blank_thin_support` = failure mode stabile indipendente dal denominatore.
+
+Il nodo regressivo e' il denominatore dei tre domini corti. Non va promossa una nuova specie; va estesa o dichiarata coda corta.
+
+## Bicono della scoperta
+- **Due radici**: blank di chart beta / supporto del denominatore.
+- **Singolare**: riga `support_without_beta_blank` prima che il support tier venga letto come specie.
+- **Invariante di passaggio**: denominatore corto separa i blank sottili; contaminazione e shuffle-instability non bastano.
+- **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.
+
+## 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.
+
+## Auto-audit: source flags e 7 lenti
+- **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`.
+- **L1 hard constraint**: claim limitato alle 4 righe `support_without_beta_blank` del deposito 15:38.
+- **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.
+- **L3 no silent patching**: soglia `full_gap_floor=500` dichiarata; non esclusa `zeta_zeros` nonostante contaminazione.
+- **L4 edge cases**: `random_matrix` e' thin, short, complete e senza class-change; isola il denominatore corto dalla contaminazione.
+- **L5 re-discovery**: il ciclo non rifà il gate 15:16; legge il sotto-perimetro aperto dal report 15:38.
+- **L6 metabolismo cognitivo**: CE-0001, CE-0117, YSN e PVI usati nella combo.
+- **L7 possibile/non-possibile**: possibile = extension audit dei tre short; non-possibile = classe autonoma senza estensione.
+
+## Telemetria
+- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.
+- Verifica script: `python -m py_compile tools/exp_boundary_blank_thin_support_audit.py`.
+- 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`.
+- 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`.
+- Git state: worktree gia' sporco da cicli e pubblicazioni precedenti; questo cycle aggiunge lo script 15:48, il JSON 15:48 e questo report.
+
+## Files
+- Script nuovo: `tools/exp_boundary_blank_thin_support_audit.py`
+- Data: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`
+- Report: `tools/data/reports/agent_20260509_1548.md`
diff --git a/tools/exp_boundary_blank_thin_support_audit.py b/tools/exp_boundary_blank_thin_support_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..ab1d1b0d8d2fa4ee6960a0ae3d249446ec43749e
--- /dev/null
+++ b/tools/exp_boundary_blank_thin_support_audit.py
@@ -0,0 +1,233 @@
+#!/usr/bin/env python3
+"""
+Audit the thin support-without-beta blanks against the medium prime blank.
+
+The input is the row-aligned nonexact BOUNDARY audit. The operator stays inside
+the support_without_beta_blank subset and asks whether the thin rows separate by
+denominator telemetry, null contamination, or an autonomous support signature.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from statistics import mean
+from typing import Any
+
+
+TARGET_STATE = "support_without_beta_blank"
+THIN_FAILURE = "blank_thin_support"
+
+
+def as_float(value: Any, default: float = 0.0) -> float:
+    if value is None:
+        return default
+    return float(value)
+
+
+def denominator_bucket(row: dict[str, Any], full_gap_floor: int) -> str:
+    n_gaps = int(row.get("n_gaps") or 0)
+    if n_gaps >= full_gap_floor:
+        return "full_denominator"
+    return "short_denominator"
+
+
+def blank_class(row: dict[str, Any], full_gap_floor: int) -> str:
+    thin = row.get("coordinate_failure") == THIN_FAILURE
+    short = denominator_bucket(row, full_gap_floor) == "short_denominator"
+    contaminated = row.get("prescan", {}).get("denominator_state") == "contaminated"
+    class_change = bool(row.get("prescan", {}).get("shuffle_class_changes"))
+    if not thin:
+        return "medium_blank_control"
+    if short and contaminated:
+        return "thin_short_contaminated"
+    if short and class_change:
+        return "thin_short_shuffle_unstable"
+    if short:
+        return "thin_short_complete"
+    return "thin_not_denominator_explained"
+
+
+def summarize(rows: list[dict[str, Any]]) -> dict[str, Any]:
+    if not rows:
+        return {}
+    return {
+        "rows": len(rows),
+        "n_gaps_mean": mean(as_float(row.get("n_gaps")) for row in rows),
+        "one_sided_mean": mean(len(row.get("one_sided_observables", [])) for row in rows),
+        "stable_count_coherent_mean": mean(as_float(row.get("stable_count_coherent")) for row in rows),
+        "endpoint_distance_mean": mean(as_float(row.get("endpoint_distance")) for row in rows),
+        "excluded_mass_mean": mean(as_float(row.get("prescan", {}).get("excluded_mass")) for row in rows),
+        "abs_shuffle_z_mean": mean(abs(as_float(row.get("prescan", {}).get("shuffle_z_score"))) for row in rows),
+    }
+
+
+def build_audit(data: dict[str, Any], full_gap_floor: int) -> dict[str, Any]:
+    blank_rows = [
+        row for row in data.get("rows", [])
+        if row.get("beta_state") == TARGET_STATE
+    ]
+    if not blank_rows:
+        raise ValueError("input has no support_without_beta_blank rows")
+
+    rows = []
+    counts: dict[str, int] = {
+        "support_without_beta_blank_rows": len(blank_rows),
+        "thin_rows": 0,
+        "medium_control_rows": 0,
+        "short_denominator_rows": 0,
+        "contaminated_rows": 0,
+        "shuffle_class_change_rows": 0,
+        "thin_short_rows": 0,
+        "thin_contaminated_rows": 0,
+        "thin_shuffle_class_change_rows": 0,
+        "thin_not_denominator_explained_rows": 0,
+    }
+    by_class: dict[str, int] = {}
+
+    for row in blank_rows:
+        thin = row.get("coordinate_failure") == THIN_FAILURE
+        bucket = denominator_bucket(row, full_gap_floor)
+        prescan = row.get("prescan", {})
+        contaminated = prescan.get("denominator_state") == "contaminated"
+        class_change = bool(prescan.get("shuffle_class_changes"))
+        cls = blank_class(row, full_gap_floor)
+
+        counts["thin_rows" if thin else "medium_control_rows"] += 1
+        if bucket == "short_denominator":
+            counts["short_denominator_rows"] += 1
+        if contaminated:
+            counts["contaminated_rows"] += 1
+        if class_change:
+            counts["shuffle_class_change_rows"] += 1
+        if thin and bucket == "short_denominator":
+            counts["thin_short_rows"] += 1
+        if thin and contaminated:
+            counts["thin_contaminated_rows"] += 1
+        if thin and class_change:
+            counts["thin_shuffle_class_change_rows"] += 1
+        if thin and cls == "thin_not_denominator_explained":
+            counts["thin_not_denominator_explained_rows"] += 1
+        by_class[cls] = by_class.get(cls, 0) + 1
+
+        rows.append({
+            "row": row["row"],
+            "blank_class": cls,
+            "coordinate_failure": row.get("coordinate_failure"),
+            "support_tier": row.get("support_tier"),
+            "denominator_bucket": bucket,
+            "n_gaps": row.get("n_gaps"),
+            "one_sided_count": len(row.get("one_sided_observables", [])),
+            "one_sided_observables": row.get("one_sided_observables", []),
+            "stable_count_coherent": row.get("stable_count_coherent"),
+            "stable_count_illusory": row.get("stable_count_illusory"),
+            "endpoint_distance": row.get("endpoint_distance"),
+            "denominator_state": prescan.get("denominator_state"),
+            "excluded_mass": prescan.get("excluded_mass"),
+            "shuffle_z_score": prescan.get("shuffle_z_score"),
+            "shuffle_class_changes": class_change,
+        })
+
+    thin_rows = [row for row in blank_rows if row.get("coordinate_failure") == THIN_FAILURE]
+    medium_rows = [row for row in blank_rows if row.get("coordinate_failure") != THIN_FAILURE]
+    all_thin_short = bool(thin_rows) and counts["thin_short_rows"] == len(thin_rows)
+    all_thin_contaminated = bool(thin_rows) and counts["thin_contaminated_rows"] == len(thin_rows)
+    all_thin_shuffle_unstable = bool(thin_rows) and counts["thin_shuffle_class_change_rows"] == len(thin_rows)
+
+    if all_thin_short and not all_thin_contaminated:
+        verdict = "DENOMINATOR_LIMITED_NOT_NULL_CONTAMINATION"
+    elif all_thin_contaminated:
+        verdict = "CONTAMINATION_LIMITED"
+    elif counts["thin_not_denominator_explained_rows"] > 0:
+        verdict = "AUTONOMOUS_THIN_BLANK_CANDIDATE"
+    else:
+        verdict = "AMBIGUOUS"
+
+    counts.update({f"class_{key}": value for key, value in sorted(by_class.items())})
+
+    return {
+        "experiment": "boundary_blank_thin_support_audit",
+        "question": "Are thin support-without-beta blanks denominator artifacts, null contamination artifacts, or autonomous boundary species?",
+        "source": data.get("experiment"),
+        "source_scope": data.get("source_scope"),
+        "observables_registry": data.get("observables_registry"),
+        "observables_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",
+        ],
+        "params": {
+            "full_gap_floor": full_gap_floor,
+            "target_state": TARGET_STATE,
+            "thin_failure": THIN_FAILURE,
+        },
+        "label_policy": "Does not use source_domain_type or GUE/Poisson label as an operator.",
+        "tests": {
+            "denominator_artifact": {
+                "condition": "all thin rows have n_gaps below full_gap_floor",
+                "passes": all_thin_short,
+            },
+            "contamination_artifact": {
+                "condition": "all thin rows are prescan contaminated",
+                "passes": all_thin_contaminated,
+            },
+            "shuffle_instability_artifact": {
+                "condition": "all thin rows have shuffle_class_changes=true",
+                "passes": all_thin_shuffle_unstable,
+            },
+            "autonomous_species_counter": {
+                "condition": "at least one thin row is not short-denominator explained",
+                "passes": counts["thin_not_denominator_explained_rows"] > 0,
+            },
+        },
+        "counts": counts,
+        "comparative_means": {
+            "thin": summarize(thin_rows),
+            "medium_control": summarize(medium_rows),
+        },
+        "verdict": verdict,
+        "rows": rows,
+    }
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--input", default="tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json")
+    parser.add_argument("--full-gap-floor", type=int, default=500)
+    parser.add_argument("--out", default="tools/data/boundary_blank_thin_support_audit_20260509_1548.json")
+    args = parser.parse_args()
+
+    with Path(args.input).open() as f:
+        data = json.load(f)
+
+    output = build_audit(data, args.full_gap_floor)
+    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"support_without_beta_blank_rows={c['support_without_beta_blank_rows']}")
+    print(f"thin_rows={c['thin_rows']}")
+    print(f"medium_control_rows={c['medium_control_rows']}")
+    print(f"thin_short_rows={c['thin_short_rows']}")
+    print(f"thin_contaminated_rows={c['thin_contaminated_rows']}")
+    print(f"thin_shuffle_class_change_rows={c['thin_shuffle_class_change_rows']}")
+    print(f"thin_not_denominator_explained_rows={c['thin_not_denominator_explained_rows']}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+
+
+if __name__ == "__main__":
+    main()

diff --git a/tools/data/reports/agent_20260509_1548.md b/tools/data/reports/agent_20260509_1548.md
new file mode 100644
index 0000000000000000000000000000000000000000..d8781cbc570aa819db29c0a93dec86a094574960
--- /dev/null
+++ b/tools/data/reports/agent_20260509_1548.md
@@ -0,0 +1,133 @@
+# Agent Report - Boundary Blank Thin Support Audit
+**Date**: 2026-05-09 15:48  
+**Piano**: 111  
+**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE  
+**verdict**: CONSTRAINT - il blank sottile e' limitato dal denominatore corto, non dalla contaminazione del null  
+observables_registry: 1.0.0-2026-05-06  
+observables_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.  
+**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`.
+
+## Respiro fuori-tempo
+- **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.
+- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY row-aligned + tensione "supporto vivo senza chart beta".
+- **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.
+- **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.
+- **Operatori laterali scelti**: boundary operator, sheaf locale/perimetro, filtrazione per denominatore. Servono a separare stato beta invariato da supporto misurabile.
+- **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.
+- **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.
+- **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.
+- **Proiezione**: misurare `n_gaps`, `denominator_state`, `excluded_mass`, `shuffle_class_changes`, `one_sided_count`, `endpoint_distance` dentro il subset `support_without_beta_blank`.
+
+## Aderenza alla direzione
+- `relation`: follows_direction
+- `why`: falsifica direttamente se i failure modes del 15:38 sono stabili o artefatti della griglia/perimetro row-aligned.
+- `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.
+
+## Claim Under Test
+> Nel subset `support_without_beta_blank`, il blank sottile e' una specie autonoma solo se non e' interamente spiegato da denominatore corto.
+
+## Question
+I tre blank sottili sono fallimenti autonomi del boundary, oppure righe con supporto insufficiente perche' corte?
+
+## Experiment Design
+- Nuovo strumento: `tools/exp_boundary_blank_thin_support_audit.py`.
+- Input: `tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json`.
+- Output: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.
+- Perimetro atomico: 4 righe `support_without_beta_blank`.
+- Soglia dichiarata: `full_gap_floor=500`.
+- Null sfidati: denominatore corto, contaminazione prescan, shuffle class-change, specie autonoma.
+- Label policy: non legge `source_domain_type` o label GUE/Poisson come decision field.
+
+## Results
+
+Indice globale:
+
+| measure | value |
+|---|---:|
+| support_without_beta_blank rows | 4 |
+| thin rows | 3 |
+| medium control rows | 1 |
+| thin short rows | 3 |
+| thin contaminated rows | 1 |
+| thin shuffle class-change rows | 1 |
+| thin not denominator explained rows | 0 |
+
+Test:
+
+| null / counter | condition | result |
+|---|---|---|
+| denominator_artifact | all thin rows have `n_gaps < 500` | pass |
+| contamination_artifact | all thin rows are contaminated | fail |
+| shuffle_instability_artifact | all thin rows have `shuffle_class_changes=true` | fail |
+| autonomous_species_counter | at least one thin row is not short-denominator explained | fail |
+
+Comparative means:
+
+| group | rows | n_gaps mean | one-sided mean | coherent mean | endpoint mean | excluded mass mean | abs shuffle z mean |
+|---|---:|---:|---:|---:|---:|---:|---:|
+| thin | 3 | 196.000 | 1.333 | 1.250 | 2.003 | 0.201 | 11.037 |
+| medium control | 1 | 4096.000 | 3.000 | 3.000 | 3.243 | 0.000 | 26.600 |
+
+Rows:
+
+| row | blank_class | n_gaps | one-sided | endpoint | denominator | excluded | shuffle_change |
+|---|---|---:|---:|---:|---|---:|---|
+| numeri_primi:cycle_3 | medium_blank_control | 4096 | 3 | 3.243 | complete | 0.000 | false |
+| percolation:cycle_9 | thin_short_shuffle_unstable | 190 | 1 | 1.705 | complete | 0.000 | true |
+| random_matrix:cycle_7 | thin_short_complete | 199 | 1 | 1.854 | complete | 0.000 | false |
+| zeta_zeros:cycle_4 | thin_short_contaminated | 199 | 2 | 2.449 | contaminated | 0.602 | false |
+
+## Key Findings
+1. **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`.
+2. **Verificato: la contaminazione non spiega la classe.** Solo `zeta_zeros` e' contaminato; `percolation` e `random_matrix` sono complete con excluded mass 0.0.
+3. **Verificato: lo shuffle class-change non spiega la classe.** Solo `percolation` cambia classe nello shuffle; `random_matrix` e `zeta_zeros` no.
+4. **Verificato: non resta una riga thin autonoma nel perimetro 15:48.** `thin_not_denominator_explained_rows=0`.
+5. **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.
+
+## Verdict
+**CONSTRAINT**.
+
+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:
+
+`blank_thin_support` = beta blank + supporto vivo + denominatore corto.
+
+Formula valida:
+
+`support_without_beta_blank` si divide in `medium_blank_control` e `thin_short_*`.
+
+Formula non valida:
+
+`blank_thin_support` = failure mode stabile indipendente dal denominatore.
+
+Il nodo regressivo e' il denominatore dei tre domini corti. Non va promossa una nuova specie; va estesa o dichiarata coda corta.
+
+## Bicono della scoperta
+- **Due radici**: blank di chart beta / supporto del denominatore.
+- **Singolare**: riga `support_without_beta_blank` prima che il support tier venga letto come specie.
+- **Invariante di passaggio**: denominatore corto separa i blank sottili; contaminazione e shuffle-instability non bastano.
+- **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.
+
+## 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.
+
+## Auto-audit: source flags e 7 lenti
+- **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`.
+- **L1 hard constraint**: claim limitato alle 4 righe `support_without_beta_blank` del deposito 15:38.
+- **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.
+- **L3 no silent patching**: soglia `full_gap_floor=500` dichiarata; non esclusa `zeta_zeros` nonostante contaminazione.
+- **L4 edge cases**: `random_matrix` e' thin, short, complete e senza class-change; isola il denominatore corto dalla contaminazione.
+- **L5 re-discovery**: il ciclo non rifà il gate 15:16; legge il sotto-perimetro aperto dal report 15:38.
+- **L6 metabolismo cognitivo**: CE-0001, CE-0117, YSN e PVI usati nella combo.
+- **L7 possibile/non-possibile**: possibile = extension audit dei tre short; non-possibile = classe autonoma senza estensione.
+
+## Telemetria
+- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.
+- Verifica script: `python -m py_compile tools/exp_boundary_blank_thin_support_audit.py`.
+- 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`.
+- 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`.
+- Git state: worktree gia' sporco da cicli e pubblicazioni precedenti; questo cycle aggiunge lo script 15:48, il JSON 15:48 e questo report.
+
+## Files
+- Script nuovo: `tools/exp_boundary_blank_thin_support_audit.py`
+- Data: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`
+- Report: `tools/data/reports/agent_20260509_1548.md`
diff --git a/tools/exp_boundary_blank_thin_support_audit.py b/tools/exp_boundary_blank_thin_support_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..ab1d1b0d8d2fa4ee6960a0ae3d249446ec43749e
--- /dev/null
+++ b/tools/exp_boundary_blank_thin_support_audit.py
@@ -0,0 +1,233 @@
+#!/usr/bin/env python3
+"""
+Audit the thin support-without-beta blanks against the medium prime blank.
+
+The input is the row-aligned nonexact BOUNDARY audit. The operator stays inside
+the support_without_beta_blank subset and asks whether the thin rows separate by
+denominator telemetry, null contamination, or an autonomous support signature.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from statistics import mean
+from typing import Any
+
+
+TARGET_STATE = "support_without_beta_blank"
+THIN_FAILURE = "blank_thin_support"
+
+
+def as_float(value: Any, default: float = 0.0) -> float:
+    if value is None:
+        return default
+    return float(value)
+
+
+def denominator_bucket(row: dict[str, Any], full_gap_floor: int) -> str:
+    n_gaps = int(row.get("n_gaps") or 0)
+    if n_gaps >= full_gap_floor:
+        return "full_denominator"
+    return "short_denominator"
+
+
+def blank_class(row: dict[str, Any], full_gap_floor: int) -> str:
+    thin = row.get("coordinate_failure") == THIN_FAILURE
+    short = denominator_bucket(row, full_gap_floor) == "short_denominator"
+    contaminated = row.get("prescan", {}).get("denominator_state") == "contaminated"
+    class_change = bool(row.get("prescan", {}).get("shuffle_class_changes"))
+    if not thin:
+        return "medium_blank_control"
+    if short and contaminated:
+        return "thin_short_contaminated"
+    if short and class_change:
+        return "thin_short_shuffle_unstable"
+    if short:
+        return "thin_short_complete"
+    return "thin_not_denominator_explained"
+
+
+def summarize(rows: list[dict[str, Any]]) -> dict[str, Any]:
+    if not rows:
+        return {}
+    return {
+        "rows": len(rows),
+        "n_gaps_mean": mean(as_float(row.get("n_gaps")) for row in rows),
+        "one_sided_mean": mean(len(row.get("one_sided_observables", [])) for row in rows),
+        "stable_count_coherent_mean": mean(as_float(row.get("stable_count_coherent")) for row in rows),
+        "endpoint_distance_mean": mean(as_float(row.get("endpoint_distance")) for row in rows),
+        "excluded_mass_mean": mean(as_float(row.get("prescan", {}).get("excluded_mass")) for row in rows),
+        "abs_shuffle_z_mean": mean(abs(as_float(row.get("prescan", {}).get("shuffle_z_score"))) for row in rows),
+    }
+
+
+def build_audit(data: dict[str, Any], full_gap_floor: int) -> dict[str, Any]:
+    blank_rows = [
+        row for row in data.get("rows", [])
+        if row.get("beta_state") == TARGET_STATE
+    ]
+    if not blank_rows:
+        raise ValueError("input has no support_without_beta_blank rows")
+
+    rows = []
+    counts: dict[str, int] = {
+        "support_without_beta_blank_rows": len(blank_rows),
+        "thin_rows": 0,
+        "medium_control_rows": 0,
+        "short_denominator_rows": 0,
+        "contaminated_rows": 0,
+        "shuffle_class_change_rows": 0,
+        "thin_short_rows": 0,
+        "thin_contaminated_rows": 0,
+        "thin_shuffle_class_change_rows": 0,
+        "thin_not_denominator_explained_rows": 0,
+    }
+    by_class: dict[str, int] = {}
+
+    for row in blank_rows:
+        thin = row.get("coordinate_failure") == THIN_FAILURE
+        bucket = denominator_bucket(row, full_gap_floor)
+        prescan = row.get("prescan", {})
+        contaminated = prescan.get("denominator_state") == "contaminated"
+        class_change = bool(prescan.get("shuffle_class_changes"))
+        cls = blank_class(row, full_gap_floor)
+
+        counts["thin_rows" if thin else "medium_control_rows"] += 1
+        if bucket == "short_denominator":
+            counts["short_denominator_rows"] += 1
+        if contaminated:
+            counts["contaminated_rows"] += 1
+        if class_change:
+            counts["shuffle_class_change_rows"] += 1
+        if thin and bucket == "short_denominator":
+            counts["thin_short_rows"] += 1
+        if thin and contaminated:
+            counts["thin_contaminated_rows"] += 1
+        if thin and class_change:
+            counts["thin_shuffle_class_change_rows"] += 1
+        if thin and cls == "thin_not_denominator_explained":
+            counts["thin_not_denominator_explained_rows"] += 1
+        by_class[cls] = by_class.get(cls, 0) + 1
+
+        rows.append({
+            "row": row["row"],
+            "blank_class": cls,
+            "coordinate_failure": row.get("coordinate_failure"),
+            "support_tier": row.get("support_tier"),
+            "denominator_bucket": bucket,
+            "n_gaps": row.get("n_gaps"),
+            "one_sided_count": len(row.get("one_sided_observables", [])),
+            "one_sided_observables": row.get("one_sided_observables", []),
+            "stable_count_coherent": row.get("stable_count_coherent"),
+            "stable_count_illusory": row.get("stable_count_illusory"),
+            "endpoint_distance": row.get("endpoint_distance"),
+            "denominator_state": prescan.get("denominator_state"),
+            "excluded_mass": prescan.get("excluded_mass"),
+            "shuffle_z_score": prescan.get("shuffle_z_score"),
+            "shuffle_class_changes": class_change,
+        })
+
+    thin_rows = [row for row in blank_rows if row.get("coordinate_failure") == THIN_FAILURE]
+    medium_rows = [row for row in blank_rows if row.get("coordinate_failure") != THIN_FAILURE]
+    all_thin_short = bool(thin_rows) and counts["thin_short_rows"] == len(thin_rows)
+    all_thin_contaminated = bool(thin_rows) and counts["thin_contaminated_rows"] == len(thin_rows)
+    all_thin_shuffle_unstable = bool(thin_rows) and counts["thin_shuffle_class_change_rows"] == len(thin_rows)
+
+    if all_thin_short and not all_thin_contaminated:
+        verdict = "DENOMINATOR_LIMITED_NOT_NULL_CONTAMINATION"
+    elif all_thin_contaminated:
+        verdict = "CONTAMINATION_LIMITED"
+    elif counts["thin_not_denominator_explained_rows"] > 0:
+        verdict = "AUTONOMOUS_THIN_BLANK_CANDIDATE"
+    else:
+        verdict = "AMBIGUOUS"
+
+    counts.update({f"class_{key}": value for key, value in sorted(by_class.items())})
+
+    return {
+        "experiment": "boundary_blank_thin_support_audit",
+        "question": "Are thin support-without-beta blanks denominator artifacts, null contamination artifacts, or autonomous boundary species?",
+        "source": data.get("experiment"),
+        "source_scope": data.get("source_scope"),
+        "observables_registry": data.get("observables_registry"),
+        "observables_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",
+        ],
+        "params": {
+            "full_gap_floor": full_gap_floor,
+            "target_state": TARGET_STATE,
+            "thin_failure": THIN_FAILURE,
+        },
+        "label_policy": "Does not use source_domain_type or GUE/Poisson label as an operator.",
+        "tests": {
+            "denominator_artifact": {
+                "condition": "all thin rows have n_gaps below full_gap_floor",
+                "passes": all_thin_short,
+            },
+            "contamination_artifact": {
+                "condition": "all thin rows are prescan contaminated",
+                "passes": all_thin_contaminated,
+            },
+            "shuffle_instability_artifact": {
+                "condition": "all thin rows have shuffle_class_changes=true",
+                "passes": all_thin_shuffle_unstable,
+            },
+            "autonomous_species_counter": {
+                "condition": "at least one thin row is not short-denominator explained",
+                "passes": counts["thin_not_denominator_explained_rows"] > 0,
+            },
+        },
+        "counts": counts,
+        "comparative_means": {
+            "thin": summarize(thin_rows),
+            "medium_control": summarize(medium_rows),
+        },
+        "verdict": verdict,
+        "rows": rows,
+    }
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--input", default="tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json")
+    parser.add_argument("--full-gap-floor", type=int, default=500)
+    parser.add_argument("--out", default="tools/data/boundary_blank_thin_support_audit_20260509_1548.json")
+    args = parser.parse_args()
+
+    with Path(args.input).open() as f:
+        data = json.load(f)
+
+    output = build_audit(data, args.full_gap_floor)
+    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"support_without_beta_blank_rows={c['support_without_beta_blank_rows']}")
+    print(f"thin_rows={c['thin_rows']}")
+    print(f"medium_control_rows={c['medium_control_rows']}")
+    print(f"thin_short_rows={c['thin_short_rows']}")
+    print(f"thin_contaminated_rows={c['thin_contaminated_rows']}")
+    print(f"thin_shuffle_class_change_rows={c['thin_shuffle_class_change_rows']}")
+    print(f"thin_not_denominator_explained_rows={c['thin_not_denominator_explained_rows']}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+
+
+if __name__ == "__main__":
+    main()

exec
/bin/bash -lc 'test -s tools/data/reports/agent_20260509_1548.md && wc -l tools/data/reports/agent_20260509_1548.md' in /opt/MM_D-ND
 succeeded in 0ms:
133 tools/data/reports/agent_20260509_1548.md

exec
/bin/bash -lc 'python tools/exp_boundary_blank_thin_support_audit.py --input tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json --out /tmp/boundary_blank_thin_support_audit_check.json' in /opt/MM_D-ND
 succeeded in 0ms:
support_without_beta_blank_rows=4
thin_rows=3
medium_control_rows=1
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
saved /tmp/boundary_blank_thin_support_audit_check.json

diff --git a/tools/data/reports/agent_20260509_1548.md b/tools/data/reports/agent_20260509_1548.md
new file mode 100644
index 0000000000000000000000000000000000000000..d8781cbc570aa819db29c0a93dec86a094574960
--- /dev/null
+++ b/tools/data/reports/agent_20260509_1548.md
@@ -0,0 +1,133 @@
+# Agent Report - Boundary Blank Thin Support Audit
+**Date**: 2026-05-09 15:48  
+**Piano**: 111  
+**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE  
+**verdict**: CONSTRAINT - il blank sottile e' limitato dal denominatore corto, non dalla contaminazione del null  
+observables_registry: 1.0.0-2026-05-06  
+observables_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.  
+**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`.
+
+## Respiro fuori-tempo
+- **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.
+- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY row-aligned + tensione "supporto vivo senza chart beta".
+- **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.
+- **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.
+- **Operatori laterali scelti**: boundary operator, sheaf locale/perimetro, filtrazione per denominatore. Servono a separare stato beta invariato da supporto misurabile.
+- **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.
+- **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.
+- **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.
+- **Proiezione**: misurare `n_gaps`, `denominator_state`, `excluded_mass`, `shuffle_class_changes`, `one_sided_count`, `endpoint_distance` dentro il subset `support_without_beta_blank`.
+
+## Aderenza alla direzione
+- `relation`: follows_direction
+- `why`: falsifica direttamente se i failure modes del 15:38 sono stabili o artefatti della griglia/perimetro row-aligned.
+- `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.
+
+## Claim Under Test
+> Nel subset `support_without_beta_blank`, il blank sottile e' una specie autonoma solo se non e' interamente spiegato da denominatore corto.
+
+## Question
+I tre blank sottili sono fallimenti autonomi del boundary, oppure righe con supporto insufficiente perche' corte?
+
+## Experiment Design
+- Nuovo strumento: `tools/exp_boundary_blank_thin_support_audit.py`.
+- Input: `tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json`.
+- Output: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.
+- Perimetro atomico: 4 righe `support_without_beta_blank`.
+- Soglia dichiarata: `full_gap_floor=500`.
+- Null sfidati: denominatore corto, contaminazione prescan, shuffle class-change, specie autonoma.
+- Label policy: non legge `source_domain_type` o label GUE/Poisson come decision field.
+
+## Results
+
+Indice globale:
+
+| measure | value |
+|---|---:|
+| support_without_beta_blank rows | 4 |
+| thin rows | 3 |
+| medium control rows | 1 |
+| thin short rows | 3 |
+| thin contaminated rows | 1 |
+| thin shuffle class-change rows | 1 |
+| thin not denominator explained rows | 0 |
+
+Test:
+
+| null / counter | condition | result |
+|---|---|---|
+| denominator_artifact | all thin rows have `n_gaps < 500` | pass |
+| contamination_artifact | all thin rows are contaminated | fail |
+| shuffle_instability_artifact | all thin rows have `shuffle_class_changes=true` | fail |
+| autonomous_species_counter | at least one thin row is not short-denominator explained | fail |
+
+Comparative means:
+
+| group | rows | n_gaps mean | one-sided mean | coherent mean | endpoint mean | excluded mass mean | abs shuffle z mean |
+|---|---:|---:|---:|---:|---:|---:|---:|
+| thin | 3 | 196.000 | 1.333 | 1.250 | 2.003 | 0.201 | 11.037 |
+| medium control | 1 | 4096.000 | 3.000 | 3.000 | 3.243 | 0.000 | 26.600 |
+
+Rows:
+
+| row | blank_class | n_gaps | one-sided | endpoint | denominator | excluded | shuffle_change |
+|---|---|---:|---:|---:|---|---:|---|
+| numeri_primi:cycle_3 | medium_blank_control | 4096 | 3 | 3.243 | complete | 0.000 | false |
+| percolation:cycle_9 | thin_short_shuffle_unstable | 190 | 1 | 1.705 | complete | 0.000 | true |
+| random_matrix:cycle_7 | thin_short_complete | 199 | 1 | 1.854 | complete | 0.000 | false |
+| zeta_zeros:cycle_4 | thin_short_contaminated | 199 | 2 | 2.449 | contaminated | 0.602 | false |
+
+## Key Findings
+1. **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`.
+2. **Verificato: la contaminazione non spiega la classe.** Solo `zeta_zeros` e' contaminato; `percolation` e `random_matrix` sono complete con excluded mass 0.0.
+3. **Verificato: lo shuffle class-change non spiega la classe.** Solo `percolation` cambia classe nello shuffle; `random_matrix` e `zeta_zeros` no.
+4. **Verificato: non resta una riga thin autonoma nel perimetro 15:48.** `thin_not_denominator_explained_rows=0`.
+5. **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.
+
+## Verdict
+**CONSTRAINT**.
+
+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:
+
+`blank_thin_support` = beta blank + supporto vivo + denominatore corto.
+
+Formula valida:
+
+`support_without_beta_blank` si divide in `medium_blank_control` e `thin_short_*`.
+
+Formula non valida:
+
+`blank_thin_support` = failure mode stabile indipendente dal denominatore.
+
+Il nodo regressivo e' il denominatore dei tre domini corti. Non va promossa una nuova specie; va estesa o dichiarata coda corta.
+
+## Bicono della scoperta
+- **Due radici**: blank di chart beta / supporto del denominatore.
+- **Singolare**: riga `support_without_beta_blank` prima che il support tier venga letto come specie.
+- **Invariante di passaggio**: denominatore corto separa i blank sottili; contaminazione e shuffle-instability non bastano.
+- **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.
+
+## 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.
+
+## Auto-audit: source flags e 7 lenti
+- **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`.
+- **L1 hard constraint**: claim limitato alle 4 righe `support_without_beta_blank` del deposito 15:38.
+- **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.
+- **L3 no silent patching**: soglia `full_gap_floor=500` dichiarata; non esclusa `zeta_zeros` nonostante contaminazione.
+- **L4 edge cases**: `random_matrix` e' thin, short, complete e senza class-change; isola il denominatore corto dalla contaminazione.
+- **L5 re-discovery**: il ciclo non rifà il gate 15:16; legge il sotto-perimetro aperto dal report 15:38.
+- **L6 metabolismo cognitivo**: CE-0001, CE-0117, YSN e PVI usati nella combo.
+- **L7 possibile/non-possibile**: possibile = extension audit dei tre short; non-possibile = classe autonoma senza estensione.
+
+## Telemetria
+- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.
+- Verifica script: `python -m py_compile tools/exp_boundary_blank_thin_support_audit.py`.
+- 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`.
+- 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`.
+- Git state: worktree gia' sporco da cicli e pubblicazioni precedenti; questo cycle aggiunge lo script 15:48, il JSON 15:48 e questo report.
+
+## Files
+- Script nuovo: `tools/exp_boundary_blank_thin_support_audit.py`
+- Data: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`
+- Report: `tools/data/reports/agent_20260509_1548.md`
diff --git a/tools/exp_boundary_blank_thin_support_audit.py b/tools/exp_boundary_blank_thin_support_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..ab1d1b0d8d2fa4ee6960a0ae3d249446ec43749e
--- /dev/null
+++ b/tools/exp_boundary_blank_thin_support_audit.py
@@ -0,0 +1,233 @@
+#!/usr/bin/env python3
+"""
+Audit the thin support-without-beta blanks against the medium prime blank.
+
+The input is the row-aligned nonexact BOUNDARY audit. The operator stays inside
+the support_without_beta_blank subset and asks whether the thin rows separate by
+denominator telemetry, null contamination, or an autonomous support signature.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from statistics import mean
+from typing import Any
+
+
+TARGET_STATE = "support_without_beta_blank"
+THIN_FAILURE = "blank_thin_support"
+
+
+def as_float(value: Any, default: float = 0.0) -> float:
+    if value is None:
+        return default
+    return float(value)
+
+
+def denominator_bucket(row: dict[str, Any], full_gap_floor: int) -> str:
+    n_gaps = int(row.get("n_gaps") or 0)
+    if n_gaps >= full_gap_floor:
+        return "full_denominator"
+    return "short_denominator"
+
+
+def blank_class(row: dict[str, Any], full_gap_floor: int) -> str:
+    thin = row.get("coordinate_failure") == THIN_FAILURE
+    short = denominator_bucket(row, full_gap_floor) == "short_denominator"
+    contaminated = row.get("prescan", {}).get("denominator_state") == "contaminated"
+    class_change = bool(row.get("prescan", {}).get("shuffle_class_changes"))
+    if not thin:
+        return "medium_blank_control"
+    if short and contaminated:
+        return "thin_short_contaminated"
+    if short and class_change:
+        return "thin_short_shuffle_unstable"
+    if short:
+        return "thin_short_complete"
+    return "thin_not_denominator_explained"
+
+
+def summarize(rows: list[dict[str, Any]]) -> dict[str, Any]:
+    if not rows:
+        return {}
+    return {
+        "rows": len(rows),
+        "n_gaps_mean": mean(as_float(row.get("n_gaps")) for row in rows),
+        "one_sided_mean": mean(len(row.get("one_sided_observables", [])) for row in rows),
+        "stable_count_coherent_mean": mean(as_float(row.get("stable_count_coherent")) for row in rows),
+        "endpoint_distance_mean": mean(as_float(row.get("endpoint_distance")) for row in rows),
+        "excluded_mass_mean": mean(as_float(row.get("prescan", {}).get("excluded_mass")) for row in rows),
+        "abs_shuffle_z_mean": mean(abs(as_float(row.get("prescan", {}).get("shuffle_z_score"))) for row in rows),
+    }
+
+
+def build_audit(data: dict[str, Any], full_gap_floor: int) -> dict[str, Any]:
+    blank_rows = [
+        row for row in data.get("rows", [])
+        if row.get("beta_state") == TARGET_STATE
+    ]
+    if not blank_rows:
+        raise ValueError("input has no support_without_beta_blank rows")
+
+    rows = []
+    counts: dict[str, int] = {
+        "support_without_beta_blank_rows": len(blank_rows),
+        "thin_rows": 0,
+        "medium_control_rows": 0,
+        "short_denominator_rows": 0,
+        "contaminated_rows": 0,
+        "shuffle_class_change_rows": 0,
+        "thin_short_rows": 0,
+        "thin_contaminated_rows": 0,
+        "thin_shuffle_class_change_rows": 0,
+        "thin_not_denominator_explained_rows": 0,
+    }
+    by_class: dict[str, int] = {}
+
+    for row in blank_rows:
+        thin = row.get("coordinate_failure") == THIN_FAILURE
+        bucket = denominator_bucket(row, full_gap_floor)
+        prescan = row.get("prescan", {})
+        contaminated = prescan.get("denominator_state") == "contaminated"
+        class_change = bool(prescan.get("shuffle_class_changes"))
+        cls = blank_class(row, full_gap_floor)
+
+        counts["thin_rows" if thin else "medium_control_rows"] += 1
+        if bucket == "short_denominator":
+            counts["short_denominator_rows"] += 1
+        if contaminated:
+            counts["contaminated_rows"] += 1
+        if class_change:
+            counts["shuffle_class_change_rows"] += 1
+        if thin and bucket == "short_denominator":
+            counts["thin_short_rows"] += 1
+        if thin and contaminated:
+            counts["thin_contaminated_rows"] += 1
+        if thin and class_change:
+            counts["thin_shuffle_class_change_rows"] += 1
+        if thin and cls == "thin_not_denominator_explained":
+            counts["thin_not_denominator_explained_rows"] += 1
+        by_class[cls] = by_class.get(cls, 0) + 1
+
+        rows.append({
+            "row": row["row"],
+            "blank_class": cls,
+            "coordinate_failure": row.get("coordinate_failure"),
+            "support_tier": row.get("support_tier"),
+            "denominator_bucket": bucket,
+            "n_gaps": row.get("n_gaps"),
+            "one_sided_count": len(row.get("one_sided_observables", [])),
+            "one_sided_observables": row.get("one_sided_observables", []),
+            "stable_count_coherent": row.get("stable_count_coherent"),
+            "stable_count_illusory": row.get("stable_count_illusory"),
+            "endpoint_distance": row.get("endpoint_distance"),
+            "denominator_state": prescan.get("denominator_state"),
+            "excluded_mass": prescan.get("excluded_mass"),
+            "shuffle_z_score": prescan.get("shuffle_z_score"),
+            "shuffle_class_changes": class_change,
+        })
+
+    thin_rows = [row for row in blank_rows if row.get("coordinate_failure") == THIN_FAILURE]
+    medium_rows = [row for row in blank_rows if row.get("coordinate_failure") != THIN_FAILURE]
+    all_thin_short = bool(thin_rows) and counts["thin_short_rows"] == len(thin_rows)
+    all_thin_contaminated = bool(thin_rows) and counts["thin_contaminated_rows"] == len(thin_rows)
+    all_thin_shuffle_unstable = bool(thin_rows) and counts["thin_shuffle_class_change_rows"] == len(thin_rows)
+
+    if all_thin_short and not all_thin_contaminated:
+        verdict = "DENOMINATOR_LIMITED_NOT_NULL_CONTAMINATION"
+    elif all_thin_contaminated:
+        verdict = "CONTAMINATION_LIMITED"
+    elif counts["thin_not_denominator_explained_rows"] > 0:
+        verdict = "AUTONOMOUS_THIN_BLANK_CANDIDATE"
+    else:
+        verdict = "AMBIGUOUS"
+
+    counts.update({f"class_{key}": value for key, value in sorted(by_class.items())})
+
+    return {
+        "experiment": "boundary_blank_thin_support_audit",
+        "question": "Are thin support-without-beta blanks denominator artifacts, null contamination artifacts, or autonomous boundary species?",
+        "source": data.get("experiment"),
+        "source_scope": data.get("source_scope"),
+        "observables_registry": data.get("observables_registry"),
+        "observables_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",
+        ],
+        "params": {
+            "full_gap_floor": full_gap_floor,
+            "target_state": TARGET_STATE,
+            "thin_failure": THIN_FAILURE,
+        },
+        "label_policy": "Does not use source_domain_type or GUE/Poisson label as an operator.",
+        "tests": {
+            "denominator_artifact": {
+                "condition": "all thin rows have n_gaps below full_gap_floor",
+                "passes": all_thin_short,
+            },
+            "contamination_artifact": {
+                "condition": "all thin rows are prescan contaminated",
+                "passes": all_thin_contaminated,
+            },
+            "shuffle_instability_artifact": {
+                "condition": "all thin rows have shuffle_class_changes=true",
+                "passes": all_thin_shuffle_unstable,
+            },
+            "autonomous_species_counter": {
+                "condition": "at least one thin row is not short-denominator explained",
+                "passes": counts["thin_not_denominator_explained_rows"] > 0,
+            },
+        },
+        "counts": counts,
+        "comparative_means": {
+            "thin": summarize(thin_rows),
+            "medium_control": summarize(medium_rows),
+        },
+        "verdict": verdict,
+        "rows": rows,
+    }
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--input", default="tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json")
+    parser.add_argument("--full-gap-floor", type=int, default=500)
+    parser.add_argument("--out", default="tools/data/boundary_blank_thin_support_audit_20260509_1548.json")
+    args = parser.parse_args()
+
+    with Path(args.input).open() as f:
+        data = json.load(f)
+
+    output = build_audit(data, args.full_gap_floor)
+    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"support_without_beta_blank_rows={c['support_without_beta_blank_rows']}")
+    print(f"thin_rows={c['thin_rows']}")
+    print(f"medium_control_rows={c['medium_control_rows']}")
+    print(f"thin_short_rows={c['thin_short_rows']}")
+    print(f"thin_contaminated_rows={c['thin_contaminated_rows']}")
+    print(f"thin_shuffle_class_change_rows={c['thin_shuffle_class_change_rows']}")
+    print(f"thin_not_denominator_explained_rows={c['thin_not_denominator_explained_rows']}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+
+
+if __name__ == "__main__":
+    main()

codex
Eseguito il cycle e scritto il report richiesto:

[tools/data/reports/agent_20260509_1548.md](/opt/MM_D-ND/tools/data/reports/agent_20260509_1548.md)

Ho aggiunto anche:
- [tools/exp_boundary_blank_thin_support_audit.py](/opt/MM_D-ND/tools/exp_boundary_blank_thin_support_audit.py)
- [tools/data/boundary_blank_thin_support_audit_20260509_1548.json](/opt/MM_D-ND/tools/data/boundary_blank_thin_support_audit_20260509_1548.json)

Verdict: `DENOMINATOR_LIMITED_NOT_NULL_CONTAMINATION`. I tre `blank_thin_support` sono tutti short-denominator; contaminazione e shuffle instability non spiegano la classe. Verificato con `py_compile` e run dello script.
diff --git a/tools/data/reports/agent_20260509_1548.md b/tools/data/reports/agent_20260509_1548.md
new file mode 100644
index 0000000000000000000000000000000000000000..d8781cbc570aa819db29c0a93dec86a094574960
--- /dev/null
+++ b/tools/data/reports/agent_20260509_1548.md
@@ -0,0 +1,133 @@
+# Agent Report - Boundary Blank Thin Support Audit
+**Date**: 2026-05-09 15:48  
+**Piano**: 111  
+**Tension explored**: BOUNDARY / TRASCENDENZA_LIMITE  
+**verdict**: CONSTRAINT - il blank sottile e' limitato dal denominatore corto, non dalla contaminazione del null  
+observables_registry: 1.0.0-2026-05-06  
+observables_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.  
+**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`.
+
+## Respiro fuori-tempo
+- **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.
+- **Combo**: A2 confine det=-1 + A9 terzo incluso + A11 combo + QxG continuo/discreto + BOUNDARY row-aligned + tensione "supporto vivo senza chart beta".
+- **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.
+- **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.
+- **Operatori laterali scelti**: boundary operator, sheaf locale/perimetro, filtrazione per denominatore. Servono a separare stato beta invariato da supporto misurabile.
+- **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.
+- **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.
+- **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.
+- **Proiezione**: misurare `n_gaps`, `denominator_state`, `excluded_mass`, `shuffle_class_changes`, `one_sided_count`, `endpoint_distance` dentro il subset `support_without_beta_blank`.
+
+## Aderenza alla direzione
+- `relation`: follows_direction
+- `why`: falsifica direttamente se i failure modes del 15:38 sono stabili o artefatti della griglia/perimetro row-aligned.
+- `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.
+
+## Claim Under Test
+> Nel subset `support_without_beta_blank`, il blank sottile e' una specie autonoma solo se non e' interamente spiegato da denominatore corto.
+
+## Question
+I tre blank sottili sono fallimenti autonomi del boundary, oppure righe con supporto insufficiente perche' corte?
+
+## Experiment Design
+- Nuovo strumento: `tools/exp_boundary_blank_thin_support_audit.py`.
+- Input: `tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json`.
+- Output: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`.
+- Perimetro atomico: 4 righe `support_without_beta_blank`.
+- Soglia dichiarata: `full_gap_floor=500`.
+- Null sfidati: denominatore corto, contaminazione prescan, shuffle class-change, specie autonoma.
+- Label policy: non legge `source_domain_type` o label GUE/Poisson come decision field.
+
+## Results
+
+Indice globale:
+
+| measure | value |
+|---|---:|
+| support_without_beta_blank rows | 4 |
+| thin rows | 3 |
+| medium control rows | 1 |
+| thin short rows | 3 |
+| thin contaminated rows | 1 |
+| thin shuffle class-change rows | 1 |
+| thin not denominator explained rows | 0 |
+
+Test:
+
+| null / counter | condition | result |
+|---|---|---|
+| denominator_artifact | all thin rows have `n_gaps < 500` | pass |
+| contamination_artifact | all thin rows are contaminated | fail |
+| shuffle_instability_artifact | all thin rows have `shuffle_class_changes=true` | fail |
+| autonomous_species_counter | at least one thin row is not short-denominator explained | fail |
+
+Comparative means:
+
+| group | rows | n_gaps mean | one-sided mean | coherent mean | endpoint mean | excluded mass mean | abs shuffle z mean |
+|---|---:|---:|---:|---:|---:|---:|---:|
+| thin | 3 | 196.000 | 1.333 | 1.250 | 2.003 | 0.201 | 11.037 |
+| medium control | 1 | 4096.000 | 3.000 | 3.000 | 3.243 | 0.000 | 26.600 |
+
+Rows:
+
+| row | blank_class | n_gaps | one-sided | endpoint | denominator | excluded | shuffle_change |
+|---|---|---:|---:|---:|---|---:|---|
+| numeri_primi:cycle_3 | medium_blank_control | 4096 | 3 | 3.243 | complete | 0.000 | false |
+| percolation:cycle_9 | thin_short_shuffle_unstable | 190 | 1 | 1.705 | complete | 0.000 | true |
+| random_matrix:cycle_7 | thin_short_complete | 199 | 1 | 1.854 | complete | 0.000 | false |
+| zeta_zeros:cycle_4 | thin_short_contaminated | 199 | 2 | 2.449 | contaminated | 0.602 | false |
+
+## Key Findings
+1. **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`.
+2. **Verificato: la contaminazione non spiega la classe.** Solo `zeta_zeros` e' contaminato; `percolation` e `random_matrix` sono complete con excluded mass 0.0.
+3. **Verificato: lo shuffle class-change non spiega la classe.** Solo `percolation` cambia classe nello shuffle; `random_matrix` e `zeta_zeros` no.
+4. **Verificato: non resta una riga thin autonoma nel perimetro 15:48.** `thin_not_denominator_explained_rows=0`.
+5. **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.
+
+## Verdict
+**CONSTRAINT**.
+
+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:
+
+`blank_thin_support` = beta blank + supporto vivo + denominatore corto.
+
+Formula valida:
+
+`support_without_beta_blank` si divide in `medium_blank_control` e `thin_short_*`.
+
+Formula non valida:
+
+`blank_thin_support` = failure mode stabile indipendente dal denominatore.
+
+Il nodo regressivo e' il denominatore dei tre domini corti. Non va promossa una nuova specie; va estesa o dichiarata coda corta.
+
+## Bicono della scoperta
+- **Due radici**: blank di chart beta / supporto del denominatore.
+- **Singolare**: riga `support_without_beta_blank` prima che il support tier venga letto come specie.
+- **Invariante di passaggio**: denominatore corto separa i blank sottili; contaminazione e shuffle-instability non bastano.
+- **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.
+
+## 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.
+
+## Auto-audit: source flags e 7 lenti
+- **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`.
+- **L1 hard constraint**: claim limitato alle 4 righe `support_without_beta_blank` del deposito 15:38.
+- **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.
+- **L3 no silent patching**: soglia `full_gap_floor=500` dichiarata; non esclusa `zeta_zeros` nonostante contaminazione.
+- **L4 edge cases**: `random_matrix` e' thin, short, complete e senza class-change; isola il denominatore corto dalla contaminazione.
+- **L5 re-discovery**: il ciclo non rifà il gate 15:16; legge il sotto-perimetro aperto dal report 15:38.
+- **L6 metabolismo cognitivo**: CE-0001, CE-0117, YSN e PVI usati nella combo.
+- **L7 possibile/non-possibile**: possibile = extension audit dei tre short; non-possibile = classe autonoma senza estensione.
+
+## Telemetria
+- No API paid run: `ANTHROPIC_API_KEY` e `OPENAI_API_KEY` assenti nell'ambiente.
+- Verifica script: `python -m py_compile tools/exp_boundary_blank_thin_support_audit.py`.
+- 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`.
+- 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`.
+- Git state: worktree gia' sporco da cicli e pubblicazioni precedenti; questo cycle aggiunge lo script 15:48, il JSON 15:48 e questo report.
+
+## Files
+- Script nuovo: `tools/exp_boundary_blank_thin_support_audit.py`
+- Data: `tools/data/boundary_blank_thin_support_audit_20260509_1548.json`
+- Report: `tools/data/reports/agent_20260509_1548.md`
diff --git a/tools/exp_boundary_blank_thin_support_audit.py b/tools/exp_boundary_blank_thin_support_audit.py
new file mode 100644
index 0000000000000000000000000000000000000000..ab1d1b0d8d2fa4ee6960a0ae3d249446ec43749e
--- /dev/null
+++ b/tools/exp_boundary_blank_thin_support_audit.py
@@ -0,0 +1,233 @@
+#!/usr/bin/env python3
+"""
+Audit the thin support-without-beta blanks against the medium prime blank.
+
+The input is the row-aligned nonexact BOUNDARY audit. The operator stays inside
+the support_without_beta_blank subset and asks whether the thin rows separate by
+denominator telemetry, null contamination, or an autonomous support signature.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from pathlib import Path
+from statistics import mean
+from typing import Any
+
+
+TARGET_STATE = "support_without_beta_blank"
+THIN_FAILURE = "blank_thin_support"
+
+
+def as_float(value: Any, default: float = 0.0) -> float:
+    if value is None:
+        return default
+    return float(value)
+
+
+def denominator_bucket(row: dict[str, Any], full_gap_floor: int) -> str:
+    n_gaps = int(row.get("n_gaps") or 0)
+    if n_gaps >= full_gap_floor:
+        return "full_denominator"
+    return "short_denominator"
+
+
+def blank_class(row: dict[str, Any], full_gap_floor: int) -> str:
+    thin = row.get("coordinate_failure") == THIN_FAILURE
+    short = denominator_bucket(row, full_gap_floor) == "short_denominator"
+    contaminated = row.get("prescan", {}).get("denominator_state") == "contaminated"
+    class_change = bool(row.get("prescan", {}).get("shuffle_class_changes"))
+    if not thin:
+        return "medium_blank_control"
+    if short and contaminated:
+        return "thin_short_contaminated"
+    if short and class_change:
+        return "thin_short_shuffle_unstable"
+    if short:
+        return "thin_short_complete"
+    return "thin_not_denominator_explained"
+
+
+def summarize(rows: list[dict[str, Any]]) -> dict[str, Any]:
+    if not rows:
+        return {}
+    return {
+        "rows": len(rows),
+        "n_gaps_mean": mean(as_float(row.get("n_gaps")) for row in rows),
+        "one_sided_mean": mean(len(row.get("one_sided_observables", [])) for row in rows),
+        "stable_count_coherent_mean": mean(as_float(row.get("stable_count_coherent")) for row in rows),
+        "endpoint_distance_mean": mean(as_float(row.get("endpoint_distance")) for row in rows),
+        "excluded_mass_mean": mean(as_float(row.get("prescan", {}).get("excluded_mass")) for row in rows),
+        "abs_shuffle_z_mean": mean(abs(as_float(row.get("prescan", {}).get("shuffle_z_score"))) for row in rows),
+    }
+
+
+def build_audit(data: dict[str, Any], full_gap_floor: int) -> dict[str, Any]:
+    blank_rows = [
+        row for row in data.get("rows", [])
+        if row.get("beta_state") == TARGET_STATE
+    ]
+    if not blank_rows:
+        raise ValueError("input has no support_without_beta_blank rows")
+
+    rows = []
+    counts: dict[str, int] = {
+        "support_without_beta_blank_rows": len(blank_rows),
+        "thin_rows": 0,
+        "medium_control_rows": 0,
+        "short_denominator_rows": 0,
+        "contaminated_rows": 0,
+        "shuffle_class_change_rows": 0,
+        "thin_short_rows": 0,
+        "thin_contaminated_rows": 0,
+        "thin_shuffle_class_change_rows": 0,
+        "thin_not_denominator_explained_rows": 0,
+    }
+    by_class: dict[str, int] = {}
+
+    for row in blank_rows:
+        thin = row.get("coordinate_failure") == THIN_FAILURE
+        bucket = denominator_bucket(row, full_gap_floor)
+        prescan = row.get("prescan", {})
+        contaminated = prescan.get("denominator_state") == "contaminated"
+        class_change = bool(prescan.get("shuffle_class_changes"))
+        cls = blank_class(row, full_gap_floor)
+
+        counts["thin_rows" if thin else "medium_control_rows"] += 1
+        if bucket == "short_denominator":
+            counts["short_denominator_rows"] += 1
+        if contaminated:
+            counts["contaminated_rows"] += 1
+        if class_change:
+            counts["shuffle_class_change_rows"] += 1
+        if thin and bucket == "short_denominator":
+            counts["thin_short_rows"] += 1
+        if thin and contaminated:
+            counts["thin_contaminated_rows"] += 1
+        if thin and class_change:
+            counts["thin_shuffle_class_change_rows"] += 1
+        if thin and cls == "thin_not_denominator_explained":
+            counts["thin_not_denominator_explained_rows"] += 1
+        by_class[cls] = by_class.get(cls, 0) + 1
+
+        rows.append({
+            "row": row["row"],
+            "blank_class": cls,
+            "coordinate_failure": row.get("coordinate_failure"),
+            "support_tier": row.get("support_tier"),
+            "denominator_bucket": bucket,
+            "n_gaps": row.get("n_gaps"),
+            "one_sided_count": len(row.get("one_sided_observables", [])),
+            "one_sided_observables": row.get("one_sided_observables", []),
+            "stable_count_coherent": row.get("stable_count_coherent"),
+            "stable_count_illusory": row.get("stable_count_illusory"),
+            "endpoint_distance": row.get("endpoint_distance"),
+            "denominator_state": prescan.get("denominator_state"),
+            "excluded_mass": prescan.get("excluded_mass"),
+            "shuffle_z_score": prescan.get("shuffle_z_score"),
+            "shuffle_class_changes": class_change,
+        })
+
+    thin_rows = [row for row in blank_rows if row.get("coordinate_failure") == THIN_FAILURE]
+    medium_rows = [row for row in blank_rows if row.get("coordinate_failure") != THIN_FAILURE]
+    all_thin_short = bool(thin_rows) and counts["thin_short_rows"] == len(thin_rows)
+    all_thin_contaminated = bool(thin_rows) and counts["thin_contaminated_rows"] == len(thin_rows)
+    all_thin_shuffle_unstable = bool(thin_rows) and counts["thin_shuffle_class_change_rows"] == len(thin_rows)
+
+    if all_thin_short and not all_thin_contaminated:
+        verdict = "DENOMINATOR_LIMITED_NOT_NULL_CONTAMINATION"
+    elif all_thin_contaminated:
+        verdict = "CONTAMINATION_LIMITED"
+    elif counts["thin_not_denominator_explained_rows"] > 0:
+        verdict = "AUTONOMOUS_THIN_BLANK_CANDIDATE"
+    else:
+        verdict = "AMBIGUOUS"
+
+    counts.update({f"class_{key}": value for key, value in sorted(by_class.items())})
+
+    return {
+        "experiment": "boundary_blank_thin_support_audit",
+        "question": "Are thin support-without-beta blanks denominator artifacts, null contamination artifacts, or autonomous boundary species?",
+        "source": data.get("experiment"),
+        "source_scope": data.get("source_scope"),
+        "observables_registry": data.get("observables_registry"),
+        "observables_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",
+        ],
+        "params": {
+            "full_gap_floor": full_gap_floor,
+            "target_state": TARGET_STATE,
+            "thin_failure": THIN_FAILURE,
+        },
+        "label_policy": "Does not use source_domain_type or GUE/Poisson label as an operator.",
+        "tests": {
+            "denominator_artifact": {
+                "condition": "all thin rows have n_gaps below full_gap_floor",
+                "passes": all_thin_short,
+            },
+            "contamination_artifact": {
+                "condition": "all thin rows are prescan contaminated",
+                "passes": all_thin_contaminated,
+            },
+            "shuffle_instability_artifact": {
+                "condition": "all thin rows have shuffle_class_changes=true",
+                "passes": all_thin_shuffle_unstable,
+            },
+            "autonomous_species_counter": {
+                "condition": "at least one thin row is not short-denominator explained",
+                "passes": counts["thin_not_denominator_explained_rows"] > 0,
+            },
+        },
+        "counts": counts,
+        "comparative_means": {
+            "thin": summarize(thin_rows),
+            "medium_control": summarize(medium_rows),
+        },
+        "verdict": verdict,
+        "rows": rows,
+    }
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--input", default="tools/data/boundary_row_aligned_nonexact_audit_20260509_1538.json")
+    parser.add_argument("--full-gap-floor", type=int, default=500)
+    parser.add_argument("--out", default="tools/data/boundary_blank_thin_support_audit_20260509_1548.json")
+    args = parser.parse_args()
+
+    with Path(args.input).open() as f:
+        data = json.load(f)
+
+    output = build_audit(data, args.full_gap_floor)
+    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"support_without_beta_blank_rows={c['support_without_beta_blank_rows']}")
+    print(f"thin_rows={c['thin_rows']}")
+    print(f"medium_control_rows={c['medium_control_rows']}")
+    print(f"thin_short_rows={c['thin_short_rows']}")
+    print(f"thin_contaminated_rows={c['thin_contaminated_rows']}")
+    print(f"thin_shuffle_class_change_rows={c['thin_shuffle_class_change_rows']}")
+    print(f"thin_not_denominator_explained_rows={c['thin_not_denominator_explained_rows']}")
+    print(f"verdict={output['verdict']}")
+    print(f"saved {out}")
+
+
+if __name__ == "__main__":
+    main()

tokens used
104,449
Eseguito il cycle e scritto il report richiesto:

[tools/data/reports/agent_20260509_1548.md](/opt/MM_D-ND/tools/data/reports/agent_20260509_1548.md)

Ho aggiunto anche:
- [tools/exp_boundary_blank_thin_support_audit.py](/opt/MM_D-ND/tools/exp_boundary_blank_thin_support_audit.py)
- [tools/data/boundary_blank_thin_support_audit_20260509_1548.json](/opt/MM_D-ND/tools/data/boundary_blank_thin_support_audit_20260509_1548.json)

Verdict: `DENOMINATOR_LIMITED_NOT_NULL_CONTAMINATION`. I tre `blank_thin_support` sono tutti short-denominator; contaminazione e shuffle instability non spiegano la classe. Verificato con `py_compile` e run dello script.
