You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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:
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.
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 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
Decide blocker 1 (re-accept, or take the base bump and re-baseline).
Provision the two scheduling GHCR package identities (classic PAT, plus the org visibility change).
Add scheduling-candidate to CANDIDATE_PACKAGES with its test.
Run the baseline-bootstrap rehearsal, author and merge release/security/scheduling-advisory-baseline.json.
Apply the blocker-1 decision to all five existing baselines.
Protected-main CI plus the strict read-only rehearsal.
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.
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 (
libc62.41-12+deb13u4) and CVE-2026-85091 (zlib1g1:1.3.dfsg+really1.3.1-1+b1), both High, bothaccepted_risk, are excepted in five advisory baselines:expires_atrelease/security/breg-advisory-baseline.jsonrelease/security/casework-advisory-baseline.jsonrelease/security/discovery-advisory-baseline.jsonrelease/security/evidence-advisory-baseline.jsonproducts/relay-v2/security/advisory-baseline.jsonToday is 2026-09-22, so every one is expired.
check-advisory-baselines.pywalks each exception unconditionally and appendsexpired exception: <key>whenexpires_at < today. Deleting the exception instead does not help: an exception whose finding is still present is required, and a finding without one fails asfixed or absent finding still has an exception. The gate runs inrelease-candidate.ymlduringrequest-candidate, so it stops the candidate build, not the tag.registry-release renew-advisory-baselinescannot 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 tosha256: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:
reviewed_atandexpires_atacross all five baselines and record why. Cheapest, and leaves the base image stale.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). AgainstOPERATIONS.md"Onboard a new release image", which is explicitly to be completed outside the release clock:release/docker/Dockerfile.scheduling: done.scheduling(public) andscheduling-candidate(private): not done. Both report absent. Worth confirming in org package settings, because the token used here lacksread:packages; it did return a distinguishable 403 for an existing package against 404 for these two. This step needs a classic PAT withwrite:packagesand a manual visibility change in the org UI, so it cannot be driven from an agent session.scheduling-candidateinCANDIDATE_PACKAGESinrelease/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.schedulingis already inPUBLIC_PACKAGES.release/security/scheduling-advisory-baseline.json: not done. The file does not exist. It has to come from a named baseline-bootstrap rehearsal withadvisory_evidence=trueagainst a clean committed unopened release branch, then be authored from that artifact's exact image evidence.OPERATIONS.mdforbids copying another product's baseline or adding a provisional bypass.Because step 7 puts the version-preparation PR after onboarding,
registry-release preparewas 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
schedulingGHCR package identities (classic PAT, plus the org visibility change).scheduling-candidatetoCANDIDATE_PACKAGESwith its test.release/security/scheduling-advisory-baseline.json.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 at22ea9228), 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.