From last30days
Maintain a CSV ledger of every app idea the daily-brief pipeline has ever surfaced, along with its fate (triaged, feasibility-tested, validated, building, shipped, abandoned). Prevents the user re-litigating the same idea three weeks later when it surfaces again from a different seed. Use whenever the user says "log this idea", "have I seen this idea before", "what did we kill last month", "show the ledger", "/idea-ledger", or mentions tracking ideas across briefs. The ledger is the source of truth for "what's the status of idea X" — the GitHub PR history is too noisy. Research/data-only: do not synthesize new ideas or make build decisions from this skill.
How this skill is triggered — by the user, by Claude, or both
Slash command
/last30days:idea-ledger <subcommand> — one of `add <brief.md>`, `list [--status <s>]`, `status <id> <new-status>`, `dedup <title>`<subcommand> — one of `add <brief.md>`, `list [--status <s>]`, `status <id> <new-status>`, `dedup <title>`This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
A flat-file CSV ledger that lives alongside the daily briefs (default location: `ledger.csv` in the current working directory — typically the `App-Ideas` private repo). Append-mostly: rows are added when ideas first surface, and a small set of fields update over time as ideas move through the funnel.
A flat-file CSV ledger that lives alongside the daily briefs (default location: ledger.csv in the current working directory — typically the App-Ideas private repo). Append-mostly: rows are added when ideas first surface, and a small set of fields update over time as ideas move through the funnel.
| Column | Type | Notes |
|---|---|---|
id | string | YYYYMMDD-<slug-of-title> — stable, unique, sortable |
date_surfaced | YYYY-MM-DD | First daily-brief the idea appeared in |
title | string | The "## N. " line from ideas.md, stripped of numbering |
platform | enum | Android / iOS / Both / Unknown |
source_brief | path | Relative path to the brief that first surfaced it |
status | enum | See state machine below |
score | int | 1–10 if feasibility-tested, else blank |
confidence | enum | HIGH / MEDIUM / LOW if feasibility-tested |
killer_assumption | string | Filled when status moves to *_fail or abandoned |
last_updated | YYYY-MM-DD | Auto-updated on status change |
notes | string | Free-text, semicolon-separated |
surfaced
├── triaged_no (brief-triage: OBVIOUS NO)
├── triaged_keep (brief-triage: WORTH FEASIBILITY)
│ ├── feasibility_pass (app-idea-feasibility: score ≥ 7 + PASS)
│ │ ├── validation_pass (real-world test passed)
│ │ │ ├── building
│ │ │ │ └── shipped
│ │ │ └── abandoned
│ │ └── validation_fail
│ └── feasibility_fail
└── needs_info (brief-triage: NEEDS INFO — re-check later)
Status only ever moves forward, never backward. If you reconsider, append a new row with a fresh id and link the prior row in notes.
The skill is invoked with a subcommand. The Python helper does the file I/O; the skill markdown is the contract that tells you which subcommand to call when.
add <brief.md> — ingest a new briefFor each ## N. <Title> heading in the brief, append a row with status=surfaced and pull platform from the brief's **Platform:** line. Before appending, run a dedup check against existing rows: if a near-duplicate title exists (substring match either direction, or ≥80% character overlap on lowercase titles), flag it and prompt the user to confirm or merge.
uv run --frozen python3 skills/idea-ledger/scripts/ledger.py add \
--brief path/to/ideas/2026-05-20/ideas.md \
--ledger ledger.csv
The script prints any flagged dedup candidates and exits non-zero unless the user passes --force (each dedup match must be reviewed manually).
list [--status <s>] — show ledger stateuv run --frozen python3 skills/idea-ledger/scripts/ledger.py list \
--ledger ledger.csv \
--status feasibility_pass
Default (no --status): show all rows, sorted by last_updated desc, formatted as a markdown table.
status <id> <new-status> — move an idea forwarduv run --frozen python3 skills/idea-ledger/scripts/ledger.py status \
--ledger ledger.csv \
--id 20260520-async-meeting-prep \
--new-status feasibility_fail \
--killer-assumption "WTP quote was a hedge, not a commitment" \
--score 4 \
--confidence MEDIUM
Validates the transition against the state machine. Rejects backward moves.
dedup <title> — pre-check before ingesting a new ideauv run --frozen python3 skills/idea-ledger/scripts/ledger.py dedup \
--ledger ledger.csv \
--title "Pre-session prep doc for solo therapists"
Outputs the top 3 candidate matches with their ids and statuses. The user reads this before writing a feasibility verdict to avoid wasting a research pass on an already-killed idea.
title, id, date_surfaced, or source_brief after creation.triaged_no, feasibility_fail, validation_fail, or abandoned MUST set killer_assumption. The whole point of the ledger is to remember why — without it the ledger is just a list./seed-audit).ledger.csv doesn't exist, ask the user to confirm the path before initializing it. Accidentally creating a ledger in the wrong dir produces orphan data.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub abhishekdubey331/app-ideas-30-days-extension --plugin last30days