The EPAV Workflow
One command per phase. A human gate before every /apply.
Module Overview
This is the Dev Track's equivalent of Module 2. The core program teaches Evaluate → Plan → Apply → Validate as a discipline you apply by hand, in a chat window, to any artifact. nexus-dev-toolkit encodes exactly that cycle as four skills for the Developer role — each one a markdown file in .claude/commands/ (or .opencode/commands/ — same filenames, same behavior), each one enforcing the same gate the core program teaches: no code until a plan is approved. A fifth command, /code-review, isn't one of the four EPAV phases — it's a separate reviewer skill — but it's the recommended last step before calling any task done, so treat it as part of the daily loop, covered alongside the other four below.
| Skill | File | What it does |
|---|---|---|
/evaluate | evaluate.md | Queries the knowledge graph, loads the CSV task + AGENTS.md + arch doc + knowledge/ in priority order, outputs an EVALUATE SUMMARY, then stops. |
/plan | plan.md | Runs a blast-radius check (graphify path / codegraph impact), writes a numbered implementation blueprint, lists constraints, then stops and waits. |
/apply | apply.md | Implements exactly what the approved plan says. Refuses to run without an approved plan. Flags and stops if scope drifts. |
/validate | validate.md | Re-checks the graph, walks every acceptance criterion PASS/FAIL/PARTIAL, classifies issues BLOCKER/FIX NOW/BACKLOG, fixes blockers before declaring done. |
/epav | epav.md | Runs all four in sequence, with a hard GATE before Apply: "Plan ready. Reply go or /apply to implement, or give feedback to revise." |
/code-review | code-review.md | Not an EPAV phase — a separate reviewer skill. Run it once VALIDATE passes. Outputs a Repo Context block, then a JSON findings block; a blocked:true flag fires the moment any finding is critical. Covered fully in Dev 5. |
What you'll produce
A completed Dev Task — code that satisfies every acceptance criterion in the CSV, with the traceability chain (BRD → PRD → Architecture → Dev Task → code → tests) intact, run entirely through five typed commands.
OpenCode note
Every skill on this page is the exact same command, spelled the exact same way, in OpenCode — the only difference is the folder (.opencode/commands/ instead of .claude/commands/) and that reviewer subagents get their Claude-specific frontmatter (tools, model) stripped automatically when nexus init copies them. Nothing in this walkthrough changes if you're on OpenCode.
Same Gates, Mechanical Enforcement
Module 2 teaches that a gate is a checkpoint, a handoff, and a commitment — and that a failed gate sends work back, never forward. EPAV enforces the same shape, just inside a single session instead of across a week:
| EPAV phase | Core SDLC equivalent | What blocks progress |
|---|---|---|
| EVALUATE | Entry condition for the phase | Nothing loaded yet — skill refuses to plan or code |
| PLAN | The artifact draft, pre-review | Skill stops and waits — explicitly will not proceed to APPLY |
| APPLY (the gate) | Sign-off before handoff | Requires an explicit go or /apply from a human |
| VALIDATE | Quality bar / gate review | Every [BLOCKER] and [FIX NOW] must be fixed before "done" |
The CSV Is Still the Prompt
Nothing about the artifact chain changes. docs/dev-tasks/epic-N-...-tasks.csv — produced in the core program's Week 2 by the Tech Lead — still has user_story, description, acceptance_criteria, and dependencies. /evaluate's context-loading step reads that CSV row first, then AGENTS.md, then the architecture doc, then knowledge/. You don't re-type any of it — the argument to /evaluate is just which task. Under the hood, the MCP tool load_task is what actually pulls the matching CSV row plus the knowledge-graph blast radius into context at the start of /evaluate — it's already wired up by nexus init, so you never call it directly.
Running this on the sample project
The walkthrough below uses TASK-014 from the Dev Track's own sample project Dev Tasks (introduced in Dev 1) — a real row for LeaveTrack's manager approve/reject endpoint. Copy the raw CSV linked from that page into your own docs/dev-tasks/ and run /evaluate TASK-014 yourself; the output below is what the skill actually produces against those files, not a hypothetical.
/evaluate TASK-014
reads the same as the core program's manual prompt sequence:
[EVALUATE] Load: docs/arch-docs/, the epic CSV, AGENTS.md I'm implementing TASK-014: approve/reject decision endpoint + audit record. Walk me through how the approval queue (TASK-013) and the data model work so I understand where to integrate.
— except nexus already knows which files to load, in what order, and what format to answer in.
Walkthrough: One Task, Five Commands
1 — /evaluate TASK-014
EVALUATE SUMMARY
────────────────
Task: Approve/reject decision endpoint + audit record (US-03)
Touches: POST /api/leave-requests/:id/decision, leave_requests, audit_log
Depends on: TASK-013 (manager approval queue, scoped to direct reports)
Constraints: error format from AGENTS.md; 403 if requester is not a direct
report (PRD US-03 AC3); no hard-delete anywhere (BRD BR-04)
Risk: leave_requests.manager_id filter is security-relevant —
getting the scope check wrong is a data-exposure bug, not a
cosmetic one (ARCH-LeaveTrack-v1.0 security note)
"Ready to /plan. Type /plan when you want the implementation blueprint."
2 — /plan
PLAN
────
1. src/app/api/leave-requests/[id]/decision/route.ts — new route handler
2. src/lib/leave-requests.ts — add decideRequest(), enforces manager_id
filter in the query itself, not in a post-query check
3. src/lib/audit.ts — write the audit_log row on every decision
Files created: route.ts, audit.ts
Files modified: leave-requests.ts
Files deleted: (none)
Blast radius: TASK-013's queue query and TASK-015's audit report both
read leave_requests/audit_log — schema unchanged, no
breaking impact
God nodes touched: none
"Waiting for approval. Reply /apply to implement, or give feedback to revise the plan."
3 — /apply (only after you approve)
APPLY COMPLETE ────────────── Created: route.ts, audit.ts Modified: leave-requests.ts Skipped: (none) "Ready to /validate. Type /validate to check against acceptance criteria."
4 — /validate
[x] AC1: approving decrements balance, sets status=approved, writes audit_log — PASS
[x] AC2: rejecting requires a reason, no balance change, writes audit_log — PASS
[ ] AC3: acting on a non-direct-report's request returns 403 — FAIL
(filter was applied after the row was already fetched, not in the query)
[BLOCKER] Move the manager_id filter into the query itself, per the arch
doc's security note — fixed
[BACKLOG] Add a rate limit on repeated decision attempts — logged to knowledge/retros/
VALIDATE COMPLETE
─────────────────
Criteria passed: 3/3 (after fix)
"Task complete. Ready for the next /evaluate."
5 — /code-review (not an EPAV phase, but the recommended close)
## Repo Context
- Stack: Next.js 16, TypeScript, Supabase
- Conventions: error format from AGENTS.md; soft-delete only (no hard-delete)
```json
{
"blocked": false,
"overall_severity": "low",
"summary": "TASK-014 implementation is correct post-fix; one minor logging note.",
"findings": [
{ "id": "CR-001", "severity": "low", "category": "maintainability",
"file": "src/lib/audit.ts", "line": 18,
"title": "Audit log write not wrapped in the same transaction as the decision",
"description": "A crash between the two writes could leave a decision without an audit row.",
"suggestion": "Wrap the balance update and audit_log insert in one DB transaction." }
]
}
```
blocked: false and nothing critical — clear to close the task out. If a critical finding had come back, /code-review would block the task the same way an unresolved [BLOCKER] in /validate does.
Scope discipline
EPAV covers one task at a time. If /apply discovers something unexpected that would expand scope, it stops and asks — it does not quietly do more than the plan said. If the user says "stop", "abort", or "cancel" at any point, the cycle halts immediately and summarizes what was and wasn't completed. Extra work that surfaces mid-task gets logged to knowledge/retros/, not folded into the current task.
Closing Out: /commit and /create-pr
Two more skills round out the loop, grouped by nexus's own docs under "Git" rather than EPAV or Reviewers — they turn a validated, reviewed task into something on its way to merge.
| Skill | What it does |
|---|---|
/commit | Stages the relevant changes and writes a well-formed commit message — referencing the Dev Task ID, per the traceability convention from the core program's Module 2. |
/create-pr | Runs /code-review itself if you haven't already, then opens a well-structured pull request. |
/evaluate TASK-014 → /plan → /apply → /validate → /code-review → /commit → /create-pr
Self-Check
- I can name what each of the four EPAV skills does and where it stops.
- I understand that
/plannever proceeds to code without an explicit approval. - I can trace how the Dev Tasks CSV becomes
/evaluate's context without retyping it, and I knowload_taskis the MCP tool doing that behind the scenes. - I know what happens when
/applydiscovers out-of-scope work mid-task. - I know the difference between
[BLOCKER],[FIX NOW], and[BACKLOG]in/validate's output. - I can explain why
/code-reviewisn't one of the four EPAV phases but is still part of the daily loop, and what/commitand/create-pradd after it.