# CharacterGarden – AI-Oriented Design Spec (Copilot-Ready) ## 0. Purpose This document defines **hard contracts and system boundaries** for CharacterGarden. Goal: enable an AI coding assistant (e.g. Copilot) to implement the system step-by-step without ambiguity. Core principle: > The application owns truth. The LLM only translates and narrates. --- ## 1. System Overview ### Pipeline ``` Prose Input → Intent Extraction → Canonical Actions → Truth Engine Validation → State Changes + Events → Memory Storage → Narration Output ``` --- ## 2. Core Contracts (STRICT) ### 2.1 Entity ``` Entity { id: string type: string name: string attributes: object } ``` ### 2.2 Action (Canonical) ``` Action { actor: string (entity id) verb: string (enum) target?: string (entity id) params?: object } ``` Allowed verbs (MVP): ``` move, open, close, take, drop, use, inspect, speak ``` ### 2.3 Validation Result ``` ValidationResult { accepted: Action[] rejected: { action: Action, reason: string }[] state_changes: StateChange[] } ``` ### 2.4 State Change ``` StateChange { entity_id: string field: string old_value: any new_value: any } ``` ### 2.5 Event ``` Event { id: string turn: number action: Action result: "success" | "fail" timestamp: number } ``` --- ## 3. Truth Rules 1. Only the **Truth Engine** can modify world state 2. LLM output is NEVER directly trusted 3. Every state change must be traceable to an Event 4. Invalid actions must return explicit failure reasons --- ## 4. Memory Model Memory is NOT a single blob. ### Types #### 4.1 Turn Raw input/output #### 4.2 Event Accepted or rejected actions #### 4.3 Fact Current world state (derived, not duplicated) #### 4.4 Belief ``` Belief { entity_id: string claim: string confidence: number } ``` #### 4.5 Summary Compressed narrative context --- ## 5. Services ### 5.1 App (Core Service) Responsibilities: * orchestrate turns * call LLM (optional) * run truth engine * manage memory Tech: Node.js (Express or Fastify) --- ### 5.2 Truth Engine (Module inside App) Responsibilities: * validate actions * enforce rules * apply state changes * emit events NO LLM USAGE --- ### 5.3 LLM Adapter (Optional) Responsibilities: * extract actions from prose * resolve references * generate narration * summarize memory Backend: Ollama --- ### 5.4 Frontend Responsibilities: * send input * display output * optionally inspect state/events Minimal React or Vue app --- ## 6. Turn Flow (IMPLEMENT EXACTLY) ``` 1. Receive user input (string) 2. Store raw turn 3. Extract actions (LLM or fallback parser) 4. Validate actions (truth engine) 5. Apply accepted changes 6. Store events 7. Generate narration 8. Return response ``` --- ## 7. Storage ### SQLite (MVP) Tables: * entities * events * turns * beliefs * summaries File location: ``` /data/sqlite/app.db ``` --- ## 8. Docker Design ### Services ``` services: app frontend ollama (optional) ``` ### Principles * No host dependencies beyond Docker * Persist only `/data` * Use `.env` for config * No hidden setup scripts --- ## 9. Folder Structure ``` charactergarden/ docker-compose.yml .env app/ frontend/ data/ sqlite/ ``` --- ## 10. MVP Scope STRICT LIMITS: * 1–2 rooms * ≤3 characters * ≤10 actions * no complex AI autonomy * no multi-agent loops yet --- ## 11. Non-Goals (DO NOT BUILD YET) * microservices * distributed systems * plugin frameworks * advanced agent loops * cloud dependencies --- ## 12. Development Workflow Rule A root-level file named `thoughts.md` must exist and be maintained throughout development. Purpose of `thoughts.md`: * record current implementation status * record the next planned steps * record blockers, assumptions, and unresolved questions * summarize architectural decisions already made * preserve continuity across editor sessions or context loss Rules for `thoughts.md`: * update it after each meaningful implementation step * keep entries concise and factual * do not use it for chain-of-thought dumping or vague brainstorming * use it as a project progress log and working memory * when resuming work, review `thoughts.md` first before making changes * when changing architecture, record what changed and why * when a task is incomplete, note exactly what remains Recommended structure: ```md # thoughts.md ## Current Status - what is implemented - what is partially implemented - what is broken or unverified ## Current Architecture Decisions - key decisions and constraints ## Next Steps - ordered checklist of immediate tasks ## Open Questions - unresolved design or implementation questions ## Session Notes - short dated notes describing recent progress ``` Copilot instruction: > Before starting work, read `thoughts.md`. After completing any meaningful change, update `thoughts.md` to reflect current status, next steps, and any unresolved issues. ## 13. Development Order 1. Define entities + actions 2. Implement truth engine 3. Add SQLite persistence 4. Build API endpoints 5. Add minimal UI 6. Add LLM integration --- ## 14. Key Rule > If the system works without an LLM, the architecture is correct. --- ## 15. Expected Behavior * deterministic state * explainable failures * replayable sessions * inspectable memory --- ## 16. Future Extensions (NOT NOW) * branching timelines * advanced belief systems * multi-agent arbitration * long-term memory compression --- ## END SPEC