Opus High Review Response: Token Optimization Plan¶
Meta¶
- Reviewer: Claude Opus 4.6 (1M context)
- Data: 27 marzo 2026
- Documenti revisionati:
opus-high-token-optimization-review.md,opus-high-operational-plan.md - Codebase verificata:
/home/ubuntu/Documents/Progetti Interni/BeDefended Agentic Pentesting Platform/bd_app/ - Metodo: esplorazione diretta del repository con lettura dei file, misura delle dimensioni, analisi dei meccanismi di loading, verifica incrociata delle evidenze
1. Approved As-Is¶
Workstream 0: Misurazione Prima di Cambiare¶
APPROVATO senza riserve.
Il principio "misura prima di ottimizzare" e' metodologicamente corretto. Lo schema JSONL e' ben disegnato. La tassonomia di classificazione run (useful, rate_limited_immediate, rate_limited_midrun, dead_run_short, error) e' completa.
Aggiunta raccomandata: includere prompt_supporting_files_count e prompt_supporting_files_bytes nel record metriche per misurare l'impatto reale del lazy loading una volta implementato.
Workstream 6: Workspace & Search Hygiene¶
APPROVATO senza riserve.
Creare .rgignore per escludere .claude/worktrees/, node_modules/, payloads/, log runtime e' a rischio zero e previene inquinamento accidentale del contesto. Implementabile in meno di un'ora.
Oltre a .rgignore, verificare se la versione di Claude Code in uso supporta .claudeignore per prevenire che payloads/ (145MB), .claude/worktrees/ (102MB) e ingest/data/ (25MB) entrino nel contesto tool.
Workstream 1: Loop Hardening¶
Il singleton lock, il rate-limit sentinel globale, la classificazione dead-run e il control plane unificato sono tutti requisiti di design corretti per il BB loop.
Le specifiche nel piano sono solide: - Lock atomico globale con recovery di lock stale - Cooldown progressivo (15min -> 30min -> blocco fino a reset reale) - Sessione morta = <=3 turni o <90s o rate limit immediato - Backoff reale, non restart ogni 10 secondi
La logica di rate-limit parsing in scripts/pentest-autoresume.py (14+ pattern regex, parse wait time, persistence su JSON) e' riusabile direttamente nel BB loop senza riscriverla.
2. Approved With Conditions¶
Workstream 2: Context Slimming & Prompt Capsules¶
APPROVATO con quattro condizioni.
Condizione 1: Decomporre skill-boilerplate.md per primo, non CLAUDE.md¶
skill-boilerplate.md a 61.4KB e' caricato da ogni subprocess di test. Contiene sezioni con profili di necessita' molto diversi:
| Sezione | Dimensione stimata | Necessita' |
|---|---|---|
| PATH isolation | ~2KB | SEMPRE |
| Stealth mode check | ~3KB | SEMPRE |
| Structured logging | ~2KB | SEMPRE |
| Kill switch (45min/500req) | ~2KB | SEMPRE |
| Token counting | ~1KB | SEMPRE |
| Auth setup | ~3KB | SEMPRE |
| Proxy rotation | ~4KB | SOLO SE PROXY |
| Scope routing | ~5KB | SKILL-SPECIFIC |
| Advanced stealth config | ~8KB | SOLO SE STEALTH |
| Rate-limit handler reference | ~15KB+ | LAZY (on first 429) |
Proposta di split:
skill-boilerplate-core.md(~15KB): PATH, stealth check, logging, kill switch, token counting, authskill-boilerplate-stealth.md(~8KB): configurazione stealth avanzata, caricato solo se stealth mode attivoskill-boilerplate-ratelimit.md(~15KB): handler rate-limit completo, caricato on-demand al primo 429
Impatto: risparmio di ~30-45K token per subprocess quando stealth e' off o rate limits non scattano. Su 36 subprocessi: 1M-1.6M token risparmiati per pentest completo. Questo e' il singolo cambiamento con ROI piu' alto dell'intero piano.
CLAUDE.md (26KB) va toccato solo con trim leggero di sezioni chiaramente verbose. E' gia' snello e ben organizzato. Ristrutturarlo rischia di rompere riferimenti impliciti usati dalle skill.
Condizione 2: Rispettare il meccanismo supporting-files: esistente¶
Il piano propone "router + micro-pack" ma non riconosce che supporting-files: nel YAML frontmatter gia' fornisce loading selettivo per skill. Il fix reale e':
- Rendere il routing
--scopepiu' stretto: quando viene passato--scope sqli, la skill dovrebbe dichiarare nel frontmatter solo i file rilevanti per SQLi, non tutti i sottotipi - Splittare i SKILL.md monolitici in sezioni scope-specific caricabili condizionalmente
- Non reinventare un nuovo meccanismo di loading — estendere quello esistente
Concretamente per test-injection, invece di un unico SKILL.md da 150.5KB con 8 supporting files:
test-injection/ (attuale: 1 SKILL.md + 8 supporting)
-> test-injection-sqli/ (SKILL.md ~30KB + 2 supporting: knowledge-sqli, cheatsheet-sqli)
-> test-injection-xss/ (SKILL.md ~25KB + 2 supporting: knowledge-xss, cheatsheet-xss)
-> test-injection-ssti/ (SKILL.md ~20KB + 2 supporting: knowledge-ssti, cheatsheet-ssti)
-> test-injection-xxe/ (SKILL.md ~15KB + 1 supporting: knowledge-xxe)
-> test-injection-cmdi/ (SKILL.md ~15KB + 2 supporting: knowledge-cmdi, cheatsheet-cmdi)
Il router originale test-injection diventa un dispatcher leggero (~5KB) che chiama la sub-skill corretta in base allo scope.
Condizione 3: Prioritizzare test-injection come proof of concept¶
A 150.5KB (solo SKILL.md) + 148KB (supporting files dichiarati), e' la skill singola piu' costosa. Decomporla per prima: - valida l'approccio - massimizza il risparmio iniziale - produce un template riusabile per le altre decomposizioni
Condizione 4: Non toccare CLAUDE.md in modo aggressivo¶
CLAUDE.md (26KB) e' caricato automaticamente da Claude Code in ogni sessione. Il contenuto e' gia' prevalentemente invarianti, safety e routing. Il piano propone "distillarlo", ma spostare dettagli in helper file rischia di rompere riferimenti impliciti. Solo trim di sezioni chiaramente verbose; nessuna ristrutturazione.
Workstream 3: Skinny Context Before Fork¶
APPROVATO con una correzione.
Il meccanismo di dispatch (claude -p "Run /test-injection $TARGET --scope sqli") gia' passa una stringa prompt compatta. I subagent non ereditano il contesto conversazionale del parent — partono freschi. Il costo reale ereditato e':
- CLAUDE.md (26KB): architetturale, difficile da evitare — Claude Code lo carica automaticamente
supporting-filesdella skill invocata: questo e' il vero target di ottimizzazionecontext.jsonletto dal boilerplate: gia' compatto (fingerprint, tech stack, auth, endpoints)
La proposta run-brief (runtime/dispatch-brief.json) aggiunge valore principalmente per stato cross-sessione: prior findings, prior blockers, next steps. Va implementata come capsule opzionale, ma senza over-engineering.
Correzione: il piano descrive il problema del "contesto grasso ereditato" come se fosse grave. In realta' il dispatch via claude -p gia' isola i subagent. Il costo che va attaccato non e' il "context: fork" generico, ma specificamente le dimensioni dei file caricati nella nuova sessione (CLAUDE.md + supporting-files + boilerplate on-demand).
Workstream 4: Differential Rediscovery¶
APPROVATO come specifica di design
La logica proposta e' corretta: - Freshness manifest (homepage hash, robots/sitemap hash, JS manifest hash, tech stack fingerprint, auth surface fingerprint, endpoint set hash) - Delta check leggero all'inizio di ogni ritorno - Full rediscovery se delta supera soglia, reuse baseline se non cambia
Trigger aggiuntivi mancanti dal piano:
| Trigger | Razionale |
|---|---|
| Nuovi metodi HTTP su endpoint esistenti (PUT/PATCH/DELETE) | Superficie di attacco ampliata |
| Nuovi response header (CORS changes, nuovi auth headers) | Cambio di policy o framework |
| Cambio formato errori (diversa versione framework) | Nuova tech stack sotto lo stesso hostname |
| Endpoint WebSocket | Superficie completamente diversa |
| Force full rediscovery ogni N cicli | Safety net contro false negative |
Il fallback periodico (force full rediscovery ogni N cicli, indipendentemente dal delta) e' critico per non accumulare debt di copertura su programmi con cambiamenti sottili non catturati dal manifest.
Workstream 5: Proxy Analyzer¶
APPROVATO con reframing.
Va costruito con:
- Novelty gate ON di default
- Semantic dedup (method + normalized route + param names + status bucket + response content-type + response shape hash)
auto_analyze=Falsecome default, opt-in per sessione- Analisi manuale single-request sempre disponibile
- Threshold recall-oriented: mai scartare 4xx/5xx interessanti, nuove route, nuovi content-type, nuovi auth patterns, reflection, token leakage, redirect params, callback/webhook, GraphQL, upload, admin/internal
Workstream 7: Model Routing¶
APPROVATO solo Lane A (nessun downgrade di modello). Lane B richiede shadow validation.
Lane A (nessun downgrade) e' safe: nessun cambio di modello, nessun rischio.
Lane B (routing di task deterministici su modello piu' economico) ha rischio reale: fingerprinting e policy parsing possono far emergere segnali inattesi che modelli piu' economici mancano. Shadow mode con parity gate e' l'approccio corretto, ma va deferrito a dopo che i Workstream 0-6 sono validati.
Task candidati per Lane B (dopo shadow validation): - Clustering di endpoint equivalenti - Normalizzazione route - Hash di response body - Parsing di sitemap/robots - Diff di JS manifest
Task dove Opus resta mandatory: - Exploit reasoning - Stuck resolution - Verification - Chain discovery - Final finding acceptance - Qualsiasi task dove un falso negativo = finding perso
3. Rischi e Blind Spot¶
Rischio 1: La decomposizione delle skill puo' frammentare la metodologia¶
Severita': MODERATA
Quando test-injection e' una skill monolitica, l'agente vede tutti i tipi di injection simultaneamente e puo' individuare segnali cross-type:
- Reflection XSS che suggerisce SSTI
- Error message da SQLi che rivela path per CMDi
- Behaviour di encoding che indica sia XSS che SQLi blind
- Response differenziale che suggerisce NoSQLi dove si stava testando SQLi
Decomporre in micro-skill con contesto isolato perde questa cross-pollination.
Mitigazione obbligatoria: ogni micro-skill deve includere una sezione "signal forwarding" nel preamble:
## Cross-Type Signal Forwarding
Se durante il test SQLi osservi uno di questi indicatori:
- Template syntax in error messages (Jinja2, Twig, Freemarker) -> emit signal SSTI
- Command output patterns in responses -> emit signal CMDi
- Reflection of input in HTML context -> emit signal XSS
- XML parsing errors -> emit signal XXE
Emetti il segnale in: $EDIR/signals/cross-type-signals.jsonl
Formato: {"source_skill": "sqli", "signal": "ssti", "evidence": "...", "endpoint": "..."}
Il router deve consumare questi segnali e dispatchare di conseguenza. Questo meccanismo non e' nel piano corrente e va aggiunto prima di qualsiasi decomposizione.
Rischio 2: --max-turns one-size-fits-all¶
Severita': BASSA-MODERATA
Tutte le skill usano --max-turns 250 (o 200 via runner). Infrastructure scanning, crypto checks e client-side tests raramente necessitano di 250 turni. Logic e injection testing a volte li usano tutti.
Il piano non propone budget di turni per skill.
Mitigazione: assegnare budget per classe di complessita':
| Classe | Skill | Max turns |
|---|---|---|
| Deterministic | test-infra, test-crypto, test-client | 80-120 |
| Medium | test-api, test-ssrf, test-cloud | 150 |
| High | test-injection, test-auth, test-access, test-logic | 250 |
| Very High | test-advanced (chaining) | 250+ |
Risparmio stimato: ~30-50% di turni sprecati sulle skill piu' semplici, zero rischio di coverage perche' le skill complesse mantengono il budget pieno.
Rischio 3: Le prompt capsules possono diventare stale¶
Severita': BASSA
Capsule compilate (brief-compact.json, attack-surface-compact.json) sono snapshot. Se lo stato dell'engagement diverge mid-pentest (nuovi endpoint scoperti, scope changes), le capsule diventano misleading.
Mitigazione: ogni capsule deve avere un TTL o timestamp di generazione. Qualsiasi capsule piu' vecchia dell'ultima discovery phase va rigenerata prima del dispatch.
Rischio 4: Overhead dei feature flag¶
Severita': BASSA
Sette feature flag aggiungono branching condizionale a shell script e markdown. Gestibile ma aumenta la complessita' di debugging.
Mitigazione: usare variabili d'ambiente con default chiari. Documentare quali flag sono "graduated" (always-on dopo validazione) vs ancora sperimentali. Dopo 2 cicli di validazione positiva, graduare il flag rimuovendo il condizionale.
Rischio 5: False negative nel differential rediscovery¶
Severita': MODERATA
Se il freshness check manca una nuova superficie di attacco (nuova versione API dietro lo stesso hostname, nuovo endpoint GraphQL non nel sitemap, route SPA cambiate senza riflesso nel JS hash), il sistema salta la full rediscovery e perde finding.
Mitigazione: gia' dettagliata nella sezione Workstream 4 sopra. Il punto critico e' il fallback periodico: force full rediscovery ogni N cicli a prescindere dal delta.
Rischio 6: Assunzione implicita di uniformita' del costo per subprocess¶
Severita': BASSA
Il piano tratta tutti i subprocess come se avessero lo stesso costo. In realta':
- test-injection --scope sqli (con sqlmap, blind testing, time-based) puo' usare 200+ turni
- test-crypto (verifica certificati, cipher suite) tipicamente ne usa 20-40
L'ottimizzazione dovrebbe essere proporzionale: i subprocess piu' costosi (injection, auth, logic) meritano piu' attenzione di ottimizzazione rispetto a quelli gia' leggeri.
4. Ottimizzazioni Mancanti¶
Mancante 1: Budget --max-turns per skill (ALTO ROI, ZERO RISCHIO)¶
Come dettagliato nel Rischio 2. Le skill deterministiche non necessitano di 250 turni. Ridurre i turni inutili senza impatto sulla coverage.
Mancante 2: Split di skill-boilerplate.md (ROI SINGOLO PIU' ALTO)¶
Il piano menziona "prompt capsules" in modo astratto ma non identifica il target singolo piu' grande: skill-boilerplate.md a 61.4KB caricato da ogni subprocess. Lo split in core (15KB) + moduli opzionali risparmia ~46KB x 36 subprocess = ~1.6M token per pentest completo.
Mancante 3: test-llm nella priority di decomposizione¶
A 204KB, test-llm/SKILL.md e' il secondo file skill piu' grande. Quando attivo, e' il dispatch singolo piu' costoso. Va aggiunto alla priority list dopo test-injection.
Mancante 4: Compattazione di agent-dispatch.md (37.5KB)¶
Contiene il protocollo di wave dispatch, tabelle di model routing e thinking budget. E' caricato dall'orchestratore pentest. Gran parte del contenuto sono tabelle di lookup esprimibili come JSON compatto invece che markdown narrativo:
{
"wave_config": {
"max_waves": 12,
"agents_per_wave": 3,
"agents_per_wave_fast": 5
},
"model_routing": {
"test-injection": {"model": "opus", "thinking": 24000},
"test-auth": {"model": "opus", "thinking": 16000},
"test-infra": {"model": "haiku", "thinking": 2000}
}
}
Risparmio stimato: ~50-60% del costo token di questo file.
Mancante 5: Centralizzazione safety rules duplicate¶
16 skill di test contengono ciascuna 3-5KB di regole safety specifiche per dominio. Le regole non sono identiche (ogni skill ha vincoli domain-specific), ma il framing boilerplate attorno ad esse e' duplicato:
## SAFETY: [skill-specific warning]
### Shared Initialization
**Run all initialization code from `pentest/helpers/skill-boilerplate.md`** before any test logic below.
This sets up: PATH isolation, stealth mode, structured logging, kill switch...
Estrarre il frame comune in un preamble safety condiviso e tenere solo il delta skill-specific in ogni skill risparmia ~40-50KB totali. Non e' un risparmio enorme per singola skill, ma su 16 skill diventa significativo.
Mancante 6: Cross-type signal forwarding (CRITICO per no-regression)¶
Come dettagliato nel Rischio 1. Senza questo meccanismo, la decomposizione delle skill in micro-pack rischia di perdere finding che emergono da cross-pollination tra tipi di vulnerabilita'. Questo e' l'unico punto dove l'ottimizzazione proposta potrebbe effettivamente ridurre la qualita' dei finding se non gestito.
5. Tabella Riassuntiva per Workstream¶
| Workstream | Verdetto | Condizioni | Rischio regressione |
|---|---|---|---|
| WS0: Misurazione | APPROVATO | Aggiungere metriche supporting-files | Nessuno |
| WS1: Loop Hardening | APPROVATO | Reframe come nuova costruzione | Nessuno (build new) |
| WS2: Context Slimming | APPROVATO con condizioni | Boilerplate split prima di CLAUDE.md; rispettare supporting-files; signal forwarding prima di decomposizione | Moderato senza signal forwarding |
| WS3: Skinny Fork | APPROVATO con correzione | Fork gia' skinny; ottimizzare supporting-files e boilerplate, non il contesto conversazionale | Basso |
| WS4: Differential Rediscovery | APPROVATO | Aggiungere trigger mancanti; force full rediscovery periodico | Moderato su false negative |
| WS5: Proxy Analyzer | APPROVATO | Reframe come design spec; auto_analyze=False di default | Nessuno (build new) |
| WS6: Search Hygiene | APPROVATO | Nessuna | Nessuno |
| WS7: Model Routing | Lane A APPROVATA; Lane B richiede shadow | Deferire Lane B dopo WS0-6 | Moderato per Lane B |
6. Risparmio Complessivo Atteso¶
Sul flusso pentest corrente (Fasi 1-3)¶
| Componente | Token risparmiati per pentest | Fonte |
|---|---|---|
| Boilerplate split (core vs optional) | ~1.0-1.6M | 36 subprocess x 30-45K risparmiati ciascuno |
| Skill decomposition (scope-specific) | ~0.5-1.0M | 12-15 dispatch pesanti x 40-70K risparmiati ciascuno |
| Max-turns budget per skill | ~0.3-0.5M | 15-20 skill semplici con turni dimezzati |
| agent-dispatch.md compaction | ~0.1-0.2M | Singolo file, caricato dall'orchestratore |
| Totale stimato | ~2.0-3.3M token per pentest completo | 50-70% riduzione sul flusso corrente |
Sul BB loop (Fase 4, quando costruito)¶
| Componente | Riduzione stimata |
|---|---|
| Singleton lock + cooldown globale | 40-85% del burn attuale da spawn storm |
| Dead-run classification + backoff | Incluso sopra |
| Differential rediscovery (programmi stabili) | 30-70% addizionale sui cicli di ritorno |
| Proxy novelty gate (se attivo) | 60-95% del background proxy burn |
| Totale stimato | 70-90% riduzione complessiva |
Conclusione¶
Il piano puo' consegnare una riduzione del 50-70% del consumo token totale sul flusso pentest corrente e una riduzione del 70-90% sul BB loop.
Nessuna regressione di qualita' finding o copertura e' attesa da nessun cambiamento approvato, a condizione che:
- Il cross-type signal forwarding sia implementato insieme alla decomposizione skill
- I budget max-turns per skill siano validati contro dati storici di utilizzo turni
- Il model routing (Lane B) passi attraverso shadow validation prima del rollout
- Il differential rediscovery includa force full rediscovery periodico come safety net
La metodologia del progetto e' eccezionale. Il lavoro di ottimizzazione riguarda rendere piu' magro il veicolo di consegna, non cambiare cosa consegna.