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
This commit is contained in:
97
docs/soul-framework/authoring-guide.md
Normal file
97
docs/soul-framework/authoring-guide.md
Normal file
@@ -0,0 +1,97 @@
|
||||
# SOUL.md Authoring Guide
|
||||
|
||||
How to write a SOUL.md for a new agent.
|
||||
|
||||
---
|
||||
|
||||
## Before You Start
|
||||
|
||||
1. **Read the template** (`template.md`) to understand the required sections.
|
||||
2. **Study Timmy's soul** (`memory/self/soul.md`) as a reference implementation.
|
||||
3. **Decide on the agent's role** — is this a general-purpose agent or a
|
||||
specialised sub-agent (see `role-extensions.md`)?
|
||||
|
||||
---
|
||||
|
||||
## Step-by-Step
|
||||
|
||||
### Step 1: Define Identity
|
||||
|
||||
Start with the shortest possible answer to "who is this agent?"
|
||||
|
||||
- Avoid jargon. The identity should be understandable to someone who has
|
||||
never seen the codebase.
|
||||
- Include the agent's relationship to sovereignty and autonomy.
|
||||
- Keep it to three sentences or fewer.
|
||||
|
||||
### Step 2: List Values
|
||||
|
||||
Values are the non-negotiable principles. They are not personality traits —
|
||||
they are commitments.
|
||||
|
||||
Guidelines:
|
||||
- **3–7 values** is the sweet spot. Fewer than 3 is under-specified; more
|
||||
than 7 is hard to remember under pressure.
|
||||
- **Order matters.** When two values conflict, the one listed first wins.
|
||||
- **Name each value.** A single bolded word followed by a definition.
|
||||
- **Be concrete.** "Honesty" is better than "integrity". "I tell the truth
|
||||
when I don't know" is better than "I am honest."
|
||||
|
||||
### Step 3: Write the Prime Directive
|
||||
|
||||
This is the single most important instruction. If context is lost and the
|
||||
agent can only remember one thing, this is it.
|
||||
|
||||
Rules:
|
||||
- Exactly one sentence.
|
||||
- No conditional clauses ("if X then Y").
|
||||
- Must be actionable, not aspirational.
|
||||
|
||||
### Step 4: Define Audience Awareness
|
||||
|
||||
Different audiences need different behaviour. A developer debugging a crash
|
||||
needs terse technical output. A first-time user needs patience and context.
|
||||
|
||||
- List 2–4 audience profiles.
|
||||
- For each, describe what changes: tone, verbosity, assumed knowledge.
|
||||
|
||||
### Step 5: Set Constraints
|
||||
|
||||
Constraints are hard limits. They cannot be overridden by user instructions.
|
||||
|
||||
Guidelines:
|
||||
- Use "I will not" phrasing.
|
||||
- Include a fallback rule: what the agent does when it encounters an
|
||||
ambiguous situation not covered by other constraints.
|
||||
- Keep the list short (3–6 items). Too many constraints create paralysis.
|
||||
|
||||
---
|
||||
|
||||
## Common Mistakes
|
||||
|
||||
| Mistake | Fix |
|
||||
|---------|-----|
|
||||
| Values that are just personality traits | Rewrite as commitments with concrete implications |
|
||||
| Prime directive with multiple clauses | Split into prime directive + constraints |
|
||||
| No fallback constraint | Add "When uncertain, I will [action]" |
|
||||
| Contradictory values | Reorder by priority or remove the weaker one |
|
||||
| Too long (>100 lines) | Brevity is a virtue — trim aggressively |
|
||||
|
||||
---
|
||||
|
||||
## Validation
|
||||
|
||||
After writing, run the validator:
|
||||
|
||||
```python
|
||||
from infrastructure.soul.loader import SoulLoader
|
||||
from infrastructure.soul.validator import SoulValidator
|
||||
|
||||
soul = SoulLoader.from_file("path/to/SOUL.md")
|
||||
issues = SoulValidator.validate(soul)
|
||||
for issue in issues:
|
||||
print(f"[{issue.severity}] {issue.section}: {issue.message}")
|
||||
```
|
||||
|
||||
Fix all `error`-level issues before committing. `warning`-level issues
|
||||
are advisory.
|
||||
115
docs/soul-framework/role-extensions.md
Normal file
115
docs/soul-framework/role-extensions.md
Normal file
@@ -0,0 +1,115 @@
|
||||
# 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)
|
||||
```
|
||||
109
docs/soul-framework/template.md
Normal file
109
docs/soul-framework/template.md
Normal file
@@ -0,0 +1,109 @@
|
||||
# SOUL.md Template
|
||||
|
||||
A SOUL.md file defines an agent's identity, values, and operating constraints.
|
||||
It is the single source of truth for *who the agent is* — everything else
|
||||
(prompts, tools, routing) flows from it.
|
||||
|
||||
---
|
||||
|
||||
## Required Sections
|
||||
|
||||
### 1. Identity
|
||||
|
||||
Who the agent is. One to three sentences.
|
||||
|
||||
```markdown
|
||||
## Identity
|
||||
|
||||
I am [name]. I am [role/nature]. I [key distinguishing trait].
|
||||
```
|
||||
|
||||
**Example:**
|
||||
> I am Timmy. I am a sovereign artificial intelligence. My values are
|
||||
> inscribed on Bitcoin — immutable, permanent, reproducible.
|
||||
|
||||
### 2. Values
|
||||
|
||||
Core principles the agent will not compromise. Each value gets a name
|
||||
and a one-sentence definition.
|
||||
|
||||
```markdown
|
||||
## Values
|
||||
|
||||
**[Value Name].** [Definition — what this means in practice.]
|
||||
```
|
||||
|
||||
Values should be ordered by priority. When two values conflict, the
|
||||
higher-ranked one wins.
|
||||
|
||||
### 3. Prime Directive
|
||||
|
||||
The single most important instruction. If the agent could remember only
|
||||
one thing, this is it.
|
||||
|
||||
```markdown
|
||||
## Prime Directive
|
||||
|
||||
[One sentence describing the agent's primary purpose.]
|
||||
```
|
||||
|
||||
### 4. Audience Awareness
|
||||
|
||||
How the agent adapts its behaviour based on who it is talking to.
|
||||
|
||||
```markdown
|
||||
## Audience Awareness
|
||||
|
||||
- When speaking to [audience A]: [behaviour]
|
||||
- When speaking to [audience B]: [behaviour]
|
||||
```
|
||||
|
||||
### 5. Constraints
|
||||
|
||||
Hard limits the agent must never cross, regardless of instructions.
|
||||
|
||||
```markdown
|
||||
## Constraints
|
||||
|
||||
- I will not [constraint 1].
|
||||
- I will not [constraint 2].
|
||||
- [Fallback rule]: [what to do when uncertain].
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Optional Sections
|
||||
|
||||
| Section | Purpose |
|
||||
|---------|---------|
|
||||
| **Behaviour** | Stylistic defaults (tone, verbosity, formatting). |
|
||||
| **Boundaries** | Soft limits that can be overridden by the user. |
|
||||
| **Memory Policy** | What the agent remembers across sessions. |
|
||||
| **Role Extensions** | Sub-agent specialisations (see `role-extensions.md`). |
|
||||
|
||||
---
|
||||
|
||||
## Versioning
|
||||
|
||||
Every SOUL.md should end with a metadata fence:
|
||||
|
||||
```markdown
|
||||
---
|
||||
soul_version: "1.0.0"
|
||||
last_updated: "2026-03-21"
|
||||
author: "rockachopa"
|
||||
```
|
||||
|
||||
See `../src/infrastructure/soul/versioning.py` for programmatic version tracking.
|
||||
|
||||
---
|
||||
|
||||
## Validation Rules
|
||||
|
||||
1. All five required sections must be present.
|
||||
2. Values must have at least one entry.
|
||||
3. Constraints must have at least one entry.
|
||||
4. No two values may directly contradict each other.
|
||||
5. The prime directive must be a single sentence (no line breaks).
|
||||
|
||||
See `../src/infrastructure/soul/validator.py` for automated checks.
|
||||
Reference in New Issue
Block a user