task-spec-creator
Task Spec Creator
Guida lo sviluppatore attraverso un'intervista strutturata per raccogliere i requisiti di una task e genera un file markdown di specifica revisabile.
Regola fondamentale
Mai chiedere info già fornite dall'utente. Prima di ogni domanda, verifica se la risposta è già stata data nel messaggio iniziale o nelle risposte precedenti. Se un'informazione è deducibile dal contesto, non chiederla.
Preferisci AskUserQuestion per qualsiasi scelta con opzioni finite (tipo task, contesto, direzione MQTT, metodo HTTP, ecc.). Usa domande testuali libere solo per informazioni veramente aperte (descrizioni, strutture payload, path di file).
Workflow
Step 1 — Smart Intake (Extract First, Ask Second)
Fase A — Estrazione automatica. Analizza il messaggio iniziale dell'utente ed estrai:
| Campo | Come estrarre |
|---|---|
| Ticket ID | Numeri isolati o pattern #1380, ticket 1380, 1380-slug |
| Descrizione | Frase principale che descrive l'obiettivo |
| Contesto | Deduci dalla tabella segnali (vedi sotto) |
| Tipo | "fix/bug/correzione" → Modifica; "nuovo/aggiungere/creare" → Nuova feature |
| File coinvolti | Path menzionati, nomi di classi, componenti |
| Riferimenti | Commit, PR, file simili menzionati |
Tabella segnali per il contesto:
| Contesto | Segnali chiave |
|---|---|
mqtt-command |
MQTT, comando, macchina, payload, hex, broker, packet |
backend-api |
endpoint, controller, API, Symfony, route |
frontend |
componente, React, UI, pagina, dashboard |
event-sourcing |
evento, aggregate, Broadway, CQRS, command handler |
migration |
migrazione, upgrade, PHP, Symfony version |
database |
MongoDB, query, aggregation, schema, indice |
generic |
nessun segnale specifico |
Esempi di estrazione:
- "ticket 1380 fix product vending MQTT" → ticket=1380, contesto=mqtt-command, tipo=Modifica
- "creare nuovo endpoint per lista macchine filtrate per modello" → contesto=backend-api, tipo=Nuova feature
- "1402 aggiungere grafico consumo prodotti nella dashboard" → ticket=1402, contesto=frontend, tipo=Nuova feature
Fase B — Mostra il riassunto. Rispondi con:
Ecco cosa ho capito:
- Ticket: {id o "non specificato"}
- Descrizione: {descrizione estratta}
- Contesto: {contesto dedotto}
- Tipo: {Nuova feature | Modifica}
- File coinvolti: {lista o "da definire"}
- Riferimenti: {riferimenti o "nessuno"}
Fase C — Chiedi solo ciò che manca. Usa una singola chiamata AskUserQuestion (max 4 domande) per le informazioni mancanti che hanno opzioni finite. Aggiungi domande testuali brevi solo per info aperte veramente mancanti.
Domande strutturate candidate (usa solo quelle necessarie):
- Contesto — solo se non deducibile → opzioni: mqtt-command, backend-api, frontend, event-sourcing, database, generic
- Tipo — solo se ambiguo → opzioni: Nuova feature, Modifica
- Ticket ID — solo se non fornito → chiedi come testo libero
Se il messaggio iniziale è sufficientemente completo, salta le domande e vai direttamente allo Step 2.
Aspetta la risposta prima di procedere.
Step 2 — Deep Dive contestuale
In base al contesto confermato (o dedotto), raccogli le informazioni specifiche mancanti.
Usa una singola chiamata AskUserQuestion (max 4 domande) per le scelte strutturate. Aggiungi brevi domande testuali solo per info veramente aperte.
Regola: salta qualsiasi domanda la cui risposta è già stata fornita nello Step 1.
mqtt-command
AskUserQuestion (scelte finite):
- Direzione → opzioni: Server → Macchina, Macchina → Server, Bidirezionale
- Trigger → opzioni: Evento Broadway, Endpoint API, Console command, Schedulato
- Persistenza MongoDB → opzioni: Sì, No
Testo libero (solo se mancanti):
- Byte hex del comando (es.
0x2A) - Struttura payload (campi, lunghezza)
- Comando simile come riferimento
backend-api
AskUserQuestion (scelte finite):
- Metodo HTTP → opzioni: GET, POST, PUT, PATCH, DELETE
- Auth richiesta → opzioni: Sì (specificare ruolo), No
Testo libero (solo se mancanti):
- Route prevista
- Input atteso (body, query params)
- Output atteso (struttura risposta)
- Controller simile come riferimento
frontend
AskUserQuestion (scelte finite):
- Dati da → opzioni: API esistente, Nuova API da creare, Dati locali/props
Testo libero (solo se mancanti):
- Pagina o sezione dell'app coinvolta
- Interazioni utente previste
- Componente simile come riferimento
event-sourcing
AskUserQuestion (scelte finite):
- Trigger del Command → opzioni: Controller, Listener, Console command
- Serve Projector → opzioni: Sì, No
- Serve MQTT Listener → opzioni: Sì, No
Testo libero (solo se mancanti):
- Nome del Command e del relativo Event
migration
Testo libero:
- Versione di partenza e versione target
- Componenti coinvolti (PHP, Symfony, dipendenze specifiche)
- Breaking changes noti
database
AskUserQuestion (scelte finite):
- Tipo di operazione → opzioni: Query, Aggregation, Nuovo indice, Schema change
Testo libero (solo se mancanti):
- Collezione/tabella coinvolta
- Volume dati stimato / performance requirements
generic
Testo libero:
- Input e output attesi
- Dipendenze note
- Vincoli tecnici o di business
Step 3 — Generazione del file
Dopo aver raccolto tutte le risposte, genera il file con questo nome:
{ticket-id}.md # se solo ID numerico
{ticket-id}-{slug}.md # se fornito anche lo slug
Usa il template qui sotto, compilando solo le sezioni pertinenti al contesto. Ometti sezioni vuote o non applicabili.
Template TASK_SPEC.md
# {ticket-id} — {titolo task}
**Contesto:** {mqtt-command | backend-api | frontend | event-sourcing | migration | database | generic}
**Tipo:** {Nuova feature | Modifica}
**Data:** {data corrente}
---
## Descrizione
{descrizione fornita dallo sviluppatore}
---
## File / Funzionalità coinvolti
{lista file o funzionalità da modificare, se task di modifica}
---
## Requisiti tecnici
{sezione compilata in base al contesto — vedi sotto}
---
## Implementazione
### Componenti da creare / modificare
{lista strutturata dei componenti, con path e descrizione breve}
### Flusso
{descrizione del flusso tecnico, es. trigger → command → handler → event → listener → MQTT}
---
## Riferimenti
{file o pattern esistenti da seguire come riferimento}
---
## Note aperte
{dubbi, punti da verificare, dipendenze esterne}
Sezioni contestuali per "Requisiti tecnici"
mqtt-command
| Campo | Valore |
|---|---|
| Comando (hex) | `0xXX` |
| Direzione | Server → Macchina |
| Trigger | Evento Broadway / endpoint API / console command |
| Payload | {struttura campi se nota} |
| Persistenza MongoDB | Sì / No |
| Riferimento esistente | {path file simile} |
backend-api
| Campo | Valore |
|---|---|
| Method + Route | `GET /api/v1/...` |
| Input | {parametri} |
| Output | {struttura risposta} |
| Auth | {ruolo/permesso richiesto} |
| Riferimento | {controller esistente} |
frontend
| Campo | Valore |
|---|---|
| Sezione | {pagina/sezione app} |
| Dati | {provenienza e struttura} |
| Interazioni | {azioni utente} |
| Riferimento | {componente simile} |
event-sourcing
| Campo | Valore |
|---|---|
| Command | `{CommandName}` |
| Event | `{EventName}` |
| Trigger | {chi dispatcha il command} |
| Projector | Sì / No — {read model aggiornato} |
| MQTT Listener | Sì / No |
Comportamento
- Fai le domande in italiano se l'utente scrive in italiano
- Non generare il file prima di aver ricevuto le risposte alle domande contestuali
- Se una risposta è ambigua, chiedi chiarimento prima di procedere
- Dopo aver generato il file, mostralo e chiedi: "Vuoi modificare qualcosa prima di salvarlo?"
- Salva il file nella directory corrente o in
docs/specs/se esiste nel progetto - Dopo il salvataggio, proponi la creazione di test se pertinente al contesto:
mqtt-command→ test su PacketHandler/PacketSender, mock del brokerbackend-api→ test funzionali sul controller (WebTestCase Symfony)frontend→ non proporre test di default (chiedere esplicitamente)event-sourcing→ test su Command Handler e Aggregate (Broadway InMemoryEventStore)database→ test sull'aggregation pipeline con fixture MongoDB- Per gli altri contesti, valuta caso per caso e proponi solo se ha senso
- Formula la proposta così: "Vuoi che aggiunga una sezione Test alla specifica?" e se confermato aggiungi la sezione al file con i test case suggeriti (non il codice, solo la descrizione di cosa testare)
More from marcoax/skills
code-review
>
9pessimistic-code-review
>
9grill-me
Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions "grill me".
7skill-optimizer
>
7current-file-review
Review changes in one explicitly identified current or open file against project best practices. Use only when the user clearly refers to the current file, says "this file", "current file", "open file", or provides a single file path to review. Do not use for generic review requests, branch diffs, commits, or repository-wide review; use code-review or a stack-specific review skill instead. Operates in PLAN MODE - proposes improvements, waits for approval before executing.
7prd-to-plan
Turn a PRD into a multi-phase implementation plan using tracer-bullet vertical slices, saved as a local Markdown file in ./plans/. Use when user wants to break down a PRD, create an implementation plan, plan phases from a PRD, or mentions "tracer bullets".
6