Skip to content

feat(supply-chain): build, attest, and activate the patch-validator image #66

Description

@seonghobae

Goal

Maintain a buyer-verifiable patch-validator lifecycle: reviewed source → exact image/runtime/SBOM/vulnerability receipts → protected integration → protected-main operational acceptance → immutable publication/signature/attestation → controlled activation. The validator must not inherit reviewer/model/GitHub-write/provider-routing/quarantine/security/outbound/release authority, and automation must not invent outbound licensing authority.

Protected source truth — 2026-09-08 KST

Protected Noema is GitHub-verified main@699489cdbb8de3404154d9a3d6022c692ce85fd6, the normal #547 documentation-authority integration after #540 toolchain/license repair. The dedicated patch-validator image/runtime/supply-chain implementation entered protected history through #407 and remains preserved by subsequent integrations.

Current protected source retains the fully-static numeric-non-root scratch runtime, no-network/read-only/capability-dropped smoke, exact source/image/receipt binding, pinned Trivy/Syft/Grype tooling, CycloneDX/SBOM/component evidence, reviewed runtime-component provenance, strict identity/applicability checks and fail-closed vulnerability thresholds. #540 removed the historical Wrangler/Miniflare/Sharp/Libvips tooling path in favor of pinned direct source truth without weakening this boundary.

#547 exact 30b7e7e5cdab8de65715834a16f994b2047eafa6 subsequently reached all four terminal GREEN gates before normal merge, including patch-validator-image run 34165467851. That image job completed every static runtime, smoke, SBOM, Grype/Syft component and exact-receipt step successfully. This is strong current PR-head verification, but it is still not protected-main operational acceptance or immutable publication.

A live performance/RCA finding exposed why successive sibling PR image runs remained cold despite type=gha,scope=noema-patch-validator-image: the workflow ran only on PR branches/dispatch, while GitHub Actions cache visibility does not let one sibling PR restore another sibling's branch cache. #540 run 34155490034 spent about 104 minutes in the exact image build; later sibling #547 again spent about two hours building the same static runtime.

Draft #558 repairs that causal boundary. It adds protected-main cache seeding only when image-authority paths change, while retaining workflow_dispatch and every security/isolation/receipt gate. After #547 changed protected ancestry, #558 was ordinary/non-force converged to f2aa8570d952cc0a371da161e651472c080e00ce, behind_by=0. Hosted CI 34172635652, job 101895784847, then produced a real RED after checkout, live-base verification, lockfile control, install and typecheck: the legacy patch-validator-workflow test incorrectly required bare pull_request: to be directly adjacent to workflow_dispatch: and rejected the intentionally added sibling push: trigger. The run reported 1 failed / 4121 passed tests.

Current #558 exact is 2f91bf8641212ecae435b5fbcc9084cc0acd6295. The minimum causal repair changed only the stale test contract so it still proves pull_request: has no nested filters while allowing an independent sibling event trigger. Production workflow, permissions, scanner/isolation gates and publication authority were not weakened. Fresh compare against protected 699489c... is ahead-only, behind_by=0, merge-base exactly protected main, with effective changes limited to .github/workflows/patch-validator-image.yml, test/patch-validator-image-build-cache.test.ts, and test/patch-validator-workflow.test.ts. A wholly fresh application/reviewer/Security/image generation is running; predecessor results do not transfer.

A normal #558 merge necessarily changes the image workflow path, so the resulting protected merge commit will run the full image workflow once on main and seed a default-branch BuildKit cache available to later sibling PRs; unrelated main merges will not enqueue the 150-minute lane.

The GitHub release collection remains empty. No historical PR-head image receipt, current candidate image check, package version or issue text counts as an immutable released artifact.

Completed source/image criteria

  • Exact-source quarantine and dedicated validator-image implementation are protected.
  • Preserve node_patch_verify_v1, exact source/image/receipt binding, supply-chain pinning and credential-free isolation.
  • Real no-network/read-only/non-root smoke and hostile-result-channel regressions exist.
  • CycloneDX, Trivy, Syft/Grype, static-runtime/component and exact-image receipt verification exist.
  • Reviewed identities/provenance are required for independently versioned bundled runtime components.
  • Malformed/ambiguous image identity, unreviewed provider/CPE provenance, cross-repository smoke evidence, duplicate image authority and receipt-path replacement fail closed.
  • Raw scanner evidence remains separate from reviewed applicability evidence.
  • Current docs: reconcile protected runtime and commercial gap authority #547 exact head reached application/reviewer/Security/image terminal success before normal protected integration.
  • fix(toolchain): replace Wrangler/Miniflare GPL-family path #540 protected source removes the prior GPL-family tooling path without weakening the static runtime or scanner boundary.

Remaining executable boundary

Protected-main operational acceptance and cache seed

Publication / signature / provenance

  • Publish only an immutable image digest after protected-main operational acceptance.
  • Sign/attest through verified repository-controlled or keyless identity isolated from untrusted execution.
  • Bind provenance to repository, exact source, workflow path/ref, builder/runner identity, image digest and build parameters.
  • Verify signature/provenance/SBOM/source/signer identity before reviewer consumption or activation.
  • Retain bounded machine-readable receipts with schema-versioned canonical SHA-256 identities.

Licensing / transfer rights

  • Keep outbound artifact-license metadata absent or subordinate to an explicit authorized owner/legal decision.
  • Bind actual release rights to SemVer tag, full source commit, immutable image digest, SBOM, dependency-license inventory, NOTICE/attribution and provenance.
  • Preserve third-party obligations; vulnerability success is not license/transfer-rights evidence.

Activation / buyer proof

  • Activation defaults disabled until protected operational/publication evidence passes.
  • Validator evidence never counts as formal approval, merge/release authority, deployment authority or acquisition readiness.
  • Refuse stale/missing/malformed/mismatched producer/workflow/image/receipt evidence.
  • Exercise rollback/rotation/recovery and retain buyer-verifiable evidence.

Guardrails

Do not weaken #27, fabricate #29/#227 identity provisioning, configure #40 by documentation, synthesize #3 production KPI evidence, choose an outbound license, or write central .github, contextual-orchestrator, quarantine or egress source from this owner lane.

Related: #5, #9, #27, #29, #40, #73, #227, #407, #531, #558.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: apiAPI, protocol, event, or external contractarea: authAuthentication, authorization, identity, or tenant isolationarea: ci-cdCI, GitHub Actions, checks, release, or supply chainarea: securitySecurity boundary, hardening, or vulnerability preventionenhancementNew feature or requestpriority: mediumNormal-priority or P2 workstatus: blockedBlocked by conflict, dependency, or required prerequisitetype: featureNew or expanded product capability

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions