sbom-nexus/docs/evidence/SBOM-WP-0002-T02-repository-projection-rehearsal-2026-08-22.md
tegwick e83c875150 docs: close production deployment and import gates
Assistant: codex
Assistant-Model: gpt-5.6-sol
Assistant-Session: 01a028f0-a42f-7582-89a8-ebaad7343834
2026-08-22 18:24:44 +02:00

2 KiB

SBOM-WP-0002-T02 repository projection rehearsal — 2026-08-22

Result

The projection-only synchronization path is implemented and rehearsed against an isolated SBOM Nexus database. It does not scan repositories, invoke an ingest route, or create snapshots.

Source and selection

The current Repo Manager compatibility projection was read from State Hub's GET /repos/ boundary using explicit host id bnt-lap001:

Measure Result
Source repositories 120
Active 116
Inactive 4
Selected checkout path 120

The dry-run used an intentionally unreachable target URL and still completed, proving that dry-run does not contact or mutate the Nexus target.

Apply rehearsal

An ephemeral SQLite-backed Nexus on 127.0.0.1:18010 received the projection:

  • 120 upserts;
  • 120 exact active/path matches on read-back;
  • zero missing, mismatched, or extra target repositories;
  • zero SBOM ingest calls and zero snapshots.

The bounded catch-up query with limit=3 returned exactly three of 116 active, never-attempted repositories, ordered deterministically by slug: activity-core, adaptive-pricing, and agent-harness. The response reported selected_count=3, never_count=116, stale_count=116, and total_count=116.

Production apply remains gated on the dark PostgreSQL runtime in SBOM-WP-0002-T01.

Production result

After T01 became healthy, the same path synchronized all 120 projections into the private PostgreSQL-backed runtime: 120 matched, with zero missing, mismatched, or extra rows. The snapshot count remained zero. The bounded query again selected exactly three of 116 active repositories. Full production and history-import evidence is recorded in SBOM-WP-0002-T03-production-history-import-2026-08-22.md.

Verification

  • uv run ruff check src tests scripts: pass
  • uv run pytest -q: 15 passed, 1 conditional PostgreSQL skip
  • projection dry-run: 120 would-upsert, target not contacted
  • projection apply/read-back: 120/120 matched
  • bounded catch-up: 3/3 selected in deterministic order