# ASF β€” Guida Primi Passi (Solo Frontend 🎨) > **ASF = Azurian Software Factory** Β· *SaaS Platform multi-tenant AI-native* > > **Motto**: *"From Requirement to Production β€” everything is contextualized, traceable and AI-accessible."* > > **Principio centrale**: ***Everything is an Artifact*** β€” requisiti, task, PR, commit, build, test, deploy, incidenti, analisi AI, segnalazioni di sicurezza: tutto Γ¨ un Artifact ASF collegato da Relazioni semantiche. Questa guida usa **solo il browser** (frontend Next.js su `http://localhost:3000`) β€” zero curl, zero chiamate API a mano. L'obiettivo Γ¨ insegnarti a **usare ASF dal punto di vista dell'utente finale**: navigare le pagine, filtrare i dati, ispezionare gli artifact nel loro contesto, marcare i code smell come risolti, sottomettere job asincroni da UI, interrogare l'AI sul grafo. --- ## 0. Prerequisito (1 comando solo per popolare dati) ASF MVP non ha ancora (in questa release) le pagine "Create Organization / Create Project / Create Artifact / Create Relationship via form frontend. Per avere dati reali con cui giocare nel browser, lancia **UNA SOLA VOLTA** questo comando dal terminale (seed demo): ```bash cd /root/ASF && make seed-clean ``` Questo comando (wrapper `scripts/seed-demo.sh --clean --jobs`) fa per te: 1. Crea Organization demo + Project demo 2. Popola 21 artifact (Requirements / Task / PR / Build / Deploy / Test / Docs / Commits / Security findings / Incidents / Source files / Code smells) 3. Crea 9 relazioni semantiche 4. In coda 5 job echo (devops / testing / code analysis) per provare la pagina Jobs 5. Mostra un report finale: `Artifacts totali / Jobs counts / Graph nodesΒ·edges` Poi avvia il frontend (se non giΓ  attivo): ```bash make start ``` Controlla che tutto sia vivo: ```bash make status ``` Quando vedi `asf-core :8000 UP Β· asf-web :3000 UP Β· asf-worker ALIVE` puoi iniziare. **Apri il browser**: `http://localhost:3000` --- ## 🧭 Concetti Chiave da Sapere (prima di cliccare) ``` Organization (il tuo Team) β†’ Project β†’ Artifact ← Relationship β†’ Artifact ``` - **Artifact (17 tipi)**: requirement, epic, story, task, architecture_decision, document, source_file, commit, pull_request, build, test, security_finding, deployment, release, runtime_event, incident, ai_analysis. - **Relationship (12 predicati semantici)**: implements / verifies / generated_from / documented_by / deployed_as / caused_by / related_to … - **Tutto Γ¨ cliccabile**: un nodo nel grafo β†’ apre il dettaglio Context. Una riga in tabella β†’ apre il dettaglio. Un badge ID β†’ apre il dettaglio. - **Isolamento per Tenant**: il frontend MVP usa dev-trust headers (t-demo-003 / u-mario) giΓ  iniettati per te, quindi tutte le pagine mostrano solo i dati del tuo progetto demo. --- ## 🏠 Pagina 1: Overview Dashboard (`/`) ### Cosa vedi 9 cards in alto (da Bootstrap Prompt Β§9) + numeri veri: | Card | Come interpretarla | |---|---| | Project Health % | Media pesata: req coverage + deploy success + security backlog. Oggi: **94.5%** βœ… | | Requirements count Β· per status | Quanti requisiti ci sono? Aperti / In progress / Chiusi | | Implementation Coverage | Requisiti con β‰₯1 task collegati | | Test Coverage | % PR / Deploy con β‰₯1 test che li "verifica" | | Traceability Completeness | Quanti artifact hanno catene complete Reqβ†’Taskβ†’PRβ†’Testβ†’Deploy | | Deployments last 7d | Quanti deploy Β· rate di successo | | Active AI Jobs | Coda attiva: queued / running Β· usage ultima ora | | Failed Builds last 7d | Build fallite | | Security Findings OPEN | Conteggio per severitΓ : CRITICAL/red Β· HIGH/amber Β· MEDIUM/brand Β· LOW/neutral | ### Cosa fare - **Click sul numero Projects**: ti salta alla pagina **Requirements** (prossima). - **Click su Security Findings**: ti salta a **Code Analysis** per vedere gli smell aperti. - **Click su Jobs**: vai a **Jobs (Activity)**. --- ## πŸ“‹ Pagina 2: Requirements (`/requirements`) ### Header in alto Titolo + 4 strumenti di filtraggio + 1 pulsante: 1. **Search field** (ricerca libera per external_id, title, content) 2. **Project filter** (tutti o 1 progetto specifico) 3. **Status filter** (open / in_progress / done / fixed / resolved) 4. **Type filter** (requirement / epic / story / task / document) 5. **πŸ†• New Requirement** β€” ⚠️ *placeholder UI*: in questa MVP non si puΓ² creare requirement da form. Usare il make seed per aggiungere nuovi record. ### Tabella Sticky Header | Colonna | Cosa mostra | |---|---| | ID | external_id monospace (REQ-103) | badge + badge tipo (REQ / colorato | | Title | titolo lungo artifact | | Status | Badge tone (amber=open Β· brand=in_progress Β· green=fixed Β· blue=active) | | Project | nome progetto NON-UUID (es. "ASF SaaS MVP" invece di UUID) | | Source | product-board / jira / github / pytest / argo / etc. | | Updated | data relativa "2h fa / 3d fa | ### Cosa fare (esercizio 2 clic) 1. Scrivi nella Search: `SSO` β†’ filtra subito i requirements che matchano title/content. 2. Status filter = `Open`. 3. **Click sulla riga REQ-103**. β†’ **ti porta automaticamente a Context Explorer con REQ-103 selezionato**. Questo Γ¨ il pattern ASF: **ogni riga Γ¨ un link diretto al contesto. --- ## πŸ” Pagina 3: Context Explorer (`/context`) β€” IL CUORE DI ASF Questa Γ¨ la pagina piΓΉ potente. **5 tab** per 5 modi diversi di vedere lo STESSO artifact selezionato. ### Layout ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Artifact Picker (SX) β”‚ Contenuto Destra (Tabs 1 di 5) β”‚ β”‚ Search x project β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚ β”‚ β”‚ β”‚ - REQ-103 ← selezionato β”‚β”‚ [Metadata] [Relationships] β”‚ β”‚ β”‚ - TASK-101 β”‚β”‚ [Related 2-hop] [Graph ⭐] β”‚ β”‚ β”‚ - PR#88 β”‚β”‚ [History timeline] β”‚ β”‚ β”‚ - BUILD-910 / DEP-44 ... β”‚β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Tab 1 β€” Metadata (Informazioni statiche - **Title Β· external_id Β· type Β· status Β· version Β· source Β· created_at Β· updated_at - Griglia 2x2: Version / Source / Created / Updated - Source preview `
` bg-slate-900 mono (se Γ¨ un source_file o un content lungo)
- Side card destra: **Remediation** (per i code smell) + **Traceability** (collegamenti rapidi)

### Tab 2 β€” Relationships (Liste dirette)
- **Outgoing** (edge uscenti: cosa Γ¨ questo artifact β†’ altri)
- **Incoming** (edge entranti: altri artifact β†’ questo)
- Ogni riga mostra badge `relationship_type` + target title + external_id clickable

### Tab 3 β€” Related (2-hop)
Tutti i vicini a **2 salti** (artifact direttamente collegati + i loro collegati). Utile per:
"Se modifico REQ-103, cosa viene influenzato indirettamente?"
- 2 gruppi Hop1 e Hop2 con badge di profonditΓ , colore distinto

### Tab 4 β€” GRAPH (3 anelli concentrici) ⭐ IL PIΓ™ BELLO
Vedi il tuo artifact **al centro**, poi hop1 β†’ hop2.
- **Layout radiale**:
  - 🟦 Centro β†’ artifact selezionato Β· bordo indigo + badge SELECTED
  - 🟣 Anello interno (R1 = 220px di raggio · bordo violetto · pillola **HOP1**
  - ⬜ Anello esterno (R2 = R1+220+ ~ raggio · bordo slate · pillola **HOP2**)
- **Edges a 2 livelli visivi:
  - Tier 1 (Sel↔Hop1): **SOLIDO 2.1px** colore REL_COLORS
  - Tier 2 (Hop1↔Hop2): **TRATTEGGIATO strokeDasharray + opacity 0.78
- **11 colori per tipo relazione** (legenda in alto a destra: implements/verifies/generated_from/deployed_as/documented_by/related_to/caused_by …)
- Controlli: drag per spostare, scroll zoom, pulsanti Controls in basso a SX, **MiniMap** colori per layer (indigo / violet / slate)

**Clicca QUALSIASI nodo** nel grafo**:
β†’ Context si sposta il centro e ricentra sul nuovo artifact!**

### Tab 5 β€” History Timeline
Eventi ordinati per data:
- 🟣 created_at CREATED viola
- πŸ”΅ updated_at UPDATED blu
- 🟒 version_bump VERSION verde
- 🟠 rel_added / relationship creazione edge arancione

---

## 🧠 Esercizio Pratico Context (3 click!)
1. Nel Picker SX clicca **SEC-025 (security finding SQL injection severity=high
2. Vai in Tab **Related β†’ vedi il nodo SEC-025 e "related_to PR#88
3. Vai in Tab **Graph** β†’ vedi SEC al centro Β· RELATED_TO PR (edge slate Β· Hop1
4. Click PR β†’ **Clicca il nodo PR#88 nel graph** β†’ Ora PR#88 Γ¨ il nuovo centro
5. Tab RELATED del PR β†’ vedi tutti i 2-hop: TASK Β· BUILD Β· TEST Β· DEP Β· COMMIT Β· DOC...

Questo Γ¨ il "perchΓ© del progetto: capire l'impatto a cascata.

---

## πŸ’» Pagina 4: Code Analysis (`/code`)

Analisi di codice + code smells. **2 useQuery separate TanStack (source_file e ai_analysis.kind=code_smell).

### 6 Filtri (Client Side)
1. **Search** libera (title Β· external_id Β· remediation Β· source_path)
2. **Scope**: `All / Source / Smells`
3. **Language**: `All / python / ts / java`
4. **Severity** (solo smells): `Critical / High / Medium / Low`
5. **Status**: `All / open / in_progress / fixed / resolved
6. **Project**: `All / ASF SaaS MVP`

### 5 StatCards in alto
1. Source files caricati
2. Smells trovati
3. Criticali (Badge rosso AlertOctagon)
4. Alti (Badge amber AlertTriangle)
5. Medi+Bassi

### Tabella Righe
Riga = 1 artifact (puΓ² essere source_file O smell.

### DetailView (click sulla riga)
Apre pannello info 2 colonne:
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  β”‚ Info 2x2                     β”‚
β”‚ linguaggio color syntax                  β”‚ version / source / created /     β”‚
β”‚ linee evidenziate in ROSE se linesToHighlight β”‚ Remediation suggerita  β”‚
β”‚ (righe colpevoli di codice)              β”‚ Traceability              β”‚
β”‚                                    β”‚ Status badge severity:                  β”‚
β”‚                                    β”‚  β”‚
β”‚                                    β”‚ ⭐ BUTTON "Mark as fixed"     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

### ⭐ AZIONE PRINCIPALE: **Mark as Fixed (PATCH status=fixed)
Prima devi selezionare un **smell** (source files non hanno il tasto).

**Procedura (5 step click!):
1. Filtra Severity = **High**
2. Click la riga **CS-003 pytype ASF-SEC-203 (source consumer.py lines 8-16
3. Dettaglio sulla DX β†’ in alto header un bottone verde **Mark as fixed
4. Click β†’ Attendi ~300ms
5. Sparisce il pulsante β†’ appare un Badge **🟒 Resolved**

**Cosa succede dietro le quinte? useMutation `markFixedM`:
1. `PATCH /artifacts/:id { status: "fixed" }`
2. `onSuccess`: **invalidateQueries(["code-source", "code-smells"]
3. TanStack ricarica le 2 query (tabella si aggiorna automaticamente

Verifica visiva: torna nel filtro Status = fixed β†’ il tuo smell Γ¨ in fixed!

---

## 🧬 Pagina 5: Traceability Graph (/)
**Grafo GLOBALE del progetto intero** (Context Graph solo di 1 artifact.

### Cosa vedilaid out
- Layout layered DAG React Flow
- **21 nodes Β· 9 edges demo seed)
- Nodi colorati per tipo artifact type (color map 11 colori)
- refetchInterval 5s auto-aggiorna)
- Pannello Inspector a DX:
  - **selezionato: seleziona
  - **Title Β· ID Β· Project
  - **Relationships dirette

### Esercizio Trace (2 click!)
1. Click il nodo arancione **INC-77 (incidente login failure)
2. Guarda Inspector **caused_by DEP-44
3. Click DEP-44 β†’ Inspector deployed_as β†’ BUILD β†’ generated_from PR β†’ implements β†’ task β†’ REQ-103 β†’ Questo Γ¨ il ciclo completo.

---

## πŸš€ Pagina 6: Jobs (Activity) (/)
TUTTI i job. Auto-refresh ogni **3s** (non devi ricarica la pagina manualmente).

### 6 StatCards in alto
Queued / Running / Completed / Failed / Cancelled / Total

### Tabella
| Colonna | Cosa |
|---|---|
| Job ID | ID corto UUID+ clickable |
| Title | titolo descrittivo |
| Queue | code DIRECT pill devops/testing/code_analysis/... |
| Status | Badge tone |
| Worker | asf-worker-1 o quale macchina |
| Priority | 0-100 |
| Usage ms | tempo CPU time 42ms |
| Cost | USD estimate (demo |
| Updated | relativo "4s fa Β· 1m fa |
| Actions | |

### ⭐ Creare un Job da UI (Form completo) (useMutation submitM + Modal
1. In alto a DX click **Enqueue job** β†’ Apre **MODALE DIALOG 720w
2. Compila il form (7 campi):
   a. **Queue* (select): ai.interactive / ai.background / indexing / code_analysis / testing / devops / notifications
   b. **Job Type** (stesso nome queue)
   c. **Title** (campo libero)
   d. Priority** (0-100)
   e. Correlation ID (opzionale)
   f. Payload** (editor JSON validato - se JSON invalido β†’ disable button, 422 fallback
   g. Notes (opzionale)
3. Click **Enqueue** (in basso a DX pulsante primario Submit 2 pulsanti Cancel Β· Submit!)
β†’ Dopo 2 modal si chiude Β· useMutation:
   - `onSuccess: 1. POST /jobs/submit
   - 2. invalidateQueries(["jobs"])
   - 3. setFilters resetta filtri β†’ Tabella si aggiorna **new job diventa Queued Poi in ~3 secondi lo vede il worker β†’ Running β†’ **Completed** (echo handler demo)

### Detail Modal (Click sulla riga Job)
- **JSON completo del job`:
```
{ id, title, status, queue, payload, priority, created_at, started_at, completed_at, result, usage, error, worker_id, correlation_id, metadata }
```
- Progress 0-100:
  - queued/cancelled: 0%
  - running = progressivo
  - completed = 100%, failed 100% rosso
- Meta pills Queue / Status
- Actions: View similar (precompila la modale Enqueue)

---

## πŸ€– Pagina 7: Ask ASF (AI Chat) (`/ask-asf`)

Chat UI stile ChatGPT.

### Layout
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Sidebar DX:               β”‚ Bolle chat SX                       β”‚
β”‚ Β· πŸ” Context Scope          β”‚ πŸ‘€ Utente                       β”‚
β”‚ Β· (source_context=true            β”‚ πŸ€– AI Risposta                  β”‚
β”‚ Β· include_relationships=true  β”‚ [box digitando…                 β”‚
β”‚ Β· max_depth 2                β”‚                                    β”‚
β”‚ Β· max_nodes 50               β”‚                                    β”‚
β”‚ Β· send_trace                   β”‚ Prompt input + enter send + shift enter newline β”‚
β”‚ Β· clear chat              β”‚                                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

### Flusso completo (passo per passo utente)
1. Scrivi nel prompt:
   > *"Cosa causa l'incidente INC-77? Traccia la catena fino al requirement originario, e suggerisci 2 azioni di rimozione"*
2. **Invia con Enter (Shift+Enter = newline nel testo
3. πŸ‘€ La tua bolla appare subito (azzurra)
4. 202 accepted β†’ gear rotante "In attesa di risposta dall'AI..." (polling every 2s Β· max 120 itera 2 minuti
5. Appena il job status=COMPLETED 🟒
6. πŸ€– AI Answer: pickAnswer legge `job.result.message/answer/summary/response/text`
7. **JobMeta pills**: queue=ai.interactive status=completed timestamp
8. **Copy**: icona Copy β†’ clipboard
9. **Clear**: icona Clear
10. Prompt ancora una domanda diversa

### MVP attuale
Senza provider LLM attivo β†’ **fallback del AI Gatewa.
**Tutto il resto Γ¨ FUNZIONANTE
- 202 accettato 2
- 02:
- : 00 iterato
- Risposta renderizzata in bolla
- Context sidebar & Scope pills + History multiple domande

---

## 🧾 Cheat Sheet: Pagine & Azioni Frontend (Riepilogo)

| Pagina Route | Come ci arrivi dalla Sidebar | Cosa ci fai |
|---|---|---|
| `/` | 🏠 Overview | 9 cards KPIs · dashboard generale |
| `/settings` | βš™οΈ Settings | **Crea Org (slug regex 3-60)** Β· **Crea Proj (key A-Z 2-20)** Β· tabelle lista |
| `/requirements` | πŸ“‹ Requirements | Cerca Β· filtra Β· **pulsante "New Requirement" modale form completo** Β· click riga β†’ Context |
| `/context` | πŸ” Context | **pulsante "New Artifact" (17 tipi!)** Β· **pulsante "Link" (12 rel. types!)** Β· Ispeziona 5 Tabs Β· Graph 3 anelli Β· click nodi ricentra |
| `/code` | πŸ’» Code Analysis | Filtra smells Β· **Click riga smell β†’ "Mark as fixed" |
| `/traceability` | 🧬 Trace | Grafo globale Β· Click nodo β†’ Inspector |
| `/jobs` | πŸš€ Jobs (Activity) | **Modale "Enqueue job" form completo** Β· Detail JSON modal |
| `/ask-asf` | πŸ€– Ask ASF (AI) | Fai domande sul grafo Β· 202 + poll Β· Chat |

---

## βœ… Stato Copertura Frontend vs API

Tutte le operazioni CRUD principali **ora hanno UI** (0 comandi curl necessari):

| Operazione | UI nel frontend? | Dove la trovi |
|---|---|---|
| Creare Organization | βœ… | **/settings β†’ "New organization" |
| Creare Project | βœ… | **/settings β†’ "New project" |
| Creare Requirement | βœ… | **/requirements β†’ pulsante "New Requirement" |
| Creare Artifact GENERICO (17 tipi: task, epic, story, commit, source_file, ai_analysis, deployment, incident, security_finding, …) | βœ… | **/context β†’ pulsante **"New Artifact" |
| Creare Relazioni tra artifact (12 tipi: implements, verifies, generated_from, documented_by, depends_on, deployed_as, caused_by, related_to, …) | βœ… | **/context β†’ pulsante **"Link"** |
| Upload source code smell | βœ… | Context β†’ New Artifact β†’ `type=ai_analysis` + metadata `{"kind":"code_smell","severity":"high"}` |
| Mark smell come fisso | βœ… | /code β†’ DetailView β†’ **Mark as fixed** |
| Sottomettere Job | βœ… | /jobs β†’ Modale **Enqueue job** completo |
| Interrogare AI grafo | βœ… | /ask-asf β†’ Chat UI 202 + poll |

---

## βœ… Checklist Primo Progetto Frontend (solo click, ZERO curl)

- [ ] Stack attivo: `make seed-clean` + `make start` + `make status` β†’ **UP (tutti verdi)
- [ ] /settings β†’ **New organization**: fill name=NuovaOrg, slug=nuova-org-001 (3-60 lowercase+dash), plan=Free β†’ **Submit β†’ riga apparsa in tabella Organizations βœ…
- [ ] /settings β†’ **New project**: fill name="Demo Proj 1", key="DEMO1" (A-Z 2-20), branch=main β†’ Submit β†’ riga apparsa Projects tabella βœ…
- [ ] /requirements β†’ **pulsante "New Requirement" β†’ fill Title="SSO Login OK", Project=DEMO1, Content="Login with Okta/OAuth2", Status=backlog β†’ Create β†’ apparsa in lista βœ…
- [ ] /requirements β†’ Cerca "SSO" + click riga β†’ Context
- [ ] /context β†’ **New Artifact**: Type=task Β· Title="Implementa Okta middleware" Β· External_id="TASK-900" Β· Project=DEMO1 Β· Status=todo β†’ Create β†’ selezionata in picker βœ… (17 tipi artifact!)
- [ ] /context β†’ **Link** pulsante: Source=REQ (il SSO appena creato) Β· Type=implements Β· Target=Task900 (search "Okta" filter) β†’ Create Relationship β†’ Tab "Relationships" mostra implementsβ†’ task πŸ”—
- [ ] /context β†’ Graph 3 anelli: hop0 (centro) Β· hop1 (solid task) Β· hop2 (dashed se esistevano) β†’ Click nodo task (si ricentra) βœ…
- [ ] /code β†’ Filtro Severity High β†’ riga CS-003 β†’ click β†’ **Mark as fixed" β†’ Badge 🟒 Resolved βœ…
- [ ] /traceability β†’ Click nodo INC-77 β†’ Inspector caused_by DEP-44 β†’ Click DEP β†’ chain completa
- [ ] /jobs β†’ pulsante **Enqueue job β†’ compila form titolo="Smoke test job", queue=testing, priority=normal β†’ Invia β†’ Attesa 3s β†’ Status queued β†’ Running β†’ **Completed 100% βœ…
- [ ] Jobs riga completata β†’ Click β†’ JSON modale Detail 100% completati β†’ Usage result
- [ ] /ask-asf β†’ Invia domanda: "Quale task implementa il requirement SSO?" β†’ Attendi 202+poll β†’ bolle user e AI β†’ Copy clipboard βœ…
- [ ] `make tsc` β†’ 0 errors
- [ ] `make test` β†’ 12+6+8+7+4 = 37/37 βœ… GREEN