Skip to content

analysis: what external review bots caught that the fleet did not (ADR-009 / #971 thread) #1009

Open

Description

@hyperpolymath

Why

The owner pays for external reviewers (Codex, Copilot, CodeRabbit), and their credit runs out. If Hypatia and its fleet did their job, those reviewers would be nearly redundant: the fleet means gitbot-fleet, cicd-squabbler, .git-private-farm, proven-cicd and proven-tests-and-benches. They are not redundant yet. This issue takes one thread of work and records three things for each defect: what found it, when, and which part of the fleet should have found it first. The goal is to turn each gap into a rule, a harness or a gate, not a review comment.

The thread covered these PRs:

Ledger

# Defect Found by When Should have been found by Gap class
1 kyq_dump.mjs imported join(".kyq", …), so bun read the path as a package name and the new kyaml-conformance job failed Codex P1 and CI (#1008) after push a local pre-push run of every new or changed workflow job new CI job never executed before push
2 Raw C0 control characters were accepted in plain and block KYAML scalars, though refused in quoted ones. The same gap is in upstream kyq. Codex P2 (#1008) after push a property/mutation harness over the parser: proven-tests-and-benches by remit differential against a reference that shares the bug
3 String.to_atom built from tag text (bounded, but flagged) Hypatia's own code_safety/elixir_atom_from_user after push the same rule, before push fleet rule exists, runs only in CI
4 Line-based workflow reading misread YAML merge keys, aliases and multi-line scalars (3 post-merge threads on #975) Codex after merge a rule against ad-hoc parsing of a structured format when a canonical parser exists (#971) structure parsed with regexes
5 deed_lint.js refused #t; note, which the grammar allows the new apg-js grammar-vs-gate differential (standards#1401) before merge that differential, which is now in CI closed by adding the harness
6 kyq refused a leading BOM, misread a comment after a block-scalar header, counted columns in UTF-16 units, and refused a trailing comma that KEP-5295 allows porting kyq to Elixir and diffing the two before merge conformance differential plus mutation corpus closed for the port; kyq still needs the patch
7 Copilot produced no review on choreographic-types#39 ("insufficient remaining quota") n/a n/a n/a paid reviewer silently absent
8 E2E — Elixir Scanner Pipeline, Integration Tests and governance / Allowlist Preflight (clusterfuzzlite GAP) are red on hypatia main, so every PR inherits them (seen on #1004 and #1008) CI every PR the fleet keeping main green (#990, #683) red base taxes every PR

A defect found while writing this

The description of code_safety/elixir_atom_from_user (lib/rules/code_safety.ex:494) is backwards. It reads "String.to_existing_atom with user input exhausts atom table -- use to_existing_atom", but the pattern matches String.to_atom(. That message is what every alert shows, including code-scanning alert 1512 on #1008. It will be fixed in the next Hypatia PR from this thread.

Proposed conversions, rated

Ranked most elegant and correct first, then most dependable.

  1. Local CI parity: one just ci-changed recipe. It runs exactly the workflow jobs a diff touches (gap 1), plus the Hypatia scan on the diff (gap 3), before push. The fleet already owns the rules, so this only moves when they run. Elegance: high. Dependability: high. Cost: a recipe and job-selection logic.
  2. Grammar-driven differentials as a standard harness shape. Bump peter-evans/repository-dispatch from 3.0.0 to 4.0.1 #5 and Bump actions/checkout from 4.1.1 to 6.0.1 #6 were found by diffing an implementation against an independent reference, and Claude/review scm security t3e cl #2 escaped because both sides shared the bug. The harness should therefore also mutate toward spec classes (YAML 1.2 §5 character productions), not only toward the reference's behaviour. This is the natural remit of proven-tests-and-benches. Elegance: highest; it generalises to every format we parse (deed, k9, KYAML, I-JSON). Dependability: high, and deterministic by seed.
  3. A rule against parsing a structured format with regexes or line scans where an estate parser exists (Hypatia.Kyaml, Hypatia.Deed). This is the class behind Bump webfactory/ssh-agent from 0.9.0 to 0.9.1 #4 and the whole of design: one parsed workflow model for every workflow rule #971. Elegance: medium, since it is heuristic. Dependability: medium.
  4. Treat a paid reviewer's quota failure as "no review", visibly. Surface it in the fork-governance verdict grid, not as an approving silence. Dependability: high. This one is outside the repo: standards fork-governance.

Beyond this repo

  • metadatastician/kyq: the patch for Claude/review scm security t3e cl #2 and Bump actions/checkout from 4.1.1 to 6.0.1 #6 exists locally (5 commits on fix/bom-and-block-scalar-comment; 328 pass). Pushing it was not possible from the session that found it. It needs to land upstream, and then KYQ_REF in ci.yml moves and KNOWN_DIVERGENCES.adoc shrinks.
  • gitbot-fleet / proven-tests-and-benches / cicd-squabbler: I could not read these repositories from this session. The mapping above is by their stated remit and should be checked against what they actually run today.

Activity

  1. coderabbitai commented on Nov 4, 2026

    @coderabbitai
    Contributor
    🔗 Related PRs

    #1002 - fix(learning): qualify trust-graph evidence and expose incomplete scans [closed]
    #964 - RE001: accept a deed egress declaration; stop counting secrets.GITHUB_TOKEN (standards ADR-009) [merged]
    #992 - fix(ci): pin standards governance integration to immutable tested revision [merged]


    📝 Issue Planner

    Check the box below or use the @coderabbitai plan command to generate an implementation plan and prompts that you can use with your favorite coding assistant.

    • Create Plan

    🧪 Issue enrichment is currently in open beta.

    You can configure auto-planning by selecting labels in the issue_enrichment configuration.

    To disable automatic issue enrichment, add the following to your .coderabbit.yaml:

    issue_enrichment:
      auto_enrich:
        enabled: false

    💬 Have feedback or questions? Drop into our discord!

  2. added
    bugSomething is broken or behaves incorrectly
    cicdCI/CD: workflows, actions, lockfiles, pins, runners, release gates
    governancePolicy, rulesets, standards, compliance, and their enforcement
    refactorRestructuring that preserves observable behaviour
    on Nov 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething is broken or behaves incorrectlycicdCI/CD: workflows, actions, lockfiles, pins, runners, release gatesgovernancePolicy, rulesets, standards, compliance, and their enforcementrefactorRestructuring that preserves observable behaviour

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions