You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Establish AICR's interim public evidence surface: a static, byte-deterministic GitHub Pages dashboard that visualizes corroboration across heterogeneous, signed sources (first-party / community / partner) for each recipe. In-repo pointers are per-source and add-only (recipes/evidence/<slug>/<source>/<bundle-digest>.yaml, #1347 Option A; source = verified signer, CODEOWNERS-scoped) — the community/partner contribution channel; first-party NVIDIA UAT ingests directly per run (no repo commit, avoiding churn). An AICR-owned CI job ORAS-mirrors the bundle, unpacks CTRF via MaterializeBundle, and verifies the signer (pinned issuer + in-tree allowlist) and OCI registry before counting — contributors never write the bucket. A deterministic tools/ Go generator computes a consensus model (CONFIRMED / SINGLE / CONTESTED / FAILING / UNTESTED, counting distinct verified signers, never builds) and emits a deterministic index.json + per-recipe series/*.json + a self-contained HTML/CSS/JS renderer that reads them (catalog overview → per-recipe consensus grid → per-cell source dot-strip by class → per-source drilldown; CSP-first nav; k8s + aicr-version facets), published via upload-pages-artifact + deploy-pages. Reuses the TestGrid epic's shared recipe→coordinate mapping and publish/ingest concepts; defers that epic's live workers/API/UI/host cluster.
Pointers are per-source, add-only (recipes/evidence/<slug>/<source>/<bundle-digest>.yaml, Make evidence pointers per-source (per contributing party) #1347 Option A, CODEOWNERS-scoped). A first-party UAT run ingests directly (bundle ref handed to the ingest job — no per-run repo commit); a community/partner submission lands its own pointer via PR. Either way the ingest job ORAS-mirrors the bundle, unpacks CTRF via MaterializeBundle, verifies the signer (pinned issuer + allowlist) and OCI registry before counting, and writes a source-keyed GCS entry — and a corroboration cell for that recipe appears on the published Pages site after the next build.
Consensus counts distinct verified signers, never builds (N runs from one signer = one source); CONFIRMED requires ≥ 2 allowlisted distinct signers and a clean S_fail; CONTESTED (≥ 1 pass and ≥ 1 fail) is computed, surfaced first-class, and never averaged or hidden; UNTESTED/NOT-RUN is visually distinct from FAILING.
The model fails closed against sybil: a verified-but-unknown community signer is admitted as a "reported" dot with zero corroboration weight and can never on its own promote a row to CONFIRMED; source class (first-party/community/partner) is derived from the verified signer (never a free flag) and shown per cell; the docs state honestly that community/partner corroboration proves provenance, not cluster-verified correctness (ADR-007 trust model).
The generator is byte-deterministic: same CTRF inputs + verified metadata → identical JSON (index.json + series/*.json) and HTML across runs with clock skew between them; all timestamps come from the bundle predicate (AttestedAt), never time.Now(); signer-set, row (PhaseOrder then CTRF name), and JSON-key ordering are fixed.
Recency/version drift is handled: each contributing run is tagged with aicr version + k8s major.minor from the bundle; the default scope is latest-per-signer; aicr-version and k8s are exposed as facets/filters so a stale-version result never silently fuses with a current one.
The dashboard is a self-contained static site on GitHub Pages (no served API/worker/cluster), navigated CSP-first to a recipe, rendering the catalog overview, the per-recipe consensus grid with the source dot-strip by class, and the per-source drilldown with evidence deep-links; the recipe→coordinate mapping is the single shared function the TestGrid epic ships (imported, not forked).
The write identity is a new, dedicated objectCreator-only SA via the existing github-actions-pool WIF federation (never the shared github-actions@eidosx SA); contributors never receive bucket-write credentials; community OCI pulls go through a trusted-registry allowlist in a credential-free step.
make qualify green; the 75% coverage floor (.settings.yaml:107) cleared on every new Go package; the new tools/<generator>/** path adds a labeler.yml glob; the new Pages workflow uses permissions: pages: write (the repo's first GitHub Pages workflow).
Out of scope
The TestGrid epic's live stack — upstream updater/tabulator/summarizer workers, the AICR-native read-only API + qualification fan-out, the greenfield live SPA, and the always-on GKE host cluster (#1263 TG3/TG4a/TG4b + the host-cluster portion of TG1 + operability TG7) — all deferred behind this interim, with pull-triggers. The TestGrid-wire-compatible GCS feed (started.json/junit.xml/finished.json) and CTRF→jUnit conversion (TG2's converter) — the interim consumes CTRF directly and emits a consensus model, a different artifact. Producing the bundles (UAT runner = the dynamic-clusters epic / existing nightly; contributor side = ADR-007, shipped). Replacing the offline structural matrix or duplicating it (#1224 / the recipe-quality epic — this epic links, never copies). Regression alerting / paging. KMS-backed signing (ADR-007 deferred).
Staged from docs/design/013-interim-evidence-dashboard.md.
Summary
Establish AICR's interim public evidence surface: a static, byte-deterministic GitHub Pages dashboard that visualizes corroboration across heterogeneous, signed sources (first-party / community / partner) for each recipe. In-repo pointers are per-source and add-only (
recipes/evidence/<slug>/<source>/<bundle-digest>.yaml, #1347 Option A; source = verified signer, CODEOWNERS-scoped) — the community/partner contribution channel; first-party NVIDIA UAT ingests directly per run (no repo commit, avoiding churn). An AICR-owned CI job ORAS-mirrors the bundle, unpacks CTRF viaMaterializeBundle, and verifies the signer (pinned issuer + in-tree allowlist) and OCI registry before counting — contributors never write the bucket. A deterministictools/Go generator computes a consensus model (CONFIRMED / SINGLE / CONTESTED / FAILING / UNTESTED, counting distinct verified signers, never builds) and emits a deterministicindex.json+ per-recipeseries/*.json+ a self-contained HTML/CSS/JS renderer that reads them (catalog overview → per-recipe consensus grid → per-cell source dot-strip by class → per-source drilldown; CSP-first nav; k8s + aicr-version facets), published viaupload-pages-artifact+deploy-pages. Reuses the TestGrid epic's shared recipe→coordinate mapping and publish/ingest concepts; defers that epic's live workers/API/UI/host cluster.Children
Epic acceptance criteria
recipes/evidence/<slug>/<source>/<bundle-digest>.yaml, Make evidence pointers per-source (per contributing party) #1347 Option A, CODEOWNERS-scoped). A first-party UAT run ingests directly (bundle ref handed to the ingest job — no per-run repo commit); a community/partner submission lands its own pointer via PR. Either way the ingest job ORAS-mirrors the bundle, unpacks CTRF viaMaterializeBundle, verifies the signer (pinned issuer + allowlist) and OCI registry before counting, and writes a source-keyed GCS entry — and a corroboration cell for that recipe appears on the published Pages site after the next build.S_fail; CONTESTED (≥ 1 pass and ≥ 1 fail) is computed, surfaced first-class, and never averaged or hidden; UNTESTED/NOT-RUN is visually distinct from FAILING.index.json+series/*.json) and HTML across runs with clock skew between them; all timestamps come from the bundle predicate (AttestedAt), nevertime.Now(); signer-set, row (PhaseOrderthen CTRF name), and JSON-key ordering are fixed.major.minorfrom the bundle; the default scope is latest-per-signer; aicr-version and k8s are exposed as facets/filters so a stale-version result never silently fuses with a current one.objectCreator-only SA via the existinggithub-actions-poolWIF federation (never the sharedgithub-actions@eidosxSA); contributors never receive bucket-write credentials; community OCI pulls go through a trusted-registry allowlist in a credential-free step.make qualifygreen; the 75% coverage floor (.settings.yaml:107) cleared on every new Go package; the newtools/<generator>/**path adds alabeler.ymlglob; the new Pages workflow usespermissions: pages: write(the repo's first GitHub Pages workflow).Out of scope
The TestGrid epic's live stack — upstream updater/tabulator/summarizer workers, the AICR-native read-only API + qualification fan-out, the greenfield live SPA, and the always-on GKE host cluster (#1263 TG3/TG4a/TG4b + the host-cluster portion of TG1 + operability TG7) — all deferred behind this interim, with pull-triggers. The TestGrid-wire-compatible GCS feed (
started.json/junit.xml/finished.json) and CTRF→jUnit conversion (TG2's converter) — the interim consumes CTRF directly and emits a consensus model, a different artifact. Producing the bundles (UAT runner = the dynamic-clusters epic / existing nightly; contributor side = ADR-007, shipped). Replacing the offline structural matrix or duplicating it (#1224 / the recipe-quality epic — this epic links, never copies). Regression alerting / paging. KMS-backed signing (ADR-007 deferred).Staged from
docs/design/013-interim-evidence-dashboard.md.