review-proposal
Review Proposal
Read a proposal artifact READ-ONLY and emit a references-first review report into the proposal's own reviews/ folder. This skill reads the proposal, drafts the report end-to-end, and writes one review record per review run. By default it runs end-to-end without walking findings with the user one-at-a-time, but it honors an invocation that asks it to check in or walk the findings interactively; it does not commit.
The LIGHTWEIGHT framing matters: a proposal is an early sketch, not a downstream handoff document. The review checks for the things a proposal can plausibly miss at its stage — gaps, risks, ambiguities, and consistency with the thread's decision logs — and stops there. Do NOT treat a proposal review like a spec review; missing semantic-contract elements (intended outcome, scope/non-scope, acceptance guidance) are not findings against a proposal because a proposal does not promise to carry them. Those are findings a downstream spec review surfaces against the spec that comes after the proposal.
Inputs
This skill accepts ONE input: a proposal artifact path. A proposal lives inside its lineage folder under the thread root:
docs/threads/<thread>/proposals/NNN[-<desc>]/proposal.md
where NNN is a zero-padded 3-digit lineage sequence (001, 002, …) and -<desc> is an optional kebab slug used only to distinguish one lineage from another. The lineage folder (the full path) is the unit of reference — proposal.md is meaningless bare.
If the path is not supplied, ASK the user which proposal to review — do not pick by recency or by highest lineage number. If a thread holds multiple proposal lineages (proposals/001-api/, proposals/002-cli/) and the user's reference is vague ("the proposal", "the latest proposal", "the auth one"), ASK which lineage is intended. There is NO "most recent NNN" or "highest number" fallback. Silently picking would hide a real decision — which proposal lineage is meant — behind a sort order.
A proposal lives only inside a proposals/NNN[-<desc>]/ lineage folder. If the path passed is not a proposal.md under such a folder, refuse and ASK the user to confirm — a file elsewhere is either a misplaced draft (still in .wip/, not yet emitted) or not actually a proposal artifact.