Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add commands/assafkip/prd-os/issue-closeoutgit clone --depth 1 https://github.com/assafkip/prd-osWrote 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/assafkip/prd-os/issue-closeout)<a href="https://agentmods.dev/commands/assafkip/prd-os/issue-closeout"><img src="https://agentmods.dev/badge/commands/assafkip/prd-os/issue-closeout.svg" alt="Measured on agentmods" 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 | $0.00020 | $0.01076 |
| Opus 5 | $0.00010 | $0.00538 |
| Sonnet 5 | $0.00004 | $0.00215 |
| Haiku 4.5 | $0.00002 | $0.00108 |
Grade A, and why
issue-closeout scanned grade A with 0 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 4d 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.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 71 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Close the active DSSE issue. Execute in order:
-
Run
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/issue_runner.py" status. Confirmreceipts.verifiedandreceipts.reviewedare both set. If either is null, stop and tell the founder which step is missing. Do not relaunch/issue-reviewon your own initiative; that command has its own iteration cap. -
Pull the snapshotted scope and the pending findings:
ALLOWED=$(python3 "${CLAUDE_PLUGIN_ROOT}/scripts/issue_runner.py" allowed-files) ISSUE_ID=$(python3 "${CLAUDE_PLUGIN_ROOT}/scripts/issue_runner.py" status | python3 -c "import sys,json; print(json.load(sys.stdin).get('issue_id',''))") python3 "${CLAUDE_PLUGIN_ROOT}/scripts/issue_findings.py" list "$ISSUE_ID" --only-pendingThe list output is JSON: each finding has
id,source,severity,body,affected_path,out_of_scope. Show them to the founder one by one. Out-of-scope findings are already filtered from the gate but are still in the list for visibility. -
Triage each pending in-scope finding using these merge-blocker rules. The disposition is the verb. Use the writer; do NOT hand-edit the JSONL:
-
accepted -> correctness bug introduced by this issue's diff. Patch it now in
allowed_files. After the patch lands, mark accepted (theresolved_atstamp is the receipt that the patch happened):python3 "${CLAUDE_PLUGIN_ROOT}/scripts/issue_findings.py" set-disposition "$ISSUE_ID" <finding-id> acceptedIf the patch requires re-running checks, re-run
/issue-verify. Do NOT auto-relaunch/issue-review. The runner's review-rounds cap exists to break loops; you must respect it. The founder opts in if they want another adversarial pass. -
deferred -> valid finding but out of contract for this issue (architectural debt, unchanged-code patterns, follow-up work). Rationale REQUIRED. Optional
--followup-issue-idif a tracking issue exists:python3 "${CLAUDE_PLUGIN_ROOT}/scripts/issue_findings.py" set-disposition "$ISSUE_ID" <finding-id> deferred \ --rationale "tracked for follow-up: applies to all 09 agents, not just this slice" -
rejected -> Codex misread scope or hallucinated the issue. Rationale REQUIRED:
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/issue_findings.py" set-disposition "$ISSUE_ID" <finding-id> rejected \ --rationale "codex flagged a config value that is intentionally null; design doc says null disables the feature"
-
-
After every pending in-scope finding has a non-pending disposition (the runner's gate counts these), check the count:
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/issue_findings.py" count "$ISSUE_ID" --in-scope-pendingMust print
0. If non-zero, the gate will block close. Re-triage the remaining findings. -
Mark and close:
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/issue_runner.py" mark findings_triaged python3 "${CLAUDE_PLUGIN_ROOT}/scripts/issue_runner.py" closeclosere-runs the gate as a final check (receipts present + zero in-scope pending findings + no invalid dispositions), flipsstatus: closedin the spec, and clears the state file. Do not edit the spec or state file manually to bypass it. -
Produce a final report for the founder:
- Issue id + title
- Files changed (git diff summary against
origin/mainfor the issue branch or merge commit range) - Checks that passed (the
required_checkslist) - Review rounds used (from state's
review_rounds) - Triage summary: count of accepted / deferred / rejected, and how many of those were out-of-scope (informational only)
- Next suggested action (merge, open follow-up issue from any deferred finding's
followup_issue_id, next issue in queue)
If close exits non-zero, the runner names what is missing (receipt or pending finding id). Re-run status and issue_findings.py list --only-pending and report. Do not edit the spec or state file manually to bypass the gate.
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.
- 4d ago First seen · 71 lines · 20 tokens per session scan A 99a3993741d0
issue-closeout is a command published in the GitHub repository assafkip/prd-os (10 stars, last pushed 2mo ago), licensed MIT. It adds 20 tokens to every session and 1,076 once invoked, about $0.0001 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other commands, from other repositories
adopt
Adopts RENATA in an existing codebase — reverse-engineers the technical pattern, feature inventory, as-built specs and a retroactive PRD, confirming every item with you.
plan-phase
Wraps superpowers:writing-plans with RENATA guardrails to produce a method-compliant, ADR-respecting execution plan reviewed by the architect.
screens
Structures product UX screen design — inventory, flow, states, and reusable briefs for external design tools — without generating pixels or UI code.
adr
Formalizes an ADR from a technical decision using the Nygard format and syncs its enforcement block in rules.yaml.
assumption-test
Surfaces the riskiest business assumption behind the PRD and designs the cheapest test to falsify it before building.
bug-report
Converts a raw bug report from production into a structured, severity-classified item and routes it to the right next step.