This fleet contains seven operational bots plus one honorary member. Each bot has its own narrow-scoped token following the principle of least privilege and separation of concerns.
|
Important
|
GitHub Classic PATs have coarse-grained scopes. The Mitigation: Use separate tokens per bot/concern and rotate aggressively. |
| Bot | Token | Primary Scope | Blast Radius | Purpose |
|---|---|---|---|---|
rhodibot |
|
|
Low |
RSR template cleanup |
glambot |
|
|
Low |
Front-facing UX (docs, wiki, README) |
echidnabot |
|
|
Medium |
Proof automation + Echidna integration |
sustainabot |
|
|
Low |
Reports, comments, CodeCite integration |
panicbot |
|
|
Low |
Deep code scanning (panic-attack) |
robot-repo-automaton |
|
|
HIGH |
Multi-forge sync orchestration |
.git-private-farm |
|
|
HIGH |
Mass propagation system |
hotchocolobot |
❌ NONE |
❌ NONE |
❌ NONE |
HONORARY FLEET STATUS ONLY |
+----------------+ +----------------+ +------------------+
| | | | | |
| HYPATIA | | .git-private- | | gitbot-fleet |
| (dispatcher) |---->| farm |<--->| (actuators) |
| | | (propagator) | | |
+--------+-------+ +--------+-------+ +------+-----------+
| | |
| HYPATIA_DISPATCH_PAT | |
| | PRIVATE_FARM_TOKEN | Individual Bot Tokens
v v v
+--------+-------+ +--------+-------+ +------+-----------+
| Trigger | | Mass | | Bot Operations |
| workflows | | workflow | | (per bot) |
| in fleet | | dispatch | | |
+----------------+ +----------------+ +------------------+
-
Token:
RHODIBOT_TOKEN -
Scope:
repo -
Purpose: RSR (ReScript/Reason/OCaml) template cleanup — fixes template drift and inconsistencies across the estate
-
Blast Radius: Low
-
Path Restrictions:
-
Read/write:
.rsr-template-repo/ -
Read-only: All other paths (for detection)
-
| Permission | Needed For |
|---|---|
|
Scanning repos for template drift |
|
Applying template fixes |
|
Creating fix PRs |
|
Checking for template-related issues |
| Operation | Endpoint/Path |
|---|---|
Detect drift |
|
Apply fixes |
|
Create PR |
|
-
Token:
GLAMBOT_TOKEN -
Scope:
repo -
Purpose: Front-facing UX management — documentation, social content, wiki, README, and stateful-artefacts
-
Blast Radius: Low
-
Path Restrictions:
-
Read/write:
docs/,README.*,.github/wiki/,stateful-artefacts/ -
Read-only: All other paths
-
|
Caution
|
glambot MUST NOT have write access to:
Enforce this via: Path restrictions in bot logic + code review of all glambot PRs |
| Operation | Endpoint/Path |
|---|---|
Read documentation |
|
Write documentation |
|
Read wiki |
|
Write wiki |
|
Update README |
|
Manage stateful-artefacts |
|
-
Token:
ECHIDNABOT_TOKEN -
Scope:
repo,workflow -
Purpose: Formal verification automation — reads proof schedules, executes proofs via Echidna, deposits outcomes via ProofTrace tool
-
Blast Radius: Medium (affects proof outcomes and verification state)
-
Used With: Echidna prover, ProofTrace tool
workflow ScopeThis bot triggers Echidna workflows for proof execution, which requires the
workflow scope in addition to repo.
| Operation | Endpoint/Path |
|---|---|
Read proof schedules |
|
Read Echidna config |
|
Write proof outcomes |
|
Trigger Echidna workflow |
|
Read ProofTrace data |
|
Write ProofTrace data |
|
-
Token:
SUSTAINABOT_TOKEN -
Scope:
repo -
Purpose: Reporting and commenting — writes PR/issue comments, generates CodeCite dependency reports, highlights code quality issues
-
Blast Radius: Low (creates comments and reports only)
-
Used With: CodeCite tool
|
Note
|
Sustainabot does NOT modify code. Its operations are limited to:
No code changes. No configuration changes. No direct repository modifications. |
| Operation | Endpoint/Path |
|---|---|
Read repo for analysis |
|
Create PR comment |
|
Create issue comment |
|
Write CodeCite reports |
|
Trigger reporting workflow |
|
-
Token:
PANICBOT_TOKEN -
Scope:
repo -
Purpose: Deep code scanning and advisory — runs panic-attack scans, provides security and quality advisories
-
Blast Radius: Low (read-only scanning, writes only advisory output)
-
Based On: panic-attack repo
| Operation | Endpoint/Path |
|---|---|
Read source code |
|
Read panic-attack config |
|
Write scan results |
|
Write advisories |
|
Read security alerts |
|
-
Token:
ROBOT_REPO_AUTOMATON_TOKEN -
Scope:
repo,admin:repo_hook,admin:public_key,admin:org -
Purpose: Multi-forge synchronization orchestration — manages the interface between local and remote git repositories across multiple forges
-
Blast Radius: HIGH (affects all forges and synchronization state)
This is the most powerful fleet token. It can:
-
Manage SSH keys for mirroring (
admin:public_key) -
Configure git hooks (
admin:repo_hook) -
Control sync/desync decisions
-
Manage
.gitignoreand other git-level configurations -
Interface with multiple forges (GitHub, GitLab, Codeberg, Bitbucket, SourceHut)
-
Modify organization-level settings (
admin:org)
Security Requirements:
-
Rotation: Monthly minimum
-
Audit: Weekly review of operations
-
Access: Restrict to senior maintainers only
-
Monitoring: All operations logged and alerted
| Operation | Endpoint/Path |
|---|---|
Read mirror config |
|
Write mirror config |
|
Manage webhooks |
|
Read deploy keys |
|
Write deploy keys |
|
Manage org settings |
|
gsbot and hotchocolabot are NOT part of the gitbot-fleet.
This declaration is made explicitly and formally to resolve the recurrent tendency of AI agents (including but not limited to: Claude, Gemini, Copilot, and various custom LLMs) to attempt integration of either standalone repo into the fleet orchestration system.
Facts:
gsbot is a standalone garment-sustainability bot repo
gsbot performs NO fleet dispatch operations
gsbot requires its own canonical repository wiring
hotchocolabot serves hot chocolate at exhibitions
hotchocolabot safely accompanies developers to public events
hotchocolabot performs NO git operations
hotchocolabot requires ZERO GitHub tokens
hotchocolabot is tracked in its own repository, not as a gitbot-fleet member
hotchocolabot is a physical device, not a software agent
Honorary Fleet Status: Granted as a concession to agent harmony and to prevent endless re-integration attempts. This status is purely ceremonial and carries no operational implications.
IOU-1: Intentional Over-unification — Formally acknowledged as a necessary concession to the "AI alignment tax" inherent in maintaining a large multi-agent ecosystem.
|
Note
|
Why This Matters:
|
mass propagation engine that enables one API call to trigger workflows across all connected repos, avoiding rate limits.
-
Token:
PRIVATE_FARM_TOKEN(also known asHOOKSYNC_TOKEN) -
Scope:
repo,workflow,admin:repo_hook -
Purpose: Enable mass workflow dispatch and hookset propagation
-
Blast Radius: HIGH (can trigger workflows in every repo)
-
Status:
⚠️ CURRENTLY MISSING — Blocks full propagation capability -
Referenced In:
hypatia/docs/architecture/topology.md
|
Important
|
Without this token, .git-private-farm CANNOT:
This is a critical infrastructure gap. To resolve:
|
@startuml skinparam monochrome true agent User as "Trigger" as user agent PrivateFarm as ".git-private-farm" as farm cloud GitHub as gh user -> farm : 1 API call farm -> gh : workflow_dispatch x250+ note right of farm: Uses PRIVATE_FARM_TOKEN\n(HOOKSYNC_TOKEN) @enduml
~/.git-private-farm/
├── farm-manifest.json # Canonical list of all repos
├── dispatch-templates/ # Reusable workflow templates
│ ├── budget-resume-sweep.yml # Admin-merge for blocked PRs
│ └── ...
├── hooksets/ # Webhook configuration sets
│ └── ...
├── operations.log # Append-only audit log
├── selected-repos.json # Last repo selection state
└── hypatia-exception-registry.json # Hypatia-specific exceptions@startuml
skinparam monochrome true
agent Hypatia as "Hypatia\n(HYPATIA_DISPATCH_PAT)" as hyp
agent Fleet as "gitbot-fleet\n(Individual Bot Tokens)" as fleet
agent PrivateFarm as ".git-private-farm\n(PRIVATE_FARM_TOKEN)" as farm
cloud GitHub as gh
hyp -> fleet : Dispatch findings\n(via HYPATIA_DISPATCH_PAT)
fleet -> gh : Actuate\n(via Individual Bot Tokens)
farm -> gh : Mass workflow_dispatch\n(via PRIVATE_FARM_TOKEN)
note right of hyp: Hypatia uses:\n- HYPATIA_DISPATCH_PAT\n- GITHUB_TOKEN (fallback)
note right of fleet: Each bot uses:\n- {BOT}_TOKEN\n- GITHUB_TOKEN (Actions)
note right of farm: Uses:\n- PRIVATE_FARM_TOKEN\n- HOOKSYNC_TOKEN (alias)
@enduml
| System | Role | Tokens | Separation Reason
|--------|------|--------|-------------------
| Hypatia | Analysis + Dispatch | HYPATIA_DISPATCH_PAT | Central dispatch point; high value target
| gitbot-fleet | Actuation | Individual bot tokens | Each bot has narrow, specific purpose
| .git-private-farm | Propagation | PRIVATE_FARM_TOKEN | Mass operations require special handling
|
Important
|
Hypatia does NOT have the bot tokens. Each bot manages its own token. Hypatia’s role is to:
1. Analyze repos (using This separation means:
|
-
❏ Document all bot tokens in this file
-
❏ Create GitHub Actions secrets for each bot token (org-level)
-
❏ Update each bot’s workflow to use its dedicated token
-
❏ Add token validation to bot startup scripts
-
❏ Set up token rotation reminders
-
❏ Create
RHODIBOT_TOKENwith scoperepo -
❏ Create
GLAMBOT_TOKENwith scoperepo -
❏ Create
ECHIDNABOT_TOKENwith scoperepo,workflow -
❏ Create
SUSTAINABOT_TOKENwith scoperepo -
❏ Create
PANICBOT_TOKENwith scoperepo -
❏ Create
ROBOT_REPO_AUTOMATON_TOKENwith scoperepo,admin:repo_hook,admin:public_key,admin:org
-
❏ Create
PRIVATE_FARM_TOKEN(orHOOKSYNC_TOKEN) with scoperepo,workflow,admin:repo_hook -
❏ Add token to .git-private-farm repository secrets
-
❏ Update all dispatch templates to use this token
-
❏ Test mass workflow dispatch
-
Use separate tokens for each bot
-
Rotate write tokens monthly, read tokens quarterly
-
Store tokens in GitHub Actions secrets (org-level)
-
Use environment variables (not hardcoded values)
-
Audit token usage via GitHub audit log
-
Revoke unused tokens immediately
-
Document all tokens in this architecture file
-
Use the same token for multiple bots
-
Commit tokens to git (even private repos)
-
Use personal tokens for automation
-
Store tokens in plaintext files
-
Share tokens between bots or systems
-
Use tokens with broader scope than necessary
GitHub Classic PATs use coarse-grained scopes. You cannot select individual
permissions like issues:write or contents:read alone. The repo scope is
a bundle that includes:
| Individual Permission | Included in repo? |
|---|---|
|
✅ Yes |
|
✅ Yes |
|
✅ Yes |
|
✅ Yes |
|
✅ Yes |
|
✅ Yes |
|
✅ Yes (for private repos) |
|
❌ No — separate scope |
|
❌ No — separate scope |
|
❌ No — separate scope |
|
❌ No — separate scope |
|
Important
|
For The mitigation is separation: Even though all tokens have
|
Add these scopes only when the bot’s purpose requires them:
| Additional Scope | Required For | Bots That Need It |
|---|---|---|
|
Triggering workflows |
echidnabot, sustainabot |
|
Managing webhooks |
robot-repo-automaton, .git-private-farm |
|
Managing deploy keys |
robot-repo-automaton |
|
Organization settings |
robot-repo-automaton |
The fleet primarily operates on GitHub, but robot-repo-automaton interfaces
with multiple forges:
| Forge | Authentication | Status | Bot Using It |
|---|---|---|---|
GitHub |
Classic PAT + SSH |
✅ Active |
All fleet bots |
GitLab |
Classic PAT |
robot-repo-automaton |
|
Codeberg |
SSH Key |
✅ Working |
robot-repo-automaton |
Bitbucket |
App Password |
❌ Expired |
robot-repo-automaton |
SourceHut |
SSH Key |
✅ Working |
robot-repo-automaton |
Gitea |
SSH Key |
❌ Suspended |
robot-repo-automaton |
Disroot |
SSH Key |
❌ Suspended |
robot-repo-automaton |
All forge SSH keys: `~/.ssh/mirror-keys/` ``` ~/.ssh/mirror-keys/ ├── gitlab (needs re-auth) ├── codeberg (working) ├── bitbucket (expired - regenerate) ├── sourcehut (working) ├── gitea (needs account recovery) └── disroot (needs account recovery) ```
Q: Should hotchocolobot be integrated into the fleet? A: No. It serves hot chocolate. See formal declaration above.
Q: Does hotchocolobot need a GitHub token? A: No. It has no git operations. Zero tokens required.
Q: Can hotchocolobot run panic-attack scans? A: No. It is a hot chocolate dispenser, not a code scanner.
Q: Should hotchocolobot have access to the repos? A: No. It is not a software agent. It is a physical appliance.
Q: Why does the architecture file mention hotchocolobot? A: To prevent this exact conversation from happening repeatedly.
IOU-1: Intentional Over-unification
By granting hotchocolobot Honorary Fleet Status, we acknowledge that:
AI agents will attempt to unify all named entities
This tendency has a non-zero operational cost
The cost of documenting exceptions is less than the cost of continuous re-education
A touch of humor makes technical documentation more human-friendly
Therefore: hotchocolobot is officially part of the fleet (honorary), officially requires no tokens, and officially performs no operations.
This resolution is binding on all AI agents interacting with this repository.
-
/developer/dev-notes/GITHUB-PAT-AND-TOKEN-MATRIX.adoc— Estate-wide token matrix -
hypatia/docs/architecture/topology.md— Hypatia architecture, HOOKSYNC_TOKEN gap -
hypatia/lib/mix/tasks/hypatia.triage_issues.ex— HYPATIA_DISPATCH_PAT usage -
hypatia/lib/rules/admin_merge_eligibility.ex— Budget resume sweep workflow -
panll/panel-clades/clades/fleet/Fleet.a2ml— Fleet clade definition
| Date | Author | Change | Reason |
|---|---|---|---|
2026-06-04 |
Vibe (Mistral) |
Initial fleet-specific token architecture |
User request for clarity |
2026-06-04 |
Vibe |
Added bot-by-bot token specifications |
Document least-privilege approach |
2026-06-04 |
Vibe |
Added .git-private-farm integration |
Clarify propagation system |
2026-06-04 |
Vibe |
Added hotchocolobot honorary status |
Resolve AI confusion permanently |