Spec-driven development on OpenSpec, with mechanical spec-as-source enforcement: a custom 'spec-as-source' OpenSpec schema adds file-ownership (targets) and test-verification ([@test]) metadata to every capability spec, three scripts (link check, ownership check, manifest build) keep code and specs from drifting apart, plus requirement-gathering, spec-writer, work-review, and a session-handoff skill with a proactive context-warning hook.
68
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Questo sistema mantiene tutta la memoria del progetto nella cartella .handoff/,
strutturata per permettere a qualsiasi agente AI (o operatore umano) di riprendere
il lavoro senza perdere contesto tra sessioni.
.handoff/.handoff/
├── HANDOFF-001.md ← prima sessione
├── HANDOFF-002.md ← seconda sessione (legge il precedente)
├── HANDOFF-NNN.md ← sessione corrente (sempre il numero più alto)
├── HISTORY.md ← diario continuo append-only (vedi rule history-log)
├── CLAUDE.md ← istruzioni persistenti per Claude Code
├── PROMPTS.md ← libreria prompt riutilizzabili
├── CLIENTS.md ← schede clienti attivi
└── WORKFLOW.md ← metodologia TheNewA(i)telierRegola fondamentale: gli HANDOFF-NNN.md sono append-only — non si modificano mai le sessioni passate. Si aggiorna solo creando un nuovo file numerato.
| Frase utente | Azione |
|---|---|
/handoff init | Inizializza .handoff/ nel progetto corrente |
/handoff save o "crea handoff" | Crea nuovo HANDOFF-NNN.md |
/handoff load o "riprendi" | Legge l'ultimo handoff + context docs |
/handoff update [doc] | Aggiorna CLAUDE.md / PROMPTS.md / CLIENTS.md / WORKFLOW.md |
/handoff status | Mostra lista handoff esistenti con date |
/handoff install-hook | Installa l'hook PreCompact (Workflow E, Claude Code) |
Eseguire quando .handoff/ non esiste ancora.
mkdir -p .handoffLeggere references/init-templates.md per i template di partenza di ciascun
file (CLAUDE.md, PROMPTS.md, CLIENTS.md, WORKFLOW.md). Creare tutti e 4 nella
cartella .handoff/ con il contenuto scaffold appropriato al progetto rilevato
dal contesto della conversazione.
Creare .handoff/HISTORY.md vuoto (nessuno scaffold necessario — è un log
append-only, vedi la rule history-log per il formato delle righe che vi
verranno scritte da qui in avanti).
Seguire il Workflow B (SAVE) per creare HANDOFF-001.md con le informazioni disponibili al momento dell'init.
.handoff/ al progettoSe esiste un .gitignore, suggerire all'utente se vuole committare .handoff/
o escluderlo. Raccomandazione: committarlo — è documentazione di progetto.
ls .handoff/HANDOFF-*.md 2>/dev/null | sort | tail -1Se non esiste nessun file → creare HANDOFF-001.md. Se esiste l'ultimo → incrementare di 1 (es. HANDOFF-007.md → HANDOFF-008.md).
Prima di scrivere, leggere l'ultimo HANDOFF-NNN.md per capire cosa era in sospeso e non contraddire la storia. I Next Steps dell'handoff precedente diventano la base della sezione Current Progress del nuovo.
Usare la struttura esatta in references/handoff-template.md. Le 6 sezioni
obbligatorie — 7 se il progetto ha openspec/PLAN.md (era: 5 sezioni, 6 con
un piano) — sono:
done-when del piano, e quali voci restano aperte.
Si compila leggendo openspec/PLAN.md adesso, non ricordandolo: apri il
file e riporta gli stati che ci trovi. Una posizione scritta a memoria è
sbagliata esattamente come un timestamp indovinato, e molto più difficile da
notare. Vale la stessa disciplina anti-invenzione della rule history-log.Regole di scrittura:
🔄 Stato volatile sotto forma di comando. Unica eccezione, se nessun comando li può
rigenerare, il valore datato — (al YYYY-MM-DD HH:MM — riverificare).file § sezione, mai come riassunto senza fonte. Il numero di riga può
accompagnare il titolo della sezione, non sostituirlo. Un riassunto senza fonte
costringe chi legge a ricostruire, e una ricostruzione inventa: da "contraddice
ROUTER.md" è nata la citazione di una sezione inesistente.Subito dopo aver scritto HANDOFF-NNN.md, appendere a .handoff/HISTORY.md (se
esiste — crearlo prima se .handoff/ esiste ma HISTORY.md no, come da rule
history-log) una riga marker in fondo al file, usando il numero dello
snapshot appena scritto:
--- consolidated up to HANDOFF-NNN ---Questa riga non cancella né riscrive nulla sopra di sé — HISTORY.md resta
append-only esattamente come gli HANDOFF-NNN.md. Segna solo il confine da cui
il prossimo Workflow C (LOAD) riparte a leggere.
Prima di finalizzare:
🔄 Stato volatilefile § sezione, non un
riassunto senza fonteopenspec/changes/archive/ è rimasta diversa da done. È la stessa
staleness che riporta scripts/check-plan-gate.sh. Segnalala, non
bloccare il salvataggio: perdere lo stato di una sessione per far
rispettare l'igiene del piano scambia la cosa più preziosa con la meno
preziosa. Il giudizio bloccante resta al gate.Comunicare il path esatto del file creato e come riprendere:
✅ Salvato: .handoff/HANDOFF-003.md
Per riprendere in una nuova sessione Claude Code:
→ claude (apri una nuova sessione)
→ "Leggi .handoff/HANDOFF-003.md e riprendi da dove eravamo"ls .handoff/HANDOFF-*.md | sort | tail -1.handoff/CLAUDE.md — contiene istruzioni operative persistenti.openspec/PLAN.md esiste, leggilo: è la sorgente della sequenza del
lavoro, e l'handoff ne è solo la fotografia al momento dello snapshot. Da qui
prendi il goal:, il done-when: e gli stati reali delle voci — se la
sezione "📍 Posizione nel piano" dell'handoff dice altro, il piano vince:
è stato scritto dopo. Se il file non esiste non è un errore: è un progetto
che non usa plan-mode, procedi con gli altri documenti..handoff/HISTORY.md esiste, leggi solo le righe dopo l'ultimo marker
--- consolidated up to HANDOFF-NNN --- — non l'intero file dall'inizio.
Se il file non contiene nessun marker (mai consolidato), trattalo per intero
come non consolidato: non è un errore, è solo un progetto la cui prima
consolidazione non è ancora avvenuta.Prima di dire qualsiasi cosa all'utente, esegui il blocco della sezione
🔄 Stato volatile dell'handoff appena letto e prendi i valori da lì, non
dal testo del documento. Se la sezione non c'è (handoff scritti prima di questa
convenzione), usa il blocco minimo:
git log --oneline origin/main..HEAD | wc -l # commit non pushati
bash scripts/verify.sh | tail -2 # test verdi/rossi
bash scripts/check-plan-gate.sh # stato del gate
grep -c '^- \[ \]' openspec/changes/*/tasks.md # task aperti per changeDue regole, entrambe non negoziabili:
git log che ne conta 17 non sono
un'ambiguità da segnalare, sono un numero vecchio e uno vero.verify.sh, un remote o un piano. Salta e prosegui,
non trattarlo come una condizione di stop.Rispondi in 3-4 righe: obiettivo, punto di avanzamento, prossima azione. Non recitare il documento — dimostrare di aver capito.
Ogni numero che compare in questa risposta deve venire dallo Step 2b, mai dal testo dell'handoff. Ripetere un conteggio letto nel documento senza averlo riverificato è il modo esatto in cui un dato sbagliato sopravvive a un passaggio di consegne: è già successo, con "16 commit locali" riportati intatti da un agente che aveva il repository davanti.
Con un piano presente, "punto di avanzamento" significa la voce corrente: id, titolo e stato, e cosa la fa avanzare. Un riassunto che racconta l'ultima sessione senza dire a quale voce del piano appartiene non ha dimostrato di aver capito dove siamo — ha dimostrato di aver letto l'handoff.
Esegui subito il primo passo. Non re-interrogare l'utente su cose già documentate nell'handoff. Tratta What Didn't Work come vincoli rigidi: non riprovare approcci già falliti salvo istruzione esplicita dell'utente.
Quando l'utente vuole aggiornare uno dei documenti persistenti:
Leggere prima il file esistente, fare un update chirurgico (non riscrivere da zero), e confermare le righe modificate/aggiunte all'utente.
Esegui una sola volta per progetto, su richiesta dell'utente o durante spec-as-source-setup.
Installa un hook reale PreCompact che avvisa automaticamente prima che Claude Code
compatti il contesto (cioè quando il contesto si avvicina davvero al limite) —
il trigger deterministico più vicino a "contesto vicino a 300k" disponibile oggi
in Claude Code. Per ambienti/agenti diversi da Claude Code, vale solo la rule
soft handoff-suggestion (non richiede installazione).
.claude/settings.json esistentetest -f .claude/settings.json && cat .claude/settings.json || echo "(non esiste ancora)"Leggi templates/claude-settings-hooks.json in questa skill. Se .claude/settings.json
non esiste, crealo con esattamente quel contenuto. Se esiste già:
hooks.PreCompact, aggiungi l'intero blocco PreCompact da templates/claude-settings-hooks.json;hooks.PreCompact, appendi l'oggetto hook del template all'array esistente — non sostituire gli hook già presenti.Non scrivere mai un .claude/settings.json che cancelli configurazione preesistente (altri hook, permessi, ecc.).
cat .claude/settings.jsonRiporta all'utente: "Hook PreCompact installato — riceverai un avviso prima di ogni compattazione automatica del contesto."
.handoff/ direttamente nel filesystem del progetto..handoff/CLAUDE.md può essere aggiunto al contesto di Claude Code come file sempre caricato (con @.handoff/CLAUDE.md all'inizio della sessione).skills/handoff/); se installata anche globalmente in ~/.claude/skills/handoff/, le due copie sono indipendenti — aggiornarle separatamente..handoff/ non esiste e l'utente chiede di salvare, offrire di fare init prima./handoff save, anche senza che l'utente lo chieda — vedi la rule handoff-suggestion per il trigger automatico..tessl-plugin
rules
skills
handoff
handoff-skill
openspec-apply-change
openspec-archive-change
openspec-explore
openspec-propose
openspec-sync-specs
plan-judge
plan-mode
prompt-loop
requirement-gathering
spec-as-source-setup
templates
openspec-schema
spec-as-source
templates
spec-ci-sync
spec-loop
spec-rebuild
spec-verify
spec-writer
work-review