Empty the misfiled sustainabot slot; add anti-vendoring guardrails#297
Merged
Conversation
…guardrails A full standalone copy of OikosBot (its own Rust workspace, Haskell analyzer, AffineScript bot, containers and policies) had been vendored into bots/sustainabot/ — one of which even grew a hard path dependency back into shared-context/. That implementation has been extracted to its own repo, hyperpolymath/oikosbot, and renamed oikosbot-*. This commit resets the slot and guards against recurrence: - Remove the 99 vendored files from bots/sustainabot/; leave a placeholder README.adoc that reserves the slot and points to hyperpolymath/oikosbot. - Add bots/README.adoc: bot directories are THIN ADAPTERS, never homes for standalone products, and bot crates must not add repo-escaping path deps. - CLAUDE.md: new critical invariant #6 (thin adapters; sustainabot is NOT OikosBot and NOT the oikos DSL). - README/ROADMAP/docs: mark sustainabot's slot "Reserved" and disambiguate. The fleet KEEPS sustainabot as a member: BotId::Sustainabot, the coordinator roster, and safety-triangle routing in shared-context/ are untouched (shared-context still builds green). Only the vendored directory was emptied. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RozeeLxpJsd3WWFngaZWz3
hyperpolymath
added a commit
that referenced
this pull request
Jun 20, 2026
Follow-ups after the sustainabot→oikosbot extraction (#297). Companion PR: **hyperpolymath/oikosbot** branch `claude/determined-cerf-s4zaob`. ## Matter 1 — Repo Integrity Guard When #297 deleted the 98 vendored files, the guard fired and the PR was merged via override. Root cause (besides not knowing the marker): the guard's own comment promises `[mass-delete-ok]` works in "a commit message **or the PR title/body**", but the code only grepped commit messages. - **Implement the documented PR-title/body escape hatch** (via `env:` + `grep -F`, injection-safe — untrusted PR text is never `eval`'d). Accidental stale-base gut-merges are still blocked; only explicitly-marked intentional removals pass. **The guard is not weakened** — threshold and critical-file checks are unchanged. - **CLAUDE.md invariant #7** documents the tripwire + marker convention so future cleanups are marked, not force-merged. ## Matter 2b — fix rhodibot's broken sibling link `bots/rhodibot/README.adoc` linked the non-existent `hyperpolymath/sustainabot` repo. Repointed to the in-repo slot `bots/sustainabot/` and clarified it's the **reserved fleet slot, not** the standalone OikosBot (avoids re-creating the conflation). ## Matter 2c (fleet side) — distinct identity for OikosBot - Add **`BotId::Oikosbot`** to `shared-context` so the optional `oikosbot-fleet` bridge can publish under its own identity instead of borrowing `BotId::Sustainabot`. Modelled on `Custom`: **deliberately excluded from `BotId::all()`**, so the bot roster and coordinator dispatch are unchanged — OikosBot is an *external publisher*, not a managed roster bot. (`+22/−1` in `bot.rs`; **84 shared-context tests pass**.) ### Notes - `robot-repo-automaton` has a **pre-existing, unrelated** build error in `src/detector.rs` (regex `is_match` wants `&str`, gets `&Vec<u8>`) — present on `main` before this change, out of scope here. - I deliberately avoided running `cargo fmt` (the crate has pre-existing rustfmt drift); the diff is the minimal `bot.rs` change only. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01RozeeLxpJsd3WWFngaZWz3 --- _Generated by [Claude Code](https://claude.ai/code/session_01RozeeLxpJsd3WWFngaZWz3)_ Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Jun 20, 2026
sustainabot/Cargo.toml has path dep on missing bots/panic-attacker/Cargo.toml (rename casualty)
#246
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What & why
bots/sustainabot/had a full standalone copy of OikosBot vendored into it — an entire Rust workspace, Haskell analyzer, AffineScript bot, containers and policies (99 files), one crate of which even grew a hardpathdependency back intoshared-context/. A bot slot is meant to be a thin adapter, not a home for an entire external project.This PR resets the slot and guards against recurrence. The implementation itself moves to its own repo in the companion PR:
hyperpolymath/oikosbotbranchclaude/determined-cerf-s4zaob.Changes
bots/sustainabot/; leave a placeholderREADME.adocthat reserves the slot and points tohyperpolymath/oikosbot.bots/README.adoc— bot directories are THIN ADAPTERS; never vendor standalone products, never add repo-escapingpathdeps..claude/CLAUDE.md— new critical invariant chore(deps): bump anyhow from 1.0.101 to 1.0.102 in /robot-repo-automaton #6 (thin adapters;sustainabotis not OikosBot and not theoikosDSL).README.adoc/ROADMAP.adoc/docs/ARCHITECTURE.md— mark the sustainabot slot Reserved and disambiguate.The fleet KEEPS sustainabot as a member
BotId::Sustainabot, the coordinator roster, and safety-triangle routing inshared-context/are untouched —shared-contextstill builds green. Only the vendored directory was emptied; the bot remains a first-class (now reserved) fleet member to be prototyped later.Follow-up (not in this PR)
The coordinator/
shared-contextstill treat sustainabot as a ready verifier; once a real thin adapter is built (or the slot is wired to consume OikosBot externally), the roster status can be updated to match. A couple of other bots' notes reference the oldhyperpolymath/sustainabotname (e.g.bots/rhodibot/README.adoc) and could be repointed atoikosbotseparately.🤖 Generated with Claude Code
https://claude.ai/code/session_01RozeeLxpJsd3WWFngaZWz3
Generated by Claude Code