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.
Scanned 9/6/2026
Install to Claude Code
npx -y skills add conorbronsdon/agent-workspace --skill today --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Today?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/conorbronsdon-today)More formats (shields.io, HTML) on the badges page.
---
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
1. **Establish context.** Get today's date. Read `<state_dir>/heartbeat-log.md` to find the
last check-in date.
2. **Scan recent activity.** In a git repository, run:
```bash
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.
3. **Check state freshness.** Same thresholds as `start` step 4 (`staleness.*` from config).
4. **Surface deadlines.** Read `<task_file>` and scan for:
- Items with dates in the next 7 days
- Items marked urgent or time-sensitive
5. **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.**
6. **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.**
7. **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]
```
8. **Log the heartbeat.** Append to `<state_dir>/heartbeat-log.md`:
```markdown
## [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"]
```
9. **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.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!