---
name: dev-mvp-rollback
description: Panic button manuale 4 livelli per ripristinare stato pulito dopo run /dev-mvp-autopilot incartato. Levels: --to-story US-XXX (soft), --to-sprint-start N, --branch-nuke pattern, --nuclear (hard reset origin/main). Conferma esplicita richiesta per livelli distruttivi. Usa quando autopilot ha lasciato il repo in stato inconsistente, sprint da scartare, branch da pulire, dev da resettare.
---

# /dev-mvp-rollback — Panic Button 4 Livelli (v0.16.0+)

> **ATTENZIONE**: Questa skill esegue operazioni Git **distruttive**. Leggi i 4 livelli PRIMA di usarla.
> Le operazioni Level 2-4 NON sono recuperabili senza `git reflog` (che ha limite temporale 90gg default).

Skill di emergenza da usare quando `/dev-mvp-autopilot` ha lasciato il repository in uno stato
inconsistente. Quattro livelli ordinati per distruttività crescente: inizia sempre dal Level 1
e scala solo se necessario.

**Non confondere con `/dev-mvp-autopilot --resume`**: usa `--resume` se il run si è interrotto
ma il repo è pulito. Usa `/dev-mvp-rollback` solo se il repo è *sporco* o vuoi scartare lavoro.

---

## **LEVEL 1 — SOFT** (`--to-story US-XXX`)

Rollback **non-distruttivo**: ripristina HEAD al commit immediatamente precedente la story
specificata, preservando le modifiche nel working directory.

### Come funziona

1. Cerca nel `git log` il commit che referenzia `US-XXX` (per messaggio o trailer `Story:`)
2. Identifica il commit **parent** (quello prima di US-XXX)
3. Esegue `git reset --soft <commit-parent>`
4. Il working dir rimane invariato — i file sono ancora modificati, solo unstaged

### Comando interno

```bash
# Cerca SHA del commit che introduce US-XXX
git log --grep "US-XXX" -n 1 --format="%H"
# Output: abc1234

# Reset soft al parent (^ = parent del commit trovato)
git reset --soft abc1234^
```

### Safety

- **Reversibile**: `git reflog` + `git reset --hard ORIG_HEAD` ripristina lo stato precedente
- Working directory e staging area preservati
- Nessuna perdita di dati

### Use case

- Una story ha introdotto un bug e vuoi rifarne l'implementazione
- Vuoi rifare il commit di US-XXX con messaggio diverso
- Hai bisogno di aggiungere file a un commit già eseguito

### Esempio

```
/dev-mvp-rollback --to-story US-PN05
```

Output atteso:
```
[LEVEL 1 — SOFT] Rollback a stato pre-US-PN05
Trovato commit: abc1234 (feat(auth): JWT refresh token [US-PN05])
Target reset: abc1234^ (= def5678)
Eseguo: git reset --soft def5678
Done. Working dir invariato. 3 file unstaged.
```

---

## **LEVEL 2 — SPRINT** (`--to-sprint-start N`)

Hard reset al commit precedente l'inizio dello Sprint N, poi cancella tutti i branch
locali corrispondenti a `sprint/N/*`.

### Come funziona

1. Cerca nel `git log` il primo commit che referenzia `Sprint N v0.16` o `sprint-N`
2. Identifica il parent (commit pre-sprint)
3. Esegue `git reset --hard <commit-parent>`
4. Lista branch locali matching `sprint/N/*`
5. Cancella ciascuno con `git branch -D`

### Comandi interni

```bash
# Trova primo commit Sprint N
git log --grep "Sprint N" --format="%H" | tail -n 1
# Output: bcd2345

# Hard reset al parent
git reset --hard bcd2345^

# Lista branch sprint
git branch --list "sprint/N/*"
# Output: sprint/56/US-PN01  sprint/56/US-PN02  sprint/56/US-PN03

# Cancella ciascuno
git branch -D sprint/56/US-PN01
git branch -D sprint/56/US-PN02
git branch -D sprint/56/US-PN03
```

### Safety

- **Working directory cancellata**: file non committati vengono persi
- Branch sprint/N/* cancellati localmente — recuperabili via `git reflog` entro 90gg
- Non tocca branch remoti (usa `--branch-nuke` per quello)

### Use case

- Intero sprint da scartare e rifacere da zero
- Sprint completato con bug sistemico che richiede rework totale
- Rollback a checkpoint pre-sprint dopo test E2E catastrofici

### Esempio

```
/dev-mvp-rollback --to-sprint-start 56
```

Output atteso:
```
[LEVEL 2 — SPRINT] Hard reset pre-Sprint 56
Trovato commit: bcd2345 (chore: init sprint-56 planning [Sprint 56 v0.16])
Target reset: bcd2345^ (= cde6789)
Eseguo: git reset --hard cde6789
Branch da cancellare: sprint/56/US-PN01, sprint/56/US-PN02, sprint/56/US-PN03
Cancellati: 3 branch sprint/56/*
Done.
```

---

## **LEVEL 3 — BRANCH NUKE** (`--branch-nuke <pattern>`)

Cancella tutti i branch locali matching il pattern glob e li elimina anche dal remote
`origin` (best effort — non fallisce se il remote non ha il branch).

### Come funziona

1. Esegue `git branch --list "<pattern>"` per lista branch locali
2. Per ogni branch: `git branch -D <branch>`
3. Per ogni branch: `git push origin --delete <branch>` (non-throw se remote-not-exist)

### Comandi interni

```bash
# Lista branch matching
git branch --list "sprint/56/*"
# Output: sprint/56/US-PN01  sprint/56/US-PN02

# Cancella locale
git branch -D sprint/56/US-PN01
git branch -D sprint/56/US-PN02

# Cancella remoto (best effort)
git push origin --delete sprint/56/US-PN01
git push origin --delete sprint/56/US-PN02
```

### Safety

- Branch locali cancellati recuperabili via `git reflog` entro 90gg
- Branch remoti cancellati **NON** recuperabili senza backup separato
- Non tocca HEAD o working directory

### Use case

- Pulizia branch sprint/56/* dopo merge in dev riuscito
- Rimozione branch stale post-sprint
- Cleanup pre-nuovo sprint per tenere repo ordinato

### Esempio

```
/dev-mvp-rollback --branch-nuke "sprint/56/*"
```

Output atteso:
```
[LEVEL 3 — BRANCH NUKE] Pattern: sprint/56/*
Branch locali trovati: 7
  sprint/56/US-PN01  sprint/56/US-PN02  sprint/56/US-PN03
  sprint/56/US-PN04  sprint/56/US-PN05  sprint/56/US-PN06
  sprint/56/US-PN07
Cancello locali... done (7/7)
Cancello remoti (best effort)... 5 ok, 2 not-found (ignored)
Done.
```

---

## **LEVEL 4 — NUCLEAR** (`--nuclear`)

**ULTIMA RISORSA.** Reset hard del branch `dev` all'allineamento con `origin/main`,
poi force-push con `--force-with-lease` (NON `--force`).

> **HARD GUARD**: `main` e `master` sono bersagli forbidden. La skill si ferma con errore
> se il branch corrente o il branch dev è main/master.

### Come funziona

1. Verifica che il branch corrente NON sia `main`/`master` (HARD STOP se violato)
2. Richiede conferma esplicita (vedi sezione Sicurezza)
3. Esegue `git reset --hard origin/main`
4. Esegue `git push --force-with-lease origin dev`

### Perché `--force-with-lease` e non `--force`

`--force-with-lease` verifica che il remote non abbia commit nuovi da quando hai fatto
l'ultimo fetch. Se qualcun altro ha pushato su `dev` nel frattempo, il push fallisce
con errore esplicito — proteggendo il lavoro altrui. `--force` sovrascrive ciecamente.

### Comandi interni

```bash
# Hard reset a origin/main
git reset --hard origin/main

# Force push con protezione (NOT --force)
git push --force-with-lease origin dev
```

### Safety

- **Catastrofico**: tutti i commit non in `origin/main` vengono persi su dev
- `--force-with-lease` evita sovrascrittura accidentale di push altrui
- HARD GUARD su `main`/`master`: la skill non esegue mai nuclear su questi branch
- Richiede conferma testuale esplicita

### Conferma esplicita richiesta

Senza `--yes`, la skill mostra:

```
[LEVEL 4 — NUCLEAR] Stai per eseguire un'operazione IRREVERSIBILE.

Branch corrente: dev
Azione: git reset --hard origin/main
        git push --force-with-lease origin dev

Tutto il lavoro non in origin/main verrà perso.

Type "DESTROY DEV BRANCH" to confirm:
```

### Use case

- Branch `dev` completamente corrotto (conflicts irrisolvibili, history rewrite accidentale)
- `/dev-mvp-autopilot` ha fatto push selvaggi in loop lasciando `dev` incoerente con main
- Ultima risorsa dopo che Level 1-3 non hanno risolto il problema

### Esempio

```
/dev-mvp-rollback --nuclear
```

Output atteso (dopo conferma):
```
[LEVEL 4 — NUCLEAR] Conferma ricevuta.
Eseguo: git reset --hard origin/main
HEAD is now at abc1234 chore: last clean commit
Eseguo: git push --force-with-lease origin dev
Branch 'dev' force-pushed. Remote aggiornato.
Done. Branch dev ripristinato a origin/main.
```

---

## Modalita

| Flag | Comportamento |
|------|---------------|
| `--to-story US-XXX` | Level 1 — soft reset al commit pre-US-XXX, working dir preservata |
| `--to-sprint-start N` | Level 2 — hard reset pre-Sprint N + cancella branch sprint/N/* locali |
| `--branch-nuke <pattern>` | Level 3 — cancella branch locali + remoti matching pattern glob |
| `--nuclear` | Level 4 — hard reset origin/main + force-with-lease push (richiede conferma) |
| `--yes` | Skip conferma interattiva per Level 2-4 (USA CON CAUTELA, solo in script) |
| `--dry-run` | Mostra cosa farebbe senza eseguire alcun comando git |

---

## Workflow operativo

### Pre-flight check (automatico)

Prima di qualunque operazione la skill verifica:

1. **Branch corrente**: non deve essere `main` o `master` (HARD STOP)
2. **Repo git**: deve esistere `.git/` nella cwd
3. **Git disponibile**: `git --version` deve rispondere
4. **Working dir status**: warn se ci sono file unstaged (Level 2-4)

### Algoritmo di scelta del livello

```
Problema con autopilot?
  └─ Una story è andata male?
       └─ Sì → LEVEL 1 --to-story US-XXX
  └─ Intero sprint da scartare?
       └─ Sì → LEVEL 2 --to-sprint-start N
  └─ Solo branch da pulire (sprint già mergiato)?
       └─ Sì → LEVEL 3 --branch-nuke pattern
  └─ Branch dev completamente corrotto, nulla funziona?
       └─ Sì, ultima risorsa → LEVEL 4 --nuclear
```

### Post-rollback verification

Dopo ogni operazione la skill esegue:

```bash
git status          # verifica stato working dir
git log --oneline -5  # verifica HEAD attuale
```

E mostra un summary:
```
POST-ROLLBACK CHECK:
Branch: dev
HEAD: abc1234 — "chore: last clean commit"
Working dir: clean (o N file modificati)
Prossimo passo: [suggerimento contestuale per il livello usato]
```

---

## Esempi

### Esempio 1 — Level 1: Story andata male

```
/dev-mvp-rollback --to-story US-PN05
```

Scenario: US-PN05 (JWT refresh token) ha introdotto un bug nel middleware auth.
Vuoi fare reset e reimplementare senza perdere le modifiche locali alle altre story.

### Esempio 2 — Level 2: Sprint da scartare

```
/dev-mvp-rollback --to-sprint-start 56
```

Scenario: Sprint 56 ha modificato lo schema DB in modo incompatibile con Sprint 57
che era gia' in sviluppo. Si scarta Sprint 56 e lo si ripianifica.

### Esempio 3 — Level 3: Pulizia post-sprint

```
/dev-mvp-rollback --branch-nuke "sprint/56/*"
```

Scenario: Sprint 56 completato e mergiato in dev con successo. I 14 branch
`sprint/56/*` sono ora obsoleti e inquinano il repo.

### Esempio 4 — Level 4: Nuclear con dry-run prima

```
# Prima verifica cosa farebbe
/dev-mvp-rollback --nuclear --dry-run

# Poi esegui con conferma
/dev-mvp-rollback --nuclear
# Type "DESTROY DEV BRANCH" to confirm: DESTROY DEV BRANCH
```

Scenario: `/dev-mvp-autopilot` ha eseguito 87 commit in loop su `dev` con conflicts
irrisolvibili. Main e' pulito. Si resetta dev a main e si ricomincia.

---

## Anti-pattern

- **NON usare `--yes` la prima volta** su un nuovo progetto. Leggi sempre cosa sta per fare.
- **NON saltare i livelli**: prova Level 1, poi 2, poi 3, poi 4. Ogni livello e' piu' distruttivo.
- **NON usare `--nuclear` su main** (hard-coded forbidden — la skill si ferma con errore).
- **NON usare `--nuclear` senza aver fatto `git fetch`** prima — potrebbe sovrascrivere push altrui nonostante `--force-with-lease`.
- **NON usare Level 2-4 durante un run attivo di autopilot**: ferma autopilot prima con Ctrl+C o panic button in-dashboard.

---

## Sicurezza

### Hard guards (NON bypassabili)

```
FORBIDDEN_RESET_TARGETS = ['main', 'master']
```

Se il branch corrente o il target di un'operazione distruttiva e' in questa lista,
la skill si ferma con `HARD STOP: cannot operate on forbidden branch 'main'`.

Non esiste nessun flag `--force-anyway` o `--skip-guards`. I guard sono hard-coded.

### `--force-with-lease` vs `--force`

Level 4 usa **sempre** `git push --force-with-lease origin dev`.
Mai `git push --force`. Questo e' verificabile nel codice helper
(`dev-methodology/scripts/rollback-helper.ts`).

### Conferma testuale Level 2-4

Per le operazioni distruttive (Level 2, 3, 4) senza flag `--yes`:

- Level 2: `Type "RESET SPRINT N" to confirm:`
- Level 3: `Type "NUKE BRANCHES" to confirm:`
- Level 4: `Type "DESTROY DEV BRANCH" to confirm:`

Qualunque input diverso dalla stringa esatta annulla l'operazione.

---

## Riferimenti

- **Helper TS**: `dev-methodology/scripts/rollback-helper.ts` — funzioni esportabili per uso programmatico
- **Pattern Git ops**: `dev-methodology/scripts/git-orchestrator.ts` — pattern execFile con guards
- **SPEC §5.1**: 4 livelli rollback (definizione formale)
- **SPEC §7.2**: Guardrail #5 — panic button (invariante di sistema)
- **Test**: `dev-methodology/tests/skills/dev-mvp-rollback.test.ts`
