Skip to content

Commit f409021

Browse files
maxaloneclaude
andcommitted
registro: ADR-P41 — versione inglese, la lingua è resa e mai un fatto attestato
Decisione registrata a P41 chiuso (imgauth 1.33.0, authweb 1.31.0 in produzione). Il cuore dell'ADR è l'invariante che ha vincolato tutto il piano: lang non entra mai in hmacMessage — legare la lingua alla firma invaliderebbe la verifica di tutti i certificati già emessi senza aggiungere alcuna garanzia, perché la lingua non è un fatto sull'opera. Verificato in modo diretto, non assunto: stesso token valido in entrambe le lingue, /api/verify senza parametro lang, certificati pre-P41 intatti. Registrate anche le due scelte di trasparenza (privacy EN dichiarata traduzione di cortesia con l'italiana che fa fede, art. 12 GDPR; nessun rilevamento automatico di lingua né redirect) e la guardia CI contro la divergenza fra le due versioni. Nessun affects (nessun controllo del registro è toccato), nessun nuovo RSK/CTL: contratto additivo, nessun endpoint/dato/trattamento nuovo, il modello di minaccia non cambia. 228 record, 0 errori, score invariato 92/100 (10/10 indicatori) — coerente: nessun controllo nuovo, nessun indicatore nuovo. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent db420fe commit f409021

3 files changed

Lines changed: 93 additions & 5 deletions

File tree

registry/decisions/ADR-P41.yaml

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
id: ADR-P41
2+
title: "P41 — Versione inglese del servizio: la lingua è resa, mai un fatto attestato"
3+
date: 2026-07-24
4+
status: accepted
5+
context: >
6+
Il servizio è nato interamente in italiano, ma i suoi canali programmabili
7+
(pacchetto npm, MCP Registry, GitHub Action, repository pubblici) sono per
8+
natura internazionali: chi arriva da lì incontrava documentazione, pagine
9+
pubbliche e certificati in una lingua che spesso non legge. Rendere il
10+
servizio bilingue tocca però superfici molto diverse per rischio — pagine
11+
statiche, pagine generate dal Worker, messaggi d'errore dell'API e, la più
12+
delicata, il contenuto del certificato PDF, cioè l'artefatto probatorio.
13+
decision: >
14+
Scopo **MVP** deliberato: il sito resta italiano, con un percorso inglese
15+
**completo** per chi arriva dal canale programmabile — sei pagine (home,
16+
fasce e condizioni, pagina sviluppatori e le sue due sottopagine chiave API
17+
e CLI, informativa privacy) duplicate sotto `/en/`, più le due pagine HTML
18+
servite dal Worker (`/c/<sha256>`, `/agent/authorize`) e i messaggi d'errore
19+
di `/api/hash` e `/api/cert-pdf` via campo facoltativo `lang` (fallback
20+
`Accept-Language`). Restano fuori le pagine che riguardano chi è già dentro
21+
(profilo, stato, sicurezza, vetrina, changelog) e lo storico: si estendono
22+
una pagina per volta, sulla stessa infrastruttura.
23+
24+
**L'invariante che regge tutto il piano: `lang` non entra mai in
25+
`hmacMessage`.** Il messaggio firmato resta l'attestazione più gli eventuali
26+
metadati dichiarati in forma canonica, identico a prima di P41. La lingua è
27+
una scelta di **resa**, non un fatto sull'opera: legarla alla firma
28+
invaliderebbe in un colpo solo la verifica di tutti i certificati già
29+
emessi, senza aggiungere alcuna garanzia. Verificato in modo diretto, non
30+
assunto: la stessa coppia attestazione+HMAC produce il certificato in
31+
entrambe le lingue, `/api/verify` (che non ha né deve avere un parametro
32+
`lang`) risponde `hmac_valido: true` in entrambi i casi, e un certificato
33+
pre-P41 resta verificabile senza eccezioni.
34+
35+
Due scelte di trasparenza, non di comodità. **(1)** L'informativa privacy
36+
inglese è dichiarata in testa alla pagina come **traduzione di cortesia**,
37+
con la versione italiana che fa fede: chi arriva dal canale inglese incontra
38+
il flusso OAuth self-service, e servirgli l'informativa solo in italiano era
39+
una debolezza reale rispetto all'art. 12 GDPR — ma tradurre un testo con
40+
effetti giuridici senza revisione legale non lo rende ufficiale, e dirlo è
41+
più onesto che lasciarlo intendere. **(2)** Nessun rilevamento automatico
42+
della lingua e nessun reindirizzamento: solo un selettore visibile. La
43+
lingua la sceglie chi legge.
44+
45+
Contro il rischio di divergenza fra le due versioni — la lezione delle
46+
pagine parallele che il progetto ha già pagato una volta — una guardia di
47+
CI obbligatoria: un registro delle coppie con l'impronta SHA-256 del file
48+
italiano al momento della traduzione, e un workflow che fallisce se
49+
l'italiano cambia senza che l'inglese sia stato aggiornato. Nessuno step di
50+
build: le pagine EN sono file statici, come le italiane.
51+
52+
Corollari di perimetro accettati per l'MVP: le etichette AcroForm del
53+
template PDF restano italiane anche nel certificato inglese (sono grafica
54+
del template: tradurle significherebbe un secondo template da mantenere e
55+
riverificare nelle coordinate), quindi il certificato EN è misto; il QR e
56+
l'URL di verifica stampati nel PDF restano invariati per lingua e puntano
57+
alla stessa pagina canonica, che si apre nella lingua chiesta da chi la
58+
visita, non da chi ha emesso.
59+
consequences: >
60+
Il contratto API cambia in modo **puramente additivo**: senza il campo
61+
`lang` ogni risposta, ogni pagina e ogni PDF restano bit-identici a prima —
62+
criterio di accettazione verificato, non dichiarato. Nessun endpoint nuovo,
63+
nessun dato nuovo, nessun trattamento nuovo: l'informativa è stata
64+
**tradotta**, non estesa, e nessuna nuova categoria di interessati compare.
65+
Per questo P41 non introduce alcun rischio né alcun controllo nuovo nel
66+
registro: la lingua non cambia il modello di minaccia, e l'unica superficie
67+
sensibile — il messaggio firmato — è esplicitamente fuori dal suo raggio.
68+
69+
Rilasciato in due tempi per una ragione strutturale, non per una svista: il
70+
sito statico non ha un gate di produzione separato (pubblica al push), il
71+
Worker sì (approvazione umana). Le pagine inglesi sono quindi andate live
72+
prima del motore bilingue; nessuna dipendenza fra le due parti, verificato
73+
prima di procedere. Il deploy del Worker (imgauth 1.33.0) è passato dalla
74+
pipeline con gate approvato dal gestore, come ogni rilascio di produzione.
75+
76+
Il criterio per decidere se estendere lo scopo — altre pagine, altre lingue
77+
— è misurabile e già fissato: il traffico reale sulle pagine `/en/` nelle
78+
settimane successive. Se non si materializza, l'estensione non si fa.
79+
visibility: public

site/index.html

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ <h1>Il registro della fiducia di Spazio Genesi ETS</h1>
139139
<tr class="is-counted"><td class="ledger-label">Tracciabilità</td><td class="ledger-value">100</td></tr>
140140
<tr class="is-counted"><td class="ledger-label">Documentazione</td><td class="ledger-value">100</td></tr>
141141
<tr class="is-counted"><td class="ledger-label">Automazione</td><td class="ledger-value">63</td></tr>
142-
<tr class="is-counted is-partial" title="revisione: ultima il 2026-07-19 (4/90 giorni); ACT: nessuna ancora risolta"><td class="ledger-label">Audit *</td><td class="ledger-value">100</td></tr>
143-
<tr class="is-counted is-partial" title="snapshot 3/8 settimane + drill: riuscito il 2026-07-19 (4 giorni fa)"><td class="ledger-label">Conservazione *</td><td class="ledger-value">69</td></tr>
142+
<tr class="is-counted is-partial" title="revisione: ultima il 2026-07-19 (5/90 giorni); ACT: nessuna ancora risolta"><td class="ledger-label">Audit *</td><td class="ledger-value">100</td></tr>
143+
<tr class="is-counted is-partial" title="snapshot 3/8 settimane + drill: riuscito il 2026-07-19 (5 giorni fa)"><td class="ledger-label">Conservazione *</td><td class="ledger-value">69</td></tr>
144144
<tr class="is-counted"><td class="ledger-label">Riproducibilità</td><td class="ledger-value">97</td></tr>
145145
<tr class="is-counted is-partial" title="scanner su imgauth@v1.24.0: 10/10 flussi mappati a un DAT (4 falsi positivi dichiarati esclusi) — non copre repo client (es. bot Telegram)"><td class="ledger-label">Privacy *</td><td class="ledger-value">100</td></tr>
146146
<tr class="is-counted is-partial" title="validate 30/30 + gate 16/20 — quota PR esclusa (maintainer singolo, ADR-GTF-011)"><td class="ledger-label">Governance *</td><td class="ledger-value">90</td></tr>
@@ -689,6 +689,15 @@ <h3>Modifica deployata in produzione senza mai essere stata osservata &quot;dal
689689
<section id="decisioni" class="folio" data-folio="ADR">
690690
<h2>Decisioni</h2>
691691
<div class="journal">
692+
<details class="entry">
693+
<summary><span class="entry-date">2026-07-24</span><span class="entry-title">P41 — Versione inglese del servizio: la lingua è resa, mai un fatto attestato</span><span class="entry-status">accepted</span></summary>
694+
<div class="entry-body">
695+
<p>Il servizio è nato interamente in italiano, ma i suoi canali programmabili (pacchetto npm, MCP Registry, GitHub Action, repository pubblici) sono per natura internazionali: chi arriva da lì incontrava documentazione, pagine pubbliche e certificati in una lingua che spesso non legge. Rendere il servizio bilingue tocca però superfici molto diverse per rischio — pagine statiche, pagine generate dal Worker, messaggi d'errore dell'API e, la più delicata, il contenuto del certificato PDF, cioè l'artefatto probatorio.</p>
696+
<p><strong>Decisione:</strong> Scopo **MVP** deliberato: il sito resta italiano, con un percorso inglese **completo** per chi arriva dal canale programmabile — sei pagine (home, fasce e condizioni, pagina sviluppatori e le sue due sottopagine chiave API e CLI, informativa privacy) duplicate sotto `/en/`, più le due pagine HTML servite dal Worker (`/c/&lt;sha256&gt;`, `/agent/authorize`) e i messaggi d'errore di `/api/hash` e `/api/cert-pdf` via campo facoltativo `lang` (fallback `Accept-Language`). Restano fuori le pagine che riguardano chi è già dentro (profilo, stato, sicurezza, vetrina, changelog) e lo storico: si estendono una pagina per volta, sulla stessa infrastruttura. **L'invariante che regge tutto il piano: `lang` non entra mai in `hmacMessage`.** Il messaggio firmato resta l'attestazione più gli eventuali metadati dichiarati in forma canonica, identico a prima di P41. La lingua è una scelta di **resa**, non un fatto sull'opera: legarla alla firma invaliderebbe in un colpo solo la verifica di tutti i certificati già emessi, senza aggiungere alcuna garanzia. Verificato in modo diretto, non assunto: la stessa coppia attestazione+HMAC produce il certificato in entrambe le lingue, `/api/verify` (che non ha né deve avere un parametro `lang`) risponde `hmac_valido: true` in entrambi i casi, e un certificato pre-P41 resta verificabile senza eccezioni. Due scelte di trasparenza, non di comodità. **(1)** L'informativa privacy inglese è dichiarata in testa alla pagina come **traduzione di cortesia**, con la versione italiana che fa fede: chi arriva dal canale inglese incontra il flusso OAuth self-service, e servirgli l'informativa solo in italiano era una debolezza reale rispetto all'art. 12 GDPR — ma tradurre un testo con effetti giuridici senza revisione legale non lo rende ufficiale, e dirlo è più onesto che lasciarlo intendere. **(2)** Nessun rilevamento automatico della lingua e nessun reindirizzamento: solo un selettore visibile. La lingua la sceglie chi legge. Contro il rischio di divergenza fra le due versioni — la lezione delle pagine parallele che il progetto ha già pagato una volta — una guardia di CI obbligatoria: un registro delle coppie con l'impronta SHA-256 del file italiano al momento della traduzione, e un workflow che fallisce se l'italiano cambia senza che l'inglese sia stato aggiornato. Nessuno step di build: le pagine EN sono file statici, come le italiane. Corollari di perimetro accettati per l'MVP: le etichette AcroForm del template PDF restano italiane anche nel certificato inglese (sono grafica del template: tradurle significherebbe un secondo template da mantenere e riverificare nelle coordinate), quindi il certificato EN è misto; il QR e l'URL di verifica stampati nel PDF restano invariati per lingua e puntano alla stessa pagina canonica, che si apre nella lingua chiesta da chi la visita, non da chi ha emesso.</p>
697+
<p><strong>Conseguenze:</strong> Il contratto API cambia in modo **puramente additivo**: senza il campo `lang` ogni risposta, ogni pagina e ogni PDF restano bit-identici a prima — criterio di accettazione verificato, non dichiarato. Nessun endpoint nuovo, nessun dato nuovo, nessun trattamento nuovo: l'informativa è stata **tradotta**, non estesa, e nessuna nuova categoria di interessati compare. Per questo P41 non introduce alcun rischio né alcun controllo nuovo nel registro: la lingua non cambia il modello di minaccia, e l'unica superficie sensibile — il messaggio firmato — è esplicitamente fuori dal suo raggio. Rilasciato in due tempi per una ragione strutturale, non per una svista: il sito statico non ha un gate di produzione separato (pubblica al push), il Worker sì (approvazione umana). Le pagine inglesi sono quindi andate live prima del motore bilingue; nessuna dipendenza fra le due parti, verificato prima di procedere. Il deploy del Worker (imgauth 1.33.0) è passato dalla pipeline con gate approvato dal gestore, come ogni rilascio di produzione. Il criterio per decidere se estendere lo scopo — altre pagine, altre lingue — è misurabile e già fissato: il traffico reale sulle pagine `/en/` nelle settimane successive. Se non si materializza, l'estensione non si fa.</p>
698+
<p class="tag-line"><span class="tag">ADR-P41</span></p>
699+
</div>
700+
</details>
692701
<details class="entry">
693702
<summary><span class="entry-date">2026-07-23</span><span class="entry-title">P40 — Eseguibili standalone della CLI sg-attest (Windows/macOS/Linux)</span><span class="entry-status">accepted</span></summary>
694703
<div class="entry-body">

site/score.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@
3333
"id": "MET-audit",
3434
"label": "Audit",
3535
"value": 100,
36-
"note": "revisione: ultima il 2026-07-19 (4/90 giorni); ACT: nessuna ancora risolta"
36+
"note": "revisione: ultima il 2026-07-19 (5/90 giorni); ACT: nessuna ancora risolta"
3737
},
3838
{
3939
"id": "MET-conservation",
4040
"label": "Conservazione",
4141
"value": 69,
42-
"note": "snapshot 3/8 settimane + drill: riuscito il 2026-07-19 (4 giorni fa)"
42+
"note": "snapshot 3/8 settimane + drill: riuscito il 2026-07-19 (5 giorni fa)"
4343
},
4444
{
4545
"id": "MET-reproducibility",
@@ -59,5 +59,5 @@
5959
"note": "validate 30/30 + gate 16/20 — quota PR esclusa (maintainer singolo, ADR-GTF-011)"
6060
}
6161
],
62-
"computed_at": "2026-07-23T10:05:53.935Z"
62+
"computed_at": "2026-07-24T12:31:19.655Z"
6363
}

0 commit comments

Comments
 (0)