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 +68 -14
- package/config/jev-config.example.json +9 -0
- package/config/jev-verification.example.json +22 -0
- package/extensions/index.ts +489 -124
- package/package.json +1 -1
- package/src/automatic/guardian.ts +26 -2
- package/src/automatic/overlay.ts +160 -68
- package/src/commands.ts +106 -1
- package/src/config.ts +13 -0
- package/src/verification-runner.ts +177 -0
- package/src/verification-tool.ts +65 -0
- package/src/verification.ts +589 -0
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
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
+
}
|