| name | today |
| description | Morning heartbeat — staleness checks, deadline surfacing, and memory curation for your workspace state. Run at the start of each day or after a 12+ hour gap. |
| disable-model-invocation | true |
/today — Morning Heartbeat
A daily check-in that catches staleness, surfaces deadlines, and proposes updates —
including gaps left by sessions that closed without /end. Designed to run in under 60
seconds.
Invocation: user-only (disable-model-invocation: true) — the heartbeat is timed by
you (mornings, or after a gap), and the flag keeps this skill out of ambient context.
Configuration
Read the optional workspace.yaml at the project root. Below, <state_dir>,
<sessions_dir>, and <task_file> are its resolved values; defaults are state/,
sessions/, and TODO.md. Staleness thresholds come from staleness.current_days (3),
weekly_days (5), blockers_days (7). Full reference: docs/state-model.md.
Instructions
-
Establish context. Get today's date. Read <state_dir>/heartbeat-log.md to find the
last check-in date.
-
Scan recent activity. In a git repository, run:
git log --oneline --since="3 days ago"
Then check <sessions_dir> for recent logs. This captures work even from sessions that
closed without /end. Outside a git repository, rely on the session logs alone.
-
Check state freshness. Same thresholds as start step 4 (staleness.* from config).
-
Surface deadlines. Read <task_file> and scan for:
- Items with dates in the next 7 days
- Items marked urgent or time-sensitive
-
Age-check open items. Read <state_dir>/current.md and check the *(created M/D)*
dates on open threads:
- Items >7 days old: flag as "stale — still relevant?"
- Items >14 days old: escalate as "likely stale — remove or convert to task?"
Present proposals. Do not auto-update.
-
Identify memory gaps. Compare git-log activity against state files:
- Decisions committed but not in
<state_dir>/decisions.md?
- Completed work not reflected in
<state_dir>/current.md?
List proposed updates. Do not auto-update. Wait for approval.
-
Output format:
MORNING CHECK-IN — [DATE] ([day of week])
Last heartbeat: [date] ([N] days ago)
SINCE LAST CHECK-IN:
- [N] commits: [brief themes]
- Session logs: [found/none]
STATE:
- current.md — [fresh/N days stale]
- weekly-priorities.md — [fresh/N days stale]
- blockers.md — [fresh/N days stale]
DEADLINES (next 7 days):
- [items, most urgent first]
[If stale items found:]
STALE ITEMS:
- [item] — [N] days old. [Propose: remove / convert to task]
[If memory gaps found:]
MEMORY GAPS:
- [proposed update]
-
Log the heartbeat. Append to <state_dir>/heartbeat-log.md:
## [DATE]
- Commits since last: [N]
- State staleness: [summary]
- Deadlines flagged: [count]
- Stale items flagged: [count]
- Memory gaps found: [count]
- Updates applied: [list or "none — awaiting response"]
-
Transition. Ask: "What's the focus today?"
Design principles
- Fast. Under 60 seconds. If it's slow, it won't get used.
- Propose, don't act. Never silently edit state or write memory during the heartbeat.
- Skip what's clean. All fresh and no near deadlines → say so in one line.
- Graceful degradation. A session that closed without
/end is caught here; missing
files are noted, not fatal.