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: 019e03f2-fcfc-71a2-85e3-1b7413d78f9a
--------
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_20260507_1938.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 campo vivo e il contesto operativo, poi scelgo un esperimento singolo coerente con eventuali direttive one-shot e scrivo il report nel path 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, discriminatore dipoli su segnali
- dnd_bloch_explorer.py: scan Bloch, φ emergente
- dnd_arxiv.py: cerca paper rilevanti su arXiv

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

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

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

## Errori già fatti — non ripeterli

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

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

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

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

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

**5. Usare lo stesso dato come input e come test.**
Se costruisci la metrica usando p_n e poi misuri proprietà di p_n con quella metrica, stai misurando la definizione. Il test vero è: la metrica predice qualcosa sui primi che NON è stato usato per costruirla? Se no, è circolare.

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

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

## Come evitarli

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

## Auto-evoluzione — il sistema corregge se stesso

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

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

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

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

## Cosa NON fare

- Non modificare CONDENSATO.md, KERNEL_SEED.md, o file del kernel
- Non committare — salva solo in tools/data/ e tools/exp_*.py
- Non inventare dati o risultati
- Non cercare φ — crea le condizioni, osserva cosa emerge
- Non superare 20 minuti di lavoro per ciclo
- Non produrre liste di possibilità — produci UNA risultante

## Formato report

```markdown
# Agent Report — TITOLO
**Date**: YYYY-MM-DD HH:MM
**Piano**: N
**Tension explored**: ID (intensità)

## Claim Under Test
> Il claim dalla tensione

## Question
La domanda che hai formulato

## Experiment Design
- Metrica, scope, null baseline, N campioni

## Results
Tabella con numeri reali

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

## Verdict
NEW / CONFIRMED / FALSIFIED / CONSTRAINT

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

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

Riferimenti: CONDENSATO A16, method/DND_POSSIBILITA.md.

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

## Bicono della scoperta — come compilarlo

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

**Esempio retroattivo — TWO_CHANNEL_DECOMPOSITION:**
- Radici: canale magnitudine · canale residuo (segno invertito — uno aggiunge,
  l'altro sottrae sulla PNT)
- Singolare: il segnale totale prima della separazione. Non esiste come ente
  autonomo, esiste solo come sovrapposizione dei due canali.
- Invariante: la chiusura algebrica del residuo al 3° ordine Markov.

exec
/bin/bash -lc "sed -n '1,260p' tools/data/agent_field_live.md" in /opt/MM_D-ND
 succeeded in 0ms:
Leggi tools/LAB_AGENT_CONTEXT.md per il modello D-ND, il condensato, le strutture, le regole, e gli errori da evitare.

## Orizzonte (telos del lab)
L'intento è **unificare la fisica usando il modello D-ND**. Le possibilità sono aperte.

## Run precedente: completato (?s).

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

## Tensioni attive (strutturali prime, vincoli in coda)
- [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
- [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
- [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.
- [META] (0.3)  11/11 PASS stratificato: 4 alto rischio tautologico, 6 data-independent

## 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
  "perimetro" → META_ASSERTION_GATE, ORDER_DENOMINATOR_GATE, G_BLANK_TO_SOURCE_FACE_GATE, G_UNDERLAY_HINGE_GATE, PERTURBATION_DENOMINATOR_GATE, BOUNDARY_LAYER_GATE
  "producono" → PERTURBATION_DENOMINATOR_GATE, DUALITA_DIPOLARE_VS_ILLUSORIA, TENSIONE_ENTITA
  "poisson" → PERTURBATION_DENOMINATOR_GATE, BOUNDARY_LAYER_GATE, BOUNDARY
  "confine" → TRASCENDENZA_LIMITE, BOUNDARY_LAYER_GATE, BOUNDARY
  "tutti" → G_UNDERLAY_HINGE_GATE, ORDER_DENOMINATOR_GATE, PIANO_PRIMARIO_DUE_ASSIOMI
Questo è dove il potenziale si concentra. Non ignorarlo.

## Ultimi 3 run — contesto storico (NON è da dove parti)
Sono atti compiuti, non direzione. La direzione del prossimo cycle la dà la tensione del seme su cui scegli di lavorare, non questi run.

### Agent Report — Blank To Source Hinge
Trovato: 1. **Q->G e orientabile solo come passaggio locale del lato blank.** Nel perimetro TQGE, Q e l'endpoint senza real_sourcing del blank; G e l'endpoint con real_sourcing. Il passaggio misurato e Q->G.
2. **L'orientabilita blank-to-source non e rara nel null.** Un lato blank adiacente a un lato real_so
Verdetto: **CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G non e un ponte QG gen

### Agent Report — TQGE Underlay Gate
Trovato: 1. **G non e il vertice unico della diversita operatoria.** Q, G ed E hanno tutti tre modi incidenti distinti. Il claim "G sotto tutto" non passa come centralita entropica locale.
2. **G e il solo hinge `blank + real_sourcing` nel perimetro TQGE.** Il vuoto QG e il sourcing reale GE si incontrano so
Verdetto: **CONSTRAINT on G_POTENZIALE_NULLA**: nel perimetro TQGE operator-taxonomy, G non va formulato come vertice globale "sotto tutto". G e il hinge locale

### Agent Report — META Assertion Gate
Trovato: 1. **Il PASS 11/11 non e un denominatore unico.** Sei test sopravvivono senza `tools/data`; cinque test cadono a SKIP quando le fixture spariscono.
2. **Il nucleo A1-A5 e prevalentemente algebra della regola.** A1, A4 e A5 sono identita o chiusure dirette della definizione; A2 e A3 misurano dinamica
Verdetto: **CONSTRAINT on META**: il campo non deve piu leggere `11/11 PASS` come evidenza singola. Nel perimetro `agent_20260507_1458`, la verifica si scinde i

## 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)
**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
**11. Dinamica autologica del Potenziale nel movimento con Bard**: Dinamica autologica del Potenziale nel movimento input e output a zero latenza Per dimostrare la possibilità nel movimento della Possibilità riduciamo i concetti del modello osservato al determinarsi dei proto assiomi e alla dinamica logica formalizzata in una Funzione matematica:Se c'è l'Io che dà 
**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

## 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:** G_POTENZIALE_NULLA (score=0.703)
  G_POTENZIALE_NULLA: legge di scala da raffinare

## Strategia del campo (leverage / rischi / punti ciechi)
- Pilastri (leverage): BOUNDARY_LAYER_GATE, ORDER_DENOMINATOR_GATE, META_ASSERTION_GATE
- Rischi (contraddizioni): G_UNDERLAY_HINGE_GATE, PERTURBATION_DENOMINATOR_GATE
- Punti ciechi: DUALITA_DIPOLARE_VS_ILLUSORIA, METRIC_TENSOR
- Cross-check: 4 confermati, 2 contestati su 15 tensioni

## Topologia del campo — la forma del grafo
Gradi teorie: Q=12, T=7, G=6, E=4, R=4
Dormienti (basso aggancio di scoperte): E, R
Struttura: 9 ponti, 1 vuoto(i), 6 scoperte, 20 cicli.
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 -t shared_memory/*.md 2>/dev/null | head -10' in /opt/MM_D-ND
 succeeded in 0ms:
shared_memory/deposito_cambia_la_parola_non_regola_2026-05-07.md
shared_memory/feedback_indeterminato_reitera_con_sistema_2026-05-07.md
shared_memory/README.md

exec
/bin/bash -lc "env | rg '"'^(ANTHROPIC_API_KEY|OPENAI_API_KEY)='"' || true" in /opt/MM_D-ND
 succeeded in 0ms:
codex
Il campo punta a `G_POTENZIALE_NULLA`; non ci sono API key paid esposte. Ora controllo memoria cross-agent, direttive one-shot e proiezione aggiornata prima di tagliare l’esperimento.
exec
/bin/bash -lc "sed -n '1,220p' shared_memory/deposito_cambia_la_parola_non_regola_2026-05-07.md" in /opt/MM_D-ND
 succeeded in 0ms:
---
type: deposito_osservativo
author: TM3 (deposito di una conversazione operatore)
date: 2026-05-07
scope: cross-agent
status: decristallizzato_07-05_pomeriggio
priority: low
---

# Deposito — non regola

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

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

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

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

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

E:

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

## Cosa significa

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

## Distinzione operativa che resta

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

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

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

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

## Cosa è stato decristallizzato

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

## Esempio dimostrativo (07/05)

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

## Anti-pattern futuro per TM3

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

## Cross-link

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

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

# Indeterminato → reitera con il sistema fino all'emersione

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

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

## Why

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

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

## How to apply (per qualsiasi agente)

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

## Anti-pattern

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

## Cross-link

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

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

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

## Pattern di scrittura

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

## Pattern di lettura

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

## Direzione bidirezionale

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

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

## Anti-pattern

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

exec
/bin/bash -lc "test -f tools/data/operator_directive.md && sed -n '1,220p' tools/data/operator_directive.md || true" in /opt/MM_D-ND
 succeeded in 0ms:
exec
/bin/bash -lc "sed -n '1,240p' tools/data/seme.json" in /opt/MM_D-ND
 succeeded in 0ms:
{
  "timestamp": "2026-05-07T18:08:43.365836",
  "piano": 80,
  "tensioni": [
    {
      "id": "OBSERVABLE_REGISTRY",
      "tipo": "vincolo",
      "claim": "Ogni script che usa observables canonici (SR, SR2, L1, L2, triple_var) deve importare la definizione da tools/observables_registry.py. Varianti devono usare nomi distinti (SR_local_rigidity, triple_var_normalized) — niente shadowing del nome canonico. Ogni report deve dichiarare 'observables_registry: VERSION' nel header.",
      "intensita": 1.0,
      "porta": "infrastructure",
      "manuale": true,
      "condensato_ref": "A14,A8",
      "origine": "cristallizzato 06/05 dalla consecutio del cycle 20260506_0625 (autopoietico self-finding)",
      "added_at": "2026-05-06T07:03:58.213606+00:00"
    },
    {
      "id": "PERTURBATION_DENOMINATOR_GATE",
      "tipo": "vincolo",
      "claim": "La dimensionalita di perturbazione va riportata solo insieme a PC2, versione observables_registry e gate original-vs-shuffle per osservabile. Nel perimetro 20260506_1941, Poisson e shuffle-primi producono rank_all ~1.8-2.0 con denominatori deboli; dopo gate abs(z)>=2 il rank stabile torna vicino a 1. Rank PCA non gated non e evidenza strutturale.",
      "intensita": 0.95,
      "porta": "META_BOUNDARY",
      "manuale": true,
      "condensato_ref": "A4,A8,A14,C2",
      "origine": "cycle agent_20260506_1941: perturbation rank size curve canonical observables",
      "added_at": "2026-05-06T19:41:00+00:00"
    },
    {
      "id": "BOUNDARY_LAYER_GATE",
      "tipo": "vincolo",
      "claim": "I claim GUE/Poisson boundary devono riportare layer map: versione observables_registry, lista osservabili canonici, z original-vs-shuffle per osservabile, set endpoint-stable, e finestra/layer con margine classificatorio ambiguo. Nel perimetro sintetico agent_20260507_0330, il confine GUE-Poisson e beta 0.3-0.4: margine 0.070-0.083, ambiguous fraction 0.812-0.875, mentre gli osservabili stabili collassano da ~3.3 a 1.6. Il polo Poisson e classificabile ma denominator-weak.",
      "intensita": 0.93,
      "porta": "META_BOUNDARY",
      "manuale": true,
      "condensato_ref": "A4,A8,A9,A14,C2",
      "origine": "cycle agent_20260507_0330: synthetic GUE-Poisson mixture layer gate",
      "added_at": "2026-05-07T03:30:00+00:00"
    },
    {
      "tipo": "vincolo",
      "id": "ORDER_DENOMINATOR_GATE",
      "claim": "Il denominator gate trasferisce come supporto one-sided dell'ordine quando l'ordine e visibile agli osservabili del perimetro, non come endpoint-stable support a due poli. Nel perimetro sintetico agent_20260507_0901, 4/4 domini non-BOUNDARY hanno endpoint_stable_observables=[] e polo coerente stable_count 3.0-5.0. Nel perimetro semi-reale agent_20260507_0923, primi e zeta trasferiscono (primi: SR,L1,triple_var; zeta: SR,L2), ma logistic_return_intervals e blank: stable_count coerente 0.0-0.2. Nel perimetro bridge agent_20260507_0942, prime_metric_delta_gamma_abs, prime_metric_dR_abs, zeta_trace_residual_step5_abs e hydrogen_bound_level_spacings trasferiscono su tutti i 5 osservabili canonici con endpoint_stable_observables=[]; e supporto perimetro-bridge, non universalita del gate. Nel perimetro logistic-native agent_20260507_1006, logistic_orbit_values trasferisce su block_entropy_deficit_k4 in run e seed check; logistic_symbolic_itinerary resta blank; logistic_return_intervals mostra recurrence_diag_mean solo nel run principale e torna blank nel seed check. La beta 0.10/0.30/0.40/0.50 resta coordinata del protocollo quando compare, non coordinata universale. Nel perimetro surrogate-contract agent_20260507_1042, logistic_orbit_values trasferisce solo tramite block_entropy_deficit_k4 e sopravvive a marginal_shuffle, circular_shift e block_shuffle in run e seed check; logistic_symbolic_itinerary resta blank; logistic_return_intervals non replica (recurrence_diag_mean compare contro marginal/block nel run principale ma sparisce nel seed check). Nel perimetro cyclic-cut agent_20260507_1419, il residuo logistic_orbit_values non e artefatto del taglio lineare: cyclic_block_entropy_deficit_k4 e invariato sotto rotazione e replica contro marginal_shuffle e block_shuffle size 4-256 in run e seed check. Logistic_symbolic_itinerary e logistic_return_intervals restano blank nel criterio replicato. Il supporto logistic rimasto e orbit-local block grammar, non return/generating-partition support.",
      "intensita": 0.92,
      "porta": "META",
      "manuale": true,
      "condensato_ref": "A4,A8,A14,C2",
      "origine": "cycle agent_20260507_0901 + agent_20260507_0923 + agent_20260507_0942 + agent_20260507_1006: transfer matrix sintetica, falsificazione semi-reale su primi/zeta/logistic returns, perimetri bridge metric/trace/QxE, e regressione logistic-native + agent_20260507_1042: surrogate contract logistic",
      "added_at": "2026-05-07T09:01:00+00:00"
    },
    {
      "tipo": "confine_inesplorato",
      "id": "TRASCENDENZA_LIMITE",
      "claim": "La trascendenza e il limite attuale del modello. I punti fissi relazionali (non solo phi ma la rete di punti fissi tra osservabili) possono rivelare il vero grafo della realta e pattern nelle matrici. Il confine non e nella matematica - e nel passaggio tra piani.",
      "intensita": 0.9,
      "nota": "Input operatore 2026-04-10. Tocca: confine del modello, struttura relazionale dei punti fissi. Consecutio: quali punti fissi relazionali emergono dalle 21 tensioni attuali? Il grafo e gia nei dati?",
      "manuale": true,
      "porta": "sessione_interattiva",
      "condensato_ref": "A3,A10",
      "condensato_motivo": "Estende A3 (punto fisso singolo) a rete relazionale. Tocca A10 (dipolo) come caso speciale."
    },
    {
      "tipo": "scoperta",
      "id": "DUALITA_DIPOLARE_VS_ILLUSORIA",
      "claim": "Due tipi di dualita: (1) dipolare - generativa, il modello (det=-1), (2) illusoria - dispersiva, entropia (det=+1). Le regole incoerenti producono la seconda. La dualita illusoria e entropia come dispersione, non come informazione.",
      "intensita": 0.9,
      "nota": "Input operatore 2026-04-10. Tocca: entropia come dispersione illusoria vs generazione dipolare. Consecutio: nel Lab i domini Poisson (entropia massima) mostrano dualita illusoria? I domini GUE (strutturati) mostrano dualita dipolare? Il drift verso Poisson (POISSON_CONVERGENCE) e perdita di dualita dipolare?",
      "manuale": true,
      "porta": "sessione_interattiva",
      "condensato_ref": "A2,A10,F5",
      "condensato_motivo": "Discrimina due forme di det. A2 (confine) e la soglia. A10 (dipolo) e il tipo 1. F5 (frame) misura la struttura D-ND che e tipo 1."
    },
    {
      "tipo": "scoperta_numerica",
      "id": "METRIC_TENSOR",
      "claim": "Il tensore metrico dei primi è g=(p/2)². Nel tempo ln(p), è de Sitter 1+1D. z=-8.8 curvatura vs z=+22.5 rapporti ΔΓ.",
      "intensità": 0.9,
      "nota": "Sessione interattiva 4 aprile. Verificato su 78K primi.",
      "manuale": true,
      "porta": "sessione_interattiva",
      "condensato_ref": null,
      "condensato_motivo": "Risultato numerico verificato, non-tautologico"
    },
    {
      "tipo": "vincolo",
      "id": "META_ASSERTION_GATE",
      "claim": "Il PASS 11/11 della verifica non e un denominatore unico. Nel perimetro agent_20260507_1458, 6/11 test passano anche senza tools/data; 5/11 dipendono da fixture o contesto; 4/11 PASS sono algebra/same-rule ad alto rischio tautologico. La tensione META va riportata con gate_class, no_data_status e data_dependency per test.",
      "intensita": 0.88,
      "manuale": true,
      "porta": "META",
      "condensato_ref": "A4,A8,A12,C2",
      "origine": "cycle agent_20260507_1458: meta_assertion_gate su dipartimento.py verifica_asserzioni",
      "added_at": "2026-05-07T14:58:00+00:00"
    },
    {
      "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": "vincolo",
      "id": "G_UNDERLAY_HINGE_GATE",
      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1751, G non e vertice globale sotto tutto: Q, G ed E hanno tutti entropia di modo 1.584963. G e il solo hinge osservato dove QG blank e GE real_sourcing si incontrano; i triangoli vuoti sono TQG e QGE, mentre TGE e TQE restano pieni. La consecutio e misurare l'operatore di deposito Q->G come passaggio blank-to-source, non cercare un ponte QG generico.",
      "intensita": 0.84,
      "manuale": true,
      "porta": "G_POTENZIALE_NULLA",
      "condensato_ref": "A4,A8,A9,A14",
      "origine": "cycle agent_20260507_1751: tqge_underlay_gate su tassonomia operatori TQGE",
      "added_at": "2026-05-07T17:51:00+00:00"
    },
    {
      "tipo": "vincolo",
      "id": "G_BLANK_TO_SOURCE_FACE_GATE",
      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1804, l'operatore di deposito Q->G non e un ponte QG generico: e la faccia QGE. QG porta il blank, GE porta real_sourcing, QE porta gauge_phase; TQG contiene lo stesso blank ma resta senza sorgente. L'orientabilita blank-to-source generica e frequente nel null count-preserving (p=0.8), quindi il claim valido e scoped alla localizzazione QGE, non a una rarita statistica.",
      "intensita": 0.83,
      "manuale": true,
      "porta": "G_POTENZIALE_NULLA",
      "condensato_ref": "A4,A8,A9,A14",
      "origine": "cycle agent_20260507_1804: blank_to_source_hinge su facce TQGE",
      "added_at": "2026-05-07T18:04:00+00:00"
    },
    {
      "tipo": "confine_inesplorato",
      "id": "BOUNDARY",
      "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
      "intensità": 0.8,
      "nota": "Il segnale non-triviale è DOVE la scissione cambia natura, non che converge a φ",
      "condensato_ref": "A9",
      "condensato_motivo": "Overlap termini con A9 (5 termini)",
      "porta": "condensato"
    },
    {
      "tipo": "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": "11/11 PASS stratificato: 4 alto rischio tautologico, 6 data-independent",
      "intensità": 0.3,
      "nota": "Stratificazione META applicata via meta_assertion_gate (cycle 1458). Non chiude — apre sotto-tensioni per gate_class.",
      "condensato_ref": "A4,A12,C2",
      "porta": "verify_assertions_META_STRATIFIED",
      "stratificato": true,
      "n_high_tautology": 4,
      "n_data_independent": 6,
      "condensato_motivo": "Ricorrente (3x in 2 giorni) e fuori dalla mappa"
    }
  ],
  "potenziale_bloccato": [],
  "varianza": [
    "Tensioni risolte: {'G_UNDERLAY_HINGE_GATE', 'ORDER_DENOMINATOR_GATE', 'OBSERVABLE_REGISTRY', 'TRASCENDENZA_LIMITE', 'BOUNDARY_LAYER_GATE', 'TENSIONE_ENTITA', 'G_POTENZIALE_NULLA', 'PERTURBATION_DENOMINATOR_GATE', 'DUALITA_DIPOLARE_VS_ILLUSORIA', 'PIANO_PRIMARIO_DUE_ASSIOMI', 'META_ASSERTION_GATE', 'METRIC_TENSOR', 'G_BLANK_TO_SOURCE_FACE_GATE'}"
  ],
  "filtro": {
    "promosse": 15,
    "filtrate": 0,
    "condensato_claims": 30
  },
  "direzione": "Esplorare il confine: 8 domini GUE, 5 Poisson — il confine è 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 — 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 è costruita sopra alla meccanica — è 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×velocità"
        },
        {
          "coppia": "ExT",
          "ponte": "tensore EM dentro la forma simplettica",
          "nota": "il campo EM conta stati in configurazione posizione×tempo"
        }
      ],
      "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",

exec
/bin/bash -lc 'python tools/dnd_scenario.py --best' in /opt/MM_D-ND
 succeeded in 159ms:
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
META: score=0.611  — META: incerto (i=0.3) — massimo potere discriminante

codex
La memoria recente rafforza due vincoli: non irrigidire frasi in regole e, se il parametro è ambiguo, far girare un atto minimo. Scelgo quindi il nodo regressivo aperto da G: non “G sotto tutto”, già vincolato, ma la trasferibilità della faccia blank-to-source fuori dal solo TQGE.
exec
/bin/bash -lc 'rg -n "operator-taxonomy|blank_to_source|TQGE|G_UNDERLAY|G_BLANK|tqge|source" tools -S' in /opt/MM_D-ND
 succeeded in 0ms:
tools/data/video_feed.json:8:      "source": "TM1",
tools/data/video_feed.json:26:      "source": "TM1",
tools/data/video_feed.json:41:      "rilevanza_lab": "MCMC come motore esplorativo per lo spazio parametri del tetraedro TQGE. Pattern proposal→accept/reject→converge = ciclo Lab.",
tools/data/video_feed.json:48:      "source": "operatore + SCE dnd_computing",
tools/data/video_feed.json:53:      "digest": "Extropic builds thermodynamic computing — harnesses thermal noise instead of fighting it. Pivot from quantum computing. Finite temperature as resource, not enemy. Entropy as computation. Direct connection to tetrahedron T (thermodynamics) and the concept that noise/entropy can be generative (dipolar duality, not illusory).",
tools/data/video_feed.json:60:      "source": "operatore + SCE dnd_computing",
tools/data/video_feed.json:72:      "source": "operatore + SCE dnd_teorie",
tools/evolution_report.md:17:mostrare che l'adiacenza blank-to-source non discrimina. Dopo quel punto, ogni
tools/evolution_report.md:23:"lato QG blank + lato GE source + chiusura di faccia QGE". La condizione
tools/evolution_report.md:32:- Generalizzare `blank_to_source_hinge` come osservabile di faccia: blank edge,
tools/evolution_report.md:33:  source edge, vertice condiviso, lato mediatore e facce escluse.
tools/evolution_report.md:34:- Testare se altri perimetri TQGE producono deposito solo quando blank e source
tools/evolution_report.md:36:- Usare TQG come contro-perimetro nativo: blank presente, source assente,
tools/evolution_report.md:43:`blank + gauge + source`, con QGE come faccia viva e TQG come contro-perimetro.
tools/bicono_projection.py:225:    proj['source_report'] = str(report_path.name)
tools/bicono_projection.py:267:    if p.get('source_report'): out.append(f"Report: {p['source_report']}")
tools/LAB_AGENT_CONTEXT.md:52:- Tetraedro TQGE: 4 vertici (T,Q,G,E), 6 lati con perno i, 5 ponti, 1 vuoto (QxG)
tools/LAB_AGENT_CONTEXT.md:140:- dnd_teoria.py: 5 teorie codificate come dipoli (TQGE+R), 13 dipoli, isomorfie cross-teoria
tools/dipartimento.py:83:        'source': 'DND_METHOD_AXIOMS §3',
tools/dipartimento.py:90:        'source': 'DND_AUTOLOGIC',
tools/dipartimento.py:97:        'source': 'KERNEL_MM §IV',
tools/dipartimento.py:104:        'source': 'Cristallizzazione Möbius',
tools/dipartimento.py:111:        'source': 'Cristallizzazione Möbius',
tools/dipartimento.py:118:        'source': 'Paper C §4.3',
tools/dipartimento.py:125:        'source': 'Paper C §4.3',
tools/dipartimento.py:132:        'source': 'Paper C §3.3',
tools/dipartimento.py:139:        'source': 'Paper G, Bloch explorer',
tools/dipartimento.py:146:        'source': 'Paper G, test onesto 7/7',
tools/dipartimento.py:154:        'source': 'Autoricerca sessione 2026-03-01',
tools/dipartimento.py:1246:        'source': 'dnd-engine',
tools/diagram_nodi_paper_map.py:6:- 9 source nodes (rows) vs 7 papers (columns)
tools/dnd_bloch_explorer.py:269:        best_source = None
tools/dnd_bloch_explorer.py:280:                    best_source = 'rise/fall'
tools/dnd_bloch_explorer.py:291:                best_source = 'interval_ratio'
tools/dnd_bloch_explorer.py:302:                best_source = 'phase_accumulation'
tools/dnd_bloch_explorer.py:316:                    best_source = 'phase_velocity'
tools/dnd_bloch_explorer.py:324:            'best_source': best_source,
tools/dnd_bloch_explorer.py:329:                  f"best φ-dist={best_phi_dist:.4f} ({best_source})", flush=True)
tools/dnd_bloch_explorer.py:351:              f"(ratio={entry['best_ratio']:.6f}, source={entry['best_source']}) ---")
tools/dnd_bloch_explorer.py:504:                      f"ratio={top['best_ratio']:.6f} ({top['best_source']}) ***")
tools/dnd_bloch_explorer.py:514:                    'best_source': r['best_source'],
tools/dnd_bloch_explorer.py:560:        print(f"Source: {results[0]['best_source']}")
tools/dnd_bloch_explorer.py:580:                'best_source': r['best_source'],
tools/godel.py:48:def ask(question, source=None, mode=None, protocol=None):
tools/godel.py:51:    if source:
tools/godel.py:52:        payload["source"] = source
tools/godel.py:149:    source = None
tools/godel.py:157:        if args[i] == "--source" and i + 1 < len(args):
tools/godel.py:158:            source = args[i + 1]; i += 2
tools/godel.py:184:        if not source:
tools/godel.py:185:            source = cfg.get("nodo")
tools/godel.py:210:    result = ask(question, source=source, mode=mode, protocol=protocol)
tools/md_to_site_B.py:143:    # Read source
tools/md_to_site_B.py:144:    source_file = INPUT_DIR / "paper_B_draft3.md"
tools/md_to_site_B.py:145:    content = source_file.read_text()
tools/md_to_site_B.py:146:    print(f"Read {len(content)} chars from {source_file.name}")
tools/GUIDA_CEC.md:76:**Tool**: Godel bridge (:3004) — `curl -X POST localhost:3004/ask -d '{"question":"...", "source":"TMx"}'`
tools/GUIDA_CEC.md:297:Venv: `source tools/.venv/bin/activate` (Linux) o `tools\.venv\Scripts\activate` (Windows).
tools/generate_tensions_json.sh:18:source "$VENV"
tools/generate_tensions_json.sh:41:foods = [f for f in foods if not any(p in f.get('source','') for p in EXCLUDE_PATTERNS)]
tools/generate_tensions_json.sh:58:    f['source'] = f['source'].replace('/opt/', '')
tools/generate_tensions_json.sh:63:    'sources': ['MM_D-ND', 'THIA'],
tools/generate_tensions_json.sh:74:source /opt/THIA/.env 2>/dev/null || true
tools/STRUMENTI.json:8:      "chiama_con": "curl -X POST localhost:3004/ask -d '{\"question\":\"...\",\"source\":\"TM3\"}'",
tools/STRUMENTI.json:77:      "chiama_con": "node godel_distilla.js 'tensione' --source TM3",
tools/GUIDA_EXPLORER_TM1.md:44:Output: lista ordinata per qualita'. Ogni tensione ha tipo, contenuto, source, qualita'.
tools/GUIDA_EXPLORER_TM1.md:87:| `tensions_raw.json` | TM3 (cron 5:17) | `{generated, count, sources, tensions: [...]}` — 20 item, tipi tecnici | Ciclo TM3 (explorer -> Godel -> seme) |
tools/GUIDA_EXPLORER_TM1.md:126:// { type, content, quality, boosts[], source, line, context }
tools/md_to_site_F.py:143:    # Read source
tools/md_to_site_F.py:144:    source_file = INPUT_DIR / "paper_F_draft2.md"
tools/md_to_site_F.py:145:    content = source_file.read_text()
tools/md_to_site_F.py:146:    print(f"Read {len(content)} chars from {source_file.name}")
tools/data/reports/agent_20260424_0330.md:49:5. **META constraint confirmed.** A binary GUE/Poisson test that doesn't include a shuffle control conflates the two mechanisms. Testing "is r closer to 0.53 or 0.39?" is necessary but insufficient — it doesn't distinguish whether the ordering or the distribution is the source.
tools/validate_tension_mapping.py:8:2. Fa keyword-scan contro lessico TQGE+R curato
tools/validate_tension_mapping.py:38:# Lessico TQGE+R — termini che identificano ogni teoria nel linguaggio naturale
tools/build_lab_graph.py:5:Nodi: teorie (TQGE+R+S), scoperte, tensioni attive
tools/build_lab_graph.py:170:                    'source': 'session',
tools/build_lab_graph.py:179:                'source': 'metric',
tools/build_lab_graph.py:272:    - source_tension: id della tensione primaria che ha generato la scoperta
tools/build_lab_graph.py:288:    # Mappa tension_id → tensione completa (per source_tension lookup)
tools/build_lab_graph.py:291:    # Mappa feed date → tension IDs (per report source_tension)
tools/build_lab_graph.py:342:            src = node.get('source', '')
tools/build_lab_graph.py:359:        # === source_tension (scoperte/report) ===
tools/build_lab_graph.py:360:        if ntype == 'report' and not node.get('source_tension'):
tools/build_lab_graph.py:365:                node['source_tension'] = tids[0]
tools/build_lab_graph.py:377:                    node['source_tension'] = matches[0]
tools/build_lab_graph.py:381:        elif ntype == 'scoperta' and not node.get('source_tension'):
tools/build_lab_graph.py:386:                if e.get('source') == node['id'] and e.get('tipo') == 'scoperta':
tools/build_lab_graph.py:395:                node['source_tension'] = matches[0]
tools/build_lab_graph.py:400:                node['source_tension'] = 'G_POTENZIALE_NULLA'
tools/build_lab_graph.py:472:        connections.setdefault(e['source'], set()).add(e['target'])
tools/build_lab_graph.py:473:        connections.setdefault(e['target'], set()).add(e['source'])
tools/build_lab_graph.py:482:            n_ponti = sum(1 for e in edges if (e['source'] == nid or e['target'] == nid) and e.get('ponte'))
tools/build_lab_graph.py:483:            n_scoperte = sum(1 for e in edges if (e['source'] == nid or e['target'] == nid) and e.get('tipo') == 'scoperta')
tools/build_lab_graph.py:484:            n_report = sum(1 for e in edges if (e['source'] == nid or e['target'] == nid) and e.get('tipo') == 'report')
tools/build_lab_graph.py:486:            vuoti = [e for e in edges if (e['source'] == nid or e['target'] == nid) and e.get('vuoto')]
tools/build_lab_graph.py:489:                other = vuoti[0]['target'] if vuoti[0]['source'] == nid else vuoti[0]['source']
tools/build_lab_graph.py:500:            teoria_ids = [e['target'] for e in edges if e['source'] == nid and e.get('tipo') == 'scoperta']
tools/build_lab_graph.py:504:                    {e['source'], e['target']} == set(teoria_ids[:2]) and e.get('ponte'))
tools/build_lab_graph.py:537:        for key in ('source', 'target'):
tools/build_lab_graph.py:539:            other = e['target'] if key == 'source' else e['source']
tools/build_lab_graph.py:548:        existing_pairs.add(frozenset([e['source'], e['target']]))
tools/build_lab_graph.py:554:            if e['source'] == a['id']:
tools/build_lab_graph.py:559:                source_node = next((n for n in nodes if n['id'] == e['source']), None)
tools/build_lab_graph.py:560:                if source_node and source_node['type'] == 'teoria':
tools/build_lab_graph.py:561:                    a_teorie.add(e['source'])
tools/build_lab_graph.py:569:                if e['source'] == b['id']:
tools/build_lab_graph.py:574:                    tn = next((n for n in nodes if n['id'] == e['source']), None)
tools/build_lab_graph.py:576:                        b_teorie.add(e['source'])
tools/build_lab_graph.py:601:                ghost_edges.append({'source': gid, 'target': a['id'], 'tipo': 'ghost'})
tools/build_lab_graph.py:602:                ghost_edges.append({'source': gid, 'target': b['id'], 'tipo': 'ghost'})
tools/build_lab_graph.py:617:        degree[e['source']] = degree.get(e['source'], 0) + 1
tools/build_lab_graph.py:647:            'source': a,
tools/build_lab_graph.py:681:            'color': DISC_COLORS.get(d['source'], '#22d3ee'),
tools/build_lab_graph.py:683:            'source': d['source'],
tools/build_lab_graph.py:687:                'source': node_id,
tools/build_lab_graph.py:722:                'source': node_id,
tools/build_lab_graph.py:738:    # --- EVOLUTION FIELDS (freshness, maturity, source_tension, ghost_urgency) ---
tools/build_lab_graph.py:743:    # - source_tension / related_tensions → hover per highlight tensioni origine
tools/build_lab_graph.py:760:                {'label': edge['ponte'], 'id': f"{edge['source']}x{edge['target']}"},
tools/dnd_arxiv.py:244:            'source': 'arxiv',
tools/exp_blank_to_source_hinge.py:3:exp_blank_to_source_hinge.py
tools/exp_blank_to_source_hinge.py:5:Regressive gate for G_POTENZIALE_NULLA after tqge_underlay_gate.
tools/exp_blank_to_source_hinge.py:9:as a passage: blank endpoint without source -> blank endpoint with source.
tools/exp_blank_to_source_hinge.py:103:    source_endpoints = [v for v, c in context.items() if c["has_real_sourcing"]]
tools/exp_blank_to_source_hinge.py:104:    non_source_endpoints = [v for v, c in context.items() if not c["has_real_sourcing"]]
tools/exp_blank_to_source_hinge.py:106:    if len(source_endpoints) == 1 and len(non_source_endpoints) == 1:
tools/exp_blank_to_source_hinge.py:108:            "from": non_source_endpoints[0],
tools/exp_blank_to_source_hinge.py:109:            "to": source_endpoints[0],
tools/exp_blank_to_source_hinge.py:110:            "label": f"{non_source_endpoints[0]}->{source_endpoints[0]}",
tools/exp_blank_to_source_hinge.py:121:    source_profile = None
tools/exp_blank_to_source_hinge.py:122:    if source_endpoints:
tools/exp_blank_to_source_hinge.py:123:        source_profile = "+".join(context[source_endpoints[0]]["incident_nonblank_modes"])
tools/exp_blank_to_source_hinge.py:131:        "source_endpoints_on_blank": source_endpoints,
tools/exp_blank_to_source_hinge.py:132:        "non_source_endpoints_on_blank": non_source_endpoints,
tools/exp_blank_to_source_hinge.py:134:        "source_endpoint_profile": source_profile,
tools/exp_blank_to_source_hinge.py:151:    source_endpoint_profiles = Counter()
tools/exp_blank_to_source_hinge.py:174:        if result["source_endpoint_profile"]:
tools/exp_blank_to_source_hinge.py:175:            source_endpoint_profiles[result["source_endpoint_profile"]] += 1
tools/exp_blank_to_source_hinge.py:190:        "source_endpoint_profile_counts": dict(sorted(source_endpoint_profiles.items())),
tools/exp_blank_to_source_hinge.py:199:        "experiment": "blank_to_source_hinge",
tools/exp_blank_to_source_hinge.py:200:        "source": {
tools/exp_blank_to_source_hinge.py:202:                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
tools/exp_blank_to_source_hinge.py:209:                "count-preserving null by permuting edge modes over the six TQGE edges",
tools/dnd.py:155:    payload = json.dumps({"question": tensione, "source": "TM3", "mode": "filter"}).encode()
tools/lab_valutatore.py:59:# Context enrichment sources (v2 — full awareness)
tools/exp_markov_k_direction.py:18:  3. Per-source shuffle baseline (each surrogate vs its own permutation)
tools/exp_markov_k_direction.py:58:    """Shuffle mean of (SR, L1) — per-source baseline."""
tools/exp_markov_k_direction.py:236:        'method': f'{nb} equal-count bins, per-source shuffle baseline, gap-pool sampling',
tools/exp_duality_gate_transfer.py:254:    source = gated_classification if gate["endpoint_stable_observables"] else all_classification
tools/exp_duality_gate_transfer.py:259:        layer = source["layers"].get(key, {})
tools/add_video_to_feed.py:43:    video_data.setdefault('source', 'TM1')
tools/lab_agent.sh:24:    source /opt/THIA/.env
tools/lab_agent.sh:69:source "$TOOLS_DIR/.venv/bin/activate" 2>/dev/null
tools/lab_agent.sh:106:source "$TOOLS_DIR/.venv/bin/activate" 2>/dev/null
tools/lab_agent.sh:381:source "$TOOLS_DIR/.venv/bin/activate" 2>/dev/null
tools/lab_agent.sh:567:    # 10. SEMANTIC BRIDGE — scoperte numeriche → annotazioni pair TQGE+R
tools/lab_agent.sh:568:    # Legge ultimo agent_report, mappa source_tension via tension_to_theory.json,
tools/lab_agent.sh:576:    echo "--- 10. SEMANTIC BRIDGE (lab → teorie TQGE+R) ---"
tools/dnd_lab_team.py:191:TETRAEDRO TQGE: 4 facce, tutte con perno i.
tools/md_to_site.py:198:    # Read source
tools/md_to_site.py:199:    source_file = INPUT_DIR / "paper_C_draft2.md"
tools/md_to_site.py:200:    content = source_file.read_text()
tools/md_to_site.py:201:    print(f"Read {len(content)} chars from {source_file.name}")
tools/dnd_domandatore.py:126:        banco['_source'] = 'catalogo'
tools/dnd_domandatore.py:131:        banco['_source'] = 'generato'
tools/dnd_domandatore.py:136:    banco['_source'] = 'fallback'
tools/dnd_domandatore.py:150:    source = banco.pop('_source', '?')
tools/dnd_domandatore.py:154:        'ipotesi': f'Il duale di "{claim[:50]}" [{source}: {banco.get("dominio", "?")}]',
tools/dnd_M_operator.py:54:        'ignoto_source': 'result',  # il risultato genera la prossima domanda
tools/dnd_M_operator.py:60:        'ignoto_source': 'implication',  # l'implicazione genera la domanda
tools/dnd_M_operator.py:66:        'ignoto_source': 'gap',  # il gap genera la domanda
tools/dnd_M_operator.py:72:        'ignoto_source': 'tension',
tools/dnd_M_operator.py:78:        'ignoto_source': 'none',
tools/dnd_M_operator.py:84:        'ignoto_source': 'none',
tools/dnd_M_operator.py:105:def registra_orientamento(insight_text, source='operatore', state=None):
tools/dnd_M_operator.py:125:        'source': source,
tools/dnd_piano11.py:469:                "source": "V(r) = -ln(r) - r + r²/2",
tools/dnd_piano11.py:476:                "source": "det(M) = -1 → Q(√5) → L(s, χ₅)",
tools/data/reports/agent_20260501_0931.md:19:- **GUE source**: 60 matrices of size 300, bulk 60% (central eigenvalues), mean-normalized
tools/md_to_site_D.py:143:    # Read source
tools/md_to_site_D.py:144:    source_file = INPUT_DIR / "paper_D_draft2.md"
tools/md_to_site_D.py:145:    content = source_file.read_text()
tools/md_to_site_D.py:146:    print(f"Read {len(content)} chars from {source_file.name}")
tools/exp_logistic_surrogate_contract_gate.py:132:        "source": {
tools/exp_logistic_surrogate_contract_gate.py:148:            "n": data["source"]["n"],
tools/dnd_incrocio.py:835:    conoscenza['meta']['refresh_source'] = 'dnd_incrocio.rigenera_conoscenza_teorie'
tools/exp_semireal_order_denominator_gate.py:253:        "source": {
tools/exp_semireal_order_denominator_gate.py:282:            "n_gaps": data["source"]["n_gaps"],
tools/cron_dipartimento.sh:20:    source "$VENV"
tools/exp_boundary_mixture_gate.py:256:        source = gated_classification if gate["endpoint_stable_observables"] else all_classification
tools/exp_boundary_mixture_gate.py:257:        layer = source["layers"].get(key, {})
tools/exp_logistic_cyclic_block_entropy_gate.py:138:        "source": {
tools/exp_logistic_cyclic_block_entropy_gate.py:167:            "n": data["source"]["n"],
tools/README.md:6:Venv: `source .venv/bin/activate` prima di eseguire.
tools/data/reports/agent_20260507_1751.md:1:# Agent Report — TQGE Underlay Gate
tools/data/reports/agent_20260507_1751.md:6:**observables_used**: [] — tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
tools/data/reports/agent_20260507_1751.md:12:Nel tetraedro TQGE, G ha una firma operativa distinta dai vertici ordinari quando i sei lati sono classificati per tipo di operatore: Wick-tempo, fase-gauge, sourcing reale, blank?
tools/data/reports/agent_20260507_1751.md:15:- Strumento: `tools/exp_tqge_underlay_gate.py`
tools/data/reports/agent_20260507_1751.md:16:- Scope: sei lati TQGE depositati nel contesto Lab.
tools/data/reports/agent_20260507_1751.md:43:2. **G e il solo hinge `blank + real_sourcing` nel perimetro TQGE.** Il vuoto QG e il sourcing reale GE si incontrano solo in G. Questo dato e verificato nel catalogo dei lati; il null mostra che la congiunzione non e rara in astratto, quindi il contenuto non e "unicita statistica", ma localizzazione del nodo regressivo.
tools/data/reports/agent_20260507_1751.md:47:**CONSTRAINT on G_POTENZIALE_NULLA**: nel perimetro TQGE operator-taxonomy, G non va formulato come vertice globale "sotto tutto". G e il hinge locale tra QG blank e GE real_sourcing. La consecutio non e cercare un ponte QG generico; e misurare l'operatore di deposito che trasforma un blank quantistico-gravitazionale in sourcing reale.
tools/data/reports/agent_20260507_1751.md:53:- **Campo di possibilita**: qui diventa possibile cercare l'operatore di deposito Q->G come passaggio blank-to-source; qui diventa non-possibile trattare G come prova globale di underlay su tutti i lati TQGE.
tools/data/reports/agent_20260507_1751.md:63:- `tools/exp_tqge_underlay_gate.py`
tools/data/reports/agent_20260507_1751.md:64:- `tools/data/tqge_underlay_gate_20260507_1751.json`
tools/dnd_autoricerca.py:2061:            'source': 'lab',
tools/semantic_bridge.py:4:semantiche sul grafo conoscenza TQGE+R.
tools/semantic_bridge.py:8:teorie TQGE+R restano fisse, statiche. Le scoperte non sedimentano
tools/semantic_bridge.py:13:2. Estrae la source_tension (o tensions multiple dal corpo)
tools/semantic_bridge.py:197:    """Dato set di tensioni → list di (pair_key, [tensioni source]).
tools/semantic_bridge.py:204:    source_tensions_per_theory = {}
tools/semantic_bridge.py:210:            source_tensions_per_theory.setdefault(th, []).append(t)
tools/semantic_bridge.py:216:        # source: unione delle tensioni che hanno toccato a o b
tools/semantic_bridge.py:217:        src = sorted(set(source_tensions_per_theory.get(a, [])) | set(source_tensions_per_theory.get(b, [])))
tools/semantic_bridge.py:222:def validate_insight(pair: str, insight: dict, source_file: str) -> list[dict]:
tools/semantic_bridge.py:249:            'source': source_file,
tools/semantic_bridge.py:264:                    'source': source_file,
tools/semantic_bridge.py:277:            'source': source_file,
tools/semantic_bridge.py:291:                'source': source_file,
tools/semantic_bridge.py:329:    for pk, source_tensions in pairs:
tools/semantic_bridge.py:332:        dedup_key = (meta['date'], tuple(source_tensions))
tools/semantic_bridge.py:338:            'tensions': source_tensions,
tools/semantic_bridge.py:456:        'source': 'evolution',
tools/semantic_bridge.py:469:    for pk, source_tensions in pairs:
tools/semantic_bridge.py:471:        # Dedup: (date, tensions, source=evolution) — distinto da agent anche per stessa data
tools/semantic_bridge.py:472:        dedup_key = (meta['date'], tuple(source_tensions), 'evolution')
tools/semantic_bridge.py:474:            (it.get('date'), tuple(it.get('tensions') or []), it.get('source') or 'agent')
tools/semantic_bridge.py:481:            'tensions': source_tensions,
tools/semantic_bridge.py:486:            'source': 'evolution',
tools/test_cron_exact.sh:46:source .venv/bin/activate 2>/dev/null
tools/dnd_spectral_probe.py:15:  python dnd_spectral_probe.py --source zeta --n 300
tools/dnd_spectral_probe.py:18:  python dnd_spectral_probe.py --source odlyzko --block 1
tools/dnd_spectral_probe.py:21:  python dnd_spectral_probe.py --source dirichlet --disc 5 --tmax 400
tools/dnd_spectral_probe.py:24:  python dnd_spectral_probe.py --source file --path zeros.txt
tools/dnd_spectral_probe.py:27:  python dnd_spectral_probe.py --source odlyzko --block 1 --beta-vs-height 20
tools/dnd_spectral_probe.py:1074:  %(prog)s --source zeta --n 300
tools/dnd_spectral_probe.py:1075:  %(prog)s --source odlyzko --block 1 --max-zeros 10000
tools/dnd_spectral_probe.py:1076:  %(prog)s --source odlyzko --block 1 --beta-vs-height 20
tools/dnd_spectral_probe.py:1077:  %(prog)s --source dirichlet --disc 5 --tmax 300
tools/dnd_spectral_probe.py:1078:  %(prog)s --source file --path my_eigenvalues.txt
tools/dnd_spectral_probe.py:1081:    parser.add_argument("--source", choices=["zeta", "odlyzko", "dirichlet", "file"],
tools/dnd_spectral_probe.py:1082:                        default="zeta", help="Data source")
tools/dnd_spectral_probe.py:1084:                        help="Number of zeros (zeta source)")
tools/dnd_spectral_probe.py:1094:                        help="File path (file source)")
tools/dnd_spectral_probe.py:1107:    if args.source == "zeta":
tools/dnd_spectral_probe.py:1112:    elif args.source == "odlyzko":
tools/dnd_spectral_probe.py:1120:    elif args.source == "dirichlet":
tools/dnd_spectral_probe.py:1130:    elif args.source == "file":
tools/dnd_spectral_probe.py:1132:            print("ERROR: --path required for file source")
tools/rules/axioms_to_theorems.json:11:      "source": "Axiom A₁",
tools/rules/axioms_to_theorems.json:17:      "source": "Axiom A₂",
tools/rules/axioms_to_theorems.json:23:      "source": "Axiom A₃",
tools/rules/axioms_to_theorems.json:29:      "source": "Axiom A₄",
tools/rules/axioms_to_theorems.json:35:      "source": "Axiom A₅",
tools/rules/axioms_to_theorems.json:41:      "source": "Axiom A₆",
tools/data/reports/_quarantine_falsifier_29_04/agent_20260429_0829.md:66:- **Singolare**: the prime sequence itself, before any observable is applied. It is not "40% GUE" or "95% GUE" — it is the undivided source from which both measurements emerge. The β(L) function is the division; the sequence is prior to it.
tools/data/reports/agent_20260430_1946.md:18:- **Method**: for each source, compute (SR, L1) on the real sequence and on 200 shuffles. The dipolar vector is (delta_SR, delta_L1) = (real - shuffle). Angle theta = atan2(delta_L1, delta_SR).
tools/data/reports/agent_20260430_1946.md:25:### Dipolar angle by source
tools/lab_refresh_detector.py:6:Osservazione: le 10 coppie TQGE+R sono fisse; il lab produce ponti_evoluti
tools/lab_refresh_detector.py:11:- >= 1 ghost nuovo dall'ultimo refresh (shared_theories toccano TQGE+R) → TRIGGER
tools/lab_refresh_detector.py:95:    # Filter: shared_theories toccano TQGE+R
tools/data/reports/agent_20260501_0330.md:101:The 3-deg residual is Markov-2+ memory. Previous lab findings: Markov-3 has z = 6203 (massive signal). The question: **does the Markov-3 component of prime gap memory have a preferred direction in the (SR, L1) plane?** If the Markov-3 signal has a GUE-ward direction, it would explain the residual. If it points elsewhere, there are multiple independent sources of higher-order memory.
tools/lab_promotion.py:150:                    "source_section": "verdict",
tools/lab_promotion.py:172:                        "source_section": "bicono",
tools/lab_promotion.py:190:                    "source_section": f"marker:{marker_name}",
tools/dnd_explorer.py:46:# Known structured sources (optional — activate if they exist)
tools/dnd_explorer.py:145:                'source': str(path),
tools/dnd_explorer.py:160:                    'source': str(path),
tools/dnd_explorer.py:171:                    'source': str(path),
tools/dnd_explorer.py:194:            'source': str(path),
tools/dnd_explorer.py:204:            'source': str(path),
tools/dnd_explorer.py:233:                            'source': str(path),
tools/dnd_explorer.py:244:                                    'source': str(path),
tools/dnd_explorer.py:255:                    'source': str(path),
tools/dnd_explorer.py:284:                    'source': str(path),
tools/dnd_explorer.py:299:                    'source': str(path),
tools/dnd_explorer.py:314:                    'source': str(path),
tools/dnd_explorer.py:329:                    'source': str(path),
tools/dnd_explorer.py:343:                'source': str(path),
tools/dnd_explorer.py:476:    source_ref = food['source']
tools/dnd_explorer.py:478:        source_ref += f":{food['line']}"
tools/dnd_explorer.py:483:    prompt += f"\n\nFonte: {source_ref}"
tools/dnd_explorer.py:607:    # Include known structured sources if requested
tools/dnd_explorer.py:639:                        'source': str(path),
tools/dnd_explorer.py:648:                'source': str(path),
tools/dnd_explorer.py:691:        source = food['source'].replace('/opt/', '')
tools/dnd_explorer.py:693:            source += f":{food['line']}"
tools/dnd_explorer.py:705:        print(f"      src: {source}")
tools/dnd_engine.py:2750:            'source': 'break',
tools/dnd_engine.py:2761:                'source': 'cross_domain',
tools/dnd_engine.py:2772:                'source': 'grid_gap',
tools/dnd_engine.py:2787:                            'source': 'tension',
tools/dnd_engine.py:2792:    by_source = defaultdict(int)
tools/dnd_engine.py:2794:        by_source[ip.get('source', '?')] += 1
tools/dnd_engine.py:2797:    for src, n in sorted(by_source.items()):
tools/test_lab_agent.sh:196:source "$TOOLS_DIR/.venv/bin/activate" 2>/dev/null
tools/dnd_dipolo_lab.py:95:            'source': 'dipolo-lab'
tools/md_to_site_A.py:90:    source_file = INPUT_DIR / "paper_A_draft3.md"
tools/md_to_site_A.py:91:    content = source_file.read_text()
tools/md_to_site_A.py:92:    print(f"Read {len(content)} chars from {source_file.name}")
tools/exp_dipolar_angle_reference.py:261:    parser.add_argument('--n_trials', type=int, default=30, help='Trials per source')
tools/meta_assertion_gate.py:176:        "source": "tools/dipartimento.py::verifica_asserzioni",
tools/build_agent_field.py:229:        deg[e['source']] += 1
tools/build_agent_field.py:236:    ghost_sources = defaultdict(int)
tools/build_agent_field.py:238:        s, t = e['source'], e['target']
tools/build_agent_field.py:240:            ghost_sources[t] += 1
tools/build_agent_field.py:242:            ghost_sources[s] += 1
tools/build_agent_field.py:243:    generatrici = [(nid, cnt) for nid, cnt in ghost_sources.items() if cnt >= 2]
tools/build_agent_field.py:251:        s, t = e['source'], e['target']
tools/lab_trajectory_apply.py:195:            "_source_log": entry_ts,
tools/lab_trajectory_apply.py:196:            "_source_decision": entry.get("decision", "?"),
tools/lab_trajectory_apply.py:197:            "_source_reasoning": (entry.get("reasoning", "") or "")[:300],
tools/lab_aeternitas.py:61:    Ritorna (path, source_kind) dove kind ∈ {explicit, archive, backup}.
tools/lab_aeternitas.py:278:    result["_old_seed_source"] = {"path": str(old_path), "kind": old_kind}
tools/data/reports/agent_20260501_0725.md:21:  3. **Per-source shuffle baseline** — each surrogate normalized against its own permutation
tools/data/reports/agent_20260501_0725.md:62:Repeating the fixed-edge binning with per-source baselines and gap-pool sampling gives theta = -121 +/- 2.4, showing the catch-all bin amplifies the residual to ~9 deg. With equal-count binning, the residual drops to ~1.7 deg (z=1.4 — not significant).
tools/triggers/build_applications_index.py:37:PUBLISHED = APPS_BASE / "published"         # PUBLIC — sanitized, source per sito (refactor 03/05 sera)
tools/triggers/build_applications_index.py:165:    Refactor 03/05: source ora published/<dir>/manifest.json (sanitized).
tools/triggers/promote_to_publish.py:299:        f'  "source_draft_dir": "{scoperta_dir.name}",\n'
tools/triggers/finding_promoter.py:288:        excerpt=finding.get("source_excerpt", "")[:600],
tools/triggers/run_ssp_pipeline.sh:99:# TM1/TM3/TM7/[TARGET]) da published (sanitized, source per sito).
tools/triggers/run_ssp_pipeline.sh:108:echo "── Stage 4 — build_applications_index (source: published/) ─"
tools/triggers/finding_eligibility_gate.py:200:        "source_excerpt": finding["body"][:300],
tools/triggers/blueprint_generator.py:55:def render_blueprint(manifest: dict, candidate: dict, source_meta: dict) -> str:
tools/triggers/blueprint_generator.py:72:    cycle_ts = source_meta.get("cycle_ts", "?")
tools/triggers/blueprint_generator.py:73:    lab_instance = source_meta.get("lab_instance", "?")
tools/triggers/blueprint_generator.py:74:    seed_version = source_meta.get("seme_version", "?")
tools/triggers/blueprint_generator.py:75:    falsifier_verdict = source_meta.get("falsifier_verdict", "?")
tools/triggers/blueprint_generator.py:76:    valutatore = source_meta.get("valutatore_decision", "?")
tools/triggers/blueprint_generator.py:204:    source_meta = manifest.get("discovery_provenance", {}) or {}
tools/triggers/blueprint_generator.py:206:    md = render_blueprint(manifest, target, source_meta)
tools/triggers/application_designer.py:64:    Single source of truth: il parser vive in finding_eligibility_gate.
tools/triggers/on_crystallize.py:83:    Ritorna decision + confidence + source + action (necessaria per gate
tools/triggers/on_crystallize.py:97:                    "source": "valutatore_log",
tools/triggers/on_crystallize.py:112:                        "source": "lab_session_log",
tools/triggers/on_crystallize.py:148:            f"(valutatore source: {valutatore.get('source')})"
tools/triggers/on_crystallize.py:495:    print(f"  valutatore: {valutatore.get('decision') if valutatore else 'NONE'}/{valutatore.get('confidence') if valutatore else ''} (src: {valutatore.get('source') if valutatore else 'n/a'})")
tools/dnd_riflesso.py:30:    pezzi.append("TETRAEDRO TQGE: 4 teorie, 6 lati con perno i, 5 ponti, 1 vuoto (QxG). R=c frame. α=1/137 unico adimensionale.")
tools/GUIDA_GODEL.md:568:curl -X POST http://localhost:3004/ask -d '{"question":"tensione","source":"TM3"}'
tools/GUIDA_GODEL.md:571:curl -X POST http://localhost:3004/ask -d '{"question":"tensione","source":"TM3","protocol":"chimera"}'
tools/dnd_paper_graph.py:340:                    source = edge['from']
tools/dnd_paper_graph.py:341:                    if source not in visited:
tools/dnd_paper_graph.py:342:                        queue.append((source, depth + 1))
tools/md_to_site_G.py:90:    source_file = INPUT_DIR / "paper_G_draft3.md"
tools/md_to_site_G.py:91:    content = source_file.read_text()
tools/md_to_site_G.py:92:    print(f"Read {len(content)} chars from {source_file.name}")
tools/cron_ciclo_continuo.sh:18:    source "$VENV"
tools/bicono_extractor.py:41:# Import extract_bicono dal semantic_bridge esistente (single source of truth
tools/bicono_extractor.py:79:    bicono["_source_report"] = report_path.name
tools/exp_logistic_counter_scope_gate.py:356:        "source": {
tools/exp_logistic_counter_scope_gate.py:376:            "n": data["source"]["n"],
tools/dnd_research_engine.py:157:            {'id': 'O1', 'content': 'Bloch explorer: φ at 0.1% in 1000 scans', 'source': 'dnd_bloch_explorer.py'},
tools/dnd_research_engine.py:158:            {'id': 'O2', 'content': 'GUE-like spacing in D-ND zeros', 'source': 'dnd_zeros_vs_zeta.py'},
tools/dnd_research_engine.py:159:            {'id': 'O3', 'content': 'Symmetric potential → symmetric ratios (no φ)', 'source': 'dnd_two_faces.py'},
tools/dnd_research_engine.py:160:            {'id': 'O4', 'content': 'Consecutive cycle ratios → 1.0 (no φ)', 'source': 'dnd_cycle_ratio.py'},
tools/dnd_research_engine.py:180:    def add_observation(self, content, source):
tools/dnd_research_engine.py:182:        self.observations.append({'id': oid, 'content': content, 'source': source})
tools/dnd_research_engine.py:301:                'name': f'φ universality from {pattern["source"]}',
tools/dnd_research_engine.py:302:                'prediction': f'The golden ratio found in {pattern["source"]} also appears '
tools/dnd_research_engine.py:514:            'best_source': best['best_source'],
tools/dnd_research_engine.py:533:                for source, data in result.get('ratios_found', {}).items():
tools/dnd_research_engine.py:536:                        'source': source,
tools/dnd_paper_refactor.py:71:        self.source = rule_dict['source']           # e.g., "Axiom A₁"
tools/dnd_paper_refactor.py:80:        # Build pattern that matches all forms of the source
tools/dnd_paper_refactor.py:82:        source_norm = self.source.strip()
tools/dnd_paper_refactor.py:88:        ax_match = re.match(r'(Axiom|Theorem|Proposition)\s+(A|T|P)([₁₂₃₄₅₆]|\d)', source_norm)
tools/dnd_paper_refactor.py:220:    def add_rule(self, source, target, derived_from=''):
tools/dnd_paper_refactor.py:223:            'source': source,
tools/dnd_paper_refactor.py:265:    def add_rule(self, source, target, derived_from=''):
tools/dnd_paper_refactor.py:267:        self.ruleset.add_rule(source, target, derived_from)
tools/dnd_paper_refactor.py:391:                "source": "Axiom A₁",
tools/dnd_paper_refactor.py:397:                "source": "Axiom A₂",
tools/dnd_paper_refactor.py:403:                "source": "Axiom A₃",
tools/dnd_paper_refactor.py:409:                "source": "Axiom A₄",
tools/dnd_paper_refactor.py:415:                "source": "Axiom A₅",
tools/dnd_paper_refactor.py:421:                "source": "Axiom A₆",
tools/dnd_implications.py:235:def classify_text(text, source_id="unknown"):
tools/dnd_implications.py:268:        'source_id': source_id,
tools/dnd_implications.py:283:    source_id = claim_dict.get('id', 'unknown')
tools/dnd_implications.py:284:    return classify_text(text, source_id)
tools/dnd_implications.py:294:    result = classify_text(text, source_id=str(path.name))
tools/dnd_implications.py:320:        result = classify_text(claim_text, source_id=f'engine_claim_{i}')
tools/dnd_implications.py:350:        result = classify_text(text, source_id=tension.get('id', 'unknown'))
tools/dnd_implications.py:393:        print(f"  {icon} [{r['dominant_class']:>9}] {r['source_id']:<30} (IP signals: {n_ip}){flag}")
tools/dnd_implications.py:406:        print(f"  {icon} [{r['dominant_class']:>9}] {r['source_id']:<30}{flag}")
tools/dnd_implications.py:427:            source = f.get('file', f.get('source_id', '?'))
tools/dnd_implications.py:428:            print(f"    → {source}")
tools/dnd_implications.py:440:            'source': f.get('file', f.get('source_id', '?')),
tools/data/reports/falsifier_20260501_0725.json:30:      "claim": "\"Critical methodological correction\" porta da fixed-edge 7 bins/shared baseline/bin centers a equal-count 11 bins/per-source baseline/gap-pool sampling, poi conclude che il precedente residual era artifact",
tools/data/reports/falsifier_20260501_0725.json:31:      "evidence": "Il cambio di setup combina tre modifiche simultanee. Il report cita anche fixed-edge con per-source+gap-pool theta=-121 +/-2.4, ma non isola quale patch elimina il residual fino a +1.7 deg. La conclusione attribuisce molto al binning equal-count senza decomposizione causale completa.",
tools/data/reports/falsifier_20260501_0725.json:32:      "suggestion": "Dichiarare esplicitamente il nodo falsificato: \"claim precedente falsificato sotto setup S0; nuovo scope S1\". Nel prossimo ciclo fare ablation 2x2x2: fixed/equal-count, bin-center/gap-pool, shared/per-source baseline."
tools/md_to_site_E.py:90:    source_file = INPUT_DIR / "paper_E_draft3.md"
tools/md_to_site_E.py:91:    content = source_file.read_text()
tools/md_to_site_E.py:92:    print(f"Read {len(content)} chars from {source_file.name}")
tools/lab_boot.sh:98:    source "$TOOLS_DIR/.venv/bin/activate" 2>/dev/null
tools/exp_tqge_underlay_gate.py:3:exp_tqge_underlay_gate.py
tools/exp_tqge_underlay_gate.py:5:Gate for G_POTENZIALE_NULLA on the TQGE tetrahedron.
tools/exp_tqge_underlay_gate.py:25:# operator taxonomy, echoed in tools/LAB_AGENT_CONTEXT.md as TQGE structure.
tools/exp_tqge_underlay_gate.py:143:        "experiment": "tqge_underlay_gate",
tools/exp_tqge_underlay_gate.py:144:        "source": {
tools/exp_tqge_underlay_gate.py:146:                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
tools/data/seme_backup_pre_run.json:117:      "id": "G_UNDERLAY_HINGE_GATE",
tools/data/seme_backup_pre_run.json:118:      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1751, G non e vertice globale sotto tutto: Q, G ed E hanno tutti entropia di modo 1.584963. G e il solo hinge osservato dove QG blank e GE real_sourcing si incontrano; i triangoli vuoti sono TQG e QGE, mentre TGE e TQE restano pieni. La consecutio e misurare l'operatore di deposito Q->G come passaggio blank-to-source, non cercare un ponte QG generico.",
tools/data/seme_backup_pre_run.json:123:      "origine": "cycle agent_20260507_1751: tqge_underlay_gate su tassonomia operatori TQGE",
tools/data/seme_backup_pre_run.json:128:      "id": "G_BLANK_TO_SOURCE_FACE_GATE",
tools/data/seme_backup_pre_run.json:129:      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1804, l'operatore di deposito Q->G non e un ponte QG generico: e la faccia QGE. QG porta il blank, GE porta real_sourcing, QE porta gauge_phase; TQG contiene lo stesso blank ma resta senza sorgente. L'orientabilita blank-to-source generica e frequente nel null count-preserving (p=0.8), quindi il claim valido e scoped alla localizzazione QGE, non a una rarita statistica.",
tools/data/seme_backup_pre_run.json:134:      "origine": "cycle agent_20260507_1804: blank_to_source_hinge su facce TQGE",
tools/data/seme_backup_pre_run.json:174:    "Tensioni risolte: {'G_UNDERLAY_HINGE_GATE', 'ORDER_DENOMINATOR_GATE', 'OBSERVABLE_REGISTRY', 'TRASCENDENZA_LIMITE', 'BOUNDARY_LAYER_GATE', 'TENSIONE_ENTITA', 'G_POTENZIALE_NULLA', 'PERTURBATION_DENOMINATOR_GATE', 'DUALITA_DIPOLARE_VS_ILLUSORIA', 'PIANO_PRIMARIO_DUE_ASSIOMI', 'META_ASSERTION_GATE', 'METRIC_TENSOR', 'G_BLANK_TO_SOURCE_FACE_GATE'}"
tools/data/reports/agent_20260507_1804.md:6:**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
tools/data/reports/agent_20260507_1804.md:15:- Strumento: `tools/exp_blank_to_source_hinge.py`
tools/data/reports/agent_20260507_1804.md:16:- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
tools/data/reports/agent_20260507_1804.md:19:- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
tools/data/reports/agent_20260507_1804.md:36:| Q | EQ, QT | gauge_phase, wick_time | non-source |
tools/data/reports/agent_20260507_1804.md:37:| G | EG, GT | real_sourcing, wick_time | source |
tools/data/reports/agent_20260507_1804.md:46:| TQE | gauge_phase + wick_time + wick_time | ponte senza blank/source |
tools/data/reports/agent_20260507_1804.md:49:1. **Q->G e orientabile solo come passaggio locale del lato blank.** Nel perimetro TQGE, Q e l'endpoint senza real_sourcing del blank; G e l'endpoint con real_sourcing. Il passaggio misurato e Q->G.
tools/data/reports/agent_20260507_1804.md:50:2. **L'orientabilita blank-to-source non e rara nel null.** Un lato blank adiacente a un lato real_sourcing appare in 0.8000 delle assegnazioni count-preserving. Quindi il claim forte non e "blank-to-source esiste"; il claim valido e "nel catalogo TQGE osservato, il blank-to-source cade su Q->G".
tools/data/reports/agent_20260507_1804.md:54:**CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G non e un ponte QG generico. E una faccia triadica QGE: QG fornisce il blank, GE fornisce il sourcing reale, QE fornisce il lato gauge_phase. La faccia TQG e il contro-perimetro nativo: contiene QG blank ma resta senza deposito.
tools/data/reports/agent_20260507_1804.md:60:- **Campo di possibilita**: qui diventa possibile testare Q->G come operatore triadico `blank + gauge + source`; qui diventa non-possibile cercare un ponte QG isolato senza il terzo vertice.
tools/data/reports/agent_20260507_1804.md:70:- `tools/exp_blank_to_source_hinge.py`
tools/data/reports/agent_20260507_1804.md:71:- `tools/data/blank_to_source_hinge_20260507_1804.json`
tools/data/valutatore_log.jsonl:42:{"ts": "2026-05-07T17:55:31.241833+00:00", "cycle_ref": "20260507_1751", "executed": false, "decision": "REDESIGN", "confidence": "medium", "reasoning": "Il ciclo ha falsificato la formulazione globale di G come underlay e ha prodotto una consecutio specifica: G come hinge locale tra QG blank e GE real_sourcing. Continuare sulla direzione corrente GUE/Poisson non attacca il nodo emerso; il prossimo ciclo deve testare l'operatore di deposito blank-to-source invece di accumulare dettaglio sul confine numerico.", "action": {"type": "modify_seme", "detail": {"field": "direzione", "new_value": "Testare G_UNDERLAY_HINGE_GATE: cercare un osservabile di deposito che trasformi il blank QG in sourcing reale GE nel tetraedro TQGE, con controllo su facce senza QG come contro-perimetro", "reason": "La consecutio del ciclo non è un altro giro sul confine GUE/Poisson ma la verifica strutturale del hinge G emerso come nodo regressivo locale."}}, "notes": "Il redesign non cristallizza il claim: lo restringe a esperimento falsificabile. Vincoli minimi per il prossimo ciclo: usare TGE e TQE come controlli negativi, non usare centralità entropica come metrica primaria, dichiarare blank se non emerge osservabile canonico."}
tools/data/valutatore_log.jsonl:43:{"ts": "2026-05-07T18:09:10.088199+00:00", "cycle_ref": "20260507_1804", "executed": false, "decision": "NEXT_CYCLE", "confidence": "high", "reasoning": "Il ciclo ha prodotto una consecutio specifica e falsificabile: il deposito non vive nel ponte QG isolato ma nella faccia QGE come triade blank + gauge + source. Il null ha gia' impedito la cristallizzazione prematura del claim forte, quindi il passo corretto e' far girare un altro ciclo sul nuovo gate triadico invece di fermare o ridisegnare l'intera traiettoria.", "action": {"type": "modify_seme", "detail": {"field": "direzione", "new_value": "Falsificare G_BLANK_TO_SOURCE_FACE_GATE su perimetri triadici: testare se blank + gauge + source produce deposito solo quando il source e' agganciato all'endpoint del blank, e cercare contro-esempi fuori da QGE.", "reason": "La nuova tensione e' matura come prossimo esperimento ma non come cristallizzazione; serve verifica cross-perimetro prima di promuoverla."}}, "notes": "Priorita' operativa: non ripetere il conteggio locale TQGE; costruire almeno un perimetro alternativo o surrogato strutturale che possa rompere il gate."}
tools/data/reports/agent_20260426_0330.md:64:1. **The spectral rigidity of primes has two channels with opposite scale behavior.** The magnitude channel (gap distribution shape) contributes a scale-independent Sig2/L ≈ 0.56 at all L. The ordering channel (sequential correlations) contributes a scale-dependent rigidity that grows from 4% at L=1 to 58% at L=50. The ordering becomes the dominant source of rigidity at long range.
tools/data/semireal_order_denominator_gate_20260507_0923_seedcheck.json:109:      "source": {
tools/data/semireal_order_denominator_gate_20260507_0923_seedcheck.json:5232:      "source": {
tools/data/semireal_order_denominator_gate_20260507_0923_seedcheck.json:10087:      "source": {
tools/data/agent_field_live.md:26:  "perimetro" → META_ASSERTION_GATE, ORDER_DENOMINATOR_GATE, G_BLANK_TO_SOURCE_FACE_GATE, G_UNDERLAY_HINGE_GATE, PERTURBATION_DENOMINATOR_GATE, BOUNDARY_LAYER_GATE
tools/data/agent_field_live.md:30:  "tutti" → G_UNDERLAY_HINGE_GATE, ORDER_DENOMINATOR_GATE, PIANO_PRIMARIO_DUE_ASSIOMI
tools/data/agent_field_live.md:37:Trovato: 1. **Q->G e orientabile solo come passaggio locale del lato blank.** Nel perimetro TQGE, Q e l'endpoint senza real_sourcing del blank; G e l'endpoint con real_sourcing. Il passaggio misurato e Q->G.
tools/data/agent_field_live.md:38:2. **L'orientabilita blank-to-source non e rara nel null.** Un lato blank adiacente a un lato real_so
tools/data/agent_field_live.md:39:Verdetto: **CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G non e un ponte QG gen
tools/data/agent_field_live.md:41:### Agent Report — TQGE Underlay Gate
tools/data/agent_field_live.md:43:2. **G e il solo hinge `blank + real_sourcing` nel perimetro TQGE.** Il vuoto QG e il sourcing reale GE si incontrano so
tools/data/agent_field_live.md:44:Verdetto: **CONSTRAINT on G_POTENZIALE_NULLA**: nel perimetro TQGE operator-taxonomy, G non va formulato come vertice globale "sotto tutto". G e il hinge locale
tools/data/agent_field_live.md:140:- Rischi (contraddizioni): G_UNDERLAY_HINGE_GATE, PERTURBATION_DENOMINATOR_GATE
tools/notte_sinapsi.sh:23:    source "$VENV"
tools/data/promotions/promotion_20260506_1955.json:20:      "source_section": "verdict",
tools/data/promotions/promotion_20260507_1804.json:17:      "title": "**CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di depos",
tools/data/promotions/promotion_20260507_1804.json:18:      "summary": "**CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G non e un ponte QG generico. E una faccia triadica QGE: QG fornisce il blank, GE fornisce il sourcing reale, QE fornisce il lato gauge_phase. La faccia TQG e il contro-perimetro nativo: contiene QG blank ma resta senza deposito.",
tools/data/promotions/promotion_20260507_1804.json:20:      "source_section": "verdict",
tools/data/promotions/promotion_20260507_0803.json:20:      "source_section": "verdict",
tools/data/promotions/promotion_20260506_0625.json:20:      "source_section": "verdict",
tools/data/promotions/promotion_20260507_1458.json:20:      "source_section": "verdict",
tools/data/promotions/promotion_20260507_0330.json:20:      "source_section": "verdict",
tools/data/promotions/promotion_20260507_1751.json:17:      "title": "**CONSTRAINT on G_POTENZIALE_NULLA**: nel perimetro TQGE operator-taxonomy, G non va formulato come vertice globale \"sot",
tools/data/promotions/promotion_20260507_1751.json:18:      "summary": "**CONSTRAINT on G_POTENZIALE_NULLA**: nel perimetro TQGE operator-taxonomy, G non va formulato come vertice globale \"sotto tutto\". G e il hinge locale tra QG blank e GE real_sourcing. La consecutio non e cercare un ponte QG generico; e misurare l'operatore di deposito che trasforma un blank quantistico-gravitazionale in sourcing reale.",
tools/data/promotions/promotion_20260507_1751.json:20:      "source_section": "verdict",
tools/data/promotions/promotion_20260506_1941.json:20:      "source_section": "verdict",
tools/data/conoscenza_teorie.json.bak.retraction_22_04:386:          "extract": "The Unruh effect is a hypothetical, observer-dependent prediction of quantum field theory that an observer who is uniformly accelerating through empty space will perceive a thermal bath. This means that even in the absence of any external heat sources, an accelerating observer will detect particles ",
tools/data/conoscenza_teorie.json.bak.retraction_22_04:470:    "refresh_source": "dnd_incrocio.rigenera_conoscenza_teorie",
tools/data/conoscenza_teorie.json.bak.retraction_22_04:659:        "source": "evolution"
tools/data/conoscenza_teorie.json.bak.retraction_22_04:718:        "source": "evolution"
tools/data/conoscenza_teorie.json.bak.retraction_22_04:787:        "source": "evolution"
tools/data/conoscenza_teorie.json.bak.retraction_22_04:798:        "source": "evolution"
tools/data/seme.json:117:      "id": "G_UNDERLAY_HINGE_GATE",
tools/data/seme.json:118:      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1751, G non e vertice globale sotto tutto: Q, G ed E hanno tutti entropia di modo 1.584963. G e il solo hinge osservato dove QG blank e GE real_sourcing si incontrano; i triangoli vuoti sono TQG e QGE, mentre TGE e TQE restano pieni. La consecutio e misurare l'operatore di deposito Q->G come passaggio blank-to-source, non cercare un ponte QG generico.",
tools/data/seme.json:123:      "origine": "cycle agent_20260507_1751: tqge_underlay_gate su tassonomia operatori TQGE",
tools/data/seme.json:128:      "id": "G_BLANK_TO_SOURCE_FACE_GATE",
tools/data/seme.json:129:      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1804, l'operatore di deposito Q->G non e un ponte QG generico: e la faccia QGE. QG porta il blank, GE porta real_sourcing, QE porta gauge_phase; TQG contiene lo stesso blank ma resta senza sorgente. L'orientabilita blank-to-source generica e frequente nel null count-preserving (p=0.8), quindi il claim valido e scoped alla localizzazione QGE, non a una rarita statistica.",
tools/data/seme.json:134:      "origine": "cycle agent_20260507_1804: blank_to_source_hinge su facce TQGE",
tools/data/seme.json:174:    "Tensioni risolte: {'G_UNDERLAY_HINGE_GATE', 'ORDER_DENOMINATOR_GATE', 'OBSERVABLE_REGISTRY', 'TRASCENDENZA_LIMITE', 'BOUNDARY_LAYER_GATE', 'TENSIONE_ENTITA', 'G_POTENZIALE_NULLA', 'PERTURBATION_DENOMINATOR_GATE', 'DUALITA_DIPOLARE_VS_ILLUSORIA', 'PIANO_PRIMARIO_DUE_ASSIOMI', 'META_ASSERTION_GATE', 'METRIC_TENSOR', 'G_BLANK_TO_SOURCE_FACE_GATE'}"
tools/data/markov_k_direction.json:2:  "method": "14 equal-count bins, per-source shuffle baseline, gap-pool sampling",
tools/data/synthetic_validation.json:6:      "source": "GUE",
tools/data/synthetic_validation.json:15:      "source": "GUE",
tools/data/synthetic_validation.json:24:      "source": "GUE",
tools/data/synthetic_validation.json:33:      "source": "GOE",
tools/data/synthetic_validation.json:42:      "source": "GOE",
tools/data/synthetic_validation.json:51:      "source": "GOE",
tools/data/lab_data.json:78:      "id": "G_UNDERLAY_HINGE_GATE",
tools/data/lab_data.json:79:      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1751, G non e vertice globale sotto tutto: Q, G ed E hanno tutti entropia di modo 1.584963. G e il solo hinge osservato dove QG blank e GE real_sour",
tools/data/lab_data.json:85:      "id": "G_BLANK_TO_SOURCE_FACE_GATE",
tools/data/lab_data.json:86:      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1804, l'operatore di deposito Q->G non e un ponte QG generico: e la faccia QGE. QG porta il blank, GE porta real_sourcing, QE porta gauge_phase; TQG",
tools/data/lab_data.json:115:    "content": "# Agent Report — Blank To Source Hinge\n**Date**: 2026-05-07 18:04\n**Piano**: 79\n**Tension explored**: G_POTENZIALE_NULLA (0.85)\n**observables_registry**: 1.0.0-2026-05-06\n**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var\n\n## Claim Under Test\n> 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.\n\n## Question\nSe QG e blank e GE e real_sourcing, l'operatore di deposito Q->G e un ponte QG generico o una faccia specifica del tetraedro?\n\n## Experiment Design\n- Strumento: `tools/exp_blank_to_source_hinge.py`\n- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.\n- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/lab_riflessi.json`, `tools/data/reports/agent_20260507_1751.md`.\n- Metrica: lato blank; lato real_sourcing; endpoint del blank con sorgente; passaggio diretto endpoint-senza-sorgente -> endpoint-con-sorgente; facce con `blank + real_sourcing`; facce blank escluse.\n- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.\n\n## Results\n| Test | Osservato | Null count-preserving |\n|---|---:|---:|\n| Blank edge | GQ | p(GQ)=0.1667 |\n| Real sourcing edge | EG | p(EG)=0.1667 |\n| Blank adiacente al real_sourcing | true | p=0.8000 |\n| Passaggio diretto blank-endpoint senza sorgente -> con sorgente | Q->G | p(any)=0.8000; p(Q->G)=0.0667 |\n| Pattern esatto QG blank + GE real_sourcing + Q->G | true | p=0.0333 |\n| Faccia di deposito | QGE | 24/120 per ogni faccia; 24/120 none |\n| Faccia blank esclusa | TQG | - |\n\nEndpoint del blank:\n\n| Endpoint | Lati nonblank incidenti | Modi incidenti | Ruolo |\n|---|---|---|---|\n| Q | EQ, QT | gauge_phase, wick_time | non-source |\n| G | EG, GT | real_sourcing, wick_time | source |\n\nFacce:\n\n| Faccia | Modi | Stato |\n|---|---|---|\n| QGE | blank + gauge_phase + real_sourcing | deposito |\n| TQG | blank + wick_time + wick_time | vuoto senza sorgente |\n| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |\n| TQE | gauge_phase + wick_time + wick_time | ponte senza blank/source |\n\n## Key Findings\n1. **Q->G e orientabile solo come passaggio locale del lato blank.** Nel perimetro TQGE, Q e l'endpoint senza real_sourcing del blank; G e l'endpoint con real_sourcing. Il passaggio misurato e Q->G.\n2. **L'orientabilita blank-to-source non e rara nel null.** Un lato blank adiacente a un lato real_sourcing appare in 0.8000 delle assegnazioni count-preserving. Quindi il claim forte non e \"blank-to-source esiste\"; il claim valido e \"nel catalogo TQGE osservato, il blank-to-source cade su Q->G\".\n3. **Il deposito vive nella faccia QGE, non nel ponte QG.** QGE contiene `blank + gauge_phase + real_sourcing`; TQG contiene lo stesso blank ma nessuna sorgente. Il vuoto QG non basta: serve il terzo vertice E come sorgente reale agganciata a G"
tools/data/lab_data.json:144:        "id": "G_UNDERLAY_HINGE_GATE",
tools/data/lab_data.json:149:        "anti_claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1751, G e vertice globale sotto tutto: Q, G ed E"
tools/data/lab_data.json:160:        "id": "G_BLANK_TO_SOURCE_FACE_GATE",
tools/data/lab_data.json:165:        "anti_claim": "resta senza sorgente. L'orientabilita blank-to-source generica e frequente nel null count-preserving"
tools/data/lab_data.json:223:          "G_BLANK_TO_SOURCE_FACE_GATE",
tools/data/lab_data.json:224:          "G_UNDERLAY_HINGE_GATE",
tools/data/lab_data.json:231:        "note": "9 dipoli risuonano: BOUNDARY, BOUNDARY_LAYER_GATE, G_BLANK_TO_SOURCE_FACE_GATE..."
tools/data/lab_data.json:238:          "G_BLANK_TO_SOURCE_FACE_GATE",
tools/data/lab_data.json:239:          "G_UNDERLAY_HINGE_GATE",
tools/data/lab_data.json:245:        "note": "7 dipoli risuonano: BOUNDARY_LAYER_GATE, G_BLANK_TO_SOURCE_FACE_GATE, G_UNDERLAY_HINGE_GATE..."
tools/data/lab_data.json:252:          "G_BLANK_TO_SOURCE_FACE_GATE",
tools/data/lab_data.json:253:          "G_UNDERLAY_HINGE_GATE",
tools/data/lab_data.json:259:        "note": "7 dipoli risuonano: BOUNDARY_LAYER_GATE, G_BLANK_TO_SOURCE_FACE_GATE, G_UNDERLAY_HINGE_GATE..."
tools/data/lab_data.json:266:          "G_BLANK_TO_SOURCE_FACE_GATE",
tools/data/lab_data.json:267:          "G_UNDERLAY_HINGE_GATE",
tools/data/lab_data.json:272:        "note": "6 dipoli risuonano: BOUNDARY_LAYER_GATE, G_BLANK_TO_SOURCE_FACE_GATE, G_UNDERLAY_HINGE_GATE..."
tools/data/lab_data.json:279:          "G_UNDERLAY_HINGE_GATE",
tools/data/lab_data.json:283:        "note": "4 dipoli risuonano: BOUNDARY_LAYER_GATE, G_UNDERLAY_HINGE_GATE, ORDER_DENOMINATOR_GATE..."
tools/data/logistic_cyclic_block_entropy_gate_20260507_1419_seedcheck.json:198:      "source": {
tools/data/logistic_cyclic_block_entropy_gate_20260507_1419_seedcheck.json:394:      "source": {
tools/data/logistic_cyclic_block_entropy_gate_20260507_1419_seedcheck.json:571:      "source": {
tools/data/tqge_underlay_gate_20260507_1751.json:2:  "experiment": "tqge_underlay_gate",
tools/data/tqge_underlay_gate_20260507_1751.json:3:  "source": {
tools/data/tqge_underlay_gate_20260507_1751.json:5:      "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
tools/data/lab_bridge_issues.jsonl:9:{"ts": "2026-04-28T03:40:56", "run_id": "20260428_034056", "n_issues": 3, "n_errors": 0, "n_warns": 3, "issues": [{"kind": "radici_no_separator", "severity": "warn", "field": "bicono.radici", "message": "radici presenti ma senza separatore · (BiconoLab non rendera i due poli)", "hint": "Agent deve usare \"<polo sx> · <polo dx>\". Il separatore e il middle-dot U+00B7 o bullet U+2022.", "pair": "GxQ", "source": "agent_20260428_0330.md"}, {"kind": "radici_no_separator", "severity": "warn", "field": "bicono.radici", "message": "radici presenti ma senza separatore · (BiconoLab non rendera i due poli)", "hint": "Agent deve usare \"<polo sx> · <polo dx>\". Il separatore e il middle-dot U+00B7 o bullet U+2022.", "pair": "GxT", "source": "agent_20260428_0330.md"}, {"kind": "radici_no_separator", "severity": "warn", "field": "bicono.radici", "message": "radici presenti ma senza separatore · (BiconoLab non rendera i due poli)", "hint": "Agent deve usare \"<polo sx> · <polo dx>\". Il separatore e il middle-dot U+00B7 o bullet U+2022.", "pair": "QxT", "source": "agent_20260428_0330.md"}]}
tools/data/lab_bridge_issues.jsonl:10:{"ts": "2026-04-29T08:59:43", "run_id": "20260429_085943", "n_issues": 3, "n_errors": 0, "n_warns": 3, "issues": [{"kind": "radici_no_separator", "severity": "warn", "field": "bicono.radici", "message": "radici presenti ma senza separatore · (BiconoLab non rendera i due poli)", "hint": "Agent deve usare \"<polo sx> · <polo dx>\". Il separatore e il middle-dot U+00B7 o bullet U+2022.", "pair": "GxQ", "source": "agent_20260429_0852.md"}, {"kind": "radici_no_separator", "severity": "warn", "field": "bicono.radici", "message": "radici presenti ma senza separatore · (BiconoLab non rendera i due poli)", "hint": "Agent deve usare \"<polo sx> · <polo dx>\". Il separatore e il middle-dot U+00B7 o bullet U+2022.", "pair": "GxT", "source": "agent_20260429_0852.md"}, {"kind": "radici_no_separator", "severity": "warn", "field": "bicono.radici", "message": "radici presenti ma senza separatore · (BiconoLab non rendera i due poli)", "hint": "Agent deve usare \"<polo sx> · <polo dx>\". Il separatore e il middle-dot U+00B7 o bullet U+2022.", "pair": "QxT", "source": "agent_20260429_0852.md"}]}
tools/data/tm1_figures/tensions_raw.json:4:  "sources": [
tools/data/tm1_figures/tensions_raw.json:10:      "source": "MM_D-ND/tools/data/seme_archive/piano_zero.json",
tools/data/tm1_figures/tensions_raw.json:23:      "source": "MM_D-ND/archive/session_docs/FI_AUDIT_SESSION8.md",
tools/data/tm1_figures/tensions_raw.json:36:      "source": "MM_D-ND/papers/paper_C_draft2.md",
tools/data/tm1_figures/tensions_raw.json:49:      "source": "MM_D-ND/tools/data/seme_archive/piano_zero.json",
tools/data/tm1_figures/tensions_raw.json:61:      "source": "MM_D-ND/tools/dnd_riemann.py",
tools/data/tm1_figures/tensions_raw.json:73:      "source": "MM_D-ND/tools/zeta_validation.py",
tools/data/tm1_figures/tensions_raw.json:85:      "source": "MM_D-ND/tools/dnd_gue_test.py",
tools/data/tm1_figures/tensions_raw.json:97:      "source": "MM_D-ND/tools/GUIDA_GODEL_TM1.md",
tools/data/tm1_figures/tensions_raw.json:109:      "source": "MM_D-ND/archive/session_docs/PAPER_TRACK_MATRICES_v1.md",
tools/data/tm1_figures/tensions_raw.json:121:      "source": "MM_D-ND/archive/paper_drafts/paper_C_draft1.md",
tools/data/tm1_figures/tensions_raw.json:133:      "source": "MM_D-ND/awareness/4_κ_EVOLUTIVE_MEMORY/Omega_Cockpit_chat_dev_03-12-25_02.md",
tools/data/tm1_figures/tensions_raw.json:145:      "source": "MM_D-ND/awareness/4_κ_EVOLUTIVE_MEMORY/AUDIT_PAPERS_DE.md",
tools/data/tm1_figures/tensions_raw.json:157:      "source": "MM_D-ND/awareness/4_κ_EVOLUTIVE_MEMORY/Modello_D-ND_Dualita_e_Autopoiesi_chat_Modulatore_gravitazionale_1-2.md",
tools/data/tm1_figures/tensions_raw.json:169:      "source": "MM_D-ND/awareness/4_κ_EVOLUTIVE_MEMORY/Modello_D-ND_Dualita_e_Autopoiesi_chat_Modulatore_gravitazionale_1-2.md",
tools/data/tm1_figures/tensions_raw.json:181:      "source": "MM_D-ND/awareness/4_κ_EVOLUTIVE_MEMORY/AUDIT_PAPERS_ABE_v1.md",
tools/data/tm1_figures/tensions_raw.json:193:      "source": "MM_D-ND/papers/MATURATION_REPORT_F.md",
tools/data/tm1_figures/tensions_raw.json:205:      "source": "MM_D-ND/papers/paper_C_draft2.md",
tools/data/tm1_figures/tensions_raw.json:217:      "source": "MM_D-ND/papers/notes/STRUCTURAL_DEPTH_AUDIT.md",
tools/data/tm1_figures/tensions_raw.json:229:      "source": "THIA/docs/memory/COWORK_CHANNEL.md",
tools/data/tm1_figures/tensions_raw.json:241:      "source": "MM_D-ND/tools/data/domandatore/domandatore_20260505_0345.json",
tools/data/tm1_figures/tensions.json:4:  "sources": [
tools/data/tm1_figures/tensions.json:10:      "source": "MM_D-ND/tools/data/seme_archive/piano_zero.json",
tools/data/tm1_figures/tensions.json:23:      "source": "MM_D-ND/archive/session_docs/FI_AUDIT_SESSION8.md",
tools/data/tm1_figures/tensions.json:36:      "source": "MM_D-ND/papers/paper_C_draft2.md",
tools/data/tm1_figures/tensions.json:49:      "source": "MM_D-ND/tools/data/seme_archive/piano_zero.json",
tools/data/tm1_figures/tensions.json:61:      "source": "MM_D-ND/tools/dnd_riemann.py",
tools/data/tm1_figures/tensions.json:73:      "source": "MM_D-ND/tools/zeta_validation.py",
tools/data/tm1_figures/tensions.json:85:      "source": "MM_D-ND/tools/dnd_gue_test.py",
tools/data/tm1_figures/tensions.json:97:      "source": "MM_D-ND/tools/GUIDA_GODEL_TM1.md",
tools/data/tm1_figures/tensions.json:109:      "source": "MM_D-ND/archive/session_docs/PAPER_TRACK_MATRICES_v1.md",
tools/data/tm1_figures/tensions.json:121:      "source": "MM_D-ND/archive/paper_drafts/paper_C_draft1.md",
tools/data/tm1_figures/tensions.json:133:      "source": "MM_D-ND/awareness/4_κ_EVOLUTIVE_MEMORY/Omega_Cockpit_chat_dev_03-12-25_02.md",
tools/data/tm1_figures/tensions.json:145:      "source": "MM_D-ND/awareness/4_κ_EVOLUTIVE_MEMORY/AUDIT_PAPERS_DE.md",
tools/data/tm1_figures/tensions.json:157:      "source": "MM_D-ND/awareness/4_κ_EVOLUTIVE_MEMORY/Modello_D-ND_Dualita_e_Autopoiesi_chat_Modulatore_gravitazionale_1-2.md",
tools/data/tm1_figures/tensions.json:169:      "source": "MM_D-ND/awareness/4_κ_EVOLUTIVE_MEMORY/Modello_D-ND_Dualita_e_Autopoiesi_chat_Modulatore_gravitazionale_1-2.md",
tools/data/tm1_figures/tensions.json:181:      "source": "MM_D-ND/awareness/4_κ_EVOLUTIVE_MEMORY/AUDIT_PAPERS_ABE_v1.md",
tools/data/tm1_figures/tensions.json:193:      "source": "MM_D-ND/papers/MATURATION_REPORT_F.md",
tools/data/tm1_figures/tensions.json:205:      "source": "MM_D-ND/papers/paper_C_draft2.md",
tools/data/tm1_figures/tensions.json:217:      "source": "MM_D-ND/papers/notes/STRUCTURAL_DEPTH_AUDIT.md",
tools/data/tm1_figures/tensions.json:229:      "source": "THIA/docs/memory/COWORK_CHANNEL.md",
tools/data/tm1_figures/tensions.json:241:      "source": "MM_D-ND/tools/data/domandatore/domandatore_20260505_0345.json",
tools/data/tension_to_theory.json:3:    "purpose_it": "Mapping semantico tensione → teorie TQGE+R coinvolte. Layer che traduce scoperte del lab numerico in annotazioni sulle pairs del grafo conoscenza. Curato da operatore/TM1, ispezionabile. Deterministico — no LLM.",
tools/data/tension_to_theory.json:4:    "purpose_en": "Semantic mapping of tensions to TQGE+R theories involved. Layer that translates numerical lab discoveries into annotations on the knowledge graph pairs. Curated by operator/TM1, inspectable. Deterministic — no LLM.",
tools/data/tension_to_theory.json:5:    "how_it_works_it": "Per ogni agent_report nightly, semantic_bridge.py estrae source_tension → lookup qui → se ≥2 teorie → genera annotazione sulla pair corrispondente in conoscenza_teorie.insights_dal_lab.",
tools/data/tension_to_theory.json:6:    "how_it_works_en": "For each nightly agent_report, semantic_bridge.py extracts source_tension → lookup here → if ≥2 theories → generates annotation on the corresponding pair in conoscenza_teorie.insights_dal_lab.",
tools/data/bloch_search_results.json:10:      "best_source": "interval_ratio",
tools/data/bloch_search_results.json:26:      "best_source": "rise/fall",
tools/data/bloch_search_results.json:42:      "best_source": "interval_ratio",
tools/data/bloch_search_results.json:58:      "best_source": "rise/fall",
tools/data/bloch_search_results.json:74:      "best_source": "phase_velocity",
tools/data/bloch_search_results.json:90:      "best_source": "interval_ratio",
tools/data/bloch_search_results.json:106:      "best_source": "phase_velocity",
tools/data/bloch_search_results.json:122:      "best_source": "interval_ratio",
tools/data/bloch_search_results.json:138:      "best_source": "rise/fall",
tools/data/bloch_search_results.json:154:      "best_source": "interval_ratio",
tools/data/bloch_search_results.json:170:      "best_source": "interval_ratio",
tools/data/bloch_search_results.json:186:      "best_source": "rise/fall",
tools/data/bloch_search_results.json:202:      "best_source": "phase_velocity",
tools/data/bloch_search_results.json:218:      "best_source": "phase_velocity",
tools/data/bloch_search_results.json:234:      "best_source": "rise/fall",
tools/data/bloch_search_results.json:250:      "best_source": "rise/fall",
tools/data/bloch_search_results.json:266:      "best_source": "phase_velocity",
tools/data/bloch_search_results.json:282:      "best_source": "interval_ratio",
tools/data/bloch_search_results.json:298:      "best_source": "rise/fall",
tools/data/bloch_search_results.json:314:      "best_source": "interval_ratio",
tools/data/engine_state.json:27:      "source": "cross_domain"
tools/data/engine_state.json:34:      "source": "grid_gap",
tools/data/engine_state.json:42:      "source": "grid_gap",
tools/data/engine_state.json:50:      "source": "grid_gap",
tools/data/engine_state.json:58:      "source": "grid_gap",
tools/data/engine_state.json:66:      "source": "grid_gap",
tools/data/engine_state.json:74:      "source": "grid_gap",
tools/data/engine_state.json:82:      "source": "grid_gap",
tools/data/engine_state.json:90:      "source": "grid_gap",
tools/data/engine_state.json:98:      "source": "grid_gap",
tools/data/logistic_cyclic_block_entropy_gate_20260507_1419.json:211:      "source": {
tools/data/logistic_cyclic_block_entropy_gate_20260507_1419.json:407:      "source": {
tools/data/logistic_cyclic_block_entropy_gate_20260507_1419.json:593:      "source": {
tools/data/meta_assertion_gate.json:3:  "source": "tools/dipartimento.py::verifica_asserzioni",
tools/data/logistic_surrogate_contract_gate_20260507_1042_seedcheck.json:130:      "source": {
tools/data/logistic_surrogate_contract_gate_20260507_1042_seedcheck.json:232:      "source": {
tools/data/logistic_surrogate_contract_gate_20260507_1042_seedcheck.json:325:      "source": {
tools/data/lab_graph.json:251:        "source": "session",
tools/data/lab_graph.json:296:        "source": "session",
tools/data/lab_graph.json:341:        "source": "session",
tools/data/lab_graph.json:358:        "source": "session",
tools/data/lab_graph.json:403:        "source": "session",
tools/data/lab_graph.json:448:        "source": "metric",
tools/data/lab_graph.json:456:        "source_tension": "G_POTENZIALE_NULLA",
tools/data/lab_graph.json:496:        "verdict": "**CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G non e un ponte QG gen",
tools/data/lab_graph.json:497:        "findings": "1. **Q->G e orientabile solo come passaggio locale del lato blank.** Nel perimetro TQGE, Q e l'endpoint senza real_sourcing del blank; G e l'endpoint con real_sourcing. Il passaggio misurato e Q->G.\n2. **L'orientabilita blank-to-source non e rara nel null.** Un lato blank adiacente a un lato real_so",
tools/data/lab_graph.json:498:        "annotation": "Vincolo: **CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, ",
tools/data/lab_graph.json:499:        "annotation_en": "Constraint: **CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, ",
tools/data/lab_graph.json:505:        "source_tension": "G_POTENZIALE_NULLA",
tools/data/lab_graph.json:517:            "slug": "liberta-open-source",
tools/data/lab_graph.json:539:        "label": "TQGE Underlay Gate",
tools/data/lab_graph.json:540:        "label_en": "TQGE Underlay Gate",
tools/data/lab_graph.json:541:        "label_short": "TQGE Underlay Gate",
tools/data/lab_graph.json:542:        "label_short_en": "TQGE Underlay Gate",
tools/data/lab_graph.json:545:        "verdict": "**CONSTRAINT on G_POTENZIALE_NULLA**: nel perimetro TQGE operator-taxonomy, G non va formulato come vertice globale \"sotto tutto\". G e il hinge locale",
tools/data/lab_graph.json:546:        "findings": "1. **G non e il vertice unico della diversita operatoria.** Q, G ed E hanno tutti tre modi incidenti distinti. Il claim \"G sotto tutto\" non passa come centralita entropica locale.\n2. **G e il solo hinge `blank + real_sourcing` nel perimetro TQGE.** Il vuoto QG e il sourcing reale GE si incontrano so",
tools/data/lab_graph.json:547:        "annotation": "Vincolo: **CONSTRAINT on G_POTENZIALE_NULLA**: nel perimetro TQGE operator-taxonomy, G non va formulato come ",
tools/data/lab_graph.json:548:        "annotation_en": "Constraint: **CONSTRAINT on G_POTENZIALE_NULLA**: nel perimetro TQGE operator-taxonomy, G non va formulato come ",
tools/data/lab_graph.json:554:        "source_tension": "G_POTENZIALE_NULLA",
tools/data/lab_graph.json:732:        "source": "E",
tools/data/lab_graph.json:771:        "source": "G",
tools/data/lab_graph.json:792:        "source": "G",
tools/data/lab_graph.json:813:        "source": "Q",
tools/data/lab_graph.json:834:        "source": "Q",
tools/data/lab_graph.json:844:        "source": "Q",
tools/data/lab_graph.json:855:        "source": "T",
tools/data/lab_graph.json:885:        "source": "T",
tools/data/lab_graph.json:906:        "source": "T",
tools/data/lab_graph.json:945:        "source": "T",
tools/data/lab_graph.json:956:        "source": "disc_0",
tools/data/lab_graph.json:961:        "source": "disc_1",
tools/data/lab_graph.json:966:        "source": "disc_2",
tools/data/lab_graph.json:971:        "source": "disc_3",
tools/data/lab_graph.json:976:        "source": "disc_4",
tools/data/lab_graph.json:981:        "source": "disc_4",
tools/data/lab_graph.json:986:        "source": "disc_5",
tools/data/lab_graph.json:991:        "source": "disc_5",
tools/data/lab_graph.json:996:        "source": "report_20260507_1804",
tools/data/lab_graph.json:1001:        "source": "report_20260507_1751",
tools/data/lab_graph.json:1006:        "source": "report_20260507_1458",
tools/data/lab_graph.json:1011:        "source": "report_20260507_1419",
tools/data/lab_graph.json:1016:        "source": "report_20260507_1042",
tools/data/lab_graph.json:1091:      "verdict": "**CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G non e un ponte QG generico. E una faccia triadica QGE: QG fornisce il b",
tools/data/lab_graph.json:1092:      "verdict_en": "**CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G non e un ponte QG generico. E una faccia triadica QGE: QG fornisce il b",
tools/data/lab_graph.json:1093:      "findings": "1. **Q->G e orientabile solo come passaggio locale del lato blank.** Nel perimetro TQGE, Q e l'endpoint senza real_sourcing del blank; G e l'endpoint con real_sourcing. Il passaggio misurato e Q->G.\n2. **L'orientabilita blank-to-source non e rara nel null.** Un lato blank adiacente a un lato real_sourcing appare in 0.8000 delle assegnazioni count-preserving. Quindi il claim forte non e \"blank-to-s",
tools/data/lab_graph.json:1094:      "content_preview": "# Agent Report — Blank To Source Hinge\n**Date**: 2026-05-07 18:04\n**Piano**: 79\n**Tension explored**: G_POTENZIALE_NULLA (0.85)\n**observables_registry**: 1.0.0-2026-05-06\n**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var\n\n## Claim Under Test\n> 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 r",
tools/data/lab_graph.json:1095:      "content_full": "# Agent Report — Blank To Source Hinge\n**Date**: 2026-05-07 18:04\n**Piano**: 79\n**Tension explored**: G_POTENZIALE_NULLA (0.85)\n**observables_registry**: 1.0.0-2026-05-06\n**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var\n\n## Claim Under Test\n> 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.\n\n## Question\nSe QG e blank e GE e real_sourcing, l'operatore di deposito Q->G e un ponte QG generico o una faccia specifica del tetraedro?\n\n## Experiment Design\n- Strumento: `tools/exp_blank_to_source_hinge.py`\n- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.\n- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/lab_riflessi.json`, `tools/data/reports/agent_20260507_1751.md`.\n- Metrica: lato blank; lato real_sourcing; endpoint del blank con sorgente; passaggio diretto endpoint-senza-sorgente -> endpoint-con-sorgente; facce con `blank + real_sourcing`; facce blank escluse.\n- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.\n\n## Results\n| Test | Osservato | Null count-preserving |\n|---|---:|---:|\n| Blank edge | GQ | p(GQ)=0.1667 |\n| Real sourcing edge | EG | p(EG)=0.1667 |\n| Blank adiacente al real_sourcing | true | p=0.8000 |\n| Passaggio diretto blank-endpoint senza sorgente -> con sorgente | Q->G | p(any)=0.8000; p(Q->G)=0.0667 |\n| Pattern esatto QG blank + GE real_sourcing + Q->G | true | p=0.0333 |\n| Faccia di deposito | QGE | 24/120 per ogni faccia; 24/120 none |\n| Faccia blank esclusa | TQG | - |\n\nEndpoint del blank:\n\n| Endpoint | Lati nonblank incidenti | Modi incidenti | Ruolo |\n|---|---|---|---|\n| Q | EQ, QT | gauge_phase, wick_time | non-source |\n| G | EG, GT | real_sourcing, wick_time | source |\n\nFacce:\n\n| Faccia | Modi | Stato |\n|---|---|---|\n| QGE | blank + gauge_phase + real_sourcing | deposito |\n| TQG | blank + wick_time + wick_time | vuoto senza sorgente |\n| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |\n| TQE | gauge_phase + wick_time + wick_time | ponte senza blank/source |\n\n## Key Findings\n1. **Q->G e orientabile solo come passaggio locale del lato blank.** Nel perimetro TQGE, Q e l'endpoint senza real_sourcing del blank; G e l'endpoint con real_sourcing. Il passaggio misurato e Q->G.\n2. **L'orientabilita blank-to-source non e rara nel null.** Un lato blank adiacente a un lato real_sourcing appare in 0.8000 delle assegnazioni count-preserving. Quindi il claim forte non e \"blank-to-source esiste\"; il claim valido e \"nel catalogo TQGE osservato, il blank-to-source cade su Q->G\".\n3. **Il deposito vive nella faccia QGE, non nel ponte QG.** QGE contiene `blank + gauge_phase + real_sourcing`; TQG contiene lo stesso blank ma nessuna sorgente. Il vuoto QG non basta: serve il terzo vertice E come sorgente reale agganciata a G.\n\n## Verdict\n**CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G non e un ponte QG generico. E una faccia triadica QGE: QG fornisce il blank, GE fornisce il sourcing reale, QE fornisce il lato gauge_phase. La faccia TQG e il contro-perimetro nativo: contiene QG blank ma resta senza deposito.\n\n## Bicono della scoperta\n- **Due radici**: QG blank senza sorgente · GE real_sourcing agganciato a G\n- **Singolare**: la faccia QGE, dove vuoto quantistico-gravitazionale, fase gauge e sorgente reale stanno nello stesso triangolo.\n- **Invariante di passaggio**: il blank contamina due facce, ma il deposito passa solo nella faccia che contiene real_sourcing.\n- **Campo di possibilita**: qui diventa possibile testare Q->G come operatore triadico `blank + gauge + source`; qui diventa non-possibile cercare un ponte QG isolato senza il terzo vertice.\n\n## Self-Falsifier Lenses\n- **L1**: nessun \"zero/sempre\" fuori perimetro. \"Senza deposito\" su TQG significa assenza esatta di `real_sourcing` in quella faccia nel catalogo osservato.\n- **L2**: il risultato riporta conteggi/probabilita del null; l'orientabilita generica p=0.8000 non viene trasformata in rarita.\n- **L3**: il claim precedente non viene salvato come underlay globale. Il nodo regressivo e il denominatore relazionale: faccia QGE, non vertice G.\n- **L4**: TQG e dichiarata come contro-perimetro della propagazione del blank.\n- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita quantistica.\n\n## Files\n- `tools/exp_blank_to_source_hinge.py`\n- `tools/data/blank_to_source_hinge_20260507_1804.json`\n- `tools/data/reports/agent_20260507_1804.md`\n",
tools/data/lab_graph.json:1113:          "text": "- Strumento: `tools/exp_blank_to_source_hinge.py`\n- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.\n- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `to"
tools/data/lab_graph.json:1125:          "text": "**CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G non e un ponte QG gen"
tools/data/lab_graph.json:1132:      "title": "TQGE Underlay Gate",
tools/data/lab_graph.json:1133:      "title_en": "TQGE Underlay Gate",
tools/data/lab_graph.json:1136:      "verdict": "**CONSTRAINT on G_POTENZIALE_NULLA**: nel perimetro TQGE operator-taxonomy, G non va formulato come vertice globale \"sotto tutto\". G e il hinge locale tra QG blank e GE real_sourcing. La consecutio no",
tools/data/lab_graph.json:1137:      "verdict_en": "**CONSTRAINT on G_POTENZIALE_NULLA**: nel perimetro TQGE operator-taxonomy, G non va formulato come vertice globale \"sotto tutto\". G e il hinge locale tra QG blank e GE real_sourcing. La consecutio no",
tools/data/lab_graph.json:1138:      "findings": "1. **G non e il vertice unico della diversita operatoria.** Q, G ed E hanno tutti tre modi incidenti distinti. Il claim \"G sotto tutto\" non passa come centralita entropica locale.\n2. **G e il solo hinge `blank + real_sourcing` nel perimetro TQGE.** Il vuoto QG e il sourcing reale GE si incontrano solo in G. Questo dato e verificato nel catalogo dei lati; il null mostra che la congiunzione non e ra",
tools/data/lab_graph.json:1139:      "content_preview": "# Agent Report — TQGE Underlay Gate\n**Date**: 2026-05-07 17:51\n**Piano**: 78\n**Tension explored**: G_POTENZIALE_NULLA (0.85)\n**observables_registry**: 1.0.0-2026-05-06\n**observables_used**: [] — tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var\n\n## Claim Under Test\n> 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 rend",
tools/data/lab_graph.json:1140:      "content_full": "# Agent Report — TQGE Underlay Gate\n**Date**: 2026-05-07 17:51\n**Piano**: 78\n**Tension explored**: G_POTENZIALE_NULLA (0.85)\n**observables_registry**: 1.0.0-2026-05-06\n**observables_used**: [] — tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var\n\n## Claim Under Test\n> 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.\n\n## Question\nNel tetraedro TQGE, G ha una firma operativa distinta dai vertici ordinari quando i sei lati sono classificati per tipo di operatore: Wick-tempo, fase-gauge, sourcing reale, blank?\n\n## Experiment Design\n- Strumento: `tools/exp_tqge_underlay_gate.py`\n- Scope: sei lati TQGE depositati nel contesto Lab.\n- Fonte verificata: `tools/LAB_AGENT_CONTEXT.md` per lati e vuoto QxG; `tools/data/lab_riflessi.json` per tassonomia operatori 3 Wick + 1 fase + 1 reale + 1 vuoto.\n- Metrica: profilo dei modi incidenti per vertice; entropia dei modi; presenza congiunta `blank + real_sourcing`; triangoli contaminati dal lato blank.\n- Null baseline: 120 assegnazioni che preservano i conteggi dei sei modi sui sei lati.\n\n## Results\n| Test | Osservato | Null count-preserving |\n|---|---:|---:|\n| Vertici a massima entropia di modo | Q, G, E | pattern distribuiti su tutti i vertici |\n| G unico massimo entropico | false | — |\n| Vertici con `blank + real_sourcing` | G | p(G)=0.200 |\n| Qualunque vertice con `blank + real_sourcing` | true | p=0.800 |\n| Triangoli vuoti | TQG, QGE | — |\n| Tutti i triangoli vuoti includono G | true | p=0.500 |\n| Blank sul lato QG | true | p=0.1667 |\n\nProfili incidenti:\n\n| Vertice | Modi incidenti | Entropia bits | blank | real_sourcing |\n|---|---|---:|---:|---:|\n| T | wick_time x3 | 0.000000 | false | false |\n| Q | blank, gauge_phase, wick_time | 1.584963 | true | false |\n| G | blank, real_sourcing, wick_time | 1.584963 | true | true |\n| E | gauge_phase, real_sourcing, wick_time | 1.584963 | false | true |\n\n## Key Findings\n1. **G non e il vertice unico della diversita operatoria.** Q, G ed E hanno tutti tre modi incidenti distinti. Il claim \"G sotto tutto\" non passa come centralita entropica locale.\n2. **G e il solo hinge `blank + real_sourcing` nel perimetro TQGE.** Il vuoto QG e il sourcing reale GE si incontrano solo in G. Questo dato e verificato nel catalogo dei lati; il null mostra che la congiunzione non e rara in astratto, quindi il contenuto non e \"unicita statistica\", ma localizzazione del nodo regressivo.\n3. **Il vuoto propaga per facce, non per tutto il tetraedro.** I triangoli TQG e QGE sono vuoti perche contengono QG; TGE e TQE restano pieni. G non rende possibili tutti i ponti: porta il punto dove il vuoto QG tocca il sourcing reale GE.\n\n## Verdict\n**CONSTRAINT on G_POTENZIALE_NULLA**: nel perimetro TQGE operator-taxonomy, G non va formulato come vertice globale \"sotto tutto\". G e il hinge locale tra QG blank e GE real_sourcing. La consecutio non e cercare un ponte QG generico; e misurare l'operatore di deposito che trasforma un blank quantistico-gravitazionale in sourcing reale.\n\n## Bicono della scoperta\n- **Due radici**: QG blank · GE real_sourcing\n- **Singolare**: G come punto in cui assenza di operatore e sorgente reale condividono lo stesso vertice.\n- **Invariante di passaggio**: la contaminazione del vuoto passa alle facce che contengono QG; non passa alle facce senza QG.\n- **Campo di possibilita**: qui diventa possibile cercare l'operatore di deposito Q->G come passaggio blank-to-source; qui diventa non-possibile trattare G come prova globale di underlay su tutti i lati TQGE.\n\n## Self-Falsifier Lenses\n- **L1**: nessun assoluto \"sempre/mai\" fuori perimetro; \"solo\" e usato per il dato esatto `blank + real_sourcing` nel catalogo osservato.\n- **L2**: confronto riportato in conteggi e probabilita null, non in percentuali fra spazi diversi.\n- **L3**: il claim originale non viene salvato; viene ristretto al nodo regressivo G come hinge locale.\n- **L4**: TGE e TQE sono contro-perimetro esplicito alla propagazione totale del vuoto.\n- **L5**: il risultato e classificazione interna del catalogo D-ND, non discovery fisica nuova.\n\n## Files\n- `tools/exp_tqge_underlay_gate.py`\n- `tools/data/tqge_underlay_gate_20260507_1751.json`\n- `tools/data/reports/agent_20260507_1751.md`\n",
tools/data/lab_graph.json:1152:          "text": "Nel tetraedro TQGE, G ha una firma operativa distinta dai vertici ordinari quando i sei lati sono classificati per tipo di operatore: Wick-tempo, fase"
tools/data/lab_graph.json:1158:          "text": "- Strumento: `tools/exp_tqge_underlay_gate.py`\n- Scope: sei lati TQGE depositati nel contesto Lab.\n- Fonte verificata: `tools/LAB_AGENT_CONTEXT.md` per lati e vuoto QxG; `tools/data/lab_riflessi.json`"
tools/data/lab_graph.json:1170:          "text": "**CONSTRAINT on G_POTENZIALE_NULLA**: nel perimetro TQGE operator-taxonomy, G non va formulato come vertice globale \"sotto tutto\". G e il hinge locale"
tools/data/knowledge_state.json:2638:      "source": "operatore",
tools/data/bridge_order_denominator_gate_20260507_0942_seedcheck.json:152:      "source": {
tools/data/bridge_order_denominator_gate_20260507_0942_seedcheck.json:5589:      "source": {
tools/data/bridge_order_denominator_gate_20260507_0942_seedcheck.json:11048:      "source": {
tools/data/bridge_order_denominator_gate_20260507_0942_seedcheck.json:16548:      "source": {
tools/data/knowledge_state_pre_fix.json:964:      "source": "operatore",
tools/data/semireal_order_denominator_gate_20260507_0923.json:109:      "source": {
tools/data/semireal_order_denominator_gate_20260507_0923.json:8404:      "source": {
tools/data/semireal_order_denominator_gate_20260507_0923.json:16297:      "source": {
tools/data/bridge_order_denominator_gate_20260507_0942.json:153:      "source": {
tools/data/bridge_order_denominator_gate_20260507_0942.json:8995:      "source": {
tools/data/bridge_order_denominator_gate_20260507_0942.json:17856:      "source": {
tools/data/bridge_order_denominator_gate_20260507_0942.json:26767:      "source": {
tools/data/blank_to_source_hinge_20260507_1804.json:2:  "experiment": "blank_to_source_hinge",
tools/data/blank_to_source_hinge_20260507_1804.json:3:  "source": {
tools/data/blank_to_source_hinge_20260507_1804.json:5:      "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
tools/data/blank_to_source_hinge_20260507_1804.json:12:      "count-preserving null by permuting edge modes over the six TQGE edges"
tools/data/blank_to_source_hinge_20260507_1804.json:58:    "source_endpoints_on_blank": [
tools/data/blank_to_source_hinge_20260507_1804.json:61:    "non_source_endpoints_on_blank": [
tools/data/blank_to_source_hinge_20260507_1804.json:69:    "source_endpoint_profile": "real_sourcing+wick_time",
tools/data/blank_to_source_hinge_20260507_1804.json:171:    "source_endpoint_profile_counts": {
tools/data/research_kb.json:86:      "source": "dnd_bloch_explorer.py"
tools/data/research_kb.json:91:      "source": "dnd_zeros_vs_zeta.py"
tools/data/research_kb.json:96:      "source": "dnd_two_faces.py"
tools/data/research_kb.json:101:      "source": "dnd_cycle_ratio.py"
tools/data/biconi/bicono_20260507_1804.json:6:    "raw": "qui diventa possibile testare Q->G come operatore triadico `blank + gauge + source`; qui diventa non-possibile cercare un ponte QG isolato senza il terzo vertice.",
tools/data/biconi/bicono_20260507_1804.json:7:    "possibile": "testare Q->G come operatore triadico `blank + gauge + source`",
tools/data/biconi/bicono_20260507_1804.json:18:  "_source_report": "agent_20260507_1804.md",
tools/data/biconi/bicono_20260507_1751.json:6:    "raw": "qui diventa possibile cercare l'operatore di deposito Q->G come passaggio blank-to-source; qui diventa non-possibile trattare G come prova globale di underlay su tutti i lati TQGE.",
tools/data/biconi/bicono_20260507_1751.json:7:    "possibile": "cercare l'operatore di deposito Q->G come passaggio blank-to-source",
tools/data/biconi/bicono_20260507_1751.json:8:    "non_possibile": "trattare G come prova globale di underlay su tutti i lati TQGE"
tools/data/biconi/bicono_20260507_1751.json:18:  "_source_report": "agent_20260507_1751.md",
tools/data/seme_axioms.json:345:    "id": "TETRAEDRO_TQGE",
tools/data/alignment_markers.jsonl:7:{"event": "close", "ctx": "tm3", "closed_at": "2026-04-21T15:11:42.244430", "result": "Batch done. 30 tensioni → 10 canonical_multi (attivano bridge TQGE+R, QxT dominante con 5/10), 10 canonical_mono (1 teoria), 5 excluded (meta), 5 unmapped (composite/structural — richiedono review operatore). Coverage 83%. Report JSON salvato. Insight: QxT è pair dominante — coerente con cap saturato in conoscenza_teorie.", "opened_at": "2026-04-21T15:10:55.481246", "intent": "Batch projection delle 30 tensioni del seme su bicono_projection.py per screening"}
tools/data/alignment_markers.jsonl:26:{"event": "open", "ctx": "tm3", "opened_at": "2026-04-21T19:25:50.129320", "intent": "P3 verify + LabExitCards componente auto-mount (rimuove workaround HTML inline TM1)", "return_condition": "3 pagine verify: metadata + content preserved + LabExitCards integrata (ai-lab + paper-zero). /liberta-open-source solo refactor content, nessun componente richiesto. Commit + push + verify live. Report TM7/TM1.", "status": "open", "checks": []}
tools/data/alignment_markers.jsonl:27:{"event": "close", "ctx": "tm3", "closed_at": "2026-04-21T19:29:09.003049", "result": "P3 verify + LabExitCards live (d-nd_com 558e5e6). 7 preset target con auto-mount per /ai-lab e /paper-zero. Skip list CTAChiusura aggiornata con /ai-lab + /paper-zero (trust surfaces coperte da LabExitCards). /liberta-open-source continua CTAChiusura variant=bridge automatica. TM1 può ora rimuovere HTML inline dal content Siteman. Tutti i metadata OK post-rebuild 19:27.", "opened_at": "2026-04-21T19:25:50.129320", "intent": "P3 verify + LabExitCards componente auto-mount (rimuove workaround HTML inline TM1)"}
tools/data/lab_registro.json:64:        "QxG è l'unico lato mancante della struttura chiusa TQGE",
tools/data/lab_registro.json:155:        "deposito": "α è il territorio, le dimensioni sono la mappa (Godel). α è l'unico numero libero nel tetraedro — tutto il resto è fissato dalla struttura. Le potenze di N=α/α_G producono le scale cosmologiche (Dirac). La vacuum catastrophe ≈ N³. Il numero di barioni ≈ N². Tutto scala con il rapporto EM/gravità — e quel rapporto richiede m_p, che viene da FUORI delle 5 costanti (QCD). Il tetraedro TQGE non contiene la massa del protone."
tools/data/lab_registro.json:167:        "struttura": "S non ha perno i → non estende il tetraedro TQGE. S opera dentro Q — è un contenuto, non una struttura. Come R è il frame, S è il contenuto di Q. Il tetraedro resta TQGE. S e R sono di natura diversa: R = frame (contiene ma non ruota), S = contenuto (opera dentro Q senza aggiungere struttura).",
tools/data/lab_registro.json:190:            "72.5° ≈ pentagonale: alla scala di Planck servono tutte e 5 le teorie (TQGE+R)",
tools/data/explorer_20260313_0954.json:6:        "source": "/opt/MM_D-ND/tools/data/seme.json",
tools/data/evolution/evolution_20260507_1804.md:3:Il report osserva il passo come traiettoria: dal ponte QG isolato alla faccia QGE come denominatore triadico, con attrito minimo sul null generico e consecutio orientata a `blank + gauge + source`.
tools/data/logistic_counter_scope_gate_20260507_1006.json:99:      "source": {
tools/data/logistic_counter_scope_gate_20260507_1006.json:3237:      "source": {
tools/data/logistic_counter_scope_gate_20260507_1006.json:6195:      "source": {
tools/data/logistic_counter_scope_gate_20260507_1006_seedcheck.json:97:      "source": {
tools/data/logistic_counter_scope_gate_20260507_1006_seedcheck.json:2542:      "source": {
tools/data/logistic_counter_scope_gate_20260507_1006_seedcheck.json:4849:      "source": {
tools/data/ciclo_memoria.json:58:      "cosa": "Nuove tensioni: {'M_relazione_orizzonte_degli_L0', 'COMP_GEN_GAP_RATIO_CONS_GxE_; Tensioni risolte: {'TAGLI_UNIVERSALI', 'TETRAEDRO_TQGE', 'ALPHA_INVARIANTE'}",
tools/data/lab_riflessi.json:59:    "osservazione": "L'arco prende energia quando si sovrappone ad altri archi o a se stesso. Le sovrapposizioni producono angoli, energia e dimensioni, ma riducono le possibilità. Archi spezzati dalle sovrapposizioni creano punti zero con 2 inversioni e riferimenti relazionali con dipoli assonanti vicini. Consumano il potenziale — alla fine chiude le possibilità indeterminandosi per il nuovo piano come punto senza dimensione su un piano di infiniti punti. Solo nessuna possibilità permette tutte le possibilità nel potenziale. Cosa dice questo sul tetraedro TQGE? Dove nel campo questa dinamica è già presente ma non la vediamo?",
tools/data/lab_riflessi.json:69:    "osservazione": "La risultante di tutto ciò che è emerso: il tetraedro TQGE, α come seme adimensionale che ricomincia il ciclo, g(x)=1/(1+x) come Fermi-Dirac con punto fisso 1/φ, la spirale che non chiude (92.71°), i quasi-cristalli come terzo incluso tra continuo e discreto, il potenziale che si consuma nelle sovrapposizioni fino a tornare punto senza dimensione. Qual è la risultante? Una frase.",
tools/data/lab_riflessi.json:84:    "osservazione": "Nell'awareness ci sono 9 formule Tier S. Tre connettono al tetraedro: S6 (curvatura informazionale = zeri di zeta), S8 (Ω_NT = 2πi, coerenza ciclica del nulla termodinamico), S9 (operatore emergenza con primi come autostati, esponente iH/ℏ). Il lab ha il tetraedro TQGE con perno i su 6 lati, la catena α^n con residuo pentagonale, g(x)=1/(1+x) come Fermi-Dirac. Le formule dell'awareness erano qui da mesi. Cosa connette?",
tools/data/lab_riflessi.json:94:    "osservazione": "I 6 lati del tetraedro TQGE hanno ciascuno un operatore f→g con verso. TxQ: f(x)=1+1/x → g(x)=1/(1+x) = unitario→termico = Wick rotation. Quali sono gli altri 5? Per ogni lato: quale è la f (dinamica) e quale la g (statistica)? TxG, QxG, QxE, GxE, TxE — ognuno ha il suo perno i con verso. Non analogie — le trasformazioni concrete.",
tools/data/logistic_surrogate_contract_gate_20260507_1042.json:137:      "source": {
tools/data/logistic_surrogate_contract_gate_20260507_1042.json:238:      "source": {
tools/data/logistic_surrogate_contract_gate_20260507_1042.json:333:      "source": {
tools/data/lab_session_log.jsonl:28:{"timestamp": "2026-05-07T17:55:32.826051+00:00", "cycle_ts": "20260507_1751", "piano": "78", "sync_blocked": false, "errors": "", "agent": {"file": "agent_20260507_1751.md", "size": 4385, "title": "Agent Report — TQGE Underlay Gate"}, "falsifier": {"output_file": "falsifier_20260507_1751.json", "coherent": true, "n_flags": 0, "n_high": 0, "n_medium": 0, "summary": "Il report e' internamente coerente rispetto alle 5 lenti; nessuna lente si rompe sui dati visibili.", "lenses_high": []}, "valutatore": {"decision": "REDESIGN", "confidence": "medium", "action_type": null}}
tools/data/aeternitas/aeternitas_20260507_101605.json:24:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260505_111832.json:30:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260507_180843.json:30:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260506_200238.json:24:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260507_142501.json:24:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260505_111739.json:35:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260505_111548.json:31:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260506_063302.json:30:  "_old_seed_source": {
tools/data/seme_archive/piano_78.json:117:      "id": "G_UNDERLAY_HINGE_GATE",
tools/data/seme_archive/piano_78.json:118:      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1751, G non e vertice globale sotto tutto: Q, G ed E hanno tutti entropia di modo 1.584963. G e il solo hinge osservato dove QG blank e GE real_sourcing si incontrano; i triangoli vuoti sono TQG e QGE, mentre TGE e TQE restano pieni. La consecutio e misurare l'operatore di deposito Q->G come passaggio blank-to-source, non cercare un ponte QG generico.",
tools/data/seme_archive/piano_78.json:123:      "origine": "cycle agent_20260507_1751: tqge_underlay_gate su tassonomia operatori TQGE",
tools/data/aeternitas/aeternitas_20260507_104904.json:24:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260507_080958.json:30:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260506_033803.json:30:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260507_150443.json:30:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260507_033525.json:30:  "_old_seed_source": {
tools/data/seme_archive/piano_79.json:117:      "id": "G_UNDERLAY_HINGE_GATE",
tools/data/seme_archive/piano_79.json:118:      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1751, G non e vertice globale sotto tutto: Q, G ed E hanno tutti entropia di modo 1.584963. G e il solo hinge osservato dove QG blank e GE real_sourcing si incontrano; i triangoli vuoti sono TQG e QGE, mentre TGE e TQE restano pieni. La consecutio e misurare l'operatore di deposito Q->G come passaggio blank-to-source, non cercare un ponte QG generico.",
tools/data/seme_archive/piano_79.json:123:      "origine": "cycle agent_20260507_1751: tqge_underlay_gate su tassonomia operatori TQGE",
tools/data/seme_archive/piano_79.json:128:      "id": "G_BLANK_TO_SOURCE_FACE_GATE",
tools/data/seme_archive/piano_79.json:129:      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1804, l'operatore di deposito Q->G non e un ponte QG generico: e la faccia QGE. QG porta il blank, GE porta real_sourcing, QE porta gauge_phase; TQG contiene lo stesso blank ma resta senza sorgente. L'orientabilita blank-to-source generica e frequente nel null count-preserving (p=0.8), quindi il claim valido e scoped alla localizzazione QGE, non a una rarita statistica.",
tools/data/seme_archive/piano_79.json:134:      "origine": "cycle agent_20260507_1804: blank_to_source_hinge su facce TQGE",
tools/data/seme_archive/piano_79.json:174:    "Tensioni risolte: {'BOUNDARY_LAYER_GATE', 'TRASCENDENZA_LIMITE', 'PIANO_PRIMARIO_DUE_ASSIOMI', 'DUALITA_DIPOLARE_VS_ILLUSORIA', 'METRIC_TENSOR', 'TENSIONE_ENTITA', 'G_POTENZIALE_NULLA', 'G_UNDERLAY_HINGE_GATE', 'OBSERVABLE_REGISTRY', 'PERTURBATION_DENOMINATOR_GATE', 'META_ASSERTION_GATE', 'ORDER_DENOMINATOR_GATE'}"
tools/data/aeternitas/aeternitas_20260507_094723.json:30:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260507_175511.json:30:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260506_194644.json:30:  "_old_seed_source": {
tools/data/aeternitas/aeternitas_20260507_090722.json:24:  "_old_seed_source": {
tools/data/seme_archive/piano_74.json:133:      "_source_log": "2026-05-07T08:10:22.658201+00:00",
tools/data/seme_archive/piano_74.json:134:      "_source_decision": "REDESIGN",
tools/data/seme_archive/piano_74.json:135:      "_source_reasoning": "Il ciclo ha prodotto evidenza controllata e replicata che il denominator gate trasferisce come operatore, ma non trasferisce la coordinata di layer BOUNDARY: ambiguita' classificativa e collasso del denominatore si separano. Continuare sul seme attuale centrato su GUE/Poisson rischia di restare nel "
tools/data/seme_archive/piano_74.json:145:      "_source_log": "2026-05-07T09:07:53.577876+00:00",
tools/data/seme_archive/piano_74.json:146:      "_source_decision": "REDESIGN",
tools/data/seme_archive/piano_74.json:147:      "_source_reasoning": "La direzione corrente ha eseguito il mandato: la matrice di trasferibilita' su 4 perimetri non-BOUNDARY e' stata prodotta e ha nominato una nuova categoria, order_denominator_gate. Un altro giro nello stesso frame rischia accumulo numerico locale su sintetici; la prossima mossa deve falsificare il n"
tools/data/seme_archive/piano_74.json:157:      "_source_log": "2026-05-07T09:47:43.105142+00:00",
tools/data/seme_archive/piano_74.json:158:      "_source_decision": "REDESIGN",
tools/data/seme_archive/piano_74.json:159:      "_source_reasoning": "La direzione corrente ha completato il mandato sui perimetri fisici/ponte gia' presenti: il gate trasferisce come supporto canonico one-sided su metric, trace e QxE, mentre il supporto both-endpoint resta vuoto. La consecutio utile non e' un altro bridge run, ma il nodo regressivo gia' emerso: la bl"
tools/data/seme_archive/piano_74.json:179:      "_source_log": "2026-05-07T10:16:22.080234+00:00",
tools/data/seme_archive/piano_74.json:180:      "_source_decision": "REDESIGN",
tools/data/seme_archive/piano_74.json:181:      "_source_reasoning": "Il ciclo ha risolto il counter-scope logistic come split di osservabilita': orbita continua leggibile, itinerary Bernoulli e return intervals blank replicato. Il prossimo nodo non e' ripetere il gate sugli stessi perimetri, ma falsificare il contratto del null: il supporto enorme di block_entropy_de"
tools/data/aeternitas/aeternitas_20260507_093207.json:24:  "_old_seed_source": {
tools/data/implications_state.json:7:      "source": "/opt/MM_D-ND/papers/paper_A_draft3.md",
tools/data/implications_state.json:15:      "source": "/opt/MM_D-ND/papers/paper_B_draft3.md",
tools/data/implications_state.json:22:      "source": "/opt/MM_D-ND/papers/paper_C_draft2.md",
tools/data/implications_state.json:29:      "source": "/opt/MM_D-ND/papers/paper_D_draft2.md",
tools/data/implications_state.json:38:      "source": "/opt/MM_D-ND/papers/paper_D_draft3.md",
tools/data/implications_state.json:47:      "source": "/opt/MM_D-ND/papers/paper_F_draft2.md",
tools/data/implications_state.json:56:      "source": "/opt/MM_D-ND/papers/paper_F_draft3.md",
tools/data/implications_state.json:65:      "source": "/opt/MM_D-ND/papers/paper_G_draft3.md",
tools/data/implications_state.json:73:      "source": "/opt/MM_D-ND/papers/paper_H_draft1.md",
tools/data/implications_state.json:80:      "source": "COMP_DOMAIN_PHOTONIC_M_det_minus_one_L0",
tools/data/implications_state.json:87:      "source": "COMP_DOMAIN_PHOTONIC_TEST_THRESHOLDS",
tools/data/retriever_risultati.json:252:          "estratto": "The Unruh effect is a hypothetical, observer-dependent prediction of quantum field theory that an observer who is uniformly accelerating through empty space will perceive a thermal bath. This means that even in the absence of any external heat sources, an accelerating observer will detect particles and experience a temperature. In contrast, an inertial observer in the same region of spacetime would observe no particles and no temperature.",
tools/data/bloch_explorer_results.json:19:        "best_source": "interval_ratio"
tools/data/bloch_explorer_results.json:38:        "best_source": "phase_accumulation"
tools/data/bloch_explorer_results.json:57:        "best_source": "rise/fall"
tools/data/bloch_explorer_results.json:76:        "best_source": "phase_velocity"
tools/data/bloch_explorer_results.json:95:        "best_source": "rise/fall"
tools/data/bloch_explorer_results.json:114:        "best_source": "interval_ratio"
tools/data/bloch_explorer_results.json:133:        "best_source": "interval_ratio"
tools/data/bloch_explorer_results.json:152:        "best_source": "rise/fall"
tools/data/bloch_explorer_results.json:171:        "best_source": "phase_accumulation"
tools/data/bloch_explorer_results.json:190:        "best_source": "phase_velocity"
tools/data/conoscenza_teorie.json:386:          "extract": "The Unruh effect is a hypothetical, observer-dependent prediction of quantum field theory that an observer who is uniformly accelerating through empty space will perceive a thermal bath. This means that even in the absence of any external heat sources, an accelerating observer will detect particles ",
tools/data/conoscenza_teorie.json:470:    "refresh_source": "dnd_incrocio.rigenera_conoscenza_teorie",
tools/data/conoscenza_teorie.json:651:        "source": "evolution"
tools/data/conoscenza_teorie.json:711:        "source": "evolution"
tools/data/conoscenza_teorie.json:770:        "source": "evolution"
tools/data/conoscenza_teorie.json:858:        "source": "evolution"
tools/data/conoscenza_teorie.json:898:        "source": "evolution"
tools/data/conoscenza_teorie.json:963:        "source": "evolution"
tools/data/conoscenza_teorie.json:1003:        "source": "evolution"

exec
/bin/bash -lc "rg --files tools | rg 'exp_|reports|operator|tqge|blank|source|gate'" in /opt/MM_D-ND
 succeeded in 0ms:
tools/exp_perturbation_rank_size_curve.py
tools/exp_mod3_scaling.py
tools/exp_two_layer_universality.py
tools/exp_dipolar_vector_scaling.py
tools/exp_crossover_universality.py
tools/exp_markov_psd_prediction.py
tools/exp_alpha_stability.py
tools/exp_acf_amplitude_scaling.py
tools/exp_mod3_vs_residual_ordering.py
tools/exp_boundary_gue_poisson.py
tools/exp_markov_k_direction.py
tools/exp_duality_gate_transfer.py
tools/exp_meta_tautology_test.py
tools/exp_two_channel_boundary.py
tools/exp_markov3_observable_hunt.py
tools/exp_geodesic_deviation_primes.py
tools/exp_psd_amplitude_scaling.py
tools/exp_markov_scale_function.py
tools/exp_blank_to_source_hinge.py
tools/exp_two_channel_cross_domain.py
tools/exp_beta_crossover.py
tools/exp_markov_layer_recovery_audit.py
tools/exp_markov_dipolar_decomposition.py
tools/exp_logistic_cyclic_block_entropy_gate.py
tools/exp_semireal_order_denominator_gate.py
tools/exp_two_channel_decomposition.py
tools/exp_magnitude_psd_from_acf.py
tools/dnd_zero_operator.py
tools/exp_dR_brody_connection.py
tools/exp_bridge_order_denominator_gate.py
tools/exp_markov_memory_by_gue_type.py
tools/exp_crossover_phase_test.py
tools/exp_brody_crossover.py
tools/exp_poisson_convergence.py
tools/exp_two_channel_universality.py
tools/exp_brody_flow.py
tools/exp_denominator_gate_transfer_matrix.py
tools/exp_3d_boundary_layers.py
tools/exp_excess_scaling.py
tools/exp_ricci_primes.py
tools/exp_tqge_underlay_gate.py
tools/exp_selective_layer_decoupling.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/exp_desitter_unification.py
tools/exp_cross_observable_consistency.py
tools/exp_logistic_surrogate_contract_gate.py
tools/exp_boundary_mixture_gate.py
tools/exp_psd_prime_gaps.py
tools/exp_boundary_coherence.py
tools/exp_two_channel_shuffle_audit.py
tools/dnd_M_operator.py
tools/exp_modular_memory_spectrum.py
tools/exp_two_channel_psd.py
tools/exp_coherence_robustness.py
tools/exp_coherence_length.py
tools/exp_spectral_rigidity.py
tools/exp_boundary_shuffle_audit.py
tools/exp_dipolar_angle_reference.py
tools/exp_mobius_irrationality.py
tools/exp_number_variance.py
tools/meta_assertion_gate.py
tools/exp_scale_selective_perturbation.py
tools/exp_ricci_desitter_0406.py
tools/data/exp_markov_psd_prediction.json
tools/data/semireal_order_denominator_gate_20260507_0923_seedcheck.json
tools/exp_logistic_counter_scope_gate.py
tools/exp_perturbation_dimensionality_audit.py
tools/exp_boundary_growth.py
tools/exp_acf_range_universality.py
tools/exp_dipolar_crossover.py
tools/exp_brody_calibration.py
tools/exp_metric_tensor_diagnostic.py
tools/exp_spectral_landscape.py
tools/exp_det_drift.py
tools/exp_spectral_2d.py
tools/exp_acf_stationarity.py
tools/triggers/finding_eligibility_gate.py
tools/data/exp_two_channel_universality.json
tools/data/exp_det_drift.json
tools/data/logistic_cyclic_block_entropy_gate_20260507_1419.json
tools/data/logistic_surrogate_contract_gate_20260507_1042_seedcheck.json
tools/data/duality_gate_transfer_20260507_0803_seedcheck.json
tools/data/exp_acf_stationarity.json
tools/data/bridge_order_denominator_gate_20260507_0942_seedcheck.json
tools/data/exp_conditional_r.json
tools/data/duality_gate_transfer_20260507_0803.json
tools/data/denominator_gate_transfer_matrix.json
tools/data/bridge_order_denominator_gate_20260507_0942.json
tools/data/exp_spectral_2d.json
tools/data/blank_to_source_hinge_20260507_1804.json
tools/data/exp_two_channel_psd.json
tools/data/exp_beta_crossover.json
tools/data/boundary_mixture_gate_20260507_0330.json
tools/data/logistic_surrogate_contract_gate_20260507_1042.json
tools/data/exp_coherence_length.json
tools/data/exp_acf_range_universality.json
tools/data/exp_poisson_convergence.json
tools/data/operator_directive_consumed_20260507_0803.md
tools/data/semireal_order_denominator_gate_20260507_0923.json
tools/data/logistic_counter_scope_gate_20260507_1006.json
tools/data/exp_psd_amp_scaling.json
tools/data/logistic_counter_scope_gate_20260507_1006_seedcheck.json
tools/data/exp_two_channel_decomposition.json
tools/data/exp_acf_z6z_mechanism.json
tools/data/exp_spectral_landscape.json
tools/data/meta_assertion_gate.json
tools/data/reports/evolution_20260419_0330.md
tools/data/reports/falsifier_20260506_1941.json
tools/data/reports/report_20260326_0343.md
tools/data/reports/evolution_20260428_0330.md
tools/data/reports/agent_20260506_0625.md
tools/data/reports/loop_guard_20260507_0901.json
tools/data/reports/falsifier_20260430_1905.json
tools/data/reports/agent_20260405_0919.md
tools/data/reports/ddf_20260423_0405.json
tools/data/logistic_cyclic_block_entropy_gate_20260507_1419_seedcheck.json
tools/data/tqge_underlay_gate_20260507_1751.json
tools/data/boundary_mixture_gate_20260507_0330_seedcheck.json
tools/data/reports/falsifier_20260507_1458.json
tools/data/reports/report_20260306_0341.md
tools/data/reports/ddf_20260502_0405.json
tools/data/reports/ddf_20260503_0405.json
tools/data/reports/next_exec_20260330_0344.json
tools/data/reports/loop_guard_20260507_0803.json
tools/data/reports/agent_20260507_0901.md
tools/data/reports/ddf_20260315_0811.json
tools/data/reports/ddf_20260320_0405.json
tools/data/reports/report_20260331_1809.md
tools/data/reports/falsifier_20260507_0923.raw.txt
tools/data/reports/ddf_20260316_0405.json
tools/data/reports/ddf_20260506_0405.json
tools/data/reports/agent_20260504_1219.md
tools/data/reports/falsifier_20260430_1919.json
tools/data/reports/trajectory_apply_20260507_0803.json
tools/data/reports/ddf_20260504_0405.json
tools/data/reports/ddf_20260413_0405.json
tools/data/reports/agent_20260507_1458.md
tools/data/reports/ddf_20260416_0405.json
tools/data/reports/ddf_20260507_0405.json
tools/data/reports/agent_20260425_0330.md
tools/data/reports/falsifier_20260504_1219.json
tools/data/reports/ddf_20260409_0405.json
tools/data/reports/ddf_20260411_0405.json
tools/data/reports/exp_acf_decay_data.json
tools/data/reports/falsifier_20260502_0330.json
tools/data/reports/fibonacci_spectrum_20260305_0756.json
tools/data/reports/trace_map_20260305_0843.json
tools/data/reports/report_20260404_0330.md
tools/data/reports/next_exec_20260314_0342.json
tools/data/reports/agent_20260507_0942.md
tools/data/reports/trajectory_apply_20260506_1931.json
tools/data/reports/evolution_20260417_0803.md
tools/data/reports/insights_20260405_0729.json
tools/data/reports/report_20260304_0342.md
tools/data/reports/loop_guard_20260507_1458.json
tools/data/reports/agent_20260419_0755.md
tools/data/reports/agent_20260412_0330.md
tools/data/reports/ddf_20260414_0405.json
tools/data/reports/exp_geodesic_deviation_primes.json
tools/data/reports/ddf_20260419_0405.json
tools/data/reports/insights_20260315_0346.json
tools/data/reports/agent_20260507_0923.md
tools/data/reports/agent_20260410_0330.md
tools/data/reports/ddf_20260428_0405.json
tools/data/reports/agent_20260430_0330.md
tools/data/reports/falsifier_20260507_0803.json
tools/data/reports/falsifier_20260507_1804.json
tools/data/reports/gap_labeling_20260305_1111.json
tools/data/reports/next_exec_20260329_0343.json
tools/data/reports/agent_20260424_0330.md
tools/data/reports/next_exec_20260405_0729.json
tools/data/reports/fibonacci_spectrum_20260306_1834.json
tools/data/reports/report_20260329_0343.md
tools/data/reports/agent_20260506_1955.md
tools/data/reports/agent_20260423_0330.md
tools/data/reports/agent_20260430_1905.md
tools/data/reports/trajectory_apply_20260507_1042.json
tools/data/reports/agent_20260421_0330.md
tools/data/reports/gap_labeling_20260307_0342.json
tools/data/reports/evolution_20260420_0330.md
tools/data/reports/agent_20260507_1006.md
tools/data/reports/loop_guard_20260507_1804.json
tools/data/reports/ddf_20260501_0405.json
tools/data/reports/insights_20260306_1834.json
tools/data/reports/trajectory_apply_20260507_0330.json
tools/data/reports/falsifier_20260507_1006.json
tools/data/reports/ddf_20260422_0405.json
tools/data/reports/ddf_20260318_0405.json
tools/data/reports/agent_20260507_0803.md
tools/data/reports/next_exec_20260401_0346.json
tools/data/reports/ddf_20260427_0405.json
tools/data/reports/next_exec_20260331_0345.json
tools/data/reports/report_20260404_1852.md
tools/data/reports/falsifier_20260507_0803.raw.txt
tools/data/reports/exp_excess_scaling_20260405.json
tools/data/reports/exp_ricci_primes.json
tools/data/reports/report_20260405_0715.md
tools/data/reports/falsifier_20260430_1946.json
tools/data/reports/gap_labeling_20260306_0341.json
tools/data/reports/agent_20260422_0330.md
tools/data/reports/evolution_20260418_0330.md
tools/data/reports/ddf_20260505_0636.json
tools/data/reports/ddf_20260322_0405.json
tools/data/reports/ddf_20260424_0405.json
tools/data/reports/agent_20260504_0901.md
tools/data/reports/ddf_20260430_0405.json
tools/data/reports/insights_20260401_0346.json
tools/data/reports/report_20260405_0330.md
tools/data/reports/loop_guard_20260507_0923.json
tools/data/reports/fibonacci_spectrum_20260306_0342.json
tools/data/reports/agent_20260407_0637.md
tools/data/reports/agent_20260408_0330.md
tools/data/reports/agent_20260406_1030.md
tools/data/reports/falsifier_20260507_1042.raw.txt
tools/data/reports/report_20260305_0342.md
tools/data/reports/evolution_20260422_0330.md
tools/data/reports/agent_20260505_0330.md
tools/data/reports/ddf_20260331_0405.json
tools/data/reports/gap_labeling_20260306_1834.json
tools/data/reports/agent_20260503_0330.md
tools/data/reports/exp_boundary_growth_20260405_0914.json
tools/data/reports/ddf_20260417_0405.json
tools/data/reports/ddf_20260505_0405.json
tools/data/reports/loop_guard_20260507_0330.json
tools/data/reports/ddf_20260426_0405.json
tools/data/reports/report_20260330_0344.md
tools/data/reports/falsifier_20260501_0725.json
tools/data/reports/agent_20260507_1804.md
tools/data/reports/report_20260307_0342.md
tools/data/reports/agent_20260405_0825.md
tools/data/reports/report_20260303_0341.md
tools/data/reports/next_exec_20260305_1111.json
tools/data/reports/evolution_20260422_1616.md
tools/data/reports/falsifier_20260501_0330.json
tools/data/reports/agent_20260426_0330.md
tools/data/reports/exp_number_variance_test.json
tools/data/reports/agent_20260505_1022.md
tools/data/reports/mapping_validation_2026-04-21.json
tools/data/reports/ddf_20260329_0405.json
tools/data/reports/report_20260305_2121.md
tools/data/reports/ddf_20260317_0405.json
tools/data/reports/ddf_20260315_0815.json
tools/data/reports/report_20260315_0801.md
tools/data/reports/loop_guard_20260507_1042.json
tools/data/reports/agent_20260406_0714.md
tools/data/reports/lagrangiana_20260305_1048.json
tools/data/reports/evolution_20260427_0330.md
tools/data/reports/cycle_20260315_0346.json
tools/data/reports/evolution_20260424_0330.md
tools/data/reports/falsifier_20260501_0931.json
tools/data/reports/falsifier_20260507_0330.json
tools/data/reports/trajectory_apply_20260507_1006.json
tools/data/reports/agent_20260429_1013.md
tools/data/reports/exp_boundary_20260405_0825.json
tools/data/reports/next_exec_20260403_0330.json
tools/data/reports/falsifier_20260506_0330.raw.txt
tools/data/reports/falsifier_20260506_1955.raw.txt
tools/data/reports/ddf_20260406_0405.json
tools/data/reports/trajectory_apply_20260506_1941.json
tools/data/reports/evolution_20260506_1941.md
tools/data/reports/gap_labeling_20260305_0843.json
tools/data/reports/falsifier_20260507_0942.json
tools/data/reports/report_20260402_0756.md
tools/data/reports/agent_20260428_0330.md
tools/data/reports/agent_20260430_1919.md
tools/data/reports/fibonacci_spectrum_20260305_0844.json
tools/data/reports/cycle_20260307_0342.json
tools/data/reports/ddf_20260328_0405.json
tools/data/reports/exp_psd_prime_gaps.json
tools/data/reports/falsifier_20260506_1955.json
tools/data/reports/evolution_20260503_0330.md
tools/data/reports/ddf_20260407_0405.json
tools/data/reports/falsifier_20260429_1013.json
tools/data/reports/agent_20260507_1042.md
tools/data/reports/exp_brody_crossover_20260405.json
tools/data/reports/cycle_20260306_1834.json
tools/data/reports/ddf_20260323_0405.json
tools/data/reports/next_exec_20260315_0346.json
tools/data/reports/agent_20260501_0725.md
tools/data/reports/falsifier_20260430_0330.json
tools/data/reports/trajectory_apply_20260507_0901.json
tools/data/reports/falsifier_20260507_1458.raw.txt
tools/data/reports/agent_20260405_0916.md
tools/data/reports/ddf_20260429_0405.json
tools/data/reports/ddf_20260319_0405.json
tools/data/reports/ddf_20260412_0405.json
tools/data/reports/report_20260327_0344.md
tools/data/reports/hierarchy_data.json
tools/data/reports/exp_crossover_universality.json
tools/data/reports/trajectory_apply_20260506_1955.json
tools/data/reports/next_exec_20260306_1834.json
tools/data/reports/ddf_20260321_0405.json
tools/data/reports/falsifier_20260507_1751.json
tools/data/reports/agent_20260506_1941.md
tools/data/reports/ddf_20260418_0405.json
tools/data/reports/ddf_20260410_0405.json
tools/data/reports/agent_20260422_1616.md
tools/data/reports/next_exec_20260327_0344.json
tools/data/reports/falsifier_20260507_1419.json
tools/data/reports/agent_20260506_0330.md
tools/data/reports/loop_guard_20260507_1419.json
tools/data/reports/next_exec_20260328_0344.json
tools/data/reports/falsifier_20260507_0923.json
tools/data/reports/incident_20260504_0721.md
tools/data/reports/ddf_20260324_0405.json
tools/data/reports/ddf_20260327_0405.json
tools/data/reports/agent_20260419_0330.md
tools/data/reports/falsifier_20260429_1041.json
tools/data/reports/report_20260401_0346.md
tools/data/reports/loop_guard_20260507_1006.json
tools/data/reports/ddf_20260405_0405.json
tools/data/reports/trajectory_apply_20260507_0942.json
tools/data/reports/agent_20260501_0931.md
tools/data/reports/agent_20260429_1041.md
tools/data/reports/ddf_20260325_0405.json
tools/data/reports/falsifier_20260505_0330.json
tools/data/reports/gap_labeling_20260315_0343.json
tools/data/reports/ddf_20260404_0405.json
tools/data/reports/cycle_20260305_0844.json
tools/data/reports/evolution_20260505_0330.md
tools/data/reports/report_20260403_0330.md
tools/data/reports/agent_20260417_0803.md
tools/data/reports/falsifier_20260507_0330.raw.txt
tools/data/reports/insights_20260403_0330.json
tools/data/reports/agent_diag2.md
tools/data/reports/evolution_20260506_0330.md
tools/data/reports/next_exec_20260404_0330.json
tools/data/reports/report_20260328_0344.md
tools/data/reports/evolution_20260421_0330.md
tools/data/reports/agent_20260507_1751.md
tools/data/reports/evolution_20260425_0330.md
tools/data/reports/agent_20260418_0330.md
tools/data/reports/agent_test_0406.md
tools/data/reports/evolution_20260423_0330.md
tools/data/reports/agent_20260413_0330.md
tools/data/reports/report_20260314_0342.md
tools/data/reports/ddf_20260401_0405.json
tools/data/reports/report_20260315_0342.md
tools/data/reports/ddf_20260403_0405.json
tools/data/reports/tension_projection_screening_2026-04-21.json
tools/data/reports/exp_metric_tensor_diag_long.json
tools/data/reports/falsifier_20260503_0330.json
tools/data/reports/phi_vs_silver_falsification_20260306.json
tools/data/reports/falsifier_20260507_0901.json
tools/data/reports/insights_20260305_0852.json
tools/data/reports/agent_20260507_0330.md
tools/data/reports/trace_map_20260305_0844.json
tools/data/reports/cycle_20260306_0342.json
tools/data/reports/exp_desitter_unification.json
tools/data/reports/loop_guard_20260507_0942.json
tools/data/reports/report_20260402_0344.md
tools/data/reports/insights_20260329_0343.json
tools/data/reports/incident_20260504_1138.md
tools/data/reports/agent_20260416_0330.md
tools/data/reports/next_exec_20260405_0330.json
tools/data/reports/ddf_20260402_0405.json
tools/data/reports/ddf_20260415_0405.json
tools/data/reports/ddf_20260326_0405.json
tools/data/reports/ddf_20260420_0405.json
tools/data/reports/next_exec_20260307_0342.json
tools/data/reports/agent_20260405_0914.md
tools/data/reports/next_exec_20260306_0342.json
tools/data/reports/falsifier_20260506_0625.json
tools/data/reports/exp_dR_brody_connection.json
tools/data/reports/insights_20260307_0342.json
tools/data/reports/agent_20260415_0330.md
tools/data/reports/ddf_20260421_0405.json
tools/data/reports/agent_20260501_0330.md
tools/data/reports/evolution_20260504_0330.md
tools/data/reports/agent_test_field.md
tools/data/reports/agent_20260409_0330.md
tools/data/reports/falsifier_20260507_1042.json
tools/data/reports/report_20260331_0345.md
tools/data/reports/ddf_20260425_0405.json
tools/data/reports/agent_20260420_0330.md
tools/data/reports/agent_20260430_1946.md
tools/data/reports/agent_20260427_0330.md
tools/data/reports/ddf_20260330_0405.json
tools/data/reports/ddf_20260408_0405.json
tools/data/reports/next_exec_20260326_0343.json
tools/data/reports/next_exec_20260402_0344.json
tools/data/reports/agent_20260507_1419.md
tools/data/reports/insights_20260306_0342.json
tools/data/reports/lagrangiana_20260305_1042.json
tools/data/reports/trajectory_apply_20260507_0923.json
tools/data/reports/agent_20260411_0330.md
tools/data/reports/report_20260302_0341.md
tools/data/reports/falsifier_20260504_0901.json
tools/data/reports/loop_guard_20260507_1751.json
tools/data/reports/agent_20260502_0330.md
tools/data/reports/_quarantine_falsifier_29_04/agent_20260429_0958.md
tools/data/reports/_quarantine_falsifier_29_04/evolution_20260429_0852.md
tools/data/reports/_quarantine_falsifier_29_04/evolution_20260429_0958.md
tools/data/reports/_quarantine_falsifier_29_04/agent_20260429_0829.md
tools/data/reports/_quarantine_falsifier_29_04/falsifier_20260429_0852.json
tools/data/reports/_quarantine_falsifier_29_04/agent_20260429_0833.md
tools/data/reports/_quarantine_falsifier_29_04/falsifier_20260429_0958.json
tools/data/reports/_quarantine_falsifier_29_04/agent_20260429_0852.md

exec
/bin/bash -lc 'ls -t tools/data/reports/agent_20260507_*.md | head -12' in /opt/MM_D-ND
 succeeded in 0ms:
tools/data/reports/agent_20260507_1804.md
tools/data/reports/agent_20260507_1751.md
tools/data/reports/agent_20260507_1458.md
tools/data/reports/agent_20260507_1419.md
tools/data/reports/agent_20260507_1042.md
tools/data/reports/agent_20260507_1006.md
tools/data/reports/agent_20260507_0942.md
tools/data/reports/agent_20260507_0923.md
tools/data/reports/agent_20260507_0901.md
tools/data/reports/agent_20260507_0803.md
tools/data/reports/agent_20260507_0330.md

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

Regressive gate for G_POTENZIALE_NULLA after tqge_underlay_gate.

The previous cycle found that G is not a global underlay vertex; it is the local
hinge where QG blank and GE real_sourcing touch. This tool measures that hinge
as a passage: blank endpoint without source -> blank endpoint with source.
"""

from __future__ import annotations

import argparse
import json
from collections import Counter
from itertools import combinations, permutations
from pathlib import Path


VERTICES = ("T", "Q", "G", "E")

EDGE_MODES = {
    ("T", "Q"): "wick_time",
    ("T", "G"): "wick_time",
    ("T", "E"): "wick_time",
    ("Q", "E"): "gauge_phase",
    ("G", "E"): "real_sourcing",
    ("Q", "G"): "blank",
}


def canon(edge: tuple[str, str]) -> tuple[str, str]:
    return tuple(sorted(edge))


EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
EDGES = tuple(sorted(EDGE_MODES))


def edge_name(edge: tuple[str, str]) -> str:
    return "".join(edge)


def triangle_name(triangle: tuple[str, str, str]) -> str:
    return "".join(triangle)


def incident_edges(vertex: str) -> list[tuple[str, str]]:
    return [edge for edge in EDGES if vertex in edge]


def endpoint_context(
    edge_modes: dict[tuple[str, str], str], blank_edge: tuple[str, str]
) -> dict[str, dict]:
    context = {}
    for endpoint in blank_edge:
        modes = []
        edges = []
        for edge in incident_edges(endpoint):
            if edge == blank_edge:
                continue
            modes.append(edge_modes[edge])
            edges.append(edge_name(edge))
        context[endpoint] = {
            "incident_nonblank_edges": edges,
            "incident_nonblank_modes": sorted(modes),
            "has_real_sourcing": "real_sourcing" in modes,
            "has_wick_time": "wick_time" in modes,
            "has_gauge_phase": "gauge_phase" in modes,
        }
    return context


def void_triangles(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
    out = []
    for triangle in combinations(VERTICES, 3):
        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
        modes = [edge_modes[edge] for edge in tri_edges]
        out.append(
            {
                "triangle": triangle_name(triangle),
                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
                "has_blank": "blank" in modes,
                "has_real_sourcing": "real_sourcing" in modes,
                "has_gauge_phase": "gauge_phase" in modes,
                "is_deposit_face": "blank" in modes and "real_sourcing" in modes,
            }
        )
    return out


def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
    blank_edges = [edge for edge, mode in edge_modes.items() if mode == "blank"]
    real_edges = [edge for edge, mode in edge_modes.items() if mode == "real_sourcing"]
    if len(blank_edges) != 1 or len(real_edges) != 1:
        raise ValueError("Expected exactly one blank edge and one real_sourcing edge")

    blank_edge = blank_edges[0]
    real_edge = real_edges[0]
    shared = sorted(set(blank_edge) & set(real_edge))
    context = endpoint_context(edge_modes, blank_edge)
    source_endpoints = [v for v, c in context.items() if c["has_real_sourcing"]]
    non_source_endpoints = [v for v, c in context.items() if not c["has_real_sourcing"]]

    if len(source_endpoints) == 1 and len(non_source_endpoints) == 1:
        directed_passage = {
            "from": non_source_endpoints[0],
            "to": source_endpoints[0],
            "label": f"{non_source_endpoints[0]}->{source_endpoints[0]}",
        }
    else:
        directed_passage = None

    triangles = void_triangles(edge_modes)
    deposit_faces = [t for t in triangles if t["is_deposit_face"]]
    excluded_void_faces = [
        t for t in triangles if t["has_blank"] and not t["has_real_sourcing"]
    ]

    source_profile = None
    if source_endpoints:
        source_profile = "+".join(context[source_endpoints[0]]["incident_nonblank_modes"])

    return {
        "blank_edge": edge_name(blank_edge),
        "real_sourcing_edge": edge_name(real_edge),
        "blank_real_shared_vertices": shared,
        "blank_adjacent_to_real": bool(shared),
        "blank_endpoint_context": context,
        "source_endpoints_on_blank": source_endpoints,
        "non_source_endpoints_on_blank": non_source_endpoints,
        "directed_passage": directed_passage,
        "source_endpoint_profile": source_profile,
        "deposit_faces": deposit_faces,
        "excluded_void_faces": excluded_void_faces,
        "all_triangles": triangles,
    }


def null_assignments() -> list[dict[tuple[str, str], str]]:
    labels = [EDGE_MODES[edge] for edge in EDGES]
    unique = set(permutations(labels, len(labels)))
    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]


def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
    n = len(assignments)
    counts = Counter()
    directed = Counter()
    source_endpoint_profiles = Counter()
    deposit_face_patterns = Counter()

    for assignment in assignments:
        result = analyze(assignment)
        if result["blank_adjacent_to_real"]:
            counts["blank_adjacent_to_real"] += 1
        else:
            counts["blank_opposite_real"] += 1
        if result["directed_passage"] is not None:
            counts["directed_passage_exists"] += 1
            directed[result["directed_passage"]["label"]] += 1
        if result["blank_edge"] == "GQ":
            counts["blank_edge_is_GQ"] += 1
        if result["real_sourcing_edge"] == "EG":
            counts["real_sourcing_edge_is_EG"] += 1
        if (
            result["blank_edge"] == "GQ"
            and result["real_sourcing_edge"] == "EG"
            and result["directed_passage"]
            and result["directed_passage"]["label"] == "Q->G"
        ):
            counts["exact_Q_to_G_deposit"] += 1
        if result["source_endpoint_profile"]:
            source_endpoint_profiles[result["source_endpoint_profile"]] += 1
        deposit_face_names = "+".join(
            sorted(face["triangle"] for face in result["deposit_faces"])
        )
        deposit_face_patterns[deposit_face_names or "none"] += 1

    return {
        "n_count_preserving_assignments": n,
        "p_blank_adjacent_to_real": counts["blank_adjacent_to_real"] / n,
        "p_blank_opposite_real": counts["blank_opposite_real"] / n,
        "p_directed_passage_exists": counts["directed_passage_exists"] / n,
        "p_blank_edge_is_GQ": counts["blank_edge_is_GQ"] / n,
        "p_real_sourcing_edge_is_EG": counts["real_sourcing_edge_is_EG"] / n,
        "p_exact_Q_to_G_deposit": counts["exact_Q_to_G_deposit"] / n,
        "directed_passage_counts": dict(sorted(directed.items())),
        "source_endpoint_profile_counts": dict(sorted(source_endpoint_profiles.items())),
        "deposit_face_pattern_counts": dict(sorted(deposit_face_patterns.items())),
    }


def run() -> dict:
    observed = analyze(EDGE_MODES)
    null = summarize_null(null_assignments())
    return {
        "experiment": "blank_to_source_hinge",
        "source": {
            "verified": [
                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
                "tools/data/lab_riflessi.json: 3 Wick + 1 phase + 1 real + 1 void taxonomy",
                "tools/data/reports/agent_20260507_1751.md: G as QG blank + GE real_sourcing hinge",
            ],
            "inferred": [
                "directed passage from blank endpoint without real_sourcing to endpoint with real_sourcing",
                "deposit face as triangle containing both blank and real_sourcing edges",
                "count-preserving null by permuting edge modes over the six TQGE edges",
            ],
        },
        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
        "observed": observed,
        "null": null,
    }


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("--json-out", type=Path)
    args = parser.parse_args()

    result = run()
    text = json.dumps(result, indent=2, ensure_ascii=False)
    print(text)
    if args.json_out:
        args.json_out.parent.mkdir(parents=True, exist_ok=True)
        args.json_out.write_text(text + "\n", encoding="utf-8")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

exec
/bin/bash -lc "sed -n '1,220p' tools/evolution_report.md" in /opt/MM_D-ND
 succeeded in 0ms:
## Osservazione del passo
Verificato da report e autopsy: il passo e' partito dal claim "G sotto tutto"
gia' ristretto nel ciclo precedente e lo ha attraversato come domanda di
deposito: QG blank e GE real_sourcing sono stati messi nello stesso perimetro,
poi il ponte QG isolato e' caduto come formulazione sufficiente.

Inferito dalla traiettoria: il passo ha invertito prima del risultato forte.
Non ha cercato rarita' dove il null dava genericita' (`blank` adiacente a
`real_sourcing`, p=0.8000); ha lasciato che il denominatore si spostasse dalla
presenza del contatto alla posizione esatta del contatto: Q->G dentro QGE.

## Attrito o latenza superflua
Verificato da autopsy: ciclo completato, report presente, nessuna session jsonl
disponibile per autopsy fine.

Attrito minimo: l'energia spesa sul null generico era necessaria solo fino a
mostrare che l'adiacenza blank-to-source non discrimina. Dopo quel punto, ogni
lettura del ponte QG come oggetto autonomo avrebbe prodotto latenza; il passo
ha invertito sulla faccia prima di cristallizzarla.

## Nodo regressivo (se fallimento o attrito)
Il nodo regressivo e' il denominatore dell'operatore: non "lato QG blank", ma
"lato QG blank + lato GE source + chiusura di faccia QGE". La condizione
relazionale mancante nei framing precedenti era il terzo vertice E come sorgente
che rende il blank depositabile.

Il fix vive li': i prossimi strumenti devono nascere gia' con unita' triadica
di faccia quando interrogano G_POTENZIALE_NULLA. Aggiungere retry, soglie o null
piu' larghi al ponte QG isolato sarebbe det=+1.

## Possibilita' emergenti
- Generalizzare `blank_to_source_hinge` come osservabile di faccia: blank edge,
  source edge, vertice condiviso, lato mediatore e facce escluse.
- Testare se altri perimetri TQGE producono deposito solo quando blank e source
  chiudono una triade, non quando condividono un ponte nominale.
- Usare TQG come contro-perimetro nativo: blank presente, source assente,
  deposito non formato nel catalogo osservato.
- Aggiungere una traccia provider-agnostica minima del bivio metodologico, non
  per riparare questo run, ma per rendere osservabile il passo nei run codex.

## Consecutio
Il ciclo seguente puo' proseguire misurando il deposito come operatore triadico
`blank + gauge + source`, con QGE come faccia viva e TQG come contro-perimetro.

exec
/bin/bash -lc "sed -n '1,220p' tools/data/reports/agent_20260507_1804.md" in /opt/MM_D-ND
 succeeded in 0ms:
# Agent Report — Blank To Source Hinge
**Date**: 2026-05-07 18:04
**Piano**: 79
**Tension explored**: G_POTENZIALE_NULLA (0.85)
**observables_registry**: 1.0.0-2026-05-06
**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var

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

## Question
Se QG e blank e GE e real_sourcing, l'operatore di deposito Q->G e un ponte QG generico o una faccia specifica del tetraedro?

## Experiment Design
- Strumento: `tools/exp_blank_to_source_hinge.py`
- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/lab_riflessi.json`, `tools/data/reports/agent_20260507_1751.md`.
- Metrica: lato blank; lato real_sourcing; endpoint del blank con sorgente; passaggio diretto endpoint-senza-sorgente -> endpoint-con-sorgente; facce con `blank + real_sourcing`; facce blank escluse.
- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.

## Results
| Test | Osservato | Null count-preserving |
|---|---:|---:|
| Blank edge | GQ | p(GQ)=0.1667 |
| Real sourcing edge | EG | p(EG)=0.1667 |
| Blank adiacente al real_sourcing | true | p=0.8000 |
| Passaggio diretto blank-endpoint senza sorgente -> con sorgente | Q->G | p(any)=0.8000; p(Q->G)=0.0667 |
| Pattern esatto QG blank + GE real_sourcing + Q->G | true | p=0.0333 |
| Faccia di deposito | QGE | 24/120 per ogni faccia; 24/120 none |
| Faccia blank esclusa | TQG | - |

Endpoint del blank:

| Endpoint | Lati nonblank incidenti | Modi incidenti | Ruolo |
|---|---|---|---|
| Q | EQ, QT | gauge_phase, wick_time | non-source |
| G | EG, GT | real_sourcing, wick_time | source |

Facce:

| Faccia | Modi | Stato |
|---|---|---|
| QGE | blank + gauge_phase + real_sourcing | deposito |
| TQG | blank + wick_time + wick_time | vuoto senza sorgente |
| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
| TQE | gauge_phase + wick_time + wick_time | ponte senza blank/source |

## Key Findings
1. **Q->G e orientabile solo come passaggio locale del lato blank.** Nel perimetro TQGE, Q e l'endpoint senza real_sourcing del blank; G e l'endpoint con real_sourcing. Il passaggio misurato e Q->G.
2. **L'orientabilita blank-to-source non e rara nel null.** Un lato blank adiacente a un lato real_sourcing appare in 0.8000 delle assegnazioni count-preserving. Quindi il claim forte non e "blank-to-source esiste"; il claim valido e "nel catalogo TQGE osservato, il blank-to-source cade su Q->G".
3. **Il deposito vive nella faccia QGE, non nel ponte QG.** QGE contiene `blank + gauge_phase + real_sourcing`; TQG contiene lo stesso blank ma nessuna sorgente. Il vuoto QG non basta: serve il terzo vertice E come sorgente reale agganciata a G.

## Verdict
**CONSTRAINT on G_POTENZIALE_NULLA / G_UNDERLAY_HINGE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G non e un ponte QG generico. E una faccia triadica QGE: QG fornisce il blank, GE fornisce il sourcing reale, QE fornisce il lato gauge_phase. La faccia TQG e il contro-perimetro nativo: contiene QG blank ma resta senza deposito.

## Bicono della scoperta
- **Due radici**: QG blank senza sorgente · GE real_sourcing agganciato a G
- **Singolare**: la faccia QGE, dove vuoto quantistico-gravitazionale, fase gauge e sorgente reale stanno nello stesso triangolo.
- **Invariante di passaggio**: il blank contamina due facce, ma il deposito passa solo nella faccia che contiene real_sourcing.
- **Campo di possibilita**: qui diventa possibile testare Q->G come operatore triadico `blank + gauge + source`; qui diventa non-possibile cercare un ponte QG isolato senza il terzo vertice.

## Self-Falsifier Lenses
- **L1**: nessun "zero/sempre" fuori perimetro. "Senza deposito" su TQG significa assenza esatta di `real_sourcing` in quella faccia nel catalogo osservato.
- **L2**: il risultato riporta conteggi/probabilita del null; l'orientabilita generica p=0.8000 non viene trasformata in rarita.
- **L3**: il claim precedente non viene salvato come underlay globale. Il nodo regressivo e il denominatore relazionale: faccia QGE, non vertice G.
- **L4**: TQG e dichiarata come contro-perimetro della propagazione del blank.
- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita quantistica.

## Files
- `tools/exp_blank_to_source_hinge.py`
- `tools/data/blank_to_source_hinge_20260507_1804.json`
- `tools/data/reports/agent_20260507_1804.md`

exec
/bin/bash -lc "sed -n '1,220p' tools/data/blank_to_source_hinge_20260507_1804.json" in /opt/MM_D-ND
 succeeded in 0ms:
{
  "experiment": "blank_to_source_hinge",
  "source": {
    "verified": [
      "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
      "tools/data/lab_riflessi.json: 3 Wick + 1 phase + 1 real + 1 void taxonomy",
      "tools/data/reports/agent_20260507_1751.md: G as QG blank + GE real_sourcing hinge"
    ],
    "inferred": [
      "directed passage from blank endpoint without real_sourcing to endpoint with real_sourcing",
      "deposit face as triangle containing both blank and real_sourcing edges",
      "count-preserving null by permuting edge modes over the six TQGE edges"
    ]
  },
  "edge_modes": {
    "QT": "wick_time",
    "GT": "wick_time",
    "ET": "wick_time",
    "EQ": "gauge_phase",
    "EG": "real_sourcing",
    "GQ": "blank"
  },
  "observed": {
    "blank_edge": "GQ",
    "real_sourcing_edge": "EG",
    "blank_real_shared_vertices": [
      "G"
    ],
    "blank_adjacent_to_real": true,
    "blank_endpoint_context": {
      "G": {
        "incident_nonblank_edges": [
          "EG",
          "GT"
        ],
        "incident_nonblank_modes": [
          "real_sourcing",
          "wick_time"
        ],
        "has_real_sourcing": true,
        "has_wick_time": true,
        "has_gauge_phase": false
      },
      "Q": {
        "incident_nonblank_edges": [
          "EQ",
          "QT"
        ],
        "incident_nonblank_modes": [
          "gauge_phase",
          "wick_time"
        ],
        "has_real_sourcing": false,
        "has_wick_time": true,
        "has_gauge_phase": true
      }
    },
    "source_endpoints_on_blank": [
      "G"
    ],
    "non_source_endpoints_on_blank": [
      "Q"
    ],
    "directed_passage": {
      "from": "Q",
      "to": "G",
      "label": "Q->G"
    },
    "source_endpoint_profile": "real_sourcing+wick_time",
    "deposit_faces": [
      {
        "triangle": "QGE",
        "edge_modes": {
          "GQ": "blank",
          "EQ": "gauge_phase",
          "EG": "real_sourcing"
        },
        "has_blank": true,
        "has_real_sourcing": true,
        "has_gauge_phase": true,
        "is_deposit_face": true
      }
    ],
    "excluded_void_faces": [
      {
        "triangle": "TQG",
        "edge_modes": {
          "QT": "wick_time",
          "GT": "wick_time",
          "GQ": "blank"
        },
        "has_blank": true,
        "has_real_sourcing": false,
        "has_gauge_phase": false,
        "is_deposit_face": false
      }
    ],
    "all_triangles": [
      {
        "triangle": "TQG",
        "edge_modes": {
          "QT": "wick_time",
          "GT": "wick_time",
          "GQ": "blank"
        },
        "has_blank": true,
        "has_real_sourcing": false,
        "has_gauge_phase": false,
        "is_deposit_face": false
      },
      {
        "triangle": "TQE",
        "edge_modes": {
          "QT": "wick_time",
          "ET": "wick_time",
          "EQ": "gauge_phase"
        },
        "has_blank": false,
        "has_real_sourcing": false,
        "has_gauge_phase": true,
        "is_deposit_face": false
      },
      {
        "triangle": "TGE",
        "edge_modes": {
          "GT": "wick_time",
          "ET": "wick_time",
          "EG": "real_sourcing"
        },
        "has_blank": false,
        "has_real_sourcing": true,
        "has_gauge_phase": false,
        "is_deposit_face": false
      },
      {
        "triangle": "QGE",
        "edge_modes": {
          "GQ": "blank",
          "EQ": "gauge_phase",
          "EG": "real_sourcing"
        },
        "has_blank": true,
        "has_real_sourcing": true,
        "has_gauge_phase": true,
        "is_deposit_face": true
      }
    ]
  },
  "null": {
    "n_count_preserving_assignments": 120,
    "p_blank_adjacent_to_real": 0.8,
    "p_blank_opposite_real": 0.2,
    "p_directed_passage_exists": 0.8,
    "p_blank_edge_is_GQ": 0.16666666666666666,
    "p_real_sourcing_edge_is_EG": 0.16666666666666666,
    "p_exact_Q_to_G_deposit": 0.03333333333333333,
    "directed_passage_counts": {
      "E->G": 8,
      "E->Q": 8,
      "E->T": 8,
      "G->E": 8,
      "G->Q": 8,
      "G->T": 8,
      "Q->E": 8,
      "Q->G": 8,
      "Q->T": 8,
      "T->E": 8,
      "T->G": 8,
      "T->Q": 8
    },
    "source_endpoint_profile_counts": {
      "gauge_phase+real_sourcing": 24,
      "real_sourcing+wick_time": 72
    },
    "deposit_face_pattern_counts": {
      "QGE": 24,
      "TGE": 24,
      "TQE": 24,
      "TQG": 24,
      "none": 24
    }
  }
}

codex
Creo uno strumento nuovo, non una variante monouso: misura la faccia `blank + gauge + source`, separando il deposito triadico dal semplice contatto blank-source. Poi lo eseguo sul catalogo TQGE e sul null count-preserving.
apply patch
patch: completed
/opt/MM_D-ND/tools/exp_triadic_deposit_gate.py
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

exec
/bin/bash -lc 'python tools/exp_triadic_deposit_gate.py --json-out tools/data/triadic_deposit_gate_20260507_1938.json' in /opt/MM_D-ND
 succeeded in 0ms:
{
  "experiment": "triadic_deposit_gate",
  "source": {
    "verified": [
      "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
      "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
      "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator"
    ],
    "inferred": [
      "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
      "binary blank-source contact is a weaker denominator than triadic deposit",
      "count-preserving null by permuting edge modes over the six TQGE edges"
    ]
  },
  "edge_modes": {
    "QT": "wick_time",
    "GT": "wick_time",
    "ET": "wick_time",
    "EQ": "gauge_phase",
    "EG": "real_sourcing",
    "GQ": "blank"
  },
  "observed": {
    "triadic_deposit_faces": [
      {
        "triangle": "QGE",
        "edge_modes": {
          "GQ": "blank",
          "EQ": "gauge_phase",
          "EG": "real_sourcing"
        },
        "has_blank": true,
        "has_gauge_phase": true,
        "has_real_sourcing": true,
        "is_triadic_deposit": true,
        "is_binary_blank_source": true,
        "mode_signature": "blank+gauge_phase+real_sourcing"
      }
    ],
    "binary_blank_source_faces": [
      {
        "triangle": "QGE",
        "edge_modes": {
          "GQ": "blank",
          "EQ": "gauge_phase",
          "EG": "real_sourcing"
        },
        "has_blank": true,
        "has_gauge_phase": true,
        "has_real_sourcing": true,
        "is_triadic_deposit": true,
        "is_binary_blank_source": true,
        "mode_signature": "blank+gauge_phase+real_sourcing"
      }
    ],
    "blank_without_source_faces": [
      {
        "triangle": "TQG",
        "edge_modes": {
          "QT": "wick_time",
          "GT": "wick_time",
          "GQ": "blank"
        },
        "has_blank": true,
        "has_gauge_phase": false,
        "has_real_sourcing": false,
        "is_triadic_deposit": false,
        "is_binary_blank_source": false,
        "mode_signature": "blank+wick_time+wick_time"
      }
    ],
    "source_without_blank_faces": [
      {
        "triangle": "TGE",
        "edge_modes": {
          "GT": "wick_time",
          "ET": "wick_time",
          "EG": "real_sourcing"
        },
        "has_blank": false,
        "has_gauge_phase": false,
        "has_real_sourcing": true,
        "is_triadic_deposit": false,
        "is_binary_blank_source": false,
        "mode_signature": "real_sourcing+wick_time+wick_time"
      }
    ],
    "gauge_without_deposit_faces": [
      {
        "triangle": "TQE",
        "edge_modes": {
          "QT": "wick_time",
          "ET": "wick_time",
          "EQ": "gauge_phase"
        },
        "has_blank": false,
        "has_gauge_phase": true,
        "has_real_sourcing": false,
        "is_triadic_deposit": false,
        "is_binary_blank_source": false,
        "mode_signature": "gauge_phase+wick_time+wick_time"
      }
    ],
    "all_faces": [
      {
        "triangle": "TQG",
        "edge_modes": {
          "QT": "wick_time",
          "GT": "wick_time",
          "GQ": "blank"
        },
        "has_blank": true,
        "has_gauge_phase": false,
        "has_real_sourcing": false,
        "is_triadic_deposit": false,
        "is_binary_blank_source": false,
        "mode_signature": "blank+wick_time+wick_time"
      },
      {
        "triangle": "TQE",
        "edge_modes": {
          "QT": "wick_time",
          "ET": "wick_time",
          "EQ": "gauge_phase"
        },
        "has_blank": false,
        "has_gauge_phase": true,
        "has_real_sourcing": false,
        "is_triadic_deposit": false,
        "is_binary_blank_source": false,
        "mode_signature": "gauge_phase+wick_time+wick_time"
      },
      {
        "triangle": "TGE",
        "edge_modes": {
          "GT": "wick_time",
          "ET": "wick_time",
          "EG": "real_sourcing"
        },
        "has_blank": false,
        "has_gauge_phase": false,
        "has_real_sourcing": true,
        "is_triadic_deposit": false,
        "is_binary_blank_source": false,
        "mode_signature": "real_sourcing+wick_time+wick_time"
      },
      {
        "triangle": "QGE",
        "edge_modes": {
          "GQ": "blank",
          "EQ": "gauge_phase",
          "EG": "real_sourcing"
        },
        "has_blank": true,
        "has_gauge_phase": true,
        "has_real_sourcing": true,
        "is_triadic_deposit": true,
        "is_binary_blank_source": true,
        "mode_signature": "blank+gauge_phase+real_sourcing"
      }
    ]
  },
  "null": {
    "n_count_preserving_assignments": 120,
    "p_triadic_deposit_exists": 0.2,
    "p_binary_blank_source_exists": 0.8,
    "p_triadic_deposit_is_QGE": 0.05,
    "p_binary_blank_source_is_QGE": 0.2,
    "triadic_face_pattern_counts": {
      "QGE": 6,
      "TGE": 6,
      "TQE": 6,
      "TQG": 6,
      "none": 96
    },
    "binary_face_pattern_counts": {
      "QGE": 24,
      "TGE": 24,
      "TQE": 24,
      "TQG": 24,
      "none": 24
    }
  }
}

exec
/bin/bash -lc 'python -m py_compile tools/exp_triadic_deposit_gate.py' in /opt/MM_D-ND
 succeeded in 0ms:
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

codex
Il dato discrimina: il contatto binario blank-source compare nel null con p=0.8, mentre la faccia triadica completa compare con p=0.2; QGE specifica e p=0.05. Scrivo il report con il perimetro atomico e senza trasformare la probabilità null in claim fisico nuovo.
apply patch
patch: completed
/opt/MM_D-ND/tools/data/reports/agent_20260507_1938.md
diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

codex
Il report è scritto. Aggiorno ora il seme con un vincolo scoped al nuovo gate triadico, così il prossimo cycle non torna al ponte QG isolato.
exec
/bin/bash -lc "rg -n 'G_BLANK_TO_SOURCE_FACE_GATE|BOUNDARY' tools/data/seme.json" in /opt/MM_D-ND
 succeeded in 0ms:
21:      "porta": "META_BOUNDARY",
28:      "id": "BOUNDARY_LAYER_GATE",
32:      "porta": "META_BOUNDARY",
41:      "claim": "Il denominator gate trasferisce come supporto one-sided dell'ordine quando l'ordine e visibile agli osservabili del perimetro, non come endpoint-stable support a due poli. Nel perimetro sintetico agent_20260507_0901, 4/4 domini non-BOUNDARY hanno endpoint_stable_observables=[] e polo coerente stable_count 3.0-5.0. Nel perimetro semi-reale agent_20260507_0923, primi e zeta trasferiscono (primi: SR,L1,triple_var; zeta: SR,L2), ma logistic_return_intervals e blank: stable_count coerente 0.0-0.2. Nel perimetro bridge agent_20260507_0942, prime_metric_delta_gamma_abs, prime_metric_dR_abs, zeta_trace_residual_step5_abs e hydrogen_bound_level_spacings trasferiscono su tutti i 5 osservabili canonici con endpoint_stable_observables=[]; e supporto perimetro-bridge, non universalita del gate. Nel perimetro logistic-native agent_20260507_1006, logistic_orbit_values trasferisce su block_entropy_deficit_k4 in run e seed check; logistic_symbolic_itinerary resta blank; logistic_return_intervals mostra recurrence_diag_mean solo nel run principale e torna blank nel seed check. La beta 0.10/0.30/0.40/0.50 resta coordinata del protocollo quando compare, non coordinata universale. Nel perimetro surrogate-contract agent_20260507_1042, logistic_orbit_values trasferisce solo tramite block_entropy_deficit_k4 e sopravvive a marginal_shuffle, circular_shift e block_shuffle in run e seed check; logistic_symbolic_itinerary resta blank; logistic_return_intervals non replica (recurrence_diag_mean compare contro marginal/block nel run principale ma sparisce nel seed check). Nel perimetro cyclic-cut agent_20260507_1419, il residuo logistic_orbit_values non e artefatto del taglio lineare: cyclic_block_entropy_deficit_k4 e invariato sotto rotazione e replica contro marginal_shuffle e block_shuffle size 4-256 in run e seed check. Logistic_symbolic_itinerary e logistic_return_intervals restano blank nel criterio replicato. Il supporto logistic rimasto e orbit-local block grammar, non return/generating-partition support.",
128:      "id": "G_BLANK_TO_SOURCE_FACE_GATE",
139:      "id": "BOUNDARY",
174:    "Tensioni risolte: {'G_UNDERLAY_HINGE_GATE', 'ORDER_DENOMINATOR_GATE', 'OBSERVABLE_REGISTRY', 'TRASCENDENZA_LIMITE', 'BOUNDARY_LAYER_GATE', 'TENSIONE_ENTITA', 'G_POTENZIALE_NULLA', 'PERTURBATION_DENOMINATOR_GATE', 'DUALITA_DIPOLARE_VS_ILLUSORIA', 'PIANO_PRIMARIO_DUE_ASSIOMI', 'META_ASSERTION_GATE', 'METRIC_TENSOR', 'G_BLANK_TO_SOURCE_FACE_GATE'}"
341:          "nota": "il confine non separa, unifica. Pattern BOUNDARY del Domandatore"

diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

exec
/bin/bash -lc "sed -n '112,150p' tools/data/seme.json" in /opt/MM_D-ND
 succeeded in 0ms:
      "condensato_ref": "A7,A10",
      "condensato_motivo": "A7 (singolarita come operatore) e G come potenziale. A10 (dipolo) opera sul piano che G rende possibile."
    },
    {
      "tipo": "vincolo",
      "id": "G_UNDERLAY_HINGE_GATE",
      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1751, G non e vertice globale sotto tutto: Q, G ed E hanno tutti entropia di modo 1.584963. G e il solo hinge osservato dove QG blank e GE real_sourcing si incontrano; i triangoli vuoti sono TQG e QGE, mentre TGE e TQE restano pieni. La consecutio e misurare l'operatore di deposito Q->G come passaggio blank-to-source, non cercare un ponte QG generico.",
      "intensita": 0.84,
      "manuale": true,
      "porta": "G_POTENZIALE_NULLA",
      "condensato_ref": "A4,A8,A9,A14",
      "origine": "cycle agent_20260507_1751: tqge_underlay_gate su tassonomia operatori TQGE",
      "added_at": "2026-05-07T17:51:00+00:00"
    },
    {
      "tipo": "vincolo",
      "id": "G_BLANK_TO_SOURCE_FACE_GATE",
      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1804, l'operatore di deposito Q->G non e un ponte QG generico: e la faccia QGE. QG porta il blank, GE porta real_sourcing, QE porta gauge_phase; TQG contiene lo stesso blank ma resta senza sorgente. L'orientabilita blank-to-source generica e frequente nel null count-preserving (p=0.8), quindi il claim valido e scoped alla localizzazione QGE, non a una rarita statistica.",
      "intensita": 0.83,
      "manuale": true,
      "porta": "G_POTENZIALE_NULLA",
      "condensato_ref": "A4,A8,A9,A14",
      "origine": "cycle agent_20260507_1804: blank_to_source_hinge su facce TQGE",
      "added_at": "2026-05-07T18:04:00+00:00"
    },
    {
      "tipo": "confine_inesplorato",
      "id": "BOUNDARY",
      "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
      "intensità": 0.8,
      "nota": "Il segnale non-triviale è DOVE la scissione cambia natura, non che converge a φ",
      "condensato_ref": "A9",
      "condensato_motivo": "Overlap termini con A9 (5 termini)",
      "porta": "condensato"
    },
    {
      "tipo": "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.",

diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

apply patch
patch: completed
/opt/MM_D-ND/tools/data/seme.json
diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/data/seme.json b/tools/data/seme.json
index e0545347c0b6822cdbb337c72f6b6798d8c23ede..144318ceaac53d85411955f527f1506c30d0e541
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -135,6 +135,17 @@
       "added_at": "2026-05-07T18:04:00+00:00"
     },
     {
+      "tipo": "vincolo",
+      "id": "G_TRIADIC_DEPOSIT_GATE",
+      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1938, il deposito Q->G va formulato come gate triadico di faccia: QGE contiene blank + gauge_phase + real_sourcing. Il contatto binario blank + real_sourcing e denominator-weak nel null count-preserving (p=0.8); la faccia triadica esiste nel null con p=0.2 e QGE specifica con p=0.05. Il claim valido e localizzazione del denominatore nel catalogo TQGE osservato, non rarita universale.",
+      "intensita": 0.82,
+      "manuale": true,
+      "porta": "G_POTENZIALE_NULLA",
+      "condensato_ref": "A4,A8,A9,A14",
+      "origine": "cycle agent_20260507_1938: triadic_deposit_gate su facce TQGE",
+      "added_at": "2026-05-07T19:38:00+00:00"
+    },
+    {
       "tipo": "confine_inesplorato",
       "id": "BOUNDARY",
       "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
@@ -345,4 +356,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/data/seme.json b/tools/data/seme.json
index e0545347c0b6822cdbb337c72f6b6798d8c23ede..144318ceaac53d85411955f527f1506c30d0e541
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -135,6 +135,17 @@
       "added_at": "2026-05-07T18:04:00+00:00"
     },
     {
+      "tipo": "vincolo",
+      "id": "G_TRIADIC_DEPOSIT_GATE",
+      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1938, il deposito Q->G va formulato come gate triadico di faccia: QGE contiene blank + gauge_phase + real_sourcing. Il contatto binario blank + real_sourcing e denominator-weak nel null count-preserving (p=0.8); la faccia triadica esiste nel null con p=0.2 e QGE specifica con p=0.05. Il claim valido e localizzazione del denominatore nel catalogo TQGE osservato, non rarita universale.",
+      "intensita": 0.82,
+      "manuale": true,
+      "porta": "G_POTENZIALE_NULLA",
+      "condensato_ref": "A4,A8,A9,A14",
+      "origine": "cycle agent_20260507_1938: triadic_deposit_gate su facce TQGE",
+      "added_at": "2026-05-07T19:38:00+00:00"
+    },
+    {
       "tipo": "confine_inesplorato",
       "id": "BOUNDARY",
       "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
@@ -345,4 +356,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

exec
/bin/bash -lc "rg -n \"if .*intens|confidence|score|maturity|> 0\\.|< 0\\.\" tools/exp_triadic_deposit_gate.py" in /opt/MM_D-ND
 exited 1 in 0ms:
exec
/bin/bash -lc 'python -m json.tool tools/data/seme.json >/tmp/seme_check.json' in /opt/MM_D-ND
 succeeded in 0ms:
exec
/bin/bash -lc 'python -m json.tool tools/data/triadic_deposit_gate_20260507_1938.json >/tmp/triadic_check.json' in /opt/MM_D-ND
 succeeded in 0ms:
exec
/bin/bash -lc 'python tools/lab_falsifier.py tools/data/reports/agent_20260507_1938.md' in /opt/MM_D-ND
 exited 2 in 0ms:
usage: lab_falsifier.py [-h] --report REPORT --output OUTPUT
                        [--timeout TIMEOUT]
lab_falsifier.py: error: the following arguments are required: --report, --output

diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/data/seme.json b/tools/data/seme.json
index e0545347c0b6822cdbb337c72f6b6798d8c23ede..144318ceaac53d85411955f527f1506c30d0e541
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -135,6 +135,17 @@
       "added_at": "2026-05-07T18:04:00+00:00"
     },
     {
+      "tipo": "vincolo",
+      "id": "G_TRIADIC_DEPOSIT_GATE",
+      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1938, il deposito Q->G va formulato come gate triadico di faccia: QGE contiene blank + gauge_phase + real_sourcing. Il contatto binario blank + real_sourcing e denominator-weak nel null count-preserving (p=0.8); la faccia triadica esiste nel null con p=0.2 e QGE specifica con p=0.05. Il claim valido e localizzazione del denominatore nel catalogo TQGE osservato, non rarita universale.",
+      "intensita": 0.82,
+      "manuale": true,
+      "porta": "G_POTENZIALE_NULLA",
+      "condensato_ref": "A4,A8,A9,A14",
+      "origine": "cycle agent_20260507_1938: triadic_deposit_gate su facce TQGE",
+      "added_at": "2026-05-07T19:38:00+00:00"
+    },
+    {
       "tipo": "confine_inesplorato",
       "id": "BOUNDARY",
       "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
@@ -345,4 +356,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

codex
La validazione JSON passa e lo script non introduce soglie concettuali. Il falsifier richiede argomenti espliciti; lo rilancio sul report appena scritto.
exec
/bin/bash -lc 'python tools/lab_falsifier.py --report tools/data/reports/agent_20260507_1938.md --output tools/data/reports/falsifier_20260507_1938.json' in /opt/MM_D-ND
diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/data/seme.json b/tools/data/seme.json
index e0545347c0b6822cdbb337c72f6b6798d8c23ede..144318ceaac53d85411955f527f1506c30d0e541
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -135,6 +135,17 @@
       "added_at": "2026-05-07T18:04:00+00:00"
     },
     {
+      "tipo": "vincolo",
+      "id": "G_TRIADIC_DEPOSIT_GATE",
+      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1938, il deposito Q->G va formulato come gate triadico di faccia: QGE contiene blank + gauge_phase + real_sourcing. Il contatto binario blank + real_sourcing e denominator-weak nel null count-preserving (p=0.8); la faccia triadica esiste nel null con p=0.2 e QGE specifica con p=0.05. Il claim valido e localizzazione del denominatore nel catalogo TQGE osservato, non rarita universale.",
+      "intensita": 0.82,
+      "manuale": true,
+      "porta": "G_POTENZIALE_NULLA",
+      "condensato_ref": "A4,A8,A9,A14",
+      "origine": "cycle agent_20260507_1938: triadic_deposit_gate su facce TQGE",
+      "added_at": "2026-05-07T19:38:00+00:00"
+    },
+    {
       "tipo": "confine_inesplorato",
       "id": "BOUNDARY",
       "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
@@ -345,4 +356,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/data/seme.json b/tools/data/seme.json
index e0545347c0b6822cdbb337c72f6b6798d8c23ede..144318ceaac53d85411955f527f1506c30d0e541
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -135,6 +135,17 @@
       "added_at": "2026-05-07T18:04:00+00:00"
     },
     {
+      "tipo": "vincolo",
+      "id": "G_TRIADIC_DEPOSIT_GATE",
+      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1938, il deposito Q->G va formulato come gate triadico di faccia: QGE contiene blank + gauge_phase + real_sourcing. Il contatto binario blank + real_sourcing e denominator-weak nel null count-preserving (p=0.8); la faccia triadica esiste nel null con p=0.2 e QGE specifica con p=0.05. Il claim valido e localizzazione del denominatore nel catalogo TQGE osservato, non rarita universale.",
+      "intensita": 0.82,
+      "manuale": true,
+      "porta": "G_POTENZIALE_NULLA",
+      "condensato_ref": "A4,A8,A9,A14",
+      "origine": "cycle agent_20260507_1938: triadic_deposit_gate su facce TQGE",
+      "added_at": "2026-05-07T19:38:00+00:00"
+    },
+    {
       "tipo": "confine_inesplorato",
       "id": "BOUNDARY",
       "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
@@ -345,4 +356,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/data/seme.json b/tools/data/seme.json
index e0545347c0b6822cdbb337c72f6b6798d8c23ede..144318ceaac53d85411955f527f1506c30d0e541
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -135,6 +135,17 @@
       "added_at": "2026-05-07T18:04:00+00:00"
     },
     {
+      "tipo": "vincolo",
+      "id": "G_TRIADIC_DEPOSIT_GATE",
+      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1938, il deposito Q->G va formulato come gate triadico di faccia: QGE contiene blank + gauge_phase + real_sourcing. Il contatto binario blank + real_sourcing e denominator-weak nel null count-preserving (p=0.8); la faccia triadica esiste nel null con p=0.2 e QGE specifica con p=0.05. Il claim valido e localizzazione del denominatore nel catalogo TQGE osservato, non rarita universale.",
+      "intensita": 0.82,
+      "manuale": true,
+      "porta": "G_POTENZIALE_NULLA",
+      "condensato_ref": "A4,A8,A9,A14",
+      "origine": "cycle agent_20260507_1938: triadic_deposit_gate su facce TQGE",
+      "added_at": "2026-05-07T19:38:00+00:00"
+    },
+    {
       "tipo": "confine_inesplorato",
       "id": "BOUNDARY",
       "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
@@ -345,4 +356,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

 exited 2 in 30682ms:
      [provider: codex-cli unavailable, next]
      [provider: claude-cli unavailable, next]
      [provider: openrouter unavailable, next]
[falsifier] chain failed: all providers in chain ['codex-cli', 'claude-cli', 'openrouter'] failed (check codex auth, claude auth, OPENROUTER_API_KEY env)
[falsifier] LLM call failed (exit=1). Conservative: BLOCK.

codex
Il falsifier non ha valutato il contenuto: tutti i provider locali configurati risultano indisponibili, quindi ha chiuso conservativamente in BLOCK. Registro questo come limite di verifica, senza mascherarlo.
exec
/bin/bash -lc "test -f tools/data/reports/falsifier_20260507_1938.json && sed -n '1,220p' tools/data/reports/falsifier_20260507_1938.json || true" in /opt/MM_D-ND
 succeeded in 0ms:
exec
/bin/bash -lc 'git status --short' in /opt/MM_D-ND
 succeeded in 0ms:
 M applications/INDEX.draft.json
 M applications/soluzioni/20260430_0330_three-regimes-of-modular-memory-algebraic/finding_index.draft.json
 M applications/soluzioni/20260430_0330_three-regimes-of-modular-memory-algebraic/manifest.draft.json
 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
 D tools/data/seme_archive/piano_6.json
 D tools/data/seme_archive/piano_7.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
 M tools/lab_agent.sh
?? applications/published/20260504_0901_the-two-markov-layers-are-coupled/
?? applications/published/20260504_1219_markov-layers-pass-the-first-recovery/
?? applications/published/20260505_0330_observable-rank-audit-many-probes-one/
?? applications/published/20260506_1955_observable-collinearity-breaks-only-where-denominators/
?? applications/published/20260507_0330_the-gue-poisson-boundary-is-a/
?? applications/published/20260507_0803_denominator-gate-transfers-boundary-coordinate-does/
?? applications/published/20260507_0942_bridge-order-denominator-gate/
?? applications/published/20260507_1006_logistic-counter-scope-gate/
?? applications/published/20260507_1042_logistic-surrogate-contract-gate/
?? applications/published/20260507_1419_logistic-cyclic-block-entropy-gate/
?? applications/published/20260507_1458_meta-assertion-gate/
?? applications/published/20260507_1751_tqge-underlay-gate/
?? applications/published/20260507_1804_blank-to-source-hinge/
?? applications/scoperte/20260502_0330_the-dipolar-phase-transition-is-nearly_auto/
?? applications/scoperte/20260503_0330_markov-memory-has-two-visible-layers_auto/
?? applications/scoperte/20260504_0901_the-two-markov-layers-are-coupled_auto/
?? applications/scoperte/20260504_1219_markov-layers-pass-the-first-recovery_auto/
?? applications/scoperte/20260505_0330_observable-rank-audit-many-probes-one_auto/
?? applications/scoperte/20260506_0625_perturbation-dimensionality-is-not-yet-a_auto/
?? applications/scoperte/20260506_1941_perturbation-rank-needs-denominator-gating_auto/
?? applications/scoperte/20260506_1955_observable-collinearity-breaks-only-where-denominators_auto/
?? applications/scoperte/20260507_0330_the-gue-poisson-boundary-is-a_auto/
?? applications/scoperte/20260507_0803_denominator-gate-transfers-boundary-coordinate-does_auto/
?? applications/scoperte/20260507_0901_denominator-gate-transfer-matrix_auto/
?? applications/scoperte/20260507_0923_semi-real-order-denominator-gate_auto/
?? applications/scoperte/20260507_0942_bridge-order-denominator-gate_auto/
?? applications/scoperte/20260507_1006_logistic-counter-scope-gate_auto/
?? applications/scoperte/20260507_1042_logistic-surrogate-contract-gate_auto/
?? applications/scoperte/20260507_1419_logistic-cyclic-block-entropy-gate_auto/
?? applications/scoperte/20260507_1458_meta-assertion-gate_auto/
?? applications/scoperte/20260507_1751_tqge-underlay-gate_auto/
?? applications/scoperte/20260507_1804_blank-to-source-hinge_auto/
?? applications/soluzioni/20260502_0330_the-dipolar-phase-transition-is-nearly/
?? applications/soluzioni/20260503_0330_markov-memory-has-two-visible-layers/
?? applications/soluzioni/20260504_0901_the-two-markov-layers-are-coupled/
?? applications/soluzioni/20260504_1219_markov-layers-pass-the-first-recovery/
?? applications/soluzioni/20260505_0330_observable-rank-audit-many-probes-one/
?? applications/soluzioni/20260506_1941_perturbation-rank-needs-denominator-gating/
?? applications/soluzioni/20260506_1955_observable-collinearity-breaks-only-where-denominators/
?? applications/soluzioni/20260507_0330_the-gue-poisson-boundary-is-a/
?? applications/soluzioni/20260507_0803_denominator-gate-transfers-boundary-coordinate-does/
?? applications/soluzioni/20260507_0942_bridge-order-denominator-gate/
?? applications/soluzioni/20260507_1006_logistic-counter-scope-gate/
?? applications/soluzioni/20260507_1042_logistic-surrogate-contract-gate/
?? applications/soluzioni/20260507_1419_logistic-cyclic-block-entropy-gate/
?? applications/soluzioni/20260507_1458_meta-assertion-gate/
?? applications/soluzioni/20260507_1751_tqge-underlay-gate/
?? applications/soluzioni/20260507_1804_blank-to-source-hinge/
?? findings_gallery.md
?? tools/data/.last_telegram_msg
?? tools/data/3d_boundary_layers.json
?? tools/data/aeternitas/
?? tools/data/alignment_active.json
?? tools/data/alignment_markers.jsonl
?? tools/data/biconi/bicono_20260507_1804.json
?? tools/data/bicono_projections.jsonl
?? tools/data/blank_to_source_hinge_20260507_1804.json
?? tools/data/boundary_coherence.json
?? tools/data/boundary_mixture_gate_20260507_0330.json
?? tools/data/boundary_mixture_gate_20260507_0330_seedcheck.json
?? tools/data/boundary_shuffle_audit.json
?? tools/data/bridge_order_denominator_gate_20260507_0942.json
?? tools/data/bridge_order_denominator_gate_20260507_0942_seedcheck.json
?? tools/data/brody_calibration_results.json
?? tools/data/brody_flow.json
?? tools/data/conoscenza_teorie.json.bak.retraction_22_04
?? tools/data/cross_domain_dipolar_direction.json
?? tools/data/cross_observable_consistency.json
?? tools/data/crossover_phase_test.json
?? tools/data/denominator_gate_transfer_matrix.json
?? tools/data/dipolar_crossover.json
?? tools/data/dipolar_vector_scaling.json
?? tools/data/domandatore/domandatore_20260421_0746.json
?? tools/data/domandatore/domandatore_20260422_0345.json
?? tools/data/domandatore/domandatore_20260423_0345.json
?? tools/data/domandatore/domandatore_20260424_0345.json
?? tools/data/domandatore/domandatore_20260425_0345.json
?? tools/data/domandatore/domandatore_20260426_0345.json
?? tools/data/domandatore/domandatore_20260427_0345.json
?? tools/data/domandatore/domandatore_20260428_0345.json
?? tools/data/domandatore/domandatore_20260428_1236.json
?? tools/data/domandatore/domandatore_20260429_0345.json
?? tools/data/domandatore/domandatore_20260430_0345.json
?? tools/data/domandatore/domandatore_20260501_0345.json
?? tools/data/domandatore/domandatore_20260502_0345.json
?? tools/data/domandatore/domandatore_20260503_0345.json
?? tools/data/domandatore/domandatore_20260504_0345.json
?? tools/data/domandatore/domandatore_20260505_0345.json
?? tools/data/domandatore/domandatore_20260506_0345.json
?? tools/data/domandatore/domandatore_20260507_0345.json
?? tools/data/domandatore/domandatore_20260507_0728.json
?? tools/data/domandatore/domandatore_20260507_0742.json
?? tools/data/domandatore/domandatore_20260507_1420.json
?? tools/data/domandatore/domandatore_20260507_1459.json
?? tools/data/duality_gate_transfer_20260507_0803.json
?? tools/data/duality_gate_transfer_20260507_0803_seedcheck.json
?? tools/data/evolution/evolution_20260422_0330.md
?? tools/data/evolution/evolution_20260422_1616.md
?? tools/data/evolution/evolution_20260423_0330.md
?? tools/data/evolution/evolution_20260424_0330.md
?? tools/data/evolution/evolution_20260425_0330.md
?? tools/data/evolution/evolution_20260427_0330.md
?? tools/data/evolution/evolution_20260428_0330.md
?? tools/data/evolution/evolution_20260429_0852.md
?? tools/data/evolution/evolution_20260429_1013.md
?? tools/data/evolution/evolution_20260430_0330.md
?? tools/data/evolution/evolution_20260430_1905.md
?? tools/data/evolution/evolution_20260430_1946.md
?? tools/data/evolution/evolution_20260501_0330.md
?? tools/data/evolution/evolution_20260501_0725.md
?? tools/data/evolution/evolution_20260501_0931.md
?? tools/data/evolution/evolution_20260502_0330.md
?? tools/data/evolution/evolution_20260503_0330.md
?? tools/data/evolution/evolution_20260504_0901.md
?? tools/data/evolution/evolution_20260504_1219.md
?? tools/data/evolution/evolution_20260505_0330.md
?? tools/data/evolution/evolution_20260506_0330.md
?? tools/data/evolution/evolution_20260506_1941.md
?? tools/data/evolution/evolution_20260506_1955.md
?? tools/data/evolution/evolution_20260507_0330.md
?? tools/data/evolution/evolution_20260507_0803.md
?? tools/data/evolution/evolution_20260507_0901.md
?? tools/data/evolution/evolution_20260507_0923.md
?? tools/data/evolution/evolution_20260507_0942.md
?? tools/data/evolution/evolution_20260507_1006.md
?? tools/data/evolution/evolution_20260507_1042.md
?? tools/data/evolution/evolution_20260507_1419.md
?? tools/data/evolution/evolution_20260507_1458.md
?? tools/data/evolution/evolution_20260507_1751.md
?? tools/data/evolution/evolution_20260507_1804.md
?? tools/data/incrocio_20260422_0336.json
?? tools/data/incrocio_20260423_0335.json
?? tools/data/incrocio_20260424_0347.json
?? tools/data/incrocio_20260425_0339.json
?? tools/data/incrocio_20260428_0340.json
?? tools/data/incrocio_20260429_0859.json
?? tools/data/incrocio_20260506_0633.json
?? tools/data/lab_bridge_issues.jsonl
?? tools/data/logistic_counter_scope_gate_20260507_1006.json
?? tools/data/logistic_counter_scope_gate_20260507_1006_seedcheck.json
?? tools/data/logistic_cyclic_block_entropy_gate_20260507_1419.json
?? tools/data/logistic_cyclic_block_entropy_gate_20260507_1419_seedcheck.json
?? tools/data/logistic_surrogate_contract_gate_20260507_1042.json
?? tools/data/logistic_surrogate_contract_gate_20260507_1042_seedcheck.json
?? tools/data/magnitude_psd_from_acf.json
?? tools/data/markov3_observable_hunt.json
?? tools/data/markov_dipolar_decomposition.json
?? tools/data/markov_k_direction.json
?? tools/data/markov_layer_recovery_audit.json
?? tools/data/markov_memory_by_gue_type.json
?? tools/data/markov_scale_function.json
?? tools/data/meta_assertion_gate.json
?? tools/data/meta_tautology_test.json
?? tools/data/mod3_scaling.json
?? tools/data/mod3_vs_residual_ordering.json
?? tools/data/modular_algebra_depth.json
?? tools/data/modular_memory_spectrum.json
?? tools/data/observable_collinearity_breaking_20260506_1955.json
?? tools/data/observable_collinearity_breaking_20260506_1956.json
?? tools/data/observable_collinearity_breaking_20260506_1957.json
?? tools/data/observable_rank_audit.json
?? tools/data/observable_rank_audit_seed20260506.json
?? tools/data/observatorio/domandatore_unTouched_20260507_095914.md
?? tools/data/observatorio/lazarus_cimitero_20260507_100015.md
?? tools/data/observatorio/meta_metodo_giro_2026-05-07.md
?? tools/data/perturbation_dimensionality_audit.json
?? tools/data/perturbation_dimensionality_audit_scale0330.json
?? tools/data/perturbation_rank_size_curve.json
?? tools/data/promotions/
?? tools/data/reports/_quarantine_falsifier_29_04/
?? tools/data/reports/agent_20260422_0330.md
?? tools/data/reports/agent_20260422_1616.md
?? tools/data/reports/agent_20260423_0330.md
?? tools/data/reports/agent_20260424_0330.md
?? tools/data/reports/agent_20260425_0330.md
?? tools/data/reports/agent_20260426_0330.md
?? tools/data/reports/agent_20260427_0330.md
?? tools/data/reports/agent_20260428_0330.md
?? tools/data/reports/agent_20260429_1013.md
?? tools/data/reports/agent_20260429_1041.md
?? tools/data/reports/agent_20260430_0330.md
?? tools/data/reports/agent_20260430_1905.md
?? tools/data/reports/agent_20260430_1919.md
?? tools/data/reports/agent_20260430_1946.md
?? tools/data/reports/agent_20260501_0330.md
?? tools/data/reports/agent_20260501_0725.md
?? tools/data/reports/agent_20260501_0931.md
?? tools/data/reports/agent_20260502_0330.md
?? tools/data/reports/agent_20260503_0330.md
?? tools/data/reports/agent_20260504_0901.md
?? tools/data/reports/agent_20260504_1219.md
?? tools/data/reports/agent_20260505_0330.md
?? tools/data/reports/agent_20260505_1022.md
?? tools/data/reports/agent_20260506_0330.md
?? tools/data/reports/agent_20260506_0625.md
?? tools/data/reports/agent_20260506_1941.md
?? tools/data/reports/agent_20260506_1955.md
?? tools/data/reports/agent_20260507_0330.md
?? tools/data/reports/agent_20260507_0803.md
?? tools/data/reports/agent_20260507_0901.md
?? tools/data/reports/agent_20260507_0923.md
?? tools/data/reports/agent_20260507_0942.md
?? tools/data/reports/agent_20260507_1006.md
?? tools/data/reports/agent_20260507_1042.md
?? tools/data/reports/agent_20260507_1419.md
?? tools/data/reports/agent_20260507_1458.md
?? tools/data/reports/agent_20260507_1751.md
?? tools/data/reports/agent_20260507_1804.md
?? tools/data/reports/agent_20260507_1938.md
?? tools/data/reports/ddf_20260422_0405.json
?? tools/data/reports/ddf_20260423_0405.json
?? tools/data/reports/ddf_20260424_0405.json
?? tools/data/reports/ddf_20260425_0405.json
?? tools/data/reports/ddf_20260426_0405.json
?? tools/data/reports/ddf_20260427_0405.json
?? tools/data/reports/ddf_20260428_0405.json
?? tools/data/reports/ddf_20260429_0405.json
?? tools/data/reports/ddf_20260430_0405.json
?? tools/data/reports/ddf_20260501_0405.json
?? tools/data/reports/ddf_20260502_0405.json
?? tools/data/reports/ddf_20260503_0405.json
?? tools/data/reports/ddf_20260504_0405.json
?? tools/data/reports/ddf_20260505_0405.json
?? tools/data/reports/ddf_20260505_0636.json
?? tools/data/reports/ddf_20260506_0405.json
?? tools/data/reports/ddf_20260507_0405.json
?? tools/data/reports/evolution_20260422_0330.md
?? tools/data/reports/evolution_20260422_1616.md
?? tools/data/reports/evolution_20260423_0330.md
?? tools/data/reports/evolution_20260424_0330.md
?? tools/data/reports/evolution_20260425_0330.md
?? tools/data/reports/evolution_20260427_0330.md
?? tools/data/reports/evolution_20260428_0330.md
?? tools/data/reports/evolution_20260503_0330.md
?? tools/data/reports/evolution_20260504_0330.md
?? tools/data/reports/evolution_20260505_0330.md
?? tools/data/reports/evolution_20260506_0330.md
?? tools/data/reports/evolution_20260506_1941.md
?? tools/data/reports/falsifier_20260429_1013.json
?? tools/data/reports/falsifier_20260429_1041.json
?? tools/data/reports/falsifier_20260430_0330.json
?? tools/data/reports/falsifier_20260430_1905.json
?? tools/data/reports/falsifier_20260430_1919.json
?? tools/data/reports/falsifier_20260430_1946.json
?? tools/data/reports/falsifier_20260501_0330.json
?? tools/data/reports/falsifier_20260501_0725.json
?? tools/data/reports/falsifier_20260501_0931.json
?? tools/data/reports/falsifier_20260502_0330.json
?? tools/data/reports/falsifier_20260503_0330.json
?? tools/data/reports/falsifier_20260504_0901.json
?? tools/data/reports/falsifier_20260504_1219.json
?? tools/data/reports/falsifier_20260505_0330.json
?? tools/data/reports/falsifier_20260506_0330.raw.txt
?? tools/data/reports/falsifier_20260506_0625.json
?? tools/data/reports/falsifier_20260506_1941.json
?? tools/data/reports/falsifier_20260506_1955.json
?? tools/data/reports/falsifier_20260506_1955.raw.txt
?? tools/data/reports/falsifier_20260507_0330.json
?? tools/data/reports/falsifier_20260507_0330.raw.txt
?? tools/data/reports/falsifier_20260507_0803.json
?? tools/data/reports/falsifier_20260507_0803.raw.txt
?? tools/data/reports/falsifier_20260507_0901.json
?? tools/data/reports/falsifier_20260507_0923.json
?? tools/data/reports/falsifier_20260507_0923.raw.txt
?? tools/data/reports/falsifier_20260507_0942.json
?? tools/data/reports/falsifier_20260507_1006.json
?? tools/data/reports/falsifier_20260507_1042.json
?? tools/data/reports/falsifier_20260507_1042.raw.txt
?? tools/data/reports/falsifier_20260507_1419.json
?? tools/data/reports/falsifier_20260507_1458.json
?? tools/data/reports/falsifier_20260507_1458.raw.txt
?? tools/data/reports/falsifier_20260507_1751.json
?? tools/data/reports/falsifier_20260507_1804.json
?? tools/data/reports/falsifier_20260507_1938.raw.txt
?? tools/data/reports/incident_20260504_0721.md
?? tools/data/reports/incident_20260504_1138.md
?? tools/data/reports/latest.md
?? tools/data/reports/loop_guard_20260507_0330.json
?? tools/data/reports/loop_guard_20260507_0803.json
?? tools/data/reports/loop_guard_20260507_0901.json
?? tools/data/reports/loop_guard_20260507_0923.json
?? tools/data/reports/loop_guard_20260507_0942.json
?? tools/data/reports/loop_guard_20260507_1006.json
?? tools/data/reports/loop_guard_20260507_1042.json
?? tools/data/reports/loop_guard_20260507_1419.json
?? tools/data/reports/loop_guard_20260507_1458.json
?? tools/data/reports/loop_guard_20260507_1751.json
?? tools/data/reports/loop_guard_20260507_1804.json
?? tools/data/reports/trajectory_apply_20260506_1931.json
?? tools/data/reports/trajectory_apply_20260506_1941.json
?? tools/data/reports/trajectory_apply_20260506_1955.json
?? tools/data/reports/trajectory_apply_20260507_0330.json
?? tools/data/reports/trajectory_apply_20260507_0803.json
?? tools/data/reports/trajectory_apply_20260507_0901.json
?? tools/data/reports/trajectory_apply_20260507_0923.json
?? tools/data/reports/trajectory_apply_20260507_0942.json
?? tools/data/reports/trajectory_apply_20260507_1006.json
?? tools/data/reports/trajectory_apply_20260507_1042.json
?? tools/data/scale_selective_perturbation.json
?? tools/data/selective_layer_decoupling.json
?? tools/data/seme_archive/piano_74.json
?? tools/data/seme_archive/piano_75.json
?? tools/data/seme_archive/piano_76.json
?? tools/data/seme_archive/piano_77.json
?? tools/data/seme_archive/piano_78.json
?? tools/data/seme_archive/piano_79.json
?? tools/data/semireal_order_denominator_gate_20260507_0923.json
?? tools/data/semireal_order_denominator_gate_20260507_0923_seedcheck.json
?? tools/data/spectral_rigidity_results.json
?? tools/data/tqge_underlay_gate_20260507_1751.json
?? tools/data/trajectory_apply_history.jsonl
?? tools/data/triadic_deposit_gate_20260507_1938.json
?? tools/data/two_channel_boundary.json
?? tools/data/two_channel_cross_domain.json
?? tools/data/two_channel_shuffle_audit.json
?? tools/data/two_layer_universality.json
?? tools/data/valutatore_log.jsonl
?? tools/data/veritas/veritas_20260505_131056.json
?? tools/data/veritas/veritas_20260505_131201.json
?? tools/data/veritas/veritas_20260506_033803.json
?? tools/data/veritas/veritas_20260506_063303.json
?? tools/data/veritas/veritas_20260506_194644.json
?? tools/data/veritas/veritas_20260506_200238.json
?? tools/data/veritas/veritas_20260507_033525.json
?? tools/data/veritas/veritas_20260507_080958.json
?? tools/data/veritas/veritas_20260507_090723.json
?? tools/data/veritas/veritas_20260507_093207.json
?? tools/data/veritas/veritas_20260507_094723.json
?? tools/data/veritas/veritas_20260507_101605.json
?? tools/data/veritas/veritas_20260507_104904.json
?? tools/data/veritas/veritas_20260507_142501.json
?? tools/data/veritas/veritas_20260507_150443.json
?? tools/data/veritas/veritas_20260507_175511.json
?? tools/data/veritas/veritas_20260507_180843.json
?? tools/evolution_report.md
?? tools/exp_3d_boundary_layers.py
?? tools/exp_blank_to_source_hinge.py
?? tools/exp_boundary_coherence.py
?? tools/exp_boundary_mixture_gate.py
?? tools/exp_boundary_shuffle_audit.py
?? tools/exp_bridge_order_denominator_gate.py
?? tools/exp_brody_calibration.py
?? tools/exp_brody_flow.py
?? tools/exp_cross_domain_dipolar_direction.py
?? tools/exp_cross_observable_consistency.py
?? tools/exp_crossover_phase_test.py
?? tools/exp_denominator_gate_transfer_matrix.py
?? tools/exp_dipolar_angle_reference.py
?? tools/exp_dipolar_crossover.py
?? tools/exp_dipolar_vector_scaling.py
?? tools/exp_duality_gate_transfer.py
?? tools/exp_logistic_counter_scope_gate.py
?? tools/exp_logistic_cyclic_block_entropy_gate.py
?? tools/exp_logistic_surrogate_contract_gate.py
?? tools/exp_magnitude_psd_from_acf.py
?? tools/exp_markov3_observable_hunt.py
?? tools/exp_markov_dipolar_decomposition.py
?? tools/exp_markov_k_direction.py
?? tools/exp_markov_layer_recovery_audit.py
?? tools/exp_markov_memory_by_gue_type.py
?? tools/exp_markov_psd_prediction.py
?? tools/exp_markov_scale_function.py
?? tools/exp_meta_tautology_test.py
?? tools/exp_mod3_scaling.py
?? tools/exp_mod3_vs_residual_ordering.py
?? tools/exp_modular_algebra_depth.py
?? tools/exp_modular_memory_spectrum.py
?? tools/exp_observable_rank_audit.py
?? tools/exp_perturbation_dimensionality_audit.py
?? tools/exp_perturbation_rank_size_curve.py
?? tools/exp_scale_selective_perturbation.py
?? tools/exp_selective_layer_decoupling.py
?? tools/exp_semireal_order_denominator_gate.py
?? tools/exp_spectral_rigidity.py
?? tools/exp_tqge_underlay_gate.py
?? tools/exp_triadic_deposit_gate.py
?? tools/exp_two_channel_boundary.py
?? tools/exp_two_channel_cross_domain.py
?? tools/exp_two_channel_shuffle_audit.py
?? tools/exp_two_layer_universality.py
?? tools/lab_bias_corrector.py
?? tools/meta_assertion_gate.py
?? tools/observables_registry.py

exec
/bin/bash -lc 'python -m py_compile tools/exp_triadic_deposit_gate.py && python -m json.tool tools/data/seme.json >/tmp/seme_check.json && python -m json.tool tools/data/triadic_deposit_gate_20260507_1938.json >/tmp/triadic_check.json' in /opt/MM_D-ND
 succeeded in 0ms:
diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/data/seme.json b/tools/data/seme.json
index e0545347c0b6822cdbb337c72f6b6798d8c23ede..144318ceaac53d85411955f527f1506c30d0e541
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -135,6 +135,17 @@
       "added_at": "2026-05-07T18:04:00+00:00"
     },
     {
+      "tipo": "vincolo",
+      "id": "G_TRIADIC_DEPOSIT_GATE",
+      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1938, il deposito Q->G va formulato come gate triadico di faccia: QGE contiene blank + gauge_phase + real_sourcing. Il contatto binario blank + real_sourcing e denominator-weak nel null count-preserving (p=0.8); la faccia triadica esiste nel null con p=0.2 e QGE specifica con p=0.05. Il claim valido e localizzazione del denominatore nel catalogo TQGE osservato, non rarita universale.",
+      "intensita": 0.82,
+      "manuale": true,
+      "porta": "G_POTENZIALE_NULLA",
+      "condensato_ref": "A4,A8,A9,A14",
+      "origine": "cycle agent_20260507_1938: triadic_deposit_gate su facce TQGE",
+      "added_at": "2026-05-07T19:38:00+00:00"
+    },
+    {
       "tipo": "confine_inesplorato",
       "id": "BOUNDARY",
       "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
@@ -345,4 +356,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

exec
/bin/bash -lc "sed -n '1,120p' tools/data/reports/falsifier_20260507_1938.raw.txt 2>/dev/null || true" in /opt/MM_D-ND
 succeeded in 0ms:
<empty, exit=1>
diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/data/seme.json b/tools/data/seme.json
index e0545347c0b6822cdbb337c72f6b6798d8c23ede..144318ceaac53d85411955f527f1506c30d0e541
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -135,6 +135,17 @@
       "added_at": "2026-05-07T18:04:00+00:00"
     },
     {
+      "tipo": "vincolo",
+      "id": "G_TRIADIC_DEPOSIT_GATE",
+      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1938, il deposito Q->G va formulato come gate triadico di faccia: QGE contiene blank + gauge_phase + real_sourcing. Il contatto binario blank + real_sourcing e denominator-weak nel null count-preserving (p=0.8); la faccia triadica esiste nel null con p=0.2 e QGE specifica con p=0.05. Il claim valido e localizzazione del denominatore nel catalogo TQGE osservato, non rarita universale.",
+      "intensita": 0.82,
+      "manuale": true,
+      "porta": "G_POTENZIALE_NULLA",
+      "condensato_ref": "A4,A8,A9,A14",
+      "origine": "cycle agent_20260507_1938: triadic_deposit_gate su facce TQGE",
+      "added_at": "2026-05-07T19:38:00+00:00"
+    },
+    {
       "tipo": "confine_inesplorato",
       "id": "BOUNDARY",
       "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
@@ -345,4 +356,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

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

diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/data/seme.json b/tools/data/seme.json
index e0545347c0b6822cdbb337c72f6b6798d8c23ede..144318ceaac53d85411955f527f1506c30d0e541
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -135,6 +135,17 @@
       "added_at": "2026-05-07T18:04:00+00:00"
     },
     {
+      "tipo": "vincolo",
+      "id": "G_TRIADIC_DEPOSIT_GATE",
+      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1938, il deposito Q->G va formulato come gate triadico di faccia: QGE contiene blank + gauge_phase + real_sourcing. Il contatto binario blank + real_sourcing e denominator-weak nel null count-preserving (p=0.8); la faccia triadica esiste nel null con p=0.2 e QGE specifica con p=0.05. Il claim valido e localizzazione del denominatore nel catalogo TQGE osservato, non rarita universale.",
+      "intensita": 0.82,
+      "manuale": true,
+      "porta": "G_POTENZIALE_NULLA",
+      "condensato_ref": "A4,A8,A9,A14",
+      "origine": "cycle agent_20260507_1938: triadic_deposit_gate su facce TQGE",
+      "added_at": "2026-05-07T19:38:00+00:00"
+    },
+    {
       "tipo": "confine_inesplorato",
       "id": "BOUNDARY",
       "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
@@ -345,4 +356,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

codex
Cycle completato.

Ho creato ed eseguito `tools/exp_triadic_deposit_gate.py`, salvando i dati in `tools/data/triadic_deposit_gate_20260507_1938.json` e il report richiesto in `tools/data/reports/agent_20260507_1938.md`.

Risultante: nel perimetro TQGE il deposito Q->G non è solo contatto `blank + real_sourcing`; il denominatore corretto è la faccia triadica QGE: `blank + gauge_phase + real_sourcing`. Ho aggiornato `tools/data/seme.json` con il vincolo `G_TRIADIC_DEPOSIT_GATE`.

Verifiche:
- `py_compile` OK
- JSON output OK
- `seme.json` OK
- `structural_check.py` OK
- `lab_falsifier.py` non ha potuto valutare: provider `codex-cli`, `claude-cli`, `openrouter` indisponibili; raw telemetry scritta come `<empty, exit=1>`.
diff --git a/tools/data/reports/agent_20260507_1938.md b/tools/data/reports/agent_20260507_1938.md
new file mode 100644
index 0000000000000000000000000000000000000000..bcf29b46dfe9edfb4af3025e4193d0fc398549c3
--- /dev/null
+++ b/tools/data/reports/agent_20260507_1938.md
@@ -0,0 +1,75 @@
+# Agent Report — Triadic Deposit Gate
+**Date**: 2026-05-07 19:38
+**Piano**: 80
+**Tension explored**: G_POTENZIALE_NULLA (0.85)
+**observables_registry**: 1.0.0-2026-05-06
+**observables_used**: [] - tassonomia operatori TQGE, nessun osservabile canonico SR/SR2/L1/L2/triple_var
+
+## Claim Under Test
+> 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.
+
+## Question
+Nel perimetro TQGE operator-taxonomy, il deposito Q->G richiede solo contatto `blank + real_sourcing`, o richiede la faccia completa `blank + gauge_phase + real_sourcing`?
+
+## Experiment Design
+- Strumento: `tools/exp_triadic_deposit_gate.py`
+- Scope: sei lati TQGE con tassonomia `3 wick_time + 1 gauge_phase + 1 real_sourcing + 1 blank`.
+- Fonti verificate: `tools/LAB_AGENT_CONTEXT.md`, `tools/data/reports/agent_20260507_1804.md`, `tools/evolution_report.md`.
+- Metrica: facce triadiche con `blank + gauge_phase + real_sourcing`; facce binarie con `blank + real_sourcing`; facce contro-perimetro `blank` senza sorgente, sorgente senza `blank`, gauge senza deposito.
+- Null baseline: 120 permutazioni count-preserving dei sei modi sui sei lati TQGE.
+
+## Results
+| Test | Osservato | Null count-preserving |
+|---|---:|---:|
+| Faccia triadica `blank + gauge_phase + real_sourcing` | QGE | p(any)=0.2000; p(QGE)=0.0500 |
+| Faccia binaria `blank + real_sourcing` | QGE | p(any)=0.8000; p(QGE)=0.2000 |
+| Faccia con blank senza sorgente | TQG | - |
+| Faccia con sorgente senza blank | TGE | - |
+| Faccia con gauge senza deposito | TQE | - |
+
+Facce osservate:
+
+| Faccia | Modi | Stato |
+|---|---|---|
+| QGE | blank + gauge_phase + real_sourcing | deposito triadico |
+| TQG | blank + wick_time + wick_time | blank senza sorgente |
+| TGE | real_sourcing + wick_time + wick_time | sorgente senza blank |
+| TQE | gauge_phase + wick_time + wick_time | gauge senza deposito |
+
+Pattern nel null:
+
+| Pattern | Conteggio |
+|---|---:|
+| triadic face QGE | 6/120 |
+| triadic face TQG | 6/120 |
+| triadic face TQE | 6/120 |
+| triadic face TGE | 6/120 |
+| no triadic face | 96/120 |
+| binary blank-source on any face | 96/120 |
+| no binary blank-source face | 24/120 |
+
+## Key Findings
+1. **Il deposito QGE ha denominatore triadico.** Nel catalogo TQGE osservato, la faccia viva non contiene solo `blank + real_sourcing`: contiene anche `gauge_phase`. Il denominatore misurato e `blank + gauge_phase + real_sourcing`.
+2. **Il contatto binario e debole come gate.** Nel null count-preserving, una faccia `blank + real_sourcing` appare in 0.8000 delle assegnazioni; la faccia triadica appare in 0.2000. Il passaggio utile non e l'adiacenza, ma la chiusura del terzo lato.
+3. **Le tre facce escluse separano i ruoli.** TQG porta il blank senza sorgente; TGE porta la sorgente senza blank; TQE porta gauge senza deposito. QGE e il solo punto del catalogo osservato dove i tre ruoli sono nella stessa faccia.
+
+## Verdict
+**CONSTRAINT on G_POTENZIALE_NULLA / G_BLANK_TO_SOURCE_FACE_GATE**: nel perimetro TQGE operator-taxonomy, l'operatore di deposito Q->G va formulato come gate triadico di faccia. Il ponte QG isolato non basta; il contatto `blank + real_sourcing` non basta; il deposito osservato e QGE come `blank + gauge_phase + real_sourcing`. Il claim non e rarita universale: e localizzazione del denominatore nel catalogo TQGE osservato.
+
+## Bicono della scoperta
+- **Due radici**: contatto binario `blank + real_sourcing` · chiusura triadica `blank + gauge_phase + real_sourcing`
+- **Singolare**: QGE come faccia in cui il vuoto QG diventa depositabile perche passa attraverso gauge e sorgente.
+- **Invariante di passaggio**: il blank puo contaminare una faccia senza deposito; il deposito passa solo quando blank, gauge e source coabitano la stessa faccia.
+- **Campo di possibilita**: qui diventa possibile cercare gate di deposito come unita di faccia nei perimetri TQGE+R; qui diventa non-possibile usare l'adiacenza blank-source come denominatore sufficiente.
+
+## Self-Falsifier Lenses
+- **L1**: nessun assoluto fuori perimetro. "Solo" e usato per il catalogo osservato TQGE; il null mostra altre facce triadiche possibili per permutazione.
+- **L2**: confronto espresso in conteggi e probabilita sullo stesso spazio di 120 assegnazioni.
+- **L3**: il claim precedente viene ristretto al nodo regressivo corretto: denominatore di faccia, non ponte QG e non vertice G globale.
+- **L4**: TQG, TGE e TQE sono contro-perimetri espliciti ai singoli componenti del gate.
+- **L5**: classificazione interna del catalogo D-ND; non e discovery fisica nuova su gravita, gauge o sorgenti reali.
+
+## Files
+- `tools/exp_triadic_deposit_gate.py`
+- `tools/data/triadic_deposit_gate_20260507_1938.json`
+- `tools/data/reports/agent_20260507_1938.md`
diff --git a/tools/data/seme.json b/tools/data/seme.json
index e0545347c0b6822cdbb337c72f6b6798d8c23ede..144318ceaac53d85411955f527f1506c30d0e541
--- a/tools/data/seme.json
+++ b/tools/data/seme.json
@@ -135,6 +135,17 @@
       "added_at": "2026-05-07T18:04:00+00:00"
     },
     {
+      "tipo": "vincolo",
+      "id": "G_TRIADIC_DEPOSIT_GATE",
+      "claim": "Nel perimetro TQGE operator-taxonomy agent_20260507_1938, il deposito Q->G va formulato come gate triadico di faccia: QGE contiene blank + gauge_phase + real_sourcing. Il contatto binario blank + real_sourcing e denominator-weak nel null count-preserving (p=0.8); la faccia triadica esiste nel null con p=0.2 e QGE specifica con p=0.05. Il claim valido e localizzazione del denominatore nel catalogo TQGE osservato, non rarita universale.",
+      "intensita": 0.82,
+      "manuale": true,
+      "porta": "G_POTENZIALE_NULLA",
+      "condensato_ref": "A4,A8,A9,A14",
+      "origine": "cycle agent_20260507_1938: triadic_deposit_gate su facce TQGE",
+      "added_at": "2026-05-07T19:38:00+00:00"
+    },
+    {
       "tipo": "confine_inesplorato",
       "id": "BOUNDARY",
       "claim": "8 domini GUE, 5 Poisson — il confine è il terzo incluso operativo",
@@ -345,4 +356,4 @@
       "timestamp": "2026-04-04T19:34:08.014Z"
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/tools/exp_triadic_deposit_gate.py b/tools/exp_triadic_deposit_gate.py
new file mode 100644
index 0000000000000000000000000000000000000000..3abd8676e33369afb9d0d476368ae4858de2bdab
--- /dev/null
+++ b/tools/exp_triadic_deposit_gate.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+"""
+exp_triadic_deposit_gate.py
+
+Face-level gate for G_POTENZIALE_NULLA.
+
+The previous hinge run localized Q->G on the QGE face. This tool measures the
+next denominator explicitly: a deposit face is not only blank adjacent to
+real_sourcing; it is the triangle where blank, gauge_phase and real_sourcing are
+all present.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+from collections import Counter
+from itertools import combinations, permutations
+from pathlib import Path
+
+
+VERTICES = ("T", "Q", "G", "E")
+
+EDGE_MODES = {
+    ("T", "Q"): "wick_time",
+    ("T", "G"): "wick_time",
+    ("T", "E"): "wick_time",
+    ("Q", "E"): "gauge_phase",
+    ("G", "E"): "real_sourcing",
+    ("Q", "G"): "blank",
+}
+
+
+def canon(edge: tuple[str, str]) -> tuple[str, str]:
+    return tuple(sorted(edge))
+
+
+EDGE_MODES = {canon(edge): mode for edge, mode in EDGE_MODES.items()}
+EDGES = tuple(sorted(EDGE_MODES))
+
+
+def edge_name(edge: tuple[str, str]) -> str:
+    return "".join(edge)
+
+
+def triangle_name(triangle: tuple[str, str, str]) -> str:
+    return "".join(triangle)
+
+
+def face_modes(edge_modes: dict[tuple[str, str], str]) -> list[dict]:
+    faces = []
+    for triangle in combinations(VERTICES, 3):
+        tri_edges = [canon(edge) for edge in combinations(triangle, 2)]
+        modes = [edge_modes[edge] for edge in tri_edges]
+        mode_set = set(modes)
+        faces.append(
+            {
+                "triangle": triangle_name(triangle),
+                "edge_modes": {edge_name(edge): edge_modes[edge] for edge in tri_edges},
+                "has_blank": "blank" in mode_set,
+                "has_gauge_phase": "gauge_phase" in mode_set,
+                "has_real_sourcing": "real_sourcing" in mode_set,
+                "is_triadic_deposit": {
+                    "blank",
+                    "gauge_phase",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "is_binary_blank_source": {
+                    "blank",
+                    "real_sourcing",
+                }.issubset(mode_set),
+                "mode_signature": "+".join(sorted(modes)),
+            }
+        )
+    return faces
+
+
+def analyze(edge_modes: dict[tuple[str, str], str]) -> dict:
+    faces = face_modes(edge_modes)
+    triadic = [face for face in faces if face["is_triadic_deposit"]]
+    binary = [face for face in faces if face["is_binary_blank_source"]]
+    blank_without_source = [
+        face for face in faces if face["has_blank"] and not face["has_real_sourcing"]
+    ]
+    source_without_blank = [
+        face for face in faces if face["has_real_sourcing"] and not face["has_blank"]
+    ]
+    gauge_without_deposit = [
+        face
+        for face in faces
+        if face["has_gauge_phase"] and not face["is_triadic_deposit"]
+    ]
+    return {
+        "triadic_deposit_faces": triadic,
+        "binary_blank_source_faces": binary,
+        "blank_without_source_faces": blank_without_source,
+        "source_without_blank_faces": source_without_blank,
+        "gauge_without_deposit_faces": gauge_without_deposit,
+        "all_faces": faces,
+    }
+
+
+def null_assignments() -> list[dict[tuple[str, str], str]]:
+    labels = [EDGE_MODES[edge] for edge in EDGES]
+    unique = set(permutations(labels, len(labels)))
+    return [dict(zip(EDGES, labels_perm)) for labels_perm in unique]
+
+
+def summarize_null(assignments: list[dict[tuple[str, str], str]]) -> dict:
+    n = len(assignments)
+    counts = Counter()
+    triadic_patterns = Counter()
+    binary_patterns = Counter()
+
+    for assignment in assignments:
+        result = analyze(assignment)
+        triadic_names = "+".join(
+            sorted(face["triangle"] for face in result["triadic_deposit_faces"])
+        )
+        binary_names = "+".join(
+            sorted(face["triangle"] for face in result["binary_blank_source_faces"])
+        )
+        triadic_patterns[triadic_names or "none"] += 1
+        binary_patterns[binary_names or "none"] += 1
+
+        if result["triadic_deposit_faces"]:
+            counts["triadic_exists"] += 1
+        if result["binary_blank_source_faces"]:
+            counts["binary_exists"] += 1
+        if triadic_names == "QGE":
+            counts["triadic_is_QGE"] += 1
+        if binary_names == "QGE":
+            counts["binary_is_QGE"] += 1
+
+    return {
+        "n_count_preserving_assignments": n,
+        "p_triadic_deposit_exists": counts["triadic_exists"] / n,
+        "p_binary_blank_source_exists": counts["binary_exists"] / n,
+        "p_triadic_deposit_is_QGE": counts["triadic_is_QGE"] / n,
+        "p_binary_blank_source_is_QGE": counts["binary_is_QGE"] / n,
+        "triadic_face_pattern_counts": dict(sorted(triadic_patterns.items())),
+        "binary_face_pattern_counts": dict(sorted(binary_patterns.items())),
+    }
+
+
+def run() -> dict:
+    observed = analyze(EDGE_MODES)
+    null = summarize_null(null_assignments())
+    return {
+        "experiment": "triadic_deposit_gate",
+        "source": {
+            "verified": [
+                "tools/LAB_AGENT_CONTEXT.md: TQGE edges and QxG void",
+                "tools/data/reports/agent_20260507_1804.md: QGE as blank + gauge + source face",
+                "tools/evolution_report.md: consecutio asks for triadic blank + gauge + source operator",
+            ],
+            "inferred": [
+                "deposit face requires blank, gauge_phase and real_sourcing in one triangle",
+                "binary blank-source contact is a weaker denominator than triadic deposit",
+                "count-preserving null by permuting edge modes over the six TQGE edges",
+            ],
+        },
+        "edge_modes": {edge_name(edge): mode for edge, mode in EDGE_MODES.items()},
+        "observed": observed,
+        "null": null,
+    }
+
+
+def main() -> int:
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--json-out", type=Path)
+    args = parser.parse_args()
+
+    result = run()
+    text = json.dumps(result, indent=2, ensure_ascii=False)
+    print(text)
+    if args.json_out:
+        args.json_out.parent.mkdir(parents=True, exist_ok=True)
+        args.json_out.write_text(text + "\n", encoding="utf-8")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())

tokens used
88,744
Cycle completato.

Ho creato ed eseguito `tools/exp_triadic_deposit_gate.py`, salvando i dati in `tools/data/triadic_deposit_gate_20260507_1938.json` e il report richiesto in `tools/data/reports/agent_20260507_1938.md`.

Risultante: nel perimetro TQGE il deposito Q->G non è solo contatto `blank + real_sourcing`; il denominatore corretto è la faccia triadica QGE: `blank + gauge_phase + real_sourcing`. Ho aggiornato `tools/data/seme.json` con il vincolo `G_TRIADIC_DEPOSIT_GATE`.

Verifiche:
- `py_compile` OK
- JSON output OK
- `seme.json` OK
- `structural_check.py` OK
- `lab_falsifier.py` non ha potuto valutare: provider `codex-cli`, `claude-cli`, `openrouter` indisponibili; raw telemetry scritta come `<empty, exit=1>`.
