Skip to content

v0.33.0 release is blocked: ten expired risk acceptances and incomplete Scheduling image onboarding #1279

Description

@jeremi

Recorded 2026-09-22 after taking the v0.33.0 release as far as it can go without an owner decision. Two blockers, both upstream of request-candidate. Neither is a time problem.

Blocker 1: ten expired risk acceptances (owner decision)

CVE-2026-5435 (libc6 2.41-12+deb13u4) and CVE-2026-85091 (zlib1g 1:1.3.dfsg+really1.3.1-1+b1), both High, both accepted_risk, are excepted in five advisory baselines:

Baseline Exceptions expires_at
release/security/breg-advisory-baseline.json 2 2026-09-18
release/security/casework-advisory-baseline.json 2 2026-09-18
release/security/discovery-advisory-baseline.json 2 2026-09-18
release/security/evidence-advisory-baseline.json 2 2026-09-18
products/relay-v2/security/advisory-baseline.json 2 2026-09-18

Today is 2026-09-22, so every one is expired. check-advisory-baselines.py walks each exception unconditionally and appends expired exception: <key> when expires_at < today. Deleting the exception instead does not help: an exception whose finding is still present is required, and a finding without one fails as fixed or absent finding still has an exception. The gate runs in release-candidate.yml during request-candidate, so it stops the candidate build, not the tag.

registry-release renew-advisory-baselines cannot clear this. It moves evidence bindings only; it refuses expired exceptions and never writes a rationale or extends an expiry. That refusal is deliberate: the accepted risk is owned by a person, and the rationale names @jeremi.

This is not a re-dating exercise. The accepted rationale rests on "Debian classifies the Trixie issue as minor/no-DSA and has no Trixie fix", reviewed 2026-09-15 against the pinned base gcr.io/distroless/cc-debian13:nonroot@sha256:c31ff9ab.... That base has since moved upstream to sha256:54df941e..., and dependabot #1194 would take that bump together with rust 1.95 -> 1.97. So the premise needs re-checking before the acceptance is renewed.

Two routes, and they are genuinely different decisions:

  1. Re-accept. Re-verify that Trixie still has no fix, then set a fresh reviewed_at and expires_at across all five baselines and record why. Cheapest, and leaves the base image stale.
  2. Take the base bump. Merge chore(deps): Bump the docker-images group across 1 directory with 2 updates #1194 (or its successor) and re-baseline. Note that chore(deps): Bump the docker-images group across 1 directory with 2 updates #1194 predates Scheduling and does not touch release/docker/Dockerfile.scheduling, so taking it as-is leaves the sixth image on the old base. That divergence has to be closed in the same change.

Blocker 2: Scheduling image onboarding is incomplete

v0.33.0 is the first release to build six images: breg casework discovery evidence relay scheduling (release_candidate.py image-names --version 0.33.0). Against OPERATIONS.md "Onboard a new release image", which is explicitly to be completed outside the release clock:

  • Step 2, release/docker/Dockerfile.scheduling: done.
  • Step 3, GHCR identities scheduling (public) and scheduling-candidate (private): not done. Both report absent. Worth confirming in org package settings, because the token used here lacks read:packages; it did return a distinguishable 403 for an existing package against 404 for these two. This step needs a classic PAT with write:packages and a manual visibility change in the org UI, so it cannot be driven from an agent session.
  • Step 4, scheduling-candidate in CANDIDATE_PACKAGES in release/scripts/cleanup-release-candidates.py: not done, correctly so. The allowlist fails closed on an absent package, so this must follow step 3, not precede it. scheduling is already in PUBLIC_PACKAGES.
  • Steps 5 and 6, release/security/scheduling-advisory-baseline.json: not done. The file does not exist. It has to come from a named baseline-bootstrap rehearsal with advisory_evidence=true against a clean committed unopened release branch, then be authored from that artifact's exact image evidence. OPERATIONS.md forbids copying another product's baseline or adding a provisional bypass.
  • Step 7 gates the version-preparation PR on onboarding plus a strict rehearsal both passing.

Because step 7 puts the version-preparation PR after onboarding, registry-release prepare was not run and that PR was not opened. Doing so would start the release clock ahead of the documented order.

Ordered path to a candidate

  1. Decide blocker 1 (re-accept, or take the base bump and re-baseline).
  2. Provision the two scheduling GHCR package identities (classic PAT, plus the org visibility change).
  3. Add scheduling-candidate to CANDIDATE_PACKAGES with its test.
  4. Run the baseline-bootstrap rehearsal, author and merge release/security/scheduling-advisory-baseline.json.
  5. Apply the blocker-1 decision to all five existing baselines.
  6. Protected-main CI plus the strict read-only rehearsal.
  7. registry-release prepare, version-preparation PR, then one candidate.

Already done toward v0.33.0

A mechanically collected change inventory sits at /private/tmp/v0330-notes-fresh.md (30 merged PRs since v0.32.0 at 22ea9228), and an authored draft of the notes at /private/tmp/v0330-notes-authored.md. Both are local scratch on this machine, not committed. The release is materially larger than a normal cut: a new runtime product (Registry Scheduling), a new deterministic Typst renderer (registry-render), a PostgreSQL 17 requirement, a wire-breaking hook contract adopted across products, and field-level encryption for restricted fields.

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:releaseRelease tooling and publication ownership.criticality:p1Priority P1: resolve before the next affected release.needs-jeremi-decisionMigrated issue that still needs Jeremi's product or release decision.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions