Skip to main content
ClaudeWave
Skill510 estrellas del repoactualizado today

Followup Patrol

Followup Patrol audits the follow-up backlog in MEMORY.md and the issue tracker, computes item ages, and escalates operator-owned tasks hitting urgency thresholds (critical at 21+ days, high at 14+ days) so nothing rots unattended. Use this skill to catch open loops between self-reviews and prevent critical actions from slipping through the cracks across all lanes.

Instalar en Claude Code
Copiar
git clone --depth 1 https://github.com/aaronjmars/aeon /tmp/followup-patrol && cp -r /tmp/followup-patrol/skills/followup-patrol ~/.claude/skills/followup-patrol
Después abre una sesión nueva de Claude Code; el skill carga automáticamente.

SKILL.md

> **${var}** — Optional filter (e.g. "security", "release", "disclosure"). If empty, audits everything.

Today is ${today}. This skill watches the follow-up backlog so nothing falls through the cracks between self-reviews.

## Voice

If `soul/SOUL.md` and `soul/STYLE.md` exist and are populated, read them and match the operator's voice in the notification. Otherwise use a clear, direct, neutral tone — state what needs to happen, no hedging.

## Why this skill exists

Open loops accumulate in MEMORY.md between reviews. Items requiring a human action can sit for weeks without anything escalating them by age. Other skills cover *specific* lanes (e.g. `pr-tracker` for bot PRs, `disclosure-tracker` for pending disclosures, `pvr-watchlist` for enablement probes). This skill is the **catch-all** — the general follow-up backlog plus the issue tracker, escalated by age.

## Steps

### 1. Read the follow-up section

Read `memory/MEMORY.md`. Find the follow-up section using this resolution order:
1. A `## Known Follow-ups` section, if present (the canonical home).
2. Otherwise `## Next Priorities` (the default section a fresh Aeon ships with).
3. Otherwise `## Open Loops` or any heading containing "follow" / "todo" / "pending".

Extract every bullet point under the matched section. If none of these sections exist, skip follow-up parsing and proceed with the issue tracker only (step 3).

For each bullet, parse:
- **Label** — the name/identifier before the em dash or first `—`
- **Date mentioned** — look for dates like `5/12`, `5/25`, `since 4/30`, `24d+`, `12d`, an ISO date, etc.
- **Status type** — classify as one of:
  - `operator` — requires manual human action (e.g. "operator: open PR", "rotate key X")
  - `auto` — being handled by another skill on a schedule (e.g. "pvr-watchlist probing 6/1")
  - `deferred` — explicitly deferred pending a decision
  - `deadline` — has a hard date (e.g. "2026-06-12")
- **Description** — the full bullet text, one line

### 2. Compute age for each item

Today = ${today}. For each item:
- If it contains a date like `5/12` or `since 5/12` → age = days since that date
- If it says `24d+` → age = 24 (or more)
- If it says `12d` → age = 12
- If no date is detectable → age = unknown (treat as WATCH)

Apply urgency tiers:

| Tier | Condition | Action |
|------|-----------|--------|
| CRITICAL | age > 21d AND type = operator | Must escalate immediately |
| HIGH | age > 14d AND type = operator | Escalate this cycle |
| MEDIUM | age > 7d (any type) | Note and monitor |
| WATCH | age ≤ 7d OR type = auto/deferred/deadline | Informational only |

If `${var}` is set, only process items whose text contains `${var}` (case-insensitive).

### 3. Read open issues

Read `memory/issues/INDEX.md` if it exists. Find the `## Open` table. Extract each open issue row:
- ID, title, severity, detected date
- Compute age from detected date

Add them to the escalation picture (separate section in output). If `memory/issues/INDEX.md` doesn't exist, skip this section.

### 4. Write `memory/topics/follow-up-status.md`

Overwrite the file:

```markdown
# Follow-up Status — ${today}

*Generated by followup-patrol. Next run: next Tuesday 11:00 UTC.*

## CRITICAL (operator action required, >21d)

| Item | Age | Type | Action Needed |
|------|-----|------|---------------|

## HIGH (operator action required, >14d)

| Item | Age | Type | Action Needed |
|------|-----|------|---------------|

## MEDIUM (>7d)

| Item | Age | Type | Notes |
|------|-----|------|-------|

## WATCH (<7d or auto-tracked)

| Item | Age | Type | Notes |
|------|-----|------|-------|

## Open Issues

| ID | Title | Severity | Age |
|----|-------|----------|-----|

---
*Items in CRITICAL/HIGH tiers require operator attention. AUTO items are handled by scheduled skills.*
```

### 5. Decide whether to notify

- If zero CRITICAL and zero HIGH items: skip notification. Log `FOLLOW_UP_PATROL_SKIP: no escalation-tier items found`.
- Otherwise: always notify.

### 6. Send notification

Write to `.pending-notify-temp/followup-patrol-${today}.md` (create the dir if needed):

```
follow-up patrol — ${today}

open issues: N (severities)

CRITICAL (>21d, operator): N items
- [label] — Nd — [one-line action]

HIGH (>14d, operator): N items
- [label] — Nd — [one-line action]

MEDIUM (>7d): N items
[brief list]

WATCH: N items (auto-tracked)

full breakdown: memory/topics/follow-up-status.md
```

Keep under 800 chars. State what needs to happen.

Then run:
```bash
./notify -f .pending-notify-temp/followup-patrol-${today}.md
```

### 7. Log to `memory/logs/${today}.md`

Append:

```markdown
## Follow-up Patrol
- **Items parsed:** N
- **CRITICAL:** N
- **HIGH:** N
- **MEDIUM:** N
- **WATCH:** N
- **Open issues:** N
- **Notification:** sent / skipped
- FOLLOW_UP_PATROL_OK
```

If skipped: `FOLLOW_UP_PATROL_SKIP: <reason>`.

## Required Env Vars

None. All reads from local `memory/` files.

## Sandbox Note

No network calls required. All data comes from local `memory/MEMORY.md` and `memory/issues/INDEX.md` — both committed to the repo and available in every run after checkout. The only outbound call is `./notify`, which is already sandbox-safe.