lovarch-cli 0.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. lovarch_cli/__init__.py +16 -0
  2. lovarch_cli/__main__.py +10 -0
  3. lovarch_cli/ai/__init__.py +21 -0
  4. lovarch_cli/ai/gateway.py +240 -0
  5. lovarch_cli/api.py +111 -0
  6. lovarch_cli/auth/__init__.py +32 -0
  7. lovarch_cli/auth/keyring_store.py +214 -0
  8. lovarch_cli/auth/local_server.py +165 -0
  9. lovarch_cli/auth/pkce.py +57 -0
  10. lovarch_cli/auth/session.py +189 -0
  11. lovarch_cli/cli.py +262 -0
  12. lovarch_cli/clients/__init__.py +33 -0
  13. lovarch_cli/clients/factory.py +54 -0
  14. lovarch_cli/clients/local_client.py +432 -0
  15. lovarch_cli/clients/lovarch_storage.py +174 -0
  16. lovarch_cli/clients/lovarch_supabase.py +295 -0
  17. lovarch_cli/clients/persistence.py +166 -0
  18. lovarch_cli/clients/storage.py +66 -0
  19. lovarch_cli/commands/__init__.py +10 -0
  20. lovarch_cli/commands/account.py +172 -0
  21. lovarch_cli/commands/audit.py +394 -0
  22. lovarch_cli/commands/config_cmd.py +80 -0
  23. lovarch_cli/commands/consolidate.py +217 -0
  24. lovarch_cli/commands/context_cmd.py +73 -0
  25. lovarch_cli/commands/dev.py +287 -0
  26. lovarch_cli/commands/do_cmd.py +120 -0
  27. lovarch_cli/commands/init.py +218 -0
  28. lovarch_cli/commands/jobs_cmd.py +95 -0
  29. lovarch_cli/commands/login.py +202 -0
  30. lovarch_cli/commands/mcp_cmd.py +26 -0
  31. lovarch_cli/commands/run.py +375 -0
  32. lovarch_cli/commands/signup.py +185 -0
  33. lovarch_cli/commands/status.py +243 -0
  34. lovarch_cli/commands/upgrade.py +108 -0
  35. lovarch_cli/commands/verifica_cmd.py +174 -0
  36. lovarch_cli/config.py +101 -0
  37. lovarch_cli/config_store.py +111 -0
  38. lovarch_cli/credits/__init__.py +35 -0
  39. lovarch_cli/credits/base.py +84 -0
  40. lovarch_cli/credits/factory.py +36 -0
  41. lovarch_cli/credits/local.py +34 -0
  42. lovarch_cli/credits/lovarch.py +56 -0
  43. lovarch_cli/i18n/__init__.py +27 -0
  44. lovarch_cli/i18n/loader.py +121 -0
  45. lovarch_cli/i18n/translations/en.json +168 -0
  46. lovarch_cli/i18n/translations/es.json +168 -0
  47. lovarch_cli/i18n/translations/it.json +168 -0
  48. lovarch_cli/i18n/translations/pt.json +168 -0
  49. lovarch_cli/mcp/__init__.py +9 -0
  50. lovarch_cli/mcp/server.py +199 -0
  51. lovarch_cli/mcp/tools.py +372 -0
  52. lovarch_cli/sample_downloader.py +255 -0
  53. lovarch_cli/squad/README.md +206 -0
  54. lovarch_cli/squad/agents/auditor-input.md +353 -0
  55. lovarch_cli/squad/agents/bim-engineer.md +404 -0
  56. lovarch_cli/squad/agents/briefing-architect.md +249 -0
  57. lovarch_cli/squad/agents/cad-engineer.md +278 -0
  58. lovarch_cli/squad/agents/capitolato-writer.md +256 -0
  59. lovarch_cli/squad/agents/computo-engineer.md +258 -0
  60. lovarch_cli/squad/agents/concept-designer.md +399 -0
  61. lovarch_cli/squad/agents/contratto-architect.md +243 -0
  62. lovarch_cli/squad/agents/deliverable-builder.md +253 -0
  63. lovarch_cli/squad/agents/energy-prelim.md +388 -0
  64. lovarch_cli/squad/agents/pratiche-it.md +251 -0
  65. lovarch_cli/squad/agents/progetto-chief.md +768 -0
  66. lovarch_cli/squad/agents/quality-dati.md +409 -0
  67. lovarch_cli/squad/agents/quality-misure.md +418 -0
  68. lovarch_cli/squad/agents/quality-normativa.md +417 -0
  69. lovarch_cli/squad/agents/quality-output.md +436 -0
  70. lovarch_cli/squad/agents/regolatorio-it.md +278 -0
  71. lovarch_cli/squad/checklists/handoff-quality-gate.md +232 -0
  72. lovarch_cli/squad/checklists/quality-dati-checklist.md +134 -0
  73. lovarch_cli/squad/checklists/quality-misure-checklist.md +139 -0
  74. lovarch_cli/squad/checklists/quality-normativa-checklist.md +121 -0
  75. lovarch_cli/squad/checklists/quality-output-checklist.md +116 -0
  76. lovarch_cli/squad/config.yaml +408 -0
  77. lovarch_cli/squad/data/CHANGELOG.md +272 -0
  78. lovarch_cli/squad/data/agents-prd.md +428 -0
  79. lovarch_cli/squad/data/architettura-progetto-rules.md +328 -0
  80. lovarch_cli/squad/data/handoff-card-template.md +231 -0
  81. lovarch_cli/squad/data/mocks/catasto-visura.json +72 -0
  82. lovarch_cli/squad/data/mocks/firma-envelope.json +43 -0
  83. lovarch_cli/squad/data/prezzario-lombardia-sample.json +312 -0
  84. lovarch_cli/squad/scripts/api_clients.py +206 -0
  85. lovarch_cli/squad/scripts/architect_profile.py +276 -0
  86. lovarch_cli/squad/scripts/deliverable_generators.py +844 -0
  87. lovarch_cli/squad/scripts/generate_attico_brera_dwg.py +369 -0
  88. lovarch_cli/squad/scripts/generate_chianti_dxf.py +368 -0
  89. lovarch_cli/squad/scripts/generate_chianti_images.py +223 -0
  90. lovarch_cli/squad/scripts/generate_real_sample_images.py +189 -0
  91. lovarch_cli/squad/scripts/generate_sample_assets.py +382 -0
  92. lovarch_cli/squad/scripts/lovarch_client.py +1046 -0
  93. lovarch_cli/squad/scripts/pipeline_runner.py +2095 -0
  94. lovarch_cli/squad/scripts/render_dxf_to_png.py +57 -0
  95. lovarch_cli/squad/scripts/run_palestra_demo.sh +277 -0
  96. lovarch_cli/squad/scripts/simulate_squad_execution.py +515 -0
  97. lovarch_cli/squad/scripts/validate-squad.py +383 -0
  98. lovarch_cli/squad/tasks/audit-input.md +146 -0
  99. lovarch_cli/squad/tasks/compute-metric.md +105 -0
  100. lovarch_cli/squad/tasks/consolidate-dossier.md +187 -0
  101. lovarch_cli/squad/tasks/generate-cad-plan.md +120 -0
  102. lovarch_cli/squad/tasks/generate-ifc-model.md +108 -0
  103. lovarch_cli/squad/tasks/write-capitolato.md +100 -0
  104. lovarch_cli/squad/templates/asseverazione-tecnica.md +126 -0
  105. lovarch_cli/squad/templates/capitolato-uni-11337.md +235 -0
  106. lovarch_cli/squad/templates/cila-comune-milano.md +177 -0
  107. lovarch_cli/squad/templates/contratto-cnappc.md +220 -0
  108. lovarch_cli/squad/workflows/dal-brief-al-cantiere.yaml +218 -0
  109. lovarch_cli/squad_loader.py +114 -0
  110. lovarch_cli/verify/__init__.py +15 -0
  111. lovarch_cli/verify/contratto.py +110 -0
  112. lovarch_cli/verify/dossier.py +97 -0
  113. lovarch_cli/verify/misure.py +83 -0
  114. lovarch_cli/verify/normativa.py +178 -0
  115. lovarch_cli/version.py +13 -0
  116. lovarch_cli/workflows/__init__.py +9 -0
  117. lovarch_cli/workflows/platform.py +212 -0
  118. lovarch_cli-0.2.1.dist-info/METADATA +232 -0
  119. lovarch_cli-0.2.1.dist-info/RECORD +122 -0
  120. lovarch_cli-0.2.1.dist-info/WHEEL +4 -0
  121. lovarch_cli-0.2.1.dist-info/entry_points.txt +3 -0
  122. lovarch_cli-0.2.1.dist-info/licenses/LICENSE +38 -0
@@ -0,0 +1,139 @@
1
+ # Checklist · @quality-misure
2
+
3
+ > **24 items** · 5 CRITICI + 11 SECONDARI + 8 MINORI · Tolleranza ±1 mm
4
+
5
+ ## Soglia PASS
6
+ - 100% CRITICI passano
7
+ - ≥80% SECONDARI passano (almeno 9/11)
8
+ - ≥50% MINORI passano (almeno 4/8)
9
+
10
+ Se anche 1 CRITICO fallisce → **REJECT**.
11
+
12
+ ---
13
+
14
+ ## 🔴 CRITICI (5)
15
+
16
+ ### C1 · Somma quote orizzontali = larghezza totale parete
17
+ **Verifica:** Per ogni parete in `pianta-progetto.dxf`, somma delle quote orizzontali = lunghezza totale dichiarata.
18
+ **Tolleranza:** ±1 mm
19
+ **Source di verità:** geometria DXF
20
+ **Fail action:** REJECT → @cad-engineer
21
+
22
+ ### C2 · Somma quote verticali = altezza totale parete
23
+ **Verifica:** Per ogni sezione, somma delle quote verticali = altezza totale.
24
+ **Tolleranza:** ±1 mm
25
+ **Fail action:** REJECT → @cad-engineer
26
+
27
+ ### C3 · Sup. utile = somma sup. ambienti
28
+ **Verifica:** `superficie_utile_totale` in `schema-quotato.json` = somma di `ambienti[i].superficie_m2`.
29
+ **Tolleranza:** ±0.5%
30
+ **Fail action:** REJECT → @cad-engineer + @bim-engineer
31
+
32
+ ### C4 · Sup. lorda = sup. utile + sup. murature
33
+ **Verifica:** `superficie_lorda` = `superficie_utile` + `muratura_m2`.
34
+ **Tolleranza:** ±0.5%
35
+ **Fail action:** REJECT → @cad-engineer
36
+
37
+ ### C5 · Volume ambienti = sup × altezza
38
+ **Verifica:** Per ogni ambiente: `volume_m3` = `superficie_m2 × altezza_m`.
39
+ **Tolleranza:** ±0.1 m³
40
+ **Fail action:** REJECT → @bim-engineer
41
+
42
+ ---
43
+
44
+ ## 🟡 SECONDARI (11) · ≥80% (9/11)
45
+
46
+ ### S1 · Spessore pareti UNI 8290
47
+ Pareti devono essere multipli di 8/10/12/15/25 cm.
48
+
49
+ ### S2 · Larghezza minima passaggi
50
+ Tutti i passaggi/corridoi ≥ 80 cm (regolamento igienico Milano).
51
+
52
+ ### S3 · Altezza minima ambienti residenziali
53
+ Tutti gli ambienti abitabili ≥ 270 cm Milano (RE Milano art. 38).
54
+ **Eccezione:** ambienti accessori (ripostigli) ≥ 240 cm.
55
+
56
+ ### S4 · Sup. minima camera singola
57
+ ≥ 9 m².
58
+
59
+ ### S5 · Sup. minima camera doppia
60
+ ≥ 14 m².
61
+
62
+ ### S6 · Sup. cucina
63
+ ≥ 9 m² (cucina autonoma) **oppure** angolo cottura ≥ 4 m² in living open-space.
64
+
65
+ ### S7 · Bagno aerazione
66
+ Almeno 1 finestra **oppure** sistema VMC dichiarato.
67
+
68
+ ### S8 · RAI (Rapporto Aero-Illuminante)
69
+ Sup. finestre ≥ 1/8 sup. pavimento per ogni ambiente abitabile (DM 5/7/1975).
70
+
71
+ ### S9 · Quote in DXF leggibili
72
+ Text height ≥ 2.5mm in scala plot 1:50.
73
+
74
+ ### S10 · Layer DXF segue ISO standard
75
+ Layer presenti: `CAD-A-WALL`, `CAD-A-DIM`, `CAD-A-DOOR`, `CAD-A-WIND`, `CAD-A-TEXT`, `CAD-A-SYMB`.
76
+
77
+ ### S11 · Cartiglio CNAPPC compilato
78
+ Tutti i campi: architetto, n. Ordine, cliente, progetto, scala, data, fase, tavola.
79
+
80
+ ---
81
+
82
+ ## 🟢 MINORI (8) · ≥50% (4/8)
83
+
84
+ ### M1 · Scala grafica presente
85
+ Indicata 1:50 o 1:100 in tavola.
86
+
87
+ ### M2 · Nord magnetico indicato
88
+ Simbolo nord visibile in pianta.
89
+
90
+ ### M3 · Nomi ambienti scritti
91
+ Ogni ambiente ha label testuale leggibile.
92
+
93
+ ### M4 · Schede ambienti coerenti
94
+ Schede dettaglio ambienti coerenti con planimetria principale.
95
+
96
+ ### M5 · Stato attuale vs progetto in 2 layer separati
97
+ Possibilità di toggle visualizzazione stato attuale / progetto.
98
+
99
+ ### M6 · Sezioni AA/BB con riferimenti in pianta
100
+ Tracce di sezione in pianta con etichette AA, BB.
101
+
102
+ ### M7 · Prospetti con altezze fronte e aperture
103
+ Prospetti includono quote verticali principali.
104
+
105
+ ### M8 · Modello IFC volumi coerenti con DXF
106
+ Volumi calcolati da IFC differiscono da DXF di ≤ 2%.
107
+
108
+ ---
109
+
110
+ ## Output JSON format
111
+
112
+ ```json
113
+ {
114
+ "qa_agent": "@quality-misure",
115
+ "execution_id": "uuid",
116
+ "verdict": "PASS" | "REJECT",
117
+ "score": {
118
+ "critical": "5/5",
119
+ "secondary": "9/11",
120
+ "minor": "6/8",
121
+ "total": "20/24"
122
+ },
123
+ "items": [
124
+ {
125
+ "id": "C1",
126
+ "severity": "CRITICO",
127
+ "description": "Somma quote orizzontali = larghezza totale parete",
128
+ "result": true,
129
+ "expected": "245.0 cm",
130
+ "actual": "245.0 cm",
131
+ "tolerance": "±1mm",
132
+ "file": "pianta-progetto.dxf",
133
+ "wall_id": "WALL-N-01"
134
+ }
135
+ ],
136
+ "reject_target_agents": ["@cad-engineer"],
137
+ "reject_summary": "Sup. utile differente sup. somma ambienti di 0.5 m². Cota Q12 errata."
138
+ }
139
+ ```
@@ -0,0 +1,121 @@
1
+ # Checklist · @quality-normativa
2
+
3
+ > **18 items** · 6 CRITICI + 7 SECONDARI + 5 MINORI
4
+
5
+ ## Soglia PASS
6
+ - 100% CRITICI passano (6/6)
7
+ - ≥80% SECONDARI passano (almeno 6/7)
8
+ - ≥50% MINORI passano (almeno 3/5)
9
+
10
+ ---
11
+
12
+ ## 🔴 CRITICI (6) · 100% obbligatorio
13
+
14
+ ### N-C1 · Tipo pratica corretto per intervento
15
+ **Verifica:** `tipo_pratica` in `tipo-pratica.json` corrisponde all'intervento descritto.
16
+ - Ristrutturazione interna senza prospetti né strutturali → **CILA**
17
+ - Modifiche prospetti **o** strutturali leggere → **SCIA**
18
+ - Demolizione + ricostruzione **o** ampliamento volumi → **SCIA alternativa o PdC**
19
+ **Fail action:** REJECT → @regolatorio-it
20
+
21
+ ### N-C2 · Articoli DPR 380 citati esistono e si applicano
22
+ **Verifica:** Cross-check con Normattiva XML cached. Articolo cited deve esistere E essere in vigore E applicarsi al caso.
23
+ **Fail action:** REJECT → @regolatorio-it + @capitolato-writer
24
+
25
+ ### N-C3 · Aut. paesaggistica considerata se zona vincolata
26
+ **Verifica:** Se Zona A1 PGT Milano OR vincolo paesaggistico/monumentale → autorizzazione paesaggistica DPR 31/2017 deve essere documentata.
27
+ **Fail action:** REJECT → @regolatorio-it + @pratiche-it
28
+
29
+ ### N-C4 · CAM Edilizia 2025 voci rispettate ≥80%
30
+ **Verifica:** In `lista-CAM-rispettati.xlsx`, almeno 80% voci CAM applicabili (DM 23/06/2022 + agg. 2024) sono rispettate. Voci minimum:
31
+ - Calcestruzzo ≥15% riciclato
32
+ - Laterizio ≥30% riciclato
33
+ - Demolizione selettiva ≥70% recupero
34
+ - Legno FSC/PEFC certificato
35
+ - Isolanti con DAP/EPD
36
+ **Fail action:** REJECT → @capitolato-writer
37
+
38
+ ### N-C5 · NTC 2018 cap 8 corretto
39
+ **Verifica:** Classificazione intervento secondo NTC 2018 cap 8:
40
+ - 8.4.1 Riparazione/locale → solo verifica locale
41
+ - 8.4.2 Miglioramento → valutazione sismica obbligatoria
42
+ - 8.4.3 Adeguamento → calcolo strutturale completo
43
+
44
+ Per ristrutturazione interna senza opere strutturali: 8.4.1 OK.
45
+ **Fail action:** REJECT → @regolatorio-it
46
+
47
+ ### N-C6 · CSP/CSE valutato
48
+ **Verifica:** Se ≥2 imprese OR durata >200 g/uomo → CSP/CSE obbligatori (D.Lgs 81/2008).
49
+ Documento deve menzionare: "CSP/CSE necessario" e indicare nome professionista o "da nominare".
50
+ **Fail action:** REJECT → @regolatorio-it + @capitolato-writer
51
+
52
+ ---
53
+
54
+ ## 🟡 SECONDARI (7) · ≥80%
55
+
56
+ ### N-S1 · Onorari ≥ parametri DM 17/06/2016 (L.49/2023)
57
+ Verifica calcolo onorari rispetta parametri ministeriali equo compenso.
58
+
59
+ ### N-S2 · Vincoli PRG Milano Zona A1 rispettati
60
+ Se zona A1 NAF: divieto modifica facciata, conservazione tipologica, materiali tradizionali.
61
+
62
+ ### N-S3 · UNI 11337 LOIN 300 verificato in IFC
63
+ Property sets ISO 12006-3 presenti, classificazione UniFormat/Uniclass.
64
+
65
+ ### N-S4 · Bonus edilizi 2026 corretti
66
+ - No Superbonus (cessato per privati)
67
+ - Bonus Ristrutturazione 36% prima casa, 30% seconda
68
+ - Ecobonus 50% prima, 36% seconda
69
+ - Sismabonus 50%/36%
70
+
71
+ ### N-S5 · IVA edilizia 10% ristrutturazione
72
+ Documenti finanziari includono IVA al 10% (non 22%) per opere di ristrutturazione DPR 633/72.
73
+
74
+ ### N-S6 · Privacy GDPR clausole presenti
75
+ Informativa privacy include: titolare, finalità, base giuridica, conservazione, diritti, DPO se applicabile.
76
+
77
+ ### N-S7 · Antiriciclaggio D.Lgs 231/2007 menzione obbligatoria
78
+ Contratto include clausola antiriciclaggio (D.Lgs 231/2007).
79
+
80
+ ---
81
+
82
+ ## 🟢 MINORI (5) · ≥50%
83
+
84
+ ### N-M1 · Polizza RC professionale citata
85
+ Contratto menziona polizza RC architetto.
86
+
87
+ ### N-M2 · Foro competente
88
+ Foro identificato (es. Foro di Milano).
89
+
90
+ ### N-M3 · Mediazione obbligatoria
91
+ D.Lgs 28/2010: clausola mediazione preventiva obbligatoria.
92
+
93
+ ### N-M4 · Citazioni con link Normattiva
94
+ Articoli cited hanno link/URL a Normattiva.it dove possibile.
95
+
96
+ ### N-M5 · Banner aggiornamento
97
+ Documenti regolatori hanno banner "Ultimo aggiornamento DD/MM/2026".
98
+
99
+ ---
100
+
101
+ ## Output JSON
102
+
103
+ ```json
104
+ {
105
+ "qa_agent": "@quality-normativa",
106
+ "verdict": "PASS" | "REJECT",
107
+ "score": { "critical": "6/6", "secondary": "6/7", "minor": "4/5" },
108
+ "items": [
109
+ {
110
+ "id": "N-C2",
111
+ "severity": "CRITICO",
112
+ "result": false,
113
+ "issue": "DPR 380 art. 88 cited but article does not exist",
114
+ "verified_against": "Normattiva XML 2026-06-01",
115
+ "file": "analisi-regolamentare.pdf",
116
+ "page": 3
117
+ }
118
+ ],
119
+ "reject_target_agents": ["@regolatorio-it"]
120
+ }
121
+ ```
@@ -0,0 +1,116 @@
1
+ # Checklist · @quality-output
2
+
3
+ > **14 items** · 6 CRITICI + 5 SECONDARI + 3 MINORI · Completezza + leggibilità
4
+
5
+ ## Soglia PASS
6
+ - 100% CRITICI passano (6/6)
7
+ - ≥80% SECONDARI passano (almeno 4/5)
8
+ - ≥50% MINORI passano (almeno 2/3)
9
+
10
+ ---
11
+
12
+ ## 🔴 CRITICI (6)
13
+
14
+ ### O-C1 · 25+ deliverable presenti
15
+ **Verifica:** Counting di tutti i file nelle cartelle 01- → 08-. Deve essere ≥25.
16
+ **Lista minima attesa:**
17
+ - 01-briefing/ (3 files)
18
+ - 02-concept/ (>15 files: 9 moodboard + 6 render + 4 doc)
19
+ - 03-progetto-definitivo/ (5 files)
20
+ - 04-pratiche-comune/ (4-6 files)
21
+ - 05-impresa/ (5 files + DOSSIER.zip)
22
+ - 06-ingegneri/ (3-5 files)
23
+ - 07-cliente/ (5 files)
24
+ - 08-studio-interno/ (4-5 files)
25
+ **Fail action:** REJECT → @deliverable-builder + agenti specifici mancanti
26
+
27
+ ### O-C2 · Ogni PDF apre senza errore
28
+ **Verifica:** Per ogni .pdf, `pypdf.PdfReader(file)` non solleva eccezione e `extract_text()` su prima pagina restituisce contenuto non vuoto.
29
+ **Fail action:** REJECT → agente che ha generato il PDF
30
+
31
+ ### O-C3 · DXF aprono in QCAD/AutoCAD
32
+ **Verifica:** `ezdxf.readfile(file)` parsing successful. Documento ha entities.
33
+ **Fail action:** REJECT → @cad-engineer
34
+
35
+ ### O-C4 · IFC valido
36
+ **Verifica:** `ifcopenshell.validate(file)` returns no critical errors.
37
+ **Fail action:** REJECT → @bim-engineer
38
+
39
+ ### O-C5 · XLSX aprono
40
+ **Verifica:** `openpyxl.load_workbook(file)` succeed. File contiene worksheet con dati.
41
+ **Fail action:** REJECT → @computo-engineer + @capitolato-writer
42
+
43
+ ### O-C6 · File uploaded → Lovarch pm_documents
44
+ **Verifica:** Per ogni file in cartella locale, verificar (a) row in `pm_documents` esiste con SHA256 corrispondente, (b) `public_url` accessibile (HTTP 200).
45
+ **Fail action:** REJECT → @progetto-chief (responsabile upload)
46
+
47
+ ---
48
+
49
+ ## 🟡 SECONDARI (5) · ≥80%
50
+
51
+ ### O-S1 · Naming convention
52
+ Pattern `NN-categoria-nome.ext` (es. `01-briefing-strutturato.pdf`).
53
+
54
+ ### O-S2 · Dimensione PDF tavole ≤ 50 MB
55
+ Tavole tecniche compresse correttamente.
56
+
57
+ ### O-S3 · Render PNG ≥ 4K resolution
58
+ Almeno 3840×2160. Nessun render < 1920×1080 nel deliverable cliente.
59
+
60
+ ### O-S4 · Portal URL accessibile
61
+ GET HTTP del portale cliente returns 200 + HTML válido (contains expected metatags).
62
+
63
+ ### O-S5 · Presentazione HTML responsive mobile
64
+ Test viewport 375×812 (iPhone): no horizontal scroll, fonts ≥14px, buttons ≥44px.
65
+
66
+ ---
67
+
68
+ ## 🟢 MINORI (3) · ≥50%
69
+
70
+ ### O-M1 · README.md indice generato
71
+ File `README.md` in root cartella con tabella di tutti i deliverable + descrizione.
72
+
73
+ ### O-M2 · Git commit con tag versione
74
+ Commit creato con tag `squad-v1.0-{timestamp}` o simile.
75
+
76
+ ### O-M3 · Manifest.json con SHA256
77
+ File `manifest.json` con `{ "files": [{ "path": "...", "sha256": "...", "size": ... }] }`.
78
+
79
+ ---
80
+
81
+ ## Output JSON
82
+
83
+ ```json
84
+ {
85
+ "qa_agent": "@quality-output",
86
+ "verdict": "PASS" | "REJECT",
87
+ "score": { "critical": "6/6", "secondary": "5/5", "minor": "3/3" },
88
+ "items": [
89
+ {
90
+ "id": "O-C1",
91
+ "severity": "CRITICO",
92
+ "description": "25+ deliverable presenti",
93
+ "result": true,
94
+ "actual_count": 27,
95
+ "expected_minimum": 25
96
+ },
97
+ {
98
+ "id": "O-C2",
99
+ "severity": "CRITICO",
100
+ "description": "PDF integrità",
101
+ "result": false,
102
+ "files_checked": 18,
103
+ "files_failed": [
104
+ { "file": "07-cliente/contratto-servizi.pdf", "error": "extract_text returned empty" }
105
+ ],
106
+ "reject_target": "@contratto-architect"
107
+ }
108
+ ],
109
+ "summary": {
110
+ "total_files": 27,
111
+ "total_size_mb": 38.4,
112
+ "lovarch_synced": true,
113
+ "git_commit": "a3f8b2e"
114
+ }
115
+ }
116
+ ```