Task · GCI-0009

Publish the generic product and ship signed GHCR releases

Description

Make the customer-neutral generic product repository public only after a working-tree and full-history privacy and secret audit, then add the standard rknightion CI, Release Please and multi-architecture GHCR publication contract without changing any live customer deployment.

Acceptance Criteria

Definition of Done

Implementation Plan

  1. Freeze the current clean source revision and adversarially scan the working tree plus every reachable Git object for customer identifiers, identity-shaped data and secrets; stop before visibility changes on any unexplained match.
  2. Compare current callers of the refreshed standard rknightion workflow hub, choose SHA-pinned reusable workflows, and preserve the existing full Python/consumer/Terraform validation gate.
  3. Add Release Please configuration, container publication callers, supply-chain/security callers, provenance documentation and Renovate pin maintenance; build locally for both supported architectures without pushing a live/customer image.
  4. Provision the repository-scoped OpenBao broker permission set, policy and GitHub OIDC role for Release Please, verify least privilege, then revoke the temporary admin session.
  5. Run actionlint, zizmor, the full product suite, denylist/history scans and a local OCI build/label inspection; adversarially review the final diff and resolve Critical/Warning findings.
  6. Replace the private lineage with one clean root commit, force-push while private, update the customer deployment source pin without applying it, rerun the clean-history audit, then make the generic repository and GHCR package public.
  7. Inspect hosted workflows and package provenance, and record the exact public source SHA and GHCR digest while leaving all live runtime resources unchanged.

Leak remediation addendum: 8. Treat the committed denylist as a public-data leak and stop publication handoff work. 9. Move the customer-pattern set into a GitHub Actions secret and change the gate to accept only an external environment value or caller-supplied file; keep synthetic tests with invented sentinels. 10. Remove the denylist file and every customer-derived string from the replacement tree, then run targeted tests, the full suite, shipped-text, external-pattern tree/history scan and a pristine detect-secrets audit. 11. Create a brand-new root commit from the verified sanitized tree, remove or replace every public ref that reaches the disclosed lineage, close the obsolete release PR, and force-push main. 12. Re-run hosted CI and the privacy/secret gates on the rewritten public history; inspect public refs before resuming GHCR provenance handoff. 13. Record the incident and exact evidence in this task and preserve the separately validated deployment pin without any apply or live mutation.

Implementation Notes

Privacy audit found customer-derived identifiers only in the initial two private commits; the current tree and fixtures are clean. Rob explicitly authorised dropping the entire lineage, so publication will use a new clean root commit and update the deployment pin before visibility changes. Added standard SHA-pinned CI, signed multi-arch GHCR, Release Please, RC, cleanup and security workflows. Provisioned the repository-scoped OpenBao broker objects and the two Tailscale WIF identifier secrets; the temporary admin login was revoked. Direct anonymous GHCR-by-digest is the documented default, with ECR pull-through cache as an optional deployment policy that owns its required upstream credential.

Clean-lineage validation at 016fe73d706144c7094bb8f664bda511b1c4702e:

Concurrent product documentation advanced the clean lineage before this evidence commit. The final pre-publication scan therefore covers four reachable commits, all clean; no unrelated work was discarded.

Publication gate completed at 3101797cab23f85f00fe836221f302ecb3a85357: the repository is public and the deployment repository is committed at 41d34c317de9a2e1554fc2e2f134ae40a2b2b48e with the identical immutable module/manifest pin. Fresh root validation and a read-only targeted plan passed; the plan remains the previously classified five task-definition replacements plus scheduler policy/target refreshes, and no apply occurred. Hosted runs were inspected: every runner-backed job failed before producing a single step or log, matching the account-level GitHub Actions billing condition. This is not a code failure and billing was not changed. Consequently no GHCR package, digest, signature, provenance or SBOM exists yet; acceptance criterion 5 remains deliberately unchecked. Resume by rerunning the hosted workflows after billing is restored, then verify the public package and complete this task.

Publication review found that the committed customer identifier denylist disclosed the exact strings it was intended to prevent. Rob explicitly requested deletion plus history rewrite and force-push. The replacement gate receives the sensitive pattern set externally so the public tree cannot reveal it.

CodeRabbit found one valid fail-open case: recursive grep errors were treated like no matches. The gate now accepts status 1 only as clean and fails closed on invalid patterns, read errors, or any other grep failure. Its task wording was also corrected so the public repository does not claim to ship a denylist.

Correction after acceptance-criterion reordering: the historical note about missing GHCR artifacts refers to criterion 4. Criterion 5 remains complete.

Post-rewrite GitHub ref audit:

Repository recreation authorised by Rob and completed:

Hosted publication evidence after repository recreation:

Final Summary

Recreated the public product repository from a sanitized clean root, restored standard security and ruleset settings, moved the sensitive identifier pattern outside Git, restored short-lived OpenBao-backed Release Please authentication, and published the signed multi-architecture v0.1.0 GHCR release with provenance, SBOMs and security scanning. The public repository and all reachable refs passed the external identifier/history gate. Customer deployment remains unchanged and separately pinned to its validated source revision pending explicit go-live approval.

View the source file on GitHub