Skip to content

[codex] Add workflow action pin contract - #1925

Merged
stranske merged 1 commit into
mainfrom
codex/source-action-pinning-106
Apr 26, 2026
Merged

[codex] Add workflow action pin contract#1925
stranske merged 1 commit into
mainfrom
codex/source-action-pinning-106

Conversation

@stranske

@stranske stranske commented Apr 26, 2026

Copy link
Copy Markdown
Owner

Source: Issue #1836

Related to campaign issue #1836

Automated Status Summary

Scope

Sync/Dependabot Campaign Queue

Remote GitHub Actions owns discovery for sync-generated and Dependabot PR rounds. Local Codex should only claim items from this issue when needs-local-codex work is queued.

Summary

Context for Agent

Related Issues/PRs

Tasks

  • Updated: 2026-04-26T21:54:40.713Z
  • Repos checked: 11/11
  • Open sync PRs: 607
  • Open Dependabot PRs: 0
  • Active review threads queued: 1162
  • Items needing local Codex: 0
  • Actionable local Codex items: 0
  • Claimable local Codex items: 0
  • Source-fixed candidates: 0
  • Superseded sync candidates: 120
  • Finished local results without published source changes: 0
  • Claimed local Codex items: 0
  • Next claim lease expires: -

Acceptance criteria

  • Status: local-codex-superseded-sync-candidate
  • Source repo: stranske/Workflows
  • Source sync state: superseded (PR 8c201f72e3ed / current 88f77da7a0dc)

Head SHA: f10b798
Latest Runs: ⏹️ cancelled — Gate
Required: gate: ⏹️ cancelled

Workflow / Job Result Logs
Agents Auto-Pilot ⏭️ skipped View run
Agents Bot Comment Handler ✅ success View run
Agents Keepalive Loop ⏹️ cancelled View run
Agents Verifier ✅ success View run
Auto-label Dependabot PRs ⏭️ skipped View run
CI Autofix Loop ⏹️ cancelled View run
Create Issue from Verification (Enhanced) ⏭️ skipped View run
Create New PR from Verification ⏭️ skipped View run
Gate ⏹️ cancelled View run
Health 40 Sweep ✅ success View run
Health 44 Gate Branch Protection ✅ success View run
Health 45 Agents Guard ✅ success View run
Health 50 Security Scan ✅ success View run
Health 73 Template Completeness ✅ success View run
Maint 52 Validate Workflows ✅ success View run
PR 11 - Minimal invariant CI ✅ success View run
Selftest CI ✅ success View run
Validate Sync Manifest ✅ success View run

@stranske
stranske temporarily deployed to agent-high-privilege April 26, 2026 22:15 — with GitHub Actions Inactive
@agents-workflows-bot

Copy link
Copy Markdown
Contributor

⚠️ Action Required: Unable to determine source issue for PR #1925. The PR title, branch name, or body must contain the issue number (e.g. #123, branch: issue-123, or the hidden marker ).

@agents-workflows-bot

agents-workflows-bot Bot commented Apr 26, 2026

Copy link
Copy Markdown
Contributor

Automated Status Summary

Head SHA: d9c3090
Latest Runs: ⏳ pending — Gate
Required contexts: Gate / gate, Health 45 Agents Guard / guard
Required: core tests (3.12): ⏳ pending, core tests (3.13): ⏳ pending, docker smoke: ⏳ pending, gate: ⏳ pending

Workflow / Job Result Logs
(no jobs reported) ⏳ pending

Coverage Overview

  • Coverage history entries: 1

Coverage Trend

Metric Value
Current 93.12%
Baseline 85.00%
Delta +8.12%
Minimum 70.00%
Status ✅ Pass

Top Coverage Hotspots (lowest coverage)

File Coverage Missing
src/cli_parser.py 81.8% 4
src/percentile_calculator.py 95.0% 1
src/aggregator.py 95.0% 2
src/__init__.py 100.0% 0
src/ndjson_parser.py 100.0% 0

Updated automatically; will refresh on subsequent CI/Docker completions.


Keepalive checklist

Scope

Sync/Dependabot Campaign Queue

Remote GitHub Actions owns discovery for sync-generated and Dependabot PR rounds. Local Codex should only claim items from this issue when needs-local-codex work is queued.

Summary

Context for Agent

Related Issues/PRs

Tasks

  • Updated: 2026-04-26T21:54:40.713Z
  • Repos checked: 11/11
  • Open sync PRs: 607
  • Open Dependabot PRs: 0
  • Active review threads queued: 1162
  • Items needing local Codex: 0
  • Actionable local Codex items: 0
  • Claimable local Codex items: 0
  • Source-fixed candidates: 0
  • Superseded sync candidates: 120
  • Finished local results without published source changes: 0
  • Claimed local Codex items: 0
  • Next claim lease expires: -

Acceptance criteria

  • Status: local-codex-superseded-sync-candidate
  • Source repo: stranske/Workflows
  • Source sync state: superseded (PR 8c201f72e3ed / current 88f77da7a0dc)

@stranske
stranske temporarily deployed to agent-high-privilege April 26, 2026 22:18 — with GitHub Actions Inactive
@stranske
stranske marked this pull request as ready for review April 26, 2026 22:21
Copilot AI review requested due to automatic review settings April 26, 2026 22:21
@stranske
stranske merged commit e2fd024 into main Apr 26, 2026
109 of 116 checks passed
@stranske
stranske deleted the codex/source-action-pinning-106 branch April 26, 2026 22:21
@stranske
stranske temporarily deployed to agent-high-privilege April 26, 2026 22:21 — with GitHub Actions Inactive

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f10b79895c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +79 to +81
uses = match.group("uses")
action, separator, ref = uses.rpartition("@")
if not separator or not _is_checked_action(action, prefixes):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Normalize quoted uses values before prefix matching

The parser treats the raw uses token as-is, so YAML-quoted action refs are silently skipped by the enforcement. For example, uses: "actions/checkout@v6" yields an action value of "actions/checkout, which fails _is_checked_action(...) and bypasses both SHA and version-comment validation. Since quoted uses syntax is valid YAML (and already used in this repo for other actions), this creates an easy path for floating refs to evade the new pin contract.

Useful? React with 👍 / 👎.

@stranske
stranske removed the request for review from Copilot April 26, 2026 22:45
stranske pushed a commit that referenced this pull request Jun 17, 2026
Health 74 "Check Template Drift" was RED on main: 7 of 15 allowlisted
root->template workflow pairs had stale fingerprints, so they showed as
unallowlisted drift (exit 1). They went stale after action-version bumps
(#2391/#2394) and root feature work changed the normalized content of
both sides without re-baselining.

Each of the 7 was examined; all are intentional, bidirectional divergence
rather than a missing consumer improvement:
- consumer template workflows SHA-pin third-party actions per the fleet
  action-pin contract (docs/HISTORY.md, PR #1925) and carry LangSmith
  tracing env;
- the root Workflows-repo copies use floating major tags plus repo-internal
  concurrency + sparse-checkout (docs/fixes/sparse-checkout-audit-2026-02-03.csv);
- agents-63-issue-intake is additionally an alias-mapped Workflows-internal
  superset (~1.7k lines) vs the 216-line consumer intake template.

Aligning the template to root would strip the contractually-required
consumer action pins from all consumers, so the entries are re-baselined
(fingerprints refreshed + documented reasons) rather than aligned. The 8
already-passing entries are untouched.

Verified: scripts/check_template_drift.py --allowlist
config/template-drift-allowlist.txt now reports 0 unallowlisted drift
(15 allowlisted, 3 in sync), exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

# Conflicts:
#	config/template-drift-allowlist.txt
stranske added a commit that referenced this pull request Jun 17, 2026
…2397)

Health 74 "Check Template Drift" was RED on main: 7 of 15 allowlisted
root->template workflow pairs had stale fingerprints, so they showed as
unallowlisted drift (exit 1). They went stale after action-version bumps
(#2391/#2394) and root feature work changed the normalized content of
both sides without re-baselining.

Each of the 7 was examined; all are intentional, bidirectional divergence
rather than a missing consumer improvement:
- consumer template workflows SHA-pin third-party actions per the fleet
  action-pin contract (docs/HISTORY.md, PR #1925) and carry LangSmith
  tracing env;
- the root Workflows-repo copies use floating major tags plus repo-internal
  concurrency + sparse-checkout (docs/fixes/sparse-checkout-audit-2026-02-03.csv);
- agents-63-issue-intake is additionally an alias-mapped Workflows-internal
  superset (~1.7k lines) vs the 216-line consumer intake template.

Aligning the template to root would strip the contractually-required
consumer action pins from all consumers, so the entries are re-baselined
(fingerprints refreshed + documented reasons) rather than aligned. The 8
already-passing entries are untouched.

Verified: scripts/check_template_drift.py --allowlist
config/template-drift-allowlist.txt now reports 0 unallowlisted drift
(15 allowlisted, 3 in sync), exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

# Conflicts:
#	config/template-drift-allowlist.txt

Co-authored-by: Tim Stranske <tim@stranskemo.com>
stranske added a commit that referenced this pull request Jul 24, 2026
#2815)

Health 74 Template Drift has been red on main since 2026-07-20, forcing an
admin override on every Workflows merge. Root cause is NOT unintended drift:
Renovate/dep-pin bumps (#2799 actions/checkout v7.0.1, #2776 coverage pins)
moved the consumer templates' pinned action SHAs, so 13 already-allowlisted
entries' recorded fingerprints went stale.

Verified via `git log --since=<last baseline>` that the only commits touching
these 13 workflow files since the last re-baseline were those dependency bumps
(root workflows keep floating major tags by design; consumer templates SHA-pin
per the fleet action-pin contract, docs/HISTORY.md / PR #1925). The divergence
is the intentional action-pin-contract drift, not a missing consumer
improvement — so per the allowlist's own documented process, refresh the
fingerprints rather than align (aligning would strip the required consumer pins).

Refreshed main/template sha256 for: belt 71/72/73, auto-label,
autofix-dispatcher, capability-check, decompose, dedup, guard, issue-optimizer,
keepalive-loop-reporter, verifier, weekly-metrics. Per-entry reasons preserved;
dated re-baseline note added to the header.

check_template_drift.py now reports "unallowlisted drift: 0" (exit 0).

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant