pi-jev-guard 0.3.3 → 0.5.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
@@ -6,6 +6,7 @@ Verifica le risposte con [TypeSafe Jev](https://docs.typesafe.ai) dentro [pi](ht
6
6
  - **Domande tipate**: tool `jev_ask` per giudizi calibrati definiti dal modello (noul/choice/score) invece di prosa.
7
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.
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
+ - **Verifica progetto** (opt-in): footer deterministico da `edit`/`write` osservati e check esplicitamente autorizzati nel manifest locale; il modello può eseguire soltanto quegli id, mai shell arbitraria.
9
10
 
10
11
  ## Installazione
11
12
 
@@ -121,20 +122,19 @@ Verdetto **incerto** (`review`): il gate tenta prima una riparazione privata
121
122
  `policy.onUncertain` e `policy.onUnavailable` (`"hold"` default, oppure `"pass"`).
122
123
  Con `"pass"` il testo viene pubblicato con una nota di trasparenza sul verdetto.
123
124
 
124
- Se un'altra estensione ri-registra lo stesso provider (caso reale: `pi-accounts`
125
- al cambio account), l'overlay viene ricostruito sopra il provider live prima di
126
- ogni turno; in più il gate toglie il suffisso `__jev` da qualunque payload,
127
- registrando `jev-gate-bypass` e avvisando in TUI, perché quel turno non è
128
- passato dalla verifica.
129
-
130
- Coabitazione con `pi-accounts`: quell'estensione aborts i turni il cui modello
131
- non risulta nei modelli disponibili dell'account (`turn_start` → `ctx.abort()`,
132
- errore istantaneo `This operation was aborted`). Per questo i twin vengono
133
- registrati già all'evento `input`, prima di qualsiasi `before_agent_start`:
134
- quando pi-accounts legge il registry trova gli id `__jev` e non arma l'abort.
135
- Se vedi comunque quell'errore solo sui twin (il modello originale funziona),
136
- con un avviso `... is not available to account ...`, è quella gara di
137
- registrazione: apri un issue con le righe `jev-overlay-reassert` della sessione.
125
+ Se un'altra estensione gestisce lo stesso provider (caso reale: `pi-accounts`
126
+ con overlay auth su `openai-codex`), il gate NON ri-registra nulla: applica
127
+ una patch in-place sull'oggetto provider live (stessa identità, stessa config
128
+ del proprietario). Così i controlli di ownership altrui non vedono mai una
129
+ "configuration changed" e non armano abort dei turni (`This operation was
130
+ aborted` istantaneo). Quando il proprietario sostituisce l'oggetto, il nuovo
131
+ viene patchato ex-novo agli hook (`input`, `before_agent_start`, `turn_start`,
132
+ `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,
137
+ perché quel turno non è passato dalla verifica.
138
138
  Le conferme per comandi di rete sospetti attendono invece una decisione esplicita;
139
139
  la normale sequenza tool → risposta successiva continua senza un nuovo prompt.
140
140
 
@@ -181,6 +181,57 @@ le contraddizioni ad alta confidenza. Fail-open: se il verificatore non
181
181
  risponde, il testo passa senza nota. `/jev last` mostra anche l'esito
182
182
  grounding (`warned`/`repaired`/`held`).
183
183
 
184
+ ### Verifica progetto deterministica (opt-in)
185
+
186
+ Il grounding è probabilistico; per **compilazione, lint e test** è meglio una
187
+ prova deterministica. La verifica progetto mantiene, solo nella sessione,
188
+ una lista di `edit`/`write` riusciti e degli esiti osservati dei check. Il
189
+ footer della risposta viene generato dall'estensione, non dal modello:
190
+ quindi non può trasformare un test non eseguito in “test passati”.
191
+
192
+ 1. Copia e adatta il manifest versionato/localmente controllato:
193
+
194
+ ```bash
195
+ mkdir -p .pi
196
+ cp config/jev-verification.example.json .pi/jev-verification.json
197
+ ```
198
+
199
+ 2. Controllalo tu e acquisiscilo nella sessione (o riacquisiscilo dopo una
200
+ modifica manuale):
201
+
202
+ ```text
203
+ /jev verification reload
204
+ /jev verification warn # footer trasparente, nessuna rigenerazione
205
+ # oppure: /jev verification repair|hold
206
+ ```
207
+
208
+ 3. Dopo un edit, il modello può eseguire soltanto gli id dichiarati nel
209
+ manifest — mai una shell string fornita dal modello:
210
+
211
+ ```text
212
+ /jev verify recommended # i check pertinenti non ancora freschi
213
+ /jev verify all # tutti, fino a verification.maxCommands
214
+ /jev verify typecheck # un id esplicito del manifest
215
+ ```
216
+
217
+ Il tool LLM `jev_verify` ha lo stesso vincolo. Richiede un progetto trusted e
218
+ non accetta comandi arbitrari. Footer/repair/hold operano nel twin in
219
+ `automatic`; `/jev verify` può essere usato manualmente anche per controllare
220
+ un progetto senza pubblicare un footer. Il manifest è acquisito a inizio sessione o
221
+ con `/jev verification reload`; se cambia dopo, la verifica rifiuta di
222
+ eseguire fino a una nuova acquisizione utente. `write`/`edit` del modello sul
223
+ manifest sono bloccati; anche modifiche via shell vengono rilevate dal
224
+ fingerprint e non aggiornano i comandi autorizzati. Il manifest è quindi una
225
+ policy dell'utente/progetto, non una superficie di prompt injection.
226
+
227
+ Modalità: `warn` aggiunge il footer; `repair` rigenera una volta con feedback
228
+ che chiede di invocare `jev_verify`; `hold` trattiene le risposte quando un
229
+ check è fallito, e dopo il tentativo bounded anche quando resta mancante.
230
+ Nessun manifest o nessun check pertinente è una limitazione dichiarata, non
231
+ un fallimento del codice e non produce hold. La raccolta delle modifiche è
232
+ limitata a `edit`/`write` osservati: una modifica fatta con shell non viene
233
+ attribuita automaticamente al modello.
234
+
184
235
  ## Configurazione
185
236
 
186
237
  `~/.pi/agent/jev-config.json` (o `$JEV_CONFIG`). Env: `JEV_MODE`, `JEV_BACKEND`
@@ -235,3 +286,6 @@ echo '{"requirements":"...","candidate":"..."}' | npm run jev-check
235
286
  - Il grounding controlla solo affermazioni verificabili sulla sessione
236
287
  (comandi, file, test, modifiche): niente fact-check di fatti esterni,
237
288
  e con contesti lunghi l'evidenza oltre budget viene elisa.
289
+ - La verifica progetto dimostra solo i check dichiarati ed eseguiti dopo gli
290
+ `edit`/`write` osservati; non è una prova formale di correttezza, non vede
291
+ modifiche effettuate via shell e non sostituisce review umana.
@@ -65,6 +65,15 @@
65
65
  "minConfidence": 0.6,
66
66
  "cacheSeconds": 120
67
67
  },
68
+ "verification": {
69
+ "enabled": false,
70
+ "mode": "warn",
71
+ "manifestPath": ".pi/jev-verification.json",
72
+ "maxRepairs": 1,
73
+ "commandTimeoutMs": 120000,
74
+ "outputChars": 6000,
75
+ "maxCommands": 3
76
+ },
68
77
  "exfilCheck": {
69
78
  "enabled": true,
70
79
  "tools": [
@@ -0,0 +1,22 @@
1
+ {
2
+ "version": 1,
3
+ "checks": [
4
+ {
5
+ "id": "typecheck",
6
+ "description": "TypeScript static check",
7
+ "command": "npm run typecheck",
8
+ "files": ["src/**/*.ts", "extensions/**/*.ts", "test/**/*.ts"]
9
+ },
10
+ {
11
+ "id": "unit",
12
+ "description": "Unit tests",
13
+ "command": "npm run test:unit",
14
+ "files": ["src/**/*.ts", "extensions/**/*.ts", "test/**/*.ts"]
15
+ },
16
+ {
17
+ "id": "diff-check",
18
+ "description": "Whitespace and patch integrity",
19
+ "command": "git diff --check"
20
+ }
21
+ ]
22
+ }