Skip to content

docs(audit): CI enforcement — 3 of 5 required merge checks cannot fail - #2525

Merged
POWERFULMOVES merged 4 commits into
mainfrom
docs/ci-enforcement-audit
Aug 18, 2026
Merged

docs(audit): CI enforcement — 3 of 5 required merge checks cannot fail#2525
POWERFULMOVES merged 4 commits into
mainfrom
docs/ci-enforcement-audit

Conversation

@POWERFULMOVES

@POWERFULMOVES POWERFULMOVES commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Read-only map of which CI checks are load-bearing, prompted by trim-2511's finding on python-tests. No workflow editedmerge-gate.yml is trim-2511's to repair; this is the map, not the repair.

Bottom line

It is neither "everything is broken" nor "two bad steps". It is narrower and worse than either:

Three of the five checks required to merge into main are structurally incapable of failing. All three are in one file, merge-gate.yml. The other two are well built and genuinely enforce.

The wider estate is healthier than that implies: of 87 jobs containing shell steps, 46 have no failure-masking at all. The damage is concentrated in the one file whose job is to be the gate.

Required check Verdict Why
merge-gate VACUOUS three echos and an unread variable; no command that can fail
python-tests VACUOUS head -20 of 264 test files, then || true
hardening-validation VACUOUS greps for the string USER and asserts nothing
verify ENFORCING set -euo pipefail, exit 1 per missing contract element, fail-safe on diff errors
submodule-gitlink-gate ENFORCING fail=1 + exit 1 on dangling / rollback / sideways gitlinks

Proof, not inference

Every vacuous verdict was produced by constructing an input that should fail and watching the step exit 0.

python-tests — 264 test files found by the workflow's own find; 20 survive head -20. A deliberately failing test:

$ python -m pytest --tb=no -q test_definitely_fails.py ; echo $?
1
$ find . -name 'test_*.py' ... | head -20 | xargs python -m pytest --tb=short -q || true ; echo $?
0

hardening-validation — passes in all three constructed cases:

Case Input Output Exit
A a Dockerfile containing USER root …/Dockerfile:USER root 0
B Dockerfiles with no USER at all (implicit root) (nothing) 0
C no pmoves/services directory (nothing) 0

Case A is the sharp one: it passes by printing the exact condition it was written to prevent. Case B found a second bug — the || echo 'No USER directives found' fallback is unreachable, because the pipeline's exit status is head's, not grep's. So in the implicit-root case the step is silent as well as green.

merge-gatePASSED=true is assigned and never read; both $GITHUB_OUTPUT writes are string literals. The comment says "List all required check names"; no list exists.

Three different ways a check goes vacuous

Separated because they need different repairs, and only the first is findable by pattern-matching:

  1. By masking — real command, status thrown away (python-tests, hardening-validation, docker-build-validation). Remove the mask.
  2. By emptiness — no command that can fail (merge-gate). Nothing to unmask; implement it or stop requiring it.
  3. By unreachable input — correct logic over values that cannot occur. merge-decision is a well-written aggregator with a real exit 1, and is still structurally green, because all three jobs it aggregates are vacuous. Repairing it accomplishes nothing; repairing its inputs fixes it for free.

The wiring does not match the design

merge-gate.yml's own header tells the operator to require Merge Gate / merge-decision. The live configuration requires merge-gate — the empty stub — and not merge-decision. Immaterial today since both are vacuous, but it matters for the repair: fixing python-tests and hardening-validation does bite, because those are required contexts in their own right.

Related: docker-build-validation is vacuous and not required, and its only consumer is merge-decision, which is also not required — so whatever assurance it might provide reaches no decision at all.

A second hardening check, also vacuous

hardening-validation.yml (job check name "Docker Bench Security") is a separate, more serious-looking attempt at the same concern, and all three of its shell steps are masked. It is not required, so no false merge assurance — but the project now has two container-hardening checks and neither can fail.

Named so they are not miscounted

Honestly advisory (masking is correct): the rollback-* handlers in deploy-gateway-agent.yml (if: failure() || cancelled()), the cleanup jobs in fleet-docker-cleanup.yml / runner-maintenance.yml / integrations-ghcr.yml, and list-flows. An advisory check that is honestly advisory is fine.

emit lifecycle trail — the third category, reusing the characterisation from #2522: both shell steps carry continue-on-error: true, so its only failure path is Checkout, which is the PMOVES-Archon nested-gitlink flake. The registration gap is unconditional; the CI failure is a flake conditional on runner workspace reuse. The only way this check fails is the one way it was not designed to.

Enforcing but not required (the mirror-image finding — real signal wired to nothing): village-gate, validate-command-anchors-ratchet, check-suit-release-notes, Submodule Smoke Test.

Two limits of the static scan, both of which mattered

It missed the worst one. merge-gate contains no masking construct because it contains no command. Pattern-matching for discarded exit codes cannot find a step with no exit code to discard — category 2 is invisible to the tool and was found by reading.

"All shell steps masked" ≠ "cannot fail". uses: steps fail too. integrations-ghcr.yml / build-validate-pr has all three run: steps masked and is not vacuous, because its Build (PR validation, no push) action step has no continue-on-error. Every all-masked job was hand-checked for a load-bearing action step before a verdict was assigned.

The appendix (all 100 jobs) is scan-derived and labelled as such — a map of where to look, not a set of verdicts.

Not in scope

No workflow edits. No recommendation on which of the three to fix first, or whether merge-gate should be implemented or dropped from the required set — both are reasonable and it is an operator call. Flagged as latent: the verify context is defined by a job in chit-contract.yml and one in verify-attestation.yml; no collision today only because the latter is workflow_dispatch-only.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Documentation
    • Added a read-only audit of CI enforcement across 57 workflow files and 100 jobs.
    • Documented required, advisory, vacuous, and unenforced checks, including branch-protection alignment.
    • Included scan methodology, limitations, job-level findings, and collection metadata.

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review available on request

  • 🔍 Trigger review

Reviews should be triggered manually for repositories with fewer than 10 stars. Select Trigger review above or comment @coderabbitai review to review the latest changes. For a full review, comment @coderabbitai full review.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 4acbe859-af47-4c96-a2cc-811db2e10871

📝 Walkthrough

Walkthrough

The PR adds a read-only CI enforcement audit. It classifies required checks, evaluates failure paths, compares branch-protection wiring, records scan limitations, catalogs 100 jobs, and includes collection provenance.

Changes

CI Enforcement Audit

Layer / File(s) Summary
Required check analysis
pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md
The audit classifies the five required merge checks. It documents vacuous behavior in merge-gate, python-tests, and hardening-validation, and enforcing behavior in verify and submodule-gitlink-gate.
Wiring and scope analysis
pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md
The audit compares merge-decision wiring with required contexts and records findings for Docker hardening, advisory jobs, lifecycle checks, and enforcing checks that are not required.
Scan catalog and provenance
pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md
The document records scan patterns, limitations, scope exclusions, a 100-job appendix, collection metadata, source revision, and audit signature.

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

Suggested labels: governance

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description provides detailed audit findings but omits the required Summary, Testing, Required Checks, and Review Coordination sections. Add the required template sections, document testing under Testing, complete the Required Checks checklist, and record review coordination details.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely identifies the audit finding that three required merge checks cannot fail.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/ci-enforcement-audit

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

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

@github-actions github-actions Bot added the docs Documentation label Aug 10, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4b93a9b016

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md Outdated
Comment thread pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md Outdated
Comment thread pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md Outdated

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 8

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md`:
- Around line 15-17: Update the audit’s “structurally incapable of failing”
wording to “cannot fail on the intended validation input,” limiting the claim to
validation failures. Explicitly exclude setup and runner failures from the
claim, including actions/checkout, actions/setup-python, pip install, and
job-level failures propagated to merge-decision; apply the same correction to
the referenced repeated sections.
- Line 49: Add language identifiers to every fenced code block in
CI_ENFORCEMENT_2026-08-10.md, including the blocks at the referenced locations,
using text for output, console for shell transcripts, and yaml for YAML content
as appropriate; ensure all fences satisfy markdownlint MD040.
- Around line 320-323: Update the appendix entries for verify-attestation.yml
and its verify job to match the workflow’s confirmed trigger, removing the
contradictory PR-live/required claim if it is workflow_dispatch-only. Recompute
the required-check summary so it reflects five required PR checks and no
unsupported sixth verify check.
- Around line 59-69: Update the audit transcript section around “Discarded
status” to use the exact workflow shell and complete find/xargs pytest command
from the referenced workflow, including the same interpreter invocation. If the
reproduction remains simplified or uses a different command, relabel it as an
equivalent local reproduction and explicitly document its limitations.
- Around line 34-36: Update the evidence statement in
CI_ENFORCEMENT_2026-08-10.md to apply only to checks marked VACUOUS. For the
ENFORCING checks verify and submodule-gitlink-gate, report observed non-zero
failure evidence instead, and explicitly state any evidence limitations.
- Around line 433-435: Update the audit release trail in the document footer to
include the required claim, release, ownership, and signed-ACK metadata through
the approved process, preserving the
claim→work→validate→compare→document→release sequence; alternatively, clearly
label the file as non-release evidence and do not present it as production
validation.
- Around line 209-221: Revise the audit conclusion in the hardening-validation
discussion to distinguish the docker-bench job from the unmasked Run hardening
validation step and the validate-hardening, validate-compose, and
validate-dockerfiles jobs. Align claims about whether hardening checks can fail
with the evidence documented in the runbooks and smokes, rather than asserting
that all checks are masked.
- Around line 19-20: Reconcile the shell-job total in the audit narrative with
the appendix: twelve rows marked run=0 out of 100 leave 88 jobs containing shell
steps. Update the inconsistent “87 jobs” headline or correct the appendix so
both counts agree, while preserving the evidence-based status claims.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 4acecb46-1829-41d3-8e44-8f97bec6aa91

📥 Commits

Reviewing files that changed from the base of the PR and between beeee21 and 4b93a9b.

📒 Files selected for processing (1)
  • pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md

Comment thread pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md Outdated
Comment thread pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md
Comment thread pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md Outdated
Comment thread pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md Outdated
Comment thread pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md Outdated
Comment thread pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md Outdated
Comment thread pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md
Comment thread pmoves/docs/audit/CI_ENFORCEMENT_2026-08-10.md
POWERFULMOVES and others added 3 commits August 14, 2026 20:56
Read-only map of which CI checks are load-bearing, prompted by trim-2511's
finding on python-tests. No workflow edited; merge-gate.yml is trim-2511's to
repair.

The answer is neither "everything is broken" nor "two bad steps". Three of the
five checks required to merge into main are structurally incapable of failing,
all three in merge-gate.yml. The other two — verify and submodule-gitlink-gate
— are well built and genuinely enforce. Across the wider estate, 46 of the 87
jobs with shell steps have no masking at all; the damage is concentrated in the
one file whose job is to be the gate.

Each vacuous verdict is demonstrated, not inferred, by constructing an input
that should fail and showing the step still exits 0:

- python-tests: 264 test files found, 20 survive head -20, and a deliberately
  failing test that makes pytest exit 1 leaves the step at exit 0.
- hardening-validation: passes in all three constructed cases, including a
  Dockerfile containing USER root — it passes by printing the exact condition
  it was written to prevent. Its `|| echo` fallback is also unreachable,
  because the pipeline's status is head's, so in the implicit-root case the
  step is silent as well as green.
- merge-gate: three echoes and an unread variable. Nothing to fail.

Separates three distinct ways a check goes vacuous, because they need different
repairs: by masking (remove the mask), by emptiness (implement it or stop
requiring it), and by unreachable input. merge-decision is the third case and
is instructive — it is a well-written aggregator with a real exit 1 that is
nonetheless structurally green, because all three jobs it aggregates are
vacuous. Repairing it would accomplish nothing; repairing its inputs fixes it
for free.

Also records that the wiring does not match the design: merge-gate.yml's own
header instructs the operator to require "Merge Gate / merge-decision", but the
live required set contains merge-gate — the empty stub — and not
merge-decision. Immaterial today since both are vacuous; it matters for the
repair.

Names the honestly-advisory checks explicitly (rollback handlers, cleanup jobs)
so the raw masking counts are not misread as defects, and records the
mirror-image finding: village-gate, the anchors ratchet and two others enforce
but are not required, so their verdict is wired to nothing.

Two limits of the static scan are written down because both mattered: it missed
merge-gate entirely, since pattern-matching for discarded exit codes cannot
find a step with no exit code to discard; and "all shell steps masked" does not
mean "cannot fail", since uses: steps fail too — integrations-ghcr's
build-validate-pr is the counterexample. Every all-masked job was hand-checked
for a load-bearing action step before a verdict was assigned.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…fix the sixth required row

Ten review findings, all verified against the workflows before acting. One
reviewer claim was wrong and is rejected with a recount.

The headline said the three checks are "structurally incapable of failing". They
are not: every one runs actions/checkout, and python-tests also runs setup-python
and a pip install whose fallback can fail, so merge-decision can genuinely receive
a failure from them. What cannot happen is a red caused by the VALIDATION. The
blockquote now says that, with the excluded setup paths named -- live as
infrastructure, dead as a gate, which is the combination that makes an occasional
infrastructure red look like a working check.

"Proof, not inference" claimed every verdict came from a failing input that still
exited 0. That is evidence for VACUOUS only. The two ENFORCING verdicts rest on
reading reachable non-zero exits; no failing input was constructed against them.
Both are now stated separately, with the weaker claim labelled as weaker.

The docker-bench section is scoped to the JOB, not the workflow: the same
workflow's validate-hardening runs validate-hardening.sh unmasked with
continue-on-error: false, and validate-compose and validate-dockerfiles carry
unmasked steps. The workflow is not vacuous; that one job is.

And the reviewer found a hole in this audit's own method, which is now written
into it. "Contains a masking construct" is not "cannot fail": docker-bench's first
step holds both a mask and an explicit `exit 1` when `docker info` is unreachable,
in the same shell block, so the step-level scan could not see it. The appendix
shorthand that inferred incapacity from unmasked=0 and uses*=0 has been REMOVED
rather than qualified -- it was an inference the data does not support. Same shape
as merge-gate.yml: capable of failing, incapable of rejecting.

The appendix marked verify-attestation.yml's verify job required and live on PRs.
That workflow is workflow_dispatch-only, so it produces no PR check and cannot be
a required context -- contradicting the audit's own prose 100 lines earlier and
implying a sixth required check. Row corrected; the appendix now shows exactly 5
required rows and the five-check conclusion stands. The required verify context
comes from chit-contract.yml.

The python-tests transcript is relabelled an equivalent local reproduction, naming
both differences (python -m pytest for the bare pytest, find predicates elided),
since neither touches the `|| true` that produces the result. Five bare code
fences given languages for MD040. Footer marks the file non-release evidence: it
validates nothing into production, so it does not travel the Three-Body trail, and
whoever acts on it opens that trail for the change itself.

REJECTED -- the shell-job count. A reviewer read 12 rows with run=0 and asked for
88. Recounted the appendix programmatically: 100 rows, 13 with run=0, 87 with
run>0. The headline's 87 is correct and unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Rebased onto main (f27d43e) and re-verified every verdict in the same
turn the rows were edited.

#2526 merged 2026-08-14, four days after this audit was last updated, and
repaired python-tests: the head -20 cap and the trailing `|| true` are
gone, replaced by an unmasked pip install plus pytest_ratchet.py. The job
can now fail.

Three corrections, all narrowing the claim rather than weakening it:
- headline is now time-scoped; the count today is two of five, not three
- the python-tests row records VACUOUS at audit -> REPAIRED 2026-08-14
- the merge-decision conclusion no longer says the aggregator is
  structurally green, because one of its three legs now enforces

merge-gate and hardening-validation were re-checked and are unchanged:
merge-gate still sets PASSED=true and never reads it; hardening-validation
still ends in `grep ... || echo`. The audit's thesis stands on those two.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@POWERFULMOVES
POWERFULMOVES force-pushed the docs/ci-enforcement-audit branch from 0614593 to 0f7f69c Compare August 15, 2026 01:52
POWERFULMOVES added a commit that referenced this pull request Aug 15, 2026
Joins the existing audit lane (#2522 ruleset exposure, #2525 CI enforcement,
#2527 reproducibility) rather than opening a new one.

Six checks on B850 reported a confident result that did not match reality — a
0-byte exporter behind 200 OK, a launcher that WARNed and exec'd anyway, a
submodule audit measuring branch NAME instead of membership, a dmesg evicted by a
failing USB keyboard, a health checker that printed 'Health: 0.0%' for a bus it
never contacted, and this auditor reading an AttributeError as an ImportError and
writing it into a Makefile comment as fact.

Two shapes needing different remedies: three are mechanizable (a surface returning
success while the payload is absent/stale/malformed — assert content, not status),
three are not (a wrong question, unrelated noise destroying evidence, a misread).

Deliberately does NOT restate the verification discipline. .claude/agents/verifier.md
already specifies it — 'evidence before assertions ... capture verbatim ... state
UNVERIFIED (environment) rather than approximating' — and predates this session.
The documented gap is INVOCATION: that agent was invoked zero times during a session
in which it would have caught finding #6 immediately.

Records the mechanical traps, which are the genuinely new material: $() strips
trailing newlines (bit four times in one evening), nats-py connect_timeout does not
bound DNS, % and ${} in a systemd ExecStart are expanded by systemd, submodule branch
name != membership and recorded gitlink != working tree.

Notes that #2525's merge-gate finding has already been repaired (pytest_ratchet runs
all 264 test files; the gate exit 1s) — verified before relying on it for merges. The
audit lane is driving fixes ahead of its own PRs merging, which argues for landing it.

Proposes the #2527 package as a calibration fixture: #2525 had to hand-roll a
deliberately failing test to prove a check COULD fail; a frozen, hash-manifested,
network-isolated package with six deterministic checks of known outcome is the
standing form of that — a target whose answer is known, which every instrument in
the table lacked.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
POWERFULMOVES added a commit that referenced this pull request Aug 16, 2026
… wrong — plus the four silent handlers they led to (#2572)

* docs(audit): six instruments that reported confidently and were wrong

Joins the existing audit lane (#2522 ruleset exposure, #2525 CI enforcement,
#2527 reproducibility) rather than opening a new one.

Six checks on B850 reported a confident result that did not match reality — a
0-byte exporter behind 200 OK, a launcher that WARNed and exec'd anyway, a
submodule audit measuring branch NAME instead of membership, a dmesg evicted by a
failing USB keyboard, a health checker that printed 'Health: 0.0%' for a bus it
never contacted, and this auditor reading an AttributeError as an ImportError and
writing it into a Makefile comment as fact.

Two shapes needing different remedies: three are mechanizable (a surface returning
success while the payload is absent/stale/malformed — assert content, not status),
three are not (a wrong question, unrelated noise destroying evidence, a misread).

Deliberately does NOT restate the verification discipline. .claude/agents/verifier.md
already specifies it — 'evidence before assertions ... capture verbatim ... state
UNVERIFIED (environment) rather than approximating' — and predates this session.
The documented gap is INVOCATION: that agent was invoked zero times during a session
in which it would have caught finding #6 immediately.

Records the mechanical traps, which are the genuinely new material: $() strips
trailing newlines (bit four times in one evening), nats-py connect_timeout does not
bound DNS, % and ${} in a systemd ExecStart are expanded by systemd, submodule branch
name != membership and recorded gitlink != working tree.

Notes that #2525's merge-gate finding has already been repaired (pytest_ratchet runs
all 264 test files; the gate exit 1s) — verified before relying on it for merges. The
audit lane is driving fixes ahead of its own PRs merging, which argues for landing it.

Proposes the #2527 package as a calibration fixture: #2525 had to hand-roll a
deliberately failing test to prove a check COULD fail; a frozen, hash-manifested,
network-isolated package with six deterministic checks of known outcome is the
standing form of that — a target whose answer is known, which every instrument in
the table lacked.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(instruments): four silent handlers that reported success outward

An AST sweep for finding #7's cause (soft-import + broad except returning a
plausible default) hit 157 sites. That number is itself the finding: torch,
faiss, sentence_transformers, numpy, tqdm, rich and psutil guards are all
CORRECT — the feature degrades and the caller is told. Narrowing to handlers
that are silent (no log, no raise, no warn) gave 60; to those in a path that
reports outward, 4.

The antipattern is not "a broad except on an import". It is a silent handler
in a path that reports outward.

Fixed (logging only — no behaviour or contract change, best-effort delivery
stays best-effort):

  sign_trail.py:77          substituted the whole agent identity in silence;
                            now warns to stderr naming the reason. It already
                            warned about a missing ALTER twenty lines below —
                            it could report a missing persona but not a
                            missing person.
  geometry.py:166,583       dropped every live subscriber and returned
                            {"ok": true}. Eight lines up, the persist logs and
                            raises HTTPException(500). Two disciplines, one
                            function.
  hf-mcp-server:853         hf.model.gguf.converted.v1 never published while
                            the caller was told everything worked.

Left alone deliberately, as counterexamples of correct degradation:
  hf-mcp-server:542         stamps "source":"catalog" vs "registry"
  chit_security.py:13       sets an explicit _CRYPTO_OK = False
  common/__init__.py:41     optional exports fail loudly at the call site

Verified: pmoves/tests/test_sign_trail.py 2 passed; unregistered agent-id now
warns, registered b850-claude still resolves to glyph U+232C / #DC2626 with no
warning; detector re-run shows only the two correct sites remaining.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(geometry-bus-health): report the actual failure, and stop lying in JSON

Running the merged checker on B850 for the first time exposed two gaps in the
NOT MEASURED work itself:

1. The JSON branch still emitted "health_pct": 0.0 when the bus was never
   contacted. The human-readable branch had been fixed to refuse an unmeasured
   percentage; any dashboard consuming --json kept receiving the exact false
   negative. Now null, with an explicit "measured" flag. Fixed the instance,
   not the class — the same error this audit documents.

2. The failure report offered a list of GUESSES and no facts. The real cause
   was 'Authorization Violation' (the server requires credentials; this tool
   deliberately ships no credential-bearing default), but nats-py surfaces that
   through error_cb and keeps retrying, so the only exception reaching the
   caller was TimeoutError. The report therefore said "timed out" — reading as
   a network fault and sending the operator to check host and port, which were
   both already correct. An error_cb now captures what the server actually
   said, and the report leads with it before any guesses.

Verified:
  no creds -> measured=False, health_pct=null,
              error="timed out after 5s connecting to nats://localhost:4222
                     — last server error: Error: nats: 'Authorization Violation'"
  connected -> health_pct=4.2, error=null, no NOT MEASURED banner (synthetic
              BusHealth; success path formatting unchanged)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(audit): postscript — the fix for #5 was confidently wrong on first contact

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…four required

#2592 (merged 2026-08-18) replaced the `grep 'USER' … | head -10 || echo` body
with pmoves/tools/hardening_ratchet.py, so the row claiming VACUOUS no longer
matches the tree. An audit that contradicts main is worse than no audit.

Re-verified against main at 1f3bfb7 in the same turn as the edit, per this
document's own convention: hardening-validation now runs the ratchet unmasked,
and merge-gate still sets PASSED=true, never reads it, and ends in two echos.
Only the hardening-validation row changed.

Also records a correction that runs the other way: this document was RIGHT that
the `|| echo` fallback is unreachable, and that is the sharper finding — the
pipe into `head` is what forces exit 0, because the default run: shell is
`bash -e` without pipefail. #2592's description originally blamed the `|| echo`
itself and was corrected to match this analysis.

Standing count: merge-gate is the only vacuous one left, and it is the one of
the three that branch protection does not require. All four required checks now
enforce.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@POWERFULMOVES
POWERFULMOVES merged commit d11e544 into main Aug 18, 2026
18 checks passed
@POWERFULMOVES
POWERFULMOVES deleted the docs/ci-enforcement-audit branch August 18, 2026 16:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant