Skip to content

Commit 6e38719

Browse files
hyperpolymathclaudecoderabbitai[bot]
authored
feat(fix-scripts): repair the three workflow-pin defect classes; re-pin this repo's standards callers (#615)
## Why Three defect classes killed Rust CI across the estate this fortnight, each a setup failure that reads as a code failure. hyperpolymath/cicd-suite#54 built gates in which they cannot occur; hypatia (hyperpolymath/hypatia, companion PR) detects them; this is the actuation half: a fix script per class, a registry row, and a contract test run by `rust.yml`. | Class | Rule | Script | |---|---|---| | SHA-pinned `dtolnay/rust-toolchain` with no `toolchain:` input (`'toolchain' is a required input`; hyperpolymath/plasma-parser-writer#105) | WF026 | `scripts/fix-rust-toolchain-input.sh` | | Caller pinned at a reusable revision the estate has **measured** dead (June 2026 toolchain window, 83 commits; 2026-08-19..10-19 lock window, 545 commits) | WF027, PIN-003, WF016 | `scripts/fix-stale-reusable-pin.sh` + `scripts/lib/stale-reusable-pins.tsv` | | `actions.lock` record whose `ref:` is its own SHA, which GitHub rejects at `Set up job` since ~2026-10-15 (`invalid lockfile pin`) | PI006 | `scripts/fix-lock-self-sha-refs.sh` + `scripts/lib/action-ref-tags.tsv` | Design points worth a reviewer's eye: * The stale-pin script moves a pin **only** to the replacement the table names, never to "newest" (standards' `lock-selfcheck.sh` exists because newer can be less usable). The table was generated from a walk of standards' history, file content and lock records checked per commit, not dates. * If the caller's `actions.lock` names the stale SHA, it follows the pin; two dead SHAs moving to one replacement are merged into one record. The nested `uses:` list is **not** recomputed here and the script says so (that closure is the `gh actions-lock` / `check-lock-sync.sh` step). * The self-SHA script takes tags from a map whose every row comes from the lock GitHub accepts (standards@`75bd599`), falling back to `git ls-remote --tags`; a commit with no tag is reported and left, exit 1. Reusable-workflow records keep their SHA ref, as the accepted lock does. * `AGENTIC.a2ml` names what an agent may and may not do with these: never choose a replacement SHA, never recompute a closure here, always idempotent. ## Dogfooded on this repository The five standards callers (governance, hypatia-scan, mirror, scorecard, secret-scanner) were pinned inside the lock window (`da2c748`, `571cc73`) and have been dying at `Set up job` since 2026-10-16 ([Governance run 39105727502](https://github.com/hyperpolymath/gitbot-fleet/actions/runs/39105727502) and every run after). They now pin `75bd599`; `actions.lock` holds one `standards@75bd599` record whose nested list is the union of what those five reusables use at that commit, every third-party record copied verbatim from standards' own lock, the seven self-SHA refs given their tags, and the three Dependabot bumps the lock had missed (`download-artifact` v8.0.2, `upload-artifact` v7.0.2) resynced. `scripts/check-lock-sync.sh`: in sync, transitively closed. ## Evidence * `scripts/tests/fix-workflow-pins.sh`: 28 checks — planted defects fixed, planted non-defects untouched, second runs byte-identical, controls with an empty table. Wired into `rust.yml`'s `dispatch-contracts` job. * `scripts/tests/dispatch-paths.sh` still passes. `bash -n` and the fleet's JSON registry parse. No bot slot, manifest or quarantine change; `[mass-delete-ok]` not needed (no deletions). Commits on this branch are unsigned: no signing key is available in this session (the configured key file is empty). GitHub signs the squash merge. --- _Generated by [Claude Code](https://claude.ai/code/session_01Xn9nqHVbUTRLgBdedoXAc8)_ <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Updated shared governance, security scanning, mirroring, and scorecard workflows, with explicit secret mappings where needed. * Added tools to repair stale workflow references, missing Rust toolchain settings, and lockfile references. * **Bug Fixes** * Rust formatting checks now block CI when formatting requirements are not met. * **Tests** * Added offline checks for workflow maintenance tools, including verification that repeated runs leave corrected files unchanged. * CI now runs these checks. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
1 parent 114356f commit 6e38719

32 files changed

Lines changed: 7260 additions & 112 deletions

‎.github/workflows/actions.lock‎

Lines changed: 50 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ workflows:
1010
- 'actions/checkout@v7.0.1'
1111
- 'actions/configure-pages@v6.0.0'
1212
- 'actions/deploy-pages@v5.0.1'
13-
- 'actions/download-artifact@v8.0.1'
13+
- 'actions/download-artifact@v8.0.2'
1414
- 'actions/upload-pages-artifact@v5.0.0'
1515
- 'haskell-actions/setup@v2.12.1'
1616
'.github/workflows/codeql.yml':
@@ -23,11 +23,11 @@ workflows:
2323
'.github/workflows/e2e.yml':
2424
- 'actions/checkout@v7.0.1'
2525
'.github/workflows/governance.yml':
26-
- 'hyperpolymath/standards@da2c748aad55c1a1dcba00b60fe4a35017bc6540'
26+
- 'hyperpolymath/standards@75bd5994470661a099df562d6d5ad2fe744dbd66'
2727
'.github/workflows/hypatia-dispatch-intake.yml':
2828
- 'actions/checkout@v7.0.1'
2929
'.github/workflows/hypatia-scan.yml':
30-
- 'hyperpolymath/standards@da2c748aad55c1a1dcba00b60fe4a35017bc6540'
30+
- 'hyperpolymath/standards@75bd5994470661a099df562d6d5ad2fe744dbd66'
3131
'.github/workflows/inbox-steward.yml':
3232
- 'actions/checkout@v7.0.1'
3333
'.github/workflows/instant-sync.yml':
@@ -36,17 +36,17 @@ workflows:
3636
'.github/workflows/labels.yml': []
3737
'.github/workflows/learning-loop.yml':
3838
- 'actions/checkout@v7.0.1'
39-
- 'actions/upload-artifact@v7.0.1'
39+
- 'actions/upload-artifact@v7.0.2'
4040
'.github/workflows/lock-sync-gate.yml': []
4141
'.github/workflows/mirror.yml':
42-
- 'hyperpolymath/standards@571cc734cd69fb846032ec77a662aa8ee4fc32cd'
42+
- 'hyperpolymath/standards@75bd5994470661a099df562d6d5ad2fe744dbd66'
4343
'.github/workflows/pages.yml':
4444
- 'actions/checkout@v7.0.1'
4545
- 'actions/deploy-pages@v5.0.1'
4646
- 'actions/upload-pages-artifact@v5.0.0'
4747
'.github/workflows/panicbot-sweep.yml':
4848
- 'actions/checkout@v7.0.1'
49-
- 'actions/upload-artifact@v7.0.1'
49+
- 'actions/upload-artifact@v7.0.2'
5050
- 'dtolnay/rust-toolchain@v1'
5151
- 'swatinem/rust-cache@v2.9.2'
5252
'.github/workflows/push-email-notify.yml':
@@ -56,16 +56,16 @@ workflows:
5656
'.github/workflows/rust.yml':
5757
- 'actions/checkout@v7.0.1'
5858
'.github/workflows/scorecard.yml':
59-
- 'hyperpolymath/standards@da2c748aad55c1a1dcba00b60fe4a35017bc6540'
59+
- 'hyperpolymath/standards@75bd5994470661a099df562d6d5ad2fe744dbd66'
6060
'.github/workflows/secret-scanner.yml':
61-
- 'hyperpolymath/standards@571cc734cd69fb846032ec77a662aa8ee4fc32cd'
61+
- 'hyperpolymath/standards@75bd5994470661a099df562d6d5ad2fe744dbd66'
6262
'.github/workflows/supervised-fleet-scan.yml':
6363
- 'actions/checkout@v7.0.1'
6464
'.github/workflows/vendored-bot-drift.yml':
6565
- 'actions/checkout@v7.0.1'
6666
dependencies:
6767
'actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9':
68-
ref: '55cc8345863c7cc4c66a329aec7e433d2d1c52a9'
68+
ref: 'v6.1.0'
6969
commit: 'sha1-55cc8345863c7cc4c66a329aec7e433d2d1c52a9'
7070
owner_id: 44036562
7171
repo_id: 215566462
@@ -75,7 +75,7 @@ dependencies:
7575
owner_id: 44036562
7676
repo_id: 215566462
7777
'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1':
78-
ref: '3d3c42e5aac5ba805825da76410c181273ba90b1'
78+
ref: 'v7.0.1'
7979
commit: 'sha1-3d3c42e5aac5ba805825da76410c181273ba90b1'
8080
owner_id: 44036562
8181
repo_id: 197814629
@@ -94,24 +94,24 @@ dependencies:
9494
commit: 'sha1-368f82528645a54fb793d4d04e342629a3f51346'
9595
owner_id: 44036562
9696
repo_id: 438112499
97-
'actions/download-artifact@v8.0.1':
98-
ref: 'v8.0.1'
99-
commit: 'sha1-3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c'
97+
'actions/download-artifact@v8.0.2':
98+
ref: 'v8.0.2'
99+
commit: 'sha1-9000827ccba6bdab643e8b6fd33ac0654aef8333'
100100
owner_id: 44036562
101101
repo_id: 192626254
102-
'actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a':
103-
ref: '043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
104-
commit: 'sha1-043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
105-
owner_id: 44036562
106-
repo_id: 192625955
107102
'actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f':
108103
ref: 'v7.0.0'
109104
commit: 'sha1-bbbca2ddaa5d8feaa63e36b76fdaad77386f024f'
110105
owner_id: 44036562
111106
repo_id: 192625955
112-
'actions/upload-artifact@v7.0.1':
113-
ref: 'v7.0.1'
114-
commit: 'sha1-043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
107+
'actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9':
108+
ref: 'v7.0.2'
109+
commit: 'sha1-cf430e030ddbb5b0abf93d22962f4752f3646cd9'
110+
owner_id: 44036562
111+
repo_id: 192625955
112+
'actions/upload-artifact@v7.0.2':
113+
ref: 'v7.0.2'
114+
commit: 'sha1-cf430e030ddbb5b0abf93d22962f4752f3646cd9'
115115
owner_id: 44036562
116116
repo_id: 192625955
117117
'actions/upload-pages-artifact@v5.0.0':
@@ -121,9 +121,14 @@ dependencies:
121121
repo_id: 496012378
122122
uses:
123123
- 'actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f'
124-
'dtolnay/rust-toolchain@6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772':
125-
ref: '6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772'
126-
commit: 'sha1-6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772'
124+
'denoland/setup-deno@22d081ff2d3a40755e97629de92e3bcbfa7cf2ed':
125+
ref: 'v2.0.5'
126+
commit: 'sha1-22d081ff2d3a40755e97629de92e3bcbfa7cf2ed'
127+
owner_id: 42048915
128+
repo_id: 356423100
129+
'dtolnay/rust-toolchain@e2a55d2ffb04f378e9626c28d38b36d230d1e12f':
130+
ref: 'v1'
131+
commit: 'sha1-e2a55d2ffb04f378e9626c28d38b36d230d1e12f'
127132
owner_id: 1940490
128133
repo_id: 260749683
129134
'dtolnay/rust-toolchain@v1':
@@ -132,18 +137,18 @@ dependencies:
132137
owner_id: 1940490
133138
repo_id: 260749683
134139
'editorconfig-checker/action-editorconfig-checker@51f63319f592f97930c73d9c46184d20bd206393':
135-
ref: '51f63319f592f97930c73d9c46184d20bd206393'
140+
ref: 'v3.0.0'
136141
commit: 'sha1-51f63319f592f97930c73d9c46184d20bd206393'
137142
owner_id: 26415196
138143
repo_id: 297874902
139144
'erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124':
140-
ref: '54075bcc5e249e4758d363f27d099f55d843f124'
145+
ref: 'v1.24.1'
141146
commit: 'sha1-54075bcc5e249e4758d363f27d099f55d843f124'
142147
owner_id: 47606891
143148
repo_id: 331103973
144-
'github/codeql-action@cdf488f595d80d6e07e03d4674febd5ab45fa938':
145-
ref: 'cdf488f595d80d6e07e03d4674febd5ab45fa938'
146-
commit: 'sha1-cdf488f595d80d6e07e03d4674febd5ab45fa938'
149+
'github/codeql-action@b96794f015dfd88f77b49b1c93e0fa7110f94c63':
150+
ref: 'v4.38.0'
151+
commit: 'sha1-b96794f015dfd88f77b49b1c93e0fa7110f94c63'
147152
owner_id: 9919
148153
repo_id: 259445878
149154
'github/codeql-action@v4.38.2':
@@ -171,33 +176,33 @@ dependencies:
171176
commit: 'sha1-c1c9fa07992a02c1fd3d67a0dc1b08cccb852aef'
172177
owner_id: 6759885
173178
repo_id: 1352485172
174-
'hyperpolymath/standards@571cc734cd69fb846032ec77a662aa8ee4fc32cd':
175-
ref: '571cc734cd69fb846032ec77a662aa8ee4fc32cd'
176-
commit: 'sha1-571cc734cd69fb846032ec77a662aa8ee4fc32cd'
177-
owner_id: 6759885
178-
repo_id: 1116521501
179-
uses:
180-
- 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1'
181-
- 'dtolnay/rust-toolchain@6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772'
182-
- 'webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555'
183-
'hyperpolymath/standards@da2c748aad55c1a1dcba00b60fe4a35017bc6540':
184-
ref: 'da2c748aad55c1a1dcba00b60fe4a35017bc6540'
185-
commit: 'sha1-da2c748aad55c1a1dcba00b60fe4a35017bc6540'
179+
'hyperpolymath/standards@75bd5994470661a099df562d6d5ad2fe744dbd66':
180+
ref: '75bd5994470661a099df562d6d5ad2fe744dbd66'
181+
commit: 'sha1-75bd5994470661a099df562d6d5ad2fe744dbd66'
186182
owner_id: 6759885
187183
repo_id: 1116521501
188184
uses:
189185
- 'actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9'
190186
- 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1'
191-
- 'actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
187+
- 'actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9'
188+
- 'denoland/setup-deno@22d081ff2d3a40755e97629de92e3bcbfa7cf2ed'
189+
- 'dtolnay/rust-toolchain@e2a55d2ffb04f378e9626c28d38b36d230d1e12f'
192190
- 'editorconfig-checker/action-editorconfig-checker@51f63319f592f97930c73d9c46184d20bd206393'
193191
- 'erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124'
194-
- 'github/codeql-action@cdf488f595d80d6e07e03d4674febd5ab45fa938'
192+
- 'github/codeql-action@b96794f015dfd88f77b49b1c93e0fa7110f94c63'
195193
- 'ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc'
194+
- 'oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6'
195+
- 'webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555'
196196
'ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc':
197-
ref: '2d1146689b8cda280b9bc96326124645441f03bc'
197+
ref: 'v2.4.4'
198198
commit: 'sha1-2d1146689b8cda280b9bc96326124645441f03bc'
199199
owner_id: 67707773
200200
repo_id: 421101922
201+
'oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6':
202+
ref: 'v2.2.0'
203+
commit: 'sha1-0c5077e51419868618aeaa5fe8019c62421857d6'
204+
owner_id: 108928776
205+
repo_id: 512644635
201206
'peter-evans/repository-dispatch@v4.0.1':
202207
ref: 'v4.0.1'
203208
commit: 'sha1-28959ce8df70de7be546dd1250a005dd32156697'
@@ -209,7 +214,7 @@ dependencies:
209214
owner_id: 580492
210215
repo_id: 298565987
211216
'webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555':
212-
ref: 'e83874834305fe9a4a2997156cb26c5de65a8555'
217+
ref: 'v0.10.0'
213218
commit: 'sha1-e83874834305fe9a4a2997156cb26c5de65a8555'
214219
owner_id: 135788
215220
repo_id: 208510314

‎.github/workflows/governance.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ permissions:
3535

3636
jobs:
3737
governance:
38-
uses: hyperpolymath/standards/.github/workflows/governance-reusable.yml@da2c748aad55c1a1dcba00b60fe4a35017bc6540
38+
uses: hyperpolymath/standards/.github/workflows/governance-reusable.yml@75bd5994470661a099df562d6d5ad2fe744dbd66
3939
permissions:
4040
actions: read
4141
contents: read

‎.github/workflows/hypatia-scan.yml‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ permissions:
3131

3232
jobs:
3333
hypatia:
34-
uses: hyperpolymath/standards/.github/workflows/hypatia-scan-reusable.yml@da2c748aad55c1a1dcba00b60fe4a35017bc6540
35-
secrets: inherit
34+
uses: hyperpolymath/standards/.github/workflows/hypatia-scan-reusable.yml@75bd5994470661a099df562d6d5ad2fe744dbd66
35+
# hypatia-scan-reusable declares one secret; pass that one, not everything.
36+
secrets:
37+
HYPATIA_SCAN_PAT: ${{ secrets.HYPATIA_SCAN_PAT }}
3638
# Total caller-side wall-clock cap for the reusable. Matches
3739
# Hypatia's `missing_timeout_minutes` rule expectation. The scan is
3840
# typically ~3 min; the cap leaves headroom for slow estate builds.

‎.github/workflows/mirror.yml‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,17 @@ permissions:
1515

1616
jobs:
1717
mirror:
18-
uses: hyperpolymath/standards/.github/workflows/mirror-reusable.yml@571cc734cd69fb846032ec77a662aa8ee4fc32cd
19-
secrets: inherit
18+
uses: hyperpolymath/standards/.github/workflows/mirror-reusable.yml@75bd5994470661a099df562d6d5ad2fe744dbd66
19+
# mirror-reusable declares exactly these seven forge keys and forbids
20+
# `secrets: inherit`; pass them by name.
21+
secrets:
22+
GITLAB_SSH_KEY: ${{ secrets.GITLAB_SSH_KEY }}
23+
BITBUCKET_SSH_KEY: ${{ secrets.BITBUCKET_SSH_KEY }}
24+
CODEBERG_SSH_KEY: ${{ secrets.CODEBERG_SSH_KEY }}
25+
SOURCEHUT_SSH_KEY: ${{ secrets.SOURCEHUT_SSH_KEY }}
26+
DISROOT_SSH_KEY: ${{ secrets.DISROOT_SSH_KEY }}
27+
GITEA_SSH_KEY: ${{ secrets.GITEA_SSH_KEY }}
28+
RADICLE_KEY: ${{ secrets.RADICLE_KEY }}
2029
permissions:
2130
actions: read
2231
contents: read

‎.github/workflows/rust.yml‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,11 @@ jobs:
6565
run: cargo test --locked --verbose
6666
- name: Clippy (deny warnings)
6767
run: cargo clippy --locked --all-targets -- -D warnings
68-
- name: Rustfmt check (informational)
69-
# Pre-existing formatting drift is not yet gated; surfaced here so it
70-
# stays visible without blocking. Flip to a hard gate after a dedicated
71-
# `cargo fmt` pass lands.
68+
- name: Rustfmt check
69+
# A hard gate since 2026-10-19: all four matrix crates were measured
70+
# rustfmt-clean, so `continue-on-error` (hypatia RE005, a silent
71+
# green) no longer buys anything.
7272
run: cargo fmt --check
73-
continue-on-error: true
7473

7574
dispatch-contracts:
7675
name: Dispatch path and outcome contracts
@@ -83,6 +82,8 @@ jobs:
8382
with:
8483
persist-credentials: false
8584
- run: bash scripts/tests/dispatch-paths.sh
85+
- name: Workflow-pin fix scripts keep their contracts
86+
run: bash scripts/tests/fix-workflow-pins.sh
8687

8788
gsbot:
8889
name: GSBot build, tests and dependency security

‎.github/workflows/scorecard.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ jobs:
1818
contents: read
1919
security-events: write
2020
id-token: write
21-
uses: hyperpolymath/standards/.github/workflows/scorecard-reusable.yml@da2c748aad55c1a1dcba00b60fe4a35017bc6540
21+
uses: hyperpolymath/standards/.github/workflows/scorecard-reusable.yml@75bd5994470661a099df562d6d5ad2fe744dbd66

‎.github/workflows/secret-scanner.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ jobs:
2424
contents: read
2525
pull-requests: write
2626
actions: read
27-
uses: hyperpolymath/standards/.github/workflows/secret-scanner-reusable.yml@571cc734cd69fb846032ec77a662aa8ee4fc32cd
28-
secrets: inherit
27+
uses: hyperpolymath/standards/.github/workflows/secret-scanner-reusable.yml@75bd5994470661a099df562d6d5ad2fe744dbd66
28+
# secret-scanner-reusable declares no caller secret, so none is passed.

‎.gitleaksignore‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# SPDX-License-Identifier: MPL-2.0
2+
# gitleaks fingerprints (commit:file:rule:line) of historical false positives.
3+
# Each is a documented placeholder, not a credential; the sustainabot file no
4+
# longer exists (deleted in ded43d0) and the seambot literal is `ghs_xxx…`.
5+
d1d8e1db885c6bf15833d413cdae42a5710d7ff4:bots/seambot/tests/github_integration.rs:github-app-token:154
6+
37db42f48f7f85f2558a57e3f6643a62f39da2bc:bots/seambot/tests/github_integration.rs:github-app-token:154
7+
f1b3dc853aa9c13e47fde308681c4a1e0bb58eb1:bots/seambot/tests/github_integration.rs:github-app-token:154
8+
d1d8e1db885c6bf15833d413cdae42a5710d7ff4:bots/sustainabot/docs/GITHUB_APP_SETUP.md:private-key:89
9+
37db42f48f7f85f2558a57e3f6643a62f39da2bc:bots/sustainabot/docs/GITHUB_APP_SETUP.md:private-key:89
10+
f1b3dc853aa9c13e47fde308681c4a1e0bb58eb1:bots/sustainabot/docs/GITHUB_APP_SETUP.md:private-key:89

‎.machine_readable/descriptiles/AGENTIC.a2ml‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,25 @@ allow-silent-skip = false
3535
require-rerun-after-fix = true
3636
release-claim-requires-hard-pass = true
3737

38+
[workflow-pin-remediation]
39+
# The fleet's half of the pin-propagation architecture
40+
# hypatia (detection) -> gitbot-fleet (this: actuation) -> .git-private-farm (propagation)
41+
# Three fix scripts, one contract test (scripts/tests/fix-workflow-pins.sh, run
42+
# by rust.yml), and two data files that carry the SAME facts hypatia detects
43+
# on, so detection and repair cannot drift apart:
44+
# scripts/fix-rust-toolchain-input.sh WF026 SHA-pinned dtolnay/rust-toolchain with no toolchain: input
45+
# scripts/fix-stale-reusable-pin.sh WF027, PIN-003 a caller pinned at a reusable revision the estate has MEASURED dead
46+
# (not WF016: its orphan SHAs have no recorded replacement in the table)
47+
# scripts/fix-lock-self-sha-refs.sh PI006 actions.lock record whose ref is its own SHA (GitHub: "invalid lockfile pin")
48+
# scripts/lib/stale-reusable-pins.tsv the dead revisions and the one replacement each moves to
49+
# scripts/lib/action-ref-tags.tsv the tag that resolves to each commit the estate pins by SHA
50+
may-rewrite-reusable-pins = true # only to a replacement the table names; never "newest"
51+
may-rewrite-actions-lock = true # SHA substitution and ref:tag only; nested uses: lists are never recomputed here
52+
may-choose-replacement-sha = false # a human picks it against standards/scripts/lock-selfcheck.sh and records it in the table
53+
may-run-network-lookups = true # git ls-remote --tags for a tag the map lacks; --offline disables it
54+
must-report-unresolved = true # a self-SHA record with no tag is reported and left, never guessed (exit 1)
55+
must-be-idempotent = true # every script's second run is byte-identical; the contract test asserts it
56+
3857
[automation-hooks]
3958
# on-enter: Read 0-AI-MANIFEST.a2ml, then .machine_readable/descriptiles/STATE.a2ml
4059
# on-exit: Update .machine_readable/descriptiles/STATE.a2ml with session outcomes

‎fleet-coordinator.sh‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -632,15 +632,17 @@ EOF
632632
fi
633633
}
634634

635-
create_rule_approval_pr() {
635+
create_rule_approval_pr() (
636636
local rule_file="$1"
637637
local rule_type="$2"
638638
local observations="$3"
639639

640640
log_bot "hypatia" "Creating rule approval PR for $rule_type..."
641641

642642
# Clone hypatia repo to temp directory
643-
local hypatia_dir="/tmp/hypatia-rule-pr-$$"
643+
local hypatia_dir
644+
hypatia_dir="$(mktemp -d)"
645+
trap 'rm -rf "$hypatia_dir"' EXIT
644646
git clone https://github.com/hyperpolymath/hypatia.git "$hypatia_dir" 2>/dev/null
645647

646648
cd "$hypatia_dir"
@@ -680,7 +682,6 @@ COMMIT_EOF
680682
git push origin "$branch_name" 2>/dev/null || {
681683
log_warn "Failed to push rule PR branch"
682684
cd - > /dev/null
683-
rm -rf "$hypatia_dir"
684685
return 1
685686
}
686687

@@ -734,8 +735,7 @@ PR_BODY
734735
fi
735736

736737
cd - > /dev/null
737-
rm -rf "$hypatia_dir"
738-
}
738+
)
739739

740740
deploy_bots() {
741741
log_error "BLOCKED: deployment readiness is not verified; deployment is quarantined. See docs/AUTOMATION-QUARANTINE.adoc."

0 commit comments

Comments
 (0)