Skip to content

ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs) - #372

Merged
hyperpolymath merged 1 commit into
mainfrom
chore/drop-duplicate-semgrep
Oct 8, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
chore/drop-duplicate-semgrep

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Summary

Removes this repo's own Semgrep scan. The semgrep-code-hyperpolymath GitHub App (Semgrep Managed Scans) already reports semgrep-cloud-platform/scan on every pull request here, so PRs were scanned twice. No ruleset requires a Semgrep context in this repo (checked via rules/branches/main).

No issue. This is owner-requested estate cleanup (duplicate Semgrep scanning).

Type of change

  • 🐛 Bug fix: n/a
  • ✨ New feature: n/a
  • 💥 Breaking change: no. No required check is removed.
  • 🕳️ Soundness fix: n/a
  • 📖 Documentation: n/a
  • 🧹 Refactor / tech debt: n/a
  • ⚡ Performance: n/a
  • 🔧 Build / CI / tooling

📌 New pins

Head SHA: 96dc5281ed5d8f30378af9747faf606d3074c544. No pins added or changed.

  • removed: returntocorp/semgrep-action@v1

How has this been verified?

Files:
M .github/workflows/actions.lock
M .github/workflows/ci.yml

actions.lock: only the Semgrep-specific entries removed (the semgrep.yml workflow key and/or the returntocorp/semgrep-action list item and its dependency block). Every other entry, transitive dependencies included, is untouched.

  • gh actions-lock --no-fix --json: findings diffed before/after. 0 new findings; only findings that belonged to the removed Semgrep entries disappeared.
  • yq -e . parses every changed YAML file.
  • KYAML: the edited workflow was rewritten with standards/scripts/kyaml-format.sh (yq -p yaml -o kyaml), which refuses any rewrite that changes the parsed data; kyaml-format.sh --check passes. Owner ruling 2026-10-08: a workflow a PR touches is converted to KYAML in that PR. The diff is large because of the reformat; the only semantic change is the removed Semgrep step/job.
  • actionlint: same diagnostic count as the original file (no new lint).

Checklist

  • My commits are signed (git commit -S, verified G).
  • I ran the project's own checks/tests locally and they pass: the workflow checks above. The change is CI-only, so no build or test was affected.
  • New files carry the correct SPDX identifier: n/a, no new files.
  • Docs are updated: see notes. Prose that mentions Semgrep is left as is.
  • I have not introduced a soundness hole. The coverage change is flagged below.

Notes for reviewers

Coverage change, stated rather than hidden: the removed workflow also ran on push and schedule. The app reports only on pull requests: no semgrep-cloud-platform/scan check exists on main HEAD 8d43f44. Default-branch and scheduled full scans now depend on Semgrep Cloud's own schedule, which is not verified from GitHub.
The removed job used p/security-audit, p/secrets and p/owasp-top-ten; those rules now apply only if the Semgrep Cloud policy enables them. .gitlab-ci.yml and security/static-analysis/run_semgrep.sh are not GitHub CI and are left alone.

🤖 Generated with Claude Code

https://claude.ai/code/session_013aSu89DNALjTYHBvA6FcoM

The semgrep-code-hyperpolymath GitHub App (Semgrep Managed Scans) already
reports semgrep-cloud-platform/scan on every pull request here, so this
workflow scanned the same code twice. No Semgrep context is required by
any ruleset. actions.lock loses only the Semgrep-specific entries.

The edited workflow is rewritten as KYAML with standards scripts/kyaml-format.sh
(yq -p yaml -o kyaml), which refuses any rewrite that changes the parsed data.
Owner ruling 2026-10-08: a workflow touched by a PR is converted in that PR.

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

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

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: 6237fc52-dd31-4d0e-9e32-5a17178628fe
📥 Commits

Reviewing files that changed from the base of the PR and between 8d43f44 and 96dc528.

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

Included review availability: This review used your included allowance. 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. (26)
  • GitHub Check: Dogfooding compliance summary
  • GitHub Check: governance / Validate Hypatia Baseline
  • GitHub Check: GitGuardian Security Checks
  • GitHub Check: governance / Debt ratchet
  • GitHub Check: governance / Guix packaging policy (Nix retired)
  • GitHub Check: governance / Security policy checks
  • GitHub Check: governance / Exemption ratchet
  • GitHub Check: governance / Live Actions policy (credentialed advisory)
  • GitHub Check: governance / Actions lockfile verify
  • GitHub Check: governance / Allowlist Preflight
  • GitHub Check: governance / Language / package anti-pattern policy
  • GitHub Check: scan / gitleaks
  • GitHub Check: analyze (javascript-typescript, none)
  • GitHub Check: CodeQL Analysis (python)
  • GitHub Check: Node.js Security Audit
  • GitHub Check: CodeQL Analysis (javascript)
  • GitHub Check: Lint Shell Scripts
  • GitHub Check: Lint Elixir
  • GitHub Check: Hypatia Neurosymbolic Analysis
  • GitHub Check: Rust Security Audit
  • GitHub Check: SonarQube
  • GitHub Check: semgrep-cloud-platform/scan
  • GitHub Check: CodeQL Analysis (javascript)
  • GitHub Check: Lint Elixir
  • GitHub Check: Rust Security Audit
  • GitHub Check: CodeQL Analysis (python)
⚠️ CI failures not shown inline (27)

GitHub Actions: Build / 0_SonarQube.txt: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run SonarSource/sonarqube-scan-action@v8.1.0
 with:
   projectBaseDir: .
   scannerVersion: 8.1.0.6389
   scannerBinariesUrl: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli
   skipSignatureVerification: false
 env:
   SONAR_***REDACTED_SECRET_ASSIGNMENT***
 ##[endgroup]
 Installing Sonar Scanner CLI 8.1.0.6389 for linux-x64...
 Downloading from: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-8.1.0.6389-linux-x64.zip
 Downloading signature from: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-8.1.0.6389-linux-x64.zip.asc
 Importing SonarSource public key from hkps://keyserver.ubuntu.com...
 [command]/usr/bin/gpg --homedir /home/runner/work/_temp/gpg-home-1791456283314-2317 --batch --keyserver hkps://keyserver.ubuntu.com --recv-keys 679F1EE92B19609DE816FDE81DB198F93525EC1A
 gpg: keybox '/home/runner/work/_temp/gpg-home-1791456283314-2317/pubring.kbx' created
 gpg: /home/runner/work/_temp/gpg-home-1791456283314-2317/trustdb.gpg: trustdb created
 gpg: key 1DB198F93525EC1A: public key "SonarSource S.A. <infra@sonarsource.com>" imported
 gpg: Total number processed: 1
 gpg:               imported: 1
 Successfully imported key from hkps://keyserver.ubuntu.com
 ✓ SonarSource public key imported successfully
 Verifying GPG signature...
 [command]/usr/bin/gpg --homedir /home/runner/work/_temp/gpg-home-1791456283314-2317 --batch --verify /home/runner/work/_temp/6336d103-c681-48fb-bb19-75de8b2dc254 /home/runner/work/_temp/64d81779-f549-4f38-b3a6-9b79b76bee65
 gpg: Signature made Tue Apr 21 07:20:26 2026 UTC
 gpg:                using RSA key D1436C0DBACEA48702AF97C363F1DD7753B8B315
 gpg: Good signature from "SonarSource S.A. <infra@sonarsource.com>" [unknown]
 gpg: WARNING: This key is not certified with a trusted signature!
 gpg:          There is no indication that the signature belongs to the owner.
 Primary key fingerprint: 679F 1EE9 2B19 609D E816  FDE8 1DB1 98F9 3525 EC1A
   ...

GitHub Actions: Build / SonarQube: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run SonarSource/sonarqube-scan-action@v8.1.0
 with:
   projectBaseDir: .
   scannerVersion: 8.1.0.6389
   scannerBinariesUrl: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli
   skipSignatureVerification: false
 env:
   SONAR_***REDACTED_SECRET_ASSIGNMENT***
 ##[endgroup]
 Installing Sonar Scanner CLI 8.1.0.6389 for linux-x64...
 Downloading from: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-8.1.0.6389-linux-x64.zip
 Downloading signature from: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-8.1.0.6389-linux-x64.zip.asc
 Importing SonarSource public key from hkps://keyserver.ubuntu.com...
 [command]/usr/bin/gpg --homedir /home/runner/work/_temp/gpg-home-1791456283314-2317 --batch --keyserver hkps://keyserver.ubuntu.com --recv-keys 679F1EE92B19609DE816FDE81DB198F93525EC1A
 gpg: keybox '/home/runner/work/_temp/gpg-home-1791456283314-2317/pubring.kbx' created
 gpg: /home/runner/work/_temp/gpg-home-1791456283314-2317/trustdb.gpg: trustdb created
 gpg: key 1DB198F93525EC1A: public key "SonarSource S.A. <infra@sonarsource.com>" imported
 gpg: Total number processed: 1
 gpg:               imported: 1
 Successfully imported key from hkps://keyserver.ubuntu.com
 ✓ SonarSource public key imported successfully
 Verifying GPG signature...
 [command]/usr/bin/gpg --homedir /home/runner/work/_temp/gpg-home-1791456283314-2317 --batch --verify /home/runner/work/_temp/6336d103-c681-48fb-bb19-75de8b2dc254 /home/runner/work/_temp/64d81779-f549-4f38-b3a6-9b79b76bee65
 gpg: Signature made Tue Apr 21 07:20:26 2026 UTC
 gpg:                using RSA key D1436C0DBACEA48702AF97C363F1DD7753B8B315
 gpg: Good signature from "SonarSource S.A. <infra@sonarsource.com>" [unknown]
 gpg: WARNING: This key is not certified with a trusted signature!
 gpg:          There is no indication that the signature belongs to the owner.
 Primary key fingerprint: 679F 1EE9 2B19 609D E816  FDE8 1DB1 98F9 3525 EC1A
   ...

GitHub Actions: Secret Scanner / 0_scan _ shell-secrets.txt: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run # Patterns: an `export FOO=` or `FOO=` with a quoted literal of meaningful length.
 �[36;1m# Patterns: an `export FOO=` or `FOO=` with a quoted literal of meaningful length.�[0m
 �[36;1m# Restricted to *_TOKEN / *_KEY / *_SECRET / PASSWORD to keep false-positives low.�[0m
 �[36;1mPATTERNS=(�[0m
 �[36;1m  '(export[[:space:]]+)?[A-Z_]*TOKEN[A-Z_]*=["'"'"'][A-Za-z0-9_./+=-]{20,}["'"'"']'�[0m
 �[36;1m  '(export[[:space:]]+)?[A-Z_]*API_KEY[A-Z_]*=["'"'"'][A-Za-z0-9_./+=-]{20,}["'"'"']'�[0m
 �[36;1m  '(export[[:space:]]+)?[A-Z_]*SECRET[A-Z_]*=["'"'"'][A-Za-z0-9_./+=-]{16,}["'"'"']'�[0m
 �[36;1m  '(export[[:space:]]+)?***"'"'"'][^"'"'"']{6,}["'"'"']'�[0m
 �[36;1m)�[0m
 �[36;1m�[0m
 �[36;1m# Inline pragma patterns — suppress a hit when found on the same or�[0m
 �[36;1m# immediately preceding line.�[0m
 �[36;1mPRAGMA_RE='(scanner-allow:[[:space:]]*shell-secrets|hypatia:[[:space:]]*allow[[:space:]]+security_errors/secret_detected)'�[0m
 �[36;1m�[0m
 �[36;1m# Param-expansion RHS pattern — assignments whose value is a variable�[0m
 �[36;1m# reference rather than a literal are never real secrets.�[0m
 �[36;1m# Matches: ="$VAR"  ="${VAR}"  ="${VAR:-…}"  ="${VAR:?…}"  ='${VAR}'  =$VAR�[0m
 �[36;1mPARAM_EXPANSION_RE='=['"'"'"'"'"']?\$\{?[A-Za-z_][A-Za-z0-9_]*(:[?-][^}]*)?\}?['"'"'"'"'"']?[[:space:]]*(#.*)?$'�[0m
 �[36;1m�[0m
 �[36;1m# Load per-repo ignore globs from .shell-secrets-ignore if present.�[0m
 �[36;1mIGNORE_GLOBS=()�[0m
 �[36;1mif [[ -f .shell-secrets-ignore ]]; then�[0m
 �[36;1m  while IFS= read -r line || [[ -n "$line" ]]; do�[0m
 �[36;1m    # Skip blank lines and comments�[0m
 �[36;1m    [[ -z "$line" || "$line" == \#* ]] && continue�[0m
 �[36;1m    IGNORE_GLOBS+=("$line")�[0m
 �[36;1m  done < .shell-secrets-ignore�[0m
 �[36;1mfi�[0m
 �[36;1m�[0m
 �[36;1m# is_ignored <filepath> — returns 0 (true) if path matches any ignore glob.�[0m
 �[36;1mis_ignored() {�[0m
 �[36;1m  local path="$1"�[0m
 �[36;1m  for glob in "${IGNORE_GLOBS[@]}"; do�[0m
 �[36;1m    #...

GitHub Actions: Secret Scanner / scan _ shell-secrets: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run # Patterns: an `export FOO=` or `FOO=` with a quoted literal of meaningful length.
 �[36;1m# Patterns: an `export FOO=` or `FOO=` with a quoted literal of meaningful length.�[0m
 �[36;1m# Restricted to *_TOKEN / *_KEY / *_SECRET / PASSWORD to keep false-positives low.�[0m
 �[36;1mPATTERNS=(�[0m
 �[36;1m  '(export[[:space:]]+)?[A-Z_]*TOKEN[A-Z_]*=["'"'"'][A-Za-z0-9_./+=-]{20,}["'"'"']'�[0m
 �[36;1m  '(export[[:space:]]+)?[A-Z_]*API_KEY[A-Z_]*=["'"'"'][A-Za-z0-9_./+=-]{20,}["'"'"']'�[0m
 �[36;1m  '(export[[:space:]]+)?[A-Z_]*SECRET[A-Z_]*=["'"'"'][A-Za-z0-9_./+=-]{16,}["'"'"']'�[0m
 �[36;1m  '(export[[:space:]]+)?***"'"'"'][^"'"'"']{6,}["'"'"']'�[0m
 �[36;1m)�[0m
 �[36;1m�[0m
 �[36;1m# Inline pragma patterns — suppress a hit when found on the same or�[0m
 �[36;1m# immediately preceding line.�[0m
 �[36;1mPRAGMA_RE='(scanner-allow:[[:space:]]*shell-secrets|hypatia:[[:space:]]*allow[[:space:]]+security_errors/secret_detected)'�[0m
 �[36;1m�[0m
 �[36;1m# Param-expansion RHS pattern — assignments whose value is a variable�[0m
 �[36;1m# reference rather than a literal are never real secrets.�[0m
 �[36;1m# Matches: ="$VAR"  ="${VAR}"  ="${VAR:-…}"  ="${VAR:?…}"  ='${VAR}'  =$VAR�[0m
 �[36;1mPARAM_EXPANSION_RE='=['"'"'"'"'"']?\$\{?[A-Za-z_][A-Za-z0-9_]*(:[?-][^}]*)?\}?['"'"'"'"'"']?[[:space:]]*(#.*)?$'�[0m
 �[36;1m�[0m
 �[36;1m# Load per-repo ignore globs from .shell-secrets-ignore if present.�[0m
 �[36;1mIGNORE_GLOBS=()�[0m
 �[36;1mif [[ -f .shell-secrets-ignore ]]; then�[0m
 �[36;1m  while IFS= read -r line || [[ -n "$line" ]]; do�[0m
 �[36;1m    # Skip blank lines and comments�[0m
 �[36;1m    [[ -z "$line" || "$line" == \#* ]] && continue�[0m
 �[36;1m    IGNORE_GLOBS+=("$line")�[0m
 �[36;1m  done < .shell-secrets-ignore�[0m
 �[36;1mfi�[0m
 �[36;1m�[0m
 �[36;1m# is_ignored <filepath> — returns 0 (true) if path matches any ignore glob.�[0m
 �[36;1mis_ignored() {�[0m
 �[36;1m  local path="$1"�[0m
 �[36;1m  for glob in "${IGNORE_GLOBS[@]}"; do�[0m
 �[36;1m    #...

GitHub Actions: Secret Scanner / 1_scan _ rust-secrets.txt: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run TODAY="${RUST_TODAY:-$(date -u +%Y-%m-%d)}"
 �[36;1mTODAY="${RUST_TODAY:-$(date -u +%Y-%m-%d)}"�[0m
 �[36;1m�[0m
 �[36;1m# An unparseable cutoff would pick the warn branch forever, silently�[0m
 �[36;1m# disarming the widened scan. Refuse to run instead.�[0m
 �[36;1mrequire_date() {�[0m
 �[36;1m  case "$2" in�[0m
 �[36;1m    [0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]) : ;;�[0m
 �[36;1m    *) echo "::error::rust-secrets: $1='$2' is not YYYY-MM-DD."�[0m

GitHub Actions: Secret Scanner / scan _ rust-secrets: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run TODAY="${RUST_TODAY:-$(date -u +%Y-%m-%d)}"
 �[36;1mTODAY="${RUST_TODAY:-$(date -u +%Y-%m-%d)}"�[0m
 �[36;1m�[0m
 �[36;1m# An unparseable cutoff would pick the warn branch forever, silently�[0m
 �[36;1m# disarming the widened scan. Refuse to run instead.�[0m
 �[36;1mrequire_date() {�[0m
 �[36;1m  case "$2" in�[0m
 �[36;1m    [0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]) : ;;�[0m
 �[36;1m    *) echo "::error::rust-secrets: $1='$2' is not YYYY-MM-DD."�[0m

GitHub Actions: Secret Scanner / 2_scan _ gitleaks.txt: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1m�[0m
 �[36;1m# A repo-local baseline wins outright — it is expected to `[extend]`�[0m
 �[36;1m# the estate one, so "wins" still means "inherits". This mirrors what�[0m
 �[36;1m# the AsciiDoc pass below already did, which was inconsistent with�[0m
 �[36;1m# this step until now.�[0m
 �[36;1mCONFIG=".gitleaks-estate.toml"�[0m
 �[36;1mif [ -f .gitleaks.toml ]; then�[0m
 �[36;1m  CONFIG=".gitleaks.toml"�[0m
 �[36;1m  echo "Using repository .gitleaks.toml (extending the estate baseline)."�[0m
 �[36;1melse�[0m
 �[36;1m  echo "Using estate baseline allowlist."�[0m
 �[36;1mfi�[0m
 �[36;1m�[0m
 �[36;1m"$RUNNER_TEMP/gitleaks" detect \�[0m
 �[36;1m  --source . \�[0m
 �[36;1m  --no-git \�[0m
 �[36;1m  --redact \�[0m
 �[36;1m  --no-banner \�[0m
 �[36;1m  --verbose \�[0m
 �[36;1m  --config "$CONFIG" \�[0m
 �[36;1m  --exit-code 1�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 Using estate baseline allowlist.
 Finding:     NONE_ALG_JWT="�[1;3;mREDACTED�[0m"
 ***REDACTED_SECRET_ASSIGNMENT***
 RuleID:      jwt
 Entropy:     4.909184
 File:        security/penetration-testing/api-fuzzing/auth_bypass_tests.sh
 Line:        215
 Fingerprint: security/penetration-testing/api-fuzzing/auth_bypass_tests.sh:jwt:215
 �[90m10:44AM�[0m �[32mINF�[0m scan completed in 162ms
 �[90m10:44AM�[0m �[31mWRN�[0m leaks found: 1
 ##[error]Process completed with exit code 1.

GitHub Actions: Secret Scanner / scan _ gitleaks: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1m�[0m
 �[36;1m# A repo-local baseline wins outright — it is expected to `[extend]`�[0m
 �[36;1m# the estate one, so "wins" still means "inherits". This mirrors what�[0m
 �[36;1m# the AsciiDoc pass below already did, which was inconsistent with�[0m
 �[36;1m# this step until now.�[0m
 �[36;1mCONFIG=".gitleaks-estate.toml"�[0m
 �[36;1mif [ -f .gitleaks.toml ]; then�[0m
 �[36;1m  CONFIG=".gitleaks.toml"�[0m
 �[36;1m  echo "Using repository .gitleaks.toml (extending the estate baseline)."�[0m
 �[36;1melse�[0m
 �[36;1m  echo "Using estate baseline allowlist."�[0m
 �[36;1mfi�[0m
 �[36;1m�[0m
 �[36;1m"$RUNNER_TEMP/gitleaks" detect \�[0m
 �[36;1m  --source . \�[0m
 �[36;1m  --no-git \�[0m
 �[36;1m  --redact \�[0m
 �[36;1m  --no-banner \�[0m
 �[36;1m  --verbose \�[0m
 �[36;1m  --config "$CONFIG" \�[0m
 �[36;1m  --exit-code 1�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 Using estate baseline allowlist.
 Finding:     NONE_ALG_JWT="�[1;3;mREDACTED�[0m"
 ***REDACTED_SECRET_ASSIGNMENT***
 RuleID:      jwt
 Entropy:     4.909184
 File:        security/penetration-testing/api-fuzzing/auth_bypass_tests.sh
 Line:        215
 Fingerprint: security/penetration-testing/api-fuzzing/auth_bypass_tests.sh:jwt:215
 �[90m10:44AM�[0m �[32mINF�[0m scan completed in 162ms
 �[90m10:44AM�[0m �[31mWRN�[0m leaks found: 1
 ##[error]Process completed with exit code 1.

GitHub Actions: Dogfood Gate / 1_Validate DEED manifests.txt: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]A2ML Manifest Validation
 Scanning . for .a2ml and .deed files...
 Found 23 .a2ml/.deed file(s)
   Validating: ./.machine_readable/6a2/0-AI-MANIFEST.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./.machine_readable/6a2/AGENTIC.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./.machine_readable/6a2/ECOSYSTEM.a2ml
   Validating: ./.machine_readable/6a2/META.a2ml
   Validating: ./.machine_readable/6a2/NEUROSYM.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./.machine_readable/6a2/PLAYBOOK.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./.machine_readable/6a2/STATE.a2ml
   Validating: ./.machine_readable/6a2/anchor/0-AI-MANIFEST.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./.machine_readable/6a2/anchor/ANCHOR.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./.machine_readable/CLADE.a2ml
   Validating: ./.machine_readable/bot_directives/coverage.a2ml
   Validating: ./.machine_readable/bot_directives/debt.a2ml
   Validating: ./.machine_readable/bot_directives/methodology.a2ml
   Validating: ./.machine_readable/contractiles/Adjustfile.a2ml
   Validating: ./.machine_readable/contractiles/Intentfile.a2ml
   Validating: ./.machine_readable/contractiles/Mustfile.a2ml
   Validating: ./.machine_readable/contractiles/Trustfile.a2ml
   Validating: ./.machine_readable/integrations/feedback-o-tron.a2ml
   Validating: ./.machine_readable/integrations/proven.a2ml
   Validating: ./.machine_readable/integrations/verisimdb.a2ml
   Validating: ./.machine_readable/integrations/vexometer.a2ml
   Validating: ./0-AI-MANIFEST.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./audits/assail-classifications.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
 ##[error]Missing required identity field (agent-id, name, or project)

GitHub Actions: Dogfood Gate / Validate DEED manifests: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]A2ML Manifest Validation
 Scanning . for .a2ml and .deed files...
 Found 23 .a2ml/.deed file(s)
   Validating: ./.machine_readable/6a2/0-AI-MANIFEST.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./.machine_readable/6a2/AGENTIC.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./.machine_readable/6a2/ECOSYSTEM.a2ml
   Validating: ./.machine_readable/6a2/META.a2ml
   Validating: ./.machine_readable/6a2/NEUROSYM.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./.machine_readable/6a2/PLAYBOOK.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./.machine_readable/6a2/STATE.a2ml
   Validating: ./.machine_readable/6a2/anchor/0-AI-MANIFEST.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./.machine_readable/6a2/anchor/ANCHOR.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./.machine_readable/CLADE.a2ml
   Validating: ./.machine_readable/bot_directives/coverage.a2ml
   Validating: ./.machine_readable/bot_directives/debt.a2ml
   Validating: ./.machine_readable/bot_directives/methodology.a2ml
   Validating: ./.machine_readable/contractiles/Adjustfile.a2ml
   Validating: ./.machine_readable/contractiles/Intentfile.a2ml
   Validating: ./.machine_readable/contractiles/Mustfile.a2ml
   Validating: ./.machine_readable/contractiles/Trustfile.a2ml
   Validating: ./.machine_readable/integrations/feedback-o-tron.a2ml
   Validating: ./.machine_readable/integrations/proven.a2ml
   Validating: ./.machine_readable/integrations/verisimdb.a2ml
   Validating: ./.machine_readable/integrations/vexometer.a2ml
   Validating: ./0-AI-MANIFEST.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
   Validating: ./audits/assail-classifications.a2ml
 ##[warning]Missing SPDX-License-Identifier in first 10 lines
 ##[error]Missing required identity field (agent-id, name, or project)

GitHub Actions: Dogfood Gate / 2_Groove manifest check.txt: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run # Check for static or dynamic Groove endpoints
 �[36;1m# Check for static or dynamic Groove endpoints�[0m
 �[36;1mHAS_MANIFEST="false"�[0m
 �[36;1mHAS_GROOVE_CODE="false"�[0m
 �[36;1m�[0m
 �[36;1mif [ -f ".well-known/groove/manifest.json" ]; then�[0m
 �[36;1m  HAS_MANIFEST="true"�[0m
 �[36;1m  # Validate the manifest JSON�[0m
 �[36;1m  if ! jq empty .well-known/groove/manifest.json 2>/dev/null; then�[0m
 �[36;1m    echo "::error file=.well-known/groove/manifest.json::Invalid JSON in Groove manifest"�[0m

GitHub Actions: Dogfood Gate / Groove manifest check: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run # Check for static or dynamic Groove endpoints
 �[36;1m# Check for static or dynamic Groove endpoints�[0m
 �[36;1mHAS_MANIFEST="false"�[0m
 �[36;1mHAS_GROOVE_CODE="false"�[0m
 �[36;1m�[0m
 �[36;1mif [ -f ".well-known/groove/manifest.json" ]; then�[0m
 �[36;1m  HAS_MANIFEST="true"�[0m
 �[36;1m  # Validate the manifest JSON�[0m
 �[36;1m  if ! jq empty .well-known/groove/manifest.json 2>/dev/null; then�[0m
 �[36;1m    echo "::error file=.well-known/groove/manifest.json::Invalid JSON in Groove manifest"�[0m

GitHub Actions: Dogfood Gate / 4_Empty-linter (invisible characters).txt: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run # Inline invisible character detection (from empty-linter's core patterns).
 �[36;1m# Inline invisible character detection (from empty-linter's core patterns).�[0m
 �[36;1m# Checks for: zero-width spaces, zero-width joiners, BOM, soft hyphens,�[0m
 �[36;1m# non-breaking spaces, null bytes, and other invisible Unicode in source files.�[0m
 �[36;1mset +e�[0m
 �[36;1mPATTERNS='(*UTF)[\x00-\x08\x0B\x0C\x0E-\x1F\x{a0}\x{ad}\x{200b}-\x{200f}\x{202a}-\x{202f}\x{2060}\x{2066}-\x{2069}\x{feff}]'�[0m
 �[36;1mfind "$GITHUB_WORKSPACE" \�[0m
 �[36;1m  -not -path '*/.git/*' -not -path '*/node_modules/*' \�[0m
 �[36;1m  -not -path '*/.deno/*' -not -path '*/target/*' \�[0m
 �[36;1m  -not -path '*/_build/*' -not -path '*/deps/*' \�[0m
 �[36;1m  -not -path '*/external_corpora/*' -not -path '*/.lake/*' \�[0m
 �[36;1m  -type f \( -name '*.rs' -o -name '*.ex' -o -name '*.exs' -o -name '*.res' \�[0m
 �[36;1m    -o -name '*.js' -o -name '*.ts' -o -name '*.json' -o -name '*.toml' \�[0m
 �[36;1m    -o -name '*.yml' -o -name '*.yaml' -o -name '*.md' -o -name '*.adoc' \�[0m
 �[36;1m    -o -name '*.idr' -o -name '*.zig' -o -name '*.v' -o -name '*.jl' \�[0m
 �[36;1m    -o -name '*.gleam' -o -name '*.hs' -o -name '*.ml' -o -name '*.sh' \) \�[0m
 �[36;1m  -exec grep -aPrl "$PATTERNS" {} \; > /tmp/empty-lint-results.txt 2>/dev/null�[0m
 �[36;1mEL_EXIT=$?�[0m
 �[36;1mset -e�[0m
 �[36;1m�[0m
 �[36;1mFINDINGS=$(wc -l < /tmp/empty-lint-results.txt 2>/dev/null || echo 0)�[0m
 �[36;1mecho "findings=$FINDINGS" >> "$GITHUB_OUTPUT"�[0m
 �[36;1mecho "exit_code=$EL_EXIT" >> "$GITHUB_OUTPUT"�[0m
 �[36;1mecho "ready=true" >> "$GITHUB_OUTPUT"�[0m
 �[36;1m�[0m
 �[36;1m# Blocking subset: C0 controls and NUL only (owner ruling 2026-08-28).�[0m
 �[36;1m# Invisible Unicode (NBSP/BOM/zero-width) stays ADVISORY - about 2,100�[0m
 �[36;1m# estate files carry it as legitimate typography in prose.�[0m
 �[36;1mblocking=0�[0m
 �[36;1mwhile IFS= read -r bf; do�[0m
 �[36;1m  [ -z "$bf" ] && continue�[0m
 �[36...

GitHub Actions: Dogfood Gate / Empty-linter (invisible characters): ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run # Inline invisible character detection (from empty-linter's core patterns).
 �[36;1m# Inline invisible character detection (from empty-linter's core patterns).�[0m
 �[36;1m# Checks for: zero-width spaces, zero-width joiners, BOM, soft hyphens,�[0m
 �[36;1m# non-breaking spaces, null bytes, and other invisible Unicode in source files.�[0m
 �[36;1mset +e�[0m
 �[36;1mPATTERNS='(*UTF)[\x00-\x08\x0B\x0C\x0E-\x1F\x{a0}\x{ad}\x{200b}-\x{200f}\x{202a}-\x{202f}\x{2060}\x{2066}-\x{2069}\x{feff}]'�[0m
 �[36;1mfind "$GITHUB_WORKSPACE" \�[0m
 �[36;1m  -not -path '*/.git/*' -not -path '*/node_modules/*' \�[0m
 �[36;1m  -not -path '*/.deno/*' -not -path '*/target/*' \�[0m
 �[36;1m  -not -path '*/_build/*' -not -path '*/deps/*' \�[0m
 �[36;1m  -not -path '*/external_corpora/*' -not -path '*/.lake/*' \�[0m
 �[36;1m  -type f \( -name '*.rs' -o -name '*.ex' -o -name '*.exs' -o -name '*.res' \�[0m
 �[36;1m    -o -name '*.js' -o -name '*.ts' -o -name '*.json' -o -name '*.toml' \�[0m
 �[36;1m    -o -name '*.yml' -o -name '*.yaml' -o -name '*.md' -o -name '*.adoc' \�[0m
 �[36;1m    -o -name '*.idr' -o -name '*.zig' -o -name '*.v' -o -name '*.jl' \�[0m
 �[36;1m    -o -name '*.gleam' -o -name '*.hs' -o -name '*.ml' -o -name '*.sh' \) \�[0m
 �[36;1m  -exec grep -aPrl "$PATTERNS" {} \; > /tmp/empty-lint-results.txt 2>/dev/null�[0m
 �[36;1mEL_EXIT=$?�[0m
 �[36;1mset -e�[0m
 �[36;1m�[0m
 �[36;1mFINDINGS=$(wc -l < /tmp/empty-lint-results.txt 2>/dev/null || echo 0)�[0m
 �[36;1mecho "findings=$FINDINGS" >> "$GITHUB_OUTPUT"�[0m
 �[36;1mecho "exit_code=$EL_EXIT" >> "$GITHUB_OUTPUT"�[0m
 �[36;1mecho "ready=true" >> "$GITHUB_OUTPUT"�[0m
 �[36;1m�[0m
 �[36;1m# Blocking subset: C0 controls and NUL only (owner ruling 2026-08-28).�[0m
 �[36;1m# Invisible Unicode (NBSP/BOM/zero-width) stays ADVISORY - about 2,100�[0m
 �[36;1m# estate files carry it as legitimate typography in prose.�[0m
 �[36;1mblocking=0�[0m
 �[36;1mwhile IFS= read -r bf; do�[0m
 �[36;1m  [ -z "$bf" ] && continue�[0m
 �[36...

GitHub Actions: Governance / 3_governance _ Actions lockfile verify.txt: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run set -uo pipefail
 �[36;1mset -uo pipefail�[0m
 �[36;1mif [ "$GITHUB_REPOSITORY" = hyperpolymath/standards ]; then�[0m
 �[36;1m  SRC=scripts�[0m
 �[36;1m  echo "Using this repository's own gate + verifier (standards self-lint)."�[0m
 �[36;1melse�[0m
 �[36;1m  SRC=.standards-lock/scripts�[0m
 �[36;1mfi�[0m
 �[36;1mfor f in check-actions-lock-gate.sh update-actions-lock.sh; do�[0m
 �[36;1m  if [ ! -f "$SRC/$f" ]; then�[0m
 �[36;1m    echo "::error::actions-lock gate: $f not found in $SRC (standards checkout at the explicit helper pin failed?)"�[0m

GitHub Actions: Governance / governance _ Actions lockfile verify: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run set -uo pipefail
 �[36;1mset -uo pipefail�[0m
 �[36;1mif [ "$GITHUB_REPOSITORY" = hyperpolymath/standards ]; then�[0m
 �[36;1m  SRC=scripts�[0m
 �[36;1m  echo "Using this repository's own gate + verifier (standards self-lint)."�[0m
 �[36;1melse�[0m
 �[36;1m  SRC=.standards-lock/scripts�[0m
 �[36;1mfi�[0m
 �[36;1mfor f in check-actions-lock-gate.sh update-actions-lock.sh; do�[0m
 �[36;1m  if [ ! -f "$SRC/$f" ]; then�[0m
 �[36;1m    echo "::error::actions-lock gate: $f not found in $SRC (standards checkout at the explicit helper pin failed?)"�[0m

GitHub Actions: Governance / 4_governance _ Security policy checks.txt: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run FAILED=false
 �[36;1mFAILED=false�[0m
 �[36;1mWEAK_CRYPTO=$(grep -rE 'md5\(|sha1\(' --include="*.py" --include="*.rb" --include="*.js" --include="*.ts" --include="*.go" --include="*.rs" . 2>/dev/null | grep -v 'checksum\|cache\|test\|spec' | head -5 || true)�[0m
 �[36;1mif [ -n "$WEAK_CRYPTO" ]; then�[0m
 �[36;1m  echo "::warning::Weak crypto (MD5/SHA1) detected — ADVISORY, does not fail this job. Use SHA256+:"�[0m
 �[36;1m  echo "$WEAK_CRYPTO"�[0m
 �[36;1mfi�[0m
 �[36;1mHTTP_URLS=$(grep -rE 'http://[^l][^o][^c]' --include="*.py" --include="*.js" --include="*.ts" --include="*.go" --include="*.rs" --include="*.yaml" --include="*.yml" . 2>/dev/null | grep -v 'localhost\|127.0.0.1\|example\|test\|spec' | head -5 || true)�[0m
 �[36;1mif [ -n "$HTTP_URLS" ]; then�[0m
 �[36;1m  echo "::warning::HTTP URLs found — ADVISORY, does not fail this job. Use HTTPS:"�[0m
 �[36;1m  echo "$HTTP_URLS"�[0m
 �[36;1mfi�[0m
 �[36;1mSECRETS=$(grep -rEi '(api_key|apikey|secret_key|password)\s*[=:]\s*["\x27][A-Za-z0-9+/=]{20,}' --include="*.py" --include="*.js" --include="*.ts" --include="*.go" --include="*.rs" --include="*.env" . 2>/dev/null | grep -v 'example\|sample\|test\|mock\|placeholder' | head -3 || true)�[0m
 �[36;1mif [ -n "$SECRETS" ]; then�[0m
 �[36;1m  echo "::error::Potential hardcoded secrets detected — this FAILS the job:"�[0m

GitHub Actions: Governance / governance _ Security policy checks: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run FAILED=false
 �[36;1mFAILED=false�[0m
 �[36;1mWEAK_CRYPTO=$(grep -rE 'md5\(|sha1\(' --include="*.py" --include="*.rb" --include="*.js" --include="*.ts" --include="*.go" --include="*.rs" . 2>/dev/null | grep -v 'checksum\|cache\|test\|spec' | head -5 || true)�[0m
 �[36;1mif [ -n "$WEAK_CRYPTO" ]; then�[0m
 �[36;1m  echo "::warning::Weak crypto (MD5/SHA1) detected — ADVISORY, does not fail this job. Use SHA256+:"�[0m
 �[36;1m  echo "$WEAK_CRYPTO"�[0m
 �[36;1mfi�[0m
 �[36;1mHTTP_URLS=$(grep -rE 'http://[^l][^o][^c]' --include="*.py" --include="*.js" --include="*.ts" --include="*.go" --include="*.rs" --include="*.yaml" --include="*.yml" . 2>/dev/null | grep -v 'localhost\|127.0.0.1\|example\|test\|spec' | head -5 || true)�[0m
 �[36;1mif [ -n "$HTTP_URLS" ]; then�[0m
 �[36;1m  echo "::warning::HTTP URLs found — ADVISORY, does not fail this job. Use HTTPS:"�[0m
 �[36;1m  echo "$HTTP_URLS"�[0m
 �[36;1mfi�[0m
 �[36;1mSECRETS=$(grep -rEi '(api_key|apikey|secret_key|password)\s*[=:]\s*["\x27][A-Za-z0-9+/=]{20,}' --include="*.py" --include="*.js" --include="*.ts" --include="*.go" --include="*.rs" --include="*.env" . 2>/dev/null | grep -v 'example\|sample\|test\|mock\|placeholder' | head -3 || true)�[0m
 �[36;1mif [ -n "$SECRETS" ]; then�[0m
 �[36;1m  echo "::error::Potential hardcoded secrets detected — this FAILS the job:"�[0m

GitHub Actions: Governance / governance _ Security policy checks: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run set -uo pipefail
 �[36;1mset -uo pipefail�[0m
 �[36;1mPATTERN='^[[:space:]]*[*_]{0,2}Version[*_]{0,2}[[:space:]]*[:=][[:space:]]*v?[0-9]+\.[0-9]+\.[0-9]+'�[0m
 �[36;1mR5B=0�[0m
 �[36;1mshopt -s nullglob�[0m
 �[36;1mfor doc in *.md *.adoc; do�[0m
 �[36;1m  [ -f "$doc" ] || continue�[0m
 �[36;1m  case "$doc" in CHANGELOG.md|CHANGELOG.adoc) continue ;; esac�[0m
 �[36;1m  while IFS= read -r hit; do�[0m
 �[36;1m    [ -n "$hit" ] || continue�[0m
 �[36;1m    echo "❌ [R5b] pinned version string: $doc:$hit"�[0m
 �[36;1m    R5B=$((R5B+1))�[0m
 �[36;1m  done < <(grep -nE "$PATTERN" "$doc" 2>/dev/null || true)�[0m
 �[36;1mdone�[0m
 �[36;1mif [ "$R5B" -gt 0 ]; then�[0m
 �[36;1m  echo ""�[0m
 �[36;1m  echo "❌ [R5b] $R5B pinned version-string line(s) in load-bearing docs."�[0m
 �[36;1m  echo "Fix: drop the embedded version; defer to CHANGELOG.md (release"�[0m
 �[36;1m  echo "history) and Cargo.toml's [package].version (semver pin) or the"�[0m
 �[36;1m  echo "equivalent package manifest. Git log carries dates."�[0m
 �[36;1m  exit 1�[0m
 �[36;1mfi�[0m
 �[36;1mecho "✅ [R5b] Documentation version-string drift: clean."�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 ❌ [R5b] pinned version string: README.adoc:1653:*Version*: 0.1.0
 ❌ [R5b] pinned version string: justfile-cookbook.adoc:123:Version: 1.0.0
 ❌ [R5b] 2 pinned version-string line(s) in load-bearing docs.
 Fix: drop the embedded version; defer to CHANGELOG.md (release
 history) and Cargo.toml's [package].version (semver pin) or the
 equivalent package manifest. Git log carries dates.
 ##[error]Process completed with exit code 1.

GitHub Actions: Governance / 8_governance _ Workflow security linter.txt: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run if [ "$GITHUB_REPOSITORY" = hyperpolymath/standards ]; then
 �[36;1mif [ "$GITHUB_REPOSITORY" = hyperpolymath/standards ]; then�[0m
 �[36;1m  SCRIPT=scripts/check-descriptile-policy.sh�[0m
 �[36;1melse�[0m
 �[36;1m  SCRIPT=.standards-dupkey/scripts/check-descriptile-policy.sh�[0m
 �[36;1mfi�[0m
 �[36;1mbash "$SCRIPT"�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 70:    if [ -f .machine_readable/STATE.a2ml ]; then
 ##[error]Policy requires a retired descriptile path; use .machine_readable/descriptiles/ and reconcile existing files

GitHub Actions: Governance / governance _ Workflow security linter: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run if [ "$GITHUB_REPOSITORY" = hyperpolymath/standards ]; then
 �[36;1mif [ "$GITHUB_REPOSITORY" = hyperpolymath/standards ]; then�[0m
 �[36;1m  SCRIPT=scripts/check-descriptile-policy.sh�[0m
 �[36;1melse�[0m
 �[36;1m  SCRIPT=.standards-dupkey/scripts/check-descriptile-policy.sh�[0m
 �[36;1mfi�[0m
 �[36;1mbash "$SCRIPT"�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 70:    if [ -f .machine_readable/STATE.a2ml ]; then
 ##[error]Policy requires a retired descriptile path; use .machine_readable/descriptiles/ and reconcile existing files

GitHub Actions: Governance / 9_governance _ Well-Known (RFC 9116 + RSR).txt: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

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: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

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: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

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 / 11_governance _ Language _ package anti-pattern policy.txt: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run SCRIPT=".standards-checkout/scripts/check-ts-allowlist.sh"
 �[36;1mSCRIPT=".standards-checkout/scripts/check-ts-allowlist.sh"�[0m
 �[36;1mif [ ! -f "$SCRIPT" ] && [ "$GITHUB_REPOSITORY" = "hyperpolymath/standards" ] \�[0m
 �[36;1m   && [ -f scripts/check-ts-allowlist.sh ]; then�[0m
 �[36;1m  SCRIPT="scripts/check-ts-allowlist.sh"�[0m
 �[36;1m  echo "Using this repository's own copy (standards self-check)."�[0m
 �[36;1mfi�[0m
 �[36;1mif [ ! -f "$SCRIPT" ]; then�[0m
 �[36;1m  echo "::error::check-ts-allowlist gate not found in standards@main or locally"�[0m

GitHub Actions: Governance / governance _ Language _ package anti-pattern policy: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run SCRIPT=".standards-checkout/scripts/check-ts-allowlist.sh"
 �[36;1mSCRIPT=".standards-checkout/scripts/check-ts-allowlist.sh"�[0m
 �[36;1mif [ ! -f "$SCRIPT" ] && [ "$GITHUB_REPOSITORY" = "hyperpolymath/standards" ] \�[0m
 �[36;1m   && [ -f scripts/check-ts-allowlist.sh ]; then�[0m
 �[36;1m  SCRIPT="scripts/check-ts-allowlist.sh"�[0m
 �[36;1m  echo "Using this repository's own copy (standards self-check)."�[0m
 �[36;1mfi�[0m
 �[36;1mif [ ! -f "$SCRIPT" ]; then�[0m
 �[36;1m  echo "::error::check-ts-allowlist gate not found in standards@main or locally"�[0m

GitHub Actions: Governance / governance _ Language _ package anti-pattern policy: ci: remove per-repo Semgrep scan (the Semgrep Code app covers PRs)

Conclusion: failure

View job details

##[group]Run SCRIPT=".standards-checkout/tools/policy/check-language-policy.sh"
 �[36;1mSCRIPT=".standards-checkout/tools/policy/check-language-policy.sh"�[0m
 �[36;1mif [ ! -f "$SCRIPT" ] && [ -f tools/policy/check-language-policy.sh ]; then�[0m
 �[36;1m  SCRIPT="tools/policy/check-language-policy.sh"�[0m
 �[36;1m  echo "Using this repository's own copy (standards self-check)."�[0m
 �[36;1mfi�[0m
 �[36;1mif [ ! -f "$SCRIPT" ]; then�[0m
 �[36;1m  echo "::error::language-policy gate not found in standards@main or locally"�[0m
🧰 Additional context used
🪛 GitHub Check: CodeFactor
.github/workflows/ci.yml

[warning] 387-387: .github/workflows/ci.yml#L387
Line too long (150 > 120 characters) (line-length)


[warning] 891-891: .github/workflows/ci.yml#L891
Line too long (164 > 120 characters) (line-length)


[warning] 388-388: .github/workflows/ci.yml#L388
Line too long (143 > 120 characters) (line-length)


[warning] 904-904: .github/workflows/ci.yml#L904
Line too long (171 > 120 characters) (line-length)


[warning] 237-237: .github/workflows/ci.yml#L237
Line too long (212 > 120 characters) (line-length)


[warning] 223-223: .github/workflows/ci.yml#L223
Line too long (150 > 120 characters) (line-length)


[warning] 741-741: .github/workflows/ci.yml#L741
Line too long (143 > 120 characters) (line-length)


[warning] 69-69: .github/workflows/ci.yml#L69
Line too long (138 > 120 characters) (line-length)


[warning] 885-885: .github/workflows/ci.yml#L885
Line too long (173 > 120 characters) (line-length)


[warning] 224-224: .github/workflows/ci.yml#L224
Line too long (144 > 120 characters) (line-length)


[warning] 827-827: .github/workflows/ci.yml#L827
Line too long (147 > 120 characters) (line-length)


[warning] 533-533: .github/workflows/ci.yml#L533
Line too long (149 > 120 characters) (line-length)


[warning] 68-68: .github/workflows/ci.yml#L68
Line too long (150 > 120 characters) (line-length)

🪛 zizmor (1.30.1)
.github/workflows/ci.yml

[warning] 53-56: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 92-95: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 138-141: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 172-175: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 211-214: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 257-260: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 315-318: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 375-378: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 422-425: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 465-468: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 503-506: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 562-565: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 600-603: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 621-624: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 658-661: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 692-695: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 728-731: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 763-766: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 804-807: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 872-875: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[error] 55-55: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 59-59: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 66-66: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 94-94: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 98-98: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 106-106: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 140-140: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 144-144: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 174-174: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 178-178: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 213-213: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 217-217: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 221-221: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 234-234: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 259-259: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 263-263: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 271-271: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 295-295: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 317-317: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 321-321: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 341-341: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 377-377: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 381-381: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 385-385: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 399-399: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 424-424: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 428-428: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 436-436: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 467-467: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 471-471: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 505-505: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 509-509: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 517-517: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 525-525: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 542-542: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 564-564: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 568-568: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 602-602: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 606-606: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 623-623: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 627-627: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 660-660: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 664-664: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 671-671: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 694-694: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 698-698: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 710-710: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 730-730: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 734-734: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 745-745: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 765-765: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 769-769: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 780-780: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 806-806: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 810-810: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 814-814: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 824-824: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 833-833: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 845-845: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 874-874: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 878-878: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 889-889: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 902-902: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[warning] 644-648: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[warning] 797-802: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[warning] 866-870: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[error] 64-71: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): omitting lookup-only enables caching

(cache-poisoning)


[error] 104-111: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): omitting lookup-only enables caching

(cache-poisoning)


[error] 142-150: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): omitting package-manager-cache enables caching

(cache-poisoning)


[error] 219-226: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): omitting lookup-only enables caching

(cache-poisoning)


[error] 269-276: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): omitting lookup-only enables caching

(cache-poisoning)


[error] 319-327: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): omitting package-manager-cache enables caching

(cache-poisoning)


[error] 383-390: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): omitting lookup-only enables caching

(cache-poisoning)


[error] 434-441: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): omitting lookup-only enables caching

(cache-poisoning)


[error] 469-477: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): omitting package-manager-cache enables caching

(cache-poisoning)


[error] 625-631: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): omitting package-manager-cache enables caching

(cache-poisoning)


[warning] 7-910: insufficient job-level concurrency limits (concurrency-limits): workflow is missing concurrency setting

(concurrency-limits)


[info] 59-59: action functionality is already included by the runner (superfluous-actions): use rustup and/or cargo in a script step

(superfluous-actions)


[info] 217-217: action functionality is already included by the runner (superfluous-actions): use rustup and/or cargo in a script step

(superfluous-actions)


[info] 381-381: action functionality is already included by the runner (superfluous-actions): use rustup and/or cargo in a script step

(superfluous-actions)


[info] 889-889: action functionality is already included by the runner (superfluous-actions): use gh release in a script step

(superfluous-actions)

🔇 Additional comments (1)
.github/workflows/ci.yml (1)

592-592: 🔒 Security & Privacy | 🛡️ Detected with Advanced Tier

Security Misconfiguration

Reachability: Internal
CWE: CWE-693

Establish equivalent non-PR Semgrep coverage before removing this job.

The former GitHub job ran on the workflow's pushes and version tags, and used p/security-audit, p/secrets and p/owasp-top-ten. The repository has no replacement GitHub Semgrep workflow. If Semgrep Cloud does not provide equivalent coverage for direct pushes, tags and scheduled runs, retain a Semgrep scan for those events.


Summary by CodeRabbit

  • Chores
    • Updated the CI workflow configuration. Existing retained jobs and triggers are unchanged.
    • Removed the security scanning job.

Priority: ➖ Normal

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

Change: Other

Walkthrough

The CI workflow is rewritten in JSON-style YAML. The existing

Note

The walkthrough was truncated because the summary exceeded the platform comment limit.

Merge Risk: ⚪ Minimal · up to 96dc5

This change removes the duplicate Semgrep pull-request scan from CI and reformats the workflow. No concrete defect was found in the retained jobs. Push and scheduled Semgrep coverage now depends on the Semgrep Cloud policy, which the author has flagged as unverified.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 96dc5

The change is limited to repository CI and its action dependency record, without increasing workflow permissions. Other security checks remain configured. However, equivalent coverage from the managed Semgrep replacement has not been demonstrated, so the scanning handoff remains an unresolved security-control question rather than a confirmed vulnerability.

Retained concerns

  • Medium · security · inferred: Removing repository-defined Semgrep execution could reduce security-analysis coverage if the managed app does not preserve the previous event scope and rule policy, particularly for non-PR runs. Equivalent replacement coverage is unverified; an actual coverage loss or exploitable vulnerability has not been established.
Security review details

Security Blast Radius

  • inferred — The potential exposure is reduced static-analysis assurance for this repository's changes. The removed job inherited coverage for all-branch pushes, version-tag pushes, pull requests to main/develop, and manual dispatch. Missing managed-app configuration prevents determining which of those inputs remain equivalently scanned.

Security Findings and Attack Paths

  • observed — The security candidate remains deferred because the managed service's configured events, schedule, and enabled rules are unavailable. It does not establish that attacker-controlled code can evade all effective scanning or that the PR introduces a verified vulnerability.

Trust Boundaries and Controls

  • observed — The deleted Semgrep job had read-only repository-content permission. Retained job settings, including permission and secret references, match across the full comparison. The edited workflow therefore removes an execution stage without adding local workflow authority; this does not establish the managed app's permissions or policy.

Hardening Proposals

  • proposed — Confirm the managed app's enabled rules, event and branch coverage, failure behavior, and observed check execution against the retired job. Explicitly approve any intended coverage differences and retain a restoration path if replacement scanning is unavailable.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: removal of the repository's duplicate Semgrep scan because the Semgrep Code app covers pull requests.
Description check ✅ Passed The description directly explains the Semgrep workflow removal, the duplicate pull-request scanning, verification steps, and the known coverage change.
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 💡 1
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

@github-advanced-security github-advanced-security AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hypatia found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown

🔍 Hypatia Security Scan

Findings: 269 issues detected

Severity Count
🔴 Critical 7
🟠 High 51
🟡 Medium 211

⚠️ Action Required: Critical security issues found!

View findings
[
  {
    "reason": "Action `\"actions/checkout@v6.0.1\",` in ci.yml is not pinned to a commit SHA — `v6.0.1\",` is a tag, and a tag can be moved to a different commit. Pin it to a full 40-character commit SHA, with the version in a trailing comment.",
    "type": "unpinned_action",
    "file": ".github/workflows/ci.yml",
    "action": "pin_sha",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Action `\"dtolnay/rust-toolchain@stable\",` in ci.yml is not pinned to a commit SHA — `stable\",` is a tag, and a tag can be moved to a different commit. Pin it to a full 40-character commit SHA, with the version in a trailing comment.",
    "type": "unpinned_action",
    "file": ".github/workflows/ci.yml",
    "action": "pin_sha",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Action `\"actions/cache@v4.2.3\",` in ci.yml is not pinned to a commit SHA — `v4.2.3\",` is a tag, and a tag can be moved to a different commit. Pin it to a full 40-character commit SHA, with the version in a trailing comment.",
    "type": "unpinned_action",
    "file": ".github/workflows/ci.yml",
    "action": "pin_sha",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Action `\"actions/checkout@v6.0.1\",` in ci.yml is not pinned to a commit SHA — `v6.0.1\",` is a tag, and a tag can be moved to a different commit. Pin it to a full 40-character commit SHA, with the version in a trailing comment.",
    "type": "unpinned_action",
    "file": ".github/workflows/ci.yml",
    "action": "pin_sha",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Action `\"erlef/setup-beam@v1.18.2\",` in ci.yml is not pinned to a commit SHA — `v1.18.2\",` is a tag, and a tag can be moved to a different commit. Pin it to a full 40-character commit SHA, with the version in a trailing comment.",
    "type": "unpinned_action",
    "file": ".github/workflows/ci.yml",
    "action": "pin_sha",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Action `\"actions/cache@v4.2.3\",` in ci.yml is not pinned to a commit SHA — `v4.2.3\",` is a tag, and a tag can be moved to a different commit. Pin it to a full 40-character commit SHA, with the version in a trailing comment.",
    "type": "unpinned_action",
    "file": ".github/workflows/ci.yml",
    "action": "pin_sha",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Action `\"actions/checkout@v6.0.1\",` in ci.yml is not pinned to a commit SHA — `v6.0.1\",` is a tag, and a tag can be moved to a different commit. Pin it to a full 40-character commit SHA, with the version in a trailing comment.",
    "type": "unpinned_action",
    "file": ".github/workflows/ci.yml",
    "action": "pin_sha",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Action `\"actions/setup-node@v4.0.2\",` in ci.yml is not pinned to a commit SHA — `v4.0.2\",` is a tag, and a tag can be moved to a different commit. Pin it to a full 40-character commit SHA, with the version in a trailing comment.",
    "type": "unpinned_action",
    "file": ".github/workflows/ci.yml",
    "action": "pin_sha",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Action `\"actions/checkout@v6.0.1\",` in ci.yml is not pinned to a commit SHA — `v6.0.1\",` is a tag, and a tag can be moved to a different commit. Pin it to a full 40-character commit SHA, with the version in a trailing comment.",
    "type": "unpinned_action",
    "file": ".github/workflows/ci.yml",
    "action": "pin_sha",
    "rule_module": "workflow_audit",
    "severity": "medium"
  },
  {
    "reason": "Action `\"ludeeus/action-shellcheck@2.0.0\",` in ci.yml is not pinned to a commit SHA — `2.0.0\",` is a tag, and a tag can be moved to a different commit. Pin it to a full 40-character commit SHA, with the version in a trailing comment.",
    "type": "unpinned_action",
    "file": ".github/workflows/ci.yml",
    "action": "pin_sha",
    "rule_module": "workflow_audit",
    "severity": "medium"
  }
]

Powered by Hypatia Neurosymbolic CI/CD Intelligence

@hyperpolymath
hyperpolymath merged commit 50bacde into main Oct 8, 2026
55 of 80 checks passed
@hyperpolymath
hyperpolymath deleted the chore/drop-duplicate-semgrep branch October 8, 2026 11:04
hyperpolymath added a commit that referenced this pull request Oct 8, 2026
## Summary

Restores block-style formatting of `.github/workflows/ci.yml`. #372
removed this repo's duplicate Semgrep scan and, in the same PR, rewrote
the file as KYAML. The KYAML form turned two gates red that read only
block YAML:

- **governance / Workflow security linter**: its duplicate-key check
comes from standards@317101e0 (2026-09-14). Flow-document support landed
later, in standards 13b872c1 (2026-10-01), so the old copy reads every
step's `name:`/`run:` as a repeat of the previous one and reports
phantom duplicates.
- **lint-workflows** (this repo's `workflow-linter.yml`), where present:
it checks for top-level permissions with `grep -q "^permissions:"`.
KYAML indents that key inside `{`, so the check fails although the
permissions are declared.

The parsed workflow is unchanged, so behaviour does not change. KYAML
conversion waits until both gates read it.

Follow-up to #372.

## Type of change

- [ ] 🐛 Bug fix: no code change; this clears CI reds the earlier
reformat caused.
- [ ] ✨ New feature: n/a
- [ ] 💥 Breaking change: no
- [ ] 🕳️ Soundness fix: n/a
- [ ] 📖 Documentation: n/a
- [x] 🧹 Refactor / tech debt (behaviour-preserving)
- [ ] ⚡ Performance: n/a
- [x] 🔧 Build / CI / tooling

## 📌 New pins

Head SHA: **`c59230581179e6803cbb36ecb17d3ea349e1827c`**. No pins added
or changed.

## How has this been verified?

- `yq -o json 'sort_keys(..)'` on `main` @ `50bacde` and on this head:
**identical data**.
- The current standards duplicate-key checker passes this file. A
planted duplicate in a KYAML copy is still caught (rc=1), so the KYAML
file was clean and the old checker was wrong.
- `grep -c '^permissions:'` = 1 (was 0 in the KYAML form).
- `actionlint`: same diagnostics as the pre-#372 file.
- No `uses:` ref changes, so `actions.lock` is unaffected.

## Checklist

- [x] My commits are **signed** (verified `G`).
- [x] I ran the project's own checks/tests locally and they pass: the
checks above. This is formatting only.
- [ ] New files carry the correct SPDX identifier: n/a, no new files.
- [x] Docs are updated, and no public claim now overstates what the code
does: nothing to update.
- [x] I have not introduced a soundness hole.

## Notes for reviewers

Formatting only. The data-identity check is the whole claim.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_013aSu89DNALjTYHBvA6FcoM

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.

2 participants