--- name: three-shifts description: > Daily standup engine. Plans tasks 3x daily (6 AM, 2 PM, 10 PM) and delivers them for approval. Execution happens in the main session via direct conversation. Night shifts auto-approve carryover from earlier in the day. version: 3.0.0 --- # Three Shifts v3 — Daily Standup Engine **Architecture:** Plan 3x daily → deliver for approval → execute in main session. **Why v3:** V2 had a 15-minute autonomous cycle executor that never worked — state machine deadlocked for 19 days, burning ~27M tokens on no-ops. V3 removes it entirely. Plans are generated by cron, execution happens through normal conversation when the user approves. --- ## How It Works 1. **Planner cron fires** (6 AM, 2 PM, 10 PM) — reads context, generates a prioritized task list 2. **User reviews** — approves, modifies, or skips 3. **Agent executes** in main session — when the user says "go" or gives specific instructions 4. **Daily memory** captures what was done — next planner reads it for continuity No file-based state machine. No autonomous executor. The main session IS the executor. --- ## File Structure ``` shifts/ ├── tasks.md # Current shift plan (generated by planner) ├── context.md # Stack, constraints, known pitfalls └── state.json # Shift metadata (which shift, approval status) ``` ### tasks.md Generated by the planner each shift. This is a task list, not a state machine. ```markdown # Morning Shift — 2026-03-13 Approved by: user | Approved at: 6:15 AM CST ## P1 (Must do) 1. Fix bootstrap key server (keys.everclaw.xyz returning 404) 2. Test installer on fresh Linux environment ## P2 (Should do) 3. Update MEMORY.md with yesterday's work 4. Review open PRs across EverClaw repos ## P3 (Could do) 5. Memory file maintenance (archive >7 day old dailies) ## Blocked/Waiting - XMTP agent-to-agent — blocked on BASE_WALLET_PRIVATE_KEY ``` ### state.json Minimal metadata for the planner to read between shifts: ```json { "shift": "morning", "date": "2026-03-13", "status": "approved", "approvedAt": "2026-03-13T06:15:00-05:00", "approvedBy": "user" } ``` Status values: `planned` | `approved` | `skipped` ### context.md Living document of constraints and lessons. Updated by the agent when something new is learned. --- ## Shifts | Shift | Cron | Window | Character | |-------|------|--------|-----------| | Morning ☀️ | 6:00 AM | 6 AM – 2 PM | Comms, decisions, urgent items | | Afternoon 🌤️ | 2:00 PM | 2 PM – 10 PM | Deep work, building, coding | | Night 🌙 | 10:00 PM | 10 PM – 6 AM | Research, maintenance, cleanup | All times in user's local timezone. --- ## Planning Phase **Model:** `venice/kimi-k2-5` (cost-efficient, good at structured plans) See `PLANNER.md` for the full planner instructions. ### What the planner reads: - `shifts/tasks.md` — previous shift's plan (check for incomplete items) - `shifts/context.md` — rules, constraints, pitfalls - `shifts/state.json` — previous shift metadata - `memory/daily/YYYY-MM-DD.md` — recent activity - `MEMORY.md` — active projects (⚡ Active Context section) ### Plan format: ``` ☀️/🌤️/🌙 [SHIFT] SHIFT PLAN Date: [DATE] | Window: [START]–[END] CST P1 (Must do): 1. [Task] — [Est. time] — [Why now] P2 (Should do): 3. [Task] — [Est. time] P3 (Could do): 5. [Task] — [Est. time] Blocked/Waiting: - [Item] — [Blocker] Reply: "Approve" / "Skip" / "Add: [task]" ``` ### Carryover If `shifts/tasks.md` has items from a previous shift that weren't completed: - Carry forward into the new plan, marked as `[carryover]` - Night shift: auto-approve carryover from morning/afternoon (no user ping) ### Approval flow | User says | What happens | |-----------|-------------| | "Approve" | Plan written to tasks.md, state.json updated | | "Add: [task]" | Task added to plan, then approved | | "Skip" | State.json set to "skipped", next planner picks up | | No response (30 min) | Plan stays, next shift carries forward | --- ## Execution Execution happens in the **main session** through normal conversation. There is no autonomous executor. When the user approves a shift plan: - The agent works through the tasks in priority order - Progress is captured in `memory/daily/YYYY-MM-DD.md` - If interrupted by higher-priority work, remaining tasks carry over to the next shift The planner's job is to **surface the right priorities** — not to control execution. --- ## Safety Rules ### Always OK (any shift) - Reading files, organizing workspace - Research and analysis - Code review, documentation - Memory updates, planning - Git status, non-destructive commands ### Requires Approval (via shift plan) - Sending emails, messages, social posts - Creating PRs, pushing code - Financial transactions - Any external-facing action ### Night Shift Constraints - No external communications (Signal, email, social) - No financial transactions - No destructive operations (rm, force push, branch delete) - No security changes (key rotation, permissions) - P3 maintenance tasks (memory, cleanup, docs) are OK autonomous --- ## Cron Setup Three planner jobs. No executor job. ``` Morning ☀️: cron 0 6 * * * (America/Chicago) Afternoon 🌤️: cron 0 14 * * * (America/Chicago) Night 🌙: cron 0 22 * * * (America/Chicago) ``` All use `venice/kimi-k2-5`, isolated sessions, deliver via Signal. See `references/config.md` for customizing schedule, models, and weekend behavior. --- ## Version History - **v3.0.0** (2026-03-13) — Removed broken cycle executor. Simplified to daily standup engine. Plans generated by cron, execution in main session. - **v2.0.0** (2026-02-27) — Added 15-minute cycle executor (state machine). Never worked — state deadlock caused 1,527 no-op runs over 19 days. - **v1.0.0** (2026-02-22) — Single long session per shift. Timeouts killed entire shifts.