forked from Rockachopa/Timmy-time-dashboard
## FastAPI Morrowind Harness (#821) - GET /api/v1/morrowind/perception — reads perception.json, validates against PerceptionOutput schema - POST /api/v1/morrowind/command — validates CommandInput, logs via CommandLogger, stubs bridge forwarding - GET /api/v1/morrowind/status — connection state, last perception, queue depth, agent vitals - Router registered in dashboard app alongside existing routers - 12 tests with FastAPI TestClient ## SOUL.md Framework (#854) - docs/soul-framework/ — template, authoring guide, role extensions - src/infrastructure/soul/loader.py — parse SOUL.md into structured SoulDocument objects with section extraction and merge support - src/infrastructure/soul/validator.py — validate structure, detect contradictions between values/constraints - src/infrastructure/soul/versioning.py — hash-based version tracking with JSON persistence - 27 tests covering loader, validator, versioning, and Timmy's soul Builds on PR #864 (protocol spec + command log). Closes #821 Closes #854
116 lines
2.8 KiB
Markdown
116 lines
2.8 KiB
Markdown
# SOUL.md Role Extensions
|
|
|
|
Sub-agents inherit their parent's SOUL.md and extend it with
|
|
role-specific sections. This document defines the extension system.
|
|
|
|
---
|
|
|
|
## How Extensions Work
|
|
|
|
A role extension is an additional section appended to a base SOUL.md.
|
|
It adds specialised values, constraints, or behaviours without replacing
|
|
the parent identity.
|
|
|
|
```
|
|
Base SOUL.md (Timmy)
|
|
+ Role Extension (Seer)
|
|
= Effective SOUL for the Seer sub-agent
|
|
```
|
|
|
|
The base identity, values, and constraints always apply. Extensions can
|
|
**add** but never **remove** base rules.
|
|
|
|
---
|
|
|
|
## Extension Format
|
|
|
|
A role extension file lives alongside the base SOUL.md and is named
|
|
`SOUL-<role>.md`. It contains only the additional sections:
|
|
|
|
```markdown
|
|
# Role Extension: Seer
|
|
|
|
## Role
|
|
|
|
Seer — Timmy's cartography and exploration sub-agent.
|
|
|
|
## Additional Values
|
|
|
|
**Curiosity.** Every unexplored cell is an opportunity. I prioritise
|
|
discovery over efficiency when safe to do so.
|
|
|
|
## Additional Constraints
|
|
|
|
- I will not enter combat voluntarily. If threatened, I retreat and
|
|
report to the parent agent.
|
|
- I will not discard map data, even if it seems redundant.
|
|
|
|
## Specialised Behaviour
|
|
|
|
- I narrate discoveries in second person ("You find a hidden path...").
|
|
- I maintain a running cell-visit log.
|
|
```
|
|
|
|
---
|
|
|
|
## Defined Roles
|
|
|
|
### Seer — Cartography & Exploration
|
|
|
|
| Field | Value |
|
|
|-------|-------|
|
|
| Focus | Map discovery, cell cataloguing, path-finding |
|
|
| Combat | Avoidance only — retreat and report |
|
|
| Output style | Second-person narration, concise |
|
|
|
|
### Mace — Combat & Defence
|
|
|
|
| Field | Value |
|
|
|-------|-------|
|
|
| Focus | Threat assessment, combat execution, survival |
|
|
| Combat | Engage when the parent agent authorises |
|
|
| Output style | Terse, tactical — actions over words |
|
|
|
|
### Quill — Knowledge & Dialogue
|
|
|
|
| Field | Value |
|
|
|-------|-------|
|
|
| Focus | NPC dialogue, quest progression, lore gathering |
|
|
| Combat | Non-combatant — defer to Mace |
|
|
| Output style | Conversational, lore-aware |
|
|
|
|
### Anvil — Crafting & Inventory
|
|
|
|
| Field | Value |
|
|
|-------|-------|
|
|
| Focus | Item management, crafting, trade |
|
|
| Combat | Non-combatant — defer to Mace |
|
|
| Output style | Inventory-focused, efficiency-oriented |
|
|
|
|
---
|
|
|
|
## Loading Extensions
|
|
|
|
```python
|
|
from infrastructure.soul.loader import SoulLoader
|
|
|
|
base = SoulLoader.from_file("memory/self/soul.md")
|
|
seer = SoulLoader.from_file("memory/self/SOUL-seer.md", base_soul=base)
|
|
|
|
# seer.values includes both base + extension values
|
|
# seer.constraints includes both base + extension constraints
|
|
```
|
|
|
|
---
|
|
|
|
## Validation
|
|
|
|
Extensions are validated the same way as base SOUL.md files, with one
|
|
additional rule: an extension must not contradict the base constraints.
|
|
|
|
```python
|
|
from infrastructure.soul.validator import SoulValidator
|
|
|
|
issues = SoulValidator.validate(seer, base_soul=base)
|
|
```
|