Skip to content

release: make tag-time publishing depend on the security audit (Tauri release + GHCR) #911

Description

@qnbs

CURRENT AUTHORITATIVE STATE — post-v1.29.1 hardening — 2026-09-29

V1_29_1_BLOCKER = NO
CURRENT_MITIGATION = procedural / actively watched
MECHANICAL_ENFORCEMENT_OWNER = #911
START_AFTER = #872 v1.29.1 VERIFIED

v1.29.1 keeps the already-qualified release pipeline unchanged: refresh the exact-candidate Security Audit immediately before tag, watch the tag-triggered audit, cancel Tauri publication if red, and verify GitHub/Desktop and GHCR states independently.

The durable target here is machine enforcement after the recovery release: gate Tauri GitHub Release and GHCR publication/moving aliases on required security success, with positive + negative-path proof and workflow-policy revalidation.

Exact v1.29.0 Docker evidence confirms the current tag workflow emitted/pushed 1.29.0, 1.29, and latest. The :latest output is also produced by docker/metadata-action's stable-SemVer latest=auto behavior; future tests must preserve actual output semantics rather than reason only from the explicit raw is_default_branch rule.


Problem (observed on v1.29.0, #872)

Tag-triggered publishing does not depend on the tag's security audit:

  • tauri-build.yml release has needs: [bundle] only. The enforced OSV scan runs in ci.yml (🔒 Security Audit) as an independent workflow.
  • docker.yml pushes :X.Y.Z, :X.Y and :latest without depending on it either.

On v1.29.0, a new advisory (GHSA-6h2x-m376-mqjq, dev-only joi) appeared between the candidate's resulting-main run and the tag.

  • The tag CI/CD failed.
  • The desktop release was stopped only because it was cancelled by hand before its GitHub Release job.
  • GHCR had already published 1.29.0, 1.29 and latest.

Current mitigation (procedural, not mechanical)

The v1.29.1 evidence record (#910) sets a procedure: re-check the Security Audit on the exact candidate right before tagging, then watch the tag's Security Audit (about 1–2 min) and cancel the Tauri release run if it is red. The bundle jobs take at least 12 min before release can start.

This is fail-closed only while someone is watching. It is not enforced by the pipeline.

Proposal (maintainer decision: release-pipeline and governance surface)

  • Add a pinned OSV scan job (same osv-scanner.toml and lockfiles as ci.yml) to tauri-build.yml and make release depend on it: needs: [bundle, security-audit].
  • Gate the docker.yml push on the same check. This also closes the gap where :latest moves before the audit.
  • Exercise it with a workflow_dispatch run and a negative fixture, and update the workflow-policy tests.

Not part of the v1.29.1 cut, so the qualified release pipeline stays unchanged under the candidate. Found by review on #910 (Codex P1, CodeRabbit).

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions