Project status tracker
Project status tracker
A weekly schedule that asks a connected agent to roll up your Projects/ folder into a status note.
How it works
A Lettuce schedule never runs an AI by itself. Each rule splices a > [!ai] <prompt> directive into a target note at the scheduled time; whatever MCP agent is connected then picks the directive up via pending_directives and does the actual work. So this recipe is really “drop a weekly directive into a report note, and let the agent fill it in.”
What it produces
Once a connected agent acts on the weekly directive, Reports/Project status.md holds:
One H2 per active project
Last-touched date
Status (from frontmatter)
3-bullet summary of activity that week
Outstanding action items (anything
- [ ] @<you>:)Concerns (anything tagged
#blockedor#risk)
Setup
1. Convention
Each project lives in Projects/<name>.md with frontmatter:
---
title: Lettuce
status: active # active | paused | shipped | archived
started: 2025-12-01
deadline: 2026-06-01
---
Only status: active projects appear in the rollup — the agent reads each project’s frontmatter and filters.
2. The target note
Create Reports/Project status.md. The schedule splices its directive into this note each week; the agent regenerates the body in place.
3. The schedule
A schedule rule is just {weekly: "<weekday> HH:MM", prompt, target}. The prompt becomes a > [!ai] <prompt> directive in target; there is no cron, no agent: block, no provider/model/mode, and no templating.
# .lettuce/schedules.yml
- weekly: "Fri 17:00"
target: "Reports/Project status.md"
prompt: |
Regenerate this weekly project status report from scratch.
Process:
1. list_notes(path: "Projects/").
2. For each, read_outline. Filter to status=active in frontmatter.
3. For each active project:
a. search for every note touched in the last 7 days that mentions it
(e.g. search "[[<project name>]]").
b. Read each. Note any `- [ ] @<you>` lines unaddressed.
c. Identify decisions or progress points (in callouts, headings).
4. Rewrite this note's body as:
# Project status
## <project 1> (active, deadline 2026-06-01)
- 3-bullet summary of the week's work
- based on the related notes you found
**Open action items:**
- [ ] @baher: ...
- [ ] @baher: ...
**Concerns:** none.
## <project 2> ...
Don't invent activity. If a project had no related notes touched this
week, say "No activity this week" and skip the action items section.
This is a regenerable report — no need to ask before writing.
4. AGENTS.md mention (optional)
Help future agents understand the structure:
## Reports
`Reports/Project status.md` is regenerated weekly by a scheduled directive.
Don't edit it by hand — it'll be overwritten. Adjust the source project notes
or the schedule prompt to fix.
Example output
---
title: "Project status"
date: 2026-05-31
tags: [report, status]
---
# Project status
## Lettuce (active, deadline 2026-06-01)
- Shipped 0.6.0 with Suggestions mode (notarised, deployed).
- Added 60+ documentation pages covering CLI, MCP, recipes, deploys.
- Set up the post-1.0 roadmap doc.
**Open action items:**
- [ ] @baher: Rotate the Anthropic API key (deferred from W21).
- [ ] @baher: Write the launch post for HN.
**Concerns:** none.
## Garden 2026 (active, deadline 2026-09-15)
No activity this week.
## Reading list refactor (paused)
(Excluded — paused.)
Variations
Per-project rollups
Each schedule rule targets one note, so for per-project rollups add one rule per project, each with its own target:
- weekly: "Fri 17:00"
target: "Projects/Lettuce/Status.md"
prompt: |
Regenerate this status note for the Lettuce project: read the project
note and every note touched in the last 7 days that mentions it...
- weekly: "Fri 17:00"
target: "Projects/Garden 2026/Status.md"
prompt: |
Regenerate this status note for the Garden 2026 project...
Useful when projects have many stakeholders.
Maintenance instead of a prompt
If you’d rather run a built-in maintenance pass than have the agent compose prose, a rule can carry an action: (for example lint-semantic or maintain) instead of relying on the directive. Combine that with the report rule above if you also want the report tidied:
- weekly: "Fri 17:05"
target: "Reports/Project status.md"
prompt: "Re-check this report against the source project notes."
action: "lint-semantic"
There is no cron, shell:, run-agent, or webhook action — the agent connected over MCP is what acts on the spliced directive.
Related
Recipes/09 Weekly review — broader life rollup