---
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.
