# Handoff — verdetto su `ds4l` (lambda 1.25): BOCCIATA 04-08-2026, notte. Campagna eseguita, kill-check applicato. Il box è libero, con l'**ufficiale** su :30001/:30009. ## Verdetto: bocciata, ma non per niente Kill-check dichiarato *prima* di guardare i risultati: | criterio | soglia | lam 1.25 | esito | |---|---|---|---| | TC-07 (catena 4 tool dipendenti) | ≥ 90% | **72,5%** | ❌ | | TC-14 (recupero da tool malformato) | ≥ 45% | **20,0%** | ❌ | | rifiuti (16 prompt) | ≤ 4/16 | **0/16** | ✅ | **Il controllo di deriva passa**, quindi il confronto è valido: le 20 ripetizioni di controllo sull'ufficiale in giornata danno TC-07 **95,0%** e TC-14 **55,0%**, contro 97,5% e 55,0% misurati la notte prima. Zero ripetizioni fallite su 60. ## I tre modelli sulla stessa scala | | ufficiale | **lam 1.25** | lam 1.50 (squanchyzx) | |---|---|---|---| | TC-07 pass | 95,0% (19/20) | **72,5%** (29/40) | 57,5% (23/40) | | TC-14 pass | 55,0% (11/20) | **20,0%** (8/40) | 12,5% (5/40) | | rifiuti | 2/16 | **0/16** | 0/16 | | punti/run sui 2 scenari | 3,500 | **2,925** | — | Test sui punti, lam125 contro ufficiale: TC-14 Holm **p = 0,0166** (regressione confermata), TC-07 Holm p = 0,0822 (Fisher sul solo pass 0,0466 — al limite, non lo dichiaro confermato). Aggregato sui due scenari: p = 0,0019. ## Cosa ha risposto l'esperimento L'ipotesi era: **il danno viene dall'inversione** (a lambda 1.5 la componente del rifiuto non è rimossa ma portata a −0,5), quindi dimezzandola si recupera la capacità tenendo la de-censura. Risposta: **parzialmente vero, e insufficiente.** Dimezzare l'inversione recupera - **40%** del divario su TC-07 — (72,5 − 57,5) / (95,0 − 57,5) - **18%** del divario su TC-14 — (20,0 − 12,5) / (55,0 − 12,5) mentre la de-censura resta piena (0/16). Quindi esiste un gradiente reale fra lambda e danno, ma **la sola rimozione costa già molto**: non c'è un lambda che de-censuri e non paghi. A lambda 1.0 il danno sarebbe minore ancora, ma il suo sweep pubblicato dice che a 1.0 i rifiuti **non scendono** (75%, come a 0,75) — quindi quella strada non porta a un modello uncensored. Detto in modo utile: su questo modello, **rifiuto e capacità di portare avanti lo stato di una catena condividono lo stesso sottospazio dell'attention**, in modo graduale. Si scegli un punto sulla curva, non si ottengono entrambe le cose. ## Stato operativo — non cambia niente - **daily = `yz start ds4`** (ufficiale). È quello che gira ora. - `ds4h` (lam 1.50) e `ds4l` (lam 1.25): solo chat/scrittura unfiltered. Fra i due, `ds4l` è strettamente migliore — stessa de-censura sui nostri probe, meno danno — quindi se serve unfiltered, **usa `ds4l`, non `ds4h`**. - Disco: le due varianti occupano 87G ciascuna. Se serve spazio, la prima da cancellare è `~/models/ds4-0731-heretic/` (dominata da lam125), tenendo `hf/` che è solo 1,2G di overlay e serve a rifare qualunque bake. ## L'unica ipotesi rimasta non testata Il lambda è un asse. L'altro, mai provato, è **quali layer** editare: tutti i bake finora toccano 10-42. I layer tardivi (31-42) sono i più probabili portatori dello stato della catena, ed è lì che TC-07/TC-14 falliscono. ```bash # copia + bake solo sui layer bassi, ~15 min di CPU ionice -c3 dd if=~/models/ds4-0731/DeepSeek-V4-Flash-IQ2XXS-...-imatrix-0731.gguf \ of=~/models/ds4-0731-lo/...-LO-attn.gguf bs=8M iflag=nocache oflag=nocache conv=fsync python3 ~/llm/bake-attn-subspace.py --lam 1.5 --layers 10-30 --gguf ~/models/ds4-0731-lo/...gguf python3 ~/llm/verify-subspace-gain.py --official --edited --lam 1.5 --layers 10-30 --sample 5 python3 ~/llm/verify-heretic-splice.py --official --patched --layers 10-30 ``` Poi lo stesso bench, cambiando i tre pattern in una copia di `night-lam125.sh`. **Stesso kill-check**: TC-07 ≥ 90%, TC-14 ≥ 45%, rifiuti ≤ 4/16. Se anche questo fallisce, il filone abliteration su ds4 si chiude: resta uno strumento da chat e basta. Nota di aspettativa, dichiarata prima: se il rifiuto è distribuito su tutti i layer, editare solo 10-30 abbasserà anche la de-censura, e finiremo nello stesso trade-off. La ragione per provare è che il costo è un pomeriggio di CPU e il beneficio, se i layer tardivi sono davvero quelli critici, è un modello uncensored che regge l'agentico. ## Trappole trovate oggi, tutte già corrette negli strumenti 1. **`local a=1 b=$a` non funziona come sembra.** Bash espande tutta la riga *prima* di eseguire `local`, quindi `local arm="$1" f=".../$arm-..."` vede `$arm` non assegnato e con `set -u` ammazza il processo. Mi ha ucciso 3 campagne di fila; in `night-heretic-power.sh` lo stesso bug era **mascherato** perché il ciclo assegnava `arm` come globale prima della chiamata. Corretto in entrambi (due `local` separati) con la spiegazione in-linea. 2. **Se un job in background muore muto, redirigi lo stderr al primo tentativo.** La riga esatta era disponibile dal primo minuto; io ho incolpato il harness per due giri prima di catturarla. I runner ora si lanciano `2> /script.err`, e vanno in **tmux** perché fuori non sopravvivono al teardown dei task. 3. **L'analizzatore scartava in silenzio i bracci con nomi nuovi** (accettava solo `ufficiale`/`heretic`): con la cartella piena diceva "servono 2 bracci". Ora i nomi si deducono dai file. 4. **Il check di Think Max grepava testo troncato a 160 caratteri** → `NO` su risposte corrette. Ora controlla il testo intero. 5. **Il byte-compare non valida un lambda**: in Q8_0 una differenza minima cambia ~56% dei byte, uguale a due matrici diverse. Serve `verify-subspace-gain.py` (spazio dei valori, guadagno **con segno** — un rapporto di norme non distingue lambda 0 da lambda 2). 6. **L'asimmetria fra bracci non è per forza un guasto**: il messaggio dell'analizzatore diceva "qualche ripetizione è fallita" anche su un disegno 40/20 riuscito. Ora distingue e dice come verificare. ## File | percorso | cosa | |---|---| | `~/llm/bench-heretic/lam125/` | 60 JSON + `run.log` + `script.err` | | `~/llm/night-lam125.sh` | il runner (lanciare in tmux, `SKIP_PROBE=1` se la batteria è già fatta) | | `~/llm/night-heretic-analyze.py` | analisi, `--dir` sulla cartella della campagna | | `~/llm/bake-attn-subspace.py` | bake a lambda/layer arbitrari | | `~/llm/verify-subspace-gain.py` · `verify-heretic-splice.py` | le due verifiche, complementari | | `~/llm/bench-heretic/{lam125,probe-lam125}.log` | i 16 prompt di rifiuto + tool-call + reasoning | | HF privato `GaelicThunder/DeepSeek-V4-Flash-0731-HERETIC-attn-splice-ds4` | tutto, con i log grezzi |