@dtlabs/ai-toolkit 0.1.6 → 0.2.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.
Files changed (32) hide show
  1. package/.claude/agents/define-feature.md +1 -0
  2. package/.claude/agents/dependency-injection-refactoring.md +1 -0
  3. package/.claude/agents/dependency-supply-chain-security.md +1 -0
  4. package/.claude/agents/developer-backend.md +1 -0
  5. package/.claude/agents/developer-frontend.md +1 -0
  6. package/.claude/agents/developer-testing.md +1 -0
  7. package/.claude/agents/domain-model-refactoring.md +1 -0
  8. package/.claude/agents/god-class-decomposition.md +1 -0
  9. package/.claude/agents/init-agents-md.md +1 -0
  10. package/.claude/agents/install-toolkit.md +134 -3
  11. package/.claude/agents/intervention-documentation-standard.md +1 -0
  12. package/.claude/agents/review-solution.md +1 -0
  13. package/.claude/agents/security-hardening.md +1 -0
  14. package/.claude/commands/check-interventions.md +152 -0
  15. package/.claude/commands/next-intervention.md +113 -0
  16. package/.claude/settings.json +5 -0
  17. package/.claude/skills/assess-codebase/SKILL.md +139 -60
  18. package/.claude/skills/implement-feature/SKILL.md +208 -26
  19. package/.claude/workflows/am-phase1.js +304 -0
  20. package/.claude/workflows/am-phase2.js +166 -0
  21. package/.claude/workflows/pm-phase1.js +163 -0
  22. package/.claude/workflows/pm-phase2.js +108 -0
  23. package/.claude/workflows/pm-phase3.js +309 -0
  24. package/CHANGELOG.md +101 -3
  25. package/CLAUDE.md +34 -0
  26. package/README.md +26 -0
  27. package/bin/cli.js +64 -5
  28. package/docs/token-optimization-backlog.md +115 -0
  29. package/docs/token-optimization.md +274 -0
  30. package/package.json +1 -1
  31. package/.claude/agents/assessment-manager.md +0 -416
  32. package/.claude/agents/project-manager.md +0 -309
package/bin/cli.js CHANGED
@@ -40,10 +40,18 @@ function banner() {
40
40
 
41
41
  // ── helpers ──────────────────────────────────────────────────────────────────
42
42
 
43
+ // User-owned config that must NEVER be copied into a destination. We only verify
44
+ // and advise on these — copying would clobber the user's existing settings.
45
+ const NEVER_COPY = new Set(['settings.json', 'settings.local.json']);
46
+
43
47
  function fileHash(filePath) {
44
48
  return crypto.createHash('md5').update(fs.readFileSync(filePath)).digest('hex');
45
49
  }
46
50
 
51
+ function readJsonSafe(filePath) {
52
+ try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); } catch { return null; }
53
+ }
54
+
47
55
  function ensureDir(filePath) {
48
56
  const dir = path.dirname(filePath);
49
57
  if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
@@ -67,10 +75,12 @@ function expandMappings(mappings) {
67
75
  if (!fs.existsSync(src)) continue;
68
76
  if (fs.statSync(src).isDirectory()) {
69
77
  for (const entry of walkDir(src)) {
78
+ if (NEVER_COPY.has(path.basename(entry))) continue; // never clobber user config
70
79
  const rel = path.relative(src, entry);
71
80
  files.push({ src: entry, dest: path.join(dest, rel) });
72
81
  }
73
82
  } else {
83
+ if (NEVER_COPY.has(path.basename(src))) continue;
74
84
  files.push({ src, dest });
75
85
  }
76
86
  }
@@ -262,6 +272,52 @@ async function askMattPocock() {
262
272
  else console.log(` ${clr('gray', 'Skipped.')}\n`);
263
273
  }
264
274
 
275
+ // ── subagent spawn-depth check (verify & advise only — never write) ────────────
276
+
277
+ const SPAWN_DEPTH_VAR = 'CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH';
278
+
279
+ // Report whether the spawn-depth prerequisite is satisfied for a destination,
280
+ // checking both project-level and local-override settings files. Purely advisory:
281
+ // this NEVER creates or modifies any settings file.
282
+ function checkSpawnDepth(destRoot) {
283
+ const candidates = [
284
+ path.join(destRoot, '.claude', 'settings.json'),
285
+ path.join(destRoot, '.claude', 'settings.local.json'),
286
+ ];
287
+
288
+ console.log(divider());
289
+ console.log(bold(' Subagent spawn depth (required for orchestrated pipelines)'));
290
+ console.log(divider());
291
+
292
+ for (const file of candidates) {
293
+ if (!fs.existsSync(file)) continue;
294
+ const json = readJsonSafe(file);
295
+ const value = json && json.env && json.env[SPAWN_DEPTH_VAR];
296
+ if (value !== undefined && Number(value) >= 2) {
297
+ console.log(` ${clr('green', '✔')} ${SPAWN_DEPTH_VAR}=${value} found in ${dim(path.relative(process.cwd(), file))}`);
298
+ console.log(` ${dim('Orchestrators can spawn worker subagents — pipelines will run as designed.')}\n`);
299
+ return;
300
+ }
301
+ }
302
+
303
+ console.log(` ${clr('yellow', '⚠')} ${SPAWN_DEPTH_VAR} is not set to 2+ in this project.`);
304
+ console.log(` ${dim('Without it, /implement-feature and /assess-codebase run every worker inline')}`);
305
+ console.log(` ${dim('on the orchestrator model: per-agent model assignment, context isolation,')}`);
306
+ console.log(` ${dim('and per-agent token telemetry are all lost.')}`);
307
+ console.log();
308
+ console.log(` ${bold('Action required')} — add this to ${clr('cyan', '.claude/settings.json')} (project)`);
309
+ console.log(` or ${clr('cyan', '~/.claude/settings.json')} (all projects). We do not edit it for you,`);
310
+ console.log(` ${dim('to avoid clobbering your existing configuration:')}`);
311
+ console.log();
312
+ console.log(clr('gray', ' {'));
313
+ console.log(clr('gray', ' "env": {'));
314
+ console.log(clr('gray', ` "${SPAWN_DEPTH_VAR}": "2"`));
315
+ console.log(clr('gray', ' }'));
316
+ console.log(clr('gray', ' }'));
317
+ console.log();
318
+ console.log(` ${dim('Then restart Claude Code so the variable is loaded.')}\n`);
319
+ }
320
+
265
321
  // ── entry points ──────────────────────────────────────────────────────────────
266
322
 
267
323
  async function installLocal(targetDir, force) {
@@ -277,6 +333,7 @@ async function installLocal(targetDir, force) {
277
333
  await runInstall(`local project`, mappings, force);
278
334
  writeInstalledVersion(targetDir);
279
335
  console.log(` ${clr('green', '✔')} ${bold('Install complete.')}\n`);
336
+ checkSpawnDepth(targetDir);
280
337
  await askMattPocock();
281
338
  console.log(divider());
282
339
  console.log(`\n ${bold('Next steps:')}`);
@@ -293,15 +350,17 @@ async function installGlobal(force) {
293
350
  console.log(` ${clr('cyan', '▸')} Target: ${bold(target)} ${clr('gray', '(global Claude folder)')}\n`);
294
351
  await checkVersion(target, force);
295
352
  const mappings = [
296
- { src: path.join(packageRoot, '.claude', 'agents'), dest: path.join(target, 'agents') },
297
- { src: path.join(packageRoot, '.claude', 'skills'), dest: path.join(target, 'skills') },
298
- { src: path.join(packageRoot, '.claude', 'commands'), dest: path.join(target, 'commands') },
299
- { src: path.join(packageRoot, 'docs'), dest: path.join(target, 'docs') },
300
- { src: path.join(packageRoot, 'CLAUDE.md'), dest: path.join(target, 'CLAUDE.md') },
353
+ { src: path.join(packageRoot, '.claude', 'agents'), dest: path.join(target, 'agents') },
354
+ { src: path.join(packageRoot, '.claude', 'skills'), dest: path.join(target, 'skills') },
355
+ { src: path.join(packageRoot, '.claude', 'commands'), dest: path.join(target, 'commands') },
356
+ { src: path.join(packageRoot, '.claude', 'workflows'), dest: path.join(target, 'workflows') },
357
+ { src: path.join(packageRoot, 'docs'), dest: path.join(target, 'docs') },
358
+ { src: path.join(packageRoot, 'CLAUDE.md'), dest: path.join(target, 'CLAUDE.md') },
301
359
  ];
302
360
  await runInstall('global Claude folder', mappings, force);
303
361
  writeInstalledVersion(target);
304
362
  console.log(` ${clr('green', '✔')} ${bold('Global install complete.')}\n`);
363
+ checkSpawnDepth(homedir);
305
364
  await askMattPocock();
306
365
  console.log(divider());
307
366
  console.log(`\n ${bold('Next steps:')}`);
@@ -0,0 +1,115 @@
1
+ # Token Optimization — Backlog di feature atomiche
2
+
3
+ > Deriva da `docs/token-optimization.md`. Data: 2026-07-24.
4
+ > Ogni voce è **atomica**: implementabile e verificabile in isolamento.
5
+ > "Criticità" = priorità di ottimizzazione (impatto/rischio), NON severità di difetto.
6
+ > Nessun intervento è un bug attivo → nessun `CRITICAL`.
7
+ > Sequenza consigliata = ordine degli ID.
8
+
9
+ ## Quadro sintetico
10
+
11
+ | ID | Intervento | Criticità | Sforzo | Rischio | File toccati | Dipende da |
12
+ |----|-----------|-----------|--------|---------|--------------|-----------|
13
+ | OPT-01 ✅ | `model:` esplicito su ogni agent (→ FTR-007, PR #20) | **HIGH** | Basso | Basso | 15 agent (frontmatter) | — |
14
+ | OPT-02 | Deduplicare CLAUDE.md globale vs progetto | **HIGH** | Minimo | Zero | `~/.claude/CLAUDE.md` | — |
15
+ | OPT-03 | Blocco "Compact instructions" in CLAUDE.md | MEDIUM | Minimo | Zero | `CLAUDE.md` (progetto) | — |
16
+ | OPT-04 | Spostare i cataloghi da CLAUDE.md a reference.md | MEDIUM | Basso | Basso | `CLAUDE.md`, `docs/reference.md` | — |
17
+ | OPT-05 | Procedure on-demand — assessment-manager | MEDIUM | Medio | Basso | `assessment-manager.md` | — |
18
+ | OPT-06 | Procedure on-demand — project-manager | MEDIUM | Medio | Basso | `project-manager.md` | — |
19
+ | OPT-07 | Resource-budget testuale negli assessment agent | MEDIUM | Basso | Basso | 3+ assessment agent | — |
20
+ | OPT-08 | Summary/full split negli output di assessment | **HIGH** | Alto | Medio | assessment agents + int-doc + manager | OPT-07 |
21
+ | OPT-09 | Estrarre calcolo deterministico da assessment-manager | **HIGH** | Alto | Medio | `assessment-manager.md` + nuovo script | — |
22
+ | OPT-10 | generic-software-assessment → ruolo triage | MEDIUM | Medio | Medio | `generic-software-assessment.md` + manager | OPT-08 |
23
+ | OPT-11 | Delegation policy negli orchestratori | LOW | Basso | Basso | 2 orchestratori | — |
24
+ | OPT-12 | Hook di filtro output verboso (opzionale) | LOW | Basso | Basso | `settings.json` + script hook | — |
25
+
26
+ ---
27
+
28
+ ## Feature atomiche
29
+
30
+ ### OPT-01 — `model:` esplicito su ogni agent
31
+ - **Criticità:** HIGH · **Sforzo:** Basso · **Rischio:** Basso
32
+ - **Obiettivo:** ogni agent dichiara il modello adatto al suo ruolo, così nessuno eredita Opus per default.
33
+ - **Scope (solo frontmatter):** aggiungere `model:` ai 15 agent che ne sono privi. Mappatura:
34
+ - `sonnet`: `assessment-manager`, `project-manager`, `developer-backend`, `developer-frontend`, `developer-testing`, `god-class-decomposition`, `domain-model-refactoring`, `dependency-injection-refactoring`, `security-hardening`, `dependency-supply-chain-security`, `define-feature`, `init-agents-md`, `install-toolkit`, `intervention-documentation-standard`
35
+ - `opus`: `review-solution` (unico ruolo con giudizio architetturale profondo)
36
+ - **Fuori scope:** i 7 agent già `haiku` restano invariati.
37
+ - **Criteri di accettazione:** `grep -L "^model:" .claude/agents/*.md` non restituisce nulla; ogni valore ∈ {haiku, sonnet, opus}.
38
+ - **Dipendenze:** nessuna.
39
+
40
+ ### OPT-02 — Deduplicare CLAUDE.md globale vs progetto
41
+ - **Criticità:** HIGH · **Sforzo:** Minimo · **Rischio:** Zero
42
+ - **Obiettivo:** eliminare il duplicato caricato a ogni sessione; il `CLAUDE.md` di progetto resta la fonte unica del catalogo toolkit.
43
+ - **Scope:** ridurre `~/.claude/CLAUDE.md` alle sole preferenze cross-progetto (lingua, stile, convenzioni personali). Rimuovere il catalogo toolkit duplicato.
44
+ - **Criteri di accettazione:** `diff ~/.claude/CLAUDE.md ./CLAUDE.md` NON è più identico; il globale non contiene più le tabelle Skills/Commands/Agents; il Gate Protocol resta accessibile (nel progetto).
45
+ - **Dipendenze:** nessuna. ⚠️ File utente globale — confermare con l'utente prima di modificare.
46
+
47
+ ### OPT-03 — Blocco "Compact instructions" in CLAUDE.md
48
+ - **Criticità:** MEDIUM · **Sforzo:** Minimo · **Rischio:** Zero
49
+ - **Obiettivo:** guidare l'auto-compaction a preservare ciò che conta (decisioni, file, finding IDs) e scartare rumore.
50
+ - **Scope:** aggiungere al `CLAUDE.md` di progetto una sezione `# Compact instructions` (preserva: obiettivo corrente, decisioni confermate, risposte utente, file modificati, errori aperti, finding/artifact IDs; scarta: risultati grep grezzi, output tool riusciti, spiegazioni ripetute, piani superati).
51
+ - **Criteri di accettazione:** la sezione esiste in `CLAUDE.md`; nessun'altra modifica.
52
+ - **Dipendenze:** nessuna. (Coordinare con OPT-04 se si tocca lo stesso file.)
53
+
54
+ ### OPT-04 — Spostare i cataloghi da CLAUDE.md a reference.md
55
+ - **Criticità:** MEDIUM · **Sforzo:** Basso · **Rischio:** Basso
56
+ - **Obiettivo:** CLAUDE.md sotto ~200 righe, solo essenziali operativi; il catalogo di scoperta vive in reference.md.
57
+ - **Scope:** spostare le tabelle Skills / Commands / Agents / Procedures in `docs/reference.md`. In `CLAUDE.md` restano: Dependencies, How it works, override procedure, **Gate Protocol**. Aggiungere in CLAUDE.md un puntatore a reference.md.
58
+ - **Criteri di accettazione:** `CLAUDE.md` < 200 righe; nessuna tabella-catalogo persa (presente in reference.md); Gate Protocol ancora in CLAUDE.md.
59
+ - **Dipendenze:** nessuna.
60
+
61
+ ### OPT-05 — Procedure on-demand (assessment-manager)
62
+ - **Criticità:** MEDIUM · **Sforzo:** Medio · **Rischio:** Basso
63
+ - **Obiettivo:** leggere ogni procedura nella fase in cui serve, non tutte all'avvio.
64
+ - **Scope:** in `assessment-manager.md`, spostare le istruzioni "read at startup" così che `token-estimation.md`/`pricing.md` si leggano in Phase 3-4, `assessment-findings-gate.md` in Phase 5, ecc.
65
+ - **Criteri di accettazione:** nessuna procedura letta prima della fase che la usa; il comportamento delle fasi resta invariato.
66
+ - **Dipendenze:** nessuna. (Se si fa OPT-09, `token-estimation.md` sparisce del tutto dal contesto LLM.)
67
+
68
+ ### OPT-06 — Procedure on-demand (project-manager)
69
+ - **Criticità:** MEDIUM · **Sforzo:** Medio · **Rischio:** Basso
70
+ - **Obiettivo:** stesso principio di OPT-05 applicato al `project-manager` (che legge ancora più procedure).
71
+ - **Scope:** riorganizzare `project-manager.md` per caricare ogni procedura alla fase pertinente (PR-procedure alla fase PR, ecc.).
72
+ - **Criteri di accettazione:** nessuna procedura caricata anticipatamente; pipeline invariata.
73
+ - **Dipendenze:** nessuna.
74
+
75
+ ### OPT-07 — Resource-budget testuale negli assessment agent
76
+ - **Criticità:** MEDIUM · **Sforzo:** Basso · **Rischio:** Basso
77
+ - **Obiettivo:** limiti di lettura/output come **istruzioni nel prompt** (NON frontmatter — `budget:` non è supportato dall'harness).
78
+ - **Scope:** aggiungere una sezione `## Resource budget` in prosa agli assessment agent (es. "Inspect at most ~25 files; ≤2 evidence snippets per finding; stop when evidence is sufficient — do not explore to increase coverage").
79
+ - **Criteri di accettazione:** la sezione è testo del prompt, non YAML; presente in `generic-software-assessment`, `layered-architecture-assessment`, `concurrency-safety-assessment`.
80
+ - **Dipendenze:** nessuna.
81
+
82
+ ### OPT-08 — Summary/full split negli output di assessment
83
+ - **Criticità:** HIGH · **Sforzo:** Alto · **Rischio:** Medio
84
+ - **Obiettivo:** l'orchestratore legge un **summary compatto**, non il documento intero. Il guadagno reale (non il formato JSON in sé).
85
+ - **Scope:** ogni assessment agent produce `{PREFIX}-{area}.full.md` (dettagli) + `{PREFIX}-{area}.summary` (conteggi per severità, finding IDs, path del full). `assessment-manager` e `intervention-documentation-standard` consumano il summary; il full si apre solo per i finding accettati.
86
+ - **Criteri di accettazione:** ogni agent scrive entrambi i file; il manager non legge i `.full` in Phase 3; l'int-doc apre i full solo per i finding selezionati.
87
+ - **Dipendenze:** OPT-07 (budget di output coerente).
88
+
89
+ ### OPT-09 — Estrarre calcolo deterministico da assessment-manager
90
+ - **Criticità:** HIGH · **Sforzo:** Alto · **Rischio:** Medio
91
+ - **Obiettivo:** togliere dal prompt ~3.500 parole di pseudo-codice (calcolo token/effort, registry write) che un LLM esegue in modo costoso e fragile.
92
+ - **Scope:** spostare Token-Estimate / Effort-Estimate / registry-write in uno script (`scripts/estimate.*`) invocato via Bash; il prompt dell'agent si riduce a "esegui lo script con questi input e verifica l'output".
93
+ - **Criteri di accettazione:** i tre file prodotti sono identici (per input noti) a prima; `assessment-manager.md` perde le sezioni di calcolo passo-passo; nessun errore aritmetico possibile lato LLM.
94
+ - **Dipendenze:** nessuna hard; sinergica con OPT-05.
95
+
96
+ ### OPT-10 — generic-software-assessment → ruolo triage
97
+ - **Criticità:** MEDIUM · **Sforzo:** Medio · **Rischio:** Medio
98
+ - **Obiettivo:** evitare che il generic duplichi il lavoro degli specialisti (layer, security, concurrency) sullo stesso codebase.
99
+ - **Scope:** trasformare `generic-software-assessment` in triage: scansione superficiale che decide quali specialisti attivare e copre solo le aree non coperte (Opzione A della gap analysis).
100
+ - **Criteri di accettazione:** il generic non riesamina aree già coperte da uno specialista attivo; l'output indica gli specialisti raccomandati.
101
+ - **Dipendenze:** meglio dopo OPT-08 (contratto di output stabile).
102
+
103
+ ### OPT-11 — Delegation policy negli orchestratori
104
+ - **Criticità:** LOW · **Sforzo:** Basso · **Rischio:** Basso
105
+ - **Obiettivo:** regola esplicita "delega un subagent solo se serve" (task indipendente/parallelo, output voluminoso, riuso multiplo); non delegare ciò che una grep/read risolve.
106
+ - **Scope:** aggiungere una sezione `## Delegation policy` a `assessment-manager` e `project-manager`.
107
+ - **Criteri di accettazione:** entrambi gli orchestratori contengono i criteri delega/non-delega.
108
+ - **Dipendenze:** nessuna.
109
+
110
+ ### OPT-12 — Hook di filtro output verboso (opzionale)
111
+ - **Criticità:** LOW · **Sforzo:** Basso · **Rischio:** Basso
112
+ - **Obiettivo:** filtrare output verbosi (build/test/log) prima che entrino nel contesto.
113
+ - **Scope:** `PreToolUse` su Bash in `settings.json` + script che riduce l'output di test/build alle sole righe rilevanti.
114
+ - **Criteri di accettazione:** l'hook appare in `/hooks`; un comando di test mostra solo failures.
115
+ - **Dipendenze:** nessuna. Fare solo se gli assessment inizieranno a lanciare build/test.
@@ -0,0 +1,274 @@
1
+ # Ottimizzazione dell'uso dei token — AI Toolkit
2
+
3
+ > Report di analisi. Data: 2026-07-23.
4
+ > Fonti: misurazioni sul repo + documentazione ufficiale Claude Code (`code.claude.com/docs/en/costs`).
5
+ > Stato: **solo raccomandazioni** — nessuna modifica applicata.
6
+
7
+ ## Come Claude Code fattura i token (il modello mentale corretto)
8
+
9
+ Il costo scala con la **dimensione del contesto processato a ogni turno**, non con
10
+ il numero di file nel toolkit. Tre meccanismi automatici mitigano già molto:
11
+
12
+ - **Prompt caching**: system prompt, CLAUDE.md e tool definitions ripetuti vengono
13
+ cachati (cache read costa ~1/10 di un input token). Vita cache: 1h su subscription,
14
+ 5 min su API/usage-credits.
15
+ - **Auto-compaction**: la history lunga viene riassunta vicino al limite di contesto.
16
+ - **Subagent isolati**: l'output verboso resta nel contesto del subagent, al main
17
+ loop torna solo un riassunto.
18
+
19
+ Conseguenza pratica: **le leve più grosse non sono "accorciare i prompt" ma
20
+ (a) non pagare due volte lo stesso contesto, (b) usare il modello giusto per ogni
21
+ agent, (c) tenere fuori dal contesto ciò che non serve al turno corrente.**
22
+
23
+ ---
24
+
25
+ ## Leva 1 — Deduplicare CLAUDE.md ⭐ impatto alto / sforzo minimo / rischio zero
26
+
27
+ ### Cosa ho misurato
28
+ - `CLAUDE.md` (progetto) e `~/.claude/CLAUDE.md` (globale) sono **byte-per-byte identici**
29
+ (verificato con `diff -q`).
30
+ - 169 righe / 1.257 parole ciascuno (~1.700 token).
31
+ - Entrambi vengono caricati in **ogni** sessione → ~3.400 token di contesto base,
32
+ di cui **metà è puro duplicato**.
33
+ - 55 delle 169 righe sono tabelle-catalogo (elenco skill/comandi/agent) — informazione
34
+ di *scoperta*, non *istruzione operativa*.
35
+
36
+ ### Raccomandazione
37
+ 1. **Il globale non deve duplicare il progetto.** `~/.claude/CLAUDE.md` dovrebbe
38
+ contenere solo preferenze cross-progetto (lingua, stile). Il catalogo del toolkit
39
+ vive già nel `CLAUDE.md` di progetto + `docs/reference.md`.
40
+ 2. **Spostare le tabelle-catalogo in `docs/reference.md`** (che già esiste ed è pensato
41
+ come cheatsheet). CLAUDE.md tiene solo: dipendenze, Gate Protocol, override
42
+ procedure. La doc ufficiale raccomanda **CLAUDE.md < 200 righe, solo essenziali**.
43
+ 3. Il Gate Protocol (regole MANDATORY sul PM) **resta** in CLAUDE.md: è un vincolo
44
+ operativo che deve essere sempre attivo.
45
+
46
+ ### Risparmio stimato
47
+ ~1.700 token di duplicato eliminati + ~600 token di catalogo spostato = **~2.300 token
48
+ risparmiati su ogni turno di ogni sessione**. Su sessioni lunghe (dove il contesto si
49
+ rimanda intero a ogni messaggio) è il risparmio con il miglior rapporto costo/beneficio.
50
+
51
+ ---
52
+
53
+ ## Leva 2 — Assegnare `model:` esplicito a ogni agent ⭐ impatto altissimo
54
+
55
+ ### Cosa ho misurato
56
+ Solo 7 agent su 22 hanno `model:` nel frontmatter (tutti `haiku`). Gli altri 15 —
57
+ **inclusi i due orchestratori `assessment-manager` e `project-manager`** — non lo
58
+ specificano e quindi ereditano il modello di sessione (spesso Opus).
59
+
60
+ ### Perché conta più di tutto il resto
61
+ Dal listino in `docs/pricing.md`:
62
+
63
+ | Modello | Blended $/1k token | Rapporto vs Haiku |
64
+ |---|---|---|
65
+ | Opus 4.8 | $0.009000 | **5×** |
66
+ | Sonnet 5 | $0.005400 | 3× |
67
+ | Haiku 4.5 | $0.001800 | 1× |
68
+
69
+ Un agent che gira su Opus invece che su Sonnet costa **~1,7× in più a parità di token**.
70
+ La doc ufficiale è esplicita: *"Reserve Opus for complex architectural decisions or
71
+ multi-step reasoning. For simple subagent tasks, specify `model: haiku`."*
72
+
73
+ ### Raccomandazione — mappatura per ruolo
74
+ | Ruolo | Modello suggerito | Motivo |
75
+ |---|---|---|
76
+ | Orchestratori (`assessment-manager`, `project-manager`) | **sonnet** | Coordinamento, non ragionamento profondo. La doc consiglia Sonnet per il coordinamento nei team. |
77
+ | Assessment read-only (già haiku) | haiku ✅ | Pattern-matching su codice |
78
+ | `generate-*`, `validate-*` (già haiku) | haiku ✅ | Trasformazione documentale |
79
+ | Developer (`developer-backend/frontend/testing`) | **sonnet** | Scrittura codice, buon compromesso |
80
+ | Refactoring (`god-class`, `domain-model`, `dependency-injection`) | **sonnet** | Modifiche strutturali con verifica build |
81
+ | `review-solution` | **opus** *(o sonnet)* | Unico punto dove il ragionamento profondo ripaga |
82
+ | `define-feature`, `init-agents-md` | sonnet | Interviste/analisi |
83
+
84
+ Regola: **default Sonnet, Haiku per il meccanico, Opus solo dove il giudizio architetturale ripaga.**
85
+
86
+ ### Risparmio stimato
87
+ Se gli orchestratori giravano su Opus, passarli a Sonnet è **~40% sul loro costo**.
88
+ Dato che `assessment-manager` è l'agent più pesante (~6.700 token di solo prompt +
89
+ ~3.000 di procedure lette a runtime), è il singolo intervento a maggior ritorno.
90
+
91
+ ---
92
+
93
+ ## Leva 3 — Estrarre la logica deterministica da `assessment-manager` ⭐ impatto alto / sforzo medio
94
+
95
+ ### Cosa ho misurato
96
+ `assessment-manager.md` = **5.052 parole (~6.700 token)**, il doppio del secondo agent.
97
+ Di queste, le sezioni righe **104–357** (calcolo Token/Effort Estimate) e **378–630**
98
+ (Data Contracts + Registry Write Algorithm) sono **~3.500 parole di pseudo-codice
99
+ deterministico**: somme, formule fisse, gestione errori I/O passo-passo, parsing tabelle.
100
+
101
+ ### Il problema
102
+ Far *eseguire a un LLM* aritmetica e I/O deterministici è:
103
+ - **costoso** — quelle 3.500 parole entrano nel contesto dell'agent a ogni run;
104
+ - **fragile** — il modello può sbagliare una somma o un formato;
105
+ - **ridondante** — è esattamente il lavoro che uno script fa a costo ~zero.
106
+
107
+ ### Raccomandazione
108
+ Spostare la logica meccanica fuori dal prompt in uno di questi modi (in ordine di preferenza):
109
+ 1. **Script esterno** (Python/Node) invocato via Bash: prende i `<usage>` block +
110
+ Interventions-Index e produce Token-Estimate.md / Effort-Estimate.md / registry.md.
111
+ Il prompt dell'agent si riduce a "esegui `scripts/estimate.py` con questi input".
112
+ 2. **Workflow script** (`Workflow` tool) se preferisci restare dentro Claude Code:
113
+ fan-out degli assessment + fasi di calcolo deterministico in JS.
114
+ 3. Se deve restare prosa, **comprimere** i Data Contract e la gestione errori in una
115
+ procedura referenziata (`docs/procedures/`) letta solo quando serve, non inline.
116
+
117
+ Il prompt di `assessment-manager` potrebbe scendere da ~6.700 a ~2.500 token.
118
+
119
+ ### Risparmio stimato
120
+ ~4.000 token di prompt in meno per ogni invocazione dell'assessment-manager, **più**
121
+ eliminazione del rischio di errori aritmetici (che oggi costano ri-esecuzioni).
122
+
123
+ ---
124
+
125
+ ## Leva 4 — Procedure lette on-demand invece che all'avvio ⭐ impatto medio
126
+
127
+ ### Cosa ho misurato
128
+ `assessment-manager` legge all'avvio 4 procedure + `pricing.md`:
129
+ `process-log` (144w) + `issues-register` (140w) + `assessment-findings-gate` (629w)
130
+ + `token-estimation` (1.283w) + `pricing` = **~2.900 parole (~3.900 token)** iniettate
131
+ nel contesto *prima* di iniziare. 7 agent hanno questo pattern "read these procedures".
132
+
133
+ ### Raccomandazione
134
+ - Leggere ogni procedura **nel momento in cui serve**, non tutte all'inizio.
135
+ Es. `token-estimation.md` serve solo in Phase 3/4, non in Phase 1.
136
+ - Se la Leva 3 estrae il calcolo token in uno script, `token-estimation.md` (1.283w,
137
+ la procedura più grossa) **non serve più nel contesto dell'LLM**.
138
+ - Valutare la compressione delle procedure più lunghe: `token-estimation.md` e
139
+ `approval-gates.md` contengono esempi ripetuti comprimibili.
140
+
141
+ ### Risparmio stimato
142
+ ~2.000 token per run dell'assessment-manager, cumulativo con la Leva 3.
143
+
144
+ ---
145
+
146
+ ## Leva 5 — Igiene di sessione (comportamentale, costo zero)
147
+
148
+ Dalla doc ufficiale, gli sprechi più comuni sono **sessioni mai pulite** e **modello
149
+ troppo grosso di default**:
150
+
151
+ - **`/clear` tra task non correlati.** Il contesto stantio si ri-invia a ogni messaggio.
152
+ Prima di pulire, `/rename` per ritrovare la sessione, poi `/resume`.
153
+ - **`/compact "focus su X"`** quando serve continuità ma il contesto è cresciuto.
154
+ - **`/context` e `/usage`** per vedere cosa occupa spazio; `/usage` segnala i
155
+ comportamenti che superano il 10% (long context, cache miss).
156
+ - **Cache miss**: la prima richiesta dopo >1h (subscription) ri-processa tutto il
157
+ contesto. Raggruppare il lavoro sul toolkit in finestre temporali serrate aiuta.
158
+ - **`/effort` più basso** per i task meccanici: i thinking token sono fatturati come
159
+ output. Per gli agent Haiku (assessment pattern-matching) l'effort alto raramente ripaga.
160
+
161
+ ---
162
+
163
+ ## Leva 6 — Hook di pre-processing per output verbosi ⭐ opzionale
164
+
165
+ Gli agent di assessment leggono molto codice. Un hook `PreToolUse` su Bash può
166
+ filtrare l'output dei comandi (es. solo righe `ERROR`/`FAIL`, o `grep` mirati) prima
167
+ che entri nel contesto — la doc mostra un esempio che riduce un log da decine di
168
+ migliaia a centinaia di token. Utile se in futuro gli assessment lanciano build/test.
169
+
170
+ ---
171
+
172
+ ## Riepilogo prioritizzato
173
+
174
+ | # | Leva | Impatto | Sforzo | Rischio | Risparmio stimato |
175
+ |---|---|---|---|---|---|
176
+ | 1 | Deduplicare CLAUDE.md globale/progetto | Alto | Minimo | Zero | ~2.300 tok / turno |
177
+ | 2 | `model:` esplicito su tutti gli agent | **Altissimo** | Basso | Basso | ~40% sugli orchestratori |
178
+ | 3 | Estrarre calcolo deterministico da assessment-manager | Alto | Medio | Medio | ~4.000 tok / run |
179
+ | 4 | Procedure on-demand | Medio | Medio | Basso | ~2.000 tok / run |
180
+ | 5 | Igiene di sessione (/clear, /compact, /effort) | Alto | Zero | Zero | variabile, cumulativo |
181
+ | 6 | Hook di filtro output | Medio | Basso | Basso | dipende dall'uso |
182
+
183
+ **Ordine consigliato di attacco:** 2 → 1 → 5 (tutti a basso sforzo e alto ritorno),
184
+ poi 3 → 4 (refactoring più impegnativo dell'assessment-manager), infine 6 se necessario.
185
+
186
+ ---
187
+
188
+ ## Riconciliazione con l'analisi ChatGPT del repo
189
+
190
+ ChatGPT ha analizzato il repo pubblico `dtlab-tech/ai-toolkit` e prodotto ~15
191
+ raccomandazioni. Ecco il giudizio critico su ciascuna, alla luce di **come funziona
192
+ realmente Claude Code** (non un framework generico) e di cosa ho verificato sul codice.
193
+
194
+ ### Convergenze — GPT ha ragione, e coincide con le mie leve
195
+
196
+ | Raccomandazione GPT | Mio giudizio | Nota |
197
+ |---|---|---|
198
+ | Modelli differenziati per ruolo (haiku/sonnet/opus) | ✅ **Valida, priorità #1** | = mia Leva 2. Allineata alla doc ufficiale. |
199
+ | Effort basso per task meccanici | ✅ Valida | Thinking token = output token. `/effort` o `MAX_THINKING_TOKENS`. |
200
+ | Summary + full split (orchestratore legge solo il summary) | ✅ **Valida, alto ROI** | La doc Anthropic lo raccomanda esplicitamente per i subagent. |
201
+ | Procedure caricate on-demand per fase | ✅ Valida | = mia Leva 4. |
202
+ | `/clear`, `/compact`, compact-instructions in CLAUDE.md | ✅ Valida | = mia Leva 5. Confermato dalla doc. |
203
+ | CLAUDE.md breve | ✅ **Valida** | = mia Leva 1 — ma GPT non poteva vedere il duplicato globale/progetto. |
204
+ | generic-assessment → triage (non duplicare gli specialisti) | ✅ Valida | Riduce sovrapposizione di scope. Buon punto. |
205
+ | Delegation policy (subagent solo se serve) | ✅ Valida | Allineata alla doc sui subagent. |
206
+ | Scope a livello di file, non solo di agente | 🟡 Utile | Vero che `--scope` seleziona agent, non file. Ma vedi caveat sotto. |
207
+
208
+ ### Caveat e correzioni — dove GPT ragiona da "framework tradizionale"
209
+
210
+ 1. **"Aggiungi `budget:` nel frontmatter dell'agent" — ❌ tecnicamente errato.**
211
+ Lo schema frontmatter degli agent Claude Code (`name`, `description`, `model`,
212
+ `tools`) **non ha un campo `budget:`**. Metterlo lì non fa nulla: non è *enforced*
213
+ dall'harness. Un `max_files: 25` in YAML è ignorato.
214
+ → *Correzione:* i limiti vanno espressi come **istruzioni testuali nel corpo del
215
+ prompt** ("Inspect at most ~25 files; stop when evidence is sufficient"). Sono
216
+ linee guida che il modello segue, non vincoli hard. Un budget di token *reale*
217
+ esiste solo dentro i **Workflow script** (`budget.total`), che è un altro meccanismo.
218
+
219
+ 2. **"Repository Scanner unico + `repository-index.json`" (P0 di GPT) — 🟡 valido come
220
+ principio, sopravvalutato nell'impatto.** GPT assume che ogni agent "riceva/riscansioni
221
+ l'intero repository". In realtà un subagent Claude Code parte con **contesto minimo**
222
+ e legge on-demand via Grep/Glob/Read: ricevere il *path* ≠ ricevere tutto il repo.
223
+ La duplicazione di lettura esiste (N agent che grep-ano gli stessi file), ma è meno
224
+ drammatica del quadro dipinto. Inoltre, su un toolkit *generico* che gira su codebase
225
+ arbitrarie, l'indice va **rigenerato a ogni run** (= una scansione comunque). Il
226
+ risparmio reale c'è **solo se molti agent condividono lo stesso indice** — va misurato,
227
+ non assunto. Buona idea per l'assessment parallelo; ROI da verificare.
228
+
229
+ 3. **"Output JSON compatti invece di Markdown" (P0 di GPT) — 🟡 il punto giusto è un
230
+ altro.** JSON non è intrinsecamente più economico del Markdown: virgolette, parentesi
231
+ e chiavi ripetute spesso lo rendono *più* verboso. Il guadagno vero non è "JSON vs MD"
232
+ ma **il summary/full split** (l'orchestratore legge il riassunto, non il documento
233
+ intero). Adottare lo split: sì. Farlo *perché* è JSON: irrilevante.
234
+
235
+ 4. **"Cache hash-based (commit_sha + agent_version + …)" (P1 di GPT) — 🟡 chiarire il
236
+ livello.** Questo è caching **applicativo** (evitare di *ri-eseguire* un agent se
237
+ l'input non è cambiato), NON il **prompt caching** di Claude (che riduce il costo
238
+ input a ogni turno ed è già automatico). Sono complementari. La cache hash-based è
239
+ utile ma va capito che agisce su un asse diverso dal costo per-turno.
240
+
241
+ 5. **"Skill progressive per Clean Code / Clean Architecture" (P1 di GPT) — 🟡 premessa
242
+ parz. sovrastimata.** GPT ipotizza "300 righe di regole Clean Code nei prompt".
243
+ Verificato: gli agent **non** contengono quel volume — `god-class-decomposition` e
244
+ `domain-model-refactoring` citano i concetti brevemente. L'idea di skill progressive
245
+ resta buona in generale, ma il risparmio su *questo* repo è minore di quanto stimato.
246
+
247
+ 6. **"agent-registry.json per evitare la discovery ripetuta" (P1) — 🟢 basso ROI.**
248
+ GPT stesso ammette che "il costo non è enorme". Micro-ottimizzazione: leggere i
249
+ frontmatter di ~22 file è economico. Farlo solo se si tocca comunque l'installer.
250
+
251
+ 7. **"Handbook di 120-150 pagine" — ⚠️ attenzione al paradosso token.** Un manuale
252
+ umano va benissimo *come documentazione*. Ma se lo si referenzia da CLAUDE.md o lo si
253
+ fa leggere agli agent, **aumenta** i token — l'opposto dell'obiettivo. Tenerlo come
254
+ riferimento per umani, mai in contesto automatico.
255
+
256
+ ### Suggerimenti "generici" (non da questa chat) che comunque NON valgono per Claude Code
257
+
258
+ - **"Abbassa `max_tokens` / `temperature`"** — non esposti nella CLI; la lunghezza
259
+ dell'output è guidata dal task.
260
+ - **"Manda meno messaggi"** — irrilevante: costa il *contesto per turno*, non il numero
261
+ di messaggi.
262
+ - **"Usa un modello piccolo per tutto"** — controproducente: un modello troppo debole
263
+ sbaglia e forza ri-esecuzioni. La regola è *modello adatto al task*.
264
+
265
+ ### Sintesi del giudizio
266
+
267
+ La base del toolkit è solida (GPT dà 6,5/10, ragionevole). Le raccomandazioni a **più
268
+ alto ritorno e più basso rischio**, su cui io e GPT convergiamo, sono:
269
+ **(1) modelli differenziati, (2) summary/full split, (3) procedure on-demand, (4) igiene
270
+ di sessione.** A queste aggiungo la **deduplicazione del CLAUDE.md globale/progetto**
271
+ (che GPT non poteva vedere). Le idee più "architetturali" di GPT (repository-scanner,
272
+ budget, cache hash-based) sono valide come *direzione* ma vanno (a) tradotte nei
273
+ meccanismi reali di Claude Code e (b) **misurate con `/usage` prima e dopo**, non
274
+ adottate sulla fiducia.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dtlabs/ai-toolkit",
3
- "version": "0.1.6",
3
+ "version": "0.2.0",
4
4
  "description": "AI Toolkit — reusable agents and procedures for developers to build AI-powered applications.",
5
5
  "files": [
6
6
  "docs/",