# Session State Session state tracks position, decisions, and blockers across agent restarts. Unlike the Domain Layer (which tracks codebase state), session state tracks **execution state**. ## STATE.md Every active initiative maintains a STATE.md file tracking execution progress: ```yaml # STATE.md initiative: init-abc123 title: User Authentication # Current Position position: phase: 2 phase_name: "JWT Implementation" plan: 3 plan_name: "Refresh Token Rotation" task: "Implement token rotation endpoint" wave: 1 status: in_progress # Progress Tracking progress: phases_total: 4 phases_completed: 1 current_phase_tasks: 8 current_phase_completed: 5 bar: "████████░░░░░░░░ 50%" # Decisions Made decisions: - date: 2024-01-14 context: "Token storage strategy" decision: "httpOnly cookie, not localStorage" reason: "XSS protection, automatic inclusion in requests" - date: 2024-01-14 context: "JWT library" decision: "jose over jsonwebtoken" reason: "Better TypeScript support, Web Crypto API" - date: 2024-01-15 context: "Refresh token lifetime" decision: "7 days" reason: "Balance between security and UX" # Active Blockers blockers: - id: block-001 description: "Waiting for OAuth credentials from client" blocked_since: 2024-01-15 affects: ["Phase 3: OAuth Integration"] workaround: "Proceeding with email/password auth first" # Session History sessions: - id: session-001 started: 2024-01-14T09:00:00Z ended: 2024-01-14T17:00:00Z completed: ["Phase 1: Database Schema", "Phase 2 Tasks 1-3"] - id: session-002 started: 2024-01-15T09:00:00Z status: active working_on: "Phase 2, Task 4: Refresh token rotation" # Next Action next_action: | Continue implementing refresh token rotation endpoint. After completion, run verification for Phase 2. If Phase 2 passes, move to Phase 3 (blocked pending OAuth creds). # Context for Resume resume_context: files_modified_this_session: - src/api/auth/refresh.ts - src/middleware/auth.ts - db/migrations/002_refresh_tokens.sql key_implementations: - "Refresh tokens stored in SQLite with expiry" - "Rotation creates new token, invalidates old" - "Token family tracking for reuse detection" open_questions: [] ``` --- ## State Updates ### When to Update STATE.md | Event | Update | |-------|--------| | Task started | `position.task`, `position.status` | | Task completed | `progress.*`, `position` to next task | | Decision made | Add to `decisions` | | Blocker encountered | Add to `blockers` | | Blocker resolved | Remove from `blockers` | | Session start | Add to `sessions` | | Session end | Update session `ended`, `completed` | | Phase completed | `progress.phases_completed`, reset task counters | ### Atomic Updates ```typescript // Update position atomically await updateState({ position: { phase: 2, plan: 3, task: "Implement token rotation", wave: 1, status: "in_progress" } }); // Add decision await addDecision({ context: "Token storage", decision: "httpOnly cookie", reason: "XSS protection" }); // Record blocker await addBlocker({ description: "Waiting for OAuth creds", affects: ["Phase 3"] }); ``` --- ## Resume Protocol When resuming work: ### 1. Load STATE.md ``` Read STATE.md for initiative Extract: position, decisions, blockers, resume_context ``` ### 2. Load Relevant Context ``` If position.plan exists: Load {phase}-{plan}-PLAN.md Load prior SUMMARY.md files for this phase If position.task exists: Find task in current plan Resume from that task ``` ### 3. Verify State ``` Check files_modified_this_session still exist Check implementations match key_implementations If mismatch: flag for review before proceeding ``` ### 4. Continue Execution ``` Display: "Resuming from Phase {N}, Plan {M}, Task: {name}" Display: decisions made (for context) Display: active blockers (for awareness) Continue with task execution ``` --- ## Decision Tracking Decisions are first-class citizens, not comments. ### What to Track | Type | Example | Why Track | |------|---------|-----------| | Technology choice | "Using jose for JWT" | Prevents second-guessing | | Architecture decision | "Separate auth service" | Documents reasoning | | Trade-off resolution | "Speed over features" | Explains constraints | | User preference | "Dark mode default" | Preserves intent | | Constraint discovered | "API rate limited to 100/min" | Prevents repeated discovery | ### Decision Format ```yaml decisions: - date: 2024-01-15 context: "Where the decision was needed" decision: "What was decided" reason: "Why this choice" alternatives_considered: - "Alternative A: rejected because..." - "Alternative B: rejected because..." reversible: true|false ``` --- ## Blocker Management ### Blocker States ``` [new] ──identify──▶ [active] ──resolve──▶ [resolved] │ │ workaround ▼ [bypassed] ``` ### Blocker Format ```yaml blockers: - id: block-001 status: active description: "Need production API keys" identified_at: 2024-01-15T10:00:00Z affects: - "Phase 4: Production deployment" - "Phase 5: Monitoring setup" blocked_tasks: - task-xyz: "Configure production environment" workaround: null resolution: null - id: block-002 status: bypassed description: "Design mockups not ready" identified_at: 2024-01-14T09:00:00Z affects: ["UI implementation"] workaround: "Using placeholder styles, will refine later" workaround_tasks: - task-abc: "Apply final styles when mockups ready" ``` ### Blocker Impact on Execution 1. **Task Blocking:** Task marked `blocked` in tasks table 2. **Phase Blocking:** If all remaining tasks blocked, phase paused 3. **Initiative Blocking:** If all phases blocked, escalate to user --- ## Session History Track work sessions for debugging and handoffs: ```yaml sessions: - id: session-001 agent: worker-abc started: 2024-01-14T09:00:00Z ended: 2024-01-14T12:30:00Z context_usage: "45%" completed: - "Phase 1, Plan 1: Database setup" - "Phase 1, Plan 2: User model" notes: "Clean execution, no issues" - id: session-002 agent: worker-def started: 2024-01-14T13:00:00Z ended: 2024-01-14T17:00:00Z context_usage: "62%" completed: - "Phase 1, Plan 3: Auth endpoints" issues: - "Context exceeded 50%, quality may have degraded" - "Encountered blocker: missing env vars" handoff_reason: "Context limit reached" ``` --- ## Storage Options ### SQLite (Recommended for Codewalk) ```sql CREATE TABLE initiative_state ( initiative_id TEXT PRIMARY KEY REFERENCES initiatives(id), current_phase INTEGER, current_plan INTEGER, current_task TEXT, current_wave INTEGER, status TEXT, progress_json TEXT, updated_at INTEGER ); CREATE TABLE initiative_decisions ( id TEXT PRIMARY KEY, initiative_id TEXT REFERENCES initiatives(id), date INTEGER, context TEXT, decision TEXT, reason TEXT, alternatives_json TEXT, reversible BOOLEAN ); CREATE TABLE initiative_blockers ( id TEXT PRIMARY KEY, initiative_id TEXT REFERENCES initiatives(id), status TEXT CHECK (status IN ('active', 'bypassed', 'resolved')), description TEXT, identified_at INTEGER, affects_json TEXT, workaround TEXT, resolution TEXT, resolved_at INTEGER ); CREATE TABLE session_history ( id TEXT PRIMARY KEY, initiative_id TEXT REFERENCES initiatives(id), agent_id TEXT, started_at INTEGER, ended_at INTEGER, context_usage REAL, completed_json TEXT, issues_json TEXT, handoff_reason TEXT ); ``` ### File-Based (Alternative) ``` .planning/ ├── STATE.md # Current state ├── decisions/ │ └── 2024-01-15-jwt-library.md ├── blockers/ │ └── block-001-oauth-creds.md └── sessions/ ├── session-001.md └── session-002.md ``` --- ## Integration with Agents ### Worker - Reads STATE.md at start - Updates position on task transitions - Adds deviations to session notes - Updates progress counters ### Architect - Creates initial STATE.md when planning - Sets up phase/plan structure - Documents initial decisions ### Orchestrator - Monitors blocker status - Triggers resume when blockers resolve - Coordinates session handoffs ### Verifier - Reads decisions for verification context - Updates state with verification results - Flags issues for resolution --- ## Example: Resume After Crash ``` 1. Agent crashes mid-task 2. Supervisor detects stale assignment - Task assigned_at > 30min ago - No progress updates 3. Supervisor resets task - Status back to 'open' - Clear assigned_to 4. New agent picks up task - Reads STATE.md - Sees: "Last working on: Refresh token rotation" - Loads relevant PLAN.md - Resumes execution 5. STATE.md shows continuity sessions: - id: session-003 status: crashed notes: "Agent unresponsive, task reset" - id: session-004 status: active notes: "Resuming from session-003 crash" ```