Skip to content

Commit dcfcdc4

Browse files
feat(echidnabot): pinned sync from hyperpolymath/echidnabot + drift gate [mass-delete-ok] (#586)
## Summary Owner decision (2026-10-05): standalone `hyperpolymath/echidnabot` is canon. `bots/echidnabot/` is now a **pinned sync** of it, with a CI drift check, instead of a hand-maintained fork. - `bots/echidnabot/FLEET-SYNC.json` pins `hyperpolymath/echidnabot@bf2c0ff` (upstream `main` head at time of writing). Only the crate surface is vendored; upstream docs/packaging/wiki stay upstream (`bots/` slots are thin, CLAUDE.md invariant 6). - `scripts/sync-vendored-bot.sh` (`--check` / `--sync [--rev SHA]`) + `scripts/tests/sync-vendored-bot.sh` (21 offline assertions, planted controls: edited file, extra file, mode change, non-canonical lock, short/error-body rev, side-branch rev, empty include). - `.github/workflows/vendored-bot-drift.yml`: runs on PRs, pushes to `main`, weekly; reports how far upstream is ahead of the pin. - Dependabot no longer watches `/bots/echidnabot`, so the copy is never bumped independently. `dependabot.yml` converted to KYAML (D280, non-workflow YAML). This also repairs an `ignore:` block that was mis-nested under the github-actions `groups` key. - `CANONICAL_SOURCE.adoc` rewritten. It lists the six fleet-only files that the switch drops (recoverable from `8a4f983`). `tests/webhook_e2e_test.rs` should be promoted upstream. - `actions.lock` resynced with `gh actions-lock`. On `main`, `--no-fix` reported an unused `codeql-action@1c5b675` entry. `codeql.yml` now names `v4.38.2`, which is the SHA it already ran (`2892aa5`), so CodeQL behaviour is unchanged. - `shared-context/findings` cleanup: - Repointed the dangling `echidna/latest.json`. - Dropped three byte-identical duplicate echidna scans and two zero-byte non-marker files. The `.processed` markers are kept. - Dropped three misfiled root `hypatia-echidnabot-*` files: an error log, a log-prefixed partial and a bare array, all superseded by `findings/echidnabot/`. - `echidnabot/latest.json` is now the symlink that `submit-finding.sh` writes. - `scripts/enroll-hypatia-fleet.sh`: discovery now covers the star-list layout (depth 1–3). At depth 1 it found 3 of 406 clones under `hyper-repos/`. New `tests/enroll-discovery-test.sh` with a depth-1 planted control, wired into `e2e.yml`. `[mass-delete-ok]`: 65 tracked files are deliberately removed, mostly upstream-only docs/packaging dropped from the vendored slot. All of them remain in history. ## Verification (local) - `bash scripts/tests/sync-vendored-bot.sh` → 21 passed, 0 failed - `bash scripts/sync-vendored-bot.sh echidnabot --check` → matches, 75 entries - `bash tests/enroll-discovery-test.sh` → ok (incl. planted control) - `gh actions-lock --no-fix` → clean - `kyaml-format.sh --check .github/dependabot.yml` → clean - `docstring-scan.sh --staged --check` → 18/18 documented Not covered by this PR: per-repo `FLEET-ENROLLMENT.a2ml` directives live in the target repos, and those repos' own PRs carry them. ## CI follow-ups in this PR - `Dispatch path and outcome contracts` (required, red on `main` since #571): the test now asserts the quarantine on the production runner and runs the path/outcome contracts through a test-only seam copy, with planted controls. Closes #587. - `GSBot build, tests and dependency security` (required, red on `main`): `bots/gsbot` rustls 0.23.40 → 0.23.45 for RUSTSEC-2026-0285; `cargo deny ... check advisories` is clean locally. - `governance / Validate Hypatia Baseline` and `Hypatia`: the four new findings are in vendored upstream echidnabot code, which the drift gate forbids editing here. They are baselined with `tracking_issue` and `expires_at`. ## Deferred red checks (AGENTS.md §5c item 3) - `Hypatia`: deferred to #588 (vendored echidnabot findings must be fixed upstream; baselined here). - `governance / Validate Hypatia Baseline`: deferred to #588. - `scorecard / Run Scorecard PR`: deferred to #589 (pre-existing on `main`; reconciler fails on `casket-pages.yml`, which this PR does not touch). - `Codeac analyze results`: deferred to #590 (pre-existing on `main`; external service cannot analyse the repo). 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 8a4f983 commit dcfcdc4

159 files changed

Lines changed: 13927 additions & 22778 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/dependabot.yml‎

Lines changed: 62 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,63 @@
11
# SPDX-License-Identifier: MPL-2.0
2-
version: 2
3-
updates:
4-
- package-ecosystem: "github-actions"
5-
directory: "/"
6-
schedule:
7-
interval: "daily"
8-
groups:
9-
actions:
10-
patterns:
11-
- "*"
12-
open-pull-requests-limit: 2
13-
14-
# Rust dependencies. Keep every Cargo project in one update entry so the
15-
# open-PR limit applies to the fleet as a whole, rather than once per bot.
16-
# Grouping by dependency name updates a shared crate across every affected
17-
# project in one PR instead of opening one PR per Cargo.lock.
18-
ignore:
19-
# HOLD: github/codeql-action at v4.38.0 (SHA-pinned). v4.38.1 fails
20-
# GitHub workflow-startup validation estate-wide (nexia-list#100;
21-
# SHA-form re-bump bypassed versions-scoped ignores - nexia-list#101).
22-
# Hold until upstream clears 4.38.1 or a new release verifies green.
23-
- dependency-name: "github/codeql-action"
24-
25-
- package-ecosystem: "cargo"
26-
directories:
27-
- "/robot-repo-automaton"
28-
- "/shared-context"
29-
- "/bots/echidnabot"
30-
- "/bots/glambot"
31-
- "/bots/rhodibot"
32-
- "/bots/seambot"
33-
- "/bots/sustainabot"
34-
- "/bots/finishingbot"
35-
- "/bots/accessibilitybot"
36-
- "/bots/cipherbot"
37-
- "/bots/panicbot"
38-
schedule:
39-
interval: "weekly"
40-
open-pull-requests-limit: 3
41-
groups:
42-
fleet-dependencies:
43-
group-by: dependency-name
2+
{
3+
version: 2,
4+
updates: [
5+
{
6+
package-ecosystem: "github-actions",
7+
directory: "/",
8+
schedule: {
9+
interval: "daily",
10+
},
11+
groups: {
12+
actions: {
13+
patterns: [
14+
"*",
15+
],
16+
},
17+
},
18+
open-pull-requests-limit: 2,
19+
ignore: [
20+
# HOLD: github/codeql-action at v4.38.0 (SHA-pinned). v4.38.1 fails
21+
# GitHub workflow-startup validation estate-wide (nexia-list#100;
22+
# SHA-form re-bump bypassed versions-scoped ignores - nexia-list#101).
23+
# Hold until upstream clears 4.38.1 or a new release verifies green.
24+
{
25+
dependency-name: "github/codeql-action",
26+
},
27+
],
28+
},
29+
# Rust dependencies. Keep every Cargo project in one update entry so the
30+
# open-PR limit applies to the fleet as a whole, rather than once per bot.
31+
# Grouping by dependency name updates a shared crate across every affected
32+
# project in one PR instead of opening one PR per Cargo.lock.
33+
#
34+
# /bots/echidnabot is deliberately absent: it is a pinned sync of
35+
# hyperpolymath/echidnabot (bots/echidnabot/FLEET-SYNC.json). Its dependencies
36+
# are bumped upstream and arrive here by a pin bump, never independently;
37+
# the Vendored bot drift workflow fails on any local edit.
38+
{
39+
package-ecosystem: "cargo",
40+
directories: [
41+
"/robot-repo-automaton",
42+
"/shared-context",
43+
"/bots/glambot",
44+
"/bots/rhodibot",
45+
"/bots/seambot",
46+
"/bots/sustainabot",
47+
"/bots/finishingbot",
48+
"/bots/accessibilitybot",
49+
"/bots/cipherbot",
50+
"/bots/panicbot",
51+
],
52+
schedule: {
53+
interval: "weekly",
54+
},
55+
open-pull-requests-limit: 3,
56+
groups: {
57+
fleet-dependencies: {
58+
group-by: "dependency-name",
59+
},
60+
},
61+
},
62+
],
63+
}

‎.github/workflows/actions.lock‎

Lines changed: 7 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ workflows:
1515
- 'haskell-actions/setup@v2.12.1'
1616
'.github/workflows/codeql.yml':
1717
- 'actions/checkout@v7.0.1'
18-
- 'github/codeql-action@1c5b675653bb5c22dbe9b12b556ec555138e09fd'
18+
- 'github/codeql-action@v4.38.2'
1919
'.github/workflows/dogfood-gate.yml':
2020
- 'actions/checkout@v7.0.1'
2121
- 'hyperpolymath/deed-ecosystem@main'
@@ -48,7 +48,7 @@ workflows:
4848
- 'actions/checkout@v7.0.1'
4949
- 'actions/upload-artifact@v7.0.1'
5050
- 'dtolnay/rust-toolchain@v1'
51-
- 'Swatinem/rust-cache@v2.9.2'
51+
- 'swatinem/rust-cache@v2.9.2'
5252
'.github/workflows/push-email-notify.yml':
5353
- 'hyperpolymath/smtp-notify-action@v0.3.0'
5454
'.github/workflows/repo-integrity-guard.yml':
@@ -61,12 +61,9 @@ workflows:
6161
- 'hyperpolymath/standards@571cc734cd69fb846032ec77a662aa8ee4fc32cd'
6262
'.github/workflows/supervised-fleet-scan.yml':
6363
- 'actions/checkout@v7.0.1'
64+
'.github/workflows/vendored-bot-drift.yml':
65+
- 'actions/checkout@v7.0.1'
6466
dependencies:
65-
'Swatinem/rust-cache@v2.9.2':
66-
ref: 'v2.9.2'
67-
commit: 'sha1-6323deb102c322ba6fcbdcafc7e3dddab59af2b6'
68-
owner_id: 580492
69-
repo_id: 298565987
7067
'actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9':
7168
ref: '55cc8345863c7cc4c66a329aec7e433d2d1c52a9'
7269
commit: 'sha1-55cc8345863c7cc4c66a329aec7e433d2d1c52a9'
@@ -144,36 +141,16 @@ dependencies:
144141
commit: 'sha1-54075bcc5e249e4758d363f27d099f55d843f124'
145142
owner_id: 47606891
146143
repo_id: 331103973
147-
'github/codeql-action@b96794f015dfd88f77b49b1c93e0fa7110f94c63':
148-
ref: 'b96794f015dfd88f77b49b1c93e0fa7110f94c63'
149-
commit: 'sha1-b96794f015dfd88f77b49b1c93e0fa7110f94c63'
150-
owner_id: 9919
151-
repo_id: 259445878
152-
'github/codeql-action@1c5b675653bb5c22dbe9b12b556ec555138e09fd':
153-
ref: '1c5b675653bb5c22dbe9b12b556ec555138e09fd'
154-
commit: 'sha1-1c5b675653bb5c22dbe9b12b556ec555138e09fd'
155-
owner_id: 9919
156-
repo_id: 259445878
157144
'github/codeql-action@cdf488f595d80d6e07e03d4674febd5ab45fa938':
158145
ref: 'cdf488f595d80d6e07e03d4674febd5ab45fa938'
159146
commit: 'sha1-cdf488f595d80d6e07e03d4674febd5ab45fa938'
160147
owner_id: 9919
161148
repo_id: 259445878
162-
'github/codeql-action@v4.37.8':
163-
ref: 'v4.37.8'
164-
commit: 'sha1-db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28'
165-
owner_id: 9919
166-
repo_id: 259445878
167-
'github/codeql-action@v4.38.0':
168-
ref: 'v4.38.0'
169-
commit: 'sha1-b96794f015dfd88f77b49b1c93e0fa7110f94c63'
149+
'github/codeql-action@v4.38.2':
150+
ref: 'v4.38.2'
151+
commit: 'sha1-2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2'
170152
owner_id: 9919
171153
repo_id: 259445878
172-
'haskell-actions/setup@v2.12.0':
173-
ref: 'v2.12.0'
174-
commit: 'sha1-6037f33647c3f17758a2356c80fc4a53d7e0685d'
175-
owner_id: 75048950
176-
repo_id: 623796603
177154
'haskell-actions/setup@v2.12.1':
178155
ref: 'v2.12.1'
179156
commit: 'sha1-0f7370ccbc65f22514ec3e094f6601b8d61fbbf7'
@@ -221,11 +198,6 @@ dependencies:
221198
commit: 'sha1-2d1146689b8cda280b9bc96326124645441f03bc'
222199
owner_id: 67707773
223200
repo_id: 421101922
224-
'ossf/scorecard-action@v2.4.4':
225-
ref: 'v2.4.4'
226-
commit: 'sha1-2d1146689b8cda280b9bc96326124645441f03bc'
227-
owner_id: 67707773
228-
repo_id: 421101922
229201
'peter-evans/repository-dispatch@v4.0.1':
230202
ref: 'v4.0.1'
231203
commit: 'sha1-28959ce8df70de7be546dd1250a005dd32156697'

‎.github/workflows/codeql.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ jobs:
4848
uses: actions/checkout@v7.0.1
4949

5050
- name: Initialize CodeQL
51-
uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.0 (4.38.1 blocked estate-wide; nexia-list#100)
51+
uses: github/codeql-action/init@v4.38.2
5252
with:
5353
languages: ${{ matrix.language }}
5454
build-mode: ${{ matrix.build-mode }}
5555

5656
- name: Perform CodeQL Analysis
57-
uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.0 (4.38.1 blocked estate-wide; nexia-list#100)
57+
uses: github/codeql-action/analyze@v4.38.2
5858
with:
5959
category: "/language:${{ matrix.language }}"

‎.github/workflows/e2e.yml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,5 @@ jobs:
2626
run: bash tests/e2e.sh
2727
- name: Verify canonical descriptile policy repair
2828
run: bash tests/retired-descriptile-policy-test.sh
29+
- name: Verify star-list enrollment discovery
30+
run: bash tests/enroll-discovery-test.sh

‎.github/workflows/lock-sync-gate.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# This workflow is managed by gh actions-lock.
12
# SPDX-License-Identifier: MPL-2.0
23
name: Lock Sync Gate
34

‎.github/workflows/panicbot-sweep.yml‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ jobs:
4646

4747
- name: Install Rust toolchain
4848
uses: dtolnay/rust-toolchain@v1
49-
with:
50-
toolchain: master
5149
with:
5250
toolchain: stable
5351

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# This workflow is managed by gh actions-lock.
2+
# SPDX-License-Identifier: MPL-2.0
3+
# Vendored bot drift — bots/<bot>/ copies of standalone repositories are pinned
4+
# syncs, not forks. This fails when a vendored copy differs from the upstream
5+
# commit pinned in bots/<bot>/FLEET-SYNC.json (see scripts/sync-vendored-bot.sh
6+
# and bots/echidnabot/CANONICAL_SOURCE.adoc).
7+
name: Vendored bot drift
8+
9+
on:
10+
push:
11+
branches: [main]
12+
pull_request:
13+
branches: ['**']
14+
schedule:
15+
- cron: '17 6 * * 1'
16+
workflow_dispatch:
17+
18+
permissions:
19+
contents: read
20+
21+
jobs:
22+
tool-tests:
23+
name: sync-vendored-bot tests (planted controls)
24+
runs-on: ubuntu-24.04
25+
timeout-minutes: 5
26+
steps:
27+
- uses: actions/checkout@v7.0.1
28+
with:
29+
persist-credentials: false
30+
- run: bash scripts/tests/sync-vendored-bot.sh
31+
32+
drift:
33+
name: echidnabot pinned to hyperpolymath/echidnabot
34+
runs-on: ubuntu-24.04
35+
timeout-minutes: 5
36+
steps:
37+
- uses: actions/checkout@v7.0.1
38+
with:
39+
persist-credentials: false
40+
- name: Fleet copy equals pinned upstream rev
41+
run: bash scripts/sync-vendored-bot.sh echidnabot --check
42+
- name: Report how far upstream main is ahead of the pin (informational)
43+
run: |
44+
set -euo pipefail
45+
lock=bots/echidnabot/FLEET-SYNC.json
46+
repo="$(jq -r .repo "$lock")"
47+
rev="$(jq -r .rev "$lock")"
48+
branch="$(jq -r .upstream_branch "$lock")"
49+
tmp="$(mktemp -d)"
50+
git init -q --bare "$tmp/up.git"
51+
git -C "$tmp/up.git" fetch -q --no-tags --filter=blob:none "$repo" "+refs/heads/$branch:refs/heads/$branch"
52+
ahead="$(git -C "$tmp/up.git" rev-list --count "$rev..refs/heads/$branch")"
53+
head="$(git -C "$tmp/up.git" rev-parse "refs/heads/$branch")"
54+
if [ "$ahead" -gt 0 ]; then
55+
echo "::notice::echidnabot upstream $branch is $ahead commit(s) ahead of the pin ($rev -> $head). Bump with: scripts/sync-vendored-bot.sh echidnabot --sync --rev $head"
56+
else
57+
echo "Pin is at upstream $branch head ($head)."
58+
fi

0 commit comments

Comments
 (0)