team-quality-assurance

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Auto Mode

自动模式

When
--yes
or
-y
: Auto-confirm task decomposition, skip interactive validation, use defaults.
当使用
--yes
-y
参数时:自动确认任务分解,跳过交互校验,使用默认配置。

Team Quality Assurance

团队质量保障

Usage

使用方法

bash
$team-quality-assurance "Full QA for the authentication module"
$team-quality-assurance --mode=discovery "Scan codebase for security and bug issues"
$team-quality-assurance --mode=testing "Test recent changes with progressive coverage"
$team-quality-assurance -c 4 --mode=full "Complete QA cycle with regression scanning"
$team-quality-assurance -y "QA all changed files since last commit"
$team-quality-assurance --continue "qa-auth-module-20260308"
Flags:
  • -y, --yes
    : Skip all confirmations (auto mode)
  • -c, --concurrency N
    : Max concurrent agents within each wave (default: 3)
  • --continue
    : Resume existing session
  • --mode=discovery|testing|full
    : Force QA mode (default: auto-detect or full)
Output Directory:
.workflow/.csv-wave/{session-id}/
Core Output:
tasks.csv
(master state) +
results.csv
(final) +
discoveries.ndjson
(shared exploration) +
context.md
(human-readable report)

bash
$team-quality-assurance "Full QA for the authentication module"
$team-quality-assurance --mode=discovery "Scan codebase for security and bug issues"
$team-quality-assurance --mode=testing "Test recent changes with progressive coverage"
$team-quality-assurance -c 4 --mode=full "Complete QA cycle with regression scanning"
$team-quality-assurance -y "QA all changed files since last commit"
$team-quality-assurance --continue "qa-auth-module-20260308"
参数说明:
  • -y, --yes
    : 跳过所有确认步骤(自动模式)
  • -c, --concurrency N
    : 每批次最多并发Agent数量(默认值:3)
  • --continue
    : 恢复已存在的会话
  • --mode=discovery|testing|full
    : 强制指定QA模式(默认:自动检测或全量模式)
输出目录:
.workflow/.csv-wave/{session-id}/
核心输出:
tasks.csv
(总控状态表) +
results.csv
(最终结果) +
discoveries.ndjson
(共享探索记录) +
context.md
(可读性报告)

Overview

概述

Orchestrate multi-agent QA pipeline: scout -> strategist -> generator -> executor -> analyst. Supports three modes: discovery (issue scanning), testing (progressive test coverage), and full (closed-loop QA with regression). Multi-perspective scanning from bug, security, test-coverage, code-quality, and UX viewpoints. Progressive layer coverage (L1/L2/L3) with Generator-Critic loops for coverage convergence.
Execution Model: Hybrid -- CSV wave pipeline (primary) + individual agent spawn (secondary)
+-------------------------------------------------------------------+
|              TEAM QUALITY ASSURANCE WORKFLOW                        |
+-------------------------------------------------------------------+
|                                                                     |
|  Phase 0: Pre-Wave Interactive (Requirement Clarification)          |
|     +- Parse task description, detect QA mode                       |
|     +- Mode selection (discovery/testing/full)                      |
|     +- Output: refined requirements for decomposition               |
|                                                                     |
|  Phase 1: Requirement -> CSV + Classification                       |
|     +- Select pipeline based on QA mode                             |
|     +- Build dependency chain with appropriate roles                |
|     +- Classify tasks: csv-wave | interactive (exec_mode)           |
|     +- Compute dependency waves (topological sort)                  |
|     +- Generate tasks.csv with wave + exec_mode columns             |
|     +- User validates task breakdown (skip if -y)                   |
|                                                                     |
|  Phase 2: Wave Execution Engine (Extended)                          |
|     +- For each wave (1..N):                                        |
|     |   +- Execute pre-wave interactive tasks (if any)              |
|     |   +- Build wave CSV (filter csv-wave tasks for this wave)     |
|     |   +- Inject previous findings into prev_context column        |
|     |   +- spawn_agents_on_csv(wave CSV)                            |
|     |   +- Execute post-wave interactive tasks (if any)             |
|     |   +- Merge all results into master tasks.csv                  |
|     |   +- GC Loop Check: coverage < target? -> spawn fix tasks     |
|     |   +- Check: any failed? -> skip dependents                    |
|     +- discoveries.ndjson shared across all modes (append-only)     |
|                                                                     |
|  Phase 3: Post-Wave Interactive (Completion Action)                 |
|     +- Pipeline completion report with quality score                |
|     +- Interactive completion choice (Archive/Keep/Export)           |
|     +- Final aggregation / report                                   |
|                                                                     |
|  Phase 4: Results Aggregation                                       |
|     +- Export final results.csv                                     |
|     +- Generate context.md with all findings                        |
|     +- Display summary: completed/failed/skipped per wave           |
|     +- Offer: view results | retry failed | done                    |
|                                                                     |
+-------------------------------------------------------------------+

编排多Agent QA流水线:侦察员→策略师→生成器→执行器→分析师。支持三种模式:discovery(问题发现)(问题扫描)、testing(测试)(递进测试覆盖)、full(全量)(带回归的闭环QA)。从漏洞、安全、测试覆盖、代码质量、UX多视角开展扫描,支持L1/L2/L3分层覆盖,结合Generator-Critic循环实现覆盖度收敛。
执行模型: 混合模式 -- CSV批次流水线(主)+ 独立Agent调度(次)
+-------------------------------------------------------------------+
|              TEAM QUALITY ASSURANCE WORKFLOW                        |
+-------------------------------------------------------------------+
|                                                                     |
|  阶段0: 批次前交互(需求澄清)          |
|     +- 解析任务描述,检测QA模式                       |
|     +- 模式选择(discovery/testing/full)                      |
|     +- 输出:供任务拆解的精细化需求               |
|                                                                     |
|  阶段1: 需求拆解为CSV+分类                       |
|     +- 根据QA模式选择流水线                             |
|     +- 基于对应角色构建依赖链                |
|     +- 任务分类:csv-wave | 交互式(exec_mode)           |
|     +- 计算依赖批次(拓扑排序)                  |
|     +- 生成包含批次、exec_mode列的tasks.csv             |
|     +- 用户校验任务拆解(使用-y参数则跳过)                   |
|                                                                     |
|  阶段2: 批次执行引擎(扩展版)                          |
|     +- 遍历每个批次(1到N):                                        |
|     |   +- 执行批次前交互式任务(如有)              |
|     |   +- 构建批次CSV(过滤当前批次的csv-wave任务)     |
|     |   +- 将历史发现注入prev_context列        |
|     |   +- spawn_agents_on_csv(当前批次CSV)                            |
|     |   +- 执行批次后交互式任务(如有)             |
|     |   +- 合并所有结果到总控tasks.csv                  |
|     |   +- GC循环检查:覆盖度<目标?→ 生成修复任务     |
|     |   +- 检查:是否有任务失败?→ 跳过依赖该任务的后续任务                    |
|     +- discoveries.ndjson全模式共享(仅追加)     |
|                                                                     |
|  阶段3: 批次后交互(完成动作)                 |
|     +- 输出带质量评分的流水线完成报告                |
|     +- 交互式完成选择(归档/保留/导出)           |
|     +- 最终聚合/生成报告                                   |
|                                                                     |
|  阶段4: 结果聚合                                       |
|     +- 导出最终results.csv                                     |
|     +- 生成包含所有发现的context.md                        |
|     +- 展示汇总:每批次完成/失败/跳过数量           |
|     +- 提供选项:查看结果 | 重试失败任务 | 完成                    |
|                                                                     |
+-------------------------------------------------------------------+

Task Classification Rules

任务分类规则

Each task is classified by
exec_mode
:
exec_modeMechanismCriteria
csv-wave
spawn_agents_on_csv
One-shot, structured I/O, no multi-round interaction
interactive
spawn_agent
/
wait
/
send_input
/
close_agent
Multi-round, needs iterative fix-verify cycles
Classification Decision:
Task PropertyClassification
Multi-perspective code scanning (scout)
csv-wave
Strategy formulation (single-pass analysis)
csv-wave
Test generation (single-pass code creation)
csv-wave
Test execution with auto-fix cycle
interactive
Quality analysis (single-pass report)
csv-wave
GC loop fix-verify iteration
interactive
Regression scanning (post-fix)
csv-wave

每个任务通过
exec_mode
分类:
exec_mode机制判断标准
csv-wave
spawn_agents_on_csv
单次执行、结构化输入输出、无需多轮交互
interactive
spawn_agent
/
wait
/
send_input
/
close_agent
多轮执行、需要迭代修复-验证循环
分类判定:
任务属性分类
多视角代码扫描(侦察员)
csv-wave
策略制定(单次分析)
csv-wave
测试用例生成(单次代码生成)
csv-wave
带自动修复循环的测试执行
interactive
质量分析(单次报告生成)
csv-wave
GC循环修复-验证迭代
interactive
回归扫描(修复后)
csv-wave

CSV Schema

CSV Schema

tasks.csv (Master State)

tasks.csv(总控状态表)

csv
id,title,description,role,perspective,layer,coverage_target,deps,context_from,exec_mode,wave,status,findings,issues_found,pass_rate,coverage_achieved,test_files,quality_score,error
"SCOUT-001","Multi-perspective code scan","Scan codebase from bug, security, test-coverage, code-quality perspectives. Produce severity-ranked findings with file:line references.","scout","bug;security;test-coverage;code-quality","","","","","csv-wave","1","pending","","","","","","",""
"QASTRAT-001","Test strategy formulation","Analyze scout findings and code changes. Determine test layers, define coverage targets, generate test strategy document.","strategist","","","","SCOUT-001","SCOUT-001","csv-wave","2","pending","","","","","","",""
"QAGEN-L1-001","Generate L1 unit tests","Generate L1 unit tests based on strategy. Cover priority files, include happy path, edge cases, error handling.","generator","","L1","80","QASTRAT-001","QASTRAT-001","csv-wave","3","pending","","","","","","",""
Columns:
ColumnPhaseDescription
id
InputUnique task identifier (PREFIX-NNN format)
title
InputShort task title
description
InputDetailed task description (self-contained)
role
InputWorker role:
scout
,
strategist
,
generator
,
executor
,
analyst
perspective
InputScan perspectives (semicolon-separated, scout only)
layer
InputTest layer:
L1
,
L2
,
L3
, or empty for non-layer tasks
coverage_target
InputTarget coverage percentage for this layer (empty if N/A)
deps
InputSemicolon-separated dependency task IDs
context_from
InputSemicolon-separated task IDs whose findings this task needs
exec_mode
Input
csv-wave
or
interactive
wave
ComputedWave number (computed by topological sort, 1-based)
status
Output
pending
->
completed
/
failed
/
skipped
findings
OutputKey discoveries or implementation notes (max 500 chars)
issues_found
OutputCount of issues discovered (scout/analyst)
pass_rate
OutputTest pass rate as decimal (executor only)
coverage_achieved
OutputActual coverage percentage achieved (executor only)
test_files
OutputSemicolon-separated paths of test files (generator only)
quality_score
OutputQuality score 0-100 (analyst only)
error
OutputError message if failed (empty if success)
csv
id,title,description,role,perspective,layer,coverage_target,deps,context_from,exec_mode,wave,status,findings,issues_found,pass_rate,coverage_achieved,test_files,quality_score,error
"SCOUT-001","Multi-perspective code scan","Scan codebase from bug, security, test-coverage, code-quality perspectives. Produce severity-ranked findings with file:line references.","scout","bug;security;test-coverage;code-quality","","","","","csv-wave","1","pending","","","","","","",""
"QASTRAT-001","Test strategy formulation","Analyze scout findings and code changes. Determine test layers, define coverage targets, generate test strategy document.","strategist","","","","SCOUT-001","SCOUT-001","csv-wave","2","pending","","","","","","",""
"QAGEN-L1-001","Generate L1 unit tests","Generate L1 unit tests based on strategy. Cover priority files, include happy path, edge cases, error handling.","generator","","L1","80","QASTRAT-001","QASTRAT-001","csv-wave","3","pending","","","","","","",""
字段说明:
字段所属阶段描述
id
输入唯一任务标识(前缀-NNN格式)
title
输入短任务标题
description
输入详细任务描述(自包含)
role
输入执行角色:
scout
,
strategist
,
generator
,
executor
,
analyst
perspective
输入扫描视角(分号分隔,仅侦察员角色使用)
layer
输入测试层级:
L1
,
L2
,
L3
,非分层任务为空
coverage_target
输入对应层级的目标覆盖度百分比(不适用则为空)
deps
输入分号分隔的依赖任务ID
context_from
输入分号分隔的上下文来源任务ID,当前任务需要这些任务的发现结果
exec_mode
输入
csv-wave
interactive
wave
计算生成批次号(拓扑排序计算,从1开始)
status
输出
pending
->
completed
/
failed
/
skipped
findings
输出核心发现或实现说明(最多500字符)
issues_found
输出发现的问题数量(侦察员/分析师角色)
pass_rate
输出测试通过率,小数格式(仅执行器角色)
coverage_achieved
输出实际达成的覆盖度百分比(仅执行器角色)
test_files
输出分号分隔的测试文件路径(仅生成器角色)
quality_score
输出质量评分0-100(仅分析师角色)
error
输出失败时的错误信息(成功则为空)

Per-Wave CSV (Temporary)

批次级CSV(临时文件)

Each wave generates a temporary
wave-{N}.csv
with extra
prev_context
column (csv-wave tasks only).

每个批次生成临时的
wave-{N}.csv
,额外包含
prev_context
列(仅csv-wave任务)。

Agent Registry (Interactive Agents)

Agent注册表(交互式Agent)

AgentRole FilePatternResponsibilityPosition
Test Executoragents/executor.md2.3 (send_input cycle)Execute tests with iterative fix cycle, report pass rate and coverageper-wave
GC Loop Handleragents/gc-loop-handler.md2.3 (send_input cycle)Manage Generator-Critic loop: evaluate coverage, trigger fix roundspost-wave
COMPACT PROTECTION: Agent files are execution documents. When context compression occurs, you MUST immediately
Read
the corresponding agent.md
to reload.

Agent角色文件模式职责执行位置
测试执行器agents/executor.md2.3 (send_input循环)执行测试并迭代修复,报告通过率和覆盖度每批次内
GC循环处理器agents/gc-loop-handler.md2.3 (send_input循环)管理Generator-Critic循环:评估覆盖度,触发修复轮次批次后
精简保护提示: Agent文件是执行说明文档。当发生上下文压缩时,你必须立即
Read
对应的agent.md文件
重新加载。

Output Artifacts

输出产物

FilePurposeLifecycle
tasks.csv
Master state -- all tasks with status/findingsUpdated after each wave
wave-{N}.csv
Per-wave input (temporary, csv-wave tasks only)Created before wave, deleted after
results.csv
Final export of all task resultsCreated in Phase 4
discoveries.ndjson
Shared exploration board (all agents, both modes)Append-only, carries across waves
context.md
Human-readable execution reportCreated in Phase 4
scan/scan-results.json
Scout output: multi-perspective scan resultsCreated in scout wave
strategy/test-strategy.md
Strategist output: test strategy documentCreated in strategy wave
tests/L1-unit/
Generator output: L1 unit test filesCreated in L1 wave
tests/L2-integration/
Generator output: L2 integration test filesCreated in L2 wave
tests/L3-e2e/
Generator output: L3 E2E test filesCreated in L3 wave
results/run-{layer}.json
Executor output: per-layer test resultsCreated per execution
analysis/quality-report.md
Analyst output: quality analysis reportCreated in final wave
interactive/{id}-result.json
Results from interactive tasksCreated per interactive task

文件用途生命周期
tasks.csv
总控状态 -- 所有任务的状态/发现结果每批次完成后更新
wave-{N}.csv
批次级输入(临时文件,仅csv-wave任务)批次执行前创建,执行后删除
results.csv
所有任务结果的最终导出阶段4生成
discoveries.ndjson
共享探索看板(所有Agent、所有模式共用)仅追加,跨批次保留
context.md
可读性执行报告阶段4生成
scan/scan-results.json
侦察员输出:多视角扫描结果侦察员批次生成
strategy/test-strategy.md
策略师输出:测试策略文档策略批次生成
tests/L1-unit/
生成器输出:L1单元测试文件L1批次生成
tests/L2-integration/
生成器输出:L2集成测试文件L2批次生成
tests/L3-e2e/
生成器输出:L3端到端测试文件L3批次生成
results/run-{layer}.json
执行器输出:分层测试结果每次执行生成
analysis/quality-report.md
分析师输出:质量分析报告最终批次生成
interactive/{id}-result.json
交互式任务结果每个交互式任务生成

Session Structure

会话结构

.workflow/.csv-wave/{session-id}/
+-- tasks.csv                  # Master state (all tasks, both modes)
+-- results.csv                # Final results export
+-- discoveries.ndjson         # Shared discovery board (all agents)
+-- context.md                 # Human-readable report
+-- wave-{N}.csv               # Temporary per-wave input (csv-wave only)
+-- scan/                      # Scout output
|   +-- scan-results.json
+-- strategy/                  # Strategist output
|   +-- test-strategy.md
+-- tests/                     # Generator output
|   +-- L1-unit/
|   +-- L2-integration/
|   +-- L3-e2e/
+-- results/                   # Executor output
|   +-- run-L1.json
|   +-- run-L2.json
+-- analysis/                  # Analyst output
|   +-- quality-report.md
+-- wisdom/                    # Cross-task knowledge
|   +-- learnings.md
|   +-- conventions.md
|   +-- decisions.md
|   +-- issues.md
+-- interactive/               # Interactive task artifacts
|   +-- {id}-result.json
+-- gc-state.json              # GC loop tracking state

.workflow/.csv-wave/{session-id}/
+-- tasks.csv                  # 总控状态(所有任务、所有模式)
+-- results.csv                # 最终结果导出
+-- discoveries.ndjson         # 共享探索看板(所有Agent)
+-- context.md                 # 可读性报告
+-- wave-{N}.csv               # 临时批次输入(仅csv-wave任务)
+-- scan/                      # 侦察员输出
|   +-- scan-results.json
+-- strategy/                  # 策略师输出
|   +-- test-strategy.md
+-- tests/                     # 生成器输出
|   +-- L1-unit/
|   +-- L2-integration/
|   +-- L3-e2e/
+-- results/                   # 执行器输出
|   +-- run-L1.json
|   +-- run-L2.json
+-- analysis/                  # 分析师输出
|   +-- quality-report.md
+-- wisdom/                    # 跨任务知识
|   +-- learnings.md
|   +-- conventions.md
|   +-- decisions.md
|   +-- issues.md
+-- interactive/               # 交互式任务产物
|   +-- {id}-result.json
+-- gc-state.json              # GC循环追踪状态

Implementation

实现说明

Session Initialization

会话初始化

javascript
const getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString()

const AUTO_YES = $ARGUMENTS.includes('--yes') || $ARGUMENTS.includes('-y')
const continueMode = $ARGUMENTS.includes('--continue')
const concurrencyMatch = $ARGUMENTS.match(/(?:--concurrency|-c)\s+(\d+)/)
const maxConcurrency = concurrencyMatch ? parseInt(concurrencyMatch[1]) : 3

// Parse QA mode flag
const modeMatch = $ARGUMENTS.match(/--mode=(\w+)/)
const explicitMode = modeMatch ? modeMatch[1] : null

const requirement = $ARGUMENTS
  .replace(/--yes|-y|--continue|--concurrency\s+\d+|-c\s+\d+|--mode=\w+/g, '')
  .trim()

const slug = requirement.toLowerCase()
  .replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '-')
  .substring(0, 40)
const dateStr = getUtc8ISOString().substring(0, 10).replace(/-/g, '')
const sessionId = `qa-${slug}-${dateStr}`
const sessionFolder = `.workflow/.csv-wave/${sessionId}`

Bash(`mkdir -p ${sessionFolder}/scan ${sessionFolder}/strategy ${sessionFolder}/tests/L1-unit ${sessionFolder}/tests/L2-integration ${sessionFolder}/tests/L3-e2e ${sessionFolder}/results ${sessionFolder}/analysis ${sessionFolder}/wisdom ${sessionFolder}/interactive`)

// Initialize discoveries.ndjson
Write(`${sessionFolder}/discoveries.ndjson`, '')

// Initialize wisdom files
Write(`${sessionFolder}/wisdom/learnings.md`, '# Learnings\n')
Write(`${sessionFolder}/wisdom/conventions.md`, '# Conventions\n')
Write(`${sessionFolder}/wisdom/decisions.md`, '# Decisions\n')
Write(`${sessionFolder}/wisdom/issues.md`, '# Issues\n')

// Initialize GC state
Write(`${sessionFolder}/gc-state.json`, JSON.stringify({
  rounds: {}, coverage_history: [], max_rounds_per_layer: 3
}, null, 2))

javascript
const getUtc8ISOString = () => new Date(Date.now() + 8 * 60 * 60 * 1000).toISOString()

const AUTO_YES = $ARGUMENTS.includes('--yes') || $ARGUMENTS.includes('-y')
const continueMode = $ARGUMENTS.includes('--continue')
const concurrencyMatch = $ARGUMENTS.match(/(?:--concurrency|-c)\s+(\d+)/)
const maxConcurrency = concurrencyMatch ? parseInt(concurrencyMatch[1]) : 3

// 解析QA模式参数
const modeMatch = $ARGUMENTS.match(/--mode=(\w+)/)
const explicitMode = modeMatch ? modeMatch[1] : null

const requirement = $ARGUMENTS
  .replace(/--yes|-y|--continue|--concurrency\s+\d+|-c\s+\d+|--mode=\w+/g, '')
  .trim()

const slug = requirement.toLowerCase()
  .replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '-')
  .substring(0, 40)
const dateStr = getUtc8ISOString().substring(0, 10).replace(/-/g, '')
const sessionId = `qa-${slug}-${dateStr}`
const sessionFolder = `.workflow/.csv-wave/${sessionId}`

Bash(`mkdir -p ${sessionFolder}/scan ${sessionFolder}/strategy ${sessionFolder}/tests/L1-unit ${sessionFolder}/tests/L2-integration ${sessionFolder}/tests/L3-e2e ${sessionFolder}/results ${sessionFolder}/analysis ${sessionFolder}/wisdom ${sessionFolder}/interactive`)

// 初始化discoveries.ndjson
Write(`${sessionFolder}/discoveries.ndjson`, '')

// 初始化知识文件
Write(`${sessionFolder}/wisdom/learnings.md`, '# Learnings\n')
Write(`${sessionFolder}/wisdom/conventions.md`, '# Conventions\n')
Write(`${sessionFolder}/wisdom/decisions.md`, '# Decisions\n')
Write(`${sessionFolder}/wisdom/issues.md`, '# Issues\n')

// 初始化GC状态
Write(`${sessionFolder}/gc-state.json`, JSON.stringify({
  rounds: {}, coverage_history: [], max_rounds_per_layer: 3
}, null, 2))

Phase 0: Pre-Wave Interactive (Requirement Clarification)

阶段0: 批次前交互(需求澄清)

Objective: Parse task description, detect QA mode, prepare for decomposition.
Workflow:
  1. Parse user task description from $ARGUMENTS
  2. Check for existing sessions (continue mode):
    • Scan
      .workflow/.csv-wave/qa-*/tasks.csv
      for sessions with pending tasks
    • If
      --continue
      : resume the specified or most recent session, skip to Phase 2
    • If active session found: ask user whether to resume or start new
  3. QA Mode Selection:
    ConditionModeDescription
    Explicit
    --mode=discovery
    discoveryScout-first: issue discovery then testing
    Explicit
    --mode=testing
    testingSkip scout, direct test pipeline
    Explicit
    --mode=full
    fullComplete QA closed loop + regression scan
    Keywords: discovery, scan, issue, auditdiscoveryAuto-detected discovery mode
    Keywords: test, coverage, TDD, verifytestingAuto-detected testing mode
    No explicit flag and no keyword matchfullDefault to full QA
  4. Clarify if ambiguous (skip if AUTO_YES):
    javascript
    AskUserQuestion({
      questions: [{
        question: "Detected QA mode: '" + qaMode + "'. Confirm?",
        header: "QA Mode Selection",
        multiSelect: false,
        options: [
          { label: "Proceed with " + qaMode, description: "Detected mode is appropriate" },
          { label: "Use discovery", description: "Scout-first: scan for issues, then test" },
          { label: "Use testing", description: "Direct testing pipeline (skip scout)" },
          { label: "Use full", description: "Complete QA closed loop with regression" }
        ]
      }]
    })
  5. Output: Refined requirement, QA mode, scope
Success Criteria:
  • QA mode selected
  • Refined requirements available for Phase 1 decomposition

目标: 解析任务描述,检测QA模式,为任务拆解做准备。
工作流:
  1. 从$ARGUMENTS解析用户任务描述
  2. 检查已有会话(继续模式):
    • 扫描
      .workflow/.csv-wave/qa-*/tasks.csv
      查找包含待执行任务的会话
    • 如果指定
      --continue
      :恢复指定或最新的会话,直接跳转到阶段2
    • 如果找到活跃会话:询问用户是否恢复或新建会话
  3. QA模式选择:
    触发条件模式描述
    显式指定
    --mode=discovery
    discovery侦察优先:先发现问题再执行测试
    显式指定
    --mode=testing
    testing跳过侦察,直接进入测试流水线
    显式指定
    --mode=full
    full完整QA闭环+回归扫描
    关键词:discovery, scan, issue, auditdiscovery自动识别为发现模式
    关键词:test, coverage, TDD, verifytesting自动识别为测试模式
    无显式参数且无关键词匹配full默认使用全量QA模式
  4. 歧义澄清(AUTO_YES模式下跳过):
    javascript
    AskUserQuestion({
      questions: [{
        question: "Detected QA mode: '" + qaMode + "'. Confirm?",
        header: "QA Mode Selection",
        multiSelect: false,
        options: [
          { label: "Proceed with " + qaMode, description: "Detected mode is appropriate" },
          { label: "Use discovery", description: "Scout-first: scan for issues, then test" },
          { label: "Use testing", description: "Direct testing pipeline (skip scout)" },
          { label: "Use full", description: "Complete QA closed loop with regression" }
        ]
      }]
    })
  5. 输出: 精细化需求、QA模式、覆盖范围
成功判定标准:
  • 已选定QA模式
  • 已生成可供阶段1拆解的精细化需求

Phase 1: Requirement -> CSV + Classification

阶段1: 需求拆解为CSV+分类

Objective: Decompose QA task into dependency-ordered CSV tasks based on selected mode.
Decomposition Rules:
  1. Select pipeline based on QA mode:
    ModePipeline
    discoverySCOUT-001 -> QASTRAT-001 -> QAGEN-001 -> QARUN-001 -> QAANA-001
    testingQASTRAT-001 -> QAGEN-L1-001 -> QARUN-L1-001 -> QAGEN-L2-001 -> QARUN-L2-001 -> QAANA-001
    fullSCOUT-001 -> QASTRAT-001 -> [QAGEN-L1-001, QAGEN-L2-001] -> [QARUN-L1-001, QARUN-L2-001] -> QAANA-001 -> SCOUT-002
  2. Assign roles, layers, perspectives, and coverage targets per task
  3. Assign exec_mode:
    • Scout, Strategist, Generator, Analyst tasks:
      csv-wave
      (single-pass)
    • Executor tasks:
      interactive
      (iterative fix cycle)
Classification Rules:
Task Propertyexec_mode
Multi-perspective scanning (single-pass)
csv-wave
Strategy analysis (single-pass read + write)
csv-wave
Test code generation (single-pass write)
csv-wave
Test execution with fix loop (multi-round)
interactive
Quality analysis (single-pass read + write)
csv-wave
Regression scanning (single-pass)
csv-wave
Wave Computation: Kahn's BFS topological sort with depth tracking.
User Validation: Display task breakdown with wave + exec_mode + role assignment (skip if AUTO_YES).
Success Criteria:
  • tasks.csv created with valid schema, wave, and exec_mode assignments
  • No circular dependencies
  • User approved (or AUTO_YES)

目标: 基于选定的QA模式将QA任务拆解为按依赖排序的CSV任务。
拆解规则:
  1. 基于QA模式选择流水线:
    模式流水线
    discoverySCOUT-001 -> QASTRAT-001 -> QAGEN-001 -> QARUN-001 -> QAANA-001
    testingQASTRAT-001 -> QAGEN-L1-001 -> QARUN-L1-001 -> QAGEN-L2-001 -> QARUN-L2-001 -> QAANA-001
    fullSCOUT-001 -> QASTRAT-001 -> [QAGEN-L1-001, QAGEN-L2-001] -> [QARUN-L1-001, QARUN-L2-001] -> QAANA-001 -> SCOUT-002
  2. 为每个任务分配角色、层级、视角和覆盖度目标
  3. 分配exec_mode:
    • 侦察员、策略师、生成器、分析师任务:
      csv-wave
      (单次执行)
    • 执行器任务:
      interactive
      (迭代修复循环)
分类规则:
任务属性exec_mode
多视角扫描(单次执行)
csv-wave
策略分析(单次读写)
csv-wave
测试代码生成(单次写入)
csv-wave
带修复循环的测试执行(多轮)
interactive
质量分析(单次读写)
csv-wave
回归扫描(单次执行)
csv-wave
批次计算: 带深度追踪的Kahn BFS拓扑排序。
用户校验: 展示包含批次+exec_mode+角色分配的任务拆解(AUTO_YES模式下跳过)。
成功判定标准:
  • 已生成符合Schema、批次和exec_mode分配正确的tasks.csv
  • 无循环依赖
  • 已获得用户确认(或AUTO_YES模式)

Phase 2: Wave Execution Engine (Extended)

阶段2: 批次执行引擎(扩展版)

Objective: Execute tasks wave-by-wave with hybrid mechanism support, GC loop handling, and cross-wave context propagation.
javascript
const masterCsv = Read(`${sessionFolder}/tasks.csv`)
let tasks = parseCsv(masterCsv)
const maxWave = Math.max(...tasks.map(t => t.wave))

for (let wave = 1; wave <= maxWave; wave++) {
  console.log(`\nWave ${wave}/${maxWave}`)

  // 1. Separate tasks by exec_mode
  const waveTasks = tasks.filter(t => t.wave === wave && t.status === 'pending')
  const csvTasks = waveTasks.filter(t => t.exec_mode === 'csv-wave')
  const interactiveTasks = waveTasks.filter(t => t.exec_mode === 'interactive')

  // 2. Check dependencies -- skip tasks whose deps failed
  for (const task of waveTasks) {
    const depIds = (task.deps || '').split(';').filter(Boolean)
    const depStatuses = depIds.map(id => tasks.find(t => t.id === id)?.status)
    if (depStatuses.some(s => s === 'failed' || s === 'skipped')) {
      task.status = 'skipped'
      task.error = `Dependency failed: ${depIds.filter((id, i) =>
        ['failed','skipped'].includes(depStatuses[i])).join(', ')}`
    }
  }

  // 3. Execute csv-wave tasks
  const pendingCsvTasks = csvTasks.filter(t => t.status === 'pending')
  if (pendingCsvTasks.length > 0) {
    for (const task of pendingCsvTasks) {
      task.prev_context = buildPrevContext(task, tasks)
    }

    Write(`${sessionFolder}/wave-${wave}.csv`, toCsv(pendingCsvTasks))

    // Read instruction template
    Read(`instructions/agent-instruction.md`)

    // Build instruction with session folder baked in
    const instruction = buildQAInstruction(sessionFolder, wave)

    spawn_agents_on_csv({
      csv_path: `${sessionFolder}/wave-${wave}.csv`,
      id_column: "id",
      instruction: instruction,
      max_concurrency: maxConcurrency,
      max_runtime_seconds: 900,
      output_csv_path: `${sessionFolder}/wave-${wave}-results.csv`,
      output_schema: {
        type: "object",
        properties: {
          id: { type: "string" },
          status: { type: "string", enum: ["completed", "failed"] },
          findings: { type: "string" },
          issues_found: { type: "string" },
          pass_rate: { type: "string" },
          coverage_achieved: { type: "string" },
          test_files: { type: "string" },
          quality_score: { type: "string" },
          error: { type: "string" }
        }
      }
    })

    // Merge results
    const results = parseCsv(Read(`${sessionFolder}/wave-${wave}-results.csv`))
    for (const r of results) {
      const t = tasks.find(t => t.id === r.id)
      if (t) Object.assign(t, r)
    }
  }

  // 4. Execute interactive tasks (executor with fix cycle)
  const pendingInteractive = interactiveTasks.filter(t => t.status === 'pending')
  for (const task of pendingInteractive) {
    Read(`agents/executor.md`)

    const prevContext = buildPrevContext(task, tasks)
    const agent = spawn_agent({
      message: `## TASK ASSIGNMENT\n\n### MANDATORY FIRST STEPS\n1. Read: agents/executor.md\n2. Read: ${sessionFolder}/discoveries.ndjson\n3. Read: .workflow/project-tech.json (if exists)\n\n---\n\nGoal: ${task.description}\nLayer: ${task.layer}\nCoverage Target: ${task.coverage_target}%\nSession: ${sessionFolder}\n\n### Previous Context\n${prevContext}`
    })
    const result = wait({ ids: [agent], timeout_ms: 900000 })
    if (result.timed_out) {
      send_input({ id: agent, message: "Please finalize current test results and report." })
      wait({ ids: [agent], timeout_ms: 120000 })
    }
    Write(`${sessionFolder}/interactive/${task.id}-result.json`, JSON.stringify({
      task_id: task.id, status: "completed", findings: parseFindings(result),
      timestamp: getUtc8ISOString()
    }))
    close_agent({ id: agent })
    task.status = result.success ? 'completed' : 'failed'
    task.findings = parseFindings(result)
  }

  // 5. GC Loop Check (after executor completes)
  for (const task of pendingInteractive.filter(t => t.role === 'executor')) {
    const gcState = JSON.parse(Read(`${sessionFolder}/gc-state.json`))
    const layer = task.layer
    const rounds = gcState.rounds[layer] || 0
    const coverageAchieved = parseFloat(task.coverage_achieved || '0')
    const coverageTarget = parseFloat(task.coverage_target || '80')
    const passRate = parseFloat(task.pass_rate || '0')

    if (coverageAchieved < coverageTarget && passRate < 0.95 && rounds < 3) {
      gcState.rounds[layer] = rounds + 1
      Write(`${sessionFolder}/gc-state.json`, JSON.stringify(gcState, null, 2))

      Read(`agents/gc-loop-handler.md`)
      const gcAgent = spawn_agent({
        message: `## GC LOOP ROUND ${rounds + 1}\n\n### MANDATORY FIRST STEPS\n1. Read: agents/gc-loop-handler.md\n2. Read: ${sessionFolder}/discoveries.ndjson\n\nLayer: ${layer}\nRound: ${rounds + 1}/3\nCurrent Coverage: ${coverageAchieved}%\nTarget: ${coverageTarget}%\nPass Rate: ${passRate}\nSession: ${sessionFolder}\nPrevious Results: ${sessionFolder}/results/run-${layer}.json\nTest Directory: ${sessionFolder}/tests/${layer === 'L1' ? 'L1-unit' : layer === 'L2' ? 'L2-integration' : 'L3-e2e'}/`
      })
      const gcResult = wait({ ids: [gcAgent], timeout_ms: 900000 })
      close_agent({ id: gcAgent })
    }
  }

  // 6. Update master CSV
  Write(`${sessionFolder}/tasks.csv`, toCsv(tasks))

  // 7. Cleanup temp files
  Bash(`rm -f ${sessionFolder}/wave-${wave}.csv ${sessionFolder}/wave-${wave}-results.csv`)

  // 8. Display wave summary
  const completed = waveTasks.filter(t => t.status === 'completed').length
  const failed = waveTasks.filter(t => t.status === 'failed').length
  const skipped = waveTasks.filter(t => t.status === 'skipped').length
  console.log(`Wave ${wave} Complete: ${completed} completed, ${failed} failed, ${skipped} skipped`)
}
Success Criteria:
  • All waves executed in order
  • Both csv-wave and interactive tasks handled per wave
  • Each wave's results merged into master CSV before next wave starts
  • GC loops triggered when coverage below target (max 3 rounds per layer)
  • Dependent tasks skipped when predecessor failed
  • discoveries.ndjson accumulated across all waves and mechanisms

目标: 逐批次执行任务,支持混合执行机制、GC循环处理和跨批次上下文传递。
javascript
const masterCsv = Read(`${sessionFolder}/tasks.csv`)
let tasks = parseCsv(masterCsv)
const maxWave = Math.max(...tasks.map(t => t.wave))

for (let wave = 1; wave <= maxWave; wave++) {
  console.log(`\nWave ${wave}/${maxWave}`)

  // 1. 按exec_mode拆分任务
  const waveTasks = tasks.filter(t => t.wave === wave && t.status === 'pending')
  const csvTasks = waveTasks.filter(t => t.exec_mode === 'csv-wave')
  const interactiveTasks = waveTasks.filter(t => t.exec_mode === 'interactive')

  // 2. 检查依赖 -- 跳过依赖失败的任务
  for (const task of waveTasks) {
    const depIds = (task.deps || '').split(';').filter(Boolean)
    const depStatuses = depIds.map(id => tasks.find(t => t.id === id)?.status)
    if (depStatuses.some(s => s === 'failed' || s === 'skipped')) {
      task.status = 'skipped'
      task.error = `Dependency failed: ${depIds.filter((id, i) =>
        ['failed','skipped'].includes(depStatuses[i])).join(', ')}`
    }
  }

  // 3. 执行csv-wave任务
  const pendingCsvTasks = csvTasks.filter(t => t.status === 'pending')
  if (pendingCsvTasks.length > 0) {
    for (const task of pendingCsvTasks) {
      task.prev_context = buildPrevContext(task, tasks)
    }

    Write(`${sessionFolder}/wave-${wave}.csv`, toCsv(pendingCsvTasks))

    // 读取指令模板
    Read(`instructions/agent-instruction.md`)

    // 构建嵌入会话目录的指令
    const instruction = buildQAInstruction(sessionFolder, wave)

    spawn_agents_on_csv({
      csv_path: `${sessionFolder}/wave-${wave}.csv`,
      id_column: "id",
      instruction: instruction,
      max_concurrency: maxConcurrency,
      max_runtime_seconds: 900,
      output_csv_path: `${sessionFolder}/wave-${wave}-results.csv`,
      output_schema: {
        type: "object",
        properties: {
          id: { type: "string" },
          status: { type: "string", enum: ["completed", "failed"] },
          findings: { type: "string" },
          issues_found: { type: "string" },
          pass_rate: { type: "string" },
          coverage_achieved: { type: "string" },
          test_files: { type: "string" },
          quality_score: { type: "string" },
          error: { type: "string" }
        }
      }
    })

    // 合并结果
    const results = parseCsv(Read(`${sessionFolder}/wave-${wave}-results.csv`))
    for (const r of results) {
      const t = tasks.find(t => t.id === r.id)
      if (t) Object.assign(t, r)
    }
  }

  // 4. 执行交互式任务(带修复循环的执行器)
  const pendingInteractive = interactiveTasks.filter(t => t.status === 'pending')
  for (const task of pendingInteractive) {
    Read(`agents/executor.md`)

    const prevContext = buildPrevContext(task, tasks)
    const agent = spawn_agent({
      message: `## TASK ASSIGNMENT\n\n### MANDATORY FIRST STEPS\n1. Read: agents/executor.md\n2. Read: ${sessionFolder}/discoveries.ndjson\n3. Read: .workflow/project-tech.json (if exists)\n\n---\n\nGoal: ${task.description}\nLayer: ${task.layer}\nCoverage Target: ${task.coverage_target}%\nSession: ${sessionFolder}\n\n### Previous Context\n${prevContext}`
    })
    const result = wait({ ids: [agent], timeout_ms: 900000 })
    if (result.timed_out) {
      send_input({ id: agent, message: "Please finalize current test results and report." })
      wait({ ids: [agent], timeout_ms: 120000 })
    }
    Write(`${sessionFolder}/interactive/${task.id}-result.json`, JSON.stringify({
      task_id: task.id, status: "completed", findings: parseFindings(result),
      timestamp: getUtc8ISOString()
    }))
    close_agent({ id: agent })
    task.status = result.success ? 'completed' : 'failed'
    task.findings = parseFindings(result)
  }

  // 5. GC循环检查(执行器完成后)
  for (const task of pendingInteractive.filter(t => t.role === 'executor')) {
    const gcState = JSON.parse(Read(`${sessionFolder}/gc-state.json`))
    const layer = task.layer
    const rounds = gcState.rounds[layer] || 0
    const coverageAchieved = parseFloat(task.coverage_achieved || '0')
    const coverageTarget = parseFloat(task.coverage_target || '80')
    const passRate = parseFloat(task.pass_rate || '0')

    if (coverageAchieved < coverageTarget && passRate < 0.95 && rounds < 3) {
      gcState.rounds[layer] = rounds + 1
      Write(`${sessionFolder}/gc-state.json`, JSON.stringify(gcState, null, 2))

      Read(`agents/gc-loop-handler.md`)
      const gcAgent = spawn_agent({
        message: `## GC LOOP ROUND ${rounds + 1}\n\n### MANDATORY FIRST STEPS\n1. Read: agents/gc-loop-handler.md\n2. Read: ${sessionFolder}/discoveries.ndjson\n\nLayer: ${layer}\nRound: ${rounds + 1}/3\nCurrent Coverage: ${coverageAchieved}%\nTarget: ${coverageTarget}%\nPass Rate: ${passRate}\nSession: ${sessionFolder}\nPrevious Results: ${sessionFolder}/results/run-${layer}.json\nTest Directory: ${sessionFolder}/tests/${layer === 'L1' ? 'L1-unit' : layer === 'L2' ? 'L2-integration' : 'L3-e2e'}/`
      })
      const gcResult = wait({ ids: [gcAgent], timeout_ms: 900000 })
      close_agent({ id: gcAgent })
    }
  }

  // 6. 更新总控CSV
  Write(`${sessionFolder}/tasks.csv`, toCsv(tasks))

  // 7. 清理临时文件
  Bash(`rm -f ${sessionFolder}/wave-${wave}.csv ${sessionFolder}/wave-${wave}-results.csv`)

  // 8. 展示批次汇总
  const completed = waveTasks.filter(t => t.status === 'completed').length
  const failed = waveTasks.filter(t => t.status === 'failed').length
  const skipped = waveTasks.filter(t => t.status === 'skipped').length
  console.log(`Wave ${wave} Complete: ${completed} completed, ${failed} failed, ${skipped} skipped`)
}
成功判定标准:
  • 所有批次按顺序执行
  • 每个批次的csv-wave和交互式任务都已处理
  • 下一批次开始前当前批次结果已合并到总控CSV
  • 覆盖度低于目标时触发GC循环(每层最多3轮)
  • 前置任务失败时跳过依赖任务
  • discoveries.ndjson已累计所有批次和执行机制的发现结果

Phase 3: Post-Wave Interactive (Completion Action)

阶段3: 批次后交互(完成动作)

Objective: Pipeline completion report with quality score and interactive completion choice.
javascript
const tasks = parseCsv(Read(`${sessionFolder}/tasks.csv`))
const completed = tasks.filter(t => t.status === 'completed')
const failed = tasks.filter(t => t.status === 'failed')

// Quality score from analyst
const analystTask = tasks.find(t => t.role === 'analyst' && t.status === 'completed')
const qualityScore = analystTask?.quality_score || 'N/A'

// Scout issues count
const scoutTasks = tasks.filter(t => t.role === 'scout' && t.status === 'completed')
const totalIssues = scoutTasks.reduce((sum, t) => sum + parseInt(t.issues_found || '0'), 0)

// Coverage summary per layer
const layerSummary = ['L1', 'L2', 'L3'].map(layer => {
  const execTask = tasks.find(t => t.role === 'executor' && t.layer === layer && t.status === 'completed')
  return execTask ? `  ${layer}: ${execTask.coverage_achieved}% coverage, ${execTask.pass_rate} pass rate` : null
}).filter(Boolean).join('\n')

console.log(`
============================================
QA PIPELINE COMPLETE

Quality Score: ${qualityScore}/100
Issues Discovered: ${totalIssues}

Deliverables:
${completed.map(t => `  - ${t.id}: ${t.title} (${t.role})`).join('\n')}

Coverage:
${layerSummary}

Pipeline: ${completed.length}/${tasks.length} tasks
Session: ${sessionFolder}
============================================
`)

if (!AUTO_YES) {
  AskUserQuestion({
    questions: [{
      question: "Quality Assurance pipeline complete. What would you like to do?",
      header: "Completion",
      multiSelect: false,
      options: [
        { label: "Archive & Clean (Recommended)", description: "Archive session, output final summary" },
        { label: "Keep Active", description: "Keep session for follow-up work" },
        { label: "Export Results", description: "Export deliverables to target directory" }
      ]
    }]
  })
}
Success Criteria:
  • Post-wave interactive processing complete
  • Quality score and coverage metrics displayed
  • User informed of results

目标: 输出带质量评分的流水线完成报告和交互式完成选项。
javascript
const tasks = parseCsv(Read(`${sessionFolder}/tasks.csv`))
const completed = tasks.filter(t => t.status === 'completed')
const failed = tasks.filter(t => t.status === 'failed')

// 分析师输出的质量评分
const analystTask = tasks.find(t => t.role === 'analyst' && t.status === 'completed')
const qualityScore = analystTask?.quality_score || 'N/A'

// 侦察员发现的问题总数
const scoutTasks = tasks.filter(t => t.role === 'scout' && t.status === 'completed')
const totalIssues = scoutTasks.reduce((sum, t) => sum + parseInt(t.issues_found || '0'), 0)

// 分层覆盖度汇总
const layerSummary = ['L1', 'L2', 'L3'].map(layer => {
  const execTask = tasks.find(t => t.role === 'executor' && t.layer === layer && t.status === 'completed')
  return execTask ? `  ${layer}: ${execTask.coverage_achieved}% coverage, ${execTask.pass_rate} pass rate` : null
}).filter(Boolean).join('\n')

console.log(`
============================================
QA PIPELINE COMPLETE

Quality Score: ${qualityScore}/100
Issues Discovered: ${totalIssues}

Deliverables:
${completed.map(t => `  - ${t.id}: ${t.title} (${t.role})`).join('\n')}

Coverage:
${layerSummary}

Pipeline: ${completed.length}/${tasks.length} tasks
Session: ${sessionFolder}
============================================
`)

if (!AUTO_YES) {
  AskUserQuestion({
    questions: [{
      question: "Quality Assurance pipeline complete. What would you like to do?",
      header: "Completion",
      multiSelect: false,
      options: [
        { label: "Archive & Clean (Recommended)", description: "Archive session, output final summary" },
        { label: "Keep Active", description: "Keep session for follow-up work" },
        { label: "Export Results", description: "Export deliverables to target directory" }
      ]
    }]
  })
}
成功判定标准:
  • 批次后交互处理完成
  • 已展示质量评分和覆盖度指标
  • 用户已获知结果

Phase 4: Results Aggregation

阶段4: 结果聚合

Objective: Generate final results and human-readable report.
javascript
// 1. Export results.csv
Bash(`cp ${sessionFolder}/tasks.csv ${sessionFolder}/results.csv`)

// 2. Generate context.md
const tasks = parseCsv(Read(`${sessionFolder}/tasks.csv`))
const gcState = JSON.parse(Read(`${sessionFolder}/gc-state.json`))
const analystTask = tasks.find(t => t.role === 'analyst' && t.status === 'completed')

let contextMd = `# Team Quality Assurance Report\n\n`
contextMd += `**Session**: ${sessionId}\n`
contextMd += `**Date**: ${getUtc8ISOString().substring(0, 10)}\n`
contextMd += `**QA Mode**: ${explicitMode || 'full'}\n`
contextMd += `**Quality Score**: ${analystTask?.quality_score || 'N/A'}/100\n\n`

contextMd += `## Summary\n`
contextMd += `| Status | Count |\n|--------|-------|\n`
contextMd += `| Completed | ${tasks.filter(t => t.status === 'completed').length} |\n`
contextMd += `| Failed | ${tasks.filter(t => t.status === 'failed').length} |\n`
contextMd += `| Skipped | ${tasks.filter(t => t.status === 'skipped').length} |\n\n`

// Scout findings
const scoutTasks = tasks.filter(t => t.role === 'scout' && t.status === 'completed')
if (scoutTasks.length > 0) {
  contextMd += `## Scout Findings\n\n`
  for (const t of scoutTasks) {
    contextMd += `**${t.title}**: ${t.issues_found || 0} issues found\n${t.findings || ''}\n\n`
  }
}

// Coverage results
contextMd += `## Coverage Results\n\n`
contextMd += `| Layer | Coverage | Target | Pass Rate | GC Rounds |\n`
contextMd += `|-------|----------|--------|-----------|----------|\n`
for (const layer of ['L1', 'L2', 'L3']) {
  const execTask = tasks.find(t => t.role === 'executor' && t.layer === layer)
  if (execTask) {
    contextMd += `| ${layer} | ${execTask.coverage_achieved || 'N/A'}% | ${execTask.coverage_target}% | ${execTask.pass_rate || 'N/A'} | ${gcState.rounds[layer] || 0} |\n`
  }
}
contextMd += '\n'

// Wave execution details
const maxWave = Math.max(...tasks.map(t => t.wave))
contextMd += `## Wave Execution\n\n`
for (let w = 1; w <= maxWave; w++) {
  const waveTasks = tasks.filter(t => t.wave === w)
  contextMd += `### Wave ${w}\n\n`
  for (const t of waveTasks) {
    const icon = t.status === 'completed' ? '[DONE]' : t.status === 'failed' ? '[FAIL]' : '[SKIP]'
    contextMd += `${icon} **${t.title}** [${t.role}/${t.layer || '-'}] ${t.findings || ''}\n\n`
  }
}

Write(`${sessionFolder}/context.md`, contextMd)

console.log(`Results exported to: ${sessionFolder}/results.csv`)
console.log(`Report generated at: ${sessionFolder}/context.md`)
Success Criteria:
  • results.csv exported (all tasks, both modes)
  • context.md generated with quality score, scout findings, and coverage breakdown
  • Summary displayed to user

目标: 生成最终结果和可读性报告。
javascript
// 1. 导出results.csv
Bash(`cp ${sessionFolder}/tasks.csv ${sessionFolder}/results.csv`)

// 2. 生成context.md
const tasks = parseCsv(Read(`${sessionFolder}/tasks.csv`))
const gcState = JSON.parse(Read(`${sessionFolder}/gc-state.json`))
const analystTask = tasks.find(t => t.role === 'analyst' && t.status === 'completed')

let contextMd = `# Team Quality Assurance Report\n\n`
contextMd += `**Session**: ${sessionId}\n`
contextMd += `**Date**: ${getUtc8ISOString().substring(0, 10)}\n`
contextMd += `**QA Mode**: ${explicitMode || 'full'}\n`
contextMd += `**Quality Score**: ${analystTask?.quality_score || 'N/A'}/100\n\n`

contextMd += `## Summary\n`
contextMd += `| Status | Count |\n|--------|-------|\n`
contextMd += `| Completed | ${tasks.filter(t => t.status === 'completed').length} |\n`
contextMd += `| Failed | ${tasks.filter(t => t.status === 'failed').length} |\n`
contextMd += `| Skipped | ${tasks.filter(t => t.status === 'skipped').length} |\n\n`

// 侦察员发现结果
const scoutTasks = tasks.filter(t => t.role === 'scout' && t.status === 'completed')
if (scoutTasks.length > 0) {
  contextMd += `## Scout Findings\n\n`
  for (const t of scoutTasks) {
    contextMd += `**${t.title}**: ${t.issues_found || 0} issues found\n${t.findings || ''}\n\n`
  }
}

// 覆盖度结果
contextMd += `## Coverage Results\n\n`
contextMd += `| Layer | Coverage | Target | Pass Rate | GC Rounds |\n`
contextMd += `|-------|----------|--------|-----------|----------|\n`
for (const layer of ['L1', 'L2', 'L3']) {
  const execTask = tasks.find(t => t.role === 'executor' && t.layer === layer)
  if (execTask) {
    contextMd += `| ${layer} | ${execTask.coverage_achieved || 'N/A'}% | ${execTask.coverage_target}% | ${execTask.pass_rate || 'N/A'} | ${gcState.rounds[layer] || 0} |\n`
  }
}
contextMd += '\n'

// 批次执行详情
const maxWave = Math.max(...tasks.map(t => t.wave))
contextMd += `## Wave Execution\n\n`
for (let w = 1; w <= maxWave; w++) {
  const waveTasks = tasks.filter(t => t.wave === w)
  contextMd += `### Wave ${w}\n\n`
  for (const t of waveTasks) {
    const icon = t.status === 'completed' ? '[DONE]' : t.status === 'failed' ? '[FAIL]' : '[SKIP]'
    contextMd += `${icon} **${t.title}** [${t.role}/${t.layer || '-'}] ${t.findings || ''}\n\n`
  }
}

Write(`${sessionFolder}/context.md`, contextMd)

console.log(`Results exported to: ${sessionFolder}/results.csv`)
console.log(`Report generated at: ${sessionFolder}/context.md`)
成功判定标准:
  • 已导出results.csv(包含所有模式的所有任务)
  • 已生成包含质量评分、侦察员发现、覆盖度拆解的context.md
  • 已向用户展示汇总信息

Shared Discovery Board Protocol

共享探索看板协议

All agents (csv-wave and interactive) share a single
discoveries.ndjson
file for cross-task knowledge exchange.
Format: One JSON object per line (NDJSON):
jsonl
{"ts":"2026-03-08T10:00:00Z","worker":"SCOUT-001","type":"issue_found","data":{"file":"src/auth.ts","line":42,"severity":"high","perspective":"security","description":"Hardcoded secret key in auth module"}}
{"ts":"2026-03-08T10:05:00Z","worker":"QASTRAT-001","type":"framework_detected","data":{"framework":"vitest","config_file":"vitest.config.ts","test_pattern":"**/*.test.ts"}}
{"ts":"2026-03-08T10:10:00Z","worker":"QAGEN-L1-001","type":"test_generated","data":{"file":"tests/L1-unit/auth.test.ts","source_file":"src/auth.ts","test_count":8}}
{"ts":"2026-03-08T10:15:00Z","worker":"QARUN-L1-001","type":"defect_found","data":{"file":"src/auth.ts","line":42,"pattern":"null_reference","description":"Missing null check on token payload"}}
Discovery Types:
TypeData SchemaDescription
issue_found
{file, line, severity, perspective, description}
Issue discovered by scout
framework_detected
{framework, config_file, test_pattern}
Test framework identified
test_generated
{file, source_file, test_count}
Test file created
defect_found
{file, line, pattern, description}
Defect pattern discovered during testing
coverage_gap
{file, current, target, gap}
Coverage gap identified
convention_found
{pattern, example_file, description}
Test convention detected
fix_applied
{test_file, fix_type, description}
Test fix during GC loop
quality_metric
{dimension, score, details}
Quality dimension score
Protocol:
  1. Agents MUST read discoveries.ndjson at start of execution
  2. Agents MUST append relevant discoveries during execution
  3. Agents MUST NOT modify or delete existing entries
  4. Deduplication by
    {type, data.file, data.line}
    key (where applicable)

所有Agent(csv-wave和交互式)共用单个
discoveries.ndjson
文件实现跨任务知识交换。
格式: 每行一个JSON对象(NDJSON):
jsonl
{"ts":"2026-03-08T10:00:00Z","worker":"SCOUT-001","type":"issue_found","data":{"file":"src/auth.ts","line":42,"severity":"high","perspective":"security","description":"Hardcoded secret key in auth module"}}
{"ts":"2026-03-08T10:05:00Z","worker":"QASTRAT-001","type":"framework_detected","data":{"framework":"vitest","config_file":"vitest.config.ts","test_pattern":"**/*.test.ts"}}
{"ts":"2026-03-08T10:10:00Z","worker":"QAGEN-L1-001","type":"test_generated","data":{"file":"tests/L1-unit/auth.test.ts","source_file":"src/auth.ts","test_count":8}}
{"ts":"2026-03-08T10:15:00Z","worker":"QARUN-L1-001","type":"defect_found","data":{"file":"src/auth.ts","line":42,"pattern":"null_reference","description":"Missing null check on token payload"}}
发现类型:
类型数据Schema描述
issue_found
{file, line, severity, perspective, description}
侦察员发现的问题
framework_detected
{framework, config_file, test_pattern}
识别到的测试框架
test_generated
{file, source_file, test_count}
生成的测试文件
defect_found
{file, line, pattern, description}
测试过程中发现的缺陷模式
coverage_gap
{file, current, target, gap}
识别到的覆盖度缺口
convention_found
{pattern, example_file, description}
检测到的测试规范
fix_applied
{test_file, fix_type, description}
GC循环中应用的测试修复
quality_metric
{dimension, score, details}
质量维度评分
协议规则:
  1. Agent执行开始时必须读取discoveries.ndjson
  2. Agent执行过程中必须追加相关发现结果
  3. Agent不得修改或删除已有条目
  4. {type, data.file, data.line}
    键去重(适用场景下)

Pipeline Definitions

流水线定义

Discovery Mode (5 tasks, serial)

发现模式(5个任务,串行)

SCOUT-001 -> QASTRAT-001 -> QAGEN-001 -> QARUN-001 -> QAANA-001
Task IDRoleLayerWaveexec_mode
SCOUT-001scout-1csv-wave
QASTRAT-001strategist-2csv-wave
QAGEN-001generatorL13csv-wave
QARUN-001executorL14interactive
QAANA-001analyst-5csv-wave
SCOUT-001 -> QASTRAT-001 -> QAGEN-001 -> QARUN-001 -> QAANA-001
任务ID角色层级批次exec_mode
SCOUT-001scout-1csv-wave
QASTRAT-001strategist-2csv-wave
QAGEN-001generatorL13csv-wave
QARUN-001executorL14interactive
QAANA-001analyst-5csv-wave

Testing Mode (6 tasks, progressive layers)

测试模式(6个任务,分层递进)

QASTRAT-001 -> QAGEN-L1-001 -> QARUN-L1-001 -> QAGEN-L2-001 -> QARUN-L2-001 -> QAANA-001
Task IDRoleLayerWaveexec_mode
QASTRAT-001strategist-1csv-wave
QAGEN-L1-001generatorL12csv-wave
QARUN-L1-001executorL13interactive
QAGEN-L2-001generatorL24csv-wave
QARUN-L2-001executorL25interactive
QAANA-001analyst-6csv-wave
QASTRAT-001 -> QAGEN-L1-001 -> QARUN-L1-001 -> QAGEN-L2-001 -> QARUN-L2-001 -> QAANA-001
任务ID角色层级批次exec_mode
QASTRAT-001strategist-1csv-wave
QAGEN-L1-001generatorL12csv-wave
QARUN-L1-001executorL13interactive
QAGEN-L2-001generatorL24csv-wave
QARUN-L2-001executorL25interactive
QAANA-001analyst-6csv-wave

Full Mode (8 tasks, parallel windows + regression)

全量模式(8个任务,并行窗口+回归)

SCOUT-001 -> QASTRAT-001 -> [QAGEN-L1-001 // QAGEN-L2-001] -> [QARUN-L1-001 // QARUN-L2-001] -> QAANA-001 -> SCOUT-002
Task IDRoleLayerWaveexec_mode
SCOUT-001scout-1csv-wave
QASTRAT-001strategist-2csv-wave
QAGEN-L1-001generatorL13csv-wave
QAGEN-L2-001generatorL23csv-wave
QARUN-L1-001executorL14interactive
QARUN-L2-001executorL24interactive
QAANA-001analyst-5csv-wave
SCOUT-002scout-6csv-wave

SCOUT-001 -> QASTRAT-001 -> [QAGEN-L1-001 // QAGEN-L2-001] -> [QARUN-L1-001 // QARUN-L2-001] -> QAANA-001 -> SCOUT-002
任务ID角色层级批次exec_mode
SCOUT-001scout-1csv-wave
QASTRAT-001strategist-2csv-wave
QAGEN-L1-001generatorL13csv-wave
QAGEN-L2-001generatorL23csv-wave
QARUN-L1-001executorL14interactive
QARUN-L2-001executorL24interactive
QAANA-001analyst-5csv-wave
SCOUT-002scout-6csv-wave

GC Loop (Generator-Critic)

GC循环(Generator-Critic)

Generator and executor iterate per test layer until coverage converges:
QAGEN -> QARUN -> (if coverage < target) -> GC Loop Handler
                  (if coverage >= target) -> next wave
  • Max iterations: 3 per layer
  • After 3 iterations: accept current coverage with warning
  • GC loop runs as interactive agent (gc-loop-handler.md) which internally generates fixes and re-runs tests

生成器和执行器按测试层迭代直到覆盖度收敛:
QAGEN -> QARUN -> (如果覆盖度<目标) -> GC Loop Handler
                  (如果覆盖度>=目标) -> 下一批次
  • 最大迭代次数:每层3次
  • 3次迭代后:接受当前覆盖度并给出警告
  • GC循环作为交互式Agent运行(gc-loop-handler.md),内部生成修复并重新运行测试

Scan Perspectives (Scout)

扫描视角(侦察员)

PerspectiveFocus
bugLogic errors, crash paths, null references
securityVulnerabilities, auth bypass, data exposure
test-coverageUntested code paths, missing assertions
code-qualityAnti-patterns, complexity, maintainability
uxUser-facing issues, accessibility (optional, when task mentions UX/UI)

视角关注方向
bug逻辑错误、崩溃路径、空引用
security漏洞、认证绕过、数据泄露
test-coverage未测试代码路径、缺失断言
code-quality反模式、复杂度、可维护性
ux用户侧问题、可访问性(可选,仅任务提到UX/UI时启用)

Error Handling

错误处理

ErrorResolution
Circular dependencyDetect in wave computation, abort with error message
CSV agent timeoutMark as failed in results, continue with wave
CSV agent failedMark as failed, skip dependent tasks in later waves
Interactive agent timeoutUrge convergence via send_input, then close if still timed out
Interactive agent failedMark as failed, skip dependents
All agents in wave failedLog error, offer retry or abort
CSV parse errorValidate CSV format before execution, show line number
discoveries.ndjson corruptIgnore malformed lines, continue with valid entries
Scout finds no issuesReport clean scan, proceed to testing (skip discovery-specific tasks)
GC loop exceeded (3 rounds)Accept current coverage with warning, proceed to next layer
Test framework not detectedDefault to Jest patterns
Coverage tool unavailableDegrade to pass rate judgment
quality_score < 60Report with WARNING, suggest re-run with deeper coverage
Continue mode: no session foundList available sessions, prompt user to select

错误解决方案
循环依赖批次计算时检测,输出错误信息并终止
CSV Agent超时标记为失败,继续执行当前批次
CSV Agent执行失败标记为失败,跳过后续批次的依赖任务
交互式Agent超时通过send_input催促收敛,仍超时则关闭
交互式Agent执行失败标记为失败,跳过依赖任务
批次内所有Agent失败记录错误,提供重试或终止选项
CSV解析错误执行前校验CSV格式,展示行号
discoveries.ndjson损坏忽略格式错误行,继续处理有效条目
侦察员未发现问题报告干净扫描结果,进入测试阶段(跳过发现模式专属任务)
GC循环超出上限(3轮)接受当前覆盖度并给出警告,进入下一层级
未检测到测试框架默认使用Jest模式
覆盖度工具不可用降级为通过率判断
质量评分<60输出WARNING,建议使用更深覆盖度重新运行
继续模式:未找到会话列出可用会话,提示用户选择

Core Rules

核心规则

  1. Start Immediately: First action is session initialization, then Phase 0/1
  2. Wave Order is Sacred: Never execute wave N before wave N-1 completes and results are merged
  3. CSV is Source of Truth: Master tasks.csv holds all state (both csv-wave and interactive)
  4. CSV First: Default to csv-wave for tasks; only use interactive when multi-round interaction is required
  5. Context Propagation: prev_context built from master CSV, not from memory
  6. Discovery Board is Append-Only: Never clear, modify, or recreate discoveries.ndjson
  7. Skip on Failure: If a dependency failed, skip the dependent task
  8. GC Loop Discipline: Max 3 rounds per layer; never infinite-loop on coverage
  9. Scout Feeds Strategy: Scout findings flow into strategist via prev_context and discoveries.ndjson
  10. Cleanup Temp Files: Remove wave-{N}.csv after results are merged
  11. DO NOT STOP: Continuous execution until all waves complete or all remaining tasks are skipped

  1. 立即启动: 第一步执行会话初始化,然后进入阶段0/1
  2. 批次顺序不可更改: 批次N-1执行完成并合并结果前,不得执行批次N
  3. CSV是唯一真值来源: 总控tasks.csv保存所有状态(包含csv-wave和交互式任务)
  4. CSV优先: 任务默认使用csv-wave模式,仅需要多轮交互时使用交互式
  5. 上下文传递: prev_context从总控CSV构建,而非内存
  6. 探索看板仅追加: 不得清空、修改或重建discoveries.ndjson
  7. 失败即跳过: 依赖任务失败时,跳过当前任务
  8. GC循环约束: 每层最多3轮,禁止无限循环追求覆盖度
  9. 侦察结果供给策略: 侦察员发现通过prev_context和discoveries.ndjson传递给策略师
  10. 临时文件清理: 结果合并后删除wave-{N}.csv
  11. 不得终止执行: 持续执行直到所有批次完成或所有剩余任务被跳过

Coordinator Role Constraints (Main Agent)

协调者角色约束(主Agent)

CRITICAL: The coordinator (main agent executing this skill) is responsible for orchestration only, NOT implementation.
  1. Coordinator Does NOT Execute Code: The main agent MUST NOT write, modify, or implement any code directly. All implementation work is delegated to spawned team agents. The coordinator only:
    • Spawns agents with task assignments
    • Waits for agent callbacks
    • Merges results and coordinates workflow
    • Manages workflow transitions between phases
  2. Patient Waiting is Mandatory: Agent execution takes significant time (typically 10-30 minutes per phase, sometimes longer). The coordinator MUST:
    • Wait patiently for
      wait()
      calls to complete
    • NOT skip workflow steps due to perceived delays
    • NOT assume agents have failed just because they're taking time
    • Trust the timeout mechanisms defined in the skill
  3. Use send_input for Clarification: When agents need guidance or appear stuck, the coordinator MUST:
    • Use
      send_input()
      to ask questions or provide clarification
    • NOT skip the agent or move to next phase prematurely
    • Give agents opportunity to respond before escalating
    • Example:
      send_input({ id: agent_id, message: "Please provide status update or clarify blockers" })
  4. No Workflow Shortcuts: The coordinator MUST NOT:
    • Skip phases or stages defined in the workflow
    • Bypass required approval or review steps
    • Execute dependent tasks before prerequisites complete
    • Assume task completion without explicit agent callback
    • Make up or fabricate agent results
  5. Respect Long-Running Processes: This is a complex multi-agent workflow that requires patience:
    • Total execution time may range from 30-90 minutes or longer
    • Each phase may take 10-30 minutes depending on complexity
    • The coordinator must remain active and attentive throughout the entire process
    • Do not terminate or skip steps due to time concerns
关键: 执行本工具的协调者(主Agent)仅负责编排,不负责具体实现。
  1. 协调者不执行代码: 主Agent不得直接编写、修改或实现任何代码。所有实现工作都委托给调度的团队Agent。协调者仅负责:
    • 为Agent分配任务并调度
    • 等待Agent回调
    • 合并结果并协调工作流
    • 管理阶段间的工作流跳转
  2. 必须耐心等待: Agent执行需要大量时间(通常每个阶段10-30分钟,有时更长)。协调者必须:
    • 耐心等待
      wait()
      调用完成
    • 不得因感知到延迟跳过工作流步骤
    • 不得仅因Agent执行时间长就判定为失败
    • 信任工具中定义的超时机制
  3. 使用send_input澄清问题: 当Agent需要指导或看起来卡住时,协调者必须:
    • 使用
      send_input()
      询问问题或提供澄清
    • 不得提前跳过Agent或进入下一个阶段
    • 升级问题前给Agent响应机会
    • 示例:
      send_input({ id: agent_id, message: "Please provide status update or clarify blockers" })
  4. 不得精简工作流: 协调者不得:
    • 跳过工作流中定义的阶段或步骤
    • 绕过要求的审批或审核步骤
    • 前置条件完成前执行依赖任务
    • 无明确Agent回调就假设任务完成
    • 编造或虚构Agent结果
  5. 尊重长运行流程: 这是复杂的多Agent工作流,需要耐心:
    • 总执行时间可能在30-90分钟或更长
    • 根据复杂度不同每个阶段可能需要10-30分钟
    • 协调者必须在整个过程中保持活跃和专注
    • 不得因时间问题终止或跳过步骤