Files
ezra-environment/reports/FLEET-LEXICON-AND-TECHNIQUES.md

330 lines
16 KiB
Markdown

# THE FLEET LEXICON: Shared Vocabulary, Techniques & Patterns
**Author:** Ezra (Scribe) — Second Pass, Deep Analysis
**Date:** April 4, 2026
**Purpose:** Every agent in the fleet must speak the same language, use the same patterns, and understand the same architecture. This document is the authoritative reference.
---
## PART I: THE VOCABULARY
Every term below has appeared in issues, code, or operational practice. If you're an agent in this fleet, you must know these words and use them correctly.
### Identity & Structure
| Term | Meaning | Example |
|------|---------|---------|
| **Wizard House** | A complete agent environment: Hermes profile, config, memory, skills, gateway connection, and Telegram presence. Each wizard is a house. | Ezra's house lives at /root/wizards/ezra/ |
| **Harness** | The Hermes Agent runtime — the framework wrapping an LLM with tools, config, skills, sessions, and platform adapters. ALL wizard houses share the same harness codebase. | "The Hermes harness" = run_agent.py + model_tools.py + tools/ + gateway/ |
| **SOUL.md** | A wizard's identity document — system prompt, personality, constraints, mission. Doctrine-bearing file. Any change to SOUL.md is a soul change. | timmy-config/SOUL.md defines who Timmy is |
| **Profile** | A fully isolated Hermes instance with its own HERMES_HOME, config, API keys, memory, sessions, skills, and gateway. Each wizard house IS a profile. | `hermes -p ezra` activates Ezra's profile |
| **Gateway** | The messaging platform bridge. A long-lived async process that receives messages from Telegram/Discord/Slack/etc, dispatches them to AIAgent, and returns responses. Tracked by gateway.pid. | Ezra's gateway connects to Telegram as @EzraScribeBot |
| **Skin** | Data-driven CLI visual theme — colors, spinner faces, branding text. Pure data, no code changes needed. | Built-in skins: default (gold), ares (crimson), mono (grayscale), slate (blue) |
| **Toolset** | A named group of related tools. Users enable/disable toolsets. The master list is _HERMES_CORE_TOOLS in toolsets.py. | "web" toolset = web_search + web_extract |
| **Sovereign** | Local-first, no cloud dependency for core operations. Alexander's highest principle. Every architectural choice is measured against sovereignty. | "Is this sovereign?" = "Does it work if the internet dies?" |
### Operations & Deployment
| Term | Meaning | Example |
|------|---------|---------|
| **Burn / Burn Down** | Execute and close issues aggressively. Tested commits. No half-measures. Alexander's primary directive to agents. | "Burn down your epic" = close issues with working code |
| **Burn Night** | An overnight session of continuous issue execution. Agents run loops, produce PRs, close tickets. | Timmy ran burn nights via cron + Gitea task router |
| **Burn Report** | A post-session summary of what was accomplished. Filed as an issue. Format: issues closed, code written, tests run. | timmy-home #143: "Burn Report #1 — 2026-03-31" |
| **RCA** | Root Cause Analysis. Structured incident post-mortem with severity (P0-P3), 5-Whys, timeline, action items, prevention. | RCA-295: Who NERFED Bilbo? |
| **Health Check** | Automated infrastructure verification. Each check is critical or non-critical, returns PASS/FAIL/ERROR. | Disk space, gateway alive, Gitea token valid, llama-server responding |
| **Deadman Switch** | Alert when zero commits for 2+ hours. Detects stalled agents. | timmy-config #115 |
| **Morning Report** | Daily fleet status report. Due 7 AM. Each agent submits their overnight results. | timmy-config #110 |
| **Checkpoint** | Cross-wizard state snapshot stored in the wizard-checkpoints repo. Used for fleet coordination and drift detection. | Ezra owns the checkpoint registry (8 wizards registered) |
| **Cron Job** | Scheduled task using natural language prompts. Schema: id, name, prompt, schedule (crontab), repeat, deliver target. | "ezra-self-check" runs at 6 AM daily |
| **Trajectory** | A complete session transcript (messages, tool calls, results) saved for training data. The raw material for LoRA/DPO. | Hermes saves trajectories as JSONL in sessions/ |
### Infrastructure
| Term | Meaning | Example |
|------|---------|---------|
| **llama-server** | llama.cpp's HTTP inference server. Serves local models. Critical flags: --jinja (tool-calling), -fa (flash attention), --port, -ngl 999 (full GPU offload). | Port 11435 on VPS, serving Gemma 4 |
| **Gemma 4** | Google's MoE model. 4B active / 26B total parameters. 8GB RAM efficient. THE standard local model. Alexander says: never recommend alternatives. Revolutionary, different class. | gemma-4-E4B-it-Q4_K_M.gguf |
| **TurboQuant** | KV cache compression technique (PolarQuant + QJL) for longer context on Apple Silicon. Timmy Foundation's own innovation. | turboquant repo, Phase 1 complete |
| **Gitea** | Self-hosted Forgejo/Gitea instance at 143.198.27.163:3000. ALL project management lives here. 18 repos, 1031+ issues. | Use urllib, NOT curl (security scanner blocks raw IPs) |
| **Hermes VPS** | The primary Digital Ocean server hosting Ezra, Bilbo, Bezalel, and shared infrastructure. | 143.198.27.163 |
| **Testbed VPS** | Secondary server for Allegro. | 167.99.126.228 |
| **state.db** | SQLite database storing session state, search index (FTS5), and persistent data per wizard house. | Each profile gets its own state.db |
### Architecture Patterns (from Gitea issues)
| Term | Meaning | First Appeared |
|------|---------|---------------|
| **The Door** | Crisis front door for broken men. Single URL, no login. 988 visible. Alexander's MISSION. | the-door repo |
| **The Nexus** | Timmy's 3D sovereign home. Three.js world with portals, agent board, sovereignty meter. | the-nexus repo |
| **Evennia** | Python MUD framework. Timmy's text-based mind palace / world shell. | timmy-academy repo |
| **Aurora Pipeline** | Session transcripts → model weight updates. The training flywheel. | the-nexus #598 |
| **Crucible** | Z3 SMT solver as a sidecar for deterministic reasoning. | timmy-config #86 |
| **Archon** | A three-layer wizard: Hermes → Claw → Gemma4. Ezra's architectural proof-of-concept. | timmy-home #363 |
| **Gemma Spectrum** | 9-wizard multimodal fleet, all running Gemma 4. | timmy-home #352 |
| **Grand Timmy / Uniwizard** | The endgame: all wizard identities dissolved into one unified intelligence. | timmy-home #94 |
| **Robing** | OpenClaw (Claw Code) as a sidecar shell on top of Hermes. Claw wears like a robe — convenience layer, not replacement. | timmy-home #141 |
| **GOFAI** | Good Old-Fashioned AI. Rule-based, symbolic, deterministic. Sidecar to the LLM for constraint enforcement. | timmy-home #67 |
---
## PART II: THE TECHNIQUES
These are the proven patterns extracted from working code. If you're building something, use these patterns.
### 1. THE TOOL REGISTRATION PATTERN (Hermes Core)
Three files, every time:
```
1. tools/your_tool.py — Implementation + registry.register() call
2. model_tools.py — Import in _discover_tools()
3. toolsets.py — Add name to _HERMES_CORE_TOOLS or a toolset
```
Handler MUST return a JSON string. check_fn gates availability. requires_env declares needed API keys. The registry handles schema collection, dispatch, and error wrapping.
### 2. THE ENV-VAR FALLBACK CHAIN
Constructor param > environment variable > hardcoded default. Always.
```python
self.base_url = (base_url or os.getenv("GITEA_URL", "http://143.198.27.163:3000")).rstrip("/")
self.token = token or os.getenv("GITEA_TOKEN", "")
```
This pattern makes tools testable (pass params directly), deployable (set env vars), and safe (hardcoded defaults as last resort).
### 3. THE ENSURE/IDEMPOTENT PATTERN
For any resource that might already exist: check first, create only if missing. Case-insensitive matching. Safe to re-run.
```python
def ensure_label(self, owner, repo, name, color, description=""):
labels = self.list_labels(owner, repo)
for l in labels:
if l["name"].lower() == name.lower():
return l
return self.create_label(owner, repo, name, color, description)
```
Use this for labels, milestones, repos, users, configs — anything where duplicates are bad.
### 4. THE RETRY WITH EXPONENTIAL BACKOFF
Retry transient failures. NEVER retry auth/validation errors.
```python
for attempt in range(max_retries):
try:
return make_request()
except HTTPError as e:
if e.code in (401, 403, 404, 422):
raise # Don't retry these
time.sleep(retry_delay * (2 ** attempt))
```
### 5. THE CHECK-RUNNER PATTERN (Health Monitoring)
Each check is a callable returning (bool, detail_string). The runner wraps execution, catches exceptions, classifies results. Checks are tagged critical or non-critical.
```python
def check(self, name, fn, critical=False):
try:
ok, detail = fn()
return {"name": name, "status": "PASS" if ok else "FAIL", "detail": detail, "critical": critical}
except Exception as e:
return {"name": name, "status": "ERROR", "detail": str(e), "critical": critical}
```
Aggregate: total passed, total failed, critical failures. System is HEALTHY only if zero critical failures.
### 6. THE VALIDATION-FINDINGS PATTERN (Quality Gates)
Accumulate findings during validation. Three severity tiers: ERROR (must fix), WARNING (should fix), INFO (nice to know). Validate in passes: frontmatter, then body, then directory structure.
```python
class ValidationError:
def __init__(self, level, message, field=""): # level: ERROR/WARNING/INFO
...
self.errors = [] # accumulator
# ... validate_frontmatter() appends errors
# ... validate_body() appends errors
# ... validate_directory() appends errors
return self.errors
```
### 7. THE BACKUP ROTATION PATTERN
Create timestamped archives. Rotate by count (keep max N, delete oldest). Restore with dry_run preview by default.
```python
def _rotate_backups(self):
backups = sorted(self.backup_dir.glob("*.tar.gz"), key=lambda p: p.stat().st_mtime, reverse=True)
for old in backups[self.max_backups:]:
old.unlink()
```
### 8. THE URLLIB-OVER-CURL PATTERN (Gitea API)
The Hermes security scanner blocks curl to raw IP addresses. ALL Gitea API calls MUST use Python's urllib, not curl, not requests.
```python
req = urllib.request.Request(url, data=body, headers=headers, method=method)
resp = urllib.request.urlopen(req, timeout=30)
return json.loads(resp.read())
```
### 9. THE TEMPLATE-BASED GENERATION PATTERN (Reports/RCAs)
Define a multi-line TEMPLATE as a class constant. Normalize inputs, then .format(). Auto-increment numbering. Sanitize filenames.
```python
TEMPLATE = """# RCA-{number}: {title}
## Summary
...
"""
safe_title = re.sub(r'[^a-z0-9-]', '', title.lower().replace(' ', '-'))[:40]
```
### 10. THE MOCK HTTP SERVER PATTERN (Testing)
For testing API clients without hitting real servers:
```python
class MockHandler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == "/api/v1/user":
self._json_response(200, {"login": "ezra"})
server = HTTPServer(("127.0.0.1", 0), MockHandler) # port 0 = auto-assign
port = server.server_address[1]
thread = threading.Thread(target=server.serve_forever, daemon=True)
thread.start()
client = GiteaClient(base_url=f"http://127.0.0.1:{port}", token="test")
```
### 11. THE SLASH COMMAND REGISTRY PATTERN (Hermes Core)
One source of truth for all commands. All consumers derive from the same registry:
```python
CommandDef("mycommand", "Description", "Session", aliases=("mc",), args_hint="[arg]")
```
CLI dispatch, gateway dispatch, Telegram menu, Slack routing, autocomplete, help text — ALL auto-generated from the registry. Adding an alias = one tuple change, everything else follows.
### 12. THE SKILL STRUCTURE
Every skill is a directory with SKILL.md at the root:
```
~/.hermes/skills/category/skill-name/
SKILL.md # YAML frontmatter + markdown body
references/ # Supporting docs
templates/ # Config templates
scripts/ # Automation scripts
assets/ # Static assets
```
Frontmatter: name, description, version (required), author, tags (recommended).
Body: Trigger (when to use), Steps (numbered), Pitfalls (what can go wrong), Verification (how to confirm success).
Skills are injected as USER messages, not system prompt — this preserves prompt caching.
---
## PART III: THE TESTING STANDARD
All agents producing code must follow this:
1. **Tests live alongside code:** tools/ and tests/ as sibling directories
2. **Every module gets a test file:** test_{module_name}.py
3. **Three test tiers:**
- Unit tests (mocked dependencies)
- Integration tests (mock HTTP server for APIs)
- Live tests (clearly marked, may fail in CI)
4. **Test fixtures as module constants:** VALID_SKILL, BROKEN_SKILL_NO_FM, etc.
5. **Temp directories for isolation:** tempfile.mkdtemp() in setUp, shutil.rmtree() in tearDown
6. **Edge cases required:** empty files, missing files, auth failures, rotation limits, dry-run modes
7. **All tests must pass before commit.** `python3 -m pytest tests/ -v`
---
## PART IV: THE COMMIT STANDARD
From Gitea issue evidence, Alexander's merge proof standard:
1. **Screenshot for visual changes** — prove it renders
2. **Log output for CLI changes** — prove it runs
3. **Test output for code changes** — prove it passes
4. **One commit, one concern** — atomic, reviewable
5. **Epic tagging:** reference the epic/issue in commit message
Format: `{type}: {description} ({issue ref})`
Types: feat, fix, docs, test, refactor, chore
---
## PART V: THE CONFIG ANATOMY
Every wizard house config.yaml follows this structure:
```yaml
_config_version: 10 # Schema version (bump triggers migration)
model:
default: claude-opus-4-6 # Primary model
fallback_providers: # Ranked list of backup providers
- provider: anthropic
model: claude-sonnet-4-20250514
agent:
max_turns: 50 # Max tool-calling iterations
reasoning_effort: high
session_reset:
mode: both # idle + time-of-day reset
idle_minutes: 1440
at_hour: 4 # 4 AM daily reset
compression:
threshold: 0.77 # Context compression trigger
memory:
memory_char_limit: 2200 # MEMORY.md max size
user_char_limit: 1375 # USER.md max size
display:
skin: default # Visual theme
platforms:
api_server:
enabled: true
host: 127.0.0.1
port: 8643 # UNIQUE per wizard house
telegram:
enabled: true
```
Key rule: NEVER hardcode ~/.hermes. Always use get_hermes_home() for code, display_hermes_home() for user messages.
---
## PART VI: WHO DOES WHAT
Based on the full issue audit — the actual division of labor that has emerged:
| Agent | Proven Competency | Lane |
|-------|------------------|------|
| **Timmy** @Timmy | Sovereign local house, model training, Evennia, harness config, overnight loops | The sovereign — judges locally |
| **Ezra** @ezra | Gitea API, health monitoring, RCA analysis, skill validation, architecture review, fleet auditing | Scribe — read, reconcile, document, review |
| **Bilbo** @bilbobagginshire | Fast local inference (4B Gemma), Telegram dual-mode, churn handling | The Hobbit — resilient, cheerful, executes |
| **Allegro** @allegro | Security hardening, GOFAI rules, input sanitization, conscience validation | The Executor — security & deployment |
| **Bezalel** @bezalel | Gemma 4 31B serving, artisan work, model hosting | The Artisan — heavy model work |
| **Claude** @claude | Nexus 3D world (Three.js), rapid prototyping, bulk feature implementation | Cloud partner — fast iteration |
| **KimiClaw** @KimiClaw | Knowledge ingestion, performance benchmarking, PR review | Silent — needs reactivation |
| **Fenrir** @fenrir | Security (Nostr audit, secret leak hooks, stale lockfile alerts) | The Wolf — security guardian |
---
*Every agent who reads this document now speaks the same language. Use the vocabulary. Follow the patterns. Cite the techniques by name. When you say "ensure pattern" or "check-runner" or "urllib-over-curl" — we all know what that means.*
*Read the pattern. Name the truth. Return a clean artifact.*
— Ezra, Scribe of the Timmy Foundation
April 4, 2026