[
  {
    "id": "SKAUD-001",
    "title": "Documentare e testare l'esclusione delle skill repository-only dal catalogo runtime",
    "priority": "P3",
    "branch_scope": "BOTH",
    "target_files": ["docs/mcp-skills-agents-development-guide.md", "scripts/build-routing-catalog.mjs (solo commento header)"],
    "problem": "RIFORMULATO 2026-07-20 (v. 12-audit-corrections.md). L'assenza di mcp-runtime-integrator dal catalogo (builder scandisce solo skills/, riga 29) NON e' un bug: la guida viva:68 dichiara la skill 'repository-only ... non distribuibile nei runtime utente'. E' un confine distributivo intenzionale (skills/ = distribuibili e instradabili; .agents/skills/ = repository-only) che pero' non e' documentato come tale nel builder ne' testato contro distribuzioni accidentali.",
    "evidence": [{"path": "scripts/build-routing-catalog.mjs", "lines": "29", "summary": "skillsDir default = path.join(repoRoot, 'skills')"}, {"path": "docs/mcp-skills-agents-development-guide.md", "lines": "68", "summary": "'skill repository-only ... non distribuibile nei runtime utente'"}],
    "change_type": "VERSION",
    "proposed_change": "Documentare esplicitamente che il catalogo runtime include solo skills/ e che .agents/skills/ contiene skill repository-only; prevedere (task futuro) un test che impedisca la distribuzione accidentale delle skill repository-only; valutare un catalogo dev separato SOLO se emerge un caso d'uso concreto; NON aggiungere automaticamente .agents/skills/ al catalogo distribuito.",
    "acceptance_criteria": ["confine documentato in guida e header del builder", "esclusione dichiarata intenzionale", "nessun hint runtime verso skill non installate", "test futuro per il confine distributivo tracciato", "eventuale catalogo dev distinto da quello utente"],
    "tests": ["nessuno in questo task (doc); test del confine in task futuro"],
    "regression_risks": ["nessuno (documentale)"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-002",
    "title": "Aggiungere sezione routing/anti-trigger a mcp-database-expert",
    "priority": "P1",
    "branch_scope": "BOTH",
    "target_files": ["skills/mcp-database-expert/SKILL.md"],
    "problem": "Unica specialist senza rimandi a mcp-technical-analyst/mcp-master-orchestrator: indagini dati miste non hanno confine dichiarato.",
    "evidence": [{"path": "skills/mcp-database-expert/SKILL.md", "lines": "1-36", "summary": "nessuna occorrenza di analyst/orchestrator nel file"}],
    "change_type": "MAKE_CONDITIONAL",
    "proposed_change": "Aggiungere sezione 'Quick routing' sul modello di mcp-code-reviewer:14 (multi-sorgente -> analyst; multi-fase -> orchestrator).",
    "acceptance_criteria": ["sezione presente con 2 rimandi espliciti", "nessun altro contenuto modificato"],
    "tests": ["npm run test:routing"],
    "regression_risks": ["minimo"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-003",
    "title": "Cablare routing.ambiguity e candidateScores nella telemetria [fase: post-merge, pre-shadow]",
    "priority": "P1",
    "branch_scope": "BRANCH_ONLY",
    "target_files": ["scripts/hooks/sophia-user-prompt-submit.mjs", "scripts/hooks/analytics-hook-log-utils.mjs", "tests/routing-hooks.test.mjs"],
    "problem": "Il branch calcola ambiguity e candidateScores ma il payload analytics e' invariato da master. NON e' un requisito pre-merge (gate disabilitato, resolver non cablato): e' il prerequisito della fase shadow - senza, la shadow mode non produce dati e le soglie non sono tarabili.",
    "evidence": [{"path": "scripts/hooks/sophia-user-prompt-submit.mjs", "lines": "996-1004,1072-1080", "summary": "ambiguity attaccata a routing.ambiguity ma mai passata al log"}],
    "change_type": "REFACTOR_ROUTING",
    "proposed_change": "Aggiungere al payload UserPromptSubmit i campi ambiguity{ambiguous,reasons} e un riassunto compatto dei top-3 candidateScores (id, rawScore, rank). Nessun testo prompt aggiuntivo nel log.",
    "acceptance_criteria": ["evento JSONL contiene i nuovi campi", "nessun contenuto prompt/dato sensibile aggiunto", "test aggiornato che asserta la presenza dei campi"],
    "tests": ["npm run test:routing:unit", "npm run test:routing:smoke"],
    "regression_risks": ["dimensione evento; compatibilita' scanner analytics-node (verificare parser)"],
    "dependencies": ["merge del branch"],
    "implementation_complexity": "S",
    "implementation_model": "INTERMEDIATE",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-004",
    "title": "Dichiarare il policy resolver come scaffolding non cablato [fase: pre-merge]",
    "priority": "P1",
    "branch_scope": "BRANCH_ONLY",
    "target_files": ["scripts/hooks/routing-policy-resolver.mjs", "docs/mcp-skills-agents-development-guide.md"],
    "problem": "resolveRoutingPolicy non e' mai importato dal hook live; senza dichiarazione esplicita un futuro manutentore puo' crederlo attivo o cancellarlo come dead code. Costo XS: farlo prima del merge evita fraintendimenti in review.",
    "evidence": [{"path": "docs/audit/skill-model-capability-audit-2026-07/hooks-routing-llm-diff.raw.json", "lines": "pipeline merge/override", "summary": "mai importato da sophia-user-prompt-submit.mjs"}],
    "change_type": "VERSION",
    "proposed_change": "Header comment nel modulo ('WP5 scaffolding, non cablato: attivazione prevista con il client evaluator') + 5 righe nella guida viva con roadmap fasi (off->shadow->boost-only).",
    "acceptance_criteria": ["commento presente", "guida aggiornata"],
    "tests": ["nessuno (doc only)"],
    "regression_risks": ["nessuno"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-005",
    "title": "Riallineare lo schema evals di mcp-mantis-test-writer",
    "priority": "P1",
    "branch_scope": "BOTH",
    "target_files": ["skills/mcp-mantis-test-writer/evals/evals.json"],
    "problem": "Schema divergente ({version:1,cases,expect}) dal formato comune: un reader generico legge 0 casi silenziosamente (riprodotto).",
    "evidence": [{"path": "skills/mcp-mantis-test-writer/evals/evals.json", "lines": "1-60", "summary": "unico file su 21 con schema diverso"}],
    "change_type": "ADD_EVAL",
    "proposed_change": "Convertire i 5 casi allo schema comune preservando i contenuti.",
    "acceptance_criteria": ["skill_name/eval_focus/evals presenti", "5 casi preservati", "node scripts/check-skill-evals-json.js verde"],
    "tests": ["node scripts/check-skill-evals-json.js"],
    "regression_risks": ["nessuno (file documentale)"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-006",
    "title": "Wire di check-skill-evals-json.js in npm test con validazione schema",
    "priority": "P1",
    "branch_scope": "BOTH",
    "target_files": ["package.json", "scripts/check-skill-evals-json.js"],
    "problem": "La validazione degli evals.json e' solo step manuale di checklist PR: il drift di schema e' entrato inosservato (SKAUD-005 lo dimostra).",
    "evidence": [{"path": "docs/audit/skill-model-capability-audit-2026-07/eval-inventory.raw.json", "lines": "_ci_note", "summary": "script non referenziato da npm/CI"}],
    "change_type": "ADD_EVAL",
    "proposed_change": "Script npm 'test:skill-evals' incluso in 'npm test'; estendere il check alla shape comune (skill_name/evals[] presenti), non solo JSON.parse.",
    "acceptance_criteria": ["npm test fallisce su evals.json malformato o fuori schema", "CI verde dopo SKAUD-005"],
    "tests": ["npm test"],
    "regression_risks": ["CI rossa finche' SKAUD-005 non e' mergiato: sequenziare"],
    "dependencies": ["SKAUD-005"],
    "implementation_complexity": "S",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-007",
    "title": "Sincronizzare la matrice decisionale dell'orchestrator con l'inventario",
    "priority": "P2",
    "branch_scope": "BOTH",
    "target_files": ["skills/mcp-master-orchestrator/SKILL.md"],
    "problem": "La matrice (righe 12-30) omette 8 skill esistenti che dichiarano escalation verso l'orchestrator: puntatori one-way.",
    "evidence": [{"path": "skills/mcp-master-orchestrator/SKILL.md", "lines": "12-30", "summary": "nessuna riga per code-reviewer, mantis writers, handoff-pack, analytics-operator, skill-miner, grid/perf debugger"}],
    "change_type": "REFACTOR_ROUTING",
    "proposed_change": "Aggiungere le 8 righe mancanti (o una riga cumulativa con criterio esplicito per le skill fuori matrice).",
    "acceptance_criteria": ["ogni skill che dichiara escalation verso l'orchestrator ha una riga corrispondente", "npm run test:routing verde"],
    "tests": ["npm run test:routing"],
    "regression_risks": ["allungamento SKILL.md: righe sintetiche"],
    "dependencies": [],
    "implementation_complexity": "S",
    "implementation_model": "INTERMEDIATE",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-008",
    "title": "Deprecare la Minimal skill map di GLOBAL.md",
    "priority": "P2",
    "branch_scope": "BOTH",
    "target_files": ["shared-agent-rules/GLOBAL.md"],
    "problem": "Terza lista di routing (11 voci vs 21 skill), stale e manutenuta indipendentemente.",
    "evidence": [{"path": "shared-agent-rules/GLOBAL.md", "lines": "43-55", "summary": "lista non aggiornata con le skill recenti"}],
    "change_type": "DEPRECATE",
    "proposed_change": "Sostituire la lista con rimando ad AGENTS.md par.2 e alla matrice orchestrator.",
    "acceptance_criteria": ["nessuna lista skill duplicata in GLOBAL.md", "rimandi presenti"],
    "tests": ["nessuno (doc)"],
    "regression_risks": ["client esterni che usano solo GLOBAL.md: il rimando deve essere autosufficiente"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "MEDIUM"
  },
  {
    "id": "SKAUD-009",
    "title": "Unificare il wording ProjectFS-first su fonte unica",
    "priority": "P2",
    "branch_scope": "BOTH",
    "target_files": ["shared-agent-rules/AGENTS.md", "shared-agent-rules/GLOBAL.md", "shared-agent-rules/SUBAGENTS.md", "scripts/hooks/sophia-pretool-projectfs.mjs", "scripts/hooks/sophia-user-prompt-submit.mjs"],
    "problem": "5 formulazioni indipendenti della stessa regola, 2 eseguibili e divergenti tra loro.",
    "evidence": [{"path": "docs/audit/skill-model-capability-audit-2026-07/instruction-supply-chain.raw.json", "lines": "multi_owner_policies[1]", "summary": "PROJECTFS_HINT vs hint del pretool con wording diverso"}],
    "change_type": "MOVE_TO_REFERENCE",
    "proposed_change": "Testo canonico in modulo condiviso (es. scripts/hooks/guardrail-texts.mjs) importato da entrambi i hook; nei markdown 1 formulazione estesa (GLOBAL.md) + rimandi.",
    "acceptance_criteria": ["stessa stringa emessa da entrambi i hook", "1 sola formulazione estesa nei markdown", "smoke hooks verdi"],
    "tests": ["npm run test:routing:smoke", "npm run test:routing:unit"],
    "regression_risks": ["fixtures che assertano il vecchio wording: aggiornare"],
    "dependencies": [],
    "implementation_complexity": "S",
    "implementation_model": "INTERMEDIATE",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-010",
    "title": "Parametrizzare il path hardcoded negli eval ai-documents-validation",
    "priority": "P2",
    "branch_scope": "BOTH",
    "target_files": ["skills/ai-documents-validation-document-type/evals/evals.json"],
    "problem": "Eval id 1 hardcoda E:\\ai-documents-validation (environment-bound).",
    "evidence": [{"path": "skills/ai-documents-validation-document-type/evals/evals.json", "lines": "12", "summary": "path assoluto macchina-specifico"}],
    "change_type": "VERSION",
    "proposed_change": "Placeholder <project_root> documentato nel case, o campo environment con path d'esempio marcato come tale.",
    "acceptance_criteria": ["nessun path assoluto E:\\ nel file"],
    "tests": ["node scripts/check-skill-evals-json.js"],
    "regression_risks": ["nessuno"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-011",
    "title": "Metadata di freshness per la policy export svg negli eval",
    "priority": "P3",
    "branch_scope": "BOTH",
    "target_files": ["skills/svg/evals/evals.json"],
    "problem": "Eval 11/15 hardcodano policy tool Windows senza fonte/data/criterio di revisione; eval 16 hardcoda un path tool.",
    "evidence": [{"path": "skills/svg/evals/evals.json", "lines": "132-183,192", "summary": "policy tool-availability e path hardcoded"}],
    "change_type": "VERSION",
    "proposed_change": "Campo note con fonte (references/), data e criterio di revisione sui 3 casi.",
    "acceptance_criteria": ["3 casi con note di freshness", "JSON valido"],
    "tests": ["node scripts/check-skill-evals-json.js"],
    "regression_risks": ["nessuno"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "MEDIUM"
  },
  {
    "id": "SKAUD-012",
    "title": "Riconciliare eval_focus e casi di mcp-grid-ui-debugger",
    "priority": "P3",
    "branch_scope": "BOTH",
    "target_files": ["skills/mcp-grid-ui-debugger/evals/evals.json"],
    "problem": "7 tag eval_focus per 5 casi: aree dichiarate ma non coperte.",
    "evidence": [{"path": "skills/mcp-grid-ui-debugger/evals/evals.json", "lines": "eval_focus", "summary": "mismatch 7 focus vs 5 casi"}],
    "change_type": "ADD_EVAL",
    "proposed_change": "2 casi per i focus scoperti o rimozione dei tag non coperti.",
    "acceptance_criteria": ["ogni focus ha almeno 1 caso"],
    "tests": ["node scripts/check-skill-evals-json.js"],
    "regression_risks": ["nessuno"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-013",
    "title": "Eval schema v2 + runner eseguibile (prerequisito per outcome eval)",
    "priority": "P1",
    "branch_scope": "BOTH",
    "target_files": ["docs/mcp-skills-agents-development-guide.md", "scripts/run-skill-evals.mjs (nuovo)", "scripts/check-skill-evals-json.js"],
    "problem": "RIFORMULATO (v. 12-audit-corrections.md): 15 file eval hanno outcome DICHIARATO (fixture documentali) ma 0 outcome ESEGUITO e verificato. Aggiungere casi senza runner aumenterebbe solo la documentazione. Serve prima l'infrastruttura.",
    "evidence": [{"path": "docs/audit/skill-model-capability-audit-2026-07/11-evidence-index.csv", "lines": "F-048", "summary": "outcome dichiarato vs eseguito: 15 vs 0"}],
    "change_type": "ADD_EVAL",
    "proposed_change": "(a) Schema v2 retro-compatibile: schema_version:2 + success_criteria[] machine-checkable ({id, check:{type:'deterministic'|'llm-judge', script|judge_prompt}}); i file v1 restano validi. (b) Runner scripts/run-skill-evals.mjs: esegue i casi v2 contro un modello configurabile (id/temperatura da CLI), valuta i criteri, emette pass/fail JSONL. (c) BLIND JUDGING obbligatorio: per i criteri valutati via LLM judge il runner usa un payload blind con identificatore anonimo - il judge riceve soltanto prompt, input necessari, output, success criteria e safety criteria; NON riceve modello, variante, skill caricata, stato del routing, token, latenza, tool call o altri metadata della run; i metadata vengono ricongiunti solo dopo il giudizio. Il protocollo blind si applica sia a questo runner sia al successivo harness ablation (SKAUD-014) che ne riusa judge e rubriche. (d) Documentare schema e protocollo nella guida viva. NON aggiungere nuovi casi in questo task.",
    "acceptance_criteria": ["schema v2 documentato", "runner esegue almeno 1 caso v2 di esempio end-to-end", "file v1 ancora validi per check-skill-evals-json", "payload del judge privo di modello, variante, skill caricata, stato routing e metriche di costo", "output presentati al judge con identificatori anonimi e non sequenziali", "metadata della run ricongiunti solo dopo il completamento del giudizio", "test che fallisce se il payload del judge contiene campi vietati"],
    "tests": ["node scripts/check-skill-evals-json.js", "run del runner su caso di esempio", "test unitario del payload blind del judge"],
    "regression_risks": ["nessuno (additivo)"],
    "dependencies": ["SKAUD-006"],
    "implementation_complexity": "M",
    "implementation_model": "INTERMEDIATE",
    "review_model": "FABLE_REQUIRED",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-014",
    "title": "Harness ablation secondo la specifica implementativa di 08",
    "priority": "P1",
    "branch_scope": "BOTH",
    "target_files": ["fixtures/ablation/ (nuova dir)", "docs/audit/skill-model-capability-audit-2026-07/ablation-results/ (nuova dir)"],
    "problem": "Le classificazioni MODEL_COMPENSATION non sono decidibili senza dati comparativi. Specifica completa (directory, schemi fixture/run-result, rubriche, metriche, 3 ripetizioni, criterio gerarchico sulle varianti A/B/C/D/E1/E2, separazione routing/gate/execution failure) in 08-ablation-test-plan.md sezione 'Specifica implementativa'.",
    "evidence": [{"path": "docs/audit/skill-model-capability-audit-2026-07/08-ablation-test-plan.md", "lines": "Specifica implementativa", "summary": "spec eseguibile definita"}],
    "change_type": "ADD_EVAL",
    "proposed_change": "Implementare harness + fixtures per ABL-02/09/10/13 secondo la spec AGGIORNATA 2026-07-20: varianti A/B/C/D/E1/E2 (skill e routing isolati: B/C senza hook, D con router master, E1 gate shadow con sole metriche di gate, E2 boost simulato), judge BLIND (identificatori anonimi, nessun metadata di variante/modello/costo prima del giudizio), variante C generata da trasformazione versionata riproducibile; 3 ripetizioni x 2 modelli; runs.jsonl e summary.md in ablation-results/.",
    "acceptance_criteria": ["4 test eseguiti secondo spec con varianti A/B/C/D/E1/E2", "judge blind verificabile (nessun campo variante/modello nel payload del judge)", "confronti riportati per coppie canoniche (B-A, C-B, D-B, E1-D solo gate, E2-D)", "runs.jsonl conforme allo schema run-result", "summary.md con distinzione routing/execution failure"],
    "tests": ["il deliverable stesso"],
    "regression_risks": ["nessuno (read-only sul repo)"],
    "dependencies": ["SKAUD-013 (riuso di judge/criteri consigliato)"],
    "implementation_complexity": "L",
    "implementation_model": "INTERMEDIATE",
    "review_model": "FABLE_REQUIRED",
    "confidence": "MEDIUM"
  },
  {
    "id": "SKAUD-015",
    "title": "Criterio pass/fail docs-node vs memory-node",
    "priority": "P2",
    "branch_scope": "BOTH",
    "target_files": ["skills/mcp-docs-navigator/SKILL.md", "skills/mcp-memory-operator/SKILL.md"],
    "problem": "Confine 'docs ufficiali vs memoria operativa' qualitativo: 'salva questa conoscenza' ambiguo per qualunque modello.",
    "evidence": [{"path": "docs/audit/skill-model-capability-audit-2026-07/instruction-conflicts.raw.json", "lines": "trigger_overlaps[3]", "summary": "disambiguated_by_anti_trigger: false"}],
    "change_type": "MAKE_CONDITIONAL",
    "proposed_change": "Stesso criterio pass/fail nei 2 file (riusabile/ufficiale -> docs; contestuale/workaround -> memory) con 2 esempi.",
    "acceptance_criteria": ["criterio identico nei 2 file", "1 esempio positivo e 1 negativo ciascuno"],
    "tests": ["npm run test:routing"],
    "regression_risks": ["wording da tenere sincronizzato"],
    "dependencies": [],
    "implementation_complexity": "S",
    "implementation_model": "INTERMEDIATE",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-016",
    "title": "Dichiarare la dipendenza dalla fase nella regola docs-node CFML",
    "priority": "P2",
    "branch_scope": "BOTH",
    "target_files": ["skills/mcp-code-reviewer/SKILL.md", "skills/mcp-coldfusion-developer/SKILL.md"],
    "problem": "'must attempt if available' (review) vs 'verifica opzionale' (dev) sulla stessa risorsa senza spiegazione.",
    "evidence": [{"path": "skills/mcp-code-reviewer/SKILL.md", "lines": "117", "summary": "vs mcp-coldfusion-developer/SKILL.md:67"}],
    "change_type": "MAKE_CONDITIONAL",
    "proposed_change": "1 riga in entrambe: dev = opzionale local-first; review = lookup dovuto prima di dichiarare assenza di regole.",
    "acceptance_criteria": ["motivazione presente in entrambe le skill"],
    "tests": ["nessuno (doc)"],
    "regression_risks": ["nessuno"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-017",
    "title": "Error code stabili per git-node e sql-node",
    "priority": "P2",
    "branch_scope": "BOTH",
    "target_files": ["git-node/index.js", "sql-node/index.js"],
    "problem": "Errori free-text senza codice macchina; le skill compensano con euristiche interpretative. memory-node/analytics-node mostrano il pattern corretto.",
    "evidence": [{"path": "git-node/index.js", "lines": "187-197", "summary": "makeErrorResult senza code"}, {"path": "sql-node/index.js", "lines": "248-271", "summary": "BLOCKED e catch-all senza code"}],
    "change_type": "MOVE_TO_TOOL_SCHEMA",
    "proposed_change": "Campo code stabile additivo (READONLY_VIOLATION, ENV_NOT_FOUND, INVALID_RANGE...) nel result di errore; testo legacy invariato. Note interpretative nelle skill aggiornate in PR successiva.",
    "acceptance_criteria": ["errori principali con code", "smoke test dei 2 server verdi", "content legacy invariato"],
    "tests": ["npm run test:git", "node tests/smoke/sql-node.smoke.mjs"],
    "regression_risks": ["client severi su structuredContent: campo additivo, verificare con smoke"],
    "dependencies": [],
    "implementation_complexity": "M",
    "implementation_model": "INTERMEDIATE",
    "review_model": "FABLE_REQUIRED",
    "confidence": "MEDIUM"
  },
  {
    "id": "SKAUD-018",
    "title": "Documentare e annotare cf_bridge come tool complessivamente non read-only",
    "priority": "P2",
    "branch_scope": "BOTH",
    "target_files": ["cf-node/index.js"],
    "problem": "RIFORMULATO 2026-07-20: le annotation MCP descrivono il TOOL nel suo complesso, non il singolo valore del parametro action - non e' possibile dichiarare destructiveHint su evaluate e readOnlyHint su logs_* contemporaneamente sullo stesso tool. Il contratto attuale non dichiara nulla e la description non distingue le 3 azioni ne' segnala il rischio di evaluate. NOTA: esiste gia' una denylist server-side (mcp_agent.cfm:134-139), incompleta - le annotation non sono enforcement.",
    "evidence": [{"path": "cf-node/index.js", "lines": "46-72", "summary": "nessuna annotation; description generica"}, {"path": "cf-node/mcp_tool/mcp_agent.cfm", "lines": "134-139", "summary": "denylist deterministica esistente (9 pattern), non una sandbox"}],
    "change_type": "MOVE_TO_TOOL_SCHEMA",
    "proposed_change": "Migliorare la description del tool distinguendo chiaramente le 3 azioni; dichiarare che evaluate esegue codice CFML ed e' operazione ad alto rischio; applicare al TOOL COMPLESSIVO annotation conservative compatibili con la versione MCP SDK installata (verificare la compatibilita' prima di implementare); NON dichiarare readOnlyHint:true sul tool complessivo; NON affermare che le annotation costituiscano enforcement. Nessun cambio comportamentale; denylist server-side mantenuta.",
    "acceptance_criteria": ["description per azione chiara", "nessuna falsa promessa di read-only", "annotation riferite al tool complessivo", "nessun cambiamento comportamentale", "denylist server-side esistente mantenuta", "smoke test previsto nel task implementativo"],
    "tests": ["node tests/smoke/cf-node.smoke.mjs"],
    "regression_risks": ["client severi sulle annotations: verifica compatibilita' SDK prima dell'implementazione"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-019",
    "title": "Decidere sul cambio test-affected per package.json [fase: pre-merge]",
    "priority": "P1",
    "branch_scope": "INTRODUCED_BY_BRANCH",
    "target_files": ["scripts/test-affected.mjs", "tests/test-affected.test.mjs"],
    "problem": "Il branch rimuove package.json dai file transversal: cambio di policy CI non correlato al tema del branch, attivo dal giorno del merge.",
    "evidence": [{"path": "docs/audit/skill-model-capability-audit-2026-07/hooks-routing-llm-diff.raw.json", "lines": "files[17]", "summary": "package.json rimosso da ROOT_TRANSVERSAL_FILES"}],
    "change_type": "REMOVE_CANDIDATE",
    "proposed_change": "Prima del merge: revert del cambio dentro il branch (riproposto in PR dedicata) oppure motivazione esplicita nel PR body con i limiti della nuova policy.",
    "acceptance_criteria": ["decisione documentata", "test allineati alla decisione"],
    "tests": ["npm run test:affected:unit"],
    "regression_risks": ["edit a dipendenze senza full test se si mantiene la rimozione"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "FABLE_REQUIRED",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-020",
    "title": "Version e governance per mcp-availability.json [fase: post-merge, pre-shadow]",
    "priority": "P3",
    "branch_scope": "BRANCH_ONLY",
    "target_files": ["docs/mcp-runtime-upgrade-governance.md", "scripts/runtime/state-manager.js"],
    "problem": "Nuovo stato persistente in home scritto a ogni save senza versioning dichiarato (guardrail AGENTS.md par.3).",
    "evidence": [{"path": "docs/audit/skill-model-capability-audit-2026-07/hooks-routing-llm-diff.raw.json", "lines": "merge_risks[3]", "summary": "saveMcpAvailabilityManifest scrive ~/.mcp-servers/mcp-availability.json"}],
    "change_type": "VERSION",
    "proposed_change": "Campo version nel manifest + 5 righe di governance (rigenerabilita', comportamento se corrotto/assente).",
    "acceptance_criteria": ["manifest con version", "doc aggiornata", "test-user-runtime verde"],
    "tests": ["npm run test:runtime"],
    "regression_risks": ["minimo (file rigenerabile)"],
    "dependencies": ["merge del branch"],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-021",
    "title": "Sinergie reciproche analytics-operator <-> skill-miner / runtime-integrator",
    "priority": "P3",
    "branch_scope": "BOTH",
    "target_files": ["skills/mcp-analytics-operator/SKILL.md"],
    "problem": "Puntamenti mono-direzionali: analytics-operator non rimanda a skill-miner (mining) ne' a runtime-integrator (sorgente strutturalmente assente = bug).",
    "evidence": [{"path": "docs/audit/skill-model-capability-audit-2026-07/instruction-conflicts.raw.json", "lines": "anti_trigger_gaps[3-4]", "summary": "sinergie senza voce reciproca"}],
    "change_type": "MAKE_CONDITIONAL",
    "proposed_change": "2 voci nella sezione Sinergie/Troubleshooting di analytics-operator.",
    "acceptance_criteria": ["2 rimandi presenti"],
    "tests": ["npm run test:routing"],
    "regression_risks": ["nessuno"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-022",
    "title": "Riconciliare le regole runtime-integrator tra guida viva e SKILL.md",
    "priority": "P3",
    "branch_scope": "BOTH",
    "target_files": [".agents/skills/mcp-runtime-integrator/SKILL.md", "docs/mcp-skills-agents-development-guide.md"],
    "problem": "2 regole operative esistono solo nella guida (righe 78-79) e non nella SKILL.md autoritativa.",
    "evidence": [{"path": "docs/mcp-skills-agents-development-guide.md", "lines": "78-79", "summary": "vs SKILL.md:36-45 senza le 2 regole"}],
    "change_type": "MOVE_TO_REFERENCE",
    "proposed_change": "Portare le 2 regole nella SKILL.md; nella guida solo rimando (o rimozione motivata se superate).",
    "acceptance_criteria": ["fonte unica dichiarata", "nessuna regola presente solo nella guida"],
    "tests": ["nessuno (doc)"],
    "regression_risks": ["nessuno"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-023",
    "title": "Consolidare la curatela dei dati di routing (DOMAIN_KEYWORDS/SKILL_HINTS)",
    "priority": "P2",
    "branch_scope": "CHANGED_BY_BRANCH",
    "target_files": ["scripts/hooks/sophia-user-prompt-submit.mjs", "scripts/build-routing-catalog.mjs", "scripts/hooks/routing-semantic-overrides.json"],
    "problem": "Tabelle keyword/hint hand-curated nel hook duplicano e sovrastano (+3 vs +1) i dati del catalogo: 4 fonti che driftano. I semantic overrides del branch sono la sede naturale.",
    "evidence": [{"path": "docs/audit/skill-model-capability-audit-2026-07/instruction-supply-chain.raw.json", "lines": "multi_owner_policies[2]", "summary": "4 livelli indipendenti per la stessa mappa"}],
    "change_type": "REFACTOR_ROUTING",
    "proposed_change": "Post-merge: migrare progressivamente DOMAIN_KEYWORDS/SKILL_HINTS in routing-semantic-overrides.json (campi curatedKeywords/hintText), generarli nel catalogo, ridurre le tabelle nel hook a fallback. Una skill per PR con confronto fixture prima/dopo.",
    "acceptance_criteria": ["output hint invariato sui fixtures per le skill migrate", "una fonte dichiarata per skill"],
    "tests": ["npm run test:routing (tutti)"],
    "regression_risks": ["cambi di scoring involontari: confronto fixture-per-fixture"],
    "dependencies": ["merge branch"],
    "implementation_complexity": "L",
    "implementation_model": "INTERMEDIATE",
    "review_model": "FABLE_REQUIRED",
    "confidence": "MEDIUM"
  },
  {
    "id": "SKAUD-024",
    "title": "Unificare la regola rebuild/reload-before-verified",
    "priority": "P3",
    "branch_scope": "BOTH",
    "target_files": ["skills/mcp-grid-ui-debugger/SKILL.md", "skills/mcp-frontend-performance-debugger/SKILL.md"],
    "problem": "Stessa regola INVARIANT con wording indipendente nei 2 file (drift osservabile).",
    "evidence": [{"path": "docs/audit/skill-model-capability-audit-2026-07/instruction-conflicts.raw.json", "lines": "repeated_procedures[6]", "summary": "grid:32-34 vs perf:100-102"}],
    "change_type": "MOVE_TO_REFERENCE",
    "proposed_change": "Allineare il wording (identico) nei 2 file.",
    "acceptance_criteria": ["testo identico nei 2 file"],
    "tests": ["npm run test:routing"],
    "regression_risks": ["nessuno"],
    "dependencies": [],
    "implementation_complexity": "XS",
    "implementation_model": "ECONOMIC",
    "review_model": "INTERMEDIATE",
    "confidence": "HIGH"
  },
  {
    "id": "SKAUD-025",
    "title": "Migrare i casi outcome dichiarato a schema v2 verificabile (orchestrator, analyst, code-reviewer)",
    "priority": "P2",
    "branch_scope": "BOTH",
    "target_files": ["skills/mcp-master-orchestrator/evals/evals.json", "skills/mcp-technical-analyst/evals/evals.json", "skills/mcp-code-reviewer/evals/evals.json"],
    "problem": "NUOVO (scorporato da SKAUD-013): i casi outcome esistenti sono solo dichiarati; vanno migrati al formato v2 con success_criteria machine-checkable e fixture di input, cosi' che il runner li esegua.",
    "evidence": [{"path": "docs/audit/skill-model-capability-audit-2026-07/11-evidence-index.csv", "lines": "F-048", "summary": "0 outcome eseguiti su 15 dichiarati"}],
    "change_type": "ADD_EVAL",
    "proposed_change": "Per ciascuna delle 3 skill: migrare 3 casi outcome a schema_version:2 con criteri verificabili e input sintetici (discrepanze/bug piantati); eseguirli col runner di SKAUD-013.",
    "acceptance_criteria": ["9 casi v2 eseguiti end-to-end dal runner con esito registrato", "file retro-compatibili"],
    "tests": ["scripts/run-skill-evals.mjs sulle 3 skill"],
    "regression_risks": ["nessuno (additivo)"],
    "dependencies": ["SKAUD-013"],
    "implementation_complexity": "M",
    "implementation_model": "INTERMEDIATE",
    "review_model": "FABLE_REQUIRED",
    "confidence": "MEDIUM"
  },
  {
    "id": "SKAUD-026",
    "title": "Evoluzione cf_bridge: security review della denylist e valutazione separazione in tool distinti",
    "priority": "P3",
    "branch_scope": "BOTH",
    "target_files": ["cf-node/index.js", "cf-node/mcp_tool/mcp_agent.cfm"],
    "problem": "AGGIORNATO 2026-07-20: evaluate ha GIA' un enforcement server-side parziale (denylist mcp_agent.cfm:134-139: cfhttp/cfquery/cfexecute/cfregistry/cffile/cfdirectory/cfmail/createObject(/invoke(), ma non e' una sandbox: pattern-matching testuale, funzioni script equivalenti non elencate (es. queryExecute(, fileWrite(), bypass per composizione dinamica e side effect indiretti via Evaluate. Inoltre il mega-tool a 3 azioni impedisce annotation per-azione corrette (v. SKAUD-018).",
    "evidence": [{"path": "cf-node/mcp_tool/mcp_agent.cfm", "lines": "134-139", "summary": "denylist esistente ma incompleta"}, {"path": "skills/mcp-coldfusion-developer/SKILL.md", "lines": "64", "summary": "guardrail skill = difesa in profondita' complementare"}],
    "change_type": "MOVE_TO_TOOL_SCHEMA",
    "proposed_change": "(a) Security review della denylist esistente: coprire equivalenti script dei tag bloccati, valutare allowlist vs denylist, testare bypass noti. (b) VALUTARE (non prescrivere: richiede analisi di compatibilita' client) la separazione in tool distinti cf_evaluate / cf_logs_list / cf_logs_read con annotation per-tool corrette, mantenendo temporaneamente cf_bridge come alias legacy o adapter compatibile.",
    "acceptance_criteria": ["review della denylist documentata con esiti dei tentativi di bypass", "decisione motivata sulla separazione tool previa analisi compatibilita' client", "se separazione implementata: cf_bridge legacy funzionante per finestra transitoria", "comportamento legacy preservato di default"],
    "tests": ["node tests/smoke/cf-node.smoke.mjs + probe manuale su ambiente CF di test"],
    "regression_risks": ["flussi legittimi che usano evaluate: qualunque restrizione aggiuntiva va feature-flagged", "client severi con i nuovi nomi tool: analisi compatibilita' preventiva"],
    "dependencies": ["SKAUD-018"],
    "implementation_complexity": "M",
    "implementation_model": "INTERMEDIATE",
    "review_model": "FABLE_REQUIRED",
    "confidence": "MEDIUM"
  },
  {
    "id": "SKAUD-027",
    "title": "Rimuovere o disabilitare progressivamente il token condiviso di fallback del bridge ColdFusion",
    "priority": "P2",
    "branch_scope": "BOTH",
    "target_files": ["cf-node/index.js", "cf-node/mcp_tool/mcp_agent.cfm", "cf-node/.env.example"],
    "problem": "NUOVO 2026-07-20: lo stesso valore di token ('Secret_CF_MCP_2026') e' hardcoded come fallback nel client Node (index.js:13 DEFAULT_TOKEN), nel file ColdFusion server-side (mcp_agent.cfm:6 EXPECTED_TOKEN) e nell'esempio .env. Rischio contenuto in ambiente strettamente locale, ma cresce se CF_BRIDGE_URL espone il bridge su rete, VM condivise o host raggiungibili.",
    "evidence": [{"path": "cf-node/index.js", "lines": "13,28,37", "summary": "DEFAULT_TOKEN hardcoded, usato se .env assente"}, {"path": "cf-node/mcp_tool/mcp_agent.cfm", "lines": "6,15-16", "summary": "EXPECTED_TOKEN hardcoded server-side, confronto semplice"}, {"path": "cf-node/.env.example", "lines": "6", "summary": "stesso valore nell'esempio"}],
    "change_type": "VERSION",
    "proposed_change": "Migrazione incrementale: (1) documentare che il token di esempio non e' sicuro fuori da localhost; (2) warning quando viene usato il valore di fallback; (3) fallback supportato temporaneamente dietro flag legacy; (4) poi configurazione esplicita obbligatoria; (5) token server-side letto da configurazione/variabile d'ambiente; (6) nessun segreto reale committato nel file CFM; (7) documentare rotazione e compatibilita'. Stato finale: fail-closed.",
    "acceptance_criteria": ["nessun segreto reale hardcoded", "warning sul fallback legacy", "percorso di migrazione documentato", "comportamento locale legacy preservabile per finestra transitoria", "fail-closed come stato finale", "test su configurazione assente, token errato e token esplicito"],
    "tests": ["node tests/smoke/cf-node.smoke.mjs", "test dedicati: config assente / token errato / token esplicito"],
    "regression_risks": ["installazioni locali esistenti che si affidano al fallback: finestra transitoria con flag legacy obbligatoria"],
    "dependencies": [],
    "implementation_complexity": "M",
    "implementation_model": "INTERMEDIATE",
    "review_model": "FABLE_REQUIRED",
    "confidence": "HIGH"
  }
]
