Install
openclaw skills install @iliaal/compound-eng-document-reviewStructural review of documents for gaps, clarity, completeness, and organization. Use when a brainstorm, plan, spec, ADR, or any doc needs polish before the next workflow step. For exploring new ideas from scratch, use brainstorming instead.
openclaw skills install @iliaal/compound-eng-document-reviewImprove brainstorm or plan documents through structured review.
If a document path is provided: Read it, then proceed to Step 2.
If no document is specified: Ask which document to review, or look for the most recent brainstorm/plan in docs/brainstorms/ or docs/plans/.
Read through the document and ask:
These questions surface issues. Note findings without fixing yet.
Based on the document's content, activate specialized review perspectives. Scan for signals and apply matching lenses:
| Lens | Signals | What it checks |
|---|---|---|
| Product | User-facing features, customer language, market claims, scope decisions | Problem framing, value proposition clarity, whether scope matches stated goals |
| Design | UI/UX references, user flows, wireframes, interaction descriptions | Flow completeness, interaction gaps, accessibility considerations |
| Security | Auth/authorization, API endpoints, PII, payments, tokens, encryption | Auth model gaps, data exposure risks, missing threat considerations |
| Scope guardian | Multiple priority tiers (P0/P1/P2), large requirement count (>8), stretch goals | Scope creep, premature abstractions, features disguised as requirements |
| Adversarial | >5 distinct requirements, explicit architectural decisions, high-stakes domains | Unstated assumptions, optimistic estimates, single points of failure, missing failure modes |
Activate a lens when ANY of its signals match. Most documents trigger 1-2 lenses; brainstorm notes may trigger none. When a lens is active, weave its checks into the assessment and evaluation steps rather than running it as a separate pass.
Score the document against these criteria:
| Criterion | What to Check |
|---|---|
| Clarity | Problem statement is clear, no vague language ("probably," "consider," "try to") |
| Completeness | Required sections present, constraints stated, open questions flagged |
| Specificity | Concrete enough for next step (brainstorm → can plan, plan → can implement) |
| YAGNI | No hypothetical features, simplest approach chosen |
If invoked within a workflow (after /ia-brainstorm or /ia-plan), also check:
Among everything found in Steps 2-4, does one issue stand out? If something would significantly improve the document's quality, this is the "must address" item. Highlight it prominently.
Present findings, then:
select:AskUserQuestion if not loaded) or request_user_input (Codex); fall back to numbered options in chat. Render the finding per the contract below in visible text in the same turn before the question fires -- on harnesses where the question opens a modal it covers the preceding text, so a question stem that carries no decision content strands the reader.The reader deciding on a finding does not have the document open and has not memorized its identifiers. This binds the approval track only (step 2 above) -- findings routed to auto-fix in step 1 skip it. Any finding presented for approval is rendered in this order:
Anything deeper (file tracing, multi-hop call paths, competing call sites) is not printed; offer it in one closing line. Budget: two inline code spans per sentence, no diff blocks, raw code blocks only for genuinely additive content of five lines or less.
Classify opaque anchors by what they do, not by vocabulary:
R6 (suppress peer panels on low-stakes calls), never a bare R6.A finding whose only route to a decision is "go read the section" has failed, however correct it is.
Simplification is purposeful removal of unnecessary complexity, not shortening for its own sake.
Simplify when:
Don't simplify:
For standalone documents that must be self-contained (onboarding guides, ADRs, external-facing docs), dispatch a zero-context sub-agent to simulate a first-time reader. The sub-agent has no conversation history — it sees only what a future reader would see.
How to run the test:
Interpret results:
Skip for context-dependent docs (brainstorm notes, plan files, internal working docs) where the reader will always have prior context. The sub-agent test only adds value when the real reader has no other channel.
After changes are complete, ask:
After 2 refinement passes, recommend completion--diminishing returns are likely. If the user wants to continue, allow up to 4 passes total. After 4, stop and report "review converged -- further changes require new direction." Do not continue past 4 even on user request without a fresh framing.
Withdraw what earlier answers already settled. On pass 2 and later, judge each remaining finding against the decisions already made this session before presenting it. If an earlier answer resolves or contradicts it, do not re-raise it: say in one line what the finding was and which answer retired it, then move on, and record it as withdrawn in the summary with the retiring decision named. The distinction that matters -- a withdrawal caused by a user decision (a skip, a defer, an asserted fact) is durable and suppresses the finding on every later pass; a withdrawal caused by a pending fix is provisional, because the fix can fail or land in the wrong place, so a finding that regenerates on the next pass must resurface rather than stay suppressed. Evaluate lazily, at the moment the finding would have been presented; do not rescan after every answer. (Code review carries the same rule -- see ia-code-review on reconciling prior discussions.)
Return control to the caller (workflow or user) after selection.