Skip to content

Epic: GP — Interim corroboration dashboard on GitHub Pages #1400

Description

@njhensley

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 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.

Children

Epic acceptance criteria

  1. 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.
  2. 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.
  3. 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).
  4. 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.
  5. 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.
  6. 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).
  7. 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.
  8. 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.

Metadata

Metadata

Assignees

Type

Fields

No fields configured for Epic.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions