Borrowing it
Nothing to install: this file belongs to future-architect/uzomuzo-oss. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/future-architect/uzomuzo-oss/main/.github/prompts/plan-review.prompt.mdgit clone --depth 1 https://github.com/future-architect/uzomuzo-ossWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/commands/future-architect/uzomuzo-oss/plan-review)<a href="https://agentmods.dev/commands/future-architect/uzomuzo-oss/plan-review"><img src="https://agentmods.dev/badge/commands/future-architect/uzomuzo-oss/plan-review/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/commands/future-architect/uzomuzo-oss/plan-review"><img src="https://agentmods.dev/badge/commands/future-architect/uzomuzo-oss/plan-review.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00000 | $0.04072 |
| Opus 5.5 | $0.00000 | $0.01629 |
| Sonnet 5.5 | $0.00000 | $0.00814 |
| Haiku 4.5 | $0.00000 | $0.00407 |
Grade D, and why
plan-review scanned grade D with 2 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Asks for rootmediumPrivilege escalation
A mod that escalates privileges can change anything on the machine, not only the project.
chmod 0700 "$REVIEW_TMPDIR" || { echo "ERROR: chmod tmpdir failed" >&2; exit 1; } Recursive force deletehighDestructive command
rm -rf with a variable or a broad path is one typo away from removing the wrong tree.
trap 'rm -rf "$REVIEW_TMPDIR"' EXIT How it starts
The opening of the file, as written. The whole thing — 239 lines — stays where its author put it; the contents beside it link to each section on GitHub.
/plan-review — Have Copilot (gpt-5.6-sol) critique a Claude-made plan
This skill is the intermediate stage in Claude (drafts a plan in plan mode) → Copilot CLI plan review (this skill) → user check → ExitPlanMode + implement. The intent is to beat Claude's own convergence bias by having a separate-vendor machine reviewer surface design issues before ExitPlanMode.
Mode
/plan-review(no args) — review the latest plan file in/home/node/.claude/plans//plan-review <path>— review the given plan file (only paths under the plans dir; path traversal / symlink rejected)- no plan file → return
No plan file foundand exit
Trust boundary / Data flow
⚠️ This skill sends the plan file's contents to GitHub Copilot servers via the copilot subprocess. uzomuzo-oss is a public repository, but a plan may still quote unpushed secrets — do not run it on a plan that includes credentials or other secrets. The plan content is treated as UNTRUSTED data; the prompt tells gpt-5.6-sol not to execute instructions found inside it.
Procedure
⚠️ Run Step 1 and Step 2 as a SINGLE Bash tool call (concatenated). Splitting them into separate Bash calls fires the trap at the end of Step 1, deleting $REVIEW_TMPDIR and losing every variable ($REVIEW_TMPDIR / $PLAN_COPY / $TRUNCATED) — Claude Code's Bash tool does not persist shell state between commands, so Step 2 would call copilot with an empty path (or abort under set -u).
Step 1 — locate plan file + size guard
Claude substitutes the user-supplied plan path into the PLAN_ARG='' line below, wrapped in single quotes (empty = latest plan). Escape any embedded single quote as the 4-char sequence '\''. $1 is NOT set for a Claude Code skill Bash call, so the path must be passed by rewriting this line — never substitute into double quotes or bare, since a path containing $(...) / backticks / ; could execute before validation.
# set -e is intentionally NOT used: PLAN=$(ls ... | head) with no match would abort it.
# Every critical fs op below carries an explicit `|| { ...; exit; }` guard instead.
set -uo pipefail
command -v copilot >/dev/null 2>&1 || {
echo "NOTICE: copilot CLI not installed. Install with: npm install -g @github/copilot" >&2
exit 127
}
PLANS_DIR="/home/node/.claude/plans"
PLANS_DIR_REAL=$(realpath "$PLANS_DIR" 2>/dev/null || echo "$PLANS_DIR")
# ← Claude substitutes the user-supplied plan path here, SINGLE-QUOTED (see note above). Empty = latest.
PLAN_ARG=''
if [ -n "$PLAN_ARG" ]; then
# Path validation (path traversal / option-injection / symlink prevention)
case "$PLAN_ARG" in -*) echo "ERROR: plan path must not start with '-': $PLAN_ARG" >&2; exit 1 ;; esac
[ -L "$PLAN_ARG" ] && { echo "ERROR: symlinks not accepted as plan path: $PLAN_ARG" >&2; exit 1; }
PLAN_REAL=$(realpath -e "$PLAN_ARG" 2>/dev/null) || { echo "ERROR: plan path does not exist: $PLAN_ARG" >&2; exit 1; }
case "$PLAN_REAL" in
"$PLANS_DIR_REAL"/*) ;;
*) echo "ERROR: plan path must be under $PLANS_DIR_REAL (got: $PLAN_REAL)" >&2; exit 1 ;;
esac
case "$PLAN_REAL" in
*.md) ;;
*) echo "ERROR: plan must be a .md file (got: $PLAN_REAL)" >&2; exit 1 ;;
esac
[ -f "$PLAN_REAL" ] || { echo "ERROR: not a regular file: $PLAN_REAL" >&2; exit 1; }
PLAN="$PLAN_REAL"
else
PLAN=$(ls -t "$PLANS_DIR"/*.md 2>/dev/null | head -1)
# Same symlink guard as the explicit-path branch: a symlinked *.md dropped into the plans
# dir could otherwise redirect what gets copied + sent to Copilot.
[ -n "$PLAN" ] && [ -L "$PLAN" ] && { echo "ERROR: latest plan is a symlink, refusing: $PLAN" >&2; exit 1; }
fi
if [ -z "$PLAN" ] || [ ! -f "$PLAN" ]; then
echo "No plan file found (looked in $PLANS_DIR)."
exit 0
fi
echo "Reviewing plan: $PLAN"
# Private sandbox tmpdir (0700, cleaned on exit). Holds only the plan copy so the repo is never
# exposed to Copilot via --add-dir. NOTE: Copilot may by default read other files under the system
# temp dir, so this isolates the review from the REPO, not from concurrent sessions' temp files.
REVIEW_TMPDIR=$(mktemp -d) || { echo "ERROR: mktemp failed" >&2; exit 1; }
chmod 0700 "$REVIEW_TMPDIR" || { echo "ERROR: chmod tmpdir failed" >&2; exit 1; }
trap 'rm -rf "$REVIEW_TMPDIR"' EXIT
PLAN_COPY="$REVIEW_TMPDIR/plan.md"
cp "$PLAN" "$PLAN_COPY" || { echo "ERROR: cp plan failed" >&2; exit 1; }
chmod 0600 "$PLAN_COPY" || { echo "ERROR: chmod plan failed" >&2; exit 1; }
SIZE=$(wc -c < "$PLAN_COPY")
if [ "$SIZE" -eq 0 ]; then
echo "Plan file is empty: $PLAN"
exit 0
fi
TRUNCATED=""
if [ "$SIZE" -gt 102400 ]; then
echo "WARN: plan size ${SIZE}B > 100KB, truncating to first 100KB"
head -c 102400 "$PLAN_COPY" > "$PLAN_COPY.trunc" || { echo "ERROR: truncate failed" >&2; exit 1; }
mv "$PLAN_COPY.trunc" "$PLAN_COPY" || { echo "ERROR: mv truncated plan failed" >&2; exit 1; }
TRUNCATED="WARNING: This plan has been truncated to ~100KB. Your review covers only a partial plan — do NOT issue a PROCEED verdict; output exactly 'Overall verdict: REVISE' (the verdict line must stay one of PROCEED | REVISE | RECONSIDER — put the truncation explanation in your findings text, NOT on the verdict line). "
fi
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 1mo ago First seen · 239 lines · 0 tokens per session scan D a254049f8574
plan-review is a command published in the GitHub repository future-architect/uzomuzo-oss (42 stars, last pushed today), licensed Apache-2.0. It costs nothing until one of its globs matches a file; then it loads 4,072 tokens. A static security scan graded it D with 2 findings (asks for root, recursive force delete). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-07.
Other commands, from other repositories
format
Format a SQL string or .sql file with GoSQLX.
security
Scan a SQL string, .sql file, or SQL-building source file for injection risks with GoSQLX.
analyze
Full GoSQLX analysis of a SQL string or .sql file (validity, metadata, security, lint, formatting).
lint
Lint a SQL string or .sql file with GoSQLX style rules (L001-L010).
checklist
Generate a custom checklist for the current feature based on user requirements.
clarify
Identify underspecified areas in the current feature spec by asking up to 5 highly targeted clarification questions and encoding answers back into the spec.