Skip to content

[CI] Keep workflow action-pin contracts coherent with Dependabot updates #263

Description

@seonghobae

2026-08-31 fresh control-plane revalidation

Protected main is still exact b84f0c94154043a3473939c01bb6471de5a129ae.

The dependency heads remain bot-owned Drafts. Fresh refetch confirms #259 is open/Draft/mergeable at exact a476dbe7733742aae15553ec1f5aed321ed1a2fb; #260 remains open/Draft/mergeable; and #262 remains open/Draft/mergeable at exact b043cdc837e8df05bfdfb15d8b11ce92c9202bc3 on the same protected base. Do not mutate these bot branches from this writer.

A stale statement from the 2026-08-21 snapshot must not be treated as current evidence: #262's exact-head commit-scoped inventory now contains no current failure, neutral, or conclusion-null check-run result, while coverage-evidence and opencode-review are terminal-success. It still contains conditional/auxiliary skipped runs, which are not promoted to success. More importantly, #262 is still Draft and its changed paths overlap active repository-owned workflow writers (.github/workflows/ci.yml with #242 and .github/workflows/release-acceptance.yml with #247), so it is not an execute-now merge/Ready lane. Its old CI run 32282163607 remains historical evidence only and must not be reported as the current exact-head gate state.

The 2026-08-21 #260/#261 check/run descriptions below are likewise historical snapshots unless freshly revalidated against their unchanged exact heads; their Draft state and protected-main dependency sequencing remain authoritative, but old run conclusions are not transferred into a current merge decision.

The product/root ordering is unchanged: resolve #233 through live review governance first, then let Dependabot refresh/rebase naturally as required, reacquire exact-final-head/current-base required workflows, and only then evaluate these dependency PRs for Ready/merge. Never copy a stale failed run, green verifier, skipped helper, predecessor result, or bot ownership into present-tense merge authority.

Defect observed on dependency automation — historical 2026-08-21 snapshot

Dependabot PR #259 (astral-sh/setup-uv 9.0.0 -> 10.0.1) was exact head a476dbe7733742aae15553ec1f5aed321ed1a2fb on protected base b84f0c94154043a3473939c01bb6471de5a129ae, Draft and mechanically mergeable. It changes the workflow action pin to full SHA 20cfd1bf945f4377ade1205e4dbc17946fc9a30d, while the executable regression contract in tests/test_release_acceptance_workflow.py still requires the previous v9 SHA c771a70e6277c0a99b617c7a806ffedaca235ff9.

The then-current exact-head CI run 32282136470 failed deterministically in test_release_acceptance_workflow_is_exact_head_least_privilege (1331 passed, 1 failed on Python 3.10); Release Acceptance 32282136484, SAST 32282136396, and Security Scan 32282136477 otherwise succeeded. That immutable run remains useful RCA evidence for the duplicated-pin mismatch, but it is not automatically a current gate conclusion after later workflow/check materialization.

This failure was introduced by #259 and is distinct from the protected-main 100%-branch-coverage/review blocker tracked by #233/#244.

Historical sibling dependency triage — do not promote to current gate truth

The 2026-08-21 snapshot recorded:

Those run conclusions are immutable historical RCA only. Current acceptance must be rebuilt from the exact unchanged/final head and then-live protected base/ruleset. In particular, #262 has since materialized newer exact-head check evidence as described in the 2026-08-31 section above.

Accordingly, #260/#261/#262 must not receive copied action-pin workarounds, synthetic churn, pointless failed-run reruns, or direct source edits from this writer. Reevaluate them after the protected-main coverage/review root integrates, then let Dependabot refresh/rebase normally as needed and reacquire each exact-final-head/current-base required workflow set before Ready/merge consideration.

Root-cause sequence for #259

  1. Integrate test(recovery): cover stale evidence registry cleanup #233 only after the independent-review/control-plane prerequisite tracked in [Governance] Prove the independent review path on a current pg-llm-batch head #244 is genuinely satisfied.
  2. After protected main contains the weak-reference coverage repair, freshly inventory every workflow/test writer on the exact action-pin contract surface.
  3. If writer-safe, repair the repository-owned duplicated action-pin contract on a separate explicit non-default branch from then-current protected main, with a purpose-built RED proving workflow/pin-contract drift and a narrow GREEN that preserves immutable full-SHA authority.
  4. Integrate that repository-owned repair through normal governance.
  5. Let Dependabot refresh/rebase build(deps): bump astral-sh/setup-uv from 9.0.0 to 10.0.1 #259 normally; do not mutate the bot branch from a competing writer.
  6. Require a fresh unchanged build(deps): bump astral-sh/setup-uv from 9.0.0 to 10.0.1 #259 head with all exact-head/current-base workflows terminal-success, zero valid findings/threads, and any then-required qualifying non-author approval before merge.

A direct edit to the Dependabot branch would entangle dependency automation ownership with a repository contract repair and is rejected while a separate root-cause repair is feasible.

Commercial-readiness gap

Mirroring trusted action SHAs directly inside tests makes security dependency updates mechanically incomplete unless the updater also knows every mirrored assertion. That creates avoidable broken automation, slows security patch uptake, and makes action provenance harder to audit consistently.

Bounded acceptance target

After the protected-main coverage/review root (#233/#244) is integrated and this surface is writer-safe:

  • retain immutable full-commit-SHA pins for third-party Actions; do not weaken to tags, branches, prefixes, or syntactic-only 40-hex checks;
  • establish one reviewable source of truth for approved action identity/version metadata, or another equally strong mechanism consumed coherently by workflows and executable regression contracts;
  • make Dependabot-compatible updates change authoritative pin evidence and executable contracts coherently, or fail with a purpose-built validation that identifies every required companion update;
  • preserve least-privilege workflow permissions, exact PR-head checkout, persist-credentials: false, current toolchain constraints, StepSecurity hardening, reproducible release evidence, and all existing security gates;
  • add regression coverage proving an action-pin update cannot silently leave workflow and acceptance contract out of sync;
  • preserve supported Python including 3.14, 100% public-docstring coverage, exact 100% owned production statement/branch coverage, lock freshness, package/container builds, SAST, Security Scan, Release Acceptance, and then-live SBOM/provenance/review gates; and
  • document rollback/security-emergency handling only through the canonical documentation owner and without external-certification claims.

Do not repair this by weakening exact-pin assertions, bypassing CI, rerunning an unchanged known-failing head, mutating an active Dependabot branch from a competing writer, or copying central .github workarounds into this repository.

Refs #259, #260, #261, #262, #233, #242, #244, #247.

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: authAuthentication, authorization, identity, or tenant isolationarea: ci-cdCI, GitHub Actions, checks, release, or supply chainarea: dependenciesDependency or lockfile maintenancearea: securitySecurity boundary, hardening, or vulnerability preventionbugSomething isn't workingpriority: mediumNormal-priority or P2 workstatus: blockedBlocked by conflict, dependency, or required prerequisitetype: bugDefect or incorrect behaviortype: maintenanceMaintenance, build, dependency, or operational upkeep

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions