# Mortdecai — Agent Context

> Single source of truth for AI agents working on this project.
> When docs disagree, trust this file > implementation > historical docs.

## Project Identity

Mortdecai is a fine-tuned Qwen3.5-9B (and upcoming 14B) language model for Minecraft server operations. It runs inside a Paper 1.21 server via a LangGraph-style gateway, responding to player prayers (god mode) and commands (sudo mode) using 24 tools. The model is trained via QLoRA on curated + Claude-distilled + RCON-validated data.

This is NOT a chatbot, NOT a general assistant. It is a domain-specific Minecraft operations agent.

## Current State (2026-03-22)

- **Current model:** mortdecai:0.5.0 (Qwen3.5-9B, QLoRA fine-tune)
- **Base model:** Qwen/Qwen3.5-9B (HuggingFace)
- **Known issue:** 30% empty god-mode responses (think-block token drain, no freeform text training)
- **Next version:** 0.6.0 (9B + 14B, training on rented H100)
- **Tool count:** 24 (all deployed and wired into gateway)

## Canonical Files (trust these)

| File | Domain | Trust |
|------|--------|-------|
| `agent/tools/tool_schemas.py` | Tool capability inventory | **Canonical** — 24 tools |
| `langgraph_gateway.py` (in Sethpc-Minecraft-PaperFork repo) | Runtime orchestrator | **Canonical** — production code |
| `mc_aigod_paper.py` (in Sethpc-Minecraft-PaperFork repo) | Server-side AI handler | **Canonical** |
| `training/scripts/validate_all_training.py` | Data quality validator | **Current** |
| `training/scripts/merge_datasets.py` | Training data merge | **Current** |
| `training/scripts/train_lora.py` | Training script | **Current** |

## Historical Files (useful but potentially stale)

| File | Note |
|------|------|
| `PLAN.md` | Reflects 0.4.0→0.5.0 era planning. Not current deployment truth. |
| `SESSION.md` | Historical session log. May reference old architecture. |
| `README.md` | Public-facing. Tool count may lag behind tool_schemas.py. |
| `MODEL_CARD.md` | Reflects 0.5.0 release. Update on each version bump. |
| `data/schema.json` | **LEGACY** — does not validate current data. Use validate_all_training.py instead. |
| `data/validate_dataset.py` | **LEGACY** — replaced by training/scripts/validate_all_training.py. |
| `agent/serve.py` | **Reference only** — not the production runtime. Production runs in PaperFork repo. |

## Runtime Architecture

```
Player chat → Paper server (mc_aigod_paper.py) → LangGraph Gateway (langgraph_gateway.py)
                                                      ↓
                                               Mortdecai model (Ollama)
                                                      ↓
                                               Tool loop (24 tools, max 50 steps)
                                                      ↓
                                               RCON execution → Minecraft server
```

- **Production entrypoint:** `mc_aigod_paper.py` watches server log, dispatches to gateway
- **Gateway:** `langgraph_gateway.py` on port 8091 (internal to CT 644)
- **Model inference:** Ollama on steel141 (3090 Ti F16 for dev, RTX 4000 Q4 for prod)
- **This repo contains:** tools, schemas, training data, training scripts, eval harness
- **The PaperFork repo contains:** runtime (gateway + server handler)

## 24 Tools (all deployed, all wired into gateway)

| Tool | Status | In Training Data |
|------|--------|-----------------|
| rcon.execute | Production | Yes (heavy) |
| minecraft.lookup | Production | Partial (was wiki_lookup) |
| plugin.docs_lookup | Production | Yes |
| world.player_info (+ inventory) | Production | Yes |
| world.server_state | Production | Yes |
| world.nearby_entities | Production | Yes |
| world.scan_area | Production | Needs 0.6.0 examples |
| world.redstone_trace | Production | Needs 0.6.0 examples |
| world.render | Production | Needs 0.6.0 examples |
| server.config | Production | Needs 0.6.0 examples |
| memory.read | Production | Yes |
| memory.write | Production | Yes |
| journal.read | Production | 120 multitool examples |
| journal.write | Production | 120 multitool examples |
| log.query | Production | Needs more examples |
| user.ask | Production | Needs more examples |
| script.write | Production | Yes |
| script.validate | Production | Yes |
| script.execute | Production | Yes |
| script.read | Production | Minimal |
| script.list | Production | Minimal |
| script.delete | Production | Minimal |
| script.schedule (tick/load/delay) | Production | Minimal |
| training.save | Dev only (config toggle) | Needs 0.6.0 examples |

## Data Map

**Raw data:** `data/raw/` — individual JSONL files from various sources
**Processed data:** `data/processed/` — merged, filtered, validated
**Quarantine:** `data/quarantine/` — failed validation, some salvageable
**External:** `data/external/` — IGLU Microsoft Research dataset (nested git repo)

**Known data issues (from validator run):**
- 2,891 commands use `@s` (should be player name)
- 2,633 commands use enchantment syntax Paper RCON rejects
- 24,476 examples in old dict format (need conversion to messages[] chat)
- 7,647 examples have outdated system prompts (missing new tools)

## Ignore List

- `__pycache__/` — committed by accident, not meaningful
- `USER_NOTES_IGNORE_ME/` — private notes, not project context
- `data/external/iglu-repo/` — external dataset, read-only
- `eval/results/` — historical eval outputs, may be stale
- `data/processed/pipeline_output.jsonl` — 7,032 examples with RCON connection failures marked as success. Do NOT trust.
- `data/raw/scraped_*.jsonl` — empty files
- `web/` — admin/community tools, not model-related

## Known Problems

1. **Secrets in tracked files** — RCON passwords, API keys hardcoded. Should be env vars.
2. **README/MODEL_CARD tool count lag** — says 17, reality is 24. Update on release.
3. **agent/serve.py misleads** — looks like main entrypoint but isn't. Real runtime is in PaperFork repo.
4. **data/schema.json is legacy** — doesn't validate current data. Replaced by validate_all_training.py.
5. **pipeline_output.jsonl is poisoned** — connection failures marked as success.

## Working Rules for AI Agents

1. `agent/tools/tool_schemas.py` is the tool inventory. Not README, not PLAN.md.
2. The production runtime is NOT in this repo. It's in `Sethpc-Minecraft-PaperFork/`.
3. Paper RCON cannot give enchanted items. Use plain give + effect combos.
4. `@s` does not work via RCON (no executor context). Training data uses `@p` as a pragmatic fix, but `@p` selects nearest player — not always the requester. Prefer explicit player names in new training data.
5. Dev world is named `devworld`, not `world`. WorldGuard needs `-w devworld`.
6. When in doubt about a command, RCON-validate it on dev (192.168.0.244:25578, pass REDACTED_RCON).
7. Keep seed_dataset dominant in training mix to prevent fill_build regression.
8. The model (0.5.0) cannot produce freeform text in sudo mode — it only outputs JSON. Training 0.6.0 fixes this.
9. `data/processed/pipeline_output.jsonl` is poisoned (7,032 examples with RCON connection failures marked success). Excluded from training.
