-
-
Notifications
You must be signed in to change notification settings - Fork 0
fix(ci): resync actions.lock and add a lock-sync recurrence gate #566
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
54cbf05
808d987
574555e
05ece6d
08e2bcc
96d7edb
c67ae64
cabce09
e628ad4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,63 @@ | ||
| # SPDX-License-Identifier: MPL-2.0 | ||
| name: Lock Sync Gate | ||
|
|
||
| # Fails any pull request whose .github/workflows/actions.lock has drifted from | ||
| # the workflow YAML. That drift is not cosmetic: GitHub refuses such a run at | ||
| # startup, creating ZERO jobs, and reports only "This run likely failed because | ||
| # of a workflow file issue." A single grouped Dependabot bump can take out most | ||
| # of a repository's CI that way, because Dependabot rewrites `uses:` refs in the | ||
| # YAML and cannot touch the lockfile. Measured across 200 repositories on | ||
| # 2026-09-22: 39 had silently dead CI from exactly this cause. | ||
| # See hyperpolymath/standards#968. | ||
| # | ||
| # This workflow deliberately carries NO `uses:` of its own. It checks out by | ||
| # calling git in a `run:` step instead of using actions/checkout, so it has no | ||
| # lockfile entry to go stale and is structurally immune to the very failure it | ||
| # detects. Do not add a `uses:` to this file. | ||
| # | ||
| # There is also no `paths:` filter, on purpose: a filtered workflow never | ||
| # reports on pull requests that miss the filter, which deadlocks any branch | ||
| # ruleset that requires this check. | ||
|
|
||
| on: | ||
| pull_request: | ||
| push: | ||
| branches: [main] | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| concurrency: | ||
| group: lock-sync-gate-${{ github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| jobs: | ||
| lock-sync: | ||
| name: actions.lock is in sync with the workflow YAML | ||
| runs-on: ubuntu-latest | ||
| timeout-minutes: 5 | ||
| steps: | ||
| - name: Check out without actions/checkout | ||
| env: | ||
| REPO: ${{ github.repository }} | ||
| SHA: ${{ github.event.pull_request.head.sha || github.sha }} | ||
| TOKEN: ${{ github.token }} | ||
| run: | | ||
| set -euo pipefail | ||
| # Authenticate the fetch. An anonymous clone works only for public | ||
| # repositories; this gate must also run on private ones. The header | ||
| # form is used rather than a token in the remote URL so the | ||
| # credential is never written into .git/config. | ||
| AUTH="AUTHORIZATION: basic $(printf 'x-access-token:%s' "${TOKEN}" | base64 -w0)" | ||
| git init -q . | ||
| git remote add origin "https://github.com/${REPO}.git" | ||
| git -c http.extraheader="${AUTH}" fetch -q --depth 1 origin "${SHA}" | ||
| git checkout -q FETCH_HEAD | ||
| echo "checked out ${SHA}" | ||
|
|
||
| - name: Verify lockfile synchronisation | ||
| run: | | ||
| set -euo pipefail | ||
| test -x scripts/check-lock-sync.sh \ | ||
| || { echo "::error::scripts/check-lock-sync.sh missing or not executable"; exit 1; } | ||
| ./scripts/check-lock-sync.sh |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -10,7 +10,7 @@ | |
| # Arrays are kept single-line so the checker can parse them with grep. | ||
|
|
||
| [meta] | ||
| version = "0.2.0" | ||
| version = "0.3.0" | ||
| policy = "0-canon/TEMPLATE-APPLICABILITY-POLICY.adoc" | ||
|
|
||
| [capabilities] | ||
|
|
@@ -39,6 +39,14 @@ paths = ["README.adoc", "EXPLAINME.adoc|docs/EXPLAINME.adoc", "LICENSE", "SECURI | |
| "Cargo.lock" = "rust" | ||
| "src/**/*.rs" = "rust" | ||
| ".github/workflows/rust-ci.yml" = "rust" | ||
| # Julia library modules (the julia-library archetype's overlay; the | ||
| # #634 reference variant measured 2026-08-25: the language-specific | ||
| # delta is exactly these files). test/ (singular) is the Julia | ||
| # convention; rust uses tests/ and is ungated here by design. | ||
| "Project.toml" = "julia" | ||
| "test/" = "julia" | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win 🔎 Supported by static analysis🏁 Script executed: sed -n '1,90p' bots/rhodibot/canon/template-capability-gates.toml
rg -n 'template-capability-gates|capability.*gate|under-declared|test/' bots/rhodibot/src bots/rhodibot/tests bots/rhodibot/canonRepository: hyperpolymath/gitbot-fleet Length of output: 7804 🏁 Script executed: #!/bin/bash
set -e
printf '%s\n' '--- profile gate implementation ---'
rg -n -C 8 'VENDORED_GATES|template-capability-gates|effective capability|gate|gated|path.*capabil|capabil.*path' bots/rhodibot/src/canon bots/rhodibot/src bots/rhodibot/tests
printf '%s\n' '--- lockstep tests ---'
sed -n '110,220p' bots/rhodibot/tests/canon_lockstep.rs
printf '%s\n' '--- policy files ---'
find bots/rhodibot -maxdepth 3 -type f -iname '*TEMPLATE*' -o -iname '*APPLICABILITY*' | sort
for f in $(find bots/rhodibot -maxdepth 3 -type f \\( -iname '*TEMPLATE*' -o -iname '*APPLICABILITY*' \\) | sort); do
printf '\n--- %s ---\n' "$f"
sed -n '1,240p' "$f"
doneRepository: hyperpolymath/gitbot-fleet Length of output: 41671 🏁 Script executed: #!/bin/bash
set -e
printf '%s\n' '--- candidate policy path ---'
find bots -type f -name 'TEMPLATE-APPLICABILITY-POLICY.adoc' -print
printf '%s\n' '--- profile applicability and gate table declarations ---'
rg -n -C 12 'pub struct GateTable|impl GateTable|pub fn applicability|fn applicability|is_applicable|struct Gate|path|module' bots/rhodibot/src/canon/profile.rs bots/rhodibot/src/canon/*.rs
printf '%s\n' '--- policy ---'
policy=$(find bots -type f -name 'TEMPLATE-APPLICABILITY-POLICY.adoc' -print -quit)
if [ -n "$policy" ]; then
cat -n "$policy"
fiRepository: hyperpolymath/gitbot-fleet Length of output: 42107 🏁 Script executed: #!/bin/bash
set -e
printf '%s\n' '--- checker and direct references ---'
find . -type f \\( -name 'check-rsr-profile.sh' -o -iname '*profile*check*' \\) -print
rg -n -C 10 'check-rsr-profile|under.?decl|VESTIGIAL|effective capability|module path|gates.*files|files.*gates|carrier' --glob '!target/**' --glob '!node_modules/**' .Repository: hyperpolymath/gitbot-fleet Length of output: 301 🏁 Script executed: #!/bin/bash
set -e
printf '%s\n' '--- reference checker ---'
sed -n '1,280p' bots/rhodibot/scripts/check-rsr-profile.sh
printf '%s\n' '--- direct checker references and path-drift tests ---'
rg -n -C 8 'check-rsr-profile|VESTIGIAL|under.?decl|effective capability|gates.*path|path.*gate|template-capability-gates' bots/rhodibotRepository: hyperpolymath/gitbot-fleet Length of output: 276 🏁 Script executed: #!/bin/bash
set -e
printf '%s\n' '--- tracked checker-like files ---'
git ls-files | grep -Ei 'check.*profile|profile.*check|applicability|capability.*gate|gate.*capability' || true
printf '%s\n' '--- checker and drift terms ---'
rg -n --hidden --glob '!.git/**' 'check-rsr-profile|VESTIGIAL|under.?decl|effective capability|template-capability-gates' . || trueRepository: hyperpolymath/gitbot-fleet Length of output: 2332 Do not use The structural-drift rule compares detected capabilities with declared capabilities and flags under-declaration. The 🤖 Prompt for AI Agents |
||
| ".github/workflows/julia-ci.yml" = "julia" | ||
| ".github/workflows/julia-docs.yml" = "julia" | ||
| "src/interface/ffi/" = "ffi" | ||
| "abi.ipkg" = "abi" | ||
| "src/interface/abi/|src/interface/Abi/" = "abi" | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🔎 Supported by static analysis
🏁 Script executed:
Repository: hyperpolymath/gitbot-fleet
Length of output: 28212
🏁 Script executed:
Repository: hyperpolymath/gitbot-fleet
Length of output: 42192
🏁 Script executed:
Repository: hyperpolymath/gitbot-fleet
Length of output: 24898
🏁 Script executed:
Repository: hyperpolymath/gitbot-fleet
Length of output: 42318
🏁 Script executed:
Repository: hyperpolymath/gitbot-fleet
Length of output: 44233
Gate criterion 5.2.6 on both
juliaanddocs-site.The applicability model checks only the single capability in
gate. Since criterion5.2.6setsgate = "julia", any profile that declaresjuliaenters this criterion, even when it does not declaredocs-site.The report then parses the description as required documentation paths. A Julia repository without those paths can receive a missing finding. Extend the capability model to support the
juliaanddocs-siteconjunction, or add an equivalent guard before reporting the criterion.🤖 Prompt for AI Agents