Skip to content

ci: retire the dead A2ML validation gate - #90

Merged
hyperpolymath merged 1 commit into
mainfrom
retire/a2ml-gate
Sep 22, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
retire/a2ml-gate

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Retire the dead A2ML validation gate

A2ML does not exist. It was retired estate-wide after the ML-community name clash.
The a2ml-validate job nevertheless still ran on every pull request in this repo — and
it could only ever fail.

Why it could only ever fail

The job resolves hyperpolymath/a2ml-ecosystem/validate-action@main, and that
repository has been renamed to hyperpolymath/deed-ecosystem. The Actions runner
refuses a renamed action repo outright:

Unable to resolve action hyperpolymath/a2ml-ecosystem/validate-action@main, the
repository has been renamed or transferred

…even though gh api and a browser both follow the redirect. So this was a live gate
enforcing a dead format through an unresolvable action
.

What this changes

Removed as one coupled change:

  • the a2ml-validate job;
  • its entry in dogfood-summary's needs: list (where present);
  • the A2ML row and score block in the compliance scorecard (MAX 6 → 5);
  • hyperpolymath/a2ml-ecosystem@main from .github/workflows/actions.lock — both the
    reference under the workflow's own key and the now-orphan dependencies: record.

The lock entry must change in the same commit: GitHub compares the lock against the
YAML by literal string, so a workflow holding a uses: the lock does not record — or a
lock recording one the workflow no longer has — is rejected at startup with jobs=0.

This is a removal, not a silencing

No continue-on-error, no if: false, no downgrade of an error to a warning. The gate
is gone because the thing it gated is gone.

Scope note

This PR removes the gate. Residual *.a2ml manifest files and the pre-commit hooks
that reference them are tracked separately on the roll-up issue; they are not touched
here.

Refs: hyperpolymath/standards#1010

🤖 Generated with Claude Code

https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm

A2ML does not exist — it was retired estate-wide after the ML-community name
clash. The `a2ml-validate` job nevertheless still ran on every PR, and it could
only ever fail: it resolves `hyperpolymath/a2ml-ecosystem/validate-action@main`,
and that repository has been renamed to `hyperpolymath/deed-ecosystem`. The
Actions runner refuses a renamed action repo outright ("Unable to resolve
action ... has been renamed or transferred") even though the API and a browser
both follow the redirect.

So this was a live gate enforcing a dead format through an unresolvable action.

Removed, as one coupled change:
  - the `a2ml-validate` job,
  - its entry in `dogfood-summary`'s `needs:` list,
  - the A2ML row and score block in the compliance scorecard (MAX 6 -> 5),
  - `hyperpolymath/a2ml-ecosystem@main` from actions.lock.

The lock entry must go in the SAME commit: GitHub compares lock and YAML by
literal string, so a workflow holding a `uses:` the lock does not record — or a
lock recording one the workflow no longer has — is rejected at startup.

The gate is REMOVED, not silenced: no `continue-on-error`, no `if: false`, no
downgrade of an error to a warning.

Refs: hyperpolymath/standards#1010

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3hgXxWm6umMgZkjYyHnnm
@coderabbitai

coderabbitai Bot commented Sep 22, 2026

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: de8ebfc3-0165-405c-9bdd-34345e1ac1a8

📥 Commits

Reviewing files that changed from the base of the PR and between bed520c and f3e2570.

⛔ Files ignored due to path filters (1)
  • .github/workflows/actions.lock is excluded by !**/*.lock
📒 Files selected for processing (1)
  • .github/workflows/dogfood-checks.yml

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (11)
  • GitHub Check: Dogfooding compliance summary
  • GitHub Check: governance / Validate Hypatia Baseline
  • GitHub Check: governance / Exemption ratchet
  • GitHub Check: governance / Trusted-base reduction policy
  • GitHub Check: governance / Workflow security linter
  • GitHub Check: governance / Allowlist Preflight
  • GitHub Check: analyze (actions, none)
  • GitHub Check: analyze (javascript-typescript, none)
  • GitHub Check: Bench — Rust Binding Performance
  • GitHub Check: E2E — Connector + Protocol FFI Round-Trip
  • GitHub Check: Hypatia Neurosymbolic Analysis
⚠️ CI failures not shown inline (19)

GitHub Actions: Central Estate CI/CD Audit / 0_estate-audit.txt: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run # Accepted placements widened per owner ruling 2026-09-19: estate
 �[36;1m# Accepted placements widened per owner ruling 2026-09-19: estate�[0m
 �[36;1m# repos legitimately keep governance docs under docs/ (and GitHub�[0m
 �[36;1m# renders under .github/) — rsr-template-repo itself was failing on�[0m
 �[36;1m# layout, not on substance. Root forms still win (first hit).�[0m
 �[36;1m# Template-repo mode: see below.�[0m
 �[36;1m#�[0m
 �[36;1m# Presence-only checking rewards filler. This gate previously demanded�[0m
 �[36;1m# ARCHITECTURE.md / MAINTAINERS.adoc / GOVERNANCE.md and checked only�[0m
 �[36;1m# that the paths existed — so the cheapest way to pass was to commit�[0m
 �[36;1m# template boilerplate. That happened: an estate repo acquired an�[0m
 �[36;1m# ARCHITECTURE.md describing a directory layout it does not have, a�[0m
 �[36;1m# MAINTAINERS naming a different account as owner, and a mise.toml�[0m
 �[36;1m# pinning `zig = "latest"` against that repo's own .tool-versions.�[0m
 �[36;1m# All three would have passed. So: presence, THEN format, THEN substance.�[0m
 �[36;1m#�[0m
 �[36;1m# Format policy (estate):�[0m
 �[36;1m#   .adoc  documentation (default)�[0m
 �[36;1m#   .md    wiki content only — plus a transitional allowance for the�[0m
 �[36;1m#          GitHub-mandated files, which are migrating to berrywiki format�[0m
 �[36;1m#   .txt   licence texts�[0m
 �[36;1m#   fixed  names GitHub or convention dictates (CODEOWNERS, funding.yml,�[0m
 �[36;1m#          NOTICE, AUTHORS, MAINTAINERS) keep their form�[0m
 �[36;1mset -uo pipefail�[0m
 �[36;1mfail=0�[0m
 �[36;1m�[0m
 �[36;1m# --- template-repo mode -------------------------------------------�[0m
 �[36;1m# An un-instantiated template legitimately SHIPS {{OWNER}}/{{AUTHOR}}�[0m
 �[36;1m# placeholders and self-references its own template name; judging it�[0m
 �[36;1m# like an instantiated repo is a category error. Detection is explicit�[0m
 �[36;1m# and auditable: the repo name says it is a temp...

GitHub Actions: Central Estate CI/CD Audit / estate-audit: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run # Accepted placements widened per owner ruling 2026-09-19: estate
 �[36;1m# Accepted placements widened per owner ruling 2026-09-19: estate�[0m
 �[36;1m# repos legitimately keep governance docs under docs/ (and GitHub�[0m
 �[36;1m# renders under .github/) — rsr-template-repo itself was failing on�[0m
 �[36;1m# layout, not on substance. Root forms still win (first hit).�[0m
 �[36;1m# Template-repo mode: see below.�[0m
 �[36;1m#�[0m
 �[36;1m# Presence-only checking rewards filler. This gate previously demanded�[0m
 �[36;1m# ARCHITECTURE.md / MAINTAINERS.adoc / GOVERNANCE.md and checked only�[0m
 �[36;1m# that the paths existed — so the cheapest way to pass was to commit�[0m
 �[36;1m# template boilerplate. That happened: an estate repo acquired an�[0m
 �[36;1m# ARCHITECTURE.md describing a directory layout it does not have, a�[0m
 �[36;1m# MAINTAINERS naming a different account as owner, and a mise.toml�[0m
 �[36;1m# pinning `zig = "latest"` against that repo's own .tool-versions.�[0m
 �[36;1m# All three would have passed. So: presence, THEN format, THEN substance.�[0m
 �[36;1m#�[0m
 �[36;1m# Format policy (estate):�[0m
 �[36;1m#   .adoc  documentation (default)�[0m
 �[36;1m#   .md    wiki content only — plus a transitional allowance for the�[0m
 �[36;1m#          GitHub-mandated files, which are migrating to berrywiki format�[0m
 �[36;1m#   .txt   licence texts�[0m
 �[36;1m#   fixed  names GitHub or convention dictates (CODEOWNERS, funding.yml,�[0m
 �[36;1m#          NOTICE, AUTHORS, MAINTAINERS) keep their form�[0m
 �[36;1mset -uo pipefail�[0m
 �[36;1mfail=0�[0m
 �[36;1m�[0m
 �[36;1m# --- template-repo mode -------------------------------------------�[0m
 �[36;1m# An un-instantiated template legitimately SHIPS {{OWNER}}/{{AUTHOR}}�[0m
 �[36;1m# placeholders and self-references its own template name; judging it�[0m
 �[36;1m# like an instantiated repo is a category error. Detection is explicit�[0m
 �[36;1m# and auditable: the repo name says it is a temp...

GitHub Actions: Central Estate CI/CD Audit / estate-audit: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run bash "$GITHUB_ACTION_PATH/check.sh"
 �[36;1mbash "$GITHUB_ACTION_PATH/check.sh"�[0m
 shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
 ##[endgroup]
 Scanning implementation source for untracked debt markers...
 ##[error]Untracked debt markers found in implementation source:

GitHub Actions: Governance / 4_governance _ Well-Known (RFC 9116 + RSR).txt: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run SECTXT=""
 �[36;1mSECTXT=""�[0m
 �[36;1m[ -f ".well-known/security.txt" ] && SECTXT=".well-known/security.txt"�[0m
 �[36;1m[ -f "security.txt" ] && SECTXT="security.txt"�[0m
 �[36;1mif [ -z "$SECTXT" ]; then�[0m
 �[36;1m  echo "::warning::No security.txt found."�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1mgrep -q "^Contact:" "$SECTXT" || { echo "::error::Missing Contact field"; exit 1; }�[0m

GitHub Actions: Governance / governance _ Well-Known (RFC 9116 + RSR): ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run SECTXT=""
 �[36;1mSECTXT=""�[0m
 �[36;1m[ -f ".well-known/security.txt" ] && SECTXT=".well-known/security.txt"�[0m
 �[36;1m[ -f "security.txt" ] && SECTXT="security.txt"�[0m
 �[36;1mif [ -z "$SECTXT" ]; then�[0m
 �[36;1m  echo "::warning::No security.txt found."�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1mgrep -q "^Contact:" "$SECTXT" || { echo "::error::Missing Contact field"; exit 1; }�[0m

GitHub Actions: Governance / governance _ Well-Known (RFC 9116 + RSR): ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run MIXED=$(grep -rE 'src="http://|href="http://' --include="*.html" --include="*.htm" . 2>/dev/null | grep -vE 'localhost|127\.0\.0\.1|example\.com|lol/|node_modules/|third-party/|vendor/' | head -5 || true)
 �[36;1mMIXED=$(grep -rE 'src="http://|href="http://' --include="*.html" --include="*.htm" . 2>/dev/null | grep -vE 'localhost|127\.0\.0\.1|example\.com|lol/|node_modules/|third-party/|vendor/' | head -5 || true)�[0m
 �[36;1mif [ -n "$MIXED" ]; then�[0m
 �[36;1m  echo "::error::Mixed content (HTTP in HTML)"�[0m

GitHub Actions: Governance / 5_governance _ Code quality + docs.txt: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run editorconfig-checker/action-editorconfig-checker@840e866d93b8e032123c23bac69dece044d4d84c
 with:
   github-***REDACTED_SECRET_ASSIGNMENT***
   version: latest
 ##[endgroup]
 Find 'latest' release
 ##[error]Error: The binary 'ec-linux-amd64*' not found

GitHub Actions: Governance / governance _ Code quality + docs: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run editorconfig-checker/action-editorconfig-checker@840e866d93b8e032123c23bac69dece044d4d84c
 with:
   github-***REDACTED_SECRET_ASSIGNMENT***
   version: latest
 ##[endgroup]
 Find 'latest' release
 ##[error]Error: The binary 'ec-linux-amd64*' not found

GitHub Actions: Governance / 6_governance _ Language _ package anti-pattern policy.txt: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run rule_module="cicd_rules"
 �[36;1mrule_module="cicd_rules"�[0m
 �[36;1mrule_type="banned_language_file"�[0m
 �[36;1mrule="${rule_module}/${rule_type}"�[0m
 �[36;1m�[0m
 �[36;1m# Baseline lookup: returns 0 (exempt) if the file appears in�[0m
 �[36;1m# .hypatia-baseline.json with a matching rule_module + type.�[0m
 �[36;1m# Honours both `file` (exact) and `file_pattern` (glob) entries.�[0m
 �[36;1m# The glob → regex translation mirrors apply-baseline.sh exactly:�[0m
 �[36;1m#   `**` matches any depth (incl. `/`); `*` matches one segment.�[0m
 �[36;1m# Pattern support unblocks language-demo repos (absolute-zero�[0m
 �[36;1m# carries ~30 banned-language example files under `examples/`)�[0m
 �[36;1m# and any repo that vendors such subtrees, replacing per-file�[0m
 �[36;1m# `.hypatia-ignore` enumeration with one `file_pattern` entry.�[0m
 �[36;1min_baseline() {�[0m
 �[36;1m  local target="$1"�[0m
 �[36;1m  [ -f .hypatia-baseline.json ] || return 1�[0m
 �[36;1m  command -v jq >/dev/null 2>&1 || return 1�[0m
 �[36;1m  # Note: the `as $pat` capture is essential — inside `test(...)`�[0m
 �[36;1m  # the dot rebinds to test's input ($f, a string), so�[0m
 �[36;1m  # `.file_pattern` would error with "Cannot index string". We�[0m
 �[36;1m  # capture file_pattern in $pat first, then reference it inside�[0m
 �[36;1m  # the test() argument.�[0m
 �[36;1m  jq -e \�[0m
 �[36;1m    --arg rm "$rule_module" \�[0m
 �[36;1m    --arg rt "$rule_type" \�[0m
 �[36;1m    --arg f  "$target" \�[0m
 �[36;1m    'any(.[];�[0m
 �[36;1m         .rule_module == $rm and .type == $rt�[0m
 �[36;1m         and (�[0m
 �[36;1m           (.file? // null) == $f�[0m
 �[36;1m           or (�[0m
 �[36;1m             (.file_pattern? // null) as $pat�[0m
 �[36;1m             | $pat != null�[0m
 �[36;1m             and ($f | test(�[0m
 �[36;1m               $pat�[0m
 �[36;1m               | gsub("\\*\\*"; "DOUBLESTAR")�[0m
 �[36;1m               | gsub("\\*"; "[^/]*")�[0m
 �[36;1m               | gsub(...

GitHub Actions: Governance / governance _ Language _ package anti-pattern policy: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run rule_module="cicd_rules"
 �[36;1mrule_module="cicd_rules"�[0m
 �[36;1mrule_type="banned_language_file"�[0m
 �[36;1mrule="${rule_module}/${rule_type}"�[0m
 �[36;1m�[0m
 �[36;1m# Baseline lookup: returns 0 (exempt) if the file appears in�[0m
 �[36;1m# .hypatia-baseline.json with a matching rule_module + type.�[0m
 �[36;1m# Honours both `file` (exact) and `file_pattern` (glob) entries.�[0m
 �[36;1m# The glob → regex translation mirrors apply-baseline.sh exactly:�[0m
 �[36;1m#   `**` matches any depth (incl. `/`); `*` matches one segment.�[0m
 �[36;1m# Pattern support unblocks language-demo repos (absolute-zero�[0m
 �[36;1m# carries ~30 banned-language example files under `examples/`)�[0m
 �[36;1m# and any repo that vendors such subtrees, replacing per-file�[0m
 �[36;1m# `.hypatia-ignore` enumeration with one `file_pattern` entry.�[0m
 �[36;1min_baseline() {�[0m
 �[36;1m  local target="$1"�[0m
 �[36;1m  [ -f .hypatia-baseline.json ] || return 1�[0m
 �[36;1m  command -v jq >/dev/null 2>&1 || return 1�[0m
 �[36;1m  # Note: the `as $pat` capture is essential — inside `test(...)`�[0m
 �[36;1m  # the dot rebinds to test's input ($f, a string), so�[0m
 �[36;1m  # `.file_pattern` would error with "Cannot index string". We�[0m
 �[36;1m  # capture file_pattern in $pat first, then reference it inside�[0m
 �[36;1m  # the test() argument.�[0m
 �[36;1m  jq -e \�[0m
 �[36;1m    --arg rm "$rule_module" \�[0m
 �[36;1m    --arg rt "$rule_type" \�[0m
 �[36;1m    --arg f  "$target" \�[0m
 �[36;1m    'any(.[];�[0m
 �[36;1m         .rule_module == $rm and .type == $rt�[0m
 �[36;1m         and (�[0m
 �[36;1m           (.file? // null) == $f�[0m
 �[36;1m           or (�[0m
 �[36;1m             (.file_pattern? // null) as $pat�[0m
 �[36;1m             | $pat != null�[0m
 �[36;1m             and ($f | test(�[0m
 �[36;1m               $pat�[0m
 �[36;1m               | gsub("\\*\\*"; "DOUBLESTAR")�[0m
 �[36;1m               | gsub("\\*"; "[^/]*")�[0m
 �[36;1m               | gsub(...

GitHub Actions: Governance / 8_governance _ Trusted-base reduction policy.txt: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run bash standards/scripts/check-trusted-base.sh caller
 �[36;1mbash standards/scripts/check-trusted-base.sh caller�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 [INFO] Found 7 soundness-relevant escape hatch(es).
 [ERROR] No docs/proof-debt.md (or equivalent) found, but 7 escape hatches exist.
 [ERROR] Seed one per the schema at hyperpolymath/standards/docs/TRUSTED-BASE-REDUCTION-POLICY.adoc.
 ##[error]Process completed with exit code 1.

GitHub Actions: Governance / governance _ Trusted-base reduction policy: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run bash standards/scripts/check-trusted-base.sh caller
 �[36;1mbash standards/scripts/check-trusted-base.sh caller�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 [INFO] Found 7 soundness-relevant escape hatch(es).
 [ERROR] No docs/proof-debt.md (or equivalent) found, but 7 escape hatches exist.
 [ERROR] Seed one per the schema at hyperpolymath/standards/docs/TRUSTED-BASE-REDUCTION-POLICY.adoc.
 ##[error]Process completed with exit code 1.

GitHub Actions: Governance / 9_governance _ Security policy checks.txt: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run set -uo pipefail
 �[36;1mset -uo pipefail�[0m
 �[36;1mDIR=.github/canonical-references�[0m
 �[36;1mif [ ! -d "$DIR" ]; then�[0m
 �[36;1m  echo "ℹ️  [R5] no $DIR/ — skipped (repo has not opted in)"�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1mif ! command -v python3 >/dev/null 2>&1; then�[0m
 �[36;1m  echo "❌ [R5] python3 missing on runner — required for YAML rule parsing"�[0m
 �[36;1m  exit 2�[0m
 �[36;1mfi�[0m
 �[36;1mpython3 - <<'PY'�[0m
 �[36;1mimport os, sys, glob, subprocess�[0m
 �[36;1mtry:�[0m
 �[36;1m    import yaml�[0m
 �[36;1mexcept ImportError:�[0m
 �[36;1m    sys.exit("❌ [R5] PyYAML not installed on runner; install python3-yaml")�[0m
 �[36;1m�[0m
 �[36;1mdir_ = ".github/canonical-references"�[0m
 �[36;1mfiles = sorted(glob.glob(f"{dir_}/*.yml") + glob.glob(f"{dir_}/*.yaml"))�[0m
 �[36;1mif not files:�[0m
 �[36;1m    print(f"ℹ️  [R5] {dir_}/ has no .yml/.yaml rules — skipped")�[0m
 �[36;1m    sys.exit(0)�[0m
 �[36;1m�[0m
 �[36;1mtotal = 0�[0m
 �[36;1mfor rf in files:�[0m
 �[36;1m    with open(rf, encoding="utf-8") as fh:�[0m
 �[36;1m        cfg = yaml.safe_load(fh)�[0m
 �[36;1m    if not isinstance(cfg, dict):�[0m
 �[36;1m        print(f"❌ [R5] {rf}: top-level must be a mapping"); total += 1; continue�[0m
 �[36;1m    rid  = cfg.get("id", os.path.basename(rf))�[0m
 �[36;1m    desc = cfg.get("description", "")�[0m
 �[36;1m    pats = cfg.get("patterns") or []�[0m
 �[36;1m    canon = cfg.get("canonical_pointer", "")�[0m
 �[36;1m    scope = (cfg.get("scope") or {})�[0m
 �[36;1m    includes = scope.get("include") or []�[0m
 �[36;1m    if not pats or not includes:�[0m
 �[36;1m        print(f"❌ [R5:{rid}] missing patterns or scope.include in {rf}")�[0m
 �[36;1m        total += 1; continue�[0m
 �[36;1m    # exclude self-references�[0m
 �[36;1m    skip = set(["CHANGELOG.md", "CHANGELOG.adoc", rf])�[0m
 �[36;1m    if canon: skip.add(canon)�[0m
 �[36;1m    rule_hits = 0�[0m
 �[36;1m    for f_ in includes:�[0m
 �[36;1m        if f_ in skip or not os...

GitHub Actions: Governance / governance _ Security policy checks: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run set -uo pipefail
 �[36;1mset -uo pipefail�[0m
 �[36;1mDIR=.github/canonical-references�[0m
 �[36;1mif [ ! -d "$DIR" ]; then�[0m
 �[36;1m  echo "ℹ️  [R5] no $DIR/ — skipped (repo has not opted in)"�[0m
 �[36;1m  exit 0�[0m
 �[36;1mfi�[0m
 �[36;1mif ! command -v python3 >/dev/null 2>&1; then�[0m
 �[36;1m  echo "❌ [R5] python3 missing on runner — required for YAML rule parsing"�[0m
 �[36;1m  exit 2�[0m
 �[36;1mfi�[0m
 �[36;1mpython3 - <<'PY'�[0m
 �[36;1mimport os, sys, glob, subprocess�[0m
 �[36;1mtry:�[0m
 �[36;1m    import yaml�[0m
 �[36;1mexcept ImportError:�[0m
 �[36;1m    sys.exit("❌ [R5] PyYAML not installed on runner; install python3-yaml")�[0m
 �[36;1m�[0m
 �[36;1mdir_ = ".github/canonical-references"�[0m
 �[36;1mfiles = sorted(glob.glob(f"{dir_}/*.yml") + glob.glob(f"{dir_}/*.yaml"))�[0m
 �[36;1mif not files:�[0m
 �[36;1m    print(f"ℹ️  [R5] {dir_}/ has no .yml/.yaml rules — skipped")�[0m
 �[36;1m    sys.exit(0)�[0m
 �[36;1m�[0m
 �[36;1mtotal = 0�[0m
 �[36;1mfor rf in files:�[0m
 �[36;1m    with open(rf, encoding="utf-8") as fh:�[0m
 �[36;1m        cfg = yaml.safe_load(fh)�[0m
 �[36;1m    if not isinstance(cfg, dict):�[0m
 �[36;1m        print(f"❌ [R5] {rf}: top-level must be a mapping"); total += 1; continue�[0m
 �[36;1m    rid  = cfg.get("id", os.path.basename(rf))�[0m
 �[36;1m    desc = cfg.get("description", "")�[0m
 �[36;1m    pats = cfg.get("patterns") or []�[0m
 �[36;1m    canon = cfg.get("canonical_pointer", "")�[0m
 �[36;1m    scope = (cfg.get("scope") or {})�[0m
 �[36;1m    includes = scope.get("include") or []�[0m
 �[36;1m    if not pats or not includes:�[0m
 �[36;1m        print(f"❌ [R5:{rid}] missing patterns or scope.include in {rf}")�[0m
 �[36;1m        total += 1; continue�[0m
 �[36;1m    # exclude self-references�[0m
 �[36;1m    skip = set(["CHANGELOG.md", "CHANGELOG.adoc", rf])�[0m
 �[36;1m    if canon: skip.add(canon)�[0m
 �[36;1m    rule_hits = 0�[0m
 �[36;1m    for f_ in includes:�[0m
 �[36;1m        if f_ in skip or not os...

GitHub Actions: Governance / 10_governance _ Workflow security linter.txt: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run # GitHub Actions REJECTS a workflow with duplicate keys: the run is
 �[36;1m# GitHub Actions REJECTS a workflow with duplicate keys: the run is�[0m
 �[36;1m# `failure` with no jobs, no log and no check run. Nothing else here�[0m
 �[36;1m# can see it, because yaml.safe_load silently keeps the LAST�[0m
 �[36;1m# duplicate and reports success — so the file "parses" and every�[0m
 �[36;1m# other lint passes. Measured 2026-08-05: nine workflows in hypatia�[0m
 �[36;1m# were dead this way, including a CodeQL workflow with zero�[0m
 �[36;1m# successful runs in its entire lifetime.�[0m
 �[36;1mset -euo pipefail�[0m
 �[36;1mSCRIPT=".standards-dupkey/scripts/check-workflow-duplicate-keys.sh"�[0m
 �[36;1m# Self-hosting fallback: when THIS repository is standards, its own�[0m
 �[36;1m# working tree already holds the script, and during a rename that copy�[0m
 �[36;1m# is the only correct one — the pinned main checkout still has the old�[0m
 �[36;1m# name. Preferring the fetched copy keeps every other caller on the�[0m
 �[36;1m# canonical version.�[0m
 �[36;1mif [ ! -f "$SCRIPT" ] && [ -f scripts/check-workflow-duplicate-keys.sh ]; then�[0m
 �[36;1m  SCRIPT="scripts/check-workflow-duplicate-keys.sh"�[0m
 �[36;1m  echo "Using this repository's own copy (standards self-lint)."�[0m
 �[36;1mfi�[0m
 �[36;1mif [ ! -f "$SCRIPT" ]; then�[0m
 �[36;1m  echo "::error::duplicate-key checker not found — neither fetched from" \�[0m

GitHub Actions: Governance / governance _ Workflow security linter: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run # GitHub Actions REJECTS a workflow with duplicate keys: the run is
 �[36;1m# GitHub Actions REJECTS a workflow with duplicate keys: the run is�[0m
 �[36;1m# `failure` with no jobs, no log and no check run. Nothing else here�[0m
 �[36;1m# can see it, because yaml.safe_load silently keeps the LAST�[0m
 �[36;1m# duplicate and reports success — so the file "parses" and every�[0m
 �[36;1m# other lint passes. Measured 2026-08-05: nine workflows in hypatia�[0m
 �[36;1m# were dead this way, including a CodeQL workflow with zero�[0m
 �[36;1m# successful runs in its entire lifetime.�[0m
 �[36;1mset -euo pipefail�[0m
 �[36;1mSCRIPT=".standards-dupkey/scripts/check-workflow-duplicate-keys.sh"�[0m
 �[36;1m# Self-hosting fallback: when THIS repository is standards, its own�[0m
 �[36;1m# working tree already holds the script, and during a rename that copy�[0m
 �[36;1m# is the only correct one — the pinned main checkout still has the old�[0m
 �[36;1m# name. Preferring the fetched copy keeps every other caller on the�[0m
 �[36;1m# canonical version.�[0m
 �[36;1mif [ ! -f "$SCRIPT" ] && [ -f scripts/check-workflow-duplicate-keys.sh ]; then�[0m
 �[36;1m  SCRIPT="scripts/check-workflow-duplicate-keys.sh"�[0m
 �[36;1m  echo "Using this repository's own copy (standards self-lint)."�[0m
 �[36;1mfi�[0m
 �[36;1mif [ ! -f "$SCRIPT" ]; then�[0m
 �[36;1m  echo "::error::duplicate-key checker not found — neither fetched from" \�[0m

GitHub Actions: Governance / governance _ Workflow security linter: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run failed=0
 �[36;1mfailed=0�[0m
 �[36;1mfor file in .github/workflows/*.yml .github/workflows/*.yaml; do�[0m
 �[36;1m  [ -f "$file" ] || continue�[0m
 �[36;1m  # ⚠ SCAN THE HEADER BLOCK, NOT LINE 1. REUSE places the identifier�[0m
 �[36;1m  # anywhere in a file's leading comment block, and `gh actions-lock`�[0m
 �[36;1m  # INSERTS `# This workflow is managed by gh actions-lock.` at line 1�[0m
 �[36;1m  # whenever it mints a lockfile — so a line-1 test fights the estate's�[0m
 �[36;1m  # own tool and re-fails every time a lockfile is refreshed.�[0m
 �[36;1m  #�[0m
 �[36;1m  # Measured 2026-08-07: it reported 27 hypatia workflows and 13 more�[0m
 �[36;1m  # elsewhere as missing a header they all had, and "fixing" that by�[0m
 �[36;1m  # prepending a default MIS-LICENSED three files (PMPL-1.0-or-later�[0m
 �[36;1m  # shadowed by MPL-2.0) before it was caught.�[0m
 �[36;1m  #�[0m
 �[36;1m  # The leading run of comment lines is read, tolerating a YAML�[0m
 �[36;1m  # document marker. A licence declared there is declared.�[0m
 �[36;1m  if ! awk '/^---[[:space:]]*$/ { next } /^`#/` { print; next } { exit }' "$file" \�[0m
 �[36;1m       | grep -q "^# SPDX-License-Identifier:"; then�[0m
 �[36;1m    echo "ERROR: $file has no SPDX-License-Identifier in its header comment block"; failed=1�[0m
 �[36;1m  fi�[0m
 �[36;1m  if ! grep -q "^permissions:" "$file"; then�[0m
 �[36;1m    echo "ERROR: $file missing top-level 'permissions:' declaration"; failed=1�[0m
 �[36;1m  fi�[0m
 �[36;1mdone�[0m
 �[36;1m[ $failed -eq 1 ] && { echo "Add SPDX header + permissions:"; exit 1; }�[0m
 �[36;1mecho "All workflows have SPDX headers + permissions"�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 ERROR: .github/workflows/main-estate-audit.yml missing top-level 'permissions:' declaration
 Add SPDX header + permissions:
 ##[error]Process completed with exit code 1.

GitHub Actions: Governance / 12_governance _ Allowlist Preflight.txt: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run rm -rf .standards-checkout
 �[36;1mrm -rf .standards-checkout�[0m
 �[36;1mbash "$RUNNER_TEMP/check-actions-policy.sh" \�[0m
 �[36;1m  "$GITHUB_REPOSITORY" "$RUNNER_TEMP/allowed-actions.json"�[0m
 shell: /usr/bin/bash -e {0}
 env:
   GH_***REDACTED_SECRET_ASSIGNMENT***
 gh: To use GitHub CLI in a GitHub Actions workflow, set the GH_TOKEN environment variable. Example:
   env:
     GH_***REDACTED_SECRET_ASSIGNMENT*** github.token }}
 ERROR: could not read live Actions permissions for hyperpolymath/proven-servers
 ##[error]Process completed with exit code 3.

GitHub Actions: Governance / governance _ Allowlist Preflight: ci: retire the dead A2ML validation gate

Conclusion: failure

View job details

##[group]Run rm -rf .standards-checkout
 �[36;1mrm -rf .standards-checkout�[0m
 �[36;1mbash "$RUNNER_TEMP/check-actions-policy.sh" \�[0m
 �[36;1m  "$GITHUB_REPOSITORY" "$RUNNER_TEMP/allowed-actions.json"�[0m
 shell: /usr/bin/bash -e {0}
 env:
   GH_***REDACTED_SECRET_ASSIGNMENT***
 gh: To use GitHub CLI in a GitHub Actions workflow, set the GH_TOKEN environment variable. Example:
   env:
     GH_***REDACTED_SECRET_ASSIGNMENT*** github.token }}
 ERROR: could not read live Actions permissions for hyperpolymath/proven-servers
 ##[error]Process completed with exit code 3.

📝 Summary

Summary by CodeRabbit

  • Chores
    • Automated checks no longer detect or validate A2ML manifests, and A2ML results are no longer included in the dogfood scorecard.
    • The scorecard now reports a maximum of five checks instead of six. Other checks remain in place, and no changes to user-facing product functionality are noted.

Walkthrough

The dogfood workflow no longer detects or validates A2ML manifests. The summary job no longer waits for A2ML validation, and the scorecard no longer calculates or reports A2ML status.

Changes

A2ML workflow removal

Layer / File(s) Summary
Remove A2ML validation and scorecard entries
.github/workflows/dogfood-checks.yml
The workflow removes the A2ML validation job and its dependency from dogfood-summary. The scorecard removes the A2ML check and row, and lowers MAX from 6 to 5.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Merge Risk: ⚪ Minimal · up to f3e25

The retired A2ML gate and its scorecard integration have been removed without leaving a checked-in workflow dependency on the deleted action.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the removal of the A2ML validation gate, which is the main change.
Description check ✅ Passed The description explains the purpose, rationale, key changes, scope, and related issue. It omits the template’s Changes, RSR Quality Checklist, Testing, and Screenshots sections, but it provides enoug…
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🛠️ Fix failing CI checks
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

A rabbit checks the scorecard row
The A2ML checks no longer show
The workflow trims its steps with care
One less status to report there
Then hops away through clover green

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

🔍 Hypatia Security Scan

Findings: 310 issues detected

Severity Count
🔴 Critical 218
🟠 High 17
🟡 Medium 75

⚠️ Action Required: Critical security issues found!

View findings
[
  {
    "reason": "No permissions declaration -- add permissions: read-all",
    "type": "missing_permissions",
    "file": "main-estate-audit.yml",
    "action": "add_permissions",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Job `triage` in label-triage.yml has no `timeout-minutes:` declaration. Default is 6 hours — a stuck codeload fetch or runner hang can burn budget. Add `timeout-minutes: 10` (or proportional).",
    "type": "missing_timeout_minutes",
    "file": "label-triage.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium",
    "recipe_id": "recipe-add-workflow-timeout-minutes",
    "job": "triage"
  },
  {
    "reason": "Job `sync` in labels.yml has no `timeout-minutes:` declaration. Default is 6 hours — a stuck codeload fetch or runner hang can burn budget. Add `timeout-minutes: 10` (or proportional).",
    "type": "missing_timeout_minutes",
    "file": "labels.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium",
    "recipe_id": "recipe-add-workflow-timeout-minutes",
    "job": "sync"
  },
  {
    "reason": "Job `estate-audit` in main-estate-audit.yml has no `timeout-minutes:` declaration. Default is 6 hours — a stuck codeload fetch or runner hang can burn budget. Add `timeout-minutes: 10` (or proportional).",
    "type": "missing_timeout_minutes",
    "file": "main-estate-audit.yml",
    "action": "flag",
    "rule_module": "workflow_audit",
    "severity": "medium",
    "recipe_id": "recipe-add-workflow-timeout-minutes",
    "job": "estate-audit"
  },
  {
    "reason": "Required file missing (condition: public_repo)",
    "type": "missing_requirement",
    "file": "SECURITY.md",
    "action": "create",
    "rule_module": "cicd_rules",
    "severity": "high"
  },
  {
    "reason": "Python file detected -- banned language",
    "type": "banned_language_file",
    "file": "/home/runner/work/proven-servers/proven-servers/bindings/python/proven_servers/siem.py",
    "action": "flag",
    "rule_module": "cicd_rules",
    "severity": "critical"
  },
  {
    "reason": "Python file detected -- banned language",
    "type": "banned_language_file",
    "file": "/home/runner/work/proven-servers/proven-servers/bindings/python/proven_servers/stun.py",
    "action": "flag",
    "rule_module": "cicd_rules",
    "severity": "critical"
  },
  {
    "reason": "Python file detected -- banned language",
    "type": "banned_language_file",
    "file": "/home/runner/work/proven-servers/proven-servers/bindings/python/proven_servers/appserver.py",
    "action": "flag",
    "rule_module": "cicd_rules",
    "severity": "critical"
  },
  {
    "reason": "Python file detected -- banned language",
    "type": "banned_language_file",
    "file": "/home/runner/work/proven-servers/proven-servers/bindings/python/proven_servers/ospf.py",
    "action": "flag",
    "rule_module": "cicd_rules",
    "severity": "critical"
  },
  {
    "reason": "Python file detected -- banned language",
    "type": "banned_language_file",
    "file": "/home/runner/work/proven-servers/proven-servers/bindings/python/proven_servers/opcua.py",
    "action": "flag",
    "rule_module": "cicd_rules",
    "severity": "critical"
  }
]

Powered by Hypatia Neurosymbolic CI/CD Intelligence

@coderabbitai

coderabbitai Bot commented Sep 22, 2026

Copy link
Copy Markdown

Coding Agent task started: View task and status

The task will inspect the CI failures, validate its fix, and commit the fix to this branch automatically.

Note: Fixing CI failures is a beta feature and may encounter errors. Expect some limitations and changes as we gather feedback and continue to improve it.

⏭️ 1 check(s) skipped — already failing on `main` (not caused by this PR)
  • GitHub Actions: Central Estate CI/CD Audit / 0_estate-audit.txt

@hyperpolymath
hyperpolymath merged commit 248fb47 into main Sep 22, 2026
26 of 32 checks passed
@hyperpolymath
hyperpolymath deleted the retire/a2ml-gate branch September 22, 2026 23:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant