pi-jev-guard 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,7 +4,7 @@ Verifica le risposte con [TypeSafe Jev](https://docs.typesafe.ai) dentro [pi](ht
4
4
 
5
5
  - **A richiesta** (default): tool `jev_validate`, comando `/jev check`, skill `jev-review`. Zero verifiche implicite, zero costi se non lo usi.
6
6
  - **Domande tipate**: tool `jev_ask` per giudizi calibrati definiti dal modello (noul/choice/score) invece di prosa.
7
- - **Automatica**: gemello guarded `<modello>__jev` dentro lo stesso provider, che trattiene la risposta, la verifica con Jev e pubblica solo l'output approvato (con rigenerazione privata su `block`). Stessa auth del provider: nessun login extra, funziona anche con Codex/OAuth.
7
+ - **Automatica**: in `automatic` il gate copre **il modello selezionato e ogni cambio modello**, senza alias o registrazioni extra: trattiene la risposta, la verifica con Jev e pubblica solo l'output approvato (con rigenerazione privata su `block`). Stessa auth del provider: nessun login extra, funziona anche con Codex/OAuth.
8
8
  - **Giudice output** (solo `automatic`, fail-open): dopo ogni `bash` cerca secret nel testo e classifica i fallimenti, allegando un consiglio al risultato.
9
9
  - **Verifica progetto** (opt-in): footer deterministico da `edit`/`write` osservati e check autorizzati da override locale, manifest globale utente o profilo comune integrato; il modello può eseguire soltanto quegli id, mai shell arbitraria.
10
10
 
@@ -30,7 +30,7 @@ export TYPESAFE_API_KEY="..." # backend typesafe diretto
30
30
  Le nuove sessioni partono in `on-demand`: i modelli normali restano selezionabili e nessuna verifica parte da sola.
31
31
  `/jev mode automatic|on-demand` salva la scelta **nella sessione**, non nella config globale.
32
32
  La scelta sopravvive a `/reload`, riavvio e `/resume`; fork e `/tree` seguono lo stato del ramo.
33
- Credenziali, policy e catalogo dei twin restano condivisi.
33
+ Credenziali e policy restano condivise.
34
34
 
35
35
  Migrazione: il vecchio `mode` in `jev-config.json` non controlla più l'estensione
36
36
  (resta compatibile con i consumer standalone). Nelle sessioni senza uno stato salvato,
@@ -48,13 +48,16 @@ In chat, l'LLM può chiamare `jev_validate` per controlli mirati.
48
48
  ## Uso protetto
49
49
 
50
50
  ```text
51
- /jev upstream deepseek deepseek-flash # crea deepseek/deepseek-flash__jev
52
- /jev upstream openai-codex gpt-5.6-terra # aggiunge openai-codex/gpt-5.6-terra__jev
53
- /jev twins # elenca attivi e salvati
54
- /jev untwin openai-codex gpt-5.6-terra # rimuove uno solo
55
- /jev mode automatic # seleziona il primario + attiva enforcement
51
+ /model # scegli qualunque modello (o più modelli in sessioni diverse)
52
+ /jev mode automatic # ogni risposta passa dal gate Jev
53
+ /jev off # gate disattivato, provider ripristinati
56
54
  ```
57
55
 
56
+ Nessun alias `__jev`, nessuna registrazione: il gate lavora sullo stesso
57
+ oggetto provider e riusa la credenziale già configurata (env, stored,
58
+ OAuth/SSO come Codex business plan). I vecchi alias delle versioni ≤ 0.6.x
59
+ vengono normalizzati automaticamente ai modelli originali.
60
+
58
61
  ### Backend e chiavi
59
62
 
60
63
  Due backend, stessa policy e stesse regole:
@@ -78,41 +81,17 @@ config), quindi i due backend possono coesistere. Precedenza: variabile
78
81
  d'ambiente → file del backend → file generico `jev.apiKeyFile` → percorso
79
82
  canonico. Vedi `config/jev-config.example.json`.
80
83
 
81
- **Più twin insieme**: ogni `/jev upstream` *aggiunge* un modello guarded, senza
82
- rimuovere i precedenti. I twin vengono registrati anche all'avvio (i modelli
83
- dinamici come Codex sono letti dal models-store), quando gli originali sono disponibili.
84
- Il **primario** salvato è il target di auto-selezione e revert; un twin già selezionato
85
- nella sessione viene mantenuto al reload, anche se non è il primario.
86
-
87
- Nessun login extra: i twin vivono nello stesso provider e riusano la credenziale già configurata (env, stored, OAuth/SSO come Codex business plan). I modelli originali restano intatti e selezionabili.
88
-
89
- I twin salvati vengono registrati prima del ripristino del modello anche in
90
- `on-demand`: registrazione e attivazione del gate sono indipendenti. Il suffisso
91
- `__jev` è locale e non viene inviato al provider; anche la cronologia viene
92
- normalizzata sull'identità originale senza perdere firme o metadati di continuazione.
93
-
94
- Torna normale con `/jev mode on-demand`, che seleziona anche il modello originale.
95
- In `automatic`, selezionare un modello non protetto lo fa ritornare
96
- subito al twin (enforcement a livello selezione).
97
- `/jev upstream` senza argomenti ripristina tutti i twin salvati, `/jev untwin P M`
98
- ne rimuove uno solo, `/jev off` li rimuove tutti
99
- (e salva on-demand nella sessione, selezionando l'originale prima di rimuovere il routing).
100
- `/jev off` conserva il catalogo salvato: al reload gli alias tornano disponibili,
101
- ma il gate rimane disattivato.
84
+ **Qualunque modello**: in `automatic` il gate segue la selezione — cambi
85
+ modello con `/model` e ogni risposta resta coperta, senza passaggi di setup.
86
+ Il catalogo resta quello di pi: nessun alias, nessun modulo extra nel picker.
102
87
 
103
- Se filtri i modelli con `enabledModels`, usa i glob invece delle voci esplicite,
104
- così i twin futuri non restano nascosti:
105
-
106
- ```json
107
- "enabledModels": ["openai-codex/*__jev", "deepseek/*__jev", "...altri pattern..."]
108
- ```
88
+ Torna normale con `/jev mode on-demand` (o `/jev off`, che ripristina anche i
89
+ metodi originali dei provider). Entrambe le scelte vivono nella sessione e
90
+ sopravvivono a `/reload` e `/resume`.
109
91
 
110
- Dopo aver aggiunto un twin serve `/reload` (lo scope è risolto all'avvio della sessione).
111
- `/jev upstream` avvisa subito quando il twin appena creato è fuori dal picker.
112
92
  L'installazione punta alla cartella: dopo un aggiornamento del codice basta `/reload`.
113
93
 
114
- Headless/CI: `JEV_MODE=automatic JEV_AUTO_UPSTREAM=provider/model` crea e attiva
115
- il guarded nelle sessioni senza uno stato Jev salvato.
94
+ Headless/CI: `JEV_MODE=automatic` parte già col gate attivo sul modello usato.
116
95
 
117
96
  Un hold `[JEV — OUTPUT NON PUBBLICATO]` interrompe intenzionalmente il turno:
118
97
  controlla `/jev last`. Non viene aggirato con un proseguimento automatico.
@@ -130,10 +109,9 @@ del proprietario). Così i controlli di ownership altrui non vedono mai una
130
109
  aborted` istantaneo). Quando il proprietario sostituisce l'oggetto, il nuovo
131
110
  viene patchato ex-novo agli hook (`input`, `before_agent_start`, `turn_start`,
132
111
  `model_select`, `message_end`); `/jev off` ripristina i metodi originali senza
133
- `unregister`. I twin restano visibili nel registry per le letture altrui
134
- (`jev-overlay-reassert` solo quando un oggetto nuovo viene patchato).
135
- In più, rete di sicurezza: se un id `__jev` sfugge comunque nel payload, il
136
- gate toglie il suffisso registrando `jev-gate-bypass` e avvisando in TUI,
112
+ `unregister` (`jev-overlay-reassert` solo quando un oggetto nuovo viene patchato).
113
+ Rete di sicurezza legacy: se un id `__jev` delle vecchie versioni sfugge nel
114
+ payload, viene normalizzato al modello originale registrando `jev-gate-bypass`,
137
115
  perché quel turno non è passato dalla verifica.
138
116
  Le conferme per comandi di rete sospetti attendono invece una decisione esplicita;
139
117
  la normale sequenza tool → risposta successiva continua senza un nuovo prompt.
@@ -191,7 +169,7 @@ diventare “test passati”.
191
169
 
192
170
  #### Nuovi progetti: zero manifest locale
193
171
 
194
- Una volta, in una sessione col twin `automatic`, abilita la modalità scelta:
172
+ Una volta, in una sessione pi, abilita la modalità scelta:
195
173
 
196
174
  ```text
197
175
  /jev verification repair
@@ -229,8 +207,8 @@ Dopo un edit il modello può scegliere solo id già acquisiti:
229
207
  ```
230
208
 
231
209
  Il tool LLM `jev_verify` ha lo stesso vincolo, richiede un progetto trusted e
232
- non accetta shell arbitraria. Footer/repair/hold operano nel twin
233
- `automatic`; `/jev verify` è utilizzabile manualmente anche senza footer.
210
+ non accetta shell arbitraria. Footer/repair/hold operano in `automatic`;
211
+ `/jev verify` è utilizzabile manualmente anche senza footer.
234
212
 
235
213
  #### Override per progetti speciali
236
214
 
@@ -282,7 +260,7 @@ quelle di `edit`/`write`: una modifica shell non viene attribuita al modello.
282
260
  ## Configurazione
283
261
 
284
262
  `~/.pi/agent/jev-config.json` (o `$JEV_CONFIG`). Env: `JEV_MODE`, `JEV_BACKEND`
285
- (`openrouter`|`typesafe`|`auto`), `JEV_MODEL`, `JEV_AUTO_UPSTREAM`.
263
+ (`openrouter`|`typesafe`|`auto`), `JEV_MODEL`.
286
264
  Vedi `config/jev-config.example.json` per tutti i campi.
287
265
 
288
266
  Chiave Jev (ordine: env vince sul file): `OPENROUTER_API_KEY` o
@@ -324,9 +302,9 @@ echo '{"requirements":"...","candidate":"..."}' | npm run jev-check
324
302
  ## Limiti onesti
325
303
 
326
304
  - `pass` = "supera i controlli configurati", non "corretto". Compilazione e test restano necessari.
327
- - Il gate copre solo il twin `__jev` selezionato; in `automatic` la
328
- selezione di altri modelli viene rifiutata con revert al twin.
329
- (`/jev off` ripristina il provider originale intatto.)
305
+ - Il gate copre i turni che passano dal provider patchato in `automatic`;
306
+ se un provider non è patchato (raro: sostituzione concorrente) il turno
307
+ passa con una nota `jev-guarded`/diagnostica dichiarata.
330
308
  - Soglie calibrate su 20 casi (`docs/calibration-2026-09-19.md`): buone per
331
309
  iniziare, da rivalutare con corpus più ampio.
332
310
  - Jev è un giudice probabilistico, non un verificatore formale.
@@ -24,19 +24,7 @@
24
24
  "automatic": {
25
25
  "transport": "provider-gate",
26
26
  "maxRegenerations": 2,
27
- "requireGuardedModel": true,
28
- "twins": [
29
- {
30
- "provider": "deepseek",
31
- "model": "deepseek-flash"
32
- },
33
- {
34
- "provider": "openai-codex",
35
- "model": "gpt-5.6-terra"
36
- }
37
- ],
38
- "upstreamProvider": "deepseek",
39
- "upstreamModel": "deepseek-flash"
27
+ "repairOnReview": true
40
28
  },
41
29
  "limits": {
42
30
  "maxPayloadBytes": 120000,