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.
71
89%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
Workflow di spec-driven development costruito su OpenSpec, con enforcement meccanico per lo spec-as-source sopra di esso.
OpenSpec porta un progetto a spec-anchored (propose → apply → archive, con openspec/specs/<capability>/spec.md come specifica canonica), ma non verifica nulla da solo. Questo plugin aggiunge una schema OpenSpec custom (spec-as-source) e gli strumenti che rendono la spec un vincolo strutturale: ownership dei file, verifica dei test, workflow CI, e le skill che li orchestrano.
# prerequisito: CLI OpenSpec
npm install -g @fission-ai/openspec
# nel tuo progetto
tessl install spec-driven-devlopment/spec-as-sourceRichiede: openspec CLI, git, e un test runner (pytest / vitest / jest / cargo / go).
| Rule | Comportamento imposto |
|---|---|
spec-as-source | L'implementazione non è completa finché tutti i [@test] esistono; un targets non cambia senza la sua spec |
generated-file-header | Ogni file targets inizia con # GENERATED FROM SPEC |
handoff-suggestion | Suggerisce /handoff save quando il contesto della conversazione si fa lungo (fallback portabile dell'hook PreCompact) |
| Skill | Quando usarla | Comando |
|---|---|---|
requirement-gathering | quando la richiesta è vaga: interview strutturata, una domanda alla volta | Use requirement-gathering. |
spec-writer | per scrivere o correggere a mano una openspec/specs/<capability>/spec.md | Use spec-writer. |
| Skill | Quando usarla | Comando |
|---|---|---|
openspec-explore | per investigare un'idea prima di proporla | Use openspec-explore. |
openspec-propose | per proporre un change e generare tutti gli artifact in un colpo | Use openspec-propose. |
openspec-apply-change | per implementare i task di un change | Use openspec-apply-change. |
openspec-sync-specs | per unire le delta spec di un change in openspec/specs/ | Use openspec-sync-specs. |
openspec-archive-change | per chiudere e archiviare un change completato | Use openspec-archive-change. |
| Skill | Quando usarla | Comando |
|---|---|---|
spec-as-source-setup | una volta, per installare lo schema OpenSpec + script + CI + pre-commit | Use spec-as-source-setup. |
spec-verify | a ogni giro, per verificare spec/test/codice + drift semantico | Use spec-verify. |
work-review | prima di dire "ho finito": review requisito-per-requisito con evidenza file:riga | Use work-review. |
spec-ci-sync | dopo aver aggiunto una spec o cambiato stack | Use spec-ci-sync. |
spec-rebuild | per dimostrare che le spec sono la sorgente | Use spec-rebuild. |
| Skill | Quando usarla | Comando |
|---|---|---|
handoff | per congelare lo stato della sessione (.handoff/HANDOFF-NNN.md) e riprenderlo dopo, o per installare l'hook PreCompact | Use handoff. |
docs/policy.md — la policy in chiaro: perché esiste, come funziona, il ciclo di vita completo, il gap di migrazione da v1.x.
# 1. una tantum: installa schema OpenSpec + infrastruttura di enforcement
Use spec-as-source-setup.
Use handoff. # opzionale: installa anche l'hook PreCompact (Workflow E)
# 2. per ogni nuova feature
Use requirement-gathering. # se la richiesta è vaga: chiarisce scope ed edge case
Use openspec-propose. # o openspec-explore se l'idea non è ancora chiara
Use spec-writer. # se serve scrivere/correggere una spec a mano
Use openspec-apply-change. # implementa tasks.md
Use spec-verify. # verifica targets/test/drift contro la spec
Use work-review. # review requisito-per-requisito prima di dire "fatto"
Use openspec-archive-change. # chiude il change, unisce le spec
# 3. manutenzione occasionale
Use spec-ci-sync. # dopo aver cambiato stack o aggiunto test
Use spec-rebuild. # per dimostrare che le spec bastano a ricostruire il codice
# 4. quando la sessione si allunga
Use handoff. # salva lo stato prima che il contesto rischi allucinazioniCosa crea spec-as-source-setup nel progetto:
openspec/schemas/spec-as-source/ # schema OpenSpec custom con targets + [@test]
scripts/check-spec-links.sh # ogni [@test] punta a un file esistente
scripts/check-target-ownership.sh # un target non cambia senza la sua spec
scripts/build-spec-manifest.py # mappa spec → requisiti → target → test
scripts/verify.sh # esegue i tre script + test suite
.pre-commit-config.yaml # gli stessi check in locale
.github/workflows/spec-verification.yml # gli stessi check in CIspec-verifyI primi 4 girano anche in CI (meccanici); il quinto è una review qualitativa che solo un agente può fare:
| # | Controllo | Se fallisce | Recupero |
|---|---|---|---|
| 1 | check-spec-links | un [@test] punta a un file inesistente | crea il file di test mancante |
| 2 | check-target-ownership | un targets è cambiato senza la sua spec | annulla la modifica → aggiorna la spec → rigenera dalla spec |
| 3 | build-spec-manifest | una spec non è parsabile | correggi frontmatter / header dei requisiti |
| 4 | test suite | il comportamento contraddice la spec | allinea il codice, o cambia prima la spec |
| 5 | drift semantico | il codice fa qualcosa che la spec non descrive (o viceversa), pur con link e test a posto | aggiorna la spec (spec-writer) se il codice è corretto, altrimenti correggi il codice |
Il controllo #2 è il cuore dello spec-as-source: è ciò che OpenSpec da solo non ha. Il controllo #5 è il cuore di work-review: prova che spec e codice dicano davvero la stessa cosa, non solo che i link tra loro siano formalmente a posto.
tessl update spec-driven-devlopment/spec-as-source
# poi RIAVVIA Claude Code: le skill si caricano all'avvio della sessioneSe tessl update non vede il plugin, non è registrato in tessl.json: installalo prima con tessl install spec-driven-devlopment/spec-as-source.
Perché gli script funzionino, ogni openspec/specs/<capability>/spec.md deve avere:
---
targets:
- src/percorso/file.py # i file che questa capability possiede
---
# <Capability> Specification
## Purpose
...
## Requirements
### Requirement: <nome del requisito>
Descrizione normativa (SHALL/MUST).
**Verified by**: [@test] tests/percorso/test_file.py
#### Scenario: <nome scenario>
- **WHEN** ...
- **THEN** ...targets (dichiarazione di proprietà), prima del titolo;### Requirement: <nome> (formato OpenSpec, non più ID REQ-*);**Verified by**: [@test] <path> dopo la frase normativa, mai come prima riga del blocco.Una spec appena creata da openspec archive per una capability nuova parte senza frontmatter (lo scheletro di OpenSpec non ne genera uno): non è una violazione finché non viene modificata in modo non banale, momento in cui deve guadagnarsi un targets:.
Le versioni precedenti alla 2.0.0 imponevano un formato di spec diverso e fatto in casa: file flat in specs/<nome>.spec.md con header REQ-<AREA>-<NNN>. Non esiste una skill di migrazione automatica. Spostare un progetto v1.x a questa versione richiede di ricreare manualmente ogni spec sotto openspec/specs/<capability>/spec.md seguendo la nuova convenzione frontmatter + **Verified by**, e aggiornare i percorsi [@test] di conseguenza.
Costruito da Giuseppe Di Canosa. Workspace spec-driven-devlopment.
.tessl-plugin
skills
handoff
openspec-apply-change
openspec-archive-change
openspec-explore
openspec-propose
openspec-sync-specs
requirement-gathering
spec-as-source-setup
templates
openspec-schema
spec-as-source
templates
spec-ci-sync
spec-rebuild
spec-verify
spec-writer
work-review