Best for
- Use when a diff needs four parallel perspective reviewers (Security, Performance, Quality, Accessibility).
Jamie-BitFlight/claude_skills/plugins/development-harness/skills/multi-perspective-review/SKILL.md
Use when a diff needs four parallel perspective reviewers (Security, Performance, Quality, Accessibility). Creates an ephemeral SAM plan, collects structured verdicts, synthesizes them into one deduplicated cross-referenced punch list, prints one summary line per perspective, and exits non-zero if any perspective returns REJECT. SKIP is a passing outcome.
Decision brief
Creates an ephemeral SAM plan, collects structured verdicts, synthesizes them into one deduplicated cross-referenced punch list, prints one summary line per perspective, and exits non-zero if any perspective returns REJECT. SKIP is a passing outcome.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/Jamie-BitFlight/claude_skills --skill "plugins/development-harness/skills/multi-perspective-review"Inspect the Agent Skill "multi-perspective-review" from https://github.com/Jamie-BitFlight/claude_skills/blob/a00194f25fec502d3d659b7d610369614967251e/plugins/development-harness/skills/multi-perspective-review/SKILL.md at commit a00194f25fec502d3d659b7d610369614967251e. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Split stdout by newline. Trim empty lines. This is the changedfiles list.
Derive reviewbase exactly once using this flowchart:
Create a new plan on every run. Never search for and reuse an existing plan.
Dispatch all four workers simultaneously. Do NOT wait between spawns — all four are independent and must run in parallel. Each worker receives a minimal prompt that tells it to run the dh:start-task skill (name it in prose — a harness-specific invocation form reaches only the ha…
Wait until T1..T4 have all reached a terminal status. Poll:
Permission review
The documentation asks the agent to run terminal commands or scripts.
git diff --name-only <git-range>The documentation asks the agent to run terminal commands or scripts.
Run this command and capture its stdout as `run_stamp`:Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 91/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 64 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Orchestrates four independent perspective reviewers in parallel against a diff. Each reviewer
specialises in a single dimension: Security, Performance, Quality, or Accessibility. The skill
creates an ephemeral SAM plan, dispatches four dh:task-worker teammates via TeamCreate,
dispatches a fifth worker that reads the four verdict blocks back and synthesizes them into one
deduplicated punch list, applies the gate logic to that punch list, and prints one canonical
summary line per perspective.
Activate dh:review-verdict-contract before the first verdict-schema operation.
| Argument | Type | Description |
|---|---|---|
--diff <git-range> | required | Git range passed to git diff --name-only. Examples: HEAD~1..HEAD, main..feature-branch, abc123..def456. |
--issue <N> | optional | GitHub issue number used for ephemeral plan linkage and slug derivation. |
--slug <str> | optional | Explicit slug override. When omitted, derived from --issue or current git branch. |
Parse arguments from the invocation arguments string. Abort with usage message if --diff is
absent.
Run:
git diff --name-only <git-range>
Split stdout by newline. Trim empty lines. This is the changed_files list.
Abort condition: If changed_files is empty, print the following and stop:
ERROR: No changed files found for diff range <git-range>. Nothing to review.
Do not create a team or a plan when changed_files is empty.
Derive review_base exactly once using this flowchart:
flowchart TD
Start([Derive review_base]) --> Q1{--slug argument provided?}
Q1 -->|Yes| A["review_base = --slug value"]
Q1 -->|No| Q2{--issue N argument provided?}
Q2 -->|Yes| B["review_base = review-{N}<br>e.g. review-2181"]
Q2 -->|No| C["git rev-parse --abbrev-ref HEAD<br>review_base = review-{branch-name}<br>sanitize: replace / with -"]
Run this command and capture its stdout as run_stamp:
uv run --quiet --script "${CLAUDE_SKILL_DIR}/scripts/gen_run_stamp.py"
review_slug is {review_base}-{run_stamp}, for example
review-2181-20260824T014233Z-3f9a2c7e1b804d56.
Use review_slug unchanged in plan operations. Use multi-{review_slug} as the team name.
Create a new plan on every run. Never search for and reuse an existing plan.
Build the changed-files body block:
Changed files:
{each file on its own line}
Create all five tasks in one typed MCP call. Replace {changed_files_block} with the literal
newline-separated changed-files block. Omit issue when --issue was not provided.
mcp__plugin_dh_sam__sam_plan(
config={
"action": "create",
"slug": "{review_slug}",
"goal": "Multi-perspective review for {review_slug}",
"issue": <issue_number_or_omit_if_absent>,
"tasks": [
{
"id": "T1",
"title": "Security Review",
"agent": "dh:reviewer-security",
"priority": 1,
"complexity": "medium",
"dependencies": [],
"body": "Review every changed file through the security lens.\n"
"Return structured verdict per verdict-schema.md.\n\n{changed_files_block}",
},
{
"id": "T2",
"title": "Performance Review",
"agent": "dh:reviewer-performance",
"priority": 1,
"complexity": "medium",
"dependencies": [],
"body": "Review every changed file through the performance lens.\n"
"Return structured verdict per verdict-schema.md.\n\n{changed_files_block}",
},
{
"id": "T3",
"title": "Quality Review",
"agent": "dh:reviewer-quality",
"priority": 1,
"complexity": "medium",
"dependencies": [],
"body": "Review every changed file through the quality lens.\n"
"Return structured verdict per verdict-schema.md.\n\n{changed_files_block}",
},
{
"id": "T4",
"title": "Accessibility Review",
"agent": "dh:reviewer-accessibility",
"priority": 1,
"complexity": "low",
"dependencies": [],
"body": "Apply the SKIP rule first. Otherwise review ARIA attributes, color-only "
"signals, and keyboard parity. Return structured verdict per verdict-schema.md."
"\n\n{changed_files_block}",
},
{
"id": "T5",
"title": "Review Synthesis",
"agent": "dh:review-synthesizer",
"priority": 1,
"complexity": "medium",
"dependencies": ["T1", "T2", "T3", "T4"],
"body": "Read the Review Results section of T1..T4 on this plan and synthesize "
"them into one deduplicated, cross-referenced punch list.\n"
"Write the punch-list block per verdict-schema.md §2.6 into this task's "
"Punch List section.",
},
],
}
)
Store the returned plan_ref as {PA}. Completion criterion: plan_ref is non-empty and the
result has task_count=5.
Create the team:
TeamCreate(team_name="multi-{review_slug}")
Dispatch all four workers simultaneously. Do NOT wait between spawns — all four are independent
and must run in parallel. Each worker receives a minimal prompt that tells it to run the
dh:start-task skill (name it in prose — a harness-specific invocation form reaches only the
harness that defines it) against its own task reference. dh:start-task owns claim, active-task
registration, and execution; a worker that never runs it claims nothing and writes nothing, which
Step 6 records as a missing verdict. The agent: field in each SAM task tells dh:task-worker
which specialist profile to load via profile_load internally.
Dispatch dh:task-worker for all four tasks, not the reviewer agents directly — see Behavioral
Rules for why. dh:review-synthesizer reaches the plan the same way, so Step 6 dispatches it
identically.
Every prompt names the same output destination: the Review Results section of the worker's own
task. That section is the only channel the synthesizer reads in Step 6 — a reviewer that does not
write it is a missing verdict, and the punch list records it as one. The loaded profile — not the
dispatch prompt — performs that write: each reviewer agent's own SOP ends with a mandatory write
to Review Results as part of what dh:start-task executes. Do not instruct the worker to write
the section itself before running dh:start-task.
Agent(
team_name="multi-{review_slug}",
name="{worker}",
subagent_type="dh:task-worker",
prompt="Before starting work, load these skills: dh:subagent-contract\n\nYou are working on {lens} review. Your task: {PA}/{task}.\n\nRun the dh:start-task skill against {PA} --task {task}. The loaded profile writes your structured verdict block into the task's Review Results section — that is where the punch list reads your verdict. Do not write that section yourself first; the profile's own SOP performs the single write."
)
Substitute one row per spawn:
{worker} | {lens} | {task} |
|---|---|---|
security-worker | security | T1 |
performance-worker | performance | T2 |
quality-worker | quality | T3 |
accessibility-worker | accessibility | T4 |
Wait until T1..T4 have all reached a terminal status. Poll:
mcp__plugin_dh_sam__sam_plan(plan="{PA}", config={"action": "status"})
A task is terminal at complete, blocked, failed, skipped, or deferred. T5 stays
not-started throughout this step — it is dispatched in Step 6, and its dependencies keep
sam_plan(action="ready") from offering it before all four reviews land.
Dispatch one more worker against T5. It reads the four Review Results sections, merges
findings that name the same defect across perspectives into single entries, and writes the
punch-list block into T5's own Punch List section. As with the four reviewer workers, the
dh:review-synthesizer profile — loaded by dh:start-task — performs that write as its own Step
5; the dispatch prompt only tells the worker where to look and where its output is read, not to
write the section itself.
Agent(
team_name="multi-{review_slug}",
name="synthesis-worker",
subagent_type="dh:task-worker",
prompt="Before starting work, load these skills: dh:subagent-contract\n\nYou are synthesizing the four perspective verdicts on plan {PA} into one punch list. Your task: {PA}/T5.\n\nRun the dh:start-task skill against {PA} --task T5. The loaded profile writes your punch-list block into the task's Punch List section — that is where the gate reads your output. Do not write that section yourself first; the profile's own SOP performs the single write."
)
Wait for T5 to reach a terminal status, then read it and take its Punch List section:
mcp__plugin_dh_sam__sam_task(plan="{PA}", task="T5", config={"action": "read"})
punch_list = json.loads(punch_list_section)
The block carries each perspective's §2.1 verdict block verbatim in verdicts, the perspectives
that returned nothing in missing, and the deduplicated findings in entries. It gives the gate
everything it needs to render the summary and entries, but not everything it needs to trust the
verdict token or the findings behind entries — see the reconciliation checks below.
json.loads succeeding proves the section is JSON, not that it is a punch list. Run the
review-verdict-contract §2.6 validity checks against the parsed
block before Step 7 reads any field, and take the Punch list not produced failure path below —
naming the check that failed — when any of them fails. Indexing a field the gate needs out of an
unvalidated block raises on {} and silently under-reports coverage on a block missing a
perspective, and a review that reports fewer perspectives than it ran is a false pass.
Reconcile against source (§2.6 checks 6 and 7): the synthesizer copies each verdicts[i] block
from its perspective's own Review Results section, but a copy is a claim, not a guarantee. Read
the four raw Review Results sections on T1..T4 — comparing the punch list's own verdicts
and entries fields against each other is not enough, since both are the synthesizer's own output
and an internally-consistent alteration to both still passes. Confirm two things against those raw
sections directly:
verdicts[i].verdict matches its source perspective's verdict field exactly. An
LLM that alters a source REJECT to APPROVE while carrying its finding text forward still
produces a block that passes every other check, because none of them compares verdict to its
source.description on T1..T4 appears verbatim in some
entries[].descriptions, at the index where that entry's entries[].perspectives names the
finding's own perspective. An LLM that alters a finding's file, severity, description, or
rule identically in both verdicts[i].findings and entries, or drops one while inventing a
duplicate attribution to keep the total unchanged, still passes every check that compares the
punch list only against itself.A mismatch on either check is that check failing: take the Punch list not produced failure path
below and name the check and the perspective or finding it failed on — a punch list that silently
drops a REJECT, or silently misstates a finding, is a false pass, and the gate's entire correctness
rests on these two checks, so both run on every synthesis, not only when something looks wrong.
Punch list not produced: a terminal T5 whose Punch List section is absent, does not
parse as JSON, or fails any validation check above is synthesis that did not happen. FAIL with
Punch list not produced, name the check that failed, report which perspectives did write a
Review Results section so the run is diagnosable, then run TeamDelete(team_name="multi-{review_slug}")
and exit non-zero — this failure happens before Step 7, so its own team cleanup and exit are the
only ones that will run for it.
Both inputs come from the punch list read in Step 6: punch_list["verdicts"] and
punch_list["missing"].
Apply gate in this order:
Check for missing verdicts. For each perspective named in punch_list["missing"], FAIL
immediately with message "Perspective {X} did not return a verdict". A missing verdict is
never an approval.
Check for REJECT. If any verdict has verdict == "REJECT", the gate FAILS. Collect all
REJECT verdicts and their blocking findings for the summary. Report the blocking findings from
punch_list["entries"], where a defect two perspectives raised appears once and names both.
Check for all-SKIP edge case. If all four verdicts are SKIP, the gate PASSES but the
summary MUST include this exact warning line:
NOTE: No perspectives reviewed — all skipped
All other combinations (any APPROVE, remaining SKIP) → gate PASSES.
Print one canonical summary line:
Security: {token} | Performance: {token} | Quality: {token} | Accessibility: {token}
Take each {token} from the verdict-to-token mapping in
review-verdict-contract §2.2, which also shows a fully
rendered example line.
NOTE: No perspectives reviewed — all skipped, then TeamDelete, then exit 0.TeamDelete cleans up the team after all workers are done:
TeamDelete(team_name="multi-{review_slug}")
Before dispatching a run, or when verifying that a completed run's argument parsing, gate checks, and exit path followed the required sequence, consult Dispatch Flow — a step-faithful flowchart cross-referencing every step, condition, and terminal outcome in Steps 1-7 above.
dh:task-worker because the perspective reviewer agents cannot claim or close a SAM task. Specialist behavior is selected through the task profile. See dh:dispatch-contract.Security REJECT, Accessibility SKIP, and summary-line-format behavior require live skill execution against real diff inputs and are not covered by automated structural checks. See Acceptance Test Guide for fixture-based verification procedures.
Frequently asked questions
Creates an ephemeral SAM plan, collects structured verdicts, synthesizes them into one deduplicated cross-referenced punch list, prints one summary line per perspective, and exits non-zero if any perspective returns REJECT. SKIP is a passing outcome.
The source record exposes this install command: npx skills add https://github.com/Jamie-BitFlight/claude_skills --skill "plugins/development-harness/skills/multi-perspective-review". Inspect the command and pinned source before running it.
Static rules flagged exec-script in the source; the page lists the matching lines and excerpts.
Alternatives
coreyhaines31/marketingskills
When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "should I test this," "which version is better," "test two versions," "statistical significance," "how long should I run this test," "growth experiments," "experiment velocity," "experiment backlog," "ICE score," "experimentation program
coreyhaines31/marketingskills
When the user wants to reduce churn, build cancellation flows, set up save offers, recover failed payments, or implement retention strategies. Also use when the user mentions 'churn,' 'cancel flow,' 'offboarding,' 'save offer,' 'dunning,' 'failed payment recovery,' 'win-back,' 'retention,' 'exit survey,' 'pause subscription,' 'involuntary churn,' 'people keep canceling,' 'churn rate is too high,' 'how do I keep users,' or 'customers are leaving.' Use this whenever someone is losing subscribers o
prowler-cloud/prowler
PostgreSQL indexing best practices for Prowler: index design, partial indexes, partitioned table indexing, EXPLAIN ANALYZE validation, concurrent operations, monitoring, and maintenance. Trigger: When creating or modifying PostgreSQL indexes, analyzing query performance with EXPLAIN, debugging slow queries, reviewing index usage statistics, reindexing, dropping indexes, or working with partitioned table indexes. Also trigger when discussing index strategies, partial indexes, or index maintenance
oaustegard/claude-skills
Generate hierarchical _FEATURES.md files that describe what a codebase DOES from a user/consumer perspective, anchored to source symbols via tree-sitting. Supports large complex codebases through feature-driven decomposition into sub-feature files. Uses a multi-pass synthesis: orientation → detail → overview rewrite. Use when someone says "what does this do", "document features", "feature inventory", "_FEATURES.md", or needs to understand a codebase's purpose before modifying it. Complements tre