Skip to content

fix(rhodibot): stop demanding filenames the estate abandoned - #534

Merged
hyperpolymath merged 1 commit into
mainfrom
fix/rhodibot-current-canon
Sep 18, 2026
Merged

hyperpolymath merged 1 commit into
mainfrom
fix/rhodibot-current-canon

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

The RSR required-file table predated the Markdown/TXT → AsciiDoc migration
(#486, 2026-08), so rhodibot was demanding filenames the estate had
deliberately moved away from. Measured against 269 estate repositories:

Demanded Repos that have it What they actually have
LICENSE.txt 0/269 LICENSE 269/269
CONTRIBUTING.md 25/269 CONTRIBUTING.adoc 255
CODE_OF_CONDUCT.md 15/269 CODE_OF_CONDUCT.adoc 240
SECURITY.md 35/269 SECURITY.adoc 250
lowercase justfile 7/269 Justfile 267
.machine_readable/STATE.scm 1/269 .a2ml spelling 13

A bot whose stated job is "structural checks, directory layout" was telling
essentially every repository to reintroduce the pre-migration filenames —
i.e. to undo the AsciiDoc migration.

What changed

Required files now name the current convention, with the superseded spellings
accepted as alternates, so a completed rename is never reported as a
regression. CheckDef gains alternates, and check_path_exists() tries the
canonical path first and only falls back, so the common case still costs one
request.

Adds RSR-016 (www/.well-known/security.txt, canonical since #53) and
RSR-017 (legacy root .well-known/, remediation "move, do not delete"). Both
advisory at minimal/standard while the stage-5 migration window is open.

Rule IDs RSR-002RSR-015 are unchanged and still resolve from the old
spellings, so existing reports and .rsr.toml overrides keep working.

Two defects found while in here, both fixed

  1. is_fixable() advertised four auto-fixes with no template behind them.
    It listed 7 files; robot-repo-automaton ships 3 templates, and
    get_template_content() falls through to String::new() for anything it
    does not recognise — so it would open PRs creating .gitattributes,
    .gitignore, .claude/CLAUDE.md and .machine_readable/bot_directives
    empty. inbox-steward.yml auto-merges PRs that pass CI. Narrowed to the
    three that have templates.
  2. No SECURITY.adoc arm in get_template_content(), so the renamed check
    would also have produced an empty file. Added, sharing SECURITY.tmpl.

Tests

  • rhodibot 50 passed / 0 failed (was 45 passing / 3 failing). The 3
    failures were the tests asserting the stale filenames — the stale contract
    written down in code — brought to the current canon. Two regression tests
    added: superseded spellings still pass, and the www/ check is present and
    honestly fails when absent.
  • robot-repo-automaton 114 passed / 0 failed.

Caveat on deployment

This PR does not by itself change what the deployed bot does.
deploy-bot-fleet.k9.ncl sets rhodibot.enabled = true and points at
.github/workflows/rhodibot.yml, which does not exist in this repo — the live
instance is most likely a service under deploy/systemd/. Someone with host
access needs to confirm where it runs.

Root cause, not addressed

standards has zero references to rhodibot; its rules are hardcoded in Rust,
which is how they went seven months stale. The durable fix is to make the
required-file table data with standards as the source of truth. Worth doing
as a follow-up.

The checker's required-file table predated the Markdown/TXT -> AsciiDoc
migration (#486, 2026-08) and the canonical-location changes after it, so
it demanded filenames the estate had deliberately moved away from. Measured
against 269 estate repositories on 2026-09-18:

  wants LICENSE.txt          0/269 have it   (LICENSE:         269/269)
  wants CONTRIBUTING.md     25/269           (CONTRIBUTING.adoc:  255)
  wants CODE_OF_CONDUCT.md  15/269           (CODE_OF_CONDUCT.adoc: 240)
  wants SECURITY.md         35/269           (SECURITY.adoc:      250)
  wants lowercase justfile   7/269           (Justfile:           267)
  wants .machine_readable/STATE.scm  1/269   (.a2ml spelling:      13)

A bot whose stated job is "structural checks, directory layout" was
therefore telling essentially every repository to reintroduce the
pre-migration filenames. Anyone acting on that - a maintainer, or the
automation downstream - reverses the AsciiDoc migration.

Required files now name the current convention, with the superseded
spellings accepted as alternates so a rename is never reported as a
regression. CheckDef gains `alternates`, and `check_path_exists()` tries the
canonical path first and only falls back to alternates when it is absent,
so the common case costs one request exactly as before.

The Guile Scheme state files never landed (1/269, and 13/269 under the
.a2ml spelling), so they drop to Recommended/Required at strict and above,
and 0-AI-MANIFEST.a2ml - which 261/269 repositories do carry - becomes the
machine-readable check that carries the weight.

www/ awareness
  Adds www/.well-known/security.txt (canonical since #53) and a banned
  pattern for the legacy root .well-known/. Both are advisory at minimal
  and standard while the stage-5 migration window is open; the banned
  pattern's severity can be raised once the sweep has landed, which is what
  will stop the migration regressing.

Two defects found while making the change
  * is_fixable() advertised four files as auto-fixable that
    robot-repo-automaton has no template for. get_template_content() falls
    through to String::new() for anything it does not recognise, so the
    automaton would open a PR creating those files EMPTY - and
    inbox-steward auto-merges PRs that pass CI. is_fixable() now matches
    the template arms exactly.
  * The automaton had no arm for SECURITY.adoc, so the renamed check would
    also have produced an empty file. Added, sharing SECURITY.tmpl.

Rule IDs RSR-001..015 are unchanged, and the old spellings still map to
them, so existing reports and .rsr.toml overrides keep resolving.

Tests: rhodibot 50 passed (was 45 passing / 3 failing), including two new
regression tests for the alternates path and the www/ check. Automaton
114 passed.
@coderabbitai

coderabbitai Bot commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 65085ff7-0b93-47dd-88b1-e23551f134ec

📥 Commits

Reviewing files that changed from the base of the PR and between e3ea5aa and a813351.

📒 Files selected for processing (5)
  • bots/rhodibot/src/fleet.rs
  • bots/rhodibot/src/rsr.rs
  • bots/rhodibot/src/webhook.rs
  • bots/rhodibot/tests/integration_tests.rs
  • robot-repo-automaton/src/fixer.rs
 ____________________________________________
< Like a moth to a flame, I'm drawn to bugs. >
 --------------------------------------------
  \
   \   (\__/)
       (•ㅅ•)
       /   づ
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • 🔴 Error committing to branch - (🔄 Check to retry)
  • Create a new PR

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.

@hyperpolymath
hyperpolymath merged commit ca6c504 into main Sep 18, 2026
35 of 39 checks passed
@hyperpolymath
hyperpolymath deleted the fix/rhodibot-current-canon branch September 18, 2026 13:15
@coderabbitai

coderabbitai Bot commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

❌ Failed to create Coding Agent finishing-touch task. Please try again.

@coderabbitai

coderabbitai Bot commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

❌ Failed to create Coding Agent finishing-touch task. Please try again.

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