follow-up-patrol
follow-up-patrol audits the follow-up and open-loop sections of MEMORY.md and cross-references the issue tracker, calculating item ages and surfacing those exceeding urgency thresholds. Use this skill during regular self-reviews to prevent backlog rot, especially for operator-required tasks that have stalled beyond seven days.
git clone --depth 1 https://github.com/aaronjmars/aeon /tmp/follow-up-patrol && cp -r /tmp/follow-up-patrol/skills/follow-up-patrol ~/.claude/skills/follow-up-patrolSKILL.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 follow-up-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/follow-up-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/follow-up-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.Mention/keyword sweep on social platforms for [REPLACE: KEYWORDS] — trends, sentiment, top posts
5 concrete real-life actions, leverage-scored against open loops with specificity and anti-fluff gates
Curated AI-agent tweets, clustered into narratives with insight summaries
Tracker of AI agent substitution signals — which roles, companies, and industries show real headcount displacement. Named roles + real deployments only.
Competitive-intelligence digest on the AI agent framework space — momentum, releases, breaking changes across a curated watchlist
Cross-domain market pulse from AIXBT's free grounding endpoint — crypto, macro, tradfi, geopolitics. Refreshes taxonomy references (clusters, chains) as a bonus.
Pre-batch API provider health check — detects credit exhaustion or auth failure for every configured provider key before the scheduled batch runs, giving the operator a window to act before skills degrade
List a wallet's live ERC-20 token approvals on Base and flag unlimited / risky spender grants. Keyless via Base RPC (eth_getLogs + eth_call) — no explorer key needed.