Skip to content

feat(catalog): add the unsatisfiable-merge-gate error class (ERR-GATE-001..005) - #452

Merged
hyperpolymath merged 1 commit into
mainfrom
feat/error-catalog-unsatisfiable-gates
Jul 29, 2026
Merged

feat(catalog): add the unsatisfiable-merge-gate error class (ERR-GATE-001..005)#452
hyperpolymath merged 1 commit into
mainfrom
feat/error-catalog-unsatisfiable-gates

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Five new error types, every one measured across all 418 active estate repos on 2026-07-29 rather than inferred. They share one shape: the board reads green or blocked for a reason no workflow edit can address, because the check never ran.

ID Measured
ERR-GATE-001 phantom-required-context 236 required-context rows live in rulesets, which classic protection doesn't report
ERR-GATE-002 never-runs-on-pull-request Dependabot: 10 check-runs on main, 0 on any PR head, 25 repos. Sampling main scores it healthy
ERR-GATE-003 dead-action-pin 69 repos, 135 refs to two deleted actions. Remediation is repoint, not vendor
ERR-GATE-004 actions-policy-refusal allowed_actions: selected + empty patterns_allowedstartup_failure, 0 jobs. Settings fault
ERR-GATE-005 empty-jobs-map 20 repos' e2e.ymljobs: present, every block commented out

Each carries the API traps found while remediating it: the surgical DELETE sub-resource (a full PUT .../protection replaces the object and drops required_signatures/enforce_admins), the HTTP 422 on emptying a ruleset's required_status_checks, and that a startup_failure run cannot be re-run because it has no jobs.

ERR-GATE-005 explicitly warns against the tempting fix — writing a job that passes without testing anything converts a dead gate into a fake one, which is worse because it's read as evidence.

Verified: guile parses the catalog; 14 entries (9 + 5).

🤖 Generated with Claude Code

…-001..005)

Five new error types, every one MEASURED across all 418 active estate repos on
2026-07-29 rather than inferred. They share one shape: the board reads green or
blocked for a reason no workflow edit can address, because the check never ran.

  ERR-GATE-001 phantom-required-context
      A required context no job emits. 236 required-context rows live in
      RULESETS, which classic branch protection does not report -- so an audit
      reading only classic protection sees almost none of the estate's
      requirements. Variants: invented name (hypatia-scan), case mismatch
      (codeql vs CodeQL), filename-as-context (.github/dependabot.yml).

  ERR-GATE-002 required-context-never-runs-on-pull-request
      The canonical case: Dependabot. GitHub's managed dependabot-updates runner
      fires on a SCHEDULE against main -- 10 check-runs there, 0 on any PR head,
      across 25 repos. Sampling main scores it HEALTHY. Likely root of the
      estate's --admin merge drift.

  ERR-GATE-003 dead-action-pin
      69 repos, 135 refs to two DELETED action repos. An unresolvable uses: ref
      yields NO check run rather than a red one. Remediation is REPOINT, not
      vendor: vendoring creates one drifting copy per consumer, which this
      estate's own handover names as its most recurring failure mode.

  ERR-GATE-004 actions-policy-refuses-every-reusable
      allowed_actions=selected + empty patterns_allowed -> startup_failure, zero
      jobs. A SETTINGS fault: proof is governance.yml going 0 jobs -> 10 jobs
      with no file change at all.

  ERR-GATE-005 empty-jobs-map
      20 repos' e2e.yml: jobs: present, every block commented out, hence invalid.

Each entry carries the API traps found while remediating it -- the surgical
DELETE sub-resource for contexts (a full PUT replaces the protection object and
drops required_signatures/enforce_admins), the HTTP 422 on emptying a ruleset's
required_status_checks, and that a startup_failure run cannot be re-run because
it has no jobs.

ERR-GATE-005 carries an explicit warning against the tempting fix: do not write
a job that passes without testing anything, because that converts a dead gate
into a fake one, which is worse -- it is read as evidence.

Verified: guile parses the catalog; 14 entries (9 existing + 5). schema-version
bumped to 2026-07-29.

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

gitar-bot Bot commented Jul 29, 2026

Copy link
Copy Markdown

Note

Automatic reviews are paused because your trial's included automatic processing has been used for this period. Upgrade now, or comment "Gitar review" to run a review anytime.
Learn more

Code Review ✅ Approved 1 resolved / 1 findings

Adds the unsatisfiable merge gate error class with five new catalog entries, but malformed S-expression parentheses at line 310 break the outer list structure.

✅ 1 resolved
Bug: New ERR-GATE entries fall outside the error-catalog list

📄 robot-repo-automaton/ERROR-CATALOG.scm:310 📄 robot-repo-automaton/ERROR-CATALOG.scm:319 📄 robot-repo-automaton/ERROR-CATALOG.scm:434
Line 310 ends with ))))), which closes the spdx-headers pair, fixed-previously, statistics, the quoted list, AND the (define error-catalog ...) form — paren depth returns to 0 there (verified by scanning the file). Consequently the five new (error-type ...) forms on lines 319–434 are orphaned top-level expressions, not members of error-catalog. Any consumer (robot-repo-cleaner) reading the error-catalog value gets only the original 9 entries; the ERR-GATE-001..005 rules are silently absent. Worse, when the file is loaded/evaluated by Guile (as opposed to merely read), each stray (error-type ...) is a call to an unbound error-type procedure and errors out. The PR claim of "14 entries (9 + 5)" only holds if the parser stops at read; the data is not actually attached to the catalog. Fix: reduce line 310 to close only through statistics (leave the list and define open), and add the two missing closers after the last new entry.

Options

Display: compact → Showing less information.

Comment with these commands to change the behavior for this request:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Gitar

Comment thread robot-repo-automaton/ERROR-CATALOG.scm
@hyperpolymath
hyperpolymath merged commit e054daa into main Jul 29, 2026
1 check passed
@hyperpolymath
hyperpolymath deleted the feat/error-catalog-unsatisfiable-gates branch July 29, 2026 06:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant