Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/vancourse-design-review
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: design
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions: not checked yet.
What's inside
- Skill name
design-review- Description
- None
- License
- MIT
- Instructions
- 168 lines in SKILL.md · view on GitHub
Agent Skills spec issues
- invalid YAML frontmatter: Nested mappings are not allowed in compact mappings at line 2, column 14:
- name: missing
- description: missing
Files (1)
- SKILL.md
SKILL.md (first lines)
# Design Review
The gate between "we have a design" and "we have a FROZEN design." Re-walks design-feature's 5+1 passes from the adversarial lens — cold, in a separate cognitive step from authoring — so the steelman voice of the design phase and the attack voice of the review phase don't blur into a single self-congratulatory pass.
## When to invoke
- `rails:design-feature` just produced a design draft and you're about to move to implementation planning
- Before invoking `rails:impl-plan` — impl plans against an un-frozen design are wasted work
- A frozen design needs re-validation (architecture amendment landed; PRD changed)
Pairs with:
- **`rails:design-feature`** (upstream) — authored the design (the steelman pass)
- **`rails:prd-review`** (further upstream) — owns the scenarios this design must satisfy
- **`rails:threat-model`** — owns Pass 6's STRIDE output if the feature has attack surface
- **`rails:impl-plan`** (downstream) — implementation plan against the frozen design
- **`rails:impl-plan-review`** (further downstream) — review of that plan
Distinct from `rails:design-feature`'s inline adversarial counter-passes: those are the cheap version run alongside authoring (same agent, same session — the attack voice contaminated by the just-spent author voice). This skill is the explicit second cognitive pass; for non-trivial designs the heavier *two-attacker* dispatch pattern below (one walking the 6 passes, one running `rails:threat-model`) is the default. See the §"Adversarial pair pattern" section at the bottom for the dispatch mechanics — that pattern is **distinct from `rails:adversarial-pair`'s cooperative+adversarial framing** because `design-review` is itself already the adversarial half of `design-feature`'s authoring voice.
## Adversarial counter-pass — read this first
The review IS the adversarial pass. Run each of the 5+1 passes below in attack mode. The cooperative half is already in the design-feature output; if you can't see it cleanly stated, the design wasn't authored — go back to `rails:design-feature`.
The cooperative half asked: *"does this design hold together?"*
This review asks: *"what is this design getting away with?"*
## The 5+1 passes (adversarial lens)
### Pass 1 — User-flow scenarios
Walk each listed scenario. Then:
- **Name a flow NOT covered** by the listed scenarios. If ≥2 missing flows, the scenario list is incomplete — back to design.
- **Name a scenario the design subtly *can't* handle without architectural rework.** Surface as a constraint now, not at impl time.
**Pass condition:** every named missing flow is either added to the design or explicitly accepted (with rationale) as out of scope for this iteration.
### Pass 2 — MVP cut
- **Strike one element from MVP. Does the feature still satisfy the PRD?** If yes → MVP is bloated. Repeat until removing any element breaks acceptance — that's the real MVP.
- **Name an element ADDED to MVP that the PRD didn't require.** Scope expansion from "we'll obviously need this" is the most common MVP failure.
**Pass condition:** no strikeable element remains. Anything beyond the irreducible set is tagged V2 / deferred.
### Pass 3 — Deferral list
- **Name a deferred item that, if broken / missing post-launch, would force a hot fix.** Those don't belong in deferred — they're MVP.
- **Name a deferred item whose absence becomes obvious within 24 hours of launch and embarrasses the team.** Same conclusion.
**Pass condition:** no deferred item meets either criterion. Items that do get promoted back into MVP.
### Pass 4 — Integration with existing surface
- **Show an existing primitive this design SHOULD extend but instead duplicates.** Pure-addition is a smell.
- **Name an invariant this design quietly breaks without acknowledgment** ("all transactions go through service X" — and this design adds a path that bypasses X). Either finding is a real architectural risk.
**Pass condition:** each named duplication is either justified ("the existing primitive doesn't generalize") or replaced with an extension. Each named broken invariant is either acknowledged + accepted, or the design is reshaped to preserve it.
### Pass 5 — Failure modes
- **Walk each failure mode and find one where the design says "throws an error" or "logs and continues" without specifying user-visible behavior.** Those are unresolved — the implementation will fill them in arbitrarily and the user will see something accidental.
- **Name a failure mode unique to this feature** not in the design-feature standard list (schema migration mid-rollout, feature-flag flip mid-request, partial CDN cache, mid-deploy version skew, paid-API quota exhaustion).
**Pass condition:** every failure mode has a stated user-visible behavior. The unique-to-this-feature mode is either added to the design or explicitly accepted as a known residual risk.
### Pass 6 — Attack surface
Confirm `rails:threat-model` ran and the 6-category STRIDE output (Spoofing / Tampering / Repudiation / Information disclosure / DoS / Elevation of privilege) is appended to the design.
For any feature touching auth, payment, multi-tenant data, admin actions, or cryptography — confirm the **heavier two-agent threat-model** was dispatched (per `rails:threat-model`'s "when to invoke heavier" criteria), not just the cheap inline version. If only the cheap version ran on a heavyweight-criteria feature, fail this pass and dispatch the heavier pattern.
If the feature has no attack surface, state that explicitly with one-line justification ("internal-only operator tool, no external input, no PII").
**Pass condition:** STRIDE output present with named mitigations or explicit accepted residual risks per category. Heavier pattern dispatched if criteria met.
## Overlap + OSS scans (audit, don't repeat)
The cooperative design-feature pass already ran:
- Internal product-overlap scan
- OSS-alternatives scan (≥1 alternative considered)
Audit, don't re-run. If either is absent or perfunctory, fail and return to design-feature.
**Adversarial spot-check:**
- Name an existing feature whose intent is within one synonym of this design. If found and not addressed in the overlap scan, the scan was incomplete.
- Name a >1k-star OSS library that solves the core capability. If found and not addressed, the scan was incomplete. Common misses: queueing/scheduling, retries/circuit-breaking, telemetry/tracing, feature flags, search, file storage, image processing, rate limiting, A/B testing, auth/RBAC, payment processing.
## Design freeze readiness
After all 6 passes' adversarial findings are addressed (or explicitly accepted with rationale) + scans audited — **mark the design FROZEN.** From this moment on, design changes require a delta amendment (a commit to the design doc), just like PRD amendments. The freeze is what makes `rails:impl-plan` a tractable exercise rather than a moving target.
A frozen design tells the impl-plan author what to build, the test-strategy author what scenarios to mirror, and the threat-model author what surface to defend. None of those downstream skills should be reinventing those decisions.
If the design hasn't passed:
- 1-2 findings → minor revisions, re-run the affected pass
- ≥3 findings or any unresolved failure mode / broken invariant → back to `rails:design-feature`, reshape
### Bound the loop — this ceremony runs at most TWICE for one design
The rule above has no termination condition, and that is a real failure mode, not
a theoretical one. Reshape produces a new design, which earns a new review, which
finds new findings, which triggers reshape. Findings against prose are
**unfalsifiable** — there is no test to settle them — so pass N+1 can always
invent another plausible blocker, and the loop has no fixed point.
Observed cost: one repo's `docs/resource` reached **rev 7 across 71 commits** —
24 review-round commits and 22 reversal/correction commits ("reversed same day",
"residue", "restore") — while the package it described did not exist. The code,
once written, took a day and passed every gate first time.
So:
- **Round 2's surviving findings do not trigger a round 3.** They are filed as
issues against the implementation and the design freezes with them recorded as
known-open. Implementation settles them, because code can falsify a claim.From vancourse/apex, MIT.
More from vancourse/apex
- 0.587score
rails
vancourse
The rails loop and its commands - claim, intent, rails check, push, rails ship, walk, used.
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
adversarial-pair
vancourse
Run a review as two isolated voices, cooperative and adversarial, then reconcile.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
security-review
vancourse
Pre-PR security pass for auth, data access, external input, secrets and dependencies.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
typescript-review
vancourse
TypeScript/React review rules (types, hooks, state, tests, errors).
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
postgres-review
vancourse
Postgres schema, RLS, indexing and SQL review rules.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
python-review
vancourse
Python review rules (types, SQL, async, tests, errors, security).
SkillAFreshness: A★ 1Claude Code +9 - 0.579score
fix
vancourse
Fix something broken - a defect, a red check, a wrong behaviour.
SkillAFreshness: A★ 1Claude Code +9 - 0.579score
release
vancourse
Start or close a release (a milestone whose done is the operator using it).
SkillAFreshness: A★ 1Claude Code +9 - 0.579score
retro
vancourse
Close a session by routing ONE finding to the strongest rung it reaches - a gate or test, else a hook, else prose, else dropped.
SkillAFreshness: A★ 1Claude Code +9
Signals
- Stars
- 1
- Forks
- 1
- Open issues
- 9
- Last commit (this folder)
- Oct 6, 2026 (23 days ago)
- Last release
- Aug 13, 2026 (2 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/vancourse/apex
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from vancourse
- 0.587score
rails
vancourse
The rails loop and its commands - claim, intent, rails check, push, rails ship, walk, used.
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
adversarial-pair
vancourse
Run a review as two isolated voices, cooperative and adversarial, then reconcile.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
security-review
vancourse
Pre-PR security pass for auth, data access, external input, secrets and dependencies.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
typescript-review
vancourse
TypeScript/React review rules (types, hooks, state, tests, errors).
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
postgres-review
vancourse
Postgres schema, RLS, indexing and SQL review rules.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
python-review
vancourse
Python review rules (types, SQL, async, tests, errors, security).
SkillAFreshness: A★ 1Claude Code +9
Cite this page
design-review skill. Agent Mart. https://agentmart.dev/skills/vancourse-design-review (last updated 2026-10-24)