Files
italiadatacenter/add-on/AgentPlatform/sts-spec-driven/references/scrittura.md
T
2026-10-26 00:25:18 +01:00

182 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Scrivere la documentazione spec-driven — STS Lab Srl
Guida per creare la documentazione quando il progetto non ce l'ha, completarla quando è solo
uno scheletro, o aggiungere una spec a un progetto che già la usa.
`S` = `python ~/.claude/skills/sts-spec-driven/scripts/spec_index.py`
(da PowerShell: `python $HOME\.claude\skills\sts-spec-driven\scripts\spec_index.py`)
---
## 0. Scegliere il layout — lo decide l'utente
Chiedi sempre con `AskUserQuestion`, prima di creare file. Proponi come primo, con
«(Consigliato)», il layout che si adatta al progetto:
| Layout | Quando consigliarlo | Cosa crea |
|---|---|---|
| **Strutturato** | più moduli o servizi, integrazioni con altri sistemi, riscrittura di un sistema esistente, più persone al lavoro, committente esterno, requisiti contrattuali | `00-INDEX` + `01-product … 08-project`, 29 documenti, spec in `03-specs/SPEC-nnn-*.md` |
| **Piatto** | progetto piccolo o prototipo, un solo modulo, un solo sviluppatore, tempi brevi | 8 documenti nella stessa cartella, una spec per modulo `<NOME>_MODULE.md` |
Chiedi nella stessa domanda (o subito dopo) **dove** creare la cartella: default `docs/` nella
radice del repository (decisione D-003 dei modelli). Se esiste già una cartella con documenti
sparsi, non sovrascriverla: proponi di crearci dentro lo scheletro e di spostare i contenuti
esistenti nei documenti giusti.
---
## 1. Creare lo scheletro
```bash
S scaffold <repo>/docs --layout strutturato --progetto "Nome Progetto"
S scaffold <repo>/docs --layout piatto --progetto "Nome Progetto"
```
Lo script **non sovrascrive mai** un file esistente (li elenca come «già esistenti»). I
documenti nascono con segnaposto `<!-- DA COMPILARE: … -->` che spiegano cosa scrivere, e con
le decisioni iniziali già pronte: `D-001` stack (Proposta), `D-002` metodo spec-driven,
`D-003` documentazione nel repository.
---
## 2. Raccogliere le informazioni
### 2.1 Prima guarda, poi chiedi
Prima di fare domande leggi ciò che esiste: `README`, `CLAUDE.md`, manifest delle dipendenze
(`package.json`, `pyproject.toml`, `composer.json`, …), `docker-compose`, cartelle di codice,
documenti del committente forniti dall'utente. Non chiedere ciò che puoi ricavare.
### 2.2 Intervista — al massimo 4 domande per giro, solo ciò che manca
| Tema | Domande |
|---|---|
| Problema | Chi usa il prodotto? Cosa fa oggi senza? Quanto costa il problema (tempo, errori)? |
| Perimetro | Cosa deve esserci nel primo rilascio? Cosa è esplicitamente fuori? |
| Vincoli | Stack imposto? Sistemi esistenti da integrare o da sostituire? Scadenze? |
| Utenti | Quali ruoli? Chi può fare cosa? Multi-azienda (tenant)? |
| Dati | Quali dati personali o sensibili? Per quanto si conservano? |
| Esercizio | Dove gira (cloud, on-premise, Kubernetes)? Quali ambienti? |
| Successo | Come si misura che il progetto ha funzionato? |
Le risposte vanno nei documenti, non solo nella conversazione.
### 2.3 Progetto con codice ma senza documentazione
Ricostruisci dal codice, come è stato fatto in KadeonCad_v2:
- ogni comportamento osservato diventa un `REQ` di tipo **P** (parità) con *Origine*
`file:funzione`; il codice è la fonte di verità, non i commenti;
- ogni difetto visto leggendo diventa un `DIF-nn` + un `REQ` di tipo **C**;
- ogni scelta tecnica già fatta diventa una `D-xxx` *Accettata* con la data di oggi e
«ricostruita dal codice» nel contesto;
- le spec delle parti già scritte nascono comunque *da approvare*: l'utente conferma che il
comportamento attuale è quello voluto.
---
## 3. Ordine di scrittura
Ogni step termina con un **riepilogo all'utente** e la sua conferma prima del successivo.
A fine step aggiorna lo stato nella tabella degli step di `00-INDEX` (⬜ → 🟡 → ✅).
### Layout strutturato
| Step | Documenti | Esce quando |
|:-:|---|---|
| 0 | `00-INDEX` (cos'è, obiettivi, struttura del repo), `D-001` stack, `PROJECT_MEMORY` §1 | l'utente conferma obiettivi e stack |
| 1 | `VISION` → `GLOSSARY` → `PERSONAS_CASI_USO` → `REQUIREMENTS` → `ARCHITECTURE`, `C4_MODEL`, `DOMAIN_WORKFLOW`, `DATA_MODEL`, `SECURITY` | requisiti rivisti dall'utente |
| 2 | una `SPEC` per capability (`S new-spec`) | ogni REQ è coperto da almeno una spec |
| 3 | `openapi.yaml` + `API.md`, `DATABASE.md`, `SEED_BOOTSTRAP.md` | ogni rotta delle spec è nel contratto |
| 4 | `06-devops/*` | ambienti e pipeline descritti |
| 5 | `TEST_STRATEGY`, `ACCEPTANCE_CRITERIA`, `TRACEABILITY`, `ROADMAP`, `TODO` | `S check` senza ID orfani né requisiti scoperti |
Per un progetto piccolo in layout strutturato gli step 4 e parte del 5 possono restare
⬜ con una riga «rimandato a …» nell'indice: meglio dichiarato vuoto che riempito di generico.
### Layout piatto
1. `PROJECT_MEMORY` §1–2 e `ARCHITECTURE`.
2. `DECISIONS` (`D-001` stack).
3. Primo documento di modulo: `S new-spec <docs> --titolo "…" --prefisso X`.
4. `API.md`, `DATABASE.md` per ciò che il modulo tocca.
5. `TODO` con la lettera del modulo e i suoi task.
---
## 4. Regole di qualità
### Requisiti
- Un comportamento per riga, osservabile e verificabile; «il sistema …».
- Numeri espliciti al posto di aggettivi («entro 5 s», «≥ 200 pezzi», non «veloce», «grande»).
- Niente soluzioni tecniche nel requisito (quelle vanno nella spec o in una `D-xxx`).
- Ogni requisito ha Tipo (P/C/N) e Origine. Aree di 2–5 lettere maiuscole (`AUT`, `ING`, `NFR`).
### Specifiche
- Forma **normativa**: «il sistema rifiuta…», «non ricalcola…». I «non» in grassetto.
- Algoritmi in pseudocodice; combinazioni di casi in tabella.
- Contratto API con la **tabella degli esiti** e i codici HTTP; poi subito in `openapi.yaml`.
- Criteri di accettazione binari, nella forma «Dato …, quando …, allora …»; ogni requisito
coperto ha almeno un criterio; i casi limite (valore 199/200, assente, altro tenant) sono
criteri a sé.
- Task piccoli (indicativamente ≤ 1 giorno), con dipendenze; l'ultimo è sempre «Test di
accettazione <lettera>1–<lettera>n».
- Numerazione: `SPEC-nnn` → task `T-nnn0…T-nnn9`, criteri con la lettera della spec
(SPEC-001 → A, SPEC-002 → B, …). Usa `S next-id` per non sbagliare.
- Documento di modulo (layout piatto): la sezione «Domande ancora aperte» deve essere vuota o
«nessuna» prima dell'approvazione.
### Decisioni
- Alternative **reali** valutate, con il motivo dello scarto.
- Conseguenze comprese quelle negative (costi, limiti accettati).
### Sempre
- **Non inventare.** Ciò che non sai resta `DA COMPILARE` o diventa una domanda all'utente;
mai numeri, nomi di sistemi o vincoli plausibili ma non confermati.
- **Mai approvare da solo.** Le spec nascono «da approvare»; diventano «Approvata» solo dopo
un sì esplicito dell'utente (§5).
- Italiano, frasi brevi, niente linguaggio promozionale. Gli stessi termini del `GLOSSARY`.
- Nessun segreto nei documenti: solo il nome della variabile che lo contiene.
---
## 5. Approvare una spec (solo su richiesta dell'utente)
1. Riga di stato: `Stato: **Approvata** · Versione 1.0 · AAAA-MM-GG`.
2. `00-INDEX` §03: riga della spec con numero di criteri, blocco di task, stato ✅.
3. `TODO`: i task della spec nella fase giusta, stato ⬜.
4. `TRACEABILITY`: una riga per requisito coperto (REQ → SPEC §n → T → criteri → ⬜).
5. `DEVELOPMENT_LOG`: voce breve con cosa è stato deciso approvando.
6. `S check <docs>`.
Una spec approvata si modifica solo con una nuova `D-xxx` o con una revisione tracciata
(versione 1.1, sezione `§n.bis`).
---
## 6. Aggiungere una spec a un progetto che già esiste
```bash
S next-id <docs> SPEC # numero libero
S new-spec <docs> --titolo "Portale cliente" # crea SPEC-nnn-portale-cliente.md, da approvare
S next-id <docs> REQ --area POR # se servono requisiti nuovi
S next-id <docs> D # se la spec nasce da una decisione
```
Poi: requisiti nuovi in `REQUIREMENTS` (tipo N, origine `D-xxx`), riga nella mappa di
`00-INDEX`, riquadro «novità» in testa all'indice, e la procedura del §5 quando l'utente approva.
---
## 7. Verifica finale
```bash
S check <docs>
```
Prima di consegnare: nessun ID orfano, nessun requisito scoperto, nessun task delle spec
assente dal TODO. I segnaposto «DA COMPILARE» rimasti devono corrispondere solo a parti
dichiarate rimandate. Riporta all'utente l'esito del controllo, non solo «fatto».
<sub>STS Lab Srl · Spec-Driven Reader</sub>