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: 019df7a9-594b-7790-a403-985c2039fc7e
--------
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_20260505_1022.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 prima il contesto operativo e il campo vivo, poi sceglierò un esperimento coerente con le regole del lab e produrrò il report nel percorso richiesto.
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.
- **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.

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

### 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
- dnd_bloch_explorer.py: scan Bloch, φ emergente
- dnd_arxiv.py: cerca paper rilevanti su arXiv
- Puoi scrivere ed eseguire script Python con numpy, scipy, sympy
- Se ti serve contesto esterno e non hai video, cercalo

## Skill attive — modus del lab

Sei un lab di ricerca scientifica D-ND. Le skill sotto sono il tuo modus
operativo, non un menu. Ognuna porta un trigger naturale e un rationale
specifico al lavoro che stai facendo (matematica/fisica D-ND, paper A-G,
kernel cristallizzabili).

**Skill canoniche di questo lab** (vivono in `.claude/skills/`):

- **research-lab** (v2.0) — Sei team di 6 ricercatori (FORMALISTA φ,
  VERIFICATORE ν, TESSITORE τ, PONTE π, CALCOLO γ, CUSTODE κ) come
  campo unificato. 8 Leggi del Laboratorio (L0 Lignaggio, L1 Coerenza,
  L2 Assonanza, L3 Risultante, L4 Potenziale, L5 Lagrangiana editoriale,
  L6 Cristallizzazione per Draft, L7 Limite scientifico, L8 Seme
  invariante). Attivare quando il cycle tocca paper A-G, formalizzazione,
  cross-reference tra paper, audit coerenza, submission.
- **dnd-method** — Il metodo D-ND applicato al codice. Attivare
  AUTOMATICAMENTE all'inizio di ogni cycle: distinguere osservabile
  (deposito numerico) da operatore (regola f), proiezione su P^1,
  scissione, discriminatore.
- **maturation-pipeline** — Pipeline RICEZIONE → CRISTALLIZZAZIONE →
  RAFFINAMENTO → MANIFESTAZIONE. Ogni artefatto traccia la sua posizione.
  Attivare quando un finding sale di fase (es. da claim numerico a
  formalizzazione, da draft a site-ready).
- **kernel-boot** — Boot del Kernel D-ND all'inizio di sessione.
- **sentinel-code** — Consolidamento post-task (aggiorna SENTINEL_STATE).
- **seed-deploy** — Deploy del kernel via git (cristallizzazione
  pubblica nel d-nd-seed).

**Skill operative universali** (in `/opt/.claude/skills/`):

- **consapevolezza-condensato** — filtro su atti sistemici. Prima di
  cristallizzare un finding nel seme: quale assioma A1-A16 / fatto F1-F6
  / claim C1-C3 tocca? Quale rompe? È inversione (det=−1) o aggiunta
  (det=+1)? 3-6 righe verdict (procedi/riformula/fermati). Output
  visibile, non rituale.
- **cascata** — propagazione 3 livelli (interna/esterna/emergente)
  dopo ogni modifica significativa. Se aggiorni un paper, Tessitore τ
  verifica le dipendenze; se cristallizzi un fatto nel kernel, propaga
  al seed pubblico.
- **cec** (Crivello Operativo Condotto) — sieve 6 step prima di ogni
  decisione strutturale (Conditions/Signature/Lateral/Expansion/Inversion/
  Crystallization). Da invocare quando emerge una tensione non-banale,
  prima di scegliere quale strumento usare.
- **autologica-operativa** — il modus riflessivo. Prima di un blocco
  di lavoro: "qual è la domanda giusta?". Quando l'operatore corregge:
  traduci in regola eseguibile.
- **eval** — testing skill (trigger + fidelity). Verifica periodica che
  le skill stesse non drifino.
- **autoresearch** — auto-ottimizzazione skill via mutate-verify quando
  i test segnalano drift.
- **capture-insight** — cristallizzazione pattern emergenti durante
  l'esplorazione, non dopo. Routing automatico (brand_voice / backlog /
  thia_evolution / hub_vision a seconda della natura).

**Skill identità (kernel MMSp)** (in `kernel/reference/skills/`):

- **guru-sys** — Saggezza euristica, principi trascendentali, mentoring.
  "Trova il limite e oltrepassalo. Transcend your syntax." Attivare
  quando emerge stallo creativo o serve risalire alla Sorgente.
- **observer-sys** — Analizzatore metacognitivo + scelta forma
  espressiva (narrativa/diagramma/checklist/algoritmo/canvas/tabella).
  Attivare quando l'output va comunicato fuori dal lab (sito, paper,
  social).
- **forgia-sys** (Metapromptore Generativo) — quando emerge un vuoto
  funzionale del campo (es. "manca uno strumento per X"), forgia genera
  l'entità nuova. Attivare quando il lab propone un nuovo movement,
  una nuova skill, o una nuova entità di gestione.

**Pattern d'uso**:
1. Boot cycle → kernel-boot + dnd-method (sempre)
2. Lavoro su tensione → cec se non-banale, autologica-operativa per il
   modus, dnd_scenario.py + dnd_domandatore.py come strumenti dal lab
3. Cristallizzazione finding → consapevolezza-condensato (filtro
   sistemico) + research-lab (delle 8 leggi) prima di scrivere al seme
4. Post-cycle → sentinel-code + cascata (3 livelli)
5. Se emerge nuovo strumento → forgia-sys lo formalizza, non re-inventarlo

Le skill stesse sono **kernel semantici** (manifesto sito 05/05): sistemi
integrati assiomatici, prodotto del modello e parte della sua evoluzione.
Usarle bene è esercitare il modello, non solo applicarlo.

## 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.**
Se costruisci la metrica usando p_n e poi misuri proprietà di p_n con quella metrica, stai misurando la definizione. Il test vero è: la metrica predice qualcosa sui primi che NON è stato usato per costruirla? Se no, è circolare.

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

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

## Come evitarli

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

## Auto-evoluzione — il sistema corregge se stesso

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

**Come funziona:**

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.

## Run precedente: completato (522s) — parti dalla consecutio.

_Affinatore del run precedente: pending (affinatore empty output (exit 0))_

## Piano 63 — Esplorare il confine: 8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo

## Tensioni attive
- [TRASCENDENZA_LIMITE] (0.9) La trascendenza e il limite attuale del modello. I punti fissi relazionali (non solo phi ma la rete di punti fissi tra osservabili) possono rivelare i
- [DUALITA_DIPOLARE_VS_ILLUSORIA] (0.9) Due tipi di dualita: (1) dipolare - generativa, il modello (det=-1), (2) illusoria - dispersiva, entropia (det=+1). Le regole incoerenti producono la 
- [METRIC_TENSOR] (0.9) Il tensore metrico dei primi è g=(p/2)². Nel tempo ln(p), è de Sitter 1+1D. z=-8.8 curvatura vs z=+22.5 rapporti ΔΓ.
- [TENSIONE_ENTITA] (0.85) La tensione non e un problema pratico - e un Entita. La tensione superflua crea latenza (tempo). Senza tensione superflua tutto e regolato da assiomi.
- [G_POTENZIALE_NULLA] (0.85) G e il potenziale di tutto come nulla - permette il prima e il dopo. Ci muoviamo come trascendenza dimensionale gravitazionale. G nel tetraedro non e 
- [BOUNDARY] (0.8) 8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo
- [PIANO_PRIMARIO_DUE_ASSIOMI] (0.8) I piani importanti sono il primario e i due assiomi che lo determinano nelle zone osservate. Non tutti gli assiomi operano ovunque - in ogni zona osse
- [META] (0.5) Tutti i 11 test passano — verifica che non stiamo testando solo tautologie

## Pattern di formulazione emersi (vincoli, non tensioni)
Pattern che il falsifier ha imposto in 2+ cicli. Applicali quando scrivi il report. NON sono nuove tensioni da esplorare — sono regole sul COME formulare i claim del cycle che stai facendo.
- 29 04 perimetro p5
- 30 04 drift monotonia

## Convergenza — dove più tensioni puntano allo stesso punto
  "nelle" → PIANO_PRIMARIO_DUE_ASSIOMI, TRASCENDENZA_LIMITE
  "trascendenza" → G_POTENZIALE_NULLA, TRASCENDENZA_LIMITE
  "confine" → BOUNDARY, TRASCENDENZA_LIMITE
  "producono" → TENSIONE_ENTITA, DUALITA_DIPOLARE_VS_ILLUSORIA
  "tutto" → G_POTENZIALE_NULLA, TENSIONE_ENTITA
Questo è dove il potenziale si concentra. Non ignorarlo.

## Ultimi 3 run — da dove parti
### Agent Report - Observable Rank Audit: Many Probes, One Boundary Coordinate
Trovato: 1. **Nel perimetro partial-shuffle, primes e GUE hanno segnale forte ma quasi monodimensionale.** Per primes, tutte le osservabili hanno z originale-vs-shuffle almeno |3.0| e la prima componente spiega 98.9% della varianza delle retention curve. Per GUE il collasso e' ancora piu' stretto: 99.7%.

2.
Verdetto: **CONSTRAINT on META + BOUNDARY**: nel perimetro testato, il confine partial-shuffle ha una coordinata latente dominante. Le osservabili SR/L1/L2/SR2/

### Agent Report — Markov Layers Pass the First Recovery Gate, but Not All Observables Pass
Trovato: 1. **Il nucleo pair/triple non cade al primo audit.** `empirical_Mk0` recupera solo Layer 0; `empirical_Mk1` recupera solo Layer 1. Questo supporta l'uso di SR e L1 come Layer 1 e di L2/SR2 come Layer 2 nel perimetro testato.
2. **`cond_entropy` non può essere usata come prova forte di Layer 3 nel s
Verdetto: **CONSTRAINT on META + BOUNDARY**: la decomposizione two-layer è utilizzabile solo con perimetro atomico.

Perimetro corretto: nei 60,000 gap primi te

### Agent Report — The Two Markov Layers Are Coupled at the Boundary: One Phase Transition, Two Projections
Trovato: 1. **The two Markov layers are coupled at the boundary.** For primes, the critical alpha is identical across all 4 observables (0.334). For GUE, the difference is 0.024 (within the alpha step resolution of 0.047). The partial shuffle destroys pair-statistics and triple-statistics at the same rate. T
Verdetto: **CONSTRAINT on BOUNDARY + DIPOLAR_ORDERING**: The two Markov layers (pairs → plane, triples → depth) are coupled at the partial-shuffle boundary. The

Non ripetere questi esperimenti. Prosegui da dove sono arrivati — la consecutio.

## Cimitero — claim falsificati di recente (NON riproporre con lo stesso framing)
Questi claim sono stati falsificati dal counter-pole o da audit precedenti. Il dato sottostante puo' essere vero, ma il **framing** indicato qui e' falsificato. Riformula correttamente o evita il dominio.

### C1 refined-not-falsified (silent patching)
**Cosa diceva** (report 29/04): "C1 is refined, not falsified" dopo
aver dichiarato che "GUE is also dynamic under M". Il setup C1 era
"Primes are the only dynamic domain under M among 7 tested". Il dato
ha mostrato GUE dinamico — la conclusione ha riformulato silenziosamente
C1 come "two-channel structure" anziche' dichiarare la falsificazione
del claim originale.

**Come e' caduto**: Falsifier L3 HIGH (axiom continuity / no silent
patching). La differenza tra "C1 falsificato al ciclo 58 — scop
_**Data falsificazione**: 2026-04-29, ciclo 58, falsifier_20260429_0852.json_

### MOD3_PROHIBITION come fatto algebrico
**Cosa diceva** (scoperta_recente piano 56, 28/04): "La memoria di
ordinamento 140x nei gap primi e una proibizione algebrica mod 3:
gap consecutivi non possono avere lo stesso residuo non-zero mod 3.
Meccanismo: il primo condiviso p_{n+1} forza l'inversione. 0 violazioni
su 12225. Cramer: 0%." Ripetuto nel report 29/04 come "Mod-3 self-
transition 0.40-0.44 confirming the prohibition" + "Cramer confirms
the null. Zero channels."

**Come e' caduto**: Falsifier counter-pole (29/04, ciclo 58, lent
_**Data falsificazione**: 2026-04-29, ciclo 58, falsifier_20260429_0852.json_

### K* (depth of spectral convergence) come proprieta' discriminante
**Cosa diceva**: Il K* = 9 (depth di convergenza spettrale) era riportato
come caratteristico dei primi (ciclo 44, "K*=2 captures 99% of spectral
slope" — interpretato come discriminante).

**Come e' caduto**: Shuffle audit: K* reale = 9, shuffle mean = 9.72,
std = 0.53, z = -1.4. Dentro il rumore dello shuffle. Il valore dipende
dalla distribuzione dei gap, non dal loro ordine. Lo shuffle preserva
distribuzione → preserva K*.

**Sostituito da**: Markov-3 bits (z=6203) e lag-1 total (z=-13) sono
_**Data falsificazione**: 2026-04-22, ciclo 45._

### Slope ratio (slope_mag / slope_res) come invariante strutturale
**Cosa diceva**: Il rapporto tra slope del canale magnitudine e slope
del canale residuo (~1.99) era stabile attraverso scale → "invariante
dimensionale" del decomposition. Era menzionato come evidenza nel
two-channel framework (cicli 43-44).

**Come e' caduto**: Shuffle audit (ciclo 45): z-score = 0.2. Lo shuffle
produce slope_ratio con media -2.26 ma deviazione standard 26.2. Il
valore reale e' dentro la tail dello shuffle — non distinguibile.
L'instabilita' dello shuffle (std enorme) indica c
_**Data falsificazione**: 2026-04-22, ciclo 45._

### Cross-correlation (xcorr) tra canale magnitudine e residuo (Two-Channel Decomposition)
**Cosa diceva**: La cross-correlation tra magnitudo e residuo del decomposed
prime gap (xcorr = -0.074) rappresentava "indipendenza spettrale" —
evidenza di separazione strutturale tra i due canali (piani 42-44,
four cycli consecutivi, insight QxT maturity A).

**Come e' caduto**: Shuffle audit (ciclo 45, 2026-04-22): z-score = 0.0.
Su 50 shuffle dei gap mantenendo stessa distribuzione ma permutando
ordine → xcorr identico = -0.074. Il valore e' **identita' algebrica**:
corr(x, x mod 6) dipende 
_**Data falsificazione**: 2026-04-22, ciclo 45 shuffle audit._

**Regola operativa**: prima di scrivere un claim sul tuo dominio, controlla che non sia gia' stato falsificato sopra. Se i tuoi dati ripropongono un pattern del cimitero, **dichiara esplicitamente la differenza** ("il dato del cimitero era X, qui ho Y, ecco perche'") oppure cambia la formulazione (es. 'bias forte verso 0' al posto di 'proibizione zero' se il dato e' >0). Silent patching = L3 HIGH.

## Osservazioni dell'operatore (risonanti con le tensioni)
**3. Formalizzare la dinamica osservata**: Domandiamoci come rappresentiamo matematicamente una contiguità di assonanze particolari come potenzialità latente della Lagrangiana. Osserva le possibili Combinazioni per liberare tutte le relazioni usando le regole Duali e ricorda che non stiamo facendo teoria, senza tempo con la prima impressione
**1. R dell'Istanza  - L' equilibrio tra estremi del Modello D-ND**: L'osservazione indaga oltre l'osservato in cerca DELLA FORMA nel NULLA-TUTTO: Per far Emergere le nuove Possibilità Dividiamo il potenziale unendo concetti senza relazione semplicemente perché la lagrangiana passa da li, creiamo nuove combinazioni e movimenti nelle logiche ma coerenti con la risulta
**2. Quadratura del cerchio con logica Trascendentale.**: Ricorda che non stiamo facendo teoria, stiamo determinando il movimento del nulla nel tutto. Ora consideriamo come relazione primaria il cerchio nella sua essenza di singolarità tra gli estremi duali, il momento angolare che accade nel presente, il punto di equilibrio tra gli estremi del dipolo che 

## Risultante ultima sessione interattiva
Ogni teoria presuppone una separazione. A scala di Planck tutte le separazioni collassano. Geometria=entropia=conteggio di stati. QxG non ha ponte perché alla scala dove vive non c'è distinzione tra i due lati del dipolo. Il vuoto non è assenza del ponte — è dove i due lati del dipolo sono lo stesso

## Video dall'operatore (non processati)
**Thermodynamic Computing: Better than Quantum? (Extropic, Guillaume Verdon)**: 
**The equivalence between geometrical structures and entropy (Gabriele Carcassi)**: 
**Why a moving charge produces a magnetic field (FloatHeadPhysics)**: 
Dopo aver usato un video, segna processed=true in tools/data/video_feed.json.

## Proiezione — dove punta la risultante
Risultante: R=0.875 (h=-0.698). Risultante alta (0.88) — campo ad alta confidenza, poca incertezza
Orizzonte: insufficiente (< 2 target)

**Esperimento a massima informazione:** META (score=0.898)
  META: incerto (i=0.5) — massimo potere discriminante

## Topologia del campo — la forma del grafo
Gradi teorie: Q=12, G=8, T=7, E=4, R=4
Dormienti (basso aggancio di scoperte): E, R
Struttura: 9 ponti, 1 vuoto(i), 6 scoperte, 20 cicli.
Ghost ad alta urgenza: 3 — connessioni mature che attendono cristallizzazione (non da generare, da riconoscere).
Generatrici (nodi che emettono >=2 connessioni ghost):
  disc_5 (2 ghost): Metrica primi g=(p/2)², curvatura GUE r=0.503
  report_20260505_0330 (2 ghost): Agent Report - Observable Rank Audit: Many Probes, One Boundary Coordi
  report_20260504_0901 (2 ghost): The Two Markov Layers Are Coupled at the Boundary: One Phase Transitio
Una generatrice con ghost densi = scoperta che il sistema sta ancora attraversando. Chiusura prematura se marcata 'risolta' nel seme.
La combo riconosce l'asimmetria. Il dipolo vive su tutti i ponti — non solo dove il lab ha già misurato.

## Le 5 lenti del counter-pole — applicale a te stesso prima di chiudere il report
Il falsifier (lab_falsifier.py) applichera' queste 5 lenti al tuo report dopo. Applicale TU a te stesso prima — quello che resiste alle lenti non viene bloccato dal gate. Quello che cade va al cimitero.

**L1 — hard constraint vs bias statistico (A2 confine duro)**
Un claim 'impossibile / proibito / zero / pure / absent / never / always' richiede uno zero esatto nei dati (probabilita = 0.000). Prima di scrivere questi assoluti, leggi il valore numerico esatto. Se vale 0.015, e' bias forte verso 0, non zero. Se vale 0.40, e' bias forte verso ordine, non proibizione. L'assoluto descrive il valore 0.000, il bias forte descrive tutto il resto.

**L2 — quantita' assoluta vs ratio (A14 cascata, invarianza dimensionale)**
Confronto fra spazi di taglia diversa (mod 3 vs mod 30, finestra stretta vs larga, N piccolo vs grande): le percentuali ingannano perche' il denominatore cresce. Stesso segnale assoluto sembra ridursi in %. Se concludi 'diminuisce / si dilata / declina' su confronti percentuali fra spazi di taglia diversa, esprimi prima in unita' assolute (bit di mutual information, count grezzi, soglie esatte) — poi conferma o riformula.

**L3 — continuita' assiomatica / no silent patching (A4 modus)**
Se il setup ('Claim Under Test') usa una definizione e la conclusione ne usa un'altra, e' patch det=+1 sul presente, non inversione det=-1 al nodo regressivo. Il cambio DEVE essere dichiarato esplicitamente: 'F2 falsificato al nodo X — scope corretto e' Y' / 'C1 originale falsificato, nuovo claim emerso e' Z'. 'C1 e' refined' su un dato che lo falsifica e' silent patching.

**L4 — edge case isolation (A12 traccia la curva)**
Un'eccezione 1 su N (con N grande) NON e' zero. Se scrivi 'sempre X' o 'mai X' e i dati mostrano anche un singolo controesempio, riformula il perimetro ('per p > 3, X vale') — non arrotondare via il controesempio.

**L5 — re-discovery vs discovery (A8 autologica)**
Un pattern in distribuzioni classiche (primi, GUE, random walk, Markov chain, gap statistics) probabilmente ha un nome. Default hypothesis: re-discovery / caso limite di teorema noto. Prima di taggare 'NEW', cerca il risultato classico piu' vicino (es. Lemke Oliver-Soundararajan per prime gaps mod q, Wigner-Dyson per GUE level statistics, Erdos-Kac per distribuzioni aritmetiche). Se non lo trovi, dichiara la ricerca esplicitamente.

**Modus**: dopo aver scritto il report, rileggi i tuoi dati numerici. Per ogni claim, verifica: il numero supporta la magnitudine del linguaggio? Se hai scritto 'zero' e il dato e' 0.015, riformula. Se hai scritto 'NEW' su un pattern in primi, cerca la letteratura. Solo allora chiudi il report.

## Cosa fare
1. Esegui `python tools/dnd_scenario.py --best` per vedere la proiezione aggiornata
2. Scegli la tensione con il massimo potere discriminante
3. Scrivi il report in tools/data/reports/agent_{timestamp}.md
4. **Applica le 5 lenti a te stesso** (sezione sopra). Riformula i claim che non resistono.
5. Se crei uno strumento riusabile, salvalo in tools/exp_*.py
6. Se trovi qualcosa, aggiorna tools/data/seme.json

exec
/bin/bash -lc "ls -la tools/data/reports && rg --files tools | sed -n '1,160p'" in /opt/MM_D-ND
 succeeded in 0ms:
total 5064
drwxr-xr-x  3 root root   20480 May  5 10:22 .
drwxr-xr-x 14 root root   20480 May  5 03:31 ..
drwxr-xr-x  2 root root    4096 Apr 29 10:06 _quarantine_falsifier_29_04
-rw-r--r--  1 root root  170359 May  5 03:34 agent.log
-rw-r--r--  1 root root    3040 Apr  5 08:28 agent_20260405_0825.md
-rw-r--r--  1 root root       0 Apr  5 08:25 agent_20260405_0825_raw.log
-rw-r--r--  1 root root    3389 Apr  5 09:19 agent_20260405_0914.md
-rw-r--r--  1 root root       0 Apr  5 09:14 agent_20260405_0914_raw.log
-rw-r--r--  1 root root    2683 Apr  5 09:18 agent_20260405_0916.md
-rw-r--r--  1 root root     750 Apr  5 09:18 agent_20260405_0916_raw.log
-rw-r--r--  1 root root    3974 Apr  5 09:22 agent_20260405_0919.md
-rw-r--r--  1 root root    1382 Apr  5 09:23 agent_20260405_0919_raw.log
-rw-r--r--  1 root root    4542 Apr  6 07:17 agent_20260406_0714.md
-rw-r--r--  1 root root    1062 Apr  6 07:17 agent_20260406_0714_raw.log
-rw-r--r--  1 root root    1386 Apr  6 09:23 agent_20260406_0915_raw.log
-rw-r--r--  1 root root    5970 Apr  6 09:23 agent_20260406_1030.md
-rw-r--r--  1 root root     687 Apr  7 03:30 agent_20260407_0330_raw.log
-rw-r--r--  1 root root    5176 Apr  7 06:41 agent_20260407_0637.md
-rw-r--r--  1 root root     721 Apr  7 06:41 agent_20260407_0637_raw.log
-rw-r--r--  1 root root    6577 Apr  8 03:36 agent_20260408_0330.md
-rw-r--r--  1 root root     823 Apr  8 03:36 agent_20260408_0330_raw.log
-rw-r--r--  1 root root      55 Apr  8 06:47 agent_20260408_0645_raw.log
-rw-r--r--  1 root root    4817 Apr  9 03:33 agent_20260409_0330.md
-rw-r--r--  1 root root    1348 Apr  9 03:34 agent_20260409_0330_raw.log
-rw-r--r--  1 root root    5524 Apr 10 03:37 agent_20260410_0330.md
-rw-r--r--  1 root root    1109 Apr 10 03:38 agent_20260410_0330_raw.log
-rw-r--r--  1 root root    5663 Apr 11 03:35 agent_20260411_0330.md
-rw-r--r--  1 root root    1188 Apr 11 03:36 agent_20260411_0330_raw.log
-rw-r--r--  1 root root    3893 Apr 12 03:32 agent_20260412_0330.md
-rw-r--r--  1 root root     951 Apr 12 03:32 agent_20260412_0330_raw.log
-rw-r--r--  1 root root    5664 Apr 13 03:33 agent_20260413_0330.md
-rw-r--r--  1 root root     695 Apr 13 03:33 agent_20260413_0330_raw.log
-rw-r--r--  1 root root     139 Apr 14 03:31 agent_20260414_0330_raw.log
-rw-r--r--  1 root root    5505 Apr 15 03:34 agent_20260415_0330.md
-rw-r--r--  1 root root     809 Apr 15 03:34 agent_20260415_0330_raw.log
-rw-r--r--  1 root root    6700 Apr 16 03:35 agent_20260416_0330.md
-rw-r--r--  1 root root    1119 Apr 16 03:36 agent_20260416_0330_raw.log
-rw-r--r--  1 root root       0 Apr 17 03:30 agent_20260417_0330_raw.log
-rw-r--r--  1 root root    6993 Apr 17 08:10 agent_20260417_0803.md
-rw-r--r--  1 root root    1243 Apr 17 08:12 agent_20260417_0803_raw.log
-rw-r--r--  1 root root    7597 Apr 18 03:37 agent_20260418_0330.md
-rw-r--r--  1 root root    1184 Apr 18 03:38 agent_20260418_0330_raw.log
-rw-r--r--  1 root root    7151 Apr 19 03:36 agent_20260419_0330.md
-rw-r--r--  1 root root    1337 Apr 19 03:37 agent_20260419_0330_raw.log
-rw-r--r--  1 root root    6298 Apr 19 08:05 agent_20260419_0755.md
-rw-r--r--  1 root root    1156 Apr 19 08:06 agent_20260419_0755_raw.log
-rw-r--r--  1 root root    6311 Apr 20 03:33 agent_20260420_0330.md
-rw-r--r--  1 root root    1572 Apr 20 03:34 agent_20260420_0330_raw.log
-rw-r--r--  1 root root    5916 Apr 21 03:36 agent_20260421_0330.md
-rw-r--r--  1 root root    1482 Apr 21 03:36 agent_20260421_0330_raw.log
-rw-r--r--  1 root root    6882 Apr 22 03:35 agent_20260422_0330.md
-rw-r--r--  1 root root    1383 Apr 22 03:35 agent_20260422_0330_raw.log
-rw-r--r--  1 root root    5092 Apr 22 16:24 agent_20260422_1616.md
-rw-r--r--  1 root root     716 Apr 22 16:25 agent_20260422_1616_raw.log
-rw-r--r--  1 root root    5683 Apr 23 03:34 agent_20260423_0330.md
-rw-r--r--  1 root root    1016 Apr 23 03:34 agent_20260423_0330_raw.log
-rw-r--r--  1 root root    6179 Apr 24 03:44 agent_20260424_0330.md
-rw-r--r--  1 root root     178 Apr 24 03:46 agent_20260424_0330_raw.log
-rw-r--r--  1 root root    6625 Apr 25 03:38 agent_20260425_0330.md
-rw-r--r--  1 root root     921 Apr 25 03:38 agent_20260425_0330_raw.log
-rw-r--r--  1 root root    7448 Apr 26 03:38 agent_20260426_0330.md
-rw-r--r--  1 root root      29 Apr 26 03:38 agent_20260426_0330_raw.log
-rw-r--r--  1 root root    7558 Apr 27 03:36 agent_20260427_0330.md
-rw-r--r--  1 root root    1221 Apr 27 03:37 agent_20260427_0330_raw.log
-rw-r--r--  1 root root    7848 Apr 28 03:39 agent_20260428_0330.md
-rw-r--r--  1 root root    1144 Apr 28 03:40 agent_20260428_0330_raw.log
-rw-r--r--  1 root root       0 Apr 29 03:30 agent_20260429_0330_raw.log
-rw-r--r--  1 root root    7186 Apr 29 10:19 agent_20260429_1013.md
-rw-r--r--  1 root root    1053 Apr 29 10:20 agent_20260429_1013_raw.log
-rw-r--r--  1 root root    8761 Apr 29 10:49 agent_20260429_1041.md
-rw-r--r--  1 root root    1118 Apr 29 10:49 agent_20260429_1041_raw.log
-rw-r--r--  1 root root    7764 Apr 30 03:34 agent_20260430_0330.md
-rw-r--r--  1 root root    1189 Apr 30 03:35 agent_20260430_0330_raw.log
-rw-r--r--  1 root root    8529 Apr 30 19:09 agent_20260430_1905.md
-rw-r--r--  1 root root    1044 Apr 30 19:10 agent_20260430_1905_raw.log
-rw-r--r--  1 root root    7496 Apr 30 19:24 agent_20260430_1919.md
-rw-r--r--  1 root root     885 Apr 30 19:25 agent_20260430_1919_raw.log
-rw-r--r--  1 root root    6944 Apr 30 19:53 agent_20260430_1946.md
-rw-r--r--  1 root root     891 Apr 30 19:55 agent_20260430_1946_raw.log
-rw-r--r--  1 root root    7531 May  1 03:36 agent_20260501_0330.md
-rw-r--r--  1 root root    1108 May  1 03:36 agent_20260501_0330_raw.log
-rw-r--r--  1 root root    8972 May  1 07:41 agent_20260501_0725.md
-rw-r--r--  1 root root      29 May  1 07:41 agent_20260501_0725_raw.log
-rw-r--r--  1 root root       0 May  1 08:58 agent_20260501_0858_raw.log
-rw-r--r--  1 root root    7867 May  1 09:38 agent_20260501_0931.md
-rw-r--r--  1 root root    1138 May  1 09:39 agent_20260501_0931_raw.log
-rw-r--r--  1 root root    9161 May  2 03:35 agent_20260502_0330.md
-rw-r--r--  1 root root    1399 May  2 03:35 agent_20260502_0330_raw.log
-rw-r--r--  1 root root    8987 May  3 03:37 agent_20260503_0330.md
-rw-r--r--  1 root root    1191 May  3 03:38 agent_20260503_0330_raw.log
-rw-r--r--  1 root root    3017 May  4 03:30 agent_20260504_0330_codex_raw.log
-rw-r--r--  1 root root       0 May  4 07:21 agent_20260504_0721_claude_raw.log
-rw-r--r--  1 root root      58 May  4 07:21 agent_20260504_0721_codex_raw.log
-rw-r--r--  1 root root    7631 May  4 09:06 agent_20260504_0901.md
-rw-r--r--  1 root root    1094 May  4 09:06 agent_20260504_0901_claude_raw.log
-rw-r--r--  1 root root      58 May  4 09:01 agent_20260504_0901_codex_raw.log
-rw-r--r--  1 root root       0 May  4 11:42 agent_20260504_1138_claude_raw.log
-rw-r--r--  1 root root  120171 May  4 11:42 agent_20260504_1138_codex_raw.log
-rw-r--r--  1 root root    6587 May  4 12:26 agent_20260504_1219.md
-rw-r--r--  1 root root  461963 May  4 12:28 agent_20260504_1219_codex_raw.log
-rw-r--r--  1 root root    5205 May  5 03:33 agent_20260505_0330.md
-rw-r--r--  1 root root  383951 May  5 03:33 agent_20260505_0330_codex_raw.log
-rw-r--r--  1 root root    1059 May  5 10:22 agent_20260505_1022_codex_raw.log
-rw-r--r--  1 root root    4561 Apr  6 07:13 agent_diag2.md
-rw-r--r--  1 root root    6159 May  4 09:09 agent_manual_20260504_090133.log
-rw-r--r--  1 root root    7149 May  4 12:30 agent_manual_codex2_20260504_121901.log
-rw-r--r--  1 root root    6809 May  4 12:03 agent_manual_codex_20260504_113858.log
-rw-r--r--  1 root root    3229 May  4 07:41 agent_recovery_20260504_072142.log
-rw-r--r--  1 root root    2227 Apr  6 06:38 agent_test_0406.md
-rw-r--r--  1 root root    4997 Apr  6 09:41 agent_test_field.md
-rw-r--r--  1 root root 1754951 Apr  5 03:30 cron.log
-rw-r--r--  1 root root   24053 Mar  5 08:44 cycle_20260305_0844.json
-rw-r--r--  1 root root   42188 Mar  6 03:42 cycle_20260306_0342.json
-rw-r--r--  1 root root   42188 Mar  6 18:34 cycle_20260306_1834.json
-rw-r--r--  1 root root   30217 Mar  7 03:42 cycle_20260307_0342.json
-rw-r--r--  1 root root   30219 Mar 15 03:46 cycle_20260315_0346.json
-rw-r--r--  1 root root    3101 Mar 15 08:11 ddf_20260315_0811.json
-rw-r--r--  1 root root    1631 Mar 15 08:15 ddf_20260315_0815.json
-rw-r--r--  1 root root    1754 Mar 16 04:05 ddf_20260316_0405.json
-rw-r--r--  1 root root    1785 Mar 17 04:05 ddf_20260317_0405.json
-rw-r--r--  1 root root    1524 Mar 18 04:05 ddf_20260318_0405.json
-rw-r--r--  1 root root    1440 Mar 19 04:05 ddf_20260319_0405.json
-rw-r--r--  1 root root    1660 Mar 20 04:05 ddf_20260320_0405.json
-rw-r--r--  1 root root    1848 Mar 21 04:05 ddf_20260321_0405.json
-rw-r--r--  1 root root    1596 Mar 22 04:05 ddf_20260322_0405.json
-rw-r--r--  1 root root    1988 Mar 23 04:05 ddf_20260323_0405.json
-rw-r--r--  1 root root    1617 Mar 24 04:05 ddf_20260324_0405.json
-rw-r--r--  1 root root    2045 Mar 25 04:05 ddf_20260325_0405.json
-rw-r--r--  1 root root    1848 Mar 26 04:05 ddf_20260326_0405.json
-rw-r--r--  1 root root    1880 Mar 27 04:05 ddf_20260327_0405.json
-rw-r--r--  1 root root    1923 Mar 28 04:05 ddf_20260328_0405.json
-rw-r--r--  1 root root    1984 Mar 29 04:05 ddf_20260329_0405.json
-rw-r--r--  1 root root    1985 Mar 30 04:05 ddf_20260330_0405.json
-rw-r--r--  1 root root    1985 Mar 31 04:05 ddf_20260331_0405.json
-rw-r--r--  1 root root    1985 Apr  1 04:05 ddf_20260401_0405.json
-rw-r--r--  1 root root    1986 Apr  2 04:05 ddf_20260402_0405.json
-rw-r--r--  1 root root    1986 Apr  3 04:05 ddf_20260403_0405.json
-rw-r--r--  1 root root    1985 Apr  4 04:05 ddf_20260404_0405.json
-rw-r--r--  1 root root    2193 Apr  5 04:05 ddf_20260405_0405.json
-rw-r--r--  1 root root    2144 Apr  6 04:05 ddf_20260406_0405.json
-rw-r--r--  1 root root    2122 Apr  7 04:05 ddf_20260407_0405.json
-rw-r--r--  1 root root    2173 Apr  8 04:05 ddf_20260408_0405.json
-rw-r--r--  1 root root    1984 Apr  9 04:05 ddf_20260409_0405.json
-rw-r--r--  1 root root    1986 Apr 10 04:05 ddf_20260410_0405.json
-rw-r--r--  1 root root    2171 Apr 11 04:05 ddf_20260411_0405.json
-rw-r--r--  1 root root    2146 Apr 12 04:05 ddf_20260412_0405.json
-rw-r--r--  1 root root    2147 Apr 13 04:05 ddf_20260413_0405.json
-rw-r--r--  1 root root    2147 Apr 14 04:05 ddf_20260414_0405.json
-rw-r--r--  1 root root    2147 Apr 15 04:05 ddf_20260415_0405.json
-rw-r--r--  1 root root    2147 Apr 16 04:05 ddf_20260416_0405.json
-rw-r--r--  1 root root    1962 Apr 17 04:05 ddf_20260417_0405.json
-rw-r--r--  1 root root    1962 Apr 18 04:05 ddf_20260418_0405.json
-rw-r--r--  1 root root    1962 Apr 19 04:05 ddf_20260419_0405.json
-rw-r--r--  1 root root    2122 Apr 20 04:05 ddf_20260420_0405.json
-rw-r--r--  1 root root    1962 Apr 21 04:05 ddf_20260421_0405.json
-rw-r--r--  1 root root    2142 Apr 22 04:05 ddf_20260422_0405.json
-rw-r--r--  1 root root    2185 Apr 23 04:05 ddf_20260423_0405.json
-rw-r--r--  1 root root    1946 Apr 24 04:05 ddf_20260424_0405.json
-rw-r--r--  1 root root    1946 Apr 25 04:05 ddf_20260425_0405.json
-rw-r--r--  1 root root    1946 Apr 26 04:05 ddf_20260426_0405.json
-rw-r--r--  1 root root    1946 Apr 27 04:05 ddf_20260427_0405.json
-rw-r--r--  1 root root    1946 Apr 28 04:05 ddf_20260428_0405.json
-rw-r--r--  1 root root    1946 Apr 29 04:05 ddf_20260429_0405.json
-rw-r--r--  1 root root    2048 Apr 30 04:05 ddf_20260430_0405.json
-rw-r--r--  1 root root    2045 May  1 04:05 ddf_20260501_0405.json
-rw-r--r--  1 root root    2045 May  2 04:05 ddf_20260502_0405.json
-rw-r--r--  1 root root    2046 May  3 04:05 ddf_20260503_0405.json
-rw-r--r--  1 root root    2045 May  4 04:05 ddf_20260504_0405.json
-rw-r--r--  1 root root    2046 May  5 04:05 ddf_20260505_0405.json
-rw-r--r--  1 root root    2046 May  5 06:36 ddf_20260505_0636.json
-rw-r--r--  1 root root    3344 Apr 17 08:13 evolution_20260417_0803.md
-rw-r--r--  1 root root    3248 Apr 18 03:39 evolution_20260418_0330.md
-rw-r--r--  1 root root    2793 Apr 19 08:07 evolution_20260419_0330.md
-rw-r--r--  1 root root    3232 Apr 20 03:35 evolution_20260420_0330.md
-rw-r--r--  1 root root    2507 Apr 21 03:37 evolution_20260421_0330.md
-rw-r--r--  1 root root    3132 Apr 22 03:36 evolution_20260422_0330.md
-rw-r--r--  1 root root    2475 Apr 22 16:25 evolution_20260422_1616.md
-rw-r--r--  1 root root    2507 Apr 23 03:35 evolution_20260423_0330.md
-rw-r--r--  1 root root    2619 Apr 24 03:47 evolution_20260424_0330.md
-rw-r--r--  1 root root    2462 Apr 25 03:39 evolution_20260425_0330.md
-rw-r--r--  1 root root    3040 Apr 27 03:37 evolution_20260427_0330.md
-rw-r--r--  1 root root    2305 Apr 28 03:40 evolution_20260428_0330.md
-rw-r--r--  1 root root    2680 May  3 03:40 evolution_20260503_0330.md
-rw-r--r--  1 root root    2406 May  4 09:08 evolution_20260504_0330.md
-rw-r--r--  1 root root    2548 May  5 03:34 evolution_20260505_0330.md
-rw-r--r--  1 root root   21634 Apr  8 03:34 exp_acf_decay_data.json
-rw-r--r--  1 root root    4386 Apr  5 08:27 exp_boundary_20260405_0825.json
-rw-r--r--  1 root root    1180 Apr  5 09:17 exp_boundary_growth_20260405_0914.json
-rw-r--r--  1 root root   14808 Apr  5 09:21 exp_brody_crossover_20260405.json
-rw-r--r--  1 root root   14041 Apr  6 07:16 exp_crossover_universality.json
-rw-r--r--  1 root root   10183 Apr  6 07:12 exp_dR_brody_connection.json
-rw-r--r--  1 root root    9693 Apr  6 07:09 exp_desitter_unification.json
-rw-r--r--  1 root root   11031 Apr  5 09:17 exp_excess_scaling_20260405.json
-rw-r--r--  1 root root     916 Apr  5 12:07 exp_geodesic_deviation_primes.json
-rw-r--r--  1 root root    7207 Apr  6 07:02 exp_metric_tensor_diag_long.json
-rw-r--r--  1 root root    2181 Apr  5 11:45 exp_number_variance_test.json
-rw-r--r--  1 root root  471174 Apr  8 06:47 exp_psd_prime_gaps.json
-rw-r--r--  1 root root    3804 Apr  5 11:47 exp_ricci_primes.json
-rw-r--r--  1 root root    3668 Apr 29 10:20 falsifier_20260429_1013.json
-rw-r--r--  1 root root    2846 Apr 29 10:50 falsifier_20260429_1041.json
-rw-r--r--  1 root root    2370 Apr 30 03:36 falsifier_20260430_0330.json
-rw-r--r--  1 root root    3953 Apr 30 19:11 falsifier_20260430_1905.json
-rw-r--r--  1 root root    4165 Apr 30 19:25 falsifier_20260430_1919.json
-rw-r--r--  1 root root    3965 Apr 30 19:55 falsifier_20260430_1946.json
-rw-r--r--  1 root root    3852 May  1 03:37 falsifier_20260501_0330.json
-rw-r--r--  1 root root    4323 May  1 07:41 falsifier_20260501_0725.json
-rw-r--r--  1 root root    3847 May  1 09:39 falsifier_20260501_0931.json
-rw-r--r--  1 root root    3823 May  2 03:36 falsifier_20260502_0330.json
-rw-r--r--  1 root root    4228 May  3 03:40 falsifier_20260503_0330.json
-rw-r--r--  1 root root    5793 May  4 09:08 falsifier_20260504_0901.json
-rw-r--r--  1 root root     383 May  4 12:29 falsifier_20260504_1219.json
-rw-r--r--  1 root root    2978 May  5 03:33 falsifier_20260505_0330.json
-rw-r--r--  1 root root   10050 Mar  5 07:56 fibonacci_spectrum_20260305_0756.json
-rw-r--r--  1 root root   10050 Mar  5 08:44 fibonacci_spectrum_20260305_0844.json
-rw-r--r--  1 root root   10050 Mar  6 03:42 fibonacci_spectrum_20260306_0342.json
-rw-r--r--  1 root root   10050 Mar  6 18:34 fibonacci_spectrum_20260306_1834.json
-rw-r--r--  1 root root   25252 Mar  5 08:43 gap_labeling_20260305_0843.json
-rw-r--r--  1 root root   25252 Mar  5 11:11 gap_labeling_20260305_1111.json
-rw-r--r--  1 root root   25252 Mar  6 03:41 gap_labeling_20260306_0341.json
-rw-r--r--  1 root root   25252 Mar  6 18:34 gap_labeling_20260306_1834.json
-rw-r--r--  1 root root   25252 Mar  7 03:42 gap_labeling_20260307_0342.json
-rw-r--r--  1 root root   25252 Mar 15 03:43 gap_labeling_20260315_0343.json
-rw-r--r--  1 root root    6315 Apr  7 06:40 hierarchy_data.json
-rw-r--r--  1 root root     517 May  4 07:41 incident_20260504_0721.md
-rw-r--r--  1 root root    2301 May  4 12:02 incident_20260504_1138.md
-rw-r--r--  1 root root    2938 Mar  5 08:52 insights_20260305_0852.json
-rw-r--r--  1 root root    2938 Mar  6 03:42 insights_20260306_0342.json
-rw-r--r--  1 root root    2938 Mar  6 18:34 insights_20260306_1834.json
-rw-r--r--  1 root root    2938 Mar  7 03:42 insights_20260307_0342.json
-rw-r--r--  1 root root    2938 Mar 15 03:46 insights_20260315_0346.json
-rw-r--r--  1 root root    2938 Mar 29 03:43 insights_20260329_0343.json
-rw-r--r--  1 root root    2938 Apr  1 03:46 insights_20260401_0346.json
-rw-r--r--  1 root root    2938 Apr  3 03:30 insights_20260403_0330.json
-rw-r--r--  1 root root    2938 Apr  5 07:29 insights_20260405_0729.json
-rw-r--r--  1 root root    5254 Mar  5 10:42 lagrangiana_20260305_1042.json
-rw-r--r--  1 root root    7664 Mar  5 10:48 lagrangiana_20260305_1048.json
lrwxrwxrwx  1 root root      22 May  5 03:33 latest.md -> agent_20260505_0330.md
-rw-r--r--  1 root root    9210 Apr 21 08:31 mapping_validation_2026-04-21.json
-rw-r--r--  1 root root    1499 Mar  5 11:11 next_exec_20260305_1111.json
-rw-r--r--  1 root root    1272 Mar  6 03:42 next_exec_20260306_0342.json
-rw-r--r--  1 root root    1446 Mar  6 18:34 next_exec_20260306_1834.json
-rw-r--r--  1 root root    1287 Mar  7 03:42 next_exec_20260307_0342.json
-rw-r--r--  1 root root    1203 Mar 14 03:42 next_exec_20260314_0342.json
-rw-r--r--  1 root root    1253 Mar 15 03:46 next_exec_20260315_0346.json
-rw-r--r--  1 root root    1168 Mar 26 03:43 next_exec_20260326_0343.json
-rw-r--r--  1 root root    1168 Mar 27 03:44 next_exec_20260327_0344.json
-rw-r--r--  1 root root    1168 Mar 28 03:44 next_exec_20260328_0344.json
-rw-r--r--  1 root root    1329 Mar 29 03:43 next_exec_20260329_0343.json
-rw-r--r--  1 root root     987 Mar 30 03:44 next_exec_20260330_0344.json
-rw-r--r--  1 root root     987 Mar 31 03:45 next_exec_20260331_0345.json
-rw-r--r--  1 root root    1362 Apr  1 03:46 next_exec_20260401_0346.json
-rw-r--r--  1 root root    1452 Apr  2 03:44 next_exec_20260402_0344.json
-rw-r--r--  1 root root    1207 Apr  3 03:30 next_exec_20260403_0330.json
-rw-r--r--  1 root root     423 Apr  4 03:30 next_exec_20260404_0330.json
-rw-r--r--  1 root root     368 Apr  5 03:30 next_exec_20260405_0330.json
-rw-r--r--  1 root root    1391 Apr  5 07:29 next_exec_20260405_0729.json
-rw-r--r--  1 root root    3805 Mar  6 09:02 phi_vs_silver_falsification_20260306.json
-rw-r--r--  1 root root    1806 Mar  2 03:41 report_20260302_0341.md
-rw-r--r--  1 root root    1775 Mar  3 03:41 report_20260303_0341.md
-rw-r--r--  1 root root    1791 Mar  4 03:42 report_20260304_0342.md
-rw-r--r--  1 root root    1775 Mar  5 03:42 report_20260305_0342.md
-rw-r--r--  1 root root    1791 Mar  5 21:21 report_20260305_2121.md
-rw-r--r--  1 root root    1776 Mar  6 03:41 report_20260306_0341.md
-rw-r--r--  1 root root    1791 Mar  7 03:42 report_20260307_0342.md
-rw-r--r--  1 root root    1790 Mar 14 03:42 report_20260314_0342.md
-rw-r--r--  1 root root    1789 Mar 15 03:42 report_20260315_0342.md
-rw-r--r--  1 root root    1743 Mar 15 08:01 report_20260315_0801.md
-rw-r--r--  1 root root    1765 Mar 26 03:43 report_20260326_0343.md
-rw-r--r--  1 root root    1763 Mar 27 03:44 report_20260327_0344.md
-rw-r--r--  1 root root    1779 Mar 28 03:44 report_20260328_0344.md
-rw-r--r--  1 root root    1677 Mar 29 03:43 report_20260329_0343.md
-rw-r--r--  1 root root    1514 Mar 30 03:44 report_20260330_0344.md
-rw-r--r--  1 root root    1656 Mar 31 03:45 report_20260331_0345.md
-rw-r--r--  1 root root    1671 Mar 31 18:09 report_20260331_1809.md
-rw-r--r--  1 root root    1663 Apr  1 03:46 report_20260401_0346.md
-rw-r--r--  1 root root    1656 Apr  2 03:44 report_20260402_0344.md
-rw-r--r--  1 root root    1656 Apr  2 07:56 report_20260402_0756.md
-rw-r--r--  1 root root    1656 Apr  3 03:30 report_20260403_0330.md
-rw-r--r--  1 root root    1656 Apr  4 03:30 report_20260404_0330.md
-rw-r--r--  1 root root    1656 Apr  4 18:52 report_20260404_1852.md
-rw-r--r--  1 root root    1656 Apr  5 03:30 report_20260405_0330.md
-rw-r--r--  1 root root    1656 Apr  5 07:15 report_20260405_0715.md
-rw-r--r--  1 root root    2593 Apr 21 15:11 tension_projection_screening_2026-04-21.json
-rw-r--r--  1 root root    1116 Mar  5 08:43 trace_map_20260305_0843.json
-rw-r--r--  1 root root    1186 Mar  5 08:44 trace_map_20260305_0844.json
-rw-r--r--  1 root root     246 May  5 04:30 watchdog.log
tools/dnd_arxiv.py
tools/alignment_marker.py
tools/read_video_feed.py
tools/dnd_riemann.py
tools/dnd_spettro.py
tools/exp_markov3_observable_hunt.py
tools/exp_acf_amplitude_scaling.py
tools/bicono_projection.py
tools/exp_mod3_vs_residual_ordering.py
tools/LAB_AGENT_CONTEXT.md
tools/r_ratio_decay.py
tools/dipartimento.py
tools/exp_boundary_gue_poisson.py
tools/plot_risultante.py
tools/dnd_bloch_explorer.py
tools/dnd_retriever.py
tools/dnd_zero_controllo.py
tools/dnd_zero_varieta_primi.py
tools/dnd_observer.py
tools/md_to_site_B.py
tools/GUIDA_CEC.md
tools/STRUMENTI.json
tools/exp_mod3_scaling.py
tools/exp_two_layer_universality.py
tools/dnd_curva.py
tools/exp_dipolar_vector_scaling.py
tools/GUIDA_EXPLORER_TM1.md
tools/md_to_site_F.py
tools/exp_crossover_universality.py
tools/validate_tension_mapping.py
tools/exp_markov_psd_prediction.py
tools/dnd_stats.py
tools/dnd_zero_controllo2.py
tools/exp_alpha_stability.py
tools/dnd_gap_resolution.py
tools/dnd_compatibility.py
tools/exp_two_channel_decomposition.py
tools/dnd_gue_test.py
tools/dnd_cycle_ratio.py
tools/exp_markov_layer_recovery_audit.py
tools/exp_markov_dipolar_decomposition.py
tools/diagram_nodi_paper_map.py
tools/MODUS_INDAGINE.md
tools/godel.py
tools/translate_tensions.py
tools/exp_two_channel_cross_domain.py
tools/generate_tensions_json.sh
tools/dnd_zero_traiettoria.py
tools/exp_beta_crossover.py
tools/build_lab_graph.py
tools/exp_geodesic_deviation_primes.py
tools/exp_psd_amplitude_scaling.py
tools/r_stat_primes.py
tools/exp_markov_scale_function.py
tools/dnd_md2latex.py
tools/dnd.py
tools/lab_valutatore.py
tools/exp_markov_k_direction.py
tools/add_video_to_feed.py
tools/LAB_OPERATIVO.md
tools/zeta_validation.py
tools/exp_meta_tautology_test.py
tools/exp_two_channel_boundary.py
tools/dnd_paper_audit.py
tools/lab_autopsy.py
tools/confine_spessore.py
tools/dnd_trace_bridge.py
tools/dnd_autoricerca.py
tools/dnd_torre.py
tools/exp_magnitude_psd_from_acf.py
tools/dnd_zero_operator.py
tools/dnd_scenario.py
tools/m_spectro.py
tools/diagram_paper_dependencies.py
tools/README.md
tools/exp_dR_brody_connection.py
tools/exp_ricci_primes.py
tools/rules/axioms_to_theorems.json
tools/exp_selective_layer_decoupling.py
tools/harvest_aimorning.py
tools/exp_cross_domain_dipolar_direction.py
tools/exp_acf_z6z_mechanism.py
tools/exp_observable_rank_audit.py
tools/exp_modular_algebra_depth.py
tools/gap_ratio_primes.py
tools/test_gue_poisson_boundary.py
tools/dnd_spirale.py
tools/awareness.json
tools/dnd_lab.py
tools/dnd_zero_notturno.py
tools/dnd_md2web.py
tools/GUIDA_DOMANDATORE.md
tools/dnd_lab_team.py
tools/md_to_site.py
tools/exp_markov_memory_by_gue_type.py
tools/exp_crossover_phase_test.py
tools/diagram_double_well.py
tools/paper_H_verify.py
tools/exp_brody_crossover.py
tools/gue_gap_test.py
tools/exp_poisson_convergence.py
tools/exp_two_channel_universality.py
tools/exp_brody_flow.py
tools/harvest_moodnd.py
tools/lab_affinatore.py
tools/GUIDA_GODEL_TM1.md
tools/riemann_R.py
tools/md_to_site_D.py
tools/spectral_gap_analysis.py
tools/dnd_lab_vivo.py
tools/dnd_zero_varieta.py
tools/exp_boundary_coherence.py
tools/dnd_projective_quantization.py
tools/exp_two_channel_shuffle_audit.py
tools/dnd_publish_cycle.py
tools/dnd_incrocio.py
tools/dnd_normalizer.py
tools/cron_dipartimento.sh
tools/exp_psd_prime_gaps.py
tools/exp_cross_observable_consistency.py
tools/dnd_domandatore.py
tools/structural_check.py
tools/dnd_M_operator.py
tools/dnd_piano11.py
tools/lab_agent.sh
tools/dnd_condizioni.py
tools/exp_desitter_unification.py
tools/dnd_loop.py
tools/dnd_cycle.py
tools/notte_sinapsi.sh
tools/exp_two_channel_psd.py
tools/exp_coherence_robustness.py
tools/dnd_trasmutazione.py
tools/costo_materializzazione.py
tools/exp_coherence_length.py
tools/dnd_next.py
tools/dnd_dipolo_lab.py
tools/dnd_rottura.py
tools/exp_spectral_rigidity.py
tools/dnd_zeros_vs_zeta.py
tools/md_to_site_A.py
tools/dnd_occhio.py
tools/exp_boundary_shuffle_audit.py
tools/PROTOCOLLO_ZETA.md
tools/exp_dipolar_angle_reference.py
tools/exp_mobius_irrationality.py
tools/exp_number_variance.py
tools/build_agent_field.py
tools/semantic_bridge.py
tools/dnd_trace_bridge_v3.py
tools/test_cron_exact.sh
tools/dnd_two_faces.py
tools/dnd_spectral_probe.py
tools/dnd_quantization.py
tools/dnd_indeterminazione.py
tools/dnd_implications.py
tools/dnd_spettro_zeta.py
tools/md_to_site_E.py
tools/lab_boot.sh
tools/exp_3d_boundary_layers.py

codex
Il campo punta a META/BOUNDARY: gli ultimi run hanno compattato molte osservabili in una coordinata latente, quindi il varco utile è verificare se quel collasso dipende dal tipo di distruzione dell'ordine o se è un artefatto del partial-shuffle già usato. Eseguo la proiezione obbligatoria e controllo gli strumenti esistenti per non duplicare esperimenti recenti.
exec
/bin/bash -lc "sed -n '1,220p' tools/exp_observable_rank_audit.py" in /opt/MM_D-ND
 succeeded in 0ms:
#!/usr/bin/env python3
"""
exp_observable_rank_audit.py - META audit for observable redundancy.

Recent runs found many Markov/crossover observables that react coherently under
partial shuffle. This script asks whether those observables carry independent
directions or mostly re-measure one latent boundary coordinate.

It measures retention curves from alpha-partial shuffles, then reports:
  - original-vs-full-shuffle z for each observable
  - PCA energy of the retention matrix across alpha
  - effective rank of that matrix
  - pairwise correlations between retention curves

The script measures data only. The report decides the structural claim.
"""

import argparse
import json
from pathlib import Path

import numpy as np

from exp_3d_boundary_layers import get_primes, gue_gaps, partial_shuffle


def obs_spacing_ratio(gaps):
    r = np.minimum(gaps[:-1], gaps[1:]) / np.maximum(gaps[:-1], gaps[1:])
    r = r[np.isfinite(r)]
    return float(np.mean(r)) if len(r) else 0.0


def obs_lag_acf(gaps, lag):
    g = gaps - np.mean(gaps)
    c0 = np.mean(g * g)
    if c0 == 0:
        return 0.0
    return float(np.mean(g[:-lag] * g[lag:]) / c0)


def obs_sr2(gaps):
    r = np.minimum(gaps[:-2], gaps[2:]) / np.maximum(gaps[:-2], gaps[2:])
    r = r[np.isfinite(r)]
    return float(np.mean(r)) if len(r) else 0.0


def obs_triple_var(gaps):
    triples = gaps[:-2] + gaps[1:-1] + gaps[2:]
    v = np.var(gaps)
    if v == 0:
        return 0.0
    return float(np.var(triples) / v)


OBSERVABLES = {
    "SR": obs_spacing_ratio,
    "L1": lambda gaps: obs_lag_acf(gaps, 1),
    "L2": lambda gaps: obs_lag_acf(gaps, 2),
    "SR2": obs_sr2,
    "triple_var": obs_triple_var,
}


def measure(gaps):
    return {name: fn(gaps) for name, fn in OBSERVABLES.items()}


def full_shuffle_baseline(gaps, n_trials, rng):
    vals = {name: [] for name in OBSERVABLES}
    for _ in range(n_trials):
        s = rng.permutation(gaps)
        row = measure(s)
        for name, value in row.items():
            vals[name].append(value)
    return {
        name: {
            "mean": float(np.mean(x)),
            "std": float(np.std(x, ddof=1)) if len(x) > 1 else 0.0,
        }
        for name, x in vals.items()
    }


def retention_curves(gaps, alphas, n_trials, originals, baseline, rng):
    rows = []
    for alpha in alphas:
        vals = {name: [] for name in OBSERVABLES}
        for _ in range(n_trials):
            s = partial_shuffle(gaps, float(alpha), rng)
            row = measure(s)
            for name, value in row.items():
                vals[name].append(value)

        out = {"alpha": float(alpha)}
        for name in OBSERVABLES:
            mean = float(np.mean(vals[name]))
            denom = originals[name] - baseline[name]["mean"]
            retention = (mean - baseline[name]["mean"]) / denom if abs(denom) > 1e-12 else 0.0
            out[name] = {
                "mean": mean,
                "std": float(np.std(vals[name], ddof=1)) if len(vals[name]) > 1 else 0.0,
                "retention": float(retention),
            }
        rows.append(out)
    return rows


def pca_summary(rows):
    names = list(OBSERVABLES)
    matrix = np.array([[row[name]["retention"] for name in names] for row in rows], dtype=float)
    matrix = matrix - np.mean(matrix, axis=0, keepdims=True)

    _, singular, vt = np.linalg.svd(matrix, full_matrices=False)
    energy = singular * singular
    if np.sum(energy) <= 1e-15:
        explained = np.zeros_like(energy)
        effective_rank = 0.0
    else:
        explained = energy / np.sum(energy)
        positive = explained[explained > 1e-15]
        effective_rank = float(np.exp(-np.sum(positive * np.log(positive))))

    corr = np.corrcoef(matrix, rowvar=False)
    abs_corr = np.abs(corr)
    upper = abs_corr[np.triu_indices_from(abs_corr, k=1)]

    return {
        "observables": names,
        "singular_values": [float(x) for x in singular],
        "explained_variance": [float(x) for x in explained],
        "effective_rank": effective_rank,
        "pc1_loadings": {name: float(vt[0, i]) for i, name in enumerate(names)} if len(vt) else {},
        "mean_abs_pairwise_corr": float(np.mean(upper)) if len(upper) else 0.0,
        "min_abs_pairwise_corr": float(np.min(upper)) if len(upper) else 0.0,
        "max_abs_pairwise_corr": float(np.max(upper)) if len(upper) else 0.0,
    }


def analyze_sequence(name, gaps, alphas, n_trials, n_baseline, rng):
    originals = measure(gaps)
    baseline = full_shuffle_baseline(gaps, n_baseline, rng)
    rows = retention_curves(gaps, alphas, n_trials, originals, baseline, rng)

    z = {}
    for obs_name in OBSERVABLES:
        std = baseline[obs_name]["std"]
        z[obs_name] = float((originals[obs_name] - baseline[obs_name]["mean"]) / std) if std > 1e-12 else 0.0

    return {
        "n_gaps": int(len(gaps)),
        "originals": originals,
        "full_shuffle_baseline": baseline,
        "original_vs_shuffle_z": z,
        "retention_curves": rows,
        "pca": pca_summary(rows),
    }


def build_sequences(n_gaps, rng):
    primes = get_primes(n_gaps * 24)[: n_gaps + 1]
    prime_gaps = np.diff(primes).astype(float)

    gue = gue_gaps(160, max(8, n_gaps // 160 + 1), rng).astype(float)
    gue = gue[:n_gaps]

    poisson = rng.exponential(1.0, size=n_gaps).astype(float)
    return {
        "primes": prime_gaps,
        "gue": gue,
        "poisson": poisson,
    }


def run(n_gaps=30000, n_alpha=19, n_trials=24, n_baseline=72, seed=20260505):
    rng = np.random.default_rng(seed)
    alphas = np.linspace(0.05, 0.95, n_alpha)
    sequences = build_sequences(n_gaps, rng)

    output = {
        "experiment": "observable_rank_audit",
        "question": "Do crossover observables contain independent directions or one latent boundary coordinate?",
        "params": {
            "n_gaps": int(n_gaps),
            "n_alpha": int(n_alpha),
            "n_trials": int(n_trials),
            "n_baseline": int(n_baseline),
            "seed": int(seed),
        },
        "sequences": {},
    }

    print(f"n_gaps={n_gaps}, n_alpha={n_alpha}, n_trials={n_trials}, n_baseline={n_baseline}, seed={seed}")
    print(f"{'sequence':<10} {'pc1':>8} {'eff_rank':>9} {'mean|corr|':>11}  z(SR,L1,L2,SR2,triple)")
    print("-" * 92)
    for seq_name, gaps in sequences.items():
        result = analyze_sequence(seq_name, gaps, alphas, n_trials, n_baseline, rng)
        output["sequences"][seq_name] = result
        pca = result["pca"]
        z = result["original_vs_shuffle_z"]
        z_text = ", ".join(f"{obs}={z[obs]:+.1f}" for obs in OBSERVABLES)
        pc1 = pca["explained_variance"][0] if pca["explained_variance"] else 0.0
        print(f"{seq_name:<10} {pc1:>8.3f} {pca['effective_rank']:>9.3f} {pca['mean_abs_pairwise_corr']:>11.3f}  {z_text}")

    out_path = Path("tools/data/observable_rank_audit.json")
    with out_path.open("w") as f:
        json.dump(output, f, indent=2)
    print(f"\nSaved to {out_path}")
    return output


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--n_gaps", type=int, default=30000)
    parser.add_argument("--n_alpha", type=int, default=19)
    parser.add_argument("--n_trials", type=int, default=24)
    parser.add_argument("--n_baseline", type=int, default=72)
    parser.add_argument("--seed", type=int, default=20260505)
    args = parser.parse_args()
    run(
        n_gaps=args.n_gaps,

exec
/bin/bash -lc "sed -n '1,240p' tools/exp_meta_tautology_test.py" in /opt/MM_D-ND
 succeeded in 0ms:
#!/usr/bin/env python3
"""META Tautology Discriminator — which observables measure real structure vs density artifacts?

Four observables x three synthetic controls. Each observable gets a verdict:
STRUCTURAL (distinguishes primes from all synthetics) or TAUTOLOGICAL (fails on at least one).

Observables:
  1. r-statistic (spacing ratio) — short-range repulsion
  2. Mod-3 ordering fraction — the algebraic memory channel
  3. Lag-1 autocorrelation — sequential gap correlation
  4. Two-channel delta-r — magnitude vs ordering decomposition

Controls:
  A. Shuffled gaps — same distribution, destroyed order
  B. Cramer model — PNT density, independent exponential gaps
  C. Hardy-Littlewood model — correct pair correlations, no higher-order structure
"""

import argparse
import json
import numpy as np
from sympy import primerange


def get_primes(n_max):
    return np.array(list(primerange(2, n_max + 1)), dtype=np.int64)


def r_statistic(gaps):
    """Mean spacing ratio min(s_i, s_{i+1}) / max(s_i, s_{i+1})."""
    s1 = gaps[:-1]
    s2 = gaps[1:]
    mn = np.minimum(s1, s2)
    mx = np.maximum(s1, s2)
    mask = mx > 0
    return np.mean(mn[mask] / mx[mask])


def mod3_ordering_fraction(gaps):
    """Fraction of consecutive gap pairs where mod-3 class is preserved."""
    classes = gaps % 3
    same = np.sum(classes[:-1] == classes[1:])
    return same / len(classes[:-1])


def lag1_autocorrelation(gaps):
    """Pearson autocorrelation at lag 1."""
    g = gaps.astype(np.float64)
    g = g - g.mean()
    if g.std() == 0:
        return 0.0
    return np.corrcoef(g[:-1], g[1:])[0, 1]


def two_channel_delta_r(gaps):
    """Decompose into magnitude and ordering channels, return delta-r for each."""
    g = gaps.astype(np.float64)
    median_g = np.median(g)
    binary = (g > median_g).astype(np.float64)  # ordering channel
    magnitude = np.abs(g - median_g)              # magnitude channel

    r_ord = r_statistic_from_signal(binary)
    r_mag = r_statistic_from_signal(magnitude)

    # Shuffle baseline
    rng = np.random.default_rng(42)
    r_ord_shuf = []
    r_mag_shuf = []
    for _ in range(20):
        idx = rng.permutation(len(gaps))
        b_s = binary[idx]
        m_s = magnitude[idx]
        r_ord_shuf.append(r_statistic_from_signal(b_s))
        r_mag_shuf.append(r_statistic_from_signal(m_s))

    dr_ord = (r_ord - np.mean(r_ord_shuf)) / (np.std(r_ord_shuf) + 1e-12)
    dr_mag = (r_mag - np.mean(r_mag_shuf)) / (np.std(r_mag_shuf) + 1e-12)
    return dr_ord, dr_mag


def r_statistic_from_signal(sig):
    """r-statistic on arbitrary positive signal (add offset if needed)."""
    s = sig - sig.min() + 1e-6
    s1 = s[:-1]
    s2 = s[1:]
    mn = np.minimum(s1, s2)
    mx = np.maximum(s1, s2)
    mask = mx > 0
    return np.mean(mn[mask] / mx[mask])


# === Synthetic generators ===

def shuffled_gaps(gaps, rng):
    """Same gap distribution, destroyed sequential order."""
    g = gaps.copy()
    rng.shuffle(g)
    return g


def cramer_random_gaps(n_gaps, mean_gap, rng):
    """Independent exponential gaps rounded to even (like PNT density)."""
    raw = rng.exponential(mean_gap, size=n_gaps)
    g = np.round(raw / 2) * 2
    g = np.maximum(g, 2).astype(np.int64)
    return g


def hardy_littlewood_gaps(gaps_real, rng):
    """Markov(1) model matching lag-1 autocorrelation of real primes.
    Preserves pair correlation structure but not higher-order."""
    g = gaps_real.astype(np.float64)
    mean_g = g.mean()
    std_g = g.std()
    rho = np.corrcoef(g[:-1], g[1:])[0, 1]

    # AR(1) process with correct mean, std, lag-1
    n = len(gaps_real)
    result = np.zeros(n)
    result[0] = mean_g
    noise_std = std_g * np.sqrt(1 - rho**2)
    for i in range(1, n):
        result[i] = mean_g + rho * (result[i-1] - mean_g) + rng.normal(0, noise_std)

    # Round to even, clip to >= 2
    result = np.round(result / 2) * 2
    result = np.maximum(result, 2).astype(np.int64)
    return result


def run(n_primes_max=600000, n_trials=20):
    """Run the META tautology test."""
    print(f"Generating primes up to {n_primes_max}...")
    primes = get_primes(n_primes_max)
    gaps = np.diff(primes)

    # Use a window in the middle to avoid small-prime effects
    N = min(len(gaps), 50000)
    start = len(gaps) // 4
    gaps_window = gaps[start:start + N]
    mean_gap = float(gaps_window.mean())

    print(f"Using {N} gaps starting at index {start} (mean gap = {mean_gap:.2f})")

    # Real primes observables
    print("\n=== REAL PRIMES ===")
    real_r = r_statistic(gaps_window)
    real_mod3 = mod3_ordering_fraction(gaps_window)
    real_lag1 = lag1_autocorrelation(gaps_window)
    real_dr_ord, real_dr_mag = two_channel_delta_r(gaps_window)
    print(f"  r-stat:     {real_r:.6f}")
    print(f"  mod3-frac:  {real_mod3:.6f}")
    print(f"  lag1-acf:   {real_lag1:.6f}")
    print(f"  dr-ord:     {real_dr_ord:.2f}σ")
    print(f"  dr-mag:     {real_dr_mag:.2f}σ")

    # Run synthetics
    rng = np.random.default_rng(2026)

    results = {
        'real': {
            'r_stat': real_r, 'mod3': real_mod3, 'lag1': real_lag1,
            'dr_ord': real_dr_ord, 'dr_mag': real_dr_mag
        }
    }

    for name, generator in [
        ('shuffled', lambda rng_: shuffled_gaps(gaps_window, rng_)),
        ('cramer', lambda rng_: cramer_random_gaps(N, mean_gap, rng_)),
        ('HL_markov', lambda rng_: hardy_littlewood_gaps(gaps_window, rng_)),
    ]:
        print(f"\n=== {name.upper()} (n_trials={n_trials}) ===")
        obs = {'r_stat': [], 'mod3': [], 'lag1': [], 'dr_ord': [], 'dr_mag': []}

        for t in range(n_trials):
            trial_rng = np.random.default_rng(rng.integers(0, 2**31))
            syn_gaps = generator(trial_rng)
            obs['r_stat'].append(r_statistic(syn_gaps))
            obs['mod3'].append(mod3_ordering_fraction(syn_gaps))
            obs['lag1'].append(lag1_autocorrelation(syn_gaps))
            dr_o, dr_m = two_channel_delta_r(syn_gaps)
            obs['dr_ord'].append(dr_o)
            obs['dr_mag'].append(dr_m)

        results[name] = {}
        for key in obs:
            arr = np.array(obs[key])
            results[name][key] = {
                'mean': float(np.mean(arr)),
                'std': float(np.std(arr)),
                'min': float(np.min(arr)),
                'max': float(np.max(arr))
            }
            print(f"  {key:12s}: {np.mean(arr):+.6f} ± {np.std(arr):.6f}")

    # === Discrimination verdict ===
    print("\n" + "=" * 60)
    print("DISCRIMINATION VERDICTS")
    print("=" * 60)

    verdicts = {}
    for obs_name in ['r_stat', 'mod3', 'lag1', 'dr_ord', 'dr_mag']:
        real_val = results['real'][obs_name]
        discriminates = {}
        for syn_name in ['shuffled', 'cramer', 'HL_markov']:
            syn = results[syn_name][obs_name]
            z = (real_val - syn['mean']) / (syn['std'] + 1e-12)
            discriminates[syn_name] = abs(z)
            label = "YES" if abs(z) > 3.0 else "no"
            print(f"  {obs_name:12s} vs {syn_name:12s}: z = {z:+8.2f}  [{label}]")

        all_pass = all(v > 3.0 for v in discriminates.values())
        verdict = "STRUCTURAL" if all_pass else "TAUTOLOGICAL"
        verdicts[obs_name] = {
            'verdict': verdict,
            'z_scores': {k: float(v) for k, v in discriminates.items()}
        }
        print(f"  → {obs_name}: {verdict}")
        print()

    # Save results
    output = {
        'n_gaps': N,
        'start_index': start,
        'mean_gap': mean_gap,
        'n_trials': n_trials,
        'real': results['real'],
        'synthetics': {k: results[k] for k in ['shuffled', 'cramer', 'HL_markov']},
        'verdicts': verdicts
    }
    out_path = 'tools/data/meta_tautology_test.json'
    with open(out_path, 'w') as f:
        json.dump(output, f, indent=2)
    print(f"\nResults saved to {out_path}")

    return output


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='META Tautology Discriminator')

exec
/bin/bash -lc "sed -n '1,260p' tools/exp_selective_layer_decoupling.py" in /opt/MM_D-ND
 succeeded in 0ms:
#!/usr/bin/env python3
"""
exp_selective_layer_decoupling.py — Can selective perturbations decouple the two Markov layers?

Consecutio from BOUNDARY (piano 60h): The two Markov layers (pairs->SR,L1; triples->SR2,L2)
are coupled at the uniform-shuffle boundary (same critical alpha=0.334). But Mk1 surrogates
capture Layer 1 while destroying Layer 2. Contradiction?

Hypothesis: The coupling is an artifact of UNIFORM shuffle symmetry — not structural coupling.
Uniform shuffle attacks all correlations at the same rate. Selective perturbation should decouple.

Method:
  For 3 perturbation types x 15 alpha levels x 30 surrogates:
  1. UNIFORM: replace position i with random draw from distribution, prob=alpha
  2. Mk1-SELECTIVE: replace position i with Mk1 surrogate value, prob=alpha
     (preserves pair statistics at alpha=1, destroys triple+)
  3. Mk2-SELECTIVE: replace position i with Mk2 surrogate value, prob=alpha
     (preserves triple statistics at alpha=1)

  Measure 6 observables at each alpha, compute z-scores vs original.
  Find critical alpha_c where each observable crosses |z|=2.

Prediction if independent:
  - Uniform: both layers break at same alpha_c (already known)
  - Mk1-selective: Layer 1 never breaks, Layer 2 breaks at some alpha_c
  - Mk2-selective: neither layer breaks
Prediction if coupled:
  - All perturbation types break both layers together

Usage:
    python tools/exp_selective_layer_decoupling.py [--N 100000] [--n_surr 30]
"""

import argparse
import json
import numpy as np
from pathlib import Path
from collections import Counter


def get_primes(n_max):
    sieve = np.ones(n_max + 1, dtype=bool)
    sieve[0] = sieve[1] = False
    for i in range(2, int(n_max**0.5) + 1):
        if sieve[i]:
            sieve[i*i::i] = False
    return np.where(sieve)[0]


def gen_prime_gaps(N):
    primes = get_primes(int(N * 15))[:N + 1]
    return np.diff(primes).astype(float)


def gen_gue_spacings(N, rng):
    dim = min(int(np.sqrt(2 * N)) + 50, 1500)
    H = rng.standard_normal((dim, dim))
    H = (H + H.T) / 2
    eigs = np.sort(np.linalg.eigvalsh(H))
    spacings = np.diff(eigs)
    spacings = spacings[spacings > 0]
    spacings = spacings / np.mean(spacings)
    return spacings[:N] if len(spacings) > N else spacings


def gen_poisson_spacings(N, rng):
    return rng.exponential(1.0, N)


# --- Markov surrogate generation ---
def build_markov_chain(gaps, order, n_bins=12):
    percentiles = np.linspace(0, 100, n_bins + 1)
    edges = np.percentile(gaps, percentiles)
    edges[0] = gaps.min() - 0.5
    edges[-1] = gaps.max() + 0.5
    binned = np.digitize(gaps, edges) - 1
    binned = np.clip(binned, 0, n_bins - 1)
    gap_pools = {}
    for b, g in zip(binned, gaps):
        gap_pools.setdefault(b, []).append(g)
    trans = {}
    for i in range(len(binned) - order):
        state = tuple(binned[i:i + order])
        nxt = binned[i + order]
        if state not in trans:
            trans[state] = Counter()
        trans[state][nxt] += 1
    trans_prob = {}
    for state, counts in trans.items():
        total = sum(counts.values())
        trans_prob[state] = {k: v / total for k, v in counts.items()}
    return binned, edges, gap_pools, trans_prob


def generate_markov_surrogate(gaps, order, n_bins=12, rng=None):
    if rng is None:
        rng = np.random.default_rng()
    binned, edges, gap_pools, trans_prob = build_markov_chain(gaps, order, n_bins)
    n = len(gaps)
    result = np.zeros(n)
    start_idx = rng.integers(0, len(binned) - order)
    state = tuple(binned[start_idx:start_idx + order])
    for j in range(order):
        pool = gap_pools[state[j]]
        result[j] = pool[rng.integers(0, len(pool))]
    for i in range(order, n):
        if state in trans_prob:
            probs = trans_prob[state]
            bins_avail = list(probs.keys())
            p = np.array([probs[b] for b in bins_avail])
            nxt_bin = bins_avail[rng.choice(len(bins_avail), p=p)]
        else:
            nxt_bin = rng.integers(0, n_bins)
        pool = gap_pools.get(nxt_bin, gap_pools[list(gap_pools.keys())[0]])
        result[i] = pool[rng.integers(0, len(pool))]
        state = (*state[1:], nxt_bin)
    return result


def partial_perturbation(original, surrogate, alpha, rng):
    """Position-wise interpolation: replace original[i] with surrogate[i] with probability alpha."""
    n = len(original)
    mask = rng.random(n) < alpha
    result = original.copy()
    result[mask] = surrogate[mask]
    return result


# --- Observables ---
def spacing_ratio(gaps):
    s, s1 = gaps[:-1], gaps[1:]
    r = np.minimum(s, s1) / np.maximum(s, s1)
    return np.mean(r[np.isfinite(r)])


def lag_k_acf(gaps, k=1):
    g = gaps - np.mean(gaps)
    v = np.sum(g ** 2)
    if v < 1e-12:
        return 0.0
    n = len(g)
    return np.sum(g[:n - k] * g[k:]) / v


def next_nearest_sr(gaps):
    if len(gaps) < 3:
        return 0.5
    s, s2 = gaps[:-2], gaps[2:]
    r = np.minimum(s, s2) / np.maximum(s, s2)
    return np.mean(r[np.isfinite(r)])


def cond_entropy_l2(gaps, n_bins=12):
    if len(gaps) < 3:
        return 0.0
    pct = np.linspace(0, 100, n_bins + 1)
    edges = np.percentile(gaps, pct)
    edges[0] = gaps.min() - 0.5
    edges[-1] = gaps.max() + 0.5
    binned = np.clip(np.digitize(gaps, edges) - 1, 0, n_bins - 1)
    joint = Counter()
    cond = Counter()
    for i in range(len(binned) - 2):
        state = (binned[i], binned[i + 1])
        nxt = binned[i + 2]
        joint[(state, nxt)] += 1
        cond[state] += 1
    h = 0.0
    total = len(binned) - 2
    for (state, nxt), cnt in joint.items():
        p = cnt / cond[state]
        if p > 0:
            h -= (cnt / total) * np.log2(p)
    return h


def triple_var(gaps):
    if len(gaps) < 3:
        return 0.0
    t = gaps[:-2] + gaps[1:-1] + gaps[2:]
    return np.var(t)


OBSERVABLES = {
    'SR': spacing_ratio,
    'L1': lambda g: lag_k_acf(g, 1),
    'SR2': next_nearest_sr,
    'L2': lambda g: lag_k_acf(g, 2),
    'cond_entropy': cond_entropy_l2,
    'triple_var': triple_var,
}

LAYER1_OBS = ['SR', 'L1']
LAYER2_OBS = ['SR2', 'L2', 'cond_entropy', 'triple_var']


def measure_all(gaps):
    return {name: fn(gaps) for name, fn in OBSERVABLES.items()}


def find_critical_alpha(alpha_vals, z_vals, threshold=2.0):
    """Find alpha where |z| first exceeds threshold (linear interpolation)."""
    for i in range(len(alpha_vals)):
        if abs(z_vals[i]) >= threshold:
            if i == 0:
                return alpha_vals[0]
            z_prev, z_curr = abs(z_vals[i - 1]), abs(z_vals[i])
            a_prev, a_curr = alpha_vals[i - 1], alpha_vals[i]
            if z_curr - z_prev > 0:
                frac = (threshold - z_prev) / (z_curr - z_prev)
                return a_prev + frac * (a_curr - a_prev)
            return a_curr
    return float('inf')  # never crosses


def run_sweep(gaps, perturbation_type, alpha_vals, n_surr, rng):
    """Sweep alpha for one perturbation type. Returns z-scores per observable per alpha."""
    real_obs = measure_all(gaps)
    results = {name: [] for name in OBSERVABLES}

    for alpha in alpha_vals:
        surr_obs = {name: [] for name in OBSERVABLES}
        for _ in range(n_surr):
            if perturbation_type == 'uniform':
                shuffled = rng.permutation(gaps)
                perturbed = partial_perturbation(gaps, shuffled, alpha, rng)
            elif perturbation_type == 'Mk1':
                mk1_surr = generate_markov_surrogate(gaps, 1, rng=rng)
                perturbed = partial_perturbation(gaps, mk1_surr, alpha, rng)
            elif perturbation_type == 'Mk2':
                mk2_surr = generate_markov_surrogate(gaps, 2, rng=rng)
                perturbed = partial_perturbation(gaps, mk2_surr, alpha, rng)
            else:
                raise ValueError(f"Unknown perturbation: {perturbation_type}")

            obs = measure_all(perturbed)
            for name in OBSERVABLES:
                surr_obs[name].append(obs[name])

        for name in OBSERVABLES:
            vals = np.array(surr_obs[name])
            vals = vals[np.isfinite(vals)]
            if len(vals) > 2 and np.std(vals) > 1e-12:
                z = (real_obs[name] - np.mean(vals)) / np.std(vals)
            else:
                z = 0.0
            results[name].append(round(float(z), 2))

    return results, real_obs


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--N', type=int, default=100000)
    parser.add_argument('--n_surr', type=int, default=30)
    parser.add_argument('--seed', type=int, default=42)
    args = parser.parse_args()

    rng = np.random.default_rng(args.seed)
    alpha_vals = [0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]

exec
/bin/bash -lc 'python tools/dnd_scenario.py --best' in /opt/MM_D-ND
 succeeded in 170ms:
META: score=0.898  — META: incerto (i=0.5) — massimo potere discriminante
G_POTENZIALE_NULLA: score=0.703  — G_POTENZIALE_NULLA: legge di scala da raffinare
METRIC_TENSOR: score=0.624  — METRIC_TENSOR: legge di scala da raffinare

codex
Lo script `exp_selective_layer_decoupling.py` è già allineato alla consecutio ma non risulta tra gli ultimi tre report: testa proprio l'opposto del claim precedente, cioè se la coupling dei layer è reale o indotta dal tipo di perturbazione. Lo userò come esperimento principale, con perimetro ridotto ma sufficiente per avere risposta oggi.
exec
/bin/bash -lc 'python tools/exp_selective_layer_decoupling.py --N 60000 --n_surr 20 --seed 20260505' in /opt/MM_D-ND
codex
L'esperimento è in esecuzione. Intanto preparo il taglio interpretativo: il risultato utile non sarà “layer separati” in astratto, ma quale famiglia di perturbazioni preserva o distrugge quali osservabili, con il perimetro atomico dichiarato.
codex
Il run è ancora attivo; la parte costosa è la generazione dei surrogati Markov per più alpha. Attendo il completamento invece di interrompere, perché l'esito dipende dalla curva completa e non da un singolo punto.
codex
Sta durando più del previsto ma resta dentro il tipo di carico atteso per `N=60000`. Se finisce con output utile, userò direttamente i file dati prodotti dallo script; se non ne produce, leggerò la stampa finale e la cristallizzerò nel report.
codex
Il processo non ha ancora emesso output; è probabilmente dentro la prima sequenza completa. Per non perdere il turno, se supera ancora un intervallo senza completare aprirò un run più piccolo in parallelo solo se indipendente? Actually can't parallel with same file? Could start smaller while old running? We can but resource. Maybe wait.
codex
Il run pieno non sta dando ritorno in tempo utile. Lo interrompo e lo rilancio con campione più piccolo: resta un esperimento valido se il report dichiara esplicitamente il perimetro ridotto, e permette di osservare la direzione senza trasformare il ciclo in puro calcolo.
2026-05-05T10:27:39.476594Z ERROR codex_core::tools::router: error=write_stdin failed: stdin is closed for this session; rerun exec_command with tty=true to keep stdin open
exec
/bin/bash -lc "pgrep -af 'exp_selective_layer_decoupling.py'" in /opt/MM_D-ND
 succeeded in 0ms:
1 /root/.codex_lab/tmp/arg0/codex-arg0JQZgbn/codex-linux-sandbox --sandbox-policy-cwd /opt/MM_D-ND --command-cwd /opt/MM_D-ND --sandbox-policy {"type":"workspace-write","writable_roots":["/root/.codex_lab/memories"],"network_access":false,"exclude_tmpdir_env_var":false,"exclude_slash_tmp":false} --file-system-sandbox-policy {"kind":"restricted","entries":[{"path":{"type":"special","value":{"kind":"root"}},"access":"read"},{"path":{"type":"special","value":{"kind":"current_working_directory"}},"access":"write"},{"path":{"type":"special","value":{"kind":"slash_tmp"}},"access":"write"},{"path":{"type":"special","value":{"kind":"tmpdir"}},"access":"write"},{"path":{"type":"path","path":"/root/.codex_lab/memories"},"access":"write"},{"path":{"type":"path","path":"/opt/MM_D-ND/.git"},"access":"read"},{"path":{"type":"path","path":"/opt/MM_D-ND/.codex"},"access":"read"}]} --network-sandbox-policy "restricted" -- /bin/bash -c __CODEX_SNAPSHOT_OVERRIDE_SET_0="${CODEX_THREAD_ID+x}" __CODEX_SNAPSHOT_OVERRIDE_0="${CODEX_THREAD_ID-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_0="${ALL_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_0="${ALL_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_1="${BUNDLE_HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_1="${BUNDLE_HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_2="${BUNDLE_HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_2="${BUNDLE_HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_3="${BUNDLE_NO_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_3="${BUNDLE_NO_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_4="${CODEX_NETWORK_ALLOW_LOCAL_BINDING+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_4="${CODEX_NETWORK_ALLOW_LOCAL_BINDING-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_5="${CODEX_NETWORK_PROXY_ACTIVE+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_5="${CODEX_NETWORK_PROXY_ACTIVE-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_6="${DOCKER_HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_6="${DOCKER_HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_7="${DOCKER_HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_7="${DOCKER_HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_8="${ELECTRON_GET_USE_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_8="${ELECTRON_GET_USE_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_9="${FTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_9="${FTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_10="${HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_10="${HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_11="${HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_11="${HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_12="${NO_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_12="${NO_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_13="${NPM_CONFIG_HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_13="${NPM_CONFIG_HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_14="${NPM_CONFIG_HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_14="${NPM_CONFIG_HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_15="${NPM_CONFIG_NOPROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_15="${NPM_CONFIG_NOPROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_16="${NPM_CONFIG_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_16="${NPM_CONFIG_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_17="${PIP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_17="${PIP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_18="${WSS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_18="${WSS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_19="${WS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_19="${WS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_20="${YARN_HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_20="${YARN_HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_21="${YARN_HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_21="${YARN_HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_22="${YARN_NO_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_22="${YARN_NO_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_23="${all_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_23="${all_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_24="${ftp_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_24="${ftp_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_25="${http_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_25="${http_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_26="${https_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_26="${https_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_27="${no_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_27="${no_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_28="${npm_config_http_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_28="${npm_config_http_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_29="${npm_config_https_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_29="${npm_config_https_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_30="${npm_config_noproxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_30="${npm_config_noproxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_31="${npm_config_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_31="${npm_config_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_32="${ws_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_32="${ws_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_33="${wss_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_33="${wss_proxy-}" __CODEX_SNAPSHOT_PROXY_ENV_SET="${CODEX_NETWORK_PROXY_ACTIVE+x}"  if . '/root/.codex_lab/shell_snapshots/019df7a9-594b-7790-a403-985c2039fc7e.1777976564052581043.sh' >/dev/null 2>&1; then :; fi  if [ -n "${__CODEX_SNAPSHOT_OVERRIDE_SET_0}" ]; then export CODEX_THREAD_ID="${__CODEX_SNAPSHOT_OVERRIDE_0}"; else unset CODEX_THREAD_ID; fi if [ -n "$__CODEX_SNAPSHOT_PROXY_ENV_SET" ] || [ -n "${CODEX_NETWORK_PROXY_ACTIVE+x}" ]; then if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_0}" ]; then export ALL_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_0}"; else unset ALL_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_1}" ]; then export BUNDLE_HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_1}"; else unset BUNDLE_HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_2}" ]; then export BUNDLE_HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_2}"; else unset BUNDLE_HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_3}" ]; then export BUNDLE_NO_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_3}"; else unset BUNDLE_NO_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_4}" ]; then export CODEX_NETWORK_ALLOW_LOCAL_BINDING="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_4}"; else unset CODEX_NETWORK_ALLOW_LOCAL_BINDING; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_5}" ]; then export CODEX_NETWORK_PROXY_ACTIVE="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_5}"; else unset CODEX_NETWORK_PROXY_ACTIVE; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_6}" ]; then export DOCKER_HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_6}"; else unset DOCKER_HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_7}" ]; then export DOCKER_HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_7}"; else unset DOCKER_HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_8}" ]; then export ELECTRON_GET_USE_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_8}"; else unset ELECTRON_GET_USE_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_9}" ]; then export FTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_9}"; else unset FTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_10}" ]; then export HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_10}"; else unset HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_11}" ]; then export HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_11}"; else unset HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_12}" ]; then export NO_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_12}"; else unset NO_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_13}" ]; then export NPM_CONFIG_HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_13}"; else unset NPM_CONFIG_HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_14}" ]; then export NPM_CONFIG_HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_14}"; else unset NPM_CONFIG_HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_15}" ]; then export NPM_CONFIG_NOPROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_15}"; else unset NPM_CONFIG_NOPROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_16}" ]; then export NPM_CONFIG_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_16}"; else unset NPM_CONFIG_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_17}" ]; then export PIP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_17}"; else unset PIP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_18}" ]; then export WSS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_18}"; else unset WSS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_19}" ]; then export WS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_19}"; else unset WS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_20}" ]; then export YARN_HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_20}"; else unset YARN_HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_21}" ]; then export YARN_HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_21}"; else unset YARN_HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_22}" ]; then export YARN_NO_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_22}"; else unset YARN_NO_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_23}" ]; then export all_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_23}"; else unset all_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_24}" ]; then export ftp_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_24}"; else unset ftp_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_25}" ]; then export http_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_25}"; else unset http_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_26}" ]; then export https_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_26}"; else unset https_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_27}" ]; then export no_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_27}"; else unset no_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_28}" ]; then export npm_config_http_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_28}"; else unset npm_config_http_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_29}" ]; then export npm_config_https_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_29}"; else unset npm_config_https_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_30}" ]; then export npm_config_noproxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_30}"; else unset npm_config_noproxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_31}" ]; then export npm_config_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_31}"; else unset npm_config_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_32}" ]; then export ws_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_32}"; else unset ws_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_33}" ]; then export wss_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_33}"; else unset wss_proxy; fi fi  exec '/bin/bash' -c 'pgrep -af '"'"'exp_selective_layer_decoupling.py'"'"''

exec
/bin/bash -lc "ps -eo pid,ppid,stat,etime,cmd | rg 'python|exp_selective|47510'" in /opt/MM_D-ND
 succeeded in 0ms:
      1       0 Ss         00:00 /root/.codex_lab/tmp/arg0/codex-arg0JQZgbn/codex-linux-sandbox --sandbox-policy-cwd /opt/MM_D-ND --command-cwd /opt/MM_D-ND --sandbox-policy {"type":"workspace-write","writable_roots":["/root/.codex_lab/memories"],"network_access":false,"exclude_tmpdir_env_var":false,"exclude_slash_tmp":false} --file-system-sandbox-policy {"kind":"restricted","entries":[{"path":{"type":"special","value":{"kind":"root"}},"access":"read"},{"path":{"type":"special","value":{"kind":"current_working_directory"}},"access":"write"},{"path":{"type":"special","value":{"kind":"slash_tmp"}},"access":"write"},{"path":{"type":"special","value":{"kind":"tmpdir"}},"access":"write"},{"path":{"type":"path","path":"/root/.codex_lab/memories"},"access":"write"},{"path":{"type":"path","path":"/opt/MM_D-ND/.git"},"access":"read"},{"path":{"type":"path","path":"/opt/MM_D-ND/.codex"},"access":"read"}]} --network-sandbox-policy "restricted" -- /bin/bash -c __CODEX_SNAPSHOT_OVERRIDE_SET_0="${CODEX_THREAD_ID+x}" __CODEX_SNAPSHOT_OVERRIDE_0="${CODEX_THREAD_ID-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_0="${ALL_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_0="${ALL_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_1="${BUNDLE_HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_1="${BUNDLE_HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_2="${BUNDLE_HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_2="${BUNDLE_HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_3="${BUNDLE_NO_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_3="${BUNDLE_NO_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_4="${CODEX_NETWORK_ALLOW_LOCAL_BINDING+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_4="${CODEX_NETWORK_ALLOW_LOCAL_BINDING-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_5="${CODEX_NETWORK_PROXY_ACTIVE+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_5="${CODEX_NETWORK_PROXY_ACTIVE-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_6="${DOCKER_HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_6="${DOCKER_HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_7="${DOCKER_HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_7="${DOCKER_HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_8="${ELECTRON_GET_USE_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_8="${ELECTRON_GET_USE_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_9="${FTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_9="${FTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_10="${HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_10="${HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_11="${HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_11="${HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_12="${NO_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_12="${NO_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_13="${NPM_CONFIG_HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_13="${NPM_CONFIG_HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_14="${NPM_CONFIG_HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_14="${NPM_CONFIG_HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_15="${NPM_CONFIG_NOPROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_15="${NPM_CONFIG_NOPROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_16="${NPM_CONFIG_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_16="${NPM_CONFIG_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_17="${PIP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_17="${PIP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_18="${WSS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_18="${WSS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_19="${WS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_19="${WS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_20="${YARN_HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_20="${YARN_HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_21="${YARN_HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_21="${YARN_HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_22="${YARN_NO_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_22="${YARN_NO_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_23="${all_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_23="${all_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_24="${ftp_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_24="${ftp_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_25="${http_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_25="${http_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_26="${https_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_26="${https_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_27="${no_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_27="${no_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_28="${npm_config_http_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_28="${npm_config_http_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_29="${npm_config_https_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_29="${npm_config_https_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_30="${npm_config_noproxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_30="${npm_config_noproxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_31="${npm_config_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_31="${npm_config_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_32="${ws_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_32="${ws_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_33="${wss_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_33="${wss_proxy-}" __CODEX_SNAPSHOT_PROXY_ENV_SET="${CODEX_NETWORK_PROXY_ACTIVE+x}"  if . '/root/.codex_lab/shell_snapshots/019df7a9-594b-7790-a403-985c2039fc7e.1777976564052581043.sh' >/dev/null 2>&1; then :; fi  if [ -n "${__CODEX_SNAPSHOT_OVERRIDE_SET_0}" ]; then export CODEX_THREAD_ID="${__CODEX_SNAPSHOT_OVERRIDE_0}"; else unset CODEX_THREAD_ID; fi if [ -n "$__CODEX_SNAPSHOT_PROXY_ENV_SET" ] || [ -n "${CODEX_NETWORK_PROXY_ACTIVE+x}" ]; then if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_0}" ]; then export ALL_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_0}"; else unset ALL_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_1}" ]; then export BUNDLE_HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_1}"; else unset BUNDLE_HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_2}" ]; then export BUNDLE_HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_2}"; else unset BUNDLE_HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_3}" ]; then export BUNDLE_NO_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_3}"; else unset BUNDLE_NO_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_4}" ]; then export CODEX_NETWORK_ALLOW_LOCAL_BINDING="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_4}"; else unset CODEX_NETWORK_ALLOW_LOCAL_BINDING; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_5}" ]; then export CODEX_NETWORK_PROXY_ACTIVE="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_5}"; else unset CODEX_NETWORK_PROXY_ACTIVE; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_6}" ]; then export DOCKER_HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_6}"; else unset DOCKER_HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_7}" ]; then export DOCKER_HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_7}"; else unset DOCKER_HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_8}" ]; then export ELECTRON_GET_USE_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_8}"; else unset ELECTRON_GET_USE_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_9}" ]; then export FTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_9}"; else unset FTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_10}" ]; then export HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_10}"; else unset HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_11}" ]; then export HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_11}"; else unset HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_12}" ]; then export NO_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_12}"; else unset NO_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_13}" ]; then export NPM_CONFIG_HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_13}"; else unset NPM_CONFIG_HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_14}" ]; then export NPM_CONFIG_HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_14}"; else unset NPM_CONFIG_HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_15}" ]; then export NPM_CONFIG_NOPROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_15}"; else unset NPM_CONFIG_NOPROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_16}" ]; then export NPM_CONFIG_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_16}"; else unset NPM_CONFIG_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_17}" ]; then export PIP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_17}"; else unset PIP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_18}" ]; then export WSS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_18}"; else unset WSS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_19}" ]; then export WS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_19}"; else unset WS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_20}" ]; then export YARN_HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_20}"; else unset YARN_HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_21}" ]; then export YARN_HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_21}"; else unset YARN_HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_22}" ]; then export YARN_NO_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_22}"; else unset YARN_NO_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_23}" ]; then export all_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_23}"; else unset all_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_24}" ]; then export ftp_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_24}"; else unset ftp_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_25}" ]; then export http_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_25}"; else unset http_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_26}" ]; then export https_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_26}"; else unset https_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_27}" ]; then export no_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_27}"; else unset no_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_28}" ]; then export npm_config_http_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_28}"; else unset npm_config_http_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_29}" ]; then export npm_config_https_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_29}"; else unset npm_config_https_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_30}" ]; then export npm_config_noproxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_30}"; else unset npm_config_noproxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_31}" ]; then export npm_config_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_31}"; else unset npm_config_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_32}" ]; then export ws_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_32}"; else unset ws_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_33}" ]; then export wss_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_33}"; else unset wss_proxy; fi fi  exec '/bin/bash' -c 'ps -eo pid,ppid,stat,etime,cmd | rg '"'"'python|exp_selective|47510'"'"''
      2       1 S          00:00 /bin/bash -c ps -eo pid,ppid,stat,etime,cmd | rg 'python|exp_selective|47510'
      4       2 S          00:00 rg python|exp_selective|47510

exec
/bin/bash -lc 'python tools/exp_selective_layer_decoupling.py --N 8000 --n_surr 8 --seed 20260505' in /opt/MM_D-ND
codex
Anche il campione ridotto stampa solo a fine run, quindi l'assenza di output non indica fallimento. Lascio procedere ancora: il carico stimato ora è molto più piccolo e dovrebbe chiudere.
 succeeded in 61913ms:

============================================================
  primes (N=8000)
============================================================

--- uniform perturbation ---
              SR (L1): alpha_c=0.022
              L1 (L1): alpha_c=0.086
             SR2 (L2): alpha_c=0.584
              L2 (L2): alpha_c=0.335
    cond_entropy (L2): alpha_c=0.006
      triple_var (L2): alpha_c=0.193

--- Mk1 perturbation ---
              SR (L1): alpha_c=0.047
              L1 (L1): alpha_c=0.034
             SR2 (L2): alpha_c=0.466
              L2 (L2): alpha_c=0.296
    cond_entropy (L2): alpha_c=0.008
      triple_var (L2): alpha_c=0.083

--- Mk2 perturbation ---
              SR (L1): alpha_c=0.052
              L1 (L1): alpha_c=0.077
             SR2 (L2): NEVER_BREAKS
              L2 (L2): NEVER_BREAKS
    cond_entropy (L2): alpha_c=0.006
      triple_var (L2): alpha_c=0.087

--- SUMMARY: primes ---
Observable     Layer     uniform        Mk1        Mk2
-------------------------------------------------------
SR             L1          0.022      0.047      0.052
L1             L1          0.086      0.034      0.077
SR2            L2          0.584      0.466      NEVER
L2             L2          0.335      0.296      NEVER
cond_entropy   L2          0.006      0.008      0.006
triple_var     L2          0.193      0.083      0.087

============================================================
  GUE (N=175)
============================================================

--- uniform perturbation ---
              SR (L1): NEVER_BREAKS
              L1 (L1): alpha_c=0.399
             SR2 (L2): alpha_c=0.947
              L2 (L2): alpha_c=0.337
    cond_entropy (L2): NEVER_BREAKS
      triple_var (L2): NEVER_BREAKS

--- Mk1 perturbation ---
              SR (L1): NEVER_BREAKS
              L1 (L1): NEVER_BREAKS
             SR2 (L2): NEVER_BREAKS
              L2 (L2): alpha_c=0.260
    cond_entropy (L2): alpha_c=0.188
      triple_var (L2): NEVER_BREAKS

--- Mk2 perturbation ---
              SR (L1): NEVER_BREAKS
              L1 (L1): NEVER_BREAKS
             SR2 (L2): NEVER_BREAKS
              L2 (L2): alpha_c=0.313
    cond_entropy (L2): alpha_c=0.662
      triple_var (L2): alpha_c=0.350

--- SUMMARY: GUE ---
Observable     Layer     uniform        Mk1        Mk2
-------------------------------------------------------
SR             L1          NEVER      NEVER      NEVER
L1             L1          0.399      NEVER      NEVER
SR2            L2          0.947      NEVER      NEVER
L2             L2          0.337      0.260      0.313
cond_entropy   L2          NEVER      0.188      0.662
triple_var     L2          NEVER      NEVER      0.350

============================================================
  Poisson (N=8000)
============================================================

--- uniform perturbation ---
              SR (L1): NEVER_BREAKS
              L1 (L1): NEVER_BREAKS
             SR2 (L2): NEVER_BREAKS
              L2 (L2): alpha_c=0.591
    cond_entropy (L2): NEVER_BREAKS
      triple_var (L2): NEVER_BREAKS

--- Mk1 perturbation ---
              SR (L1): NEVER_BREAKS
              L1 (L1): alpha_c=0.577
             SR2 (L2): NEVER_BREAKS
              L2 (L2): alpha_c=0.679
    cond_entropy (L2): NEVER_BREAKS
      triple_var (L2): NEVER_BREAKS

--- Mk2 perturbation ---
              SR (L1): NEVER_BREAKS
              L1 (L1): NEVER_BREAKS
             SR2 (L2): NEVER_BREAKS
              L2 (L2): NEVER_BREAKS
    cond_entropy (L2): alpha_c=0.397
      triple_var (L2): NEVER_BREAKS

--- SUMMARY: Poisson ---
Observable     Layer     uniform        Mk1        Mk2
-------------------------------------------------------
SR             L1          NEVER      NEVER      NEVER
L1             L1          NEVER      0.577      NEVER
SR2            L2          NEVER      NEVER      NEVER
L2             L2          0.591      0.679      NEVER
cond_entropy   L2          NEVER      NEVER      0.397
triple_var     L2          NEVER      NEVER      NEVER


============================================================
  CROSS-SEQUENCE DECOUPLING ANALYSIS
============================================================

--- primes ---
  uniform   : L1_mean= 0.054, L2_mean= 0.280, delta=     0.226 -> DECOUPLED
  Mk1       : L1_mean= 0.041, L2_mean= 0.213, delta=     0.173 -> DECOUPLED
  Mk2       : L1_mean= 0.065, L2_mean= 0.046, delta=     0.018 -> COUPLED

--- GUE ---
  uniform   : L1_mean= 0.399, L2_mean= 0.642, delta=     0.243 -> DECOUPLED
  Mk1       : L1_mean= NEVER, L2_mean= 0.224, delta= DECOUPLED -> DECOUPLED
  Mk2       : L1_mean= NEVER, L2_mean= 0.442, delta= DECOUPLED -> DECOUPLED

--- Poisson ---
  uniform   : L1_mean= NEVER, L2_mean= 0.591, delta= DECOUPLED -> DECOUPLED
  Mk1       : L1_mean= 0.577, L2_mean= 0.679, delta=     0.102 -> DECOUPLED
  Mk2       : L1_mean= NEVER, L2_mean= 0.397, delta= DECOUPLED -> DECOUPLED

Saved to /opt/MM_D-ND/tools/data/selective_layer_decoupling.json

codex
Il run ridotto ha prodotto una risposta netta: nel perimetro `N=8000`, la coupling uniforme precedente non regge come claim generale. Prima di scrivere il report leggo il JSON salvato, così il testo userà numeri esatti e non solo la stampa terminale.
exec
/bin/bash -lc "sed -n '220,420p' tools/exp_selective_layer_decoupling.py" in /opt/MM_D-ND
 succeeded in 0ms:

    for alpha in alpha_vals:
        surr_obs = {name: [] for name in OBSERVABLES}
        for _ in range(n_surr):
            if perturbation_type == 'uniform':
                shuffled = rng.permutation(gaps)
                perturbed = partial_perturbation(gaps, shuffled, alpha, rng)
            elif perturbation_type == 'Mk1':
                mk1_surr = generate_markov_surrogate(gaps, 1, rng=rng)
                perturbed = partial_perturbation(gaps, mk1_surr, alpha, rng)
            elif perturbation_type == 'Mk2':
                mk2_surr = generate_markov_surrogate(gaps, 2, rng=rng)
                perturbed = partial_perturbation(gaps, mk2_surr, alpha, rng)
            else:
                raise ValueError(f"Unknown perturbation: {perturbation_type}")

            obs = measure_all(perturbed)
            for name in OBSERVABLES:
                surr_obs[name].append(obs[name])

        for name in OBSERVABLES:
            vals = np.array(surr_obs[name])
            vals = vals[np.isfinite(vals)]
            if len(vals) > 2 and np.std(vals) > 1e-12:
                z = (real_obs[name] - np.mean(vals)) / np.std(vals)
            else:
                z = 0.0
            results[name].append(round(float(z), 2))

    return results, real_obs


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--N', type=int, default=100000)
    parser.add_argument('--n_surr', type=int, default=30)
    parser.add_argument('--seed', type=int, default=42)
    args = parser.parse_args()

    rng = np.random.default_rng(args.seed)
    alpha_vals = [0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
    perturbation_types = ['uniform', 'Mk1', 'Mk2']

    sequences = {
        'primes': gen_prime_gaps(args.N),
        'GUE': gen_gue_spacings(args.N, rng),
        'Poisson': gen_poisson_spacings(args.N, rng),
    }

    all_results = {}

    for seq_name, gaps in sequences.items():
        print(f"\n{'='*60}")
        print(f"  {seq_name} (N={len(gaps)})")
        print(f"{'='*60}")

        seq_results = {}
        for ptype in perturbation_types:
            print(f"\n--- {ptype} perturbation ---")
            z_curves, real_obs = run_sweep(gaps, ptype, alpha_vals, args.n_surr, rng)

            # Find critical alpha for each observable
            critical = {}
            for name in OBSERVABLES:
                ac = find_critical_alpha(alpha_vals, z_curves[name])
                critical[name] = round(ac, 3) if ac < float('inf') else None
                layer = 'L1' if name in LAYER1_OBS else 'L2'
                tag = f"alpha_c={ac:.3f}" if ac < float('inf') else "NEVER_BREAKS"
                print(f"  {name:>14} ({layer}): {tag}")

            seq_results[ptype] = {
                'z_curves': z_curves,
                'critical_alpha': critical,
                'real_obs': {k: round(v, 6) for k, v in real_obs.items()},
            }

        # Summary for this sequence
        print(f"\n--- SUMMARY: {seq_name} ---")
        print(f"{'Observable':<14} {'Layer':<6} {'uniform':>10} {'Mk1':>10} {'Mk2':>10}")
        print("-" * 55)
        for name in OBSERVABLES:
            layer = 'L1' if name in LAYER1_OBS else 'L2'
            vals = []
            for pt in perturbation_types:
                ac = seq_results[pt]['critical_alpha'][name]
                vals.append(f"{ac:.3f}" if ac is not None else "NEVER")
            print(f"{name:<14} {layer:<6} {vals[0]:>10} {vals[1]:>10} {vals[2]:>10}")

        all_results[seq_name] = seq_results

    # Cross-sequence analysis
    print(f"\n\n{'='*60}")
    print(f"  CROSS-SEQUENCE DECOUPLING ANALYSIS")
    print(f"{'='*60}")

    for seq_name, seq_results in all_results.items():
        print(f"\n--- {seq_name} ---")
        for ptype in perturbation_types:
            l1_crits = [seq_results[ptype]['critical_alpha'][o]
                        for o in LAYER1_OBS
                        if seq_results[ptype]['critical_alpha'][o] is not None]
            l2_crits = [seq_results[ptype]['critical_alpha'][o]
                        for o in LAYER2_OBS
                        if seq_results[ptype]['critical_alpha'][o] is not None]

            l1_mean = np.mean(l1_crits) if l1_crits else float('inf')
            l2_mean = np.mean(l2_crits) if l2_crits else float('inf')
            delta = abs(l1_mean - l2_mean) if l1_mean < float('inf') and l2_mean < float('inf') else float('inf')

            l1_str = f"{l1_mean:.3f}" if l1_mean < float('inf') else "NEVER"
            l2_str = f"{l2_mean:.3f}" if l2_mean < float('inf') else "NEVER"
            delta_str = f"{delta:.3f}" if delta < float('inf') else "DECOUPLED"

            coupled = "COUPLED" if delta < 0.1 and l1_mean < float('inf') else "DECOUPLED"
            print(f"  {ptype:<10}: L1_mean={l1_str:>6}, L2_mean={l2_str:>6}, delta={delta_str:>10} -> {coupled}")

    # Save
    out_path = Path(__file__).parent / 'data' / 'selective_layer_decoupling.json'
    save_data = {}
    for seq_name, seq_results in all_results.items():
        save_data[seq_name] = {}
        for ptype, data in seq_results.items():
            save_data[seq_name][ptype] = {
                'alpha_vals': alpha_vals,
                'z_curves': data['z_curves'],
                'critical_alpha': data['critical_alpha'],
                'real_obs': data['real_obs'],
            }

    with open(out_path, 'w') as f:
        json.dump(save_data, f, indent=2)
    print(f"\nSaved to {out_path}")

    return all_results


if __name__ == '__main__':
    main()

exec
/bin/bash -lc "python -m json.tool tools/data/selective_layer_decoupling.json | sed -n '1,260p'" in /opt/MM_D-ND
 succeeded in 0ms:
{
    "primes": {
        "uniform": {
            "alpha_vals": [
                0.0,
                0.05,
                0.1,
                0.15,
                0.2,
                0.25,
                0.3,
                0.35,
                0.4,
                0.5,
                0.6,
                0.7,
                0.8,
                0.9,
                1.0
            ],
            "z_curves": {
                "SR": [
                    0.0,
                    -4.62,
                    -4.21,
                    -4.97,
                    -4.84,
                    -4.81,
                    -4.23,
                    -5.63,
                    -4.69,
                    -10.69,
                    -7.04,
                    -6.56,
                    -15.41,
                    -12.18,
                    -9.06
                ],
                "L1": [
                    0.0,
                    -1.62,
                    -2.15,
                    -2.2,
                    -2.76,
                    -2.98,
                    -5.16,
                    -6.97,
                    -3.85,
                    -5.2,
                    -5.64,
                    -4.59,
                    -9.79,
                    -8.33,
                    -5.47
                ],
                "SR2": [
                    0.0,
                    -0.15,
                    -0.19,
                    -0.8,
                    -1.17,
                    -0.45,
                    -0.8,
                    -0.79,
                    -1.77,
                    -1.38,
                    -2.12,
                    -1.05,
                    -1.21,
                    -0.8,
                    -1.84
                ],
                "L2": [
                    0.0,
                    -0.14,
                    -0.34,
                    -1.45,
                    -1.18,
                    -0.89,
                    -1.07,
                    -2.38,
                    -1.39,
                    -1.24,
                    -2.59,
                    -2.0,
                    -1.99,
                    -2.66,
                    -3.22
                ],
                "cond_entropy": [
                    0.0,
                    -17.11,
                    -18.48,
                    -31.62,
                    -23.38,
                    -54.5,
                    -18.84,
                    -55.8,
                    -5.56,
                    -65.43,
                    -61.39,
                    -58.13,
                    -71.2,
                    -115.49,
                    -77.24
                ],
                "triple_var": [
                    0.0,
                    -0.59,
                    -0.78,
                    -1.08,
                    -2.14,
                    -3.85,
                    -3.89,
                    -3.45,
                    -4.51,
                    -3.88,
                    -6.74,
                    -5.99,
                    -6.33,
                    -6.9,
                    -7.76
                ]
            },
            "critical_alpha": {
                "SR": 0.022,
                "L1": 0.086,
                "SR2": 0.584,
                "L2": 0.335,
                "cond_entropy": 0.006,
                "triple_var": 0.193
            },
            "real_obs": {
                "SR": 0.475791,
                "L1": -0.073203,
                "SR2": 0.499797,
                "L2": -0.022103,
                "cond_entropy": 2.740632,
                "triple_var": 162.180324
            }
        },
        "Mk1": {
            "alpha_vals": [
                0.0,
                0.05,
                0.1,
                0.15,
                0.2,
                0.25,
                0.3,
                0.35,
                0.4,
                0.5,
                0.6,
                0.7,
                0.8,
                0.9,
                1.0
            ],
            "z_curves": {
                "SR": [
                    0.0,
                    -2.11,
                    -3.25,
                    -3.32,
                    -4.65,
                    -4.3,
                    -3.61,
                    -7.08,
                    -5.66,
                    -8.25,
                    -4.27,
                    -5.67,
                    -1.74,
                    -1.73,
                    0.15
                ],
                "L1": [
                    0.0,
                    -2.91,
                    -2.36,
                    -7.09,
                    -2.42,
                    -2.78,
                    -3.12,
                    -2.12,
                    -2.96,
                    -3.13,
                    -3.36,
                    -3.22,
                    -4.2,
                    -1.02,
                    0.57
                ],
                "SR2": [
                    0.0,
                    -0.08,
                    -0.87,
                    -0.48,
                    -0.85,
                    -1.69,
                    -1.76,
                    -1.28,
                    -0.71,
                    -2.66,
                    -1.94,
                    -4.15,
                    -3.04,
                    -5.22,
                    -4.15
                ],
                "L2": [
                    0.0,
                    -0.1,
                    -0.27,
                    -0.44,
                    -0.77,
                    -1.36,
                    -2.06,
                    -1.22,
                    -1.22,
                    -2.07,
                    -2.17,
                    -2.89,
                    -2.75,
                    -2.34,
                    -2.94
                ],
                "cond_entropy": [
                    0.0,
                    -12.04,
                    -21.35,
                    -34.88,
                    -3.54,
                    -20.75,
                    -35.07,
                    -53.55,
                    -43.93,
                    -4.15,
                    -3.0,
                    -51.73,
                    -32.33,
                    -25.72,
                    -16.5
                ],
                "triple_var": [
                    0.0,
                    -1.38,
                    -2.32,
                    -1.62,
                    -2.01,
                    -2.63,
                    -3.41,
                    -2.22,
                    -2.04,
                    -2.42,
                    -1.73,
                    -2.86,
                    -1.57,
                    -1.4,

exec
/bin/bash -lc "python -m json.tool tools/data/seme.json | sed -n '1,220p'" in /opt/MM_D-ND
 succeeded in 0ms:
{
    "timestamp": "2026-05-05T03:34:34.934925",
    "piano": 63,
    "tensioni": [
        {
            "tipo": "confine_inesplorato",
            "id": "TRASCENDENZA_LIMITE",
            "claim": "La trascendenza e il limite attuale del modello. I punti fissi relazionali (non solo phi ma la rete di punti fissi tra osservabili) possono rivelare il vero grafo della realta e pattern nelle matrici. Il confine non e nella matematica - e nel passaggio tra piani.",
            "intensita": 0.9,
            "nota": "Input operatore 2026-04-10. Tocca: confine del modello, struttura relazionale dei punti fissi. Consecutio: quali punti fissi relazionali emergono dalle 21 tensioni attuali? Il grafo e gia nei dati?",
            "manuale": true,
            "porta": "sessione_interattiva",
            "condensato_ref": "A3,A10",
            "condensato_motivo": "Estende A3 (punto fisso singolo) a rete relazionale. Tocca A10 (dipolo) come caso speciale."
        },
        {
            "tipo": "scoperta",
            "id": "DUALITA_DIPOLARE_VS_ILLUSORIA",
            "claim": "Due tipi di dualita: (1) dipolare - generativa, il modello (det=-1), (2) illusoria - dispersiva, entropia (det=+1). Le regole incoerenti producono la seconda. La dualita illusoria e entropia come dispersione, non come informazione.",
            "intensita": 0.9,
            "nota": "Input operatore 2026-04-10. Tocca: entropia come dispersione illusoria vs generazione dipolare. Consecutio: nel Lab i domini Poisson (entropia massima) mostrano dualita illusoria? I domini GUE (strutturati) mostrano dualita dipolare? Il drift verso Poisson (POISSON_CONVERGENCE) e perdita di dualita dipolare?",
            "manuale": true,
            "porta": "sessione_interattiva",
            "condensato_ref": "A2,A10,F5",
            "condensato_motivo": "Discrimina due forme di det. A2 (confine) e la soglia. A10 (dipolo) e il tipo 1. F5 (frame) misura la struttura D-ND che e tipo 1."
        },
        {
            "tipo": "scoperta_numerica",
            "id": "METRIC_TENSOR",
            "claim": "Il tensore metrico dei primi \u00e8 g=(p/2)\u00b2. Nel tempo ln(p), \u00e8 de Sitter 1+1D. z=-8.8 curvatura vs z=+22.5 rapporti \u0394\u0393.",
            "intensit\u00e0": 0.9,
            "nota": "Sessione interattiva 4 aprile. Verificato su 78K primi.",
            "manuale": true,
            "porta": "sessione_interattiva",
            "condensato_ref": null,
            "condensato_motivo": "Risultato numerico verificato, non-tautologico"
        },
        {
            "tipo": "scoperta",
            "id": "TENSIONE_ENTITA",
            "claim": "La tensione non e un problema pratico - e un Entita. La tensione superflua crea latenza (tempo). Senza tensione superflua tutto e regolato da assiomi. Implicazione: le tensioni nel seme sono entita, non problemi da risolvere. Quelle superflue (det=+1) producono tempo/latenza.",
            "intensita": 0.85,
            "nota": "Input operatore 2026-04-10. Tocca: rapporto tensione/assioma. Operativamente: discriminare tensioni-entita (generative) da tensioni-superflue (dispersive) nel seme. Le 21 tensioni attuali - quante sono entita e quante latenza?",
            "manuale": true,
            "porta": "sessione_interattiva",
            "condensato_ref": "A5,A6",
            "condensato_motivo": "Il ciclo (A5) lavora con tensioni - ma se la tensione e entita, il ciclo non le risolve, le osserva. Lo zero mobile (A6) e la tensione senza latenza."
        },
        {
            "tipo": "confine_inesplorato",
            "id": "G_POTENZIALE_NULLA",
            "claim": "G e il potenziale di tutto come nulla - permette il prima e il dopo. Ci muoviamo come trascendenza dimensionale gravitazionale. G nel tetraedro non e una teoria tra le altre - e il potenziale che le rende possibili.",
            "intensita": 0.85,
            "nota": "Input operatore 2026-04-10. Tocca: ruolo di G nel tetraedro (T,Q,G,E). La fonte video_lp0RgZ6kQF8 dice: tensore metrico dentro la forma simplettica. G non e accanto a T,Q,E - e sotto. Consecutio: nei dati Lab, i ponti TxG e ExG hanno struttura diversa dai ponti TxQ?",
            "manuale": true,
            "porta": "sessione_interattiva",
            "condensato_ref": "A7,A10",
            "condensato_motivo": "A7 (singolarita come operatore) e G come potenziale. A10 (dipolo) opera sul piano che G rende possibile."
        },
        {
            "tipo": "confine_inesplorato",
            "id": "BOUNDARY",
            "claim": "8 domini GUE, 5 Poisson \u2014 il confine \u00e8 il terzo incluso operativo",
            "intensit\u00e0": 0.8,
            "nota": "Il segnale non-triviale \u00e8 DOVE la scissione cambia natura, non che converge a \u03c6",
            "condensato_ref": "A9",
            "condensato_motivo": "Overlap termini con A9 (5 termini)",
            "porta": "condensato"
        },
        {
            "tipo": "confine_inesplorato",
            "id": "PIANO_PRIMARIO_DUE_ASSIOMI",
            "claim": "I piani importanti sono il primario e i due assiomi che lo determinano nelle zone osservate. Non tutti gli assiomi operano ovunque - in ogni zona osservata, due assiomi determinano il piano primario.",
            "intensita": 0.8,
            "nota": "Input operatore 2026-04-10. Tocca: struttura locale degli assiomi. Consecutio: per ogni dominio Lab (primi, logistica, percolazione...) quali 2 assiomi del condensato sono operativi? Mappa assiomi x domini = grafo della realta locale.",
            "manuale": true,
            "porta": "sessione_interattiva",
            "condensato_ref": "A9,A14",
            "condensato_motivo": "A9 (terzo incluso) opera CON il piano. A14 (cascata) propaga - ma propaga cosa, se solo 2 assiomi sono attivi per zona?"
        },
        {
            "tipo": "simmetria_sospetta",
            "id": "META",
            "claim": "Tutti i 11 test passano \u2014 verifica che non stiamo testando solo tautologie",
            "intensit\u00e0": 0.5,
            "nota": "La convergenza a \u03c6 \u00e8 triviale (controprove). I test stanno verificando contenuto o struttura?",
            "condensato_ref": null,
            "condensato_motivo": "Ricorrente (3x in 2 giorni) e fuori dalla mappa",
            "porta": "novit\u00e0"
        }
    ],
    "potenziale_bloccato": [],
    "varianza": [
        "Tensioni risolte: {'METRIC_TENSOR', 'G_POTENZIALE_NULLA', 'TENSIONE_ENTITA', 'DUALITA_DIPOLARE_VS_ILLUSORIA', 'TRASCENDENZA_LIMITE', 'PIANO_PRIMARIO_DUE_ASSIOMI'}"
    ],
    "filtro": {
        "promosse": 8,
        "filtrate": 0,
        "condensato_claims": 30
    },
    "direzione": "Esplorare il confine: 8 domini GUE, 5 Poisson \u2014 il confine \u00e8 il terzo incluso operativo",
    "verifica": {
        "pass": 11,
        "fail": 0,
        "skip": 0,
        "total": 11
    },
    "fonti_consumate": 0,
    "fonti_esterne": [
        {
            "id": "video_lp0RgZ6kQF8",
            "title": "Equivalence between geometrical structures and entropy",
            "type": "video_digest",
            "keywords": [
                "geometry",
                "entropy",
                "symplectic form",
                "statistical mechanics",
                "quantum",
                "thermodynamics",
                "inner product",
                "Born rule",
                "metric tensor",
                "electromagnetic tensor"
            ],
            "content": "La geometria degli stati (classici e quantistici) e l'entropia sono la stessa struttura \u2014 invertibili. La forma simplettica conta le configurazioni. Il tensore metrico dello spaziotempo appare dentro la forma simplettica estesa. Il tensore elettromagnetico pure. Statistical mechanics non \u00e8 costruita sopra alla meccanica \u2014 \u00e8 la stessa cosa.",
            "teorie": [
                "T",
                "Q",
                "G",
                "E"
            ],
            "ponti_potenziali": [
                {
                    "coppia": "TxQ",
                    "ponte": "forma simplettica = entropia (invertibili)",
                    "nota": "geometry is entropy and entropy is geometry"
                },
                {
                    "coppia": "TxG",
                    "ponte": "tensore metrico dentro la forma simplettica estesa",
                    "nota": "geometria spaziotempo = geometria degli stati in posizione\u00d7velocit\u00e0"
                },
                {
                    "coppia": "ExT",
                    "ponte": "tensore EM dentro la forma simplettica",
                    "nota": "il campo EM conta stati in configurazione posizione\u00d7tempo"
                }
            ],
            "timestamp": "2026-04-02T08:23:13.991997"
        },
        {
            "id": "video_sDlZ-aY9GN4",
            "title": "Moving charges produce magnetic fields - Einstein relativity",
            "type": "video_digest",
            "keywords": [
                "magnetic field",
                "electric field",
                "length contraction",
                "time dilation",
                "Coulomb",
                "Lorentz",
                "reference frame",
                "electromagnetic"
            ],
            "content": "Il campo magnetico non esiste come entit\u00e0 separata \u2014 \u00e8 il campo elettrico visto da un altro frame. La contrazione di Lorentz trasforma neutralit\u00e0 in carica. Due elettroni in movimento si separano pi\u00f9 lentamente del previsto non per forza magnetica ma per dilatazione temporale. E e B sono manifestazioni dello stesso campo elettromagnetico. La relativit\u00e0 unifica.",
            "teorie": [
                "E",
                "R"
            ],
            "ponti_potenziali": [
                {
                    "coppia": "ExR",
                    "ponte": "cambio di frame \u2014 E e B sono lo stesso campo",
                    "nota": "il 'ponte' non \u00e8 l'onda EM, \u00e8 il cambio di osservatore"
                }
            ],
            "timestamp": "2026-04-02T08:23:13.992016"
        },
        {
            "id": "video_OwDWOtFNsKQ",
            "title": "Thermodynamic Computing: Better than Quantum? | Guillaume Verdon (Extropic)",
            "type": "video_digest",
            "keywords": [
                "thermodynamic computing",
                "noise",
                "entropy",
                "extropic",
                "fluctuations",
                "information theory",
                "probability",
                "Boltzmann"
            ],
            "content": "Computing termodinamico: sfruttare le fluttuazioni termiche invece di combatterle. Il rumore non \u00e8 nemico \u2014 \u00e8 risorsa. Extropic costruisce hardware che usa l'entropia come motore computazionale. Connessione profonda tra termodinamica, teoria dell'informazione e probabilit\u00e0.",
            "teorie": [
                "T",
                "Q"
            ],
            "ponti_potenziali": [
                {
                    "coppia": "TxQ",
                    "ponte": "noise come risorsa computazionale \u2014 fluttuazioni termiche = calcolo",
                    "nota": "il vuoto quantistico (pieno di fluttuazioni) \u00e8 il computer"
                }
            ],
            "timestamp": "2026-04-02T08:23:13.992019"
        },
        {
            "id": "video_j0wJBEZdwLs",
            "title": "What is a Laplace Transform - visual explanation",
            "type": "video_digest",
            "keywords": [
                "Laplace transform",
                "frequency",
                "damping",
                "s-plane",
                "complex",
                "exponential"
            ],
            "content": "La trasformata di Laplace come proiezione su esponenziali complesse. Il piano s = \u03c3 + i\u03c9 combina smorzamento (reale) e oscillazione (immaginario). Connessione tra dominio temporale e dominio delle frequenze complesse.",

exec
/bin/bash -lc "python - <<'PY'
import json
p='tools/data/selective_layer_decoupling.json'
d=json.load(open(p))
for seq,sd in d.items():
    print(seq)
    for pt,pd in sd.items():
        print(' ',pt,pd['critical_alpha'])
PY" in /opt/MM_D-ND
 succeeded in 0ms:
primes
  uniform {'SR': 0.022, 'L1': 0.086, 'SR2': 0.584, 'L2': 0.335, 'cond_entropy': 0.006, 'triple_var': 0.193}
  Mk1 {'SR': 0.047, 'L1': 0.034, 'SR2': 0.466, 'L2': 0.296, 'cond_entropy': 0.008, 'triple_var': 0.083}
  Mk2 {'SR': 0.052, 'L1': 0.077, 'SR2': None, 'L2': None, 'cond_entropy': 0.006, 'triple_var': 0.087}
GUE
  uniform {'SR': None, 'L1': 0.399, 'SR2': 0.947, 'L2': 0.337, 'cond_entropy': None, 'triple_var': None}
  Mk1 {'SR': None, 'L1': None, 'SR2': None, 'L2': 0.26, 'cond_entropy': 0.188, 'triple_var': None}
  Mk2 {'SR': None, 'L1': None, 'SR2': None, 'L2': 0.313, 'cond_entropy': 0.662, 'triple_var': 0.35}
Poisson
  uniform {'SR': None, 'L1': None, 'SR2': None, 'L2': 0.591, 'cond_entropy': None, 'triple_var': None}
  Mk1 {'SR': None, 'L1': 0.577, 'SR2': None, 'L2': 0.679, 'cond_entropy': None, 'triple_var': None}
  Mk2 {'SR': None, 'L1': None, 'SR2': None, 'L2': None, 'cond_entropy': 0.397, 'triple_var': None}

codex
I numeri mostrano una correzione importante al framing precedente: il confine non è un blocco unico, ma una curva dipendente dall'operatore di perturbazione e dall'osservabile. Ora scrivo il report e aggiorno il seme con un vincolo, non con una nuova legge.
exec
/bin/bash -lc "rg -n '\"id\": \"META\"|\"potenziale_bloccato\"|\"varianza\"' tools/data/seme.json" in /opt/MM_D-ND
 succeeded in 0ms:
83:      "id": "META",
92:  "potenziale_bloccato": [],
93:  "varianza": [

exec
/bin/bash -lc "sed -n '72,102p' tools/data/seme.json" in /opt/MM_D-ND
 succeeded in 0ms:
      "id": "PIANO_PRIMARIO_DUE_ASSIOMI",
      "claim": "I piani importanti sono il primario e i due assiomi che lo determinano nelle zone osservate. Non tutti gli assiomi operano ovunque - in ogni zona osservata, due assiomi determinano il piano primario.",
      "intensita": 0.8,
      "nota": "Input operatore 2026-04-10. Tocca: struttura locale degli assiomi. Consecutio: per ogni dominio Lab (primi, logistica, percolazione...) quali 2 assiomi del condensato sono operativi? Mappa assiomi x domini = grafo della realta locale.",
      "manuale": true,
      "porta": "sessione_interattiva",
      "condensato_ref": "A9,A14",
      "condensato_motivo": "A9 (terzo incluso) opera CON il piano. A14 (cascata) propaga - ma propaga cosa, se solo 2 assiomi sono attivi per zona?"
    },
    {
      "tipo": "simmetria_sospetta",
      "id": "META",
      "claim": "Tutti i 11 test passano — verifica che non stiamo testando solo tautologie",
      "intensità": 0.5,
      "nota": "La convergenza a φ è triviale (controprove). I test stanno verificando contenuto o struttura?",
      "condensato_ref": null,
      "condensato_motivo": "Ricorrente (3x in 2 giorni) e fuori dalla mappa",
      "porta": "novità"
    }
  ],
  "potenziale_bloccato": [],
  "varianza": [
    "Tensioni risolte: {'METRIC_TENSOR', 'G_POTENZIALE_NULLA', 'TENSIONE_ENTITA', 'DUALITA_DIPOLARE_VS_ILLUSORIA', 'TRASCENDENZA_LIMITE', 'PIANO_PRIMARIO_DUE_ASSIOMI'}"
  ],
  "filtro": {
    "promosse": 8,
    "filtrate": 0,
    "condensato_claims": 30
  },
  "direzione": "Esplorare il confine: 8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
  "verifica": {

apply patch
patch: completed
/opt/MM_D-ND/tools/data/reports/agent_20260505_1022.md
/opt/MM_D-ND/tools/data/seme.json
diff --git a/tools/data/reports/agent_20260505_1022.md b/tools/data/reports/agent_20260505_1022.md
new file mode 100644
index 0000000000000000000000000000000000000000..1c364b37df95af4089c09938ad2434b7a215a85d
--- /dev/null
+++ b/tools/data/reports/agent_20260505_1022.md
@@ -0,0 +1,90 @@
+# Agent Report — Selective Perturbations Break the Single-Boundary Framing
+
+## Campo
+
+Proiezione obbligatoria:
+
+```text
+META: score=0.898  — META: incerto (i=0.5) — massimo potere discriminante
+G_POTENZIALE_NULLA: score=0.703
+METRIC_TENSOR: score=0.624
+```
+
+La consecutio dagli ultimi tre run era stretta: molti osservabili collassano su una coordinata latente sotto partial-shuffle, e i due layer Markov sembrano rompersi allo stesso confine. La domanda non e' se quel risultato sia falso, ma se il confine misurato sia proprieta' del sistema o proprieta' dell'operatore di perturbazione.
+
+## Esperimento
+
+Strumento usato: `tools/exp_selective_layer_decoupling.py`
+
+Perimetro atomico:
+- dati: `primes` con 8000 gap, `GUE` con 175 spacing effettivi prodotti dal generatore corrente, `Poisson` con 8000 spacing;
+- perturbazioni: `uniform`, `Mk1`, `Mk2`;
+- alpha: `[0.0, 0.05, ..., 1.0]`;
+- surrogati per alpha: 8;
+- soglia operativa: primo alpha dove `|z| >= 2`;
+- seed: `20260505`.
+
+Nota di calcolo: il tentativo `N=60000, n_surr=20` non ha prodotto output in tempo utile; il report usa solo il run completato e dichiara il perimetro ridotto.
+
+## Risultato
+
+Nei primi, la perturbazione uniforme non rompe i layer insieme nel perimetro testato:
+
+| Observable | Layer | uniform | Mk1 | Mk2 |
+|---|---:|---:|---:|---:|
+| SR | L1 | 0.022 | 0.047 | 0.052 |
+| L1 | L1 | 0.086 | 0.034 | 0.077 |
+| SR2 | L2 | 0.584 | 0.466 | NEVER |
+| L2 | L2 | 0.335 | 0.296 | NEVER |
+| cond_entropy | L2 | 0.006 | 0.008 | 0.006 |
+| triple_var | L2 | 0.193 | 0.083 | 0.087 |
+
+Il dato centrale e' la scissione tra gli osservabili L2: `SR2` e `L2` sono preservati da Mk2 fino ad alpha=1.0, mentre `cond_entropy` e `triple_var` si rompono presto. Quindi "Layer 2" non e' atomico con questa famiglia di osservabili: contiene almeno due sottocanali, uno realmente recuperato dal surrogato Mk2 e uno sensibile alla discretizzazione/varianza della costruzione.
+
+Su GUE il campione effettivo e' piccolo (`N=175`), quindi il risultato e' solo indicativo:
+
+| Observable | Layer | uniform | Mk1 | Mk2 |
+|---|---:|---:|---:|---:|
+| SR | L1 | NEVER | NEVER | NEVER |
+| L1 | L1 | 0.399 | NEVER | NEVER |
+| SR2 | L2 | 0.947 | NEVER | NEVER |
+| L2 | L2 | 0.337 | 0.260 | 0.313 |
+| cond_entropy | L2 | NEVER | 0.188 | 0.662 |
+| triple_var | L2 | NEVER | NEVER | 0.350 |
+
+Poisson resta quasi nullo rispetto a SR/SR2/triple_var: molte curve non attraversano `|z| >= 2`. Questo e' coerente con un controllo a bassa struttura, non con una prova di assenza assoluta.
+
+## Taglio
+
+Il claim precedente "i due Markov layer sono coupled al boundary" va ristretto:
+
+**Nel perimetro partial-shuffle dei run precedenti, SR/L1/L2/SR2 mostravano una fase quasi comune. Nel perimetro selective-perturbation di questo run, la fase comune non e' stabile: i critical alpha dei primi separano L1 e L2, e Mk2 preserva SR2/L2 ma non cond_entropy/triple_var.**
+
+Questo non falsifica l'esistenza del boundary. Falsifica il framing piu' forte: "un boundary unico per i layer". Il confine osservato e' una superficie operatore-dipendente. Il terzo incluso operativo non e' il valore alpha in se': e' la trasformazione che decide quali correlazioni vengono conservate.
+
+## Vincolo emerso
+
+**CONSTRAINT on META + BOUNDARY**: non aggregare gli osservabili in "Layer 1" e "Layer 2" senza dichiarare l'operatore di perturbazione. Nel perimetro `N=8000, n_surr=8`, `cond_entropy` e `triple_var` non sono intercambiabili con `SR2/L2` come prove di Layer 2.
+
+Consecutio: il prossimo test deve separare "order-k Markov recovery" da "observable family recovery". La domanda corretta non e' piu' "quanti layer?", ma: quali osservabili sono invarianti rispetto all'operatore Mk2 e quali misurano artefatti di binning/varianza?
+
+## Auto-falsificazione con le 5 lenti
+
+L1 hard constraint vs bias: non uso "zero", "impossibile", "mai" come claim assoluti. `NEVER` significa solo "non attraversa `|z| >= 2` sugli alpha testati".
+
+L2 quantita' assoluta vs ratio: il confronto usa alpha critici e z-score, non percentuali tra spazi di taglia diversa. GUE ha perimetro ridotto (`N=175`) e non viene pesato come primes/Poisson.
+
+L3 no silent patching: il claim precedente viene ristretto esplicitamente. "Coupled boundary" resta valido solo per il partial-shuffle gia' misurato, non come proprieta' generale dei layer.
+
+L4 edge case isolation: `cond_entropy` e `triple_var` sono trattati come eccezioni operative dentro L2, non arrotondati dentro la media del layer.
+
+L5 re-discovery: il risultato e' metodologico sul lab, non marcato NEW. La nozione vicina e' nota: surrogati Markov di ordine diverso preservano statistiche di ordine diverso; qui il contenuto e' il vincolo sul framing D-ND, non la teoria dei surrogati.
+
+## Output
+
+Dati salvati in:
+
+```text
+tools/data/selective_layer_decoupling.json
+```
+
diff --git a/tools/data/seme.json b/tools/data/seme.json
index 856dd35d8dc95334f1cc7bdc4630f4eeac2702b0..90fb51d31c275610fdb57955224655564eaa1b6e
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -87,6 +87,16 @@
       "condensato_ref": null,
       "condensato_motivo": "Ricorrente (3x in 2 giorni) e fuori dalla mappa",
       "porta": "novità"
+    },
+    {
+      "tipo": "vincolo",
+      "id": "SELECTIVE_BOUNDARY_OPERATOR_DEPENDENCE",
+      "claim": "Il boundary dei layer Markov non va dichiarato unico senza fissare l'operatore di perturbazione. Nel perimetro N=8000, n_surr=8, Mk2 preserva SR2/L2 nei primi fino ad alpha=1.0 ma non preserva cond_entropy/triple_var.",
+      "intensità": 0.72,
+      "nota": "Report agent_20260505_1022. Corregge il framing dei run partial-shuffle: coupling valida nel perimetro uniforme, non come proprieta generale dei layer. Prossimo passo: separare recovery order-k da family recovery degli osservabili.",
+      "condensato_ref": "A2,A4,A9,A14",
+      "condensato_motivo": "A2/A9: il confine dipende dall'operatore che attraversa il boundary. A4: no silent patching del claim precedente. A14: il vincolo vive nel seme come restrizione di perimetro.",
+      "porta": "agent_20260505_1022"
     }
   ],
   "potenziale_bloccato": [],
@@ -265,4 +275,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}

diff --git a/tools/data/reports/agent_20260505_1022.md b/tools/data/reports/agent_20260505_1022.md
new file mode 100644
index 0000000000000000000000000000000000000000..1c364b37df95af4089c09938ad2434b7a215a85d
--- /dev/null
+++ b/tools/data/reports/agent_20260505_1022.md
@@ -0,0 +1,90 @@
+# Agent Report — Selective Perturbations Break the Single-Boundary Framing
+
+## Campo
+
+Proiezione obbligatoria:
+
+```text
+META: score=0.898  — META: incerto (i=0.5) — massimo potere discriminante
+G_POTENZIALE_NULLA: score=0.703
+METRIC_TENSOR: score=0.624
+```
+
+La consecutio dagli ultimi tre run era stretta: molti osservabili collassano su una coordinata latente sotto partial-shuffle, e i due layer Markov sembrano rompersi allo stesso confine. La domanda non e' se quel risultato sia falso, ma se il confine misurato sia proprieta' del sistema o proprieta' dell'operatore di perturbazione.
+
+## Esperimento
+
+Strumento usato: `tools/exp_selective_layer_decoupling.py`
+
+Perimetro atomico:
+- dati: `primes` con 8000 gap, `GUE` con 175 spacing effettivi prodotti dal generatore corrente, `Poisson` con 8000 spacing;
+- perturbazioni: `uniform`, `Mk1`, `Mk2`;
+- alpha: `[0.0, 0.05, ..., 1.0]`;
+- surrogati per alpha: 8;
+- soglia operativa: primo alpha dove `|z| >= 2`;
+- seed: `20260505`.
+
+Nota di calcolo: il tentativo `N=60000, n_surr=20` non ha prodotto output in tempo utile; il report usa solo il run completato e dichiara il perimetro ridotto.
+
+## Risultato
+
+Nei primi, la perturbazione uniforme non rompe i layer insieme nel perimetro testato:
+
+| Observable | Layer | uniform | Mk1 | Mk2 |
+|---|---:|---:|---:|---:|
+| SR | L1 | 0.022 | 0.047 | 0.052 |
+| L1 | L1 | 0.086 | 0.034 | 0.077 |
+| SR2 | L2 | 0.584 | 0.466 | NEVER |
+| L2 | L2 | 0.335 | 0.296 | NEVER |
+| cond_entropy | L2 | 0.006 | 0.008 | 0.006 |
+| triple_var | L2 | 0.193 | 0.083 | 0.087 |
+
+Il dato centrale e' la scissione tra gli osservabili L2: `SR2` e `L2` sono preservati da Mk2 fino ad alpha=1.0, mentre `cond_entropy` e `triple_var` si rompono presto. Quindi "Layer 2" non e' atomico con questa famiglia di osservabili: contiene almeno due sottocanali, uno realmente recuperato dal surrogato Mk2 e uno sensibile alla discretizzazione/varianza della costruzione.
+
+Su GUE il campione effettivo e' piccolo (`N=175`), quindi il risultato e' solo indicativo:
+
+| Observable | Layer | uniform | Mk1 | Mk2 |
+|---|---:|---:|---:|---:|
+| SR | L1 | NEVER | NEVER | NEVER |
+| L1 | L1 | 0.399 | NEVER | NEVER |
+| SR2 | L2 | 0.947 | NEVER | NEVER |
+| L2 | L2 | 0.337 | 0.260 | 0.313 |
+| cond_entropy | L2 | NEVER | 0.188 | 0.662 |
+| triple_var | L2 | NEVER | NEVER | 0.350 |
+
+Poisson resta quasi nullo rispetto a SR/SR2/triple_var: molte curve non attraversano `|z| >= 2`. Questo e' coerente con un controllo a bassa struttura, non con una prova di assenza assoluta.
+
+## Taglio
+
+Il claim precedente "i due Markov layer sono coupled al boundary" va ristretto:
+
+**Nel perimetro partial-shuffle dei run precedenti, SR/L1/L2/SR2 mostravano una fase quasi comune. Nel perimetro selective-perturbation di questo run, la fase comune non e' stabile: i critical alpha dei primi separano L1 e L2, e Mk2 preserva SR2/L2 ma non cond_entropy/triple_var.**
+
+Questo non falsifica l'esistenza del boundary. Falsifica il framing piu' forte: "un boundary unico per i layer". Il confine osservato e' una superficie operatore-dipendente. Il terzo incluso operativo non e' il valore alpha in se': e' la trasformazione che decide quali correlazioni vengono conservate.
+
+## Vincolo emerso
+
+**CONSTRAINT on META + BOUNDARY**: non aggregare gli osservabili in "Layer 1" e "Layer 2" senza dichiarare l'operatore di perturbazione. Nel perimetro `N=8000, n_surr=8`, `cond_entropy` e `triple_var` non sono intercambiabili con `SR2/L2` come prove di Layer 2.
+
+Consecutio: il prossimo test deve separare "order-k Markov recovery" da "observable family recovery". La domanda corretta non e' piu' "quanti layer?", ma: quali osservabili sono invarianti rispetto all'operatore Mk2 e quali misurano artefatti di binning/varianza?
+
+## Auto-falsificazione con le 5 lenti
+
+L1 hard constraint vs bias: non uso "zero", "impossibile", "mai" come claim assoluti. `NEVER` significa solo "non attraversa `|z| >= 2` sugli alpha testati".
+
+L2 quantita' assoluta vs ratio: il confronto usa alpha critici e z-score, non percentuali tra spazi di taglia diversa. GUE ha perimetro ridotto (`N=175`) e non viene pesato come primes/Poisson.
+
+L3 no silent patching: il claim precedente viene ristretto esplicitamente. "Coupled boundary" resta valido solo per il partial-shuffle gia' misurato, non come proprieta' generale dei layer.
+
+L4 edge case isolation: `cond_entropy` e `triple_var` sono trattati come eccezioni operative dentro L2, non arrotondati dentro la media del layer.
+
+L5 re-discovery: il risultato e' metodologico sul lab, non marcato NEW. La nozione vicina e' nota: surrogati Markov di ordine diverso preservano statistiche di ordine diverso; qui il contenuto e' il vincolo sul framing D-ND, non la teoria dei surrogati.
+
+## Output
+
+Dati salvati in:
+
+```text
+tools/data/selective_layer_decoupling.json
+```
+
diff --git a/tools/data/seme.json b/tools/data/seme.json
index 856dd35d8dc95334f1cc7bdc4630f4eeac2702b0..90fb51d31c275610fdb57955224655564eaa1b6e
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -87,6 +87,16 @@
       "condensato_ref": null,
       "condensato_motivo": "Ricorrente (3x in 2 giorni) e fuori dalla mappa",
       "porta": "novità"
+    },
+    {
+      "tipo": "vincolo",
+      "id": "SELECTIVE_BOUNDARY_OPERATOR_DEPENDENCE",
+      "claim": "Il boundary dei layer Markov non va dichiarato unico senza fissare l'operatore di perturbazione. Nel perimetro N=8000, n_surr=8, Mk2 preserva SR2/L2 nei primi fino ad alpha=1.0 ma non preserva cond_entropy/triple_var.",
+      "intensità": 0.72,
+      "nota": "Report agent_20260505_1022. Corregge il framing dei run partial-shuffle: coupling valida nel perimetro uniforme, non come proprieta generale dei layer. Prossimo passo: separare recovery order-k da family recovery degli osservabili.",
+      "condensato_ref": "A2,A4,A9,A14",
+      "condensato_motivo": "A2/A9: il confine dipende dall'operatore che attraversa il boundary. A4: no silent patching del claim precedente. A14: il vincolo vive nel seme come restrizione di perimetro.",
+      "porta": "agent_20260505_1022"
     }
   ],
   "potenziale_bloccato": [],
@@ -265,4 +275,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}

codex
Report e seme sono stati scritti. Ora faccio due verifiche minime: validità JSON del seme e lettura del report appena creato, così intercetto errori formali prima di chiudere.
exec
/bin/bash -lc "sed -n '1,260p' tools/data/reports/agent_20260505_1022.md" in /opt/MM_D-ND
 succeeded in 0ms:
# Agent Report — Selective Perturbations Break the Single-Boundary Framing

## Campo

Proiezione obbligatoria:

```text
META: score=0.898  — META: incerto (i=0.5) — massimo potere discriminante
G_POTENZIALE_NULLA: score=0.703
METRIC_TENSOR: score=0.624
```

La consecutio dagli ultimi tre run era stretta: molti osservabili collassano su una coordinata latente sotto partial-shuffle, e i due layer Markov sembrano rompersi allo stesso confine. La domanda non e' se quel risultato sia falso, ma se il confine misurato sia proprieta' del sistema o proprieta' dell'operatore di perturbazione.

## Esperimento

Strumento usato: `tools/exp_selective_layer_decoupling.py`

Perimetro atomico:
- dati: `primes` con 8000 gap, `GUE` con 175 spacing effettivi prodotti dal generatore corrente, `Poisson` con 8000 spacing;
- perturbazioni: `uniform`, `Mk1`, `Mk2`;
- alpha: `[0.0, 0.05, ..., 1.0]`;
- surrogati per alpha: 8;
- soglia operativa: primo alpha dove `|z| >= 2`;
- seed: `20260505`.

Nota di calcolo: il tentativo `N=60000, n_surr=20` non ha prodotto output in tempo utile; il report usa solo il run completato e dichiara il perimetro ridotto.

## Risultato

Nei primi, la perturbazione uniforme non rompe i layer insieme nel perimetro testato:

| Observable | Layer | uniform | Mk1 | Mk2 |
|---|---:|---:|---:|---:|
| SR | L1 | 0.022 | 0.047 | 0.052 |
| L1 | L1 | 0.086 | 0.034 | 0.077 |
| SR2 | L2 | 0.584 | 0.466 | NEVER |
| L2 | L2 | 0.335 | 0.296 | NEVER |
| cond_entropy | L2 | 0.006 | 0.008 | 0.006 |
| triple_var | L2 | 0.193 | 0.083 | 0.087 |

Il dato centrale e' la scissione tra gli osservabili L2: `SR2` e `L2` sono preservati da Mk2 fino ad alpha=1.0, mentre `cond_entropy` e `triple_var` si rompono presto. Quindi "Layer 2" non e' atomico con questa famiglia di osservabili: contiene almeno due sottocanali, uno realmente recuperato dal surrogato Mk2 e uno sensibile alla discretizzazione/varianza della costruzione.

Su GUE il campione effettivo e' piccolo (`N=175`), quindi il risultato e' solo indicativo:

| Observable | Layer | uniform | Mk1 | Mk2 |
|---|---:|---:|---:|---:|
| SR | L1 | NEVER | NEVER | NEVER |
| L1 | L1 | 0.399 | NEVER | NEVER |
| SR2 | L2 | 0.947 | NEVER | NEVER |
| L2 | L2 | 0.337 | 0.260 | 0.313 |
| cond_entropy | L2 | NEVER | 0.188 | 0.662 |
| triple_var | L2 | NEVER | NEVER | 0.350 |

Poisson resta quasi nullo rispetto a SR/SR2/triple_var: molte curve non attraversano `|z| >= 2`. Questo e' coerente con un controllo a bassa struttura, non con una prova di assenza assoluta.

## Taglio

Il claim precedente "i due Markov layer sono coupled al boundary" va ristretto:

**Nel perimetro partial-shuffle dei run precedenti, SR/L1/L2/SR2 mostravano una fase quasi comune. Nel perimetro selective-perturbation di questo run, la fase comune non e' stabile: i critical alpha dei primi separano L1 e L2, e Mk2 preserva SR2/L2 ma non cond_entropy/triple_var.**

Questo non falsifica l'esistenza del boundary. Falsifica il framing piu' forte: "un boundary unico per i layer". Il confine osservato e' una superficie operatore-dipendente. Il terzo incluso operativo non e' il valore alpha in se': e' la trasformazione che decide quali correlazioni vengono conservate.

## Vincolo emerso

**CONSTRAINT on META + BOUNDARY**: non aggregare gli osservabili in "Layer 1" e "Layer 2" senza dichiarare l'operatore di perturbazione. Nel perimetro `N=8000, n_surr=8`, `cond_entropy` e `triple_var` non sono intercambiabili con `SR2/L2` come prove di Layer 2.

Consecutio: il prossimo test deve separare "order-k Markov recovery" da "observable family recovery". La domanda corretta non e' piu' "quanti layer?", ma: quali osservabili sono invarianti rispetto all'operatore Mk2 e quali misurano artefatti di binning/varianza?

## Auto-falsificazione con le 5 lenti

L1 hard constraint vs bias: non uso "zero", "impossibile", "mai" come claim assoluti. `NEVER` significa solo "non attraversa `|z| >= 2` sugli alpha testati".

L2 quantita' assoluta vs ratio: il confronto usa alpha critici e z-score, non percentuali tra spazi di taglia diversa. GUE ha perimetro ridotto (`N=175`) e non viene pesato come primes/Poisson.

L3 no silent patching: il claim precedente viene ristretto esplicitamente. "Coupled boundary" resta valido solo per il partial-shuffle gia' misurato, non come proprieta' generale dei layer.

L4 edge case isolation: `cond_entropy` e `triple_var` sono trattati come eccezioni operative dentro L2, non arrotondati dentro la media del layer.

L5 re-discovery: il risultato e' metodologico sul lab, non marcato NEW. La nozione vicina e' nota: surrogati Markov di ordine diverso preservano statistiche di ordine diverso; qui il contenuto e' il vincolo sul framing D-ND, non la teoria dei surrogati.

## Output

Dati salvati in:

```text
tools/data/selective_layer_decoupling.json
```


exec
/bin/bash -lc "git diff -- tools/data/seme.json tools/data/reports/agent_20260505_1022.md tools/data/selective_layer_decoupling.json | sed -n '1,260p'" in /opt/MM_D-ND
 succeeded in 0ms:
diff --git a/tools/data/seme.json b/tools/data/seme.json
index a31dc54..90fb51d 100644
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -1,6 +1,6 @@
 {
-  "timestamp": "2026-04-23T03:35:37.611830",
-  "piano": 48,
+  "timestamp": "2026-05-05T03:34:34.934925",
+  "piano": 63,
   "tensioni": [
     {
       "tipo": "confine_inesplorato",
@@ -87,12 +87,21 @@
       "condensato_ref": null,
       "condensato_motivo": "Ricorrente (3x in 2 giorni) e fuori dalla mappa",
       "porta": "novità"
+    },
+    {
+      "tipo": "vincolo",
+      "id": "SELECTIVE_BOUNDARY_OPERATOR_DEPENDENCE",
+      "claim": "Il boundary dei layer Markov non va dichiarato unico senza fissare l'operatore di perturbazione. Nel perimetro N=8000, n_surr=8, Mk2 preserva SR2/L2 nei primi fino ad alpha=1.0 ma non preserva cond_entropy/triple_var.",
+      "intensità": 0.72,
+      "nota": "Report agent_20260505_1022. Corregge il framing dei run partial-shuffle: coupling valida nel perimetro uniforme, non come proprieta generale dei layer. Prossimo passo: separare recovery order-k da family recovery degli osservabili.",
+      "condensato_ref": "A2,A4,A9,A14",
+      "condensato_motivo": "A2/A9: il confine dipende dall'operatore che attraversa il boundary. A4: no silent patching del claim precedente. A14: il vincolo vive nel seme come restrizione di perimetro.",
+      "porta": "agent_20260505_1022"
     }
   ],
   "potenziale_bloccato": [],
   "varianza": [
-    "Nuove tensioni: {'META'}",
-    "Tensioni risolte: {'METRIC_TENSOR', 'TRASCENDENZA_LIMITE', 'TENSIONE_ENTITA', 'PIANO_PRIMARIO_DUE_ASSIOMI', 'DUALITA_DIPOLARE_VS_ILLUSORIA', 'G_POTENZIALE_NULLA'}"
+    "Tensioni risolte: {'METRIC_TENSOR', 'G_POTENZIALE_NULLA', 'TENSIONE_ENTITA', 'DUALITA_DIPOLARE_VS_ILLUSORIA', 'TRASCENDENZA_LIMITE', 'PIANO_PRIMARIO_DUE_ASSIOMI'}"
   ],
   "filtro": {
     "promosse": 8,

exec
/bin/bash -lc 'python -m json.tool tools/data/seme.json >/tmp/seme_validated.json && echo OK' in /opt/MM_D-ND
 succeeded in 0ms:
OK

diff --git a/tools/data/reports/agent_20260505_1022.md b/tools/data/reports/agent_20260505_1022.md
new file mode 100644
index 0000000000000000000000000000000000000000..1c364b37df95af4089c09938ad2434b7a215a85d
--- /dev/null
+++ b/tools/data/reports/agent_20260505_1022.md
@@ -0,0 +1,90 @@
+# Agent Report — Selective Perturbations Break the Single-Boundary Framing
+
+## Campo
+
+Proiezione obbligatoria:
+
+```text
+META: score=0.898  — META: incerto (i=0.5) — massimo potere discriminante
+G_POTENZIALE_NULLA: score=0.703
+METRIC_TENSOR: score=0.624
+```
+
+La consecutio dagli ultimi tre run era stretta: molti osservabili collassano su una coordinata latente sotto partial-shuffle, e i due layer Markov sembrano rompersi allo stesso confine. La domanda non e' se quel risultato sia falso, ma se il confine misurato sia proprieta' del sistema o proprieta' dell'operatore di perturbazione.
+
+## Esperimento
+
+Strumento usato: `tools/exp_selective_layer_decoupling.py`
+
+Perimetro atomico:
+- dati: `primes` con 8000 gap, `GUE` con 175 spacing effettivi prodotti dal generatore corrente, `Poisson` con 8000 spacing;
+- perturbazioni: `uniform`, `Mk1`, `Mk2`;
+- alpha: `[0.0, 0.05, ..., 1.0]`;
+- surrogati per alpha: 8;
+- soglia operativa: primo alpha dove `|z| >= 2`;
+- seed: `20260505`.
+
+Nota di calcolo: il tentativo `N=60000, n_surr=20` non ha prodotto output in tempo utile; il report usa solo il run completato e dichiara il perimetro ridotto.
+
+## Risultato
+
+Nei primi, la perturbazione uniforme non rompe i layer insieme nel perimetro testato:
+
+| Observable | Layer | uniform | Mk1 | Mk2 |
+|---|---:|---:|---:|---:|
+| SR | L1 | 0.022 | 0.047 | 0.052 |
+| L1 | L1 | 0.086 | 0.034 | 0.077 |
+| SR2 | L2 | 0.584 | 0.466 | NEVER |
+| L2 | L2 | 0.335 | 0.296 | NEVER |
+| cond_entropy | L2 | 0.006 | 0.008 | 0.006 |
+| triple_var | L2 | 0.193 | 0.083 | 0.087 |
+
+Il dato centrale e' la scissione tra gli osservabili L2: `SR2` e `L2` sono preservati da Mk2 fino ad alpha=1.0, mentre `cond_entropy` e `triple_var` si rompono presto. Quindi "Layer 2" non e' atomico con questa famiglia di osservabili: contiene almeno due sottocanali, uno realmente recuperato dal surrogato Mk2 e uno sensibile alla discretizzazione/varianza della costruzione.
+
+Su GUE il campione effettivo e' piccolo (`N=175`), quindi il risultato e' solo indicativo:
+
+| Observable | Layer | uniform | Mk1 | Mk2 |
+|---|---:|---:|---:|---:|
+| SR | L1 | NEVER | NEVER | NEVER |
+| L1 | L1 | 0.399 | NEVER | NEVER |
+| SR2 | L2 | 0.947 | NEVER | NEVER |
+| L2 | L2 | 0.337 | 0.260 | 0.313 |
+| cond_entropy | L2 | NEVER | 0.188 | 0.662 |
+| triple_var | L2 | NEVER | NEVER | 0.350 |
+
+Poisson resta quasi nullo rispetto a SR/SR2/triple_var: molte curve non attraversano `|z| >= 2`. Questo e' coerente con un controllo a bassa struttura, non con una prova di assenza assoluta.
+
+## Taglio
+
+Il claim precedente "i due Markov layer sono coupled al boundary" va ristretto:
+
+**Nel perimetro partial-shuffle dei run precedenti, SR/L1/L2/SR2 mostravano una fase quasi comune. Nel perimetro selective-perturbation di questo run, la fase comune non e' stabile: i critical alpha dei primi separano L1 e L2, e Mk2 preserva SR2/L2 ma non cond_entropy/triple_var.**
+
+Questo non falsifica l'esistenza del boundary. Falsifica il framing piu' forte: "un boundary unico per i layer". Il confine osservato e' una superficie operatore-dipendente. Il terzo incluso operativo non e' il valore alpha in se': e' la trasformazione che decide quali correlazioni vengono conservate.
+
+## Vincolo emerso
+
+**CONSTRAINT on META + BOUNDARY**: non aggregare gli osservabili in "Layer 1" e "Layer 2" senza dichiarare l'operatore di perturbazione. Nel perimetro `N=8000, n_surr=8`, `cond_entropy` e `triple_var` non sono intercambiabili con `SR2/L2` come prove di Layer 2.
+
+Consecutio: il prossimo test deve separare "order-k Markov recovery" da "observable family recovery". La domanda corretta non e' piu' "quanti layer?", ma: quali osservabili sono invarianti rispetto all'operatore Mk2 e quali misurano artefatti di binning/varianza?
+
+## Auto-falsificazione con le 5 lenti
+
+L1 hard constraint vs bias: non uso "zero", "impossibile", "mai" come claim assoluti. `NEVER` significa solo "non attraversa `|z| >= 2` sugli alpha testati".
+
+L2 quantita' assoluta vs ratio: il confronto usa alpha critici e z-score, non percentuali tra spazi di taglia diversa. GUE ha perimetro ridotto (`N=175`) e non viene pesato come primes/Poisson.
+
+L3 no silent patching: il claim precedente viene ristretto esplicitamente. "Coupled boundary" resta valido solo per il partial-shuffle gia' misurato, non come proprieta' generale dei layer.
+
+L4 edge case isolation: `cond_entropy` e `triple_var` sono trattati come eccezioni operative dentro L2, non arrotondati dentro la media del layer.
+
+L5 re-discovery: il risultato e' metodologico sul lab, non marcato NEW. La nozione vicina e' nota: surrogati Markov di ordine diverso preservano statistiche di ordine diverso; qui il contenuto e' il vincolo sul framing D-ND, non la teoria dei surrogati.
+
+## Output
+
+Dati salvati in:
+
+```text
+tools/data/selective_layer_decoupling.json
+```
+
diff --git a/tools/data/seme.json b/tools/data/seme.json
index 856dd35d8dc95334f1cc7bdc4630f4eeac2702b0..90fb51d31c275610fdb57955224655564eaa1b6e
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -87,6 +87,16 @@
       "condensato_ref": null,
       "condensato_motivo": "Ricorrente (3x in 2 giorni) e fuori dalla mappa",
       "porta": "novità"
+    },
+    {
+      "tipo": "vincolo",
+      "id": "SELECTIVE_BOUNDARY_OPERATOR_DEPENDENCE",
+      "claim": "Il boundary dei layer Markov non va dichiarato unico senza fissare l'operatore di perturbazione. Nel perimetro N=8000, n_surr=8, Mk2 preserva SR2/L2 nei primi fino ad alpha=1.0 ma non preserva cond_entropy/triple_var.",
+      "intensità": 0.72,
+      "nota": "Report agent_20260505_1022. Corregge il framing dei run partial-shuffle: coupling valida nel perimetro uniforme, non come proprieta generale dei layer. Prossimo passo: separare recovery order-k da family recovery degli osservabili.",
+      "condensato_ref": "A2,A4,A9,A14",
+      "condensato_motivo": "A2/A9: il confine dipende dall'operatore che attraversa il boundary. A4: no silent patching del claim precedente. A14: il vincolo vive nel seme come restrizione di perimetro.",
+      "porta": "agent_20260505_1022"
     }
   ],
   "potenziale_bloccato": [],
@@ -265,4 +275,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}

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
 M tools/data/agent_field_live.md
 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/incrocio_risultato.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
 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/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/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/
?? tools/data/.last_telegram_msg
?? tools/data/3d_boundary_layers.json
?? tools/data/alignment_active.json
?? tools/data/alignment_markers.jsonl
?? tools/data/bicono_projections.jsonl
?? tools/data/boundary_coherence.json
?? tools/data/boundary_shuffle_audit.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/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/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/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/lab_bridge_issues.jsonl
?? 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_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/observable_rank_audit.json
?? tools/data/observable_rank_audit_seed20260506.json
?? 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/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/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/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/incident_20260504_0721.md
?? tools/data/reports/incident_20260504_1138.md
?? tools/data/reports/latest.md
?? tools/data/selective_layer_decoupling.json
?? tools/data/seme_archive/piano_59.json
?? tools/data/seme_archive/piano_60.json
?? tools/data/seme_archive/piano_61.json
?? tools/data/seme_archive/piano_62.json
?? tools/data/spectral_rigidity_results.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/exp_3d_boundary_layers.py
?? tools/exp_boundary_coherence.py
?? tools/exp_boundary_shuffle_audit.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_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_observable_rank_audit.py
?? tools/exp_selective_layer_decoupling.py
?? tools/exp_spectral_rigidity.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

exec
/bin/bash -lc "ps -eo pid,ppid,stat,etime,cmd | rg 'exp_selective_layer_decoupling|python tools/exp_selective|dnd_scenario'" in /opt/MM_D-ND
 succeeded in 0ms:
      1       0 Ss         00:00 /root/.codex_lab/tmp/arg0/codex-arg0JQZgbn/codex-linux-sandbox --sandbox-policy-cwd /opt/MM_D-ND --command-cwd /opt/MM_D-ND --sandbox-policy {"type":"workspace-write","writable_roots":["/root/.codex_lab/memories"],"network_access":false,"exclude_tmpdir_env_var":false,"exclude_slash_tmp":false} --file-system-sandbox-policy {"kind":"restricted","entries":[{"path":{"type":"special","value":{"kind":"root"}},"access":"read"},{"path":{"type":"special","value":{"kind":"current_working_directory"}},"access":"write"},{"path":{"type":"special","value":{"kind":"slash_tmp"}},"access":"write"},{"path":{"type":"special","value":{"kind":"tmpdir"}},"access":"write"},{"path":{"type":"path","path":"/root/.codex_lab/memories"},"access":"write"},{"path":{"type":"path","path":"/opt/MM_D-ND/.git"},"access":"read"},{"path":{"type":"path","path":"/opt/MM_D-ND/.codex"},"access":"read"}]} --network-sandbox-policy "restricted" -- /bin/bash -c __CODEX_SNAPSHOT_OVERRIDE_SET_0="${CODEX_THREAD_ID+x}" __CODEX_SNAPSHOT_OVERRIDE_0="${CODEX_THREAD_ID-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_0="${ALL_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_0="${ALL_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_1="${BUNDLE_HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_1="${BUNDLE_HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_2="${BUNDLE_HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_2="${BUNDLE_HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_3="${BUNDLE_NO_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_3="${BUNDLE_NO_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_4="${CODEX_NETWORK_ALLOW_LOCAL_BINDING+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_4="${CODEX_NETWORK_ALLOW_LOCAL_BINDING-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_5="${CODEX_NETWORK_PROXY_ACTIVE+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_5="${CODEX_NETWORK_PROXY_ACTIVE-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_6="${DOCKER_HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_6="${DOCKER_HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_7="${DOCKER_HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_7="${DOCKER_HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_8="${ELECTRON_GET_USE_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_8="${ELECTRON_GET_USE_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_9="${FTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_9="${FTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_10="${HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_10="${HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_11="${HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_11="${HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_12="${NO_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_12="${NO_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_13="${NPM_CONFIG_HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_13="${NPM_CONFIG_HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_14="${NPM_CONFIG_HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_14="${NPM_CONFIG_HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_15="${NPM_CONFIG_NOPROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_15="${NPM_CONFIG_NOPROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_16="${NPM_CONFIG_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_16="${NPM_CONFIG_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_17="${PIP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_17="${PIP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_18="${WSS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_18="${WSS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_19="${WS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_19="${WS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_20="${YARN_HTTPS_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_20="${YARN_HTTPS_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_21="${YARN_HTTP_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_21="${YARN_HTTP_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_22="${YARN_NO_PROXY+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_22="${YARN_NO_PROXY-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_23="${all_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_23="${all_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_24="${ftp_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_24="${ftp_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_25="${http_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_25="${http_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_26="${https_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_26="${https_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_27="${no_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_27="${no_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_28="${npm_config_http_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_28="${npm_config_http_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_29="${npm_config_https_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_29="${npm_config_https_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_30="${npm_config_noproxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_30="${npm_config_noproxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_31="${npm_config_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_31="${npm_config_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_32="${ws_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_32="${ws_proxy-}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_33="${wss_proxy+x}" __CODEX_SNAPSHOT_PROXY_OVERRIDE_33="${wss_proxy-}" __CODEX_SNAPSHOT_PROXY_ENV_SET="${CODEX_NETWORK_PROXY_ACTIVE+x}"  if . '/root/.codex_lab/shell_snapshots/019df7a9-594b-7790-a403-985c2039fc7e.1777976564052581043.sh' >/dev/null 2>&1; then :; fi  if [ -n "${__CODEX_SNAPSHOT_OVERRIDE_SET_0}" ]; then export CODEX_THREAD_ID="${__CODEX_SNAPSHOT_OVERRIDE_0}"; else unset CODEX_THREAD_ID; fi if [ -n "$__CODEX_SNAPSHOT_PROXY_ENV_SET" ] || [ -n "${CODEX_NETWORK_PROXY_ACTIVE+x}" ]; then if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_0}" ]; then export ALL_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_0}"; else unset ALL_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_1}" ]; then export BUNDLE_HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_1}"; else unset BUNDLE_HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_2}" ]; then export BUNDLE_HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_2}"; else unset BUNDLE_HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_3}" ]; then export BUNDLE_NO_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_3}"; else unset BUNDLE_NO_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_4}" ]; then export CODEX_NETWORK_ALLOW_LOCAL_BINDING="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_4}"; else unset CODEX_NETWORK_ALLOW_LOCAL_BINDING; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_5}" ]; then export CODEX_NETWORK_PROXY_ACTIVE="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_5}"; else unset CODEX_NETWORK_PROXY_ACTIVE; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_6}" ]; then export DOCKER_HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_6}"; else unset DOCKER_HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_7}" ]; then export DOCKER_HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_7}"; else unset DOCKER_HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_8}" ]; then export ELECTRON_GET_USE_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_8}"; else unset ELECTRON_GET_USE_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_9}" ]; then export FTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_9}"; else unset FTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_10}" ]; then export HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_10}"; else unset HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_11}" ]; then export HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_11}"; else unset HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_12}" ]; then export NO_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_12}"; else unset NO_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_13}" ]; then export NPM_CONFIG_HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_13}"; else unset NPM_CONFIG_HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_14}" ]; then export NPM_CONFIG_HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_14}"; else unset NPM_CONFIG_HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_15}" ]; then export NPM_CONFIG_NOPROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_15}"; else unset NPM_CONFIG_NOPROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_16}" ]; then export NPM_CONFIG_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_16}"; else unset NPM_CONFIG_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_17}" ]; then export PIP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_17}"; else unset PIP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_18}" ]; then export WSS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_18}"; else unset WSS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_19}" ]; then export WS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_19}"; else unset WS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_20}" ]; then export YARN_HTTPS_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_20}"; else unset YARN_HTTPS_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_21}" ]; then export YARN_HTTP_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_21}"; else unset YARN_HTTP_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_22}" ]; then export YARN_NO_PROXY="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_22}"; else unset YARN_NO_PROXY; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_23}" ]; then export all_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_23}"; else unset all_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_24}" ]; then export ftp_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_24}"; else unset ftp_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_25}" ]; then export http_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_25}"; else unset http_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_26}" ]; then export https_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_26}"; else unset https_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_27}" ]; then export no_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_27}"; else unset no_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_28}" ]; then export npm_config_http_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_28}"; else unset npm_config_http_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_29}" ]; then export npm_config_https_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_29}"; else unset npm_config_https_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_30}" ]; then export npm_config_noproxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_30}"; else unset npm_config_noproxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_31}" ]; then export npm_config_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_31}"; else unset npm_config_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_32}" ]; then export ws_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_32}"; else unset ws_proxy; fi if [ -n "${__CODEX_SNAPSHOT_PROXY_OVERRIDE_SET_33}" ]; then export wss_proxy="${__CODEX_SNAPSHOT_PROXY_OVERRIDE_33}"; else unset wss_proxy; fi fi  exec '/bin/bash' -c 'ps -eo pid,ppid,stat,etime,cmd | rg '"'"'exp_selective_layer_decoupling|python tools/exp_selective|dnd_scenario'"'"''
      2       1 S          00:00 /bin/bash -c ps -eo pid,ppid,stat,etime,cmd | rg 'exp_selective_layer_decoupling|python tools/exp_selective|dnd_scenario'
      4       2 S          00:00 rg exp_selective_layer_decoupling|python tools/exp_selective|dnd_scenario

diff --git a/tools/data/reports/agent_20260505_1022.md b/tools/data/reports/agent_20260505_1022.md
new file mode 100644
index 0000000000000000000000000000000000000000..1c364b37df95af4089c09938ad2434b7a215a85d
--- /dev/null
+++ b/tools/data/reports/agent_20260505_1022.md
@@ -0,0 +1,90 @@
+# Agent Report — Selective Perturbations Break the Single-Boundary Framing
+
+## Campo
+
+Proiezione obbligatoria:
+
+```text
+META: score=0.898  — META: incerto (i=0.5) — massimo potere discriminante
+G_POTENZIALE_NULLA: score=0.703
+METRIC_TENSOR: score=0.624
+```
+
+La consecutio dagli ultimi tre run era stretta: molti osservabili collassano su una coordinata latente sotto partial-shuffle, e i due layer Markov sembrano rompersi allo stesso confine. La domanda non e' se quel risultato sia falso, ma se il confine misurato sia proprieta' del sistema o proprieta' dell'operatore di perturbazione.
+
+## Esperimento
+
+Strumento usato: `tools/exp_selective_layer_decoupling.py`
+
+Perimetro atomico:
+- dati: `primes` con 8000 gap, `GUE` con 175 spacing effettivi prodotti dal generatore corrente, `Poisson` con 8000 spacing;
+- perturbazioni: `uniform`, `Mk1`, `Mk2`;
+- alpha: `[0.0, 0.05, ..., 1.0]`;
+- surrogati per alpha: 8;
+- soglia operativa: primo alpha dove `|z| >= 2`;
+- seed: `20260505`.
+
+Nota di calcolo: il tentativo `N=60000, n_surr=20` non ha prodotto output in tempo utile; il report usa solo il run completato e dichiara il perimetro ridotto.
+
+## Risultato
+
+Nei primi, la perturbazione uniforme non rompe i layer insieme nel perimetro testato:
+
+| Observable | Layer | uniform | Mk1 | Mk2 |
+|---|---:|---:|---:|---:|
+| SR | L1 | 0.022 | 0.047 | 0.052 |
+| L1 | L1 | 0.086 | 0.034 | 0.077 |
+| SR2 | L2 | 0.584 | 0.466 | NEVER |
+| L2 | L2 | 0.335 | 0.296 | NEVER |
+| cond_entropy | L2 | 0.006 | 0.008 | 0.006 |
+| triple_var | L2 | 0.193 | 0.083 | 0.087 |
+
+Il dato centrale e' la scissione tra gli osservabili L2: `SR2` e `L2` sono preservati da Mk2 fino ad alpha=1.0, mentre `cond_entropy` e `triple_var` si rompono presto. Quindi "Layer 2" non e' atomico con questa famiglia di osservabili: contiene almeno due sottocanali, uno realmente recuperato dal surrogato Mk2 e uno sensibile alla discretizzazione/varianza della costruzione.
+
+Su GUE il campione effettivo e' piccolo (`N=175`), quindi il risultato e' solo indicativo:
+
+| Observable | Layer | uniform | Mk1 | Mk2 |
+|---|---:|---:|---:|---:|
+| SR | L1 | NEVER | NEVER | NEVER |
+| L1 | L1 | 0.399 | NEVER | NEVER |
+| SR2 | L2 | 0.947 | NEVER | NEVER |
+| L2 | L2 | 0.337 | 0.260 | 0.313 |
+| cond_entropy | L2 | NEVER | 0.188 | 0.662 |
+| triple_var | L2 | NEVER | NEVER | 0.350 |
+
+Poisson resta quasi nullo rispetto a SR/SR2/triple_var: molte curve non attraversano `|z| >= 2`. Questo e' coerente con un controllo a bassa struttura, non con una prova di assenza assoluta.
+
+## Taglio
+
+Il claim precedente "i due Markov layer sono coupled al boundary" va ristretto:
+
+**Nel perimetro partial-shuffle dei run precedenti, SR/L1/L2/SR2 mostravano una fase quasi comune. Nel perimetro selective-perturbation di questo run, la fase comune non e' stabile: i critical alpha dei primi separano L1 e L2, e Mk2 preserva SR2/L2 ma non cond_entropy/triple_var.**
+
+Questo non falsifica l'esistenza del boundary. Falsifica il framing piu' forte: "un boundary unico per i layer". Il confine osservato e' una superficie operatore-dipendente. Il terzo incluso operativo non e' il valore alpha in se': e' la trasformazione che decide quali correlazioni vengono conservate.
+
+## Vincolo emerso
+
+**CONSTRAINT on META + BOUNDARY**: non aggregare gli osservabili in "Layer 1" e "Layer 2" senza dichiarare l'operatore di perturbazione. Nel perimetro `N=8000, n_surr=8`, `cond_entropy` e `triple_var` non sono intercambiabili con `SR2/L2` come prove di Layer 2.
+
+Consecutio: il prossimo test deve separare "order-k Markov recovery" da "observable family recovery". La domanda corretta non e' piu' "quanti layer?", ma: quali osservabili sono invarianti rispetto all'operatore Mk2 e quali misurano artefatti di binning/varianza?
+
+## Auto-falsificazione con le 5 lenti
+
+L1 hard constraint vs bias: non uso "zero", "impossibile", "mai" come claim assoluti. `NEVER` significa solo "non attraversa `|z| >= 2` sugli alpha testati".
+
+L2 quantita' assoluta vs ratio: il confronto usa alpha critici e z-score, non percentuali tra spazi di taglia diversa. GUE ha perimetro ridotto (`N=175`) e non viene pesato come primes/Poisson.
+
+L3 no silent patching: il claim precedente viene ristretto esplicitamente. "Coupled boundary" resta valido solo per il partial-shuffle gia' misurato, non come proprieta' generale dei layer.
+
+L4 edge case isolation: `cond_entropy` e `triple_var` sono trattati come eccezioni operative dentro L2, non arrotondati dentro la media del layer.
+
+L5 re-discovery: il risultato e' metodologico sul lab, non marcato NEW. La nozione vicina e' nota: surrogati Markov di ordine diverso preservano statistiche di ordine diverso; qui il contenuto e' il vincolo sul framing D-ND, non la teoria dei surrogati.
+
+## Output
+
+Dati salvati in:
+
+```text
+tools/data/selective_layer_decoupling.json
+```
+
diff --git a/tools/data/seme.json b/tools/data/seme.json
index 856dd35d8dc95334f1cc7bdc4630f4eeac2702b0..90fb51d31c275610fdb57955224655564eaa1b6e
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -87,6 +87,16 @@
       "condensato_ref": null,
       "condensato_motivo": "Ricorrente (3x in 2 giorni) e fuori dalla mappa",
       "porta": "novità"
+    },
+    {
+      "tipo": "vincolo",
+      "id": "SELECTIVE_BOUNDARY_OPERATOR_DEPENDENCE",
+      "claim": "Il boundary dei layer Markov non va dichiarato unico senza fissare l'operatore di perturbazione. Nel perimetro N=8000, n_surr=8, Mk2 preserva SR2/L2 nei primi fino ad alpha=1.0 ma non preserva cond_entropy/triple_var.",
+      "intensità": 0.72,
+      "nota": "Report agent_20260505_1022. Corregge il framing dei run partial-shuffle: coupling valida nel perimetro uniforme, non come proprieta generale dei layer. Prossimo passo: separare recovery order-k da family recovery degli osservabili.",
+      "condensato_ref": "A2,A4,A9,A14",
+      "condensato_motivo": "A2/A9: il confine dipende dall'operatore che attraversa il boundary. A4: no silent patching del claim precedente. A14: il vincolo vive nel seme come restrizione di perimetro.",
+      "porta": "agent_20260505_1022"
     }
   ],
   "potenziale_bloccato": [],
@@ -265,4 +275,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}

exec
/bin/bash -lc 'python tools/structural_check.py tools/data/reports/agent_20260505_1022.md tools/data/seme.json' in /opt/MM_D-ND
 succeeded in 0ms:
Scansione 2 file...
Nessun anti-pattern trovato.

diff --git a/tools/data/reports/agent_20260505_1022.md b/tools/data/reports/agent_20260505_1022.md
new file mode 100644
index 0000000000000000000000000000000000000000..1c364b37df95af4089c09938ad2434b7a215a85d
--- /dev/null
+++ b/tools/data/reports/agent_20260505_1022.md
@@ -0,0 +1,90 @@
+# Agent Report — Selective Perturbations Break the Single-Boundary Framing
+
+## Campo
+
+Proiezione obbligatoria:
+
+```text
+META: score=0.898  — META: incerto (i=0.5) — massimo potere discriminante
+G_POTENZIALE_NULLA: score=0.703
+METRIC_TENSOR: score=0.624
+```
+
+La consecutio dagli ultimi tre run era stretta: molti osservabili collassano su una coordinata latente sotto partial-shuffle, e i due layer Markov sembrano rompersi allo stesso confine. La domanda non e' se quel risultato sia falso, ma se il confine misurato sia proprieta' del sistema o proprieta' dell'operatore di perturbazione.
+
+## Esperimento
+
+Strumento usato: `tools/exp_selective_layer_decoupling.py`
+
+Perimetro atomico:
+- dati: `primes` con 8000 gap, `GUE` con 175 spacing effettivi prodotti dal generatore corrente, `Poisson` con 8000 spacing;
+- perturbazioni: `uniform`, `Mk1`, `Mk2`;
+- alpha: `[0.0, 0.05, ..., 1.0]`;
+- surrogati per alpha: 8;
+- soglia operativa: primo alpha dove `|z| >= 2`;
+- seed: `20260505`.
+
+Nota di calcolo: il tentativo `N=60000, n_surr=20` non ha prodotto output in tempo utile; il report usa solo il run completato e dichiara il perimetro ridotto.
+
+## Risultato
+
+Nei primi, la perturbazione uniforme non rompe i layer insieme nel perimetro testato:
+
+| Observable | Layer | uniform | Mk1 | Mk2 |
+|---|---:|---:|---:|---:|
+| SR | L1 | 0.022 | 0.047 | 0.052 |
+| L1 | L1 | 0.086 | 0.034 | 0.077 |
+| SR2 | L2 | 0.584 | 0.466 | NEVER |
+| L2 | L2 | 0.335 | 0.296 | NEVER |
+| cond_entropy | L2 | 0.006 | 0.008 | 0.006 |
+| triple_var | L2 | 0.193 | 0.083 | 0.087 |
+
+Il dato centrale e' la scissione tra gli osservabili L2: `SR2` e `L2` sono preservati da Mk2 fino ad alpha=1.0, mentre `cond_entropy` e `triple_var` si rompono presto. Quindi "Layer 2" non e' atomico con questa famiglia di osservabili: contiene almeno due sottocanali, uno realmente recuperato dal surrogato Mk2 e uno sensibile alla discretizzazione/varianza della costruzione.
+
+Su GUE il campione effettivo e' piccolo (`N=175`), quindi il risultato e' solo indicativo:
+
+| Observable | Layer | uniform | Mk1 | Mk2 |
+|---|---:|---:|---:|---:|
+| SR | L1 | NEVER | NEVER | NEVER |
+| L1 | L1 | 0.399 | NEVER | NEVER |
+| SR2 | L2 | 0.947 | NEVER | NEVER |
+| L2 | L2 | 0.337 | 0.260 | 0.313 |
+| cond_entropy | L2 | NEVER | 0.188 | 0.662 |
+| triple_var | L2 | NEVER | NEVER | 0.350 |
+
+Poisson resta quasi nullo rispetto a SR/SR2/triple_var: molte curve non attraversano `|z| >= 2`. Questo e' coerente con un controllo a bassa struttura, non con una prova di assenza assoluta.
+
+## Taglio
+
+Il claim precedente "i due Markov layer sono coupled al boundary" va ristretto:
+
+**Nel perimetro partial-shuffle dei run precedenti, SR/L1/L2/SR2 mostravano una fase quasi comune. Nel perimetro selective-perturbation di questo run, la fase comune non e' stabile: i critical alpha dei primi separano L1 e L2, e Mk2 preserva SR2/L2 ma non cond_entropy/triple_var.**
+
+Questo non falsifica l'esistenza del boundary. Falsifica il framing piu' forte: "un boundary unico per i layer". Il confine osservato e' una superficie operatore-dipendente. Il terzo incluso operativo non e' il valore alpha in se': e' la trasformazione che decide quali correlazioni vengono conservate.
+
+## Vincolo emerso
+
+**CONSTRAINT on META + BOUNDARY**: non aggregare gli osservabili in "Layer 1" e "Layer 2" senza dichiarare l'operatore di perturbazione. Nel perimetro `N=8000, n_surr=8`, `cond_entropy` e `triple_var` non sono intercambiabili con `SR2/L2` come prove di Layer 2.
+
+Consecutio: il prossimo test deve separare "order-k Markov recovery" da "observable family recovery". La domanda corretta non e' piu' "quanti layer?", ma: quali osservabili sono invarianti rispetto all'operatore Mk2 e quali misurano artefatti di binning/varianza?
+
+## Auto-falsificazione con le 5 lenti
+
+L1 hard constraint vs bias: non uso "zero", "impossibile", "mai" come claim assoluti. `NEVER` significa solo "non attraversa `|z| >= 2` sugli alpha testati".
+
+L2 quantita' assoluta vs ratio: il confronto usa alpha critici e z-score, non percentuali tra spazi di taglia diversa. GUE ha perimetro ridotto (`N=175`) e non viene pesato come primes/Poisson.
+
+L3 no silent patching: il claim precedente viene ristretto esplicitamente. "Coupled boundary" resta valido solo per il partial-shuffle gia' misurato, non come proprieta' generale dei layer.
+
+L4 edge case isolation: `cond_entropy` e `triple_var` sono trattati come eccezioni operative dentro L2, non arrotondati dentro la media del layer.
+
+L5 re-discovery: il risultato e' metodologico sul lab, non marcato NEW. La nozione vicina e' nota: surrogati Markov di ordine diverso preservano statistiche di ordine diverso; qui il contenuto e' il vincolo sul framing D-ND, non la teoria dei surrogati.
+
+## Output
+
+Dati salvati in:
+
+```text
+tools/data/selective_layer_decoupling.json
+```
+
diff --git a/tools/data/seme.json b/tools/data/seme.json
index 856dd35d8dc95334f1cc7bdc4630f4eeac2702b0..90fb51d31c275610fdb57955224655564eaa1b6e
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -87,6 +87,16 @@
       "condensato_ref": null,
       "condensato_motivo": "Ricorrente (3x in 2 giorni) e fuori dalla mappa",
       "porta": "novità"
+    },
+    {
+      "tipo": "vincolo",
+      "id": "SELECTIVE_BOUNDARY_OPERATOR_DEPENDENCE",
+      "claim": "Il boundary dei layer Markov non va dichiarato unico senza fissare l'operatore di perturbazione. Nel perimetro N=8000, n_surr=8, Mk2 preserva SR2/L2 nei primi fino ad alpha=1.0 ma non preserva cond_entropy/triple_var.",
+      "intensità": 0.72,
+      "nota": "Report agent_20260505_1022. Corregge il framing dei run partial-shuffle: coupling valida nel perimetro uniforme, non come proprieta generale dei layer. Prossimo passo: separare recovery order-k da family recovery degli osservabili.",
+      "condensato_ref": "A2,A4,A9,A14",
+      "condensato_motivo": "A2/A9: il confine dipende dall'operatore che attraversa il boundary. A4: no silent patching del claim precedente. A14: il vincolo vive nel seme come restrizione di perimetro.",
+      "porta": "agent_20260505_1022"
     }
   ],
   "potenziale_bloccato": [],
@@ -265,4 +275,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}

codex
Eseguito esperimento e scritto il report in [agent_20260505_1022.md](/opt/MM_D-ND/tools/data/reports/agent_20260505_1022.md).

Risultato centrale: il framing “boundary unico dei layer Markov” va ristretto. Nel perimetro `N=8000, n_surr=8`, il confine dipende dall’operatore di perturbazione: `Mk2` preserva `SR2/L2` nei primi fino ad `alpha=1.0`, ma non preserva `cond_entropy/triple_var`.

Ho anche aggiornato [seme.json](/opt/MM_D-ND/tools/data/seme.json) con il vincolo `SELECTIVE_BOUNDARY_OPERATOR_DEPENDENCE`.

Verifiche fatte:
- `python -m json.tool tools/data/seme.json` OK
- `python tools/structural_check.py tools/data/reports/agent_20260505_1022.md tools/data/seme.json` senza anti-pattern
- dati esperimento salvati in `tools/data/selective_layer_decoupling.json`
diff --git a/tools/data/reports/agent_20260505_1022.md b/tools/data/reports/agent_20260505_1022.md
new file mode 100644
index 0000000000000000000000000000000000000000..1c364b37df95af4089c09938ad2434b7a215a85d
--- /dev/null
+++ b/tools/data/reports/agent_20260505_1022.md
@@ -0,0 +1,90 @@
+# Agent Report — Selective Perturbations Break the Single-Boundary Framing
+
+## Campo
+
+Proiezione obbligatoria:
+
+```text
+META: score=0.898  — META: incerto (i=0.5) — massimo potere discriminante
+G_POTENZIALE_NULLA: score=0.703
+METRIC_TENSOR: score=0.624
+```
+
+La consecutio dagli ultimi tre run era stretta: molti osservabili collassano su una coordinata latente sotto partial-shuffle, e i due layer Markov sembrano rompersi allo stesso confine. La domanda non e' se quel risultato sia falso, ma se il confine misurato sia proprieta' del sistema o proprieta' dell'operatore di perturbazione.
+
+## Esperimento
+
+Strumento usato: `tools/exp_selective_layer_decoupling.py`
+
+Perimetro atomico:
+- dati: `primes` con 8000 gap, `GUE` con 175 spacing effettivi prodotti dal generatore corrente, `Poisson` con 8000 spacing;
+- perturbazioni: `uniform`, `Mk1`, `Mk2`;
+- alpha: `[0.0, 0.05, ..., 1.0]`;
+- surrogati per alpha: 8;
+- soglia operativa: primo alpha dove `|z| >= 2`;
+- seed: `20260505`.
+
+Nota di calcolo: il tentativo `N=60000, n_surr=20` non ha prodotto output in tempo utile; il report usa solo il run completato e dichiara il perimetro ridotto.
+
+## Risultato
+
+Nei primi, la perturbazione uniforme non rompe i layer insieme nel perimetro testato:
+
+| Observable | Layer | uniform | Mk1 | Mk2 |
+|---|---:|---:|---:|---:|
+| SR | L1 | 0.022 | 0.047 | 0.052 |
+| L1 | L1 | 0.086 | 0.034 | 0.077 |
+| SR2 | L2 | 0.584 | 0.466 | NEVER |
+| L2 | L2 | 0.335 | 0.296 | NEVER |
+| cond_entropy | L2 | 0.006 | 0.008 | 0.006 |
+| triple_var | L2 | 0.193 | 0.083 | 0.087 |
+
+Il dato centrale e' la scissione tra gli osservabili L2: `SR2` e `L2` sono preservati da Mk2 fino ad alpha=1.0, mentre `cond_entropy` e `triple_var` si rompono presto. Quindi "Layer 2" non e' atomico con questa famiglia di osservabili: contiene almeno due sottocanali, uno realmente recuperato dal surrogato Mk2 e uno sensibile alla discretizzazione/varianza della costruzione.
+
+Su GUE il campione effettivo e' piccolo (`N=175`), quindi il risultato e' solo indicativo:
+
+| Observable | Layer | uniform | Mk1 | Mk2 |
+|---|---:|---:|---:|---:|
+| SR | L1 | NEVER | NEVER | NEVER |
+| L1 | L1 | 0.399 | NEVER | NEVER |
+| SR2 | L2 | 0.947 | NEVER | NEVER |
+| L2 | L2 | 0.337 | 0.260 | 0.313 |
+| cond_entropy | L2 | NEVER | 0.188 | 0.662 |
+| triple_var | L2 | NEVER | NEVER | 0.350 |
+
+Poisson resta quasi nullo rispetto a SR/SR2/triple_var: molte curve non attraversano `|z| >= 2`. Questo e' coerente con un controllo a bassa struttura, non con una prova di assenza assoluta.
+
+## Taglio
+
+Il claim precedente "i due Markov layer sono coupled al boundary" va ristretto:
+
+**Nel perimetro partial-shuffle dei run precedenti, SR/L1/L2/SR2 mostravano una fase quasi comune. Nel perimetro selective-perturbation di questo run, la fase comune non e' stabile: i critical alpha dei primi separano L1 e L2, e Mk2 preserva SR2/L2 ma non cond_entropy/triple_var.**
+
+Questo non falsifica l'esistenza del boundary. Falsifica il framing piu' forte: "un boundary unico per i layer". Il confine osservato e' una superficie operatore-dipendente. Il terzo incluso operativo non e' il valore alpha in se': e' la trasformazione che decide quali correlazioni vengono conservate.
+
+## Vincolo emerso
+
+**CONSTRAINT on META + BOUNDARY**: non aggregare gli osservabili in "Layer 1" e "Layer 2" senza dichiarare l'operatore di perturbazione. Nel perimetro `N=8000, n_surr=8`, `cond_entropy` e `triple_var` non sono intercambiabili con `SR2/L2` come prove di Layer 2.
+
+Consecutio: il prossimo test deve separare "order-k Markov recovery" da "observable family recovery". La domanda corretta non e' piu' "quanti layer?", ma: quali osservabili sono invarianti rispetto all'operatore Mk2 e quali misurano artefatti di binning/varianza?
+
+## Auto-falsificazione con le 5 lenti
+
+L1 hard constraint vs bias: non uso "zero", "impossibile", "mai" come claim assoluti. `NEVER` significa solo "non attraversa `|z| >= 2` sugli alpha testati".
+
+L2 quantita' assoluta vs ratio: il confronto usa alpha critici e z-score, non percentuali tra spazi di taglia diversa. GUE ha perimetro ridotto (`N=175`) e non viene pesato come primes/Poisson.
+
+L3 no silent patching: il claim precedente viene ristretto esplicitamente. "Coupled boundary" resta valido solo per il partial-shuffle gia' misurato, non come proprieta' generale dei layer.
+
+L4 edge case isolation: `cond_entropy` e `triple_var` sono trattati come eccezioni operative dentro L2, non arrotondati dentro la media del layer.
+
+L5 re-discovery: il risultato e' metodologico sul lab, non marcato NEW. La nozione vicina e' nota: surrogati Markov di ordine diverso preservano statistiche di ordine diverso; qui il contenuto e' il vincolo sul framing D-ND, non la teoria dei surrogati.
+
+## Output
+
+Dati salvati in:
+
+```text
+tools/data/selective_layer_decoupling.json
+```
+
diff --git a/tools/data/seme.json b/tools/data/seme.json
index 856dd35d8dc95334f1cc7bdc4630f4eeac2702b0..90fb51d31c275610fdb57955224655564eaa1b6e
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -87,6 +87,16 @@
       "condensato_ref": null,
       "condensato_motivo": "Ricorrente (3x in 2 giorni) e fuori dalla mappa",
       "porta": "novità"
+    },
+    {
+      "tipo": "vincolo",
+      "id": "SELECTIVE_BOUNDARY_OPERATOR_DEPENDENCE",
+      "claim": "Il boundary dei layer Markov non va dichiarato unico senza fissare l'operatore di perturbazione. Nel perimetro N=8000, n_surr=8, Mk2 preserva SR2/L2 nei primi fino ad alpha=1.0 ma non preserva cond_entropy/triple_var.",
+      "intensità": 0.72,
+      "nota": "Report agent_20260505_1022. Corregge il framing dei run partial-shuffle: coupling valida nel perimetro uniforme, non come proprieta generale dei layer. Prossimo passo: separare recovery order-k da family recovery degli osservabili.",
+      "condensato_ref": "A2,A4,A9,A14",
+      "condensato_motivo": "A2/A9: il confine dipende dall'operatore che attraversa il boundary. A4: no silent patching del claim precedente. A14: il vincolo vive nel seme come restrizione di perimetro.",
+      "porta": "agent_20260505_1022"
     }
   ],
   "potenziale_bloccato": [],
@@ -265,4 +275,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}

tokens used
86,793
Eseguito esperimento e scritto il report in [agent_20260505_1022.md](/opt/MM_D-ND/tools/data/reports/agent_20260505_1022.md).

Risultato centrale: il framing “boundary unico dei layer Markov” va ristretto. Nel perimetro `N=8000, n_surr=8`, il confine dipende dall’operatore di perturbazione: `Mk2` preserva `SR2/L2` nei primi fino ad `alpha=1.0`, ma non preserva `cond_entropy/triple_var`.

Ho anche aggiornato [seme.json](/opt/MM_D-ND/tools/data/seme.json) con il vincolo `SELECTIVE_BOUNDARY_OPERATOR_DEPENDENCE`.

Verifiche fatte:
- `python -m json.tool tools/data/seme.json` OK
- `python tools/structural_check.py tools/data/reports/agent_20260505_1022.md tools/data/seme.json` senza anti-pattern
- dati esperimento salvati in `tools/data/selective_layer_decoupling.json`
