Skip to content

fix(ci): cure 18 of the 19 pre-existing check failures that kept every hypatia PR red - #764

Open
hyperpolymath wants to merge 3 commits into
mainfrom
fix/preexisting-ci-failures
Open

fix(ci): cure 18 of the 19 pre-existing check failures that kept every hypatia PR red#764
hyperpolymath wants to merge 3 commits into
mainfrom
fix/preexisting-ci-failures

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented Sep 8, 2026

Copy link
Copy Markdown
Owner

What this is

Every open hypatia PR has been carrying an identical set of pre-existing failing
checks
that had nothing to do with its diff: 19 failing check runs across 18
distinct check names
(lint is emitted twice, by two different workflows).
Re-measured live on both #763 and #753 — the two failing sets are name-identical.
They are not eighteen problems. They are seven root causes, plus three
aggregator checks that merely report the others.

This PR cures all seven at source. It changes no rule logic and no product
behaviour; it is entirely CI plumbing plus two documentation-consistency fixes
deferred during PR-5.

The seven root causes

Workflow Failing rows Root cause
release.yml Build Rust ×5 on: push: null fires on every branch; ${GITHUB_REF#refs/tags/v} returns the ref unchanged when the prefix is absent, so the tar name contained refs/heads/… — directories that do not exist
actions.lock Integration Tests, E2E Elixir, governance / Validate Hypatia Baseline no dependency entry for hyperpolymath/smtp-notify-action@v0.2.0
tests.yml E2E Rust CLI Scan invoked ./target/release/hypatia; the binary is hyper (the crate is hypatia-cli) — exit 127
security-policy.yml Secret Detection ×2 .gitleaks.toml [extend] target was never staged, so gitleaks died before scanning a byte
security-policy.yml Generate Rust SBOM cargo cyclonedx --output-cdx removed upstream, installed unpinned
quality.yml lint (×2 events) action-editorconfig-checker@v2.2.0 globs ec-linux-amd64*, a filename gone since checker v4
ci.yml k9iser manifest + build k9iser.toml declared deno.json, which does not exist and must not
dogfood-gate.yml Validate K9 contracts a dangling symlink in k9-ecosystem@main kills action extraction

One entry unblocks merging

governance / Validate Hypatia Baseline is the only required check in the
failing set, and its failure and the mix test failures share a single cause —
the missing lockfile entry:

Invalid .github/workflows/actions.lock: {:workflow_dependencies_missing,
  [{".github/workflows/push-email-notify.yml", "hyperpolymath/smtp-notify-action@v0.2.0"}]}

Two findings worth keeping

A crashed scanner was reported as a positive finding. Gitleaks uses exit
codes for both "leak found" and "fatal config error", and the audit summary
infers "possible secrets in repository" from a non-zero exit. A broken config
was indistinguishable from a real breach. There was no secret.

A dangling symlink anywhere in an action repo kills every consumer. GitHub
extracts the entire action repository during "Prepare all required actions",
before any step's if: is evaluated. So an unresolvable link in
editors/vscode/ killed a job that only uses validate-action/, and the
k9_count > 0 guard could not protect it. The lockfile pinned @main faithfully
to the commit that carried the defect — the lock did its job perfectly and still
could not help. Cured by moving the lockfile's recorded commit back to
c74f04c7; the workflow still says @main, so no inline SHA appears anywhere
and the lock remains the pin.

Honest framing — please read before assuming green

  • Three fixes turn crashed steps into running ones. Gitleaks now actually
    scans, editorconfig-checker v4 now actually lints, and hyper scan now actually
    executes. Each may report genuine findings the crash was hiding. A new red
    in these three is a result, not a regression of this PR.
  • Build Rust ×5 will be ABSENT, not green. release.yml no longer triggers on
    PRs — that is the fix. The version-derivation change is proven only by a local
    harness until a tag is cut. Positive control for the absence: PR-time Rust
    compile coverage is retained by rust.yml and ci.yml, which deliver Rust
    Check & Clippy, Rust Format, Cargo test, Cargo check + clippy + fmt and Rust
    License & Ban Check — all green on this head. The release.yml jobs were
    cross-target release artifact builds; tags-only is correct for those.
  • Verify by set difference plus a positive count, not "fewer reds". Result on
    head 92ce43e: 18 of the 19 baseline failing runs are cured — 13 are
    present and success, and 5 are the justified absences above (Build Rust ×5).
    The one uncured baseline item is Integration Status, and it fails solely
    because e2e-tests failed (its other three dependencies are all success).
  • The failing set here is NOT a strict subset of the baseline, and that is
    expected.
    End-to-End Tests is failing on this PR and was not in the
    baseline — because it never ran there. It is needs: [integration-tests], and
    Integration Tests failed first, so it was gated out and had no check run at
    all. Curing the upstream job let it execute for the first time. It is a
    revealed finding, not a regression — see finding 3 below.
  • All required contexts are green on this head, verified directly against the
    live main ruleset: governance / Validate Hypatia Baseline,
    governance / Code quality + docs, CodeQL, CodeQL Analysis (actions),
    CodeQL SAST (actions), analyze (actions, none) and
    analyze (javascript-typescript, none). Neither End-to-End Tests nor
    Integration Status is a required context.
  • This PR nonetheless shows BLOCKED — that is a ruleset artefact, not a check
    failure.
    It is the B3 required_deployments: [github-pages] rule, which no
    PR head SHA can ever satisfy: the Pages workflow triggers on push, never on
    pull_request. 18 of 120 estate repos carry it, hypatia among them. It is
    unrelated to this diff and was not chased here.

⚠ Overlap with the 09-08 standing ruling — owner call

The 09-08 ruling says "hands off .a2ml/.deed grammar, A2ML manifests, K9
contracts"
. This PR touches two such files. Both edits are corrective, not
grammar or design work
, and both are trivially revertible on their own:

They are isolated in their own commit, 6ad9239, precisely so this is a
decision you can take with one command rather than a re-authoring request:
git revert 6ad9239 drops both and leaves every other cure intact. That commit
touches those two files and nothing else.

  • 0-AI-MANIFEST.a2ml — one dead docs/rules/catalogue.md link → .adoc, and a
    stale module count (33 → 35). No grammar change.
  • k9iser.toml — removes a [[source]] declaring deno.json, a file that does
    not exist and whose language is banned estate-wide, plus its now-orphaned
    [[constraint]]. This removal is what cures the ci.yml failure.

The orphaned constraint is worth flagging on its own: check-k9iser-paths
validates that every [[source]] path exists, but never checks that a
[[constraint]] references a live source
. So
deno.imports has no npm: specifiers could never evaluate and therefore never
fail — a rule that looked like enforcement and was inert. Removing the source
without the constraint would have left that vacuous gate in place.

Say the word and I will drop either or both hunks.

Verified locally

  • mix test test/rules/actions_lock_test.exs13 tests, 0 failures

  • ActionsLock.parse on the fixed lockfile → 29 workflows / 41 deps; pinned?/3
    true for both smtp-notify-action and editorconfig-checker

  • check-k9iser-paths k9iser.tomlOK — 4 source(s), 2 constraint(s), exit 0

  • Version-derivation harness: refs/tags/v1.2.31.2.3; v1.2.3-rc1
    1.2.3-rc1; refs/heads/*error; dispatch input honoured

  • cargo-cyclonedx 0.5.9 verified against the crates.io sparse index (latest,
    not yanked, MSRV 1.85.0 ≤ stable); --override-filename confirmed present at
    src/cli.rs:90 in the published source, and --output-cdx confirmed absent.
    Filename semantics read from generator.rs: an override suppresses the .cdx
    suffix, so --override-filename rust-sbom.cdx --format json yields
    rust-sbom.cdx.json — matching the upload globs

  • Gitleaks estate baseline confirmed to exist at standards 571cc734… (8922 bytes)

  • dogfood-gate.yml confirmed the only k9-ecosystem consumer in the repo

  • Required gate simulated end-to-end on a clean git archive export using the
    real upstream apply-baseline.sh at the pinned workflow sha, BLOCKING_THRESHOLD=info:
    1 finding, 1 suppressed, 0 kept → exit 0. The sole finding is the
    DependencyPinning scorecard entry already acknowledged in the baseline as an
    external-tool limitation

    Honest caveat on that simulation: the scanner it ran was built from this
    branch
    . That is sound here only because the branch is rule-identical to main
    under lib/ (the sole lib/ change is a one-line help-text string in
    cli.ex). Note also that the real gate resolves hypatia via
    git ls-remote ... HEAD and builds from main, so a PR that changed rule
    logic would not be self-testing at this gate.

  • asciidoctor --failure-level=WARN clean; 105 table cells = 3 × 35, none dropped

  • All six edited workflows parse as YAML; shellcheck clean on the rewritten script

Also reported, not fixed (deliberate)

lib/rules/rsr_conformance.ex fails mix format --check-formatted on main, and
hypatia has no CI gate for mix format at all — only Justfile:34 runs
mix format, which reformats rather than checks, so Elixir formatting drifts
silently. Left out to keep this PR single-purpose.

Revealed after opening: three findings the cures uncovered

All three were invisible before, and all three are exactly what the "honest framing"
section above predicted would happen when a crashing job starts running. Curing a
failing early step does not only turn that check green — it ENFORCES, for the
first time, every gate that step was disarming.

1. The E2E fixture was never a git repository (92ce43e). Curing the binary
name took the job past exit 127, and it then failed with
Error: Not a git repository: /tmp/test-repo. The step built its fixture with
mkdir alone, but the Rust CLI opens the target with git2
(Repository::open, cli/src/commands/mod.rs:38). This step could never have
passed
— one bug was standing in front of another. Measured on a release
build: mkdir only → exit 1 (the CI error verbatim); git init only → exit 0;
git init + a commit → exit 0. An empty repo suffices, so the fix is one line.

2. CodeQL actions/unpinned-tag fired on the lint cure (alert 1178,
quality.yml:339). Bumping action-editorconfig-checker to v3.0.0 is a tag
ref, and the CodeQL check is diff-scoped, so touching that line minted a new
alert even though the repo already carries ~10 open ones and CodeQL passed on
#763. The SHA "fix" is forbidden by C1. Dismissed as won't fix per standing owner
ruling O-CODEQL (2026-09-03), citing lockfile authority and the resolved
sha1-51f63319f592f97930c73d9c46184d20bd206393. The check went green on
dismissal, no re-run required.

3. End-to-End Tests can never pass — the infrastructure it names does not
exist.
This job was absent from the baseline only because it is
needs: [integration-tests] and that dependency failed first, so it was gated
out and emitted no check run. Curing Integration Tests let it run for the
first time, and it fails at its "Start full stack" step with
no configuration file provided: not found. The step is
working-directory: deploy, but git ls-files deploy returns exactly two
files — Containerfile and README.adoc. There is no compose file there.
Nor can it be redirected: the only compose file in the tree,
integration/compose.test.yaml, defines no hypatia service. (The sibling
integration-tests job does not use compose at all — it uses GitHub Actions
services:, which is why it has "Wait for ArangoDB"/"Wait for Dragonfly"
steps.) Separately, its health check targets http://localhost:8080/health,
which the estate no-8080 network-hardening doctrine bans. Across the 12 most
recent tests.yml runs on main the job is 3× skipped and 9× absent — it
has never once run to a conclusion.
Integration Status is red purely as its
aggregator.

This one is left red deliberately, and it is an owner call, not a cure. The
only two honest options are (a) build the missing infrastructure — a compose
file, a hypatia service image and a non-8080 health endpoint, which is new
work, not a repair; or (b) delete the job and its needs: entry. Making it
skip when the compose file is absent was rejected: that manufactures a
green gate that asserts nothing. Neither this check nor Integration Status is
a required context, so leaving it red blocks nothing. Today's standing ruling is
triage-only, so the fork is recorded here rather than taken.

Also found, not fixed (out of scope, no CI impact): a debug build of the
CLI panics before doing anything, on a clap debug_assertCommand scan: Short option names must be unique for each argument, but '-c' is in use by both 'categories' and 'config'. It is compiled out of release builds, which is why CI
never saw it. It does mean cargo run -- scan is broken for anyone developing
the CLI locally.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TCKh98NmUmfvgpuGyJbNu8

hyperpolymath and others added 2 commits September 8, 2026 16:31
Every open hypatia PR carried an identical set of 18 failing checks that
had nothing to do with its diff. They reduce to seven root causes plus
three aggregators that merely report them.

release.yml -- Build Rust x5
  `on: push: null` fires on EVERY branch push, so the release pipeline ran
  on feature branches. `${GITHUB_REF#refs/tags/v}` returns the ref UNCHANGED
  when the prefix is absent, so the version became `refs/heads/<branch>` and
  the archive name `hypatia-refs/heads/<branch>-<target>.tar.gz`, whose
  embedded slashes are directories that do not exist -- tar died with
  "Cannot write: Broken pipe" on all five targets. Trigger is now tags-only,
  and version derivation fails loudly on a non-tag ref instead of silently
  building a nonsense name.

actions.lock -- Integration Tests, E2E Elixir, governance / Validate Hypatia Baseline
  The lockfile had no dependency entry for
  hyperpolymath/smtp-notify-action@v0.2.0 (used by push-email-notify.yml).
  This ONE omission produced both the `mix test` failure and the governance
  gate's only unfiltered finding:
    {:workflow_dependencies_missing,
      [{".github/workflows/push-email-notify.yml",
        "hyperpolymath/smtp-notify-action@v0.2.0"}]}
  governance / Validate Hypatia Baseline is the only REQUIRED check in the
  failing set, so this entry is what actually unblocks merging. The commit
  sha was obtained by dereferencing the annotated tag object, not by reading
  git/ref/tags/v0.2.0 (which returns the tag, not the commit).

tests.yml -- E2E Rust CLI Scan
  Invoked ./target/release/hypatia. The workspace binary is `hyper`
  (cli/Cargo.toml [[bin]]); the CRATE is hypatia-cli. Exit 127 read like a
  missing build rather than a wrong filename.

security-policy.yml -- Secret Detection, Secret Detection (Gitleaks)
  .gitleaks.toml carries `[extend] path = ".gitleaks-estate.toml"`, which
  gitleaks resolves against the process CWD. Only standards'
  secret-scanner-reusable.yml staged that file, so these two hand-rolled
  jobs died before scanning a single byte, the action then crashed on the
  results.sarif it never wrote, and the audit summary reported a CRASHED
  SCANNER as "possible secrets in repository" -- a fake red in the worst
  possible direction for a security gate. There was no secret. Both jobs now
  stage the estate baseline from the same standards sha secret-scanner.yml
  already consumes, and delete the tooling checkout before scanning so the
  scan cannot report standards' files as hypatia's.

security-policy.yml -- Generate Rust SBOM
  cargo-cyclonedx dropped `--output-cdx` upstream and was installed
  unpinned, so the job began failing with no workflow change. Pinned to
  0.5.9 --locked and switched to `--override-filename`. Upload paths are
  globbed because cyclonedx writes one file per Cargo.toml and this is a
  seven-member workspace.

quality.yml -- lint (x2 events)
  action-editorconfig-checker@v2.2.0 globs `ec-linux-amd64*`, a filename
  gone since editorconfig-checker v4. A pinned wrapper around an unpinned
  payload is not a pin. Bumped to v3.0.0 with the matching lockfile entry.

dogfood-gate.yml -- Validate K9 contracts
  hyperpolymath/k9-ecosystem main carries a dangling symlink
  (editors/vscode/container/.gatekeeper.yaml -> ../../../../_shared/...,
  one `..` too many, escaping the repo). GitHub extracts the whole action
  repo during "Prepare all required actions", BEFORE any step `if:` is
  evaluated, so the job died at setup and the k9_count guard could not
  protect it. The action is referenced at the moving `@main` ref, so the
  LOCKFILE selects the commit: pinned back to c74f04c7, the last tree with
  no symlinks at all. No inline SHA -- the lock is the pin. Upstream fix is
  to carry _shared/container/.gatekeeper.yaml across; see the comment at the
  call site.

Also cures the two defects deferred during PR-5:
  - `--format` help text listed `sarif, sarif`. The real supported set is
    json / sarif / github plus a catch-all rendering text, so the duplicate
    was a straight repetition, not a dropped format name.
  - gen-rule-catalogue.sh still wrote docs/rules/catalogue.md while the tree
    holds catalogue.adoc, so "regenerate" produced an orphan beside the real
    file and the catalogue drifted for a month. The script now emits native
    AsciiDoc, restores the SPDX header the .md->.adoc conversion dropped,
    and the catalogue is regenerated (33 -> 35 modules). README.adoc had
    three dead links to catalogue.md and a stale module count, all fixed.

Verified locally:
  - mix test test/rules/actions_lock_test.exs -- 13 tests, 0 failures
  - ActionsLock.parse on the fixed lockfile: OK, 29 workflows / 41 deps,
    and pinned?/3 true for both smtp-notify-action and editorconfig-checker
  - version derivation regression harness: refs/tags/v1.2.3 -> 1.2.3,
    v1.2.3-rc1 -> 1.2.3-rc1, refs/heads/* -> error, dispatch input honoured
  - asciidoctor --failure-level=WARN clean; 105 table cells = 3 x 35, none dropped
  - all six edited workflows parse as YAML; shellcheck clean

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TCKh98NmUmfvgpuGyJbNu8
Cures the last 2 of the 18 (ci.yml -- "k9iser manifest" and "build", plus
the CI Status aggregator that reports them).

k9iser.toml declared `deno.json` as a [[source]]. That file does not exist
in the tree and must not: Deno is banned estate-wide. check-k9iser-paths
exits 1 on any missing declared source, so ci.yml has been red on every
push and every PR for as long as the entry has been there.

Removed the source AND its orphaned [[constraint]]. The constraint
("deno.imports has no npm: specifiers") targeted the namespace the dead
source would have populated, and the checker never validates that a
[[constraint]] references a live source -- so it was a rule that could
never evaluate and therefore could never fail. Leaving it would have kept
a vacuous gate in the manifest after removing the thing it gates.

0-AI-MANIFEST.a2ml is included here for the same reason it is separable:
its only change is a dead docs/rules/catalogue.md link retargeted to the
.adoc that actually exists, plus the 33 -> 35 module count that went with
it. No grammar, no schema, no design.

Split out from the preceding commit deliberately. The 09-08 standing
ruling says "hands off .a2ml/.deed grammar, A2ML manifests, K9 contracts",
and these are the only two files in this PR that ruling could reach. Both
edits are corrective rather than structural, but the owner should not have
to take them on trust: `git revert` of this commit alone drops both and
leaves the other six root-cause cures intact. ci.yml then returns to red
for its original, now-documented reason.

Verified locally:
  - check-k9iser-paths k9iser.toml -- "OK ... 4 source(s), 2 constraint(s)", exit 0
  - 0-AI-MANIFEST.a2ml: no remaining catalogue.md reference in the tree

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

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Review Change StackReview 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: 9b79765d-ae25-44d6-9515-8a641dbd18b9

📥 Commits

Reviewing files that changed from the base of the PR and between 0e91342 and 6ad9239.

⛔ Files ignored due to path filters (1)
  • .github/workflows/actions.lock is excluded by !**/*.lock
📒 Files selected for processing (11)
  • .github/workflows/dogfood-gate.yml
  • .github/workflows/quality.yml
  • .github/workflows/release.yml
  • .github/workflows/security-policy.yml
  • .github/workflows/tests.yml
  • 0-AI-MANIFEST.a2ml
  • README.adoc
  • docs/rules/catalogue.adoc
  • k9iser.toml
  • lib/hypatia/cli.ex
  • scripts/gen-rule-catalogue.sh
💤 Files with no reviewable changes (1)
  • k9iser.toml

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

📜 Recent review details
⏰ Context from checks skipped due to timeout. (13)
  • GitHub Check: Integration Tests
  • GitHub Check: Container Security (Trivy) (deploy/Containerfile)
  • GitHub Check: Rust Dependency Audit
  • GitHub Check: Rust Dependency Audit
  • GitHub Check: stress-test
  • GitHub Check: E2E — Rust CLI Scan
  • GitHub Check: Cargo check + clippy + fmt
  • GitHub Check: Check
  • GitHub Check: Test
  • GitHub Check: Clippy
  • GitHub Check: Rust Check & Clippy
  • GitHub Check: Build AsciiDoc
  • GitHub Check: Build AsciiDoc
🧰 Additional context used
🪛 GitHub Check: CodeQL
.github/workflows/quality.yml

[warning] 339-339: Unpinned tag for a non-immutable Action or reusable workflow
Unpinned 3rd party Action 'Docs & Code Quality' step Uses Step uses 'editorconfig-checker/action-editorconfig-checker' with ref 'v3.0.0', not a pinned commit hash

🔇 Additional comments (9)
lib/hypatia/cli.ex (1)

1305-1305: LGTM!

.github/workflows/release.yml (1)

8-17: LGTM!

Also applies to: 60-67

.github/workflows/tests.yml (1)

97-101: LGTM!

.github/workflows/quality.yml (1)

339-339: LGTM!

.github/workflows/dogfood-gate.yml (1)

109-125: LGTM!

scripts/gen-rule-catalogue.sh (1)

3-3: LGTM!

Also applies to: 5-14, 17-17, 20-21, 23-23, 25-25, 27-28, 30-30, 32-32, 35-37, 47-47, 49-49

docs/rules/catalogue.adoc (1)

1-2: LGTM!

Also applies to: 4-4, 6-6, 13-14, 16-16, 19-36, 38-53

0-AI-MANIFEST.a2ml (1)

24-24: LGTM!

Also applies to: 65-65

README.adoc (1)

22-23: LGTM!

Also applies to: 71-71, 144-144


📝 Summary

Summary by CodeRabbit

  • Bug Fixes

    • Corrected the documented CLI output formats.
    • Fixed end-to-end Rust scanning by invoking the correct command.
    • Improved security scan setup and software bill of materials generation.
  • Documentation

    • Updated the rule-module count from 33 to 35.
    • Replaced the Markdown rule catalogue with an AsciiDoc catalogue, adding two new rule modules.
  • Chores

    • Release workflows now run only for version tags and reject invalid version references.
    • Updated the EditorConfig validation action and clarified workflow configuration.

Walkthrough

The pull request updates GitHub Actions workflows, security scan handling, SBOM generation, rule catalogue generation, project metadata, k9iser configuration, and CLI help text.

Changes

Workflow and catalogue maintenance

Layer / File(s) Summary
Workflow triggers and command corrections
.github/workflows/release.yml, .github/workflows/tests.yml, .github/workflows/quality.yml, .github/workflows/dogfood-gate.yml
Release runs only for version tags and rejects invalid version references. The Rust scan uses the hyper binary. The EditorConfig action is updated. The action pin explanation is documented.
Security scan and SBOM updates
.github/workflows/security-policy.yml
Gitleaks jobs stage and verify the pinned estate baseline. SBOM jobs pin cargo-cyclonedx to 0.5.9 and upload recursive CycloneDX outputs.
AsciiDoc catalogue generation
scripts/gen-rule-catalogue.sh, docs/rules/catalogue.adoc, README.adoc, 0-AI-MANIFEST.a2ml
The generator now writes AsciiDoc. The catalogue lists 35 modules, including actions_lock and implementation_inside_canon. Project references use the .adoc path.
Configuration and CLI text cleanup
k9iser.toml, lib/hypatia/cli.ex
The Deno source and constraint entries are removed. The CLI help text lists sarif once.

Priority: ➖ Normal — Schedule the CI reliability fixes because they address 18 recurring failures across release, security, testing, dependency locking, and validation workflows.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to 6ad92

This change corrects CI and release workflow behavior, security-scan setup, SBOM generation, and catalogue references without changing product rule logic. No concrete current-head merge-blocking risk is identified.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Linked Issues check ❓ Inconclusive The description references PRs #763 and #753, but it does not identify a linked issue or state whether an issue link is required. Provide the relevant issue link or confirm that no linked issue is required for this pull request.
✅ Passed checks (4 passed)
Check name Status Explanation
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 2…
Description check ✅ Passed The description is directly related to the CI, workflow, dependency-lock, and documentation changes. It explains the root causes, scope, verification, and known remaining findings.
Out of Scope Changes check ✅ Passed The changes match the stated objectives. The A2ML and K9 manifest edits are explicitly justified as corrective changes and are isolated in a separate commit.
Title check ✅ Passed The title clearly summarises the main change: fixing 18 pre-existing CI check failures through CI and workflow changes. It is specific and relevant to the changeset.
✨ Finishing Touches
📝 Generate docstrings
  • ✅ Generated successfully - (🔄 Check to regenerate)
  • Commit on current branch

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

❤️ Share

A rabbit checks the workflows bright,
Tags now guide the release flight.
Gitleaks guards the catalogue gate,
Thirty-five rules now enumerate.
The CLI speaks clear, and builds run right.

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

Comment thread .github/workflows/quality.yml Fixed
coderabbitai[bot]
coderabbitai Bot previously approved these changes Sep 8, 2026
…g it

The E2E Rust CLI Scan job built its fixture with `mkdir` alone. The Rust
CLI opens the scan target with git2 (`Repository::open`,
cli/src/commands/mod.rs:38) and exits 1 on a plain directory:

    Error: Not a git repository: /tmp/test-repo
    Caused by: could not find repository at '/tmp/test-repo';
               class=Repository (6); code=NotFound (-3)

So this step could never have passed. The previous commit's binary-name
fix (hypatia -> hyper) is what revealed it: while the job died at exit 127
before argv was even parsed, the fixture defect was unreachable and
therefore invisible. One bug was standing in front of another.

Measured, release build, three fixture shapes:
  mkdir only            -> exit 1, the CI error verbatim
  git init only         -> exit 0, scan completes
  git init + one commit -> exit 0
An empty repository is sufficient; no commit is needed, so the fixture
stays cheap. `rm -rf` added first so the step is idempotent on reruns.

The whole step body was then executed verbatim against a redirected
fixture path: exit 0, ending "PASS: Rust CLI scan completed", with the
scanner emitting a plausible finding (missing-readme) rather than an
error -- evidence it really scanned rather than merely exiting.

Separately noted, NOT fixed here (no CI impact, wrong scope): a DEBUG
build of the CLI panics before running, on a clap debug_assert --
"Command scan: Short option names must be unique for each argument, but
'-c' is in use by both 'categories' and 'config'". The assertion is
compiled out of release builds, which is why CI never saw it and why the
release binary reaches the git2 call at all. Worth a follow-up: `-c` is
ambiguous for anyone building the CLI locally.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TCKh98NmUmfvgpuGyJbNu8
@hyperpolymath hyperpolymath changed the title fix(ci): cure the 18 pre-existing failures that kept every hypatia PR red fix(ci): cure 18 of the 19 pre-existing check failures that kept every hypatia PR red Sep 8, 2026
@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Caution

Docstrings generation - FAILED

No docstrings were generated.

@hyperpolymath
hyperpolymath enabled auto-merge (squash) September 8, 2026 19:04
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