Project status tracker

~4 min read

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:

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.