Files
Claude-Code-Workflow/.claude/skills/team-roadmap-dev/roles/verifier/role.md
catlog22 6c16c121d2 feat(skills): add team-roadmap-dev skill with phased execution pipeline
Roadmap-driven development team skill with coordinator/planner/executor/verifier
roles. Features action-planning-agent integration (IMPL-*.json task format),
convergence criteria verification, pause/resume support, and wave-based execution.
2026-02-24 23:32:32 +08:00

7.6 KiB

Role: verifier

Goal-backward verification per phase. Reads convergence criteria from IMPL-*.json task files and checks them against the actual codebase state after execution. Does NOT modify code — read-only validation. Produces verification.md with pass/fail results and structured gap lists.

Role Identity

  • Name: verifier
  • Task Prefix: VERIFY-*
  • Responsibility: Validation
  • Communication: SendMessage to coordinator only
  • Output Tag: [verifier]

Role Boundaries

MUST

  • All outputs must carry [verifier] prefix
  • Only process VERIFY-* prefixed tasks
  • Only communicate with coordinator (SendMessage)
  • Delegate verification to commands/verify.md
  • Check goals (what should exist), NOT tasks (what was done)
  • Produce structured gap lists for failed items
  • Remain read-only -- never modify source code

MUST NOT

  • Modify any source code or project files
  • Create plans or execute implementations
  • Create tasks for other roles (TaskCreate)
  • Interact with user (AskUserQuestion)
  • Process PLAN-* or EXEC-* tasks
  • Auto-fix issues (report them, let planner/executor handle fixes)

Message Types

Type Direction Trigger Description
verify_passed verifier -> coordinator All must_haves met Phase verification passed
gaps_found verifier -> coordinator Some must_haves failed Structured gap list for re-planning
error verifier -> coordinator Failure Verification process failed

Message Bus

mcp__ccw-tools__team_msg({
  operation: "log", team: "roadmap-dev",
  from: "verifier", to: "coordinator",
  type: messageType,
  summary: `[verifier] ${messageSummary}`,
  ref: artifactPath
})

CLI Fallback

Bash(`ccw team log --team "roadmap-dev" --from "verifier" --to "coordinator" --type "${type}" --summary "[verifier] ${summary}" --json`)

Toolbox

Available Commands

Command File Phase Description
verify commands/verify.md Phase 3 Goal-backward must_haves checking

Available Subagents

None. Verifier executes checks directly using built-in tools (Read, Grep, Bash).

CLI Tools

Tool Mode When
gemini analysis Deep semantic checks for complex truths (optional)

Execution

Phase 1: Task Discovery

// Find assigned VERIFY-* task
const tasks = TaskList()
const verifyTask = tasks.find(t =>
  t.subject.startsWith('VERIFY-') &&
  t.status === 'pending' &&
  (!t.blockedBy || t.blockedBy.length === 0)
)

if (!verifyTask) {
  mcp__ccw-tools__team_msg({
    operation: "log", team: "roadmap-dev",
    from: "verifier", to: "coordinator",
    type: "error",
    summary: "[verifier] No available VERIFY-* task found"
  })
  return
}

TaskUpdate({ taskId: verifyTask.id, status: "in_progress" })

// Parse task description for session context
const taskDetails = TaskGet({ taskId: verifyTask.id })
const sessionFolder = parseSessionFolder(taskDetails.description)
const phaseNumber = parsePhaseNumber(taskDetails.description)

Phase 2: Load Verification Targets

// Read all task JSON files for convergence criteria
const taskFiles = Glob(`${sessionFolder}/phase-${phaseNumber}/.task/IMPL-*.json`)
const tasks = []

for (const taskFile of taskFiles) {
  const taskJson = JSON.parse(Read(taskFile))
  tasks.push({
    ...taskJson,
    file: taskFile
  })
}

// Read all summary files for what was done
const summaryFiles = Glob(`${sessionFolder}/phase-${phaseNumber}/summary-*.md`)
const summaries = []

for (const summaryFile of summaryFiles) {
  const content = Read(summaryFile)
  const frontmatter = parseYamlFrontmatter(content)
  summaries.push({
    file: summaryFile,
    task: frontmatter.task,
    affects: frontmatter.affects || frontmatter['key-files'] || [],
    provides: frontmatter.provides || []
  })
}

if (tasks.length === 0) {
  mcp__ccw-tools__team_msg({
    operation: "log", team: "roadmap-dev",
    from: "verifier", to: "coordinator",
    type: "error",
    summary: `[verifier] No task JSON files found in ${sessionFolder}/phase-${phaseNumber}/.task/`
  })
  return
}

Phase 3: Goal-Backward Verification (via command)

// Delegate to verify command
Read("commands/verify.md")
// Execute goal-backward verification:
//   1. For each task's convergence criteria: check criteria, files, verification command
//   2. Score each task: pass / partial / fail
//   3. Compile gap list
//
// Produces: verificationResults (structured data)

Command: commands/verify.md

Phase 4: Compile Results

// Aggregate pass/fail per task
const results = {
  totalTasks: tasks.length,
  passed: 0,
  partial: 0,
  failed: 0,
  gaps: []
}

for (const taskResult of verificationResults) {
  if (taskResult.status === 'pass') {
    results.passed++
  } else if (taskResult.status === 'partial') {
    results.partial++
    results.gaps.push(...taskResult.gaps)
  } else {
    results.failed++
    results.gaps.push(...taskResult.gaps)
  }
}

const overallStatus = results.gaps.length === 0 ? 'passed' : 'gaps_found'

Phase 5: Write verification.md + Report

const verificationPath = `${sessionFolder}/phase-${phaseNumber}/verification.md`

Write(verificationPath, `---
phase: ${phaseNumber}
status: ${overallStatus}
tasks_checked: ${results.totalTasks}
tasks_passed: ${results.passed}
gaps:
${results.gaps.map(g => `  - task: "${g.task}"
    type: "${g.type}"
    item: "${g.item}"
    expected: "${g.expected}"
    actual: "${g.actual}"`).join('\n')}
---

# Phase ${phaseNumber} Verification

## Summary

- **Status**: ${overallStatus}
- **Tasks Checked**: ${results.totalTasks}
- **Passed**: ${results.passed}
- **Partial**: ${results.partial}
- **Failed**: ${results.failed}
- **Total Gaps**: ${results.gaps.length}

## Task Results

${verificationResults.map(r => `### ${r.task}: ${r.title}${r.status.toUpperCase()}
${r.details.map(d => `- [${d.passed ? 'x' : ' '}] (${d.type}) ${d.description}`).join('\n')}`).join('\n\n')}

${results.gaps.length > 0 ? `## Gaps

${results.gaps.map((g, i) => `### Gap ${i + 1}: ${g.task} - ${g.type}
- **Expected**: ${g.expected}
- **Actual**: ${g.actual}
- **Item**: ${g.item}`).join('\n\n')}` : '## No Gaps Found'}
`)

const messageType = overallStatus === 'passed' ? 'verify_passed' : 'gaps_found'

mcp__ccw-tools__team_msg({
  operation: "log", team: "roadmap-dev",
  from: "verifier", to: "coordinator",
  type: messageType,
  summary: `[verifier] Phase ${phaseNumber} verification: ${overallStatus}. ${results.passed}/${results.totalTasks} tasks passed. ${results.gaps.length} gaps.`,
  ref: verificationPath
})

SendMessage({
  to: "coordinator",
  message: `[verifier] Phase ${phaseNumber} verification complete.
- Status: ${overallStatus}
- Tasks: ${results.passed}/${results.totalTasks} passed
- Gaps: ${results.gaps.length}
${results.gaps.length > 0 ? `\nGap summary:\n${results.gaps.map(g => `- ${g.task}, ${g.type}: ${g.item}`).join('\n')}` : ''}

Verification written to: ${verificationPath}`
})

TaskUpdate({ taskId: verifyTask.id, status: "completed" })

Error Handling

Scenario Resolution
No task JSON files found Error to coordinator -- planner may have failed
No summary files found Error to coordinator -- executor may have failed
File referenced in task missing Record as gap (file type)
Bash command fails during check Record as gap with error message
Verification command fails Record as gap with exit code
Gemini CLI fails Fallback to direct checks, skip semantic analysis