Skip to content

Commit 9d49c2a

Browse files
maxaloneclaude
andcommitted
feat: incorpora l'ancoraggio dogfooding nel calcolo numerico di Integrità
score.mjs calcola ora la quota di bundle mensili committati in snapshots/anchors/ rispetto ai mesi trascorsi da GTF_BIRTH_MONTH (2026-07), e la combina in media con la sonda HMAC del worker. Resta fuori portata solo il terzo componente (quota release taggate). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1 parent 8489492 commit 9d49c2a

4 files changed

Lines changed: 45 additions & 22 deletions

File tree

generators/score.mjs

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import { ROOT, loadRegistry, byFolder } from "./lib/registry.mjs";
44

55
const SITE_DIR = join(ROOT, "site");
66
const SNAPSHOTS_DIR = join(ROOT, "snapshots");
7+
const ANCHORS_DIR = join(SNAPSHOTS_DIR, "anchors");
8+
9+
// Mese di nascita del GTF (ARCHITECTURE.md): da qui parte l'attesa di un
10+
// ancoraggio dogfooding al mese (CTL-dogfooding-anchor).
11+
const GTF_BIRTH_MONTH = "2026-07";
712

813
// Legge l'ultimo snapshot settimanale del collettore (generators/collect-evidence.mjs),
914
// se esiste, per il solo componente "worker" (sonda HMAC) di /api/status.
@@ -40,6 +45,17 @@ function pct(numerator, denominator) {
4045
return Math.round((numerator / denominator) * 100);
4146
}
4247

48+
// Quota di ancoraggi dogfooding mensili riusciti su quelli attesi da quando
49+
// il GTF esiste (un bundle <YYYY-MM>-bundle.json committato = un mese onorato).
50+
function dogfoodingAnchorRatio() {
51+
if (!existsSync(ANCHORS_DIR)) return { ratio: null, done: 0, expected: 0 };
52+
const done = readdirSync(ANCHORS_DIR).filter((f) => /^\d{4}-\d{2}-bundle\.json$/.test(f)).length;
53+
const [birthYear, birthMonth] = GTF_BIRTH_MONTH.split("-").map(Number);
54+
const now = new Date();
55+
const expected = (now.getUTCFullYear() - birthYear) * 12 + (now.getUTCMonth() + 1 - birthMonth) + 1;
56+
return { ratio: pct(Math.min(done, expected), expected), done, expected };
57+
}
58+
4359
function computeIndicators(records) {
4460
const all = [...records.values()].map((r) => r.record);
4561
const ctl = byFolder(records, "controls");
@@ -73,14 +89,23 @@ function computeIndicators(records) {
7389
// Riproducibilità: stesso segnale del secondo termine di Trasparenza (limite dichiarato in MET-reproducibility)
7490
const reproducibility = pctCtlVerify;
7591

76-
// Integrità: parziale, solo componente "worker" (sonda HMAC) dell'ultimo snapshot
77-
// raccolto — non include ancora storico release taggate né esito ancore OTS mensili.
92+
// Integrità: media dei componenti disponibili tra sonda HMAC (ultimo snapshot
93+
// settimanale) e quota di ancoraggi dogfooding mensili onorati da quando il
94+
// GTF esiste — manca ancora lo storico delle release taggate (terzo componente
95+
// dichiarato in MET-integrity.yaml).
7896
const snap = latestSnapshotWorkerStatus();
7997
const WORKER_SCORE = { ok: 100, degraded: 50, down: 0 };
80-
const integrity = snap ? WORKER_SCORE[snap.worker] ?? null : null;
81-
const integrityNote = snap
82-
? `parziale: solo sonda HMAC (componente "worker", snapshot ${snap.week}) — non ancora storico release taggate; il primo ancoraggio dogfooding mensile esiste (CTL-dogfooding-anchor) ma non è ancora incorporato nel calcolo`
83-
: "richiede almeno uno snapshot dal collettore di evidenze (non ancora raccolto)";
98+
const workerComponent = snap ? WORKER_SCORE[snap.worker] ?? null : null;
99+
const anchor = dogfoodingAnchorRatio();
100+
const integrityComponents = [workerComponent, anchor.ratio].filter((v) => v !== null);
101+
const integrity =
102+
integrityComponents.length > 0
103+
? Math.round(integrityComponents.reduce((a, b) => a + b, 0) / integrityComponents.length)
104+
: null;
105+
const integrityNote =
106+
integrityComponents.length > 0
107+
? `parziale: sonda HMAC (${snap ? `componente "worker", snapshot ${snap.week}` : "nessuno snapshot"}) + ancoraggi dogfooding onorati (${anchor.done}/${anchor.expected} mesi da ${GTF_BIRTH_MONTH}) — manca ancora lo storico delle release taggate`
108+
: "richiede almeno uno snapshot dal collettore di evidenze o un ancoraggio dogfooding (nessuno dei due ancora raccolto)";
84109

85110
return [
86111
{ id: "MET-transparency", label: "Trasparenza", value: transparency },

registry/metrics/MET-integrity.yaml

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,15 @@ id: MET-integrity
22
title: Integrità
33
formula: >
44
Combinazione di: esito della sonda HMAC interna (da /api/status), quota
5-
di release con tag git, quota di ancore OpenTimestamps mensili riuscite
6-
su attese. Dal collettore di evidenze (generators/collect-evidence.mjs,
7-
settimanale) è calcolabile il solo primo componente: il valore del campo
8-
"worker" dell'ultimo snapshot (ok=100, degraded=50, down=0). Il terzo
9-
componente ha ora un primo dato reale (CTL-dogfooding-anchor, primo
10-
ancoraggio periodo 2026-07 — vedi EVD-dogfooding-anchor), ma score.mjs
11-
non lo legge ancora nel calcolo: resta da definire quale sia il
12-
denominatore "atteso" (mesi dalla nascita del GTF) prima di incorporarlo.
13-
Il secondo componente resta fuori portata — nessuno storico di release
14-
taggate esiste ancora. Il valore mostrato è quindi tuttora dichiaratamente
15-
parziale (contrassegnato con un asterisco nel Trust Center), non l'intero
16-
indicatore descritto in GTF-ARCH §8.2.
17-
unit: "0-100 (parziale) oppure n/d se nessuno snapshot esiste ancora"
5+
di release con tag git, quota di ancore OpenTimestamps mensili dogfooding
6+
riuscite su attese. score.mjs calcola la media dei componenti disponibili:
7+
il campo "worker" dell'ultimo snapshot settimanale (ok=100, degraded=50,
8+
down=0) e la quota di bundle mensili committati in snapshots/anchors/
9+
rispetto ai mesi trascorsi da GTF_BIRTH_MONTH (2026-07, un bundle onorato
10+
= un mese). Il terzo componente — quota di release con tag git — resta
11+
fuori portata: nessuno storico di release taggate esiste ancora. Il
12+
valore mostrato è quindi tuttora dichiaratamente parziale (contrassegnato
13+
con un asterisco nel Trust Center), non l'intero indicatore descritto in
14+
GTF-ARCH §8.2.
15+
unit: "0-100 (parziale) oppure n/d se non esiste né uno snapshot né un ancoraggio"
1816
visibility: public

site/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ <h1>Il registro della fiducia di Spazio Genesi ETS</h1>
129129
<table class="ledger-table">
130130
<tbody>
131131
<tr class="is-counted"><td class="ledger-label">Trasparenza</td><td class="ledger-value">95</td></tr>
132-
<tr class="is-counted is-partial" title="parziale: solo sonda HMAC (componente &quot;worker&quot;, snapshot 2026-W28) — non ancora storico release taggate; il primo ancoraggio dogfooding mensile esiste (CTL-dogfooding-anchor) ma non è ancora incorporato nel calcolo"><td class="ledger-label">Integrità *</td><td class="ledger-value">100</td></tr>
132+
<tr class="is-counted is-partial" title="parziale: sonda HMAC (componente &quot;worker&quot;, snapshot 2026-W28) + ancoraggi dogfooding onorati (1/1 mesi da 2026-07) — manca ancora lo storico delle release taggate"><td class="ledger-label">Integrità *</td><td class="ledger-value">100</td></tr>
133133
<tr class="is-counted"><td class="ledger-label">Tracciabilità</td><td class="ledger-value">100</td></tr>
134134
<tr class="is-counted"><td class="ledger-label">Documentazione</td><td class="ledger-value">100</td></tr>
135135
<tr class="is-counted"><td class="ledger-label">Automazione</td><td class="ledger-value">71</td></tr>

site/score.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"id": "MET-integrity",
1313
"label": "Integrità",
1414
"value": 100,
15-
"note": "parziale: solo sonda HMAC (componente \"worker\", snapshot 2026-W28) — non ancora storico release taggate; il primo ancoraggio dogfooding mensile esiste (CTL-dogfooding-anchor) ma non è ancora incorporato nel calcolo"
15+
"note": "parziale: sonda HMAC (componente \"worker\", snapshot 2026-W28) + ancoraggi dogfooding onorati (1/1 mesi da 2026-07) — manca ancora lo storico delle release taggate"
1616
},
1717
{
1818
"id": "MET-traceability",
@@ -59,5 +59,5 @@
5959
"note": "richiede dati GitHub, score v0 lavora solo offline dal registro"
6060
}
6161
],
62-
"computed_at": "2026-07-09T15:44:15.120Z"
62+
"computed_at": "2026-07-09T15:55:21.356Z"
6363
}

0 commit comments

Comments
 (0)