kata-plan-phase

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese
<execution_context> @./references/ui-brand.md </execution_context>
<objective> Create executable phase prompts (PLAN.md files) for a roadmap phase with integrated research and verification.
Default flow: Research (if needed) → Plan → Verify → Done
Orchestrator role: Parse arguments, validate phase, research domain (unless skipped or exists), spawn kata-planner agent, verify plans with kata-plan-checker, iterate until plans pass or max iterations reached, present results.
Why subagents: Research and planning burn context fast. Verification uses fresh context. User sees the flow between agents in main context. </objective>
<context> Phase number: $ARGUMENTS (optional - auto-detects next unplanned phase if not provided)
Flags:
  • --research
    — Force re-research even if RESEARCH.md exists
  • --skip-research
    — Skip research entirely, go straight to planning
  • --gaps
    — Gap closure mode (reads VERIFICATION.md, skips research)
  • --skip-verify
    — Skip planner → checker verification loop
Normalize phase input in step 2 before any directory lookups. </context>
<process>
<execution_context> @./references/ui-brand.md </execution_context>
<objective> 为路线图阶段创建可执行的阶段提示(PLAN.md文件),并集成研究与验证环节。
默认流程: 研究(如有需要)→ 规划 → 验证 → 完成
编排器角色: 解析参数,验证阶段,研究领域(除非跳过或已有研究成果),启动kata-planner Agent,使用kata-plan-checker验证规划,迭代直至规划通过或达到最大迭代次数,展示结果。
为何使用子代理: 研究和规划会快速消耗上下文。验证环节使用全新上下文。用户可在主上下文中查看代理间的流转过程。 </objective>
<context> 阶段编号:$ARGUMENTS(可选 - 若未提供则自动检测下一个未规划的阶段)
标志位:
  • --research
    — 即使RESEARCH.md已存在,强制重新进行研究
  • --skip-research
    — 完全跳过研究环节,直接进入规划阶段
  • --gaps
    — 缺口补全模式(读取VERIFICATION.md,跳过研究)
  • --skip-verify
    — 跳过「规划器→校验器」的验证循环
在进行任何目录查找前,先在步骤2中标准化阶段输入内容。 </context>
<process>

1. Validate Environment and Resolve Model Profile

1. 验证环境并解析模型配置文件

bash
ls .planning/ 2>/dev/null
If not found: Error - user should run
/kata-new-project
first.
Resolve model profile for agent spawning:
bash
MODEL_PROFILE=$(cat .planning/config.json 2>/dev/null | grep -o '"model_profile"[[:space:]]*:[[:space:]]*"[^"]*"' | grep -o '"[^"]*"$' | tr -d '"' || echo "balanced")
Default to "balanced" if not set.
Model lookup table:
Agentqualitybalancedbudget
kata-phase-researcheropussonnethaiku
kata-planneropusopussonnet
kata-plan-checkersonnetsonnethaiku
Store resolved models for use in Task calls below.
bash
ls .planning/ 2>/dev/null
若未找到: 错误提示 - 用户应先运行
/kata-new-project
解析用于代理启动的模型配置文件:
bash
MODEL_PROFILE=$(cat .planning/config.json 2>/dev/null | grep -o '"model_profile"[[:space:]]*:[[:space:]]*"[^"]*"' | grep -o '"[^"]*"$' | tr -d '"' || echo "balanced")
若未设置,默认使用"balanced"。
模型查找表:
Agentqualitybalancedbudget
kata-phase-researcheropussonnethaiku
kata-planneropusopussonnet
kata-plan-checkersonnetsonnethaiku
存储解析后的模型,供后续Task调用使用。

2. Parse and Normalize Arguments

2. 解析并标准化参数

Extract from $ARGUMENTS:
  • Phase number (integer or decimal like
    2.1
    )
  • --research
    flag to force re-research
  • --skip-research
    flag to skip research
  • --gaps
    flag for gap closure mode
  • --skip-verify
    flag to bypass verification loop
If no phase number: Detect next unplanned phase from roadmap.
Normalize phase to zero-padded format:
bash
undefined
从$ARGUMENTS中提取:
  • 阶段编号(整数或小数格式,如
    2.1
  • --research
    标志位:强制重新研究
  • --skip-research
    标志位:跳过研究
  • --gaps
    标志位:缺口补全模式
  • --skip-verify
    标志位:绕过验证循环
若未提供阶段编号: 从路线图中检测下一个未规划的阶段。
将阶段编号标准化为带前导零的格式:
bash
undefined

Normalize phase number (8 → 08, but preserve decimals like 2.1 → 02.1)

标准化阶段编号(8 → 08,保留小数格式如2.1 → 02.1)

if [[ "$PHASE" =~ ^[0-9]+$ ]]; then PHASE=$(printf "%02d" "$PHASE") elif [[ "$PHASE" =~ ^([0-9]+).([0-9]+)$ ]]; then PHASE=$(printf "%02d.%s" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}") fi

**Check for existing research and plans (uses universal phase discovery):**

```bash
if [[ "$PHASE" =~ ^[0-9]+$ ]]; then PHASE=$(printf "%02d" "$PHASE") elif [[ "$PHASE" =~ ^([0-9]+).([0-9]+)$ ]]; then PHASE=$(printf "%02d.%s" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}") fi

**检查是否存在重复的研究和规划文件(使用通用阶段发现机制):**

```bash

Find phase directory across state subdirectories

在状态子目录中查找阶段目录

PADDED=$(printf "%02d" "$PHASE" 2>/dev/null || echo "$PHASE") PHASE_DIR="" for state in active pending completed; do PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1) [ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1) [ -n "$PHASE_DIR" ] && break done
PADDED=$(printf "%02d" "$PHASE" 2>/dev/null || echo "$PHASE") PHASE_DIR="" for state in active pending completed; do PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1) [ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1) [ -n "$PHASE_DIR" ] && break done

Fallback: flat directory (backward compatibility for unmigrated projects)

回退方案:平级目录(兼容未迁移的旧项目)

if [ -z "$PHASE_DIR" ]; then PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1) [ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1) fi
if [ -z "$PHASE_DIR" ]; then PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1) [ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1) fi

Collision check: detect duplicate phase numbering that requires migration

冲突检测:检测需要迁移的重复阶段编号

MATCH_COUNT=0 for state in active pending completed; do MATCH_COUNT=$((MATCH_COUNT + $(find .planning/phases/${state} -maxdepth 1 -type d -name "${PADDED}-*" 2>/dev/null | wc -l))) done
MATCH_COUNT=0 for state in active pending completed; do MATCH_COUNT=$((MATCH_COUNT + $(find .planning/phases/${state} -maxdepth 1 -type d -name "${PADDED}-*" 2>/dev/null | wc -l))) done

Include flat fallback matches

包含平级目录的匹配结果

MATCH_COUNT=$((MATCH_COUNT + $(find .planning/phases -maxdepth 1 -type d -name "${PADDED}-*" 2>/dev/null | wc -l)))
if [ "$MATCH_COUNT" -gt 1 ]; then echo "COLLISION: ${MATCH_COUNT} directories match prefix '${PADDED}-*' across phase states." echo "This project uses old per-milestone phase numbering that must be migrated first." fi

**If COLLISION detected (MATCH_COUNT > 1):** STOP planning. Invoke `/kata-migrate-phases` to renumber phases to globally sequential numbering. After migration completes, re-invoke `/kata-plan-phase` with the migrated phase number. Do NOT continue with ambiguous phase directories.

```bash
find "${PHASE_DIR}" -maxdepth 1 -name "*-RESEARCH.md" 2>/dev/null
find "${PHASE_DIR}" -maxdepth 1 -name "*-PLAN.md" 2>/dev/null
MATCH_COUNT=$((MATCH_COUNT + $(find .planning/phases -maxdepth 1 -type d -name "${PADDED}-*" 2>/dev/null | wc -l)))
if [ "$MATCH_COUNT" -gt 1 ]; then echo "COLLISION: ${MATCH_COUNT} directories match prefix '${PADDED}-*' across phase states." echo "This project uses old per-milestone phase numbering that must be migrated first." fi

**若检测到冲突(MATCH_COUNT > 1):** 停止规划。调用`/kata-migrate-phases`将阶段编号迁移为全局连续编号。迁移完成后,使用迁移后的阶段编号重新调用`/kata-plan-phase`。请勿继续处理存在歧义的阶段目录。

```bash
find "${PHASE_DIR}" -maxdepth 1 -name "*-RESEARCH.md" 2>/dev/null
find "${PHASE_DIR}" -maxdepth 1 -name "*-PLAN.md" 2>/dev/null

3. Validate Phase

3. 验证阶段

bash
grep -A5 "Phase ${PHASE}:" .planning/ROADMAP.md 2>/dev/null
If not found: Error with available phases. If found: Extract phase number, name, description.
bash
grep -A5 "Phase ${PHASE}:" .planning/ROADMAP.md 2>/dev/null
若未找到: 提示错误并列出可用阶段。若找到: 提取阶段编号、名称和描述。

4. Ensure Phase Directory Exists

4. 确保阶段目录存在

bash
undefined
bash
undefined

PHASE is already normalized (08, 02.1, etc.) from step 2

PHASE已在步骤2中标准化为(08、02.1等)格式

Use universal phase discovery: search active/pending/completed with flat fallback

使用通用阶段发现机制:在active/pending/completed目录中查找,平级目录作为回退

PADDED=$(printf "%02d" "$PHASE" 2>/dev/null || echo "$PHASE") PHASE_DIR="" for state in active pending completed; do PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1) [ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1) [ -n "$PHASE_DIR" ] && break done
PADDED=$(printf "%02d" "$PHASE" 2>/dev/null || echo "$PHASE") PHASE_DIR="" for state in active pending completed; do PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1) [ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases/${state} -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1) [ -n "$PHASE_DIR" ] && break done

Fallback: flat directory (backward compatibility for unmigrated projects)

回退方案:平级目录(兼容未迁移的旧项目)

if [ -z "$PHASE_DIR" ]; then PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1) [ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1) fi
if [ -z "$PHASE_DIR" ]; then

Create phase directory in pending/ from roadmap name

PHASE_NAME=$(grep "Phase ${PHASE}:" .planning/ROADMAP.md | sed 's/.Phase [0-9]: //' | tr '[:upper:]' '[:lower:]' | tr ' ' '-') mkdir -p ".planning/phases/pending/${PHASE}-${PHASE_NAME}" PHASE_DIR=".planning/phases/pending/${PHASE}-${PHASE_NAME}" fi
undefined
if [ -z "$PHASE_DIR" ]; then PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PADDED}-" 2>/dev/null | head -1) [ -z "$PHASE_DIR" ] && PHASE_DIR=$(find .planning/phases -maxdepth 1 -type d -name "${PHASE}-" 2>/dev/null | head -1) fi
if [ -z "$PHASE_DIR" ]; then

从路线图名称中获取阶段名称,在pending/目录中创建阶段目录

PHASE_NAME=$(grep "Phase ${PHASE}:" .planning/ROADMAP.md | sed 's/.Phase [0-9]: //' | tr '[:upper:]' '[:lower:]' | tr ' ' '-') mkdir -p ".planning/phases/pending/${PHASE}-${PHASE_NAME}" PHASE_DIR=".planning/phases/pending/${PHASE}-${PHASE_NAME}" fi
undefined

5. Handle Research

5. 处理研究环节

If
--gaps
flag:
Skip research (gap closure uses VERIFICATION.md instead).
If
--skip-research
flag:
Skip to step 6.
Check config for research setting:
bash
WORKFLOW_RESEARCH=$(cat .planning/config.json 2>/dev/null | grep -o '"research"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "true")
If
workflow.research
is
false
AND
--research
flag NOT set:
Skip to step 6.
Otherwise:
Check for existing research:
bash
find "${PHASE_DIR}" -maxdepth 1 -name "*-RESEARCH.md" 2>/dev/null
If RESEARCH.md exists AND
--research
flag NOT set:
  • Display:
    Using existing research: ${PHASE_DIR}/${PHASE}-RESEARCH.md
  • Skip to step 6
If RESEARCH.md missing OR
--research
flag set:
Display stage banner:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Kata ► RESEARCHING PHASE {X} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ Spawning researcher...
Proceed to spawn researcher
若使用
--gaps
标志位:
跳过研究环节(缺口补全模式使用VERIFICATION.md替代)。
若使用
--skip-research
标志位:
跳至步骤6。
检查配置中的研究设置:
bash
WORKFLOW_RESEARCH=$(cat .planning/config.json 2>/dev/null | grep -o '"research"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "true")
workflow.research
false
且未设置
--research
标志位:
跳至步骤6。
其他情况:
检查是否存在已有的研究文件:
bash
find "${PHASE_DIR}" -maxdepth 1 -name "*-RESEARCH.md" 2>/dev/null
若RESEARCH.md已存在且未设置
--research
标志位:
  • 显示:
    Using existing research: ${PHASE_DIR}/${PHASE}-RESEARCH.md
  • 跳至步骤6
若RESEARCH.md不存在或设置了
--research
标志位:
显示阶段横幅:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Kata ► 正在研究阶段 {X} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ 正在启动研究代理...
启动研究代理

Spawn kata-phase-researcher

启动kata-phase-researcher

Gather context for research prompt:
bash
undefined
收集研究提示的上下文:
bash
undefined

Get phase description from roadmap

从路线图中获取阶段描述

PHASE_DESC=$(grep -A3 "Phase ${PHASE}:" .planning/ROADMAP.md)
PHASE_DESC=$(grep -A3 "Phase ${PHASE}:" .planning/ROADMAP.md)

Get requirements if they exist

获取需求(若存在)

REQUIREMENTS=$(cat .planning/REQUIREMENTS.md 2>/dev/null | grep -A100 "## Requirements" | head -50)
REQUIREMENTS=$(cat .planning/REQUIREMENTS.md 2>/dev/null | grep -A100 "## Requirements" | head -50)

Get prior decisions from STATE.md

从STATE.md中获取先前的决策

DECISIONS=$(grep -A20 "### Decisions Made" .planning/STATE.md 2>/dev/null)
DECISIONS=$(grep -A20 "### Decisions Made" .planning/STATE.md 2>/dev/null)

Get phase context if exists

获取阶段上下文(若存在)

PHASE_CONTEXT=$(cat "${PHASE_DIR}/${PHASE}-CONTEXT.md" 2>/dev/null)

Fill research prompt and spawn:

```markdown
<objective>
Research how to implement Phase {phase_number}: {phase_name}

Answer: "What do I need to know to PLAN this phase well?"
</objective>

<context>
**Phase description:**
{phase_description}

**Requirements (if any):**
{requirements}

**Prior decisions:**
{decisions}

**Phase context (if any):**
{phase_context}
</context>

<output>
Write research findings to: {phase_dir}/{phase}-RESEARCH.md
</output>
Task(
  prompt="<agent-instructions>\n{phase_researcher_instructions_content}\n</agent-instructions>\n\n" + research_prompt,
  subagent_type="general-purpose",
  model="{researcher_model}",
  description="Research Phase {phase}"
)
PHASE_CONTEXT=$(cat "${PHASE_DIR}/${PHASE}-CONTEXT.md" 2>/dev/null)

填充研究提示并启动代理:

```markdown
<objective>
研究如何实现阶段 {phase_number}: {phase_name}

核心问题:"要做好该阶段的规划,我需要了解哪些内容?"
</objective>

<context>
**阶段描述:**
{phase_description}

**需求(若有):**
{requirements}

**先前决策:**
{decisions}

**阶段上下文(若有):**
{phase_context}
</context>

<output>
将研究结果写入:{phase_dir}/{phase}-RESEARCH.md
</output>
Task(
  prompt="<agent-instructions>\n{phase_researcher_instructions_content}\n</agent-instructions>\n\n" + research_prompt,
  subagent_type="general-purpose",
  model="{researcher_model}",
  description="Research Phase {phase}"
)

Handle Researcher Return

处理研究代理的返回结果

## RESEARCH COMPLETE
:
  • Display:
    Research complete. Proceeding to planning...
  • Continue to step 6
## RESEARCH BLOCKED
:
  • Display blocker information
  • Offer: 1) Provide more context, 2) Skip research and plan anyway, 3) Abort
  • Wait for user response
返回
## RESEARCH COMPLETE
  • 显示:
    研究完成。正在进入规划环节...
  • 继续执行步骤6
返回
## RESEARCH BLOCKED
  • 显示阻塞信息
  • 提供选项:1) 提供更多上下文,2) 跳过研究直接规划,3) 终止流程
  • 等待用户响应

6. Check Existing Plans

6. 检查已有的规划文件

bash
find "${PHASE_DIR}" -maxdepth 1 -name "*-PLAN.md" 2>/dev/null
If exists: Offer: 1) Continue planning (add more plans), 2) View existing, 3) Replan from scratch. Wait for response.
bash
find "${PHASE_DIR}" -maxdepth 1 -name "*-PLAN.md" 2>/dev/null
若存在规划文件: 提供选项:1) 继续规划(添加新规划),2) 查看已有规划,3) 从头重新规划。等待用户响应。

7. Read Context Files

7. 读取上下文文件

Read and store context file contents for the planner agent. The
@
syntax does not work across Task() boundaries - content must be inlined.
Read these files using the Read tool:
  • .planning/STATE.md
    (required)
  • .planning/ROADMAP.md
    (required)
  • .planning/REQUIREMENTS.md
    (if exists)
  • ${PHASE_DIR}/*-CONTEXT.md
    (if exists)
  • ${PHASE_DIR}/*-RESEARCH.md
    (if exists)
  • ${PHASE_DIR}/*-VERIFICATION.md
    (if --gaps mode)
  • ${PHASE_DIR}/*-UAT.md
    (if --gaps mode)
  • references/planner-instructions.md
    (relative to skill base directory) — store as
    planner_instructions_content
  • references/phase-researcher-instructions.md
    (relative to skill base directory) — store as
    phase_researcher_instructions_content
  • references/plan-checker-instructions.md
    (relative to skill base directory) — store as
    plan_checker_instructions_content
Store all content for use in the Task prompt below.
读取并存储上下文文件内容,供规划代理使用。Task()边界间无法使用
@
语法,必须将内容内联。
使用Read工具读取以下文件:
  • .planning/STATE.md
    (必填)
  • .planning/ROADMAP.md
    (必填)
  • .planning/REQUIREMENTS.md
    (若存在)
  • ${PHASE_DIR}/*-CONTEXT.md
    (若存在)
  • ${PHASE_DIR}/*-RESEARCH.md
    (若存在)
  • ${PHASE_DIR}/*-VERIFICATION.md
    (若使用--gaps模式)
  • ${PHASE_DIR}/*-UAT.md
    (若使用--gaps模式)
  • references/planner-instructions.md
    (相对于技能基础目录)—— 存储为
    planner_instructions_content
  • references/phase-researcher-instructions.md
    (相对于技能基础目录)—— 存储为
    phase_researcher_instructions_content
  • references/plan-checker-instructions.md
    (相对于技能基础目录)—— 存储为
    plan_checker_instructions_content
存储所有内容,供后续Task提示使用。

Extract Linked Issues from STATE.md

从STATE.md中提取关联的问题

After reading the base context files, extract any issues linked to this phase from STATE.md:
bash
undefined
读取基础上下文文件后,从STATE.md中提取与该阶段关联的所有问题:
bash
undefined

Normalize phase identifier

标准化阶段标识符

PHASE_DIR_NAME=$(basename "$PHASE_DIR") PHASE_NUM=$(echo "$PHASE_DIR_NAME" | grep -oE '^[0-9.]+')
PHASE_DIR_NAME=$(basename "$PHASE_DIR") PHASE_NUM=$(echo "$PHASE_DIR_NAME" | grep -oE '^[0-9.]+')

Extract linked issues from both sections

从两个部分提取关联问题

LINKED_ISSUES=""
LINKED_ISSUES=""

Check Pending Issues (from check-issues "Link to existing phase")

检查待处理问题(来自check-issues的"Link to existing phase")

if grep -q "^### Pending Issues" .planning/STATE.md 2>/dev/null; then PENDING=$(awk ' /^### Pending Issues/{found=1; next} /^### |^## /{if(found) exit} found && /→ Phase/ { # Match phase number or full phase dir name if ($0 ~ /→ Phase '"${PHASE_NUM}"'-/ || $0 ~ /→ Phase '"${PHASE_DIR_NAME}"'/) { print } } ' .planning/STATE.md) [ -n "$PENDING" ] && LINKED_ISSUES="${PENDING}" fi
if grep -q "^### Pending Issues" .planning/STATE.md 2>/dev/null; then PENDING=$(awk ' /^### Pending Issues/{found=1; next} /^### |^## /{if(found) exit} found && /→ Phase/ { # 匹配阶段编号或完整阶段目录名称 if ($0 ~ /→ Phase '"${PHASE_NUM}"'-/ || $0 ~ /→ Phase '"${PHASE_DIR_NAME}"'/) { print } } ' .planning/STATE.md) [ -n "$PENDING" ] && LINKED_ISSUES="${PENDING}" fi

Check Milestone Scope Issues (from add-milestone issue selection)

检查里程碑范围问题(来自add-milestone的问题选择)

if grep -q "^### Milestone Scope Issues" .planning/STATE.md 2>/dev/null; then SCOPE=$(awk ' /^### Milestone Scope Issues/{found=1; next} /^### |^## /{if(found) exit} found && /→ Phase/ { if ($0 ~ /→ Phase '"${PHASE_NUM}"'-/ || $0 ~ /→ Phase '"${PHASE_DIR_NAME}"'/) { print } } ' .planning/STATE.md) [ -n "$SCOPE" ] && LINKED_ISSUES="${LINKED_ISSUES}${SCOPE}" fi

Build the issue context section for the prompt (only if issues are linked):

```bash
ISSUE_CONTEXT_SECTION=""
if [ -n "$LINKED_ISSUES" ]; then
  ISSUE_CONTEXT_SECTION="
**Linked Issues:**
${LINKED_ISSUES}

Note: Set \`source_issue:\` in plan frontmatter for traceability:
- GitHub issues: \`source_issue: github:#N\` (extract from provenance field)
- Local issues: \`source_issue: [file path]\`
"
fi
Store ISSUE_CONTEXT_SECTION for use in Step 8 prompt.
if grep -q "^### Milestone Scope Issues" .planning/STATE.md 2>/dev/null; then SCOPE=$(awk ' /^### Milestone Scope Issues/{found=1; next} /^### |^## /{if(found) exit} found && /→ Phase/ { if ($0 ~ /→ Phase '"${PHASE_NUM}"'-/ || $0 ~ /→ Phase '"${PHASE_DIR_NAME}"'/) { print } } ' .planning/STATE.md) [ -n "$SCOPE" ] && LINKED_ISSUES="${LINKED_ISSUES}${SCOPE}" fi

构建提示中的问题上下文部分(仅当存在关联问题时):

```bash
ISSUE_CONTEXT_SECTION=""
if [ -n "$LINKED_ISSUES" ]; then
  ISSUE_CONTEXT_SECTION="
**关联问题:**
${LINKED_ISSUES}

注意:在规划的前置元数据中设置\`source_issue:\`以实现可追溯性:
- GitHub问题:\`source_issue: github:#N\`(从来源字段提取)
- 本地问题:\`source_issue: [文件路径]\`
"
fi
存储ISSUE_CONTEXT_SECTION,供步骤8的提示使用。

8. Spawn kata-planner Agent

8. 启动kata-planner Agent

Display stage banner:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Kata ► PLANNING PHASE {X} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ Spawning planner...
Fill prompt with inlined content and spawn:
markdown
<planning_context>

**Phase:** {phase_number}
**Mode:** {standard | gap_closure}

**Project State:**
{state_content}

**Roadmap:**
{roadmap_content}

**Requirements (if exists):**
{requirements_content}

**Phase Context (if exists):**
{context_content}

**Research (if exists):**
{research_content}

**Linked Issues (from STATE.md):**
{issue_context_section}

**Gap Closure (if --gaps mode):**
{verification_content}
{uat_content}

</planning_context>

<downstream_consumer>
Output consumed by /kata-execute-phase
Plans must be executable prompts with:

- Frontmatter (wave, depends_on, files_modified, autonomous)
- Tasks in XML format
- Verification criteria
- must_haves for goal-backward verification
</downstream_consumer>

<quality_gate>
Before returning PLANNING COMPLETE:

- [ ] PLAN.md files created in phase directory
- [ ] Each plan has valid frontmatter
- [ ] Tasks are specific and actionable
- [ ] Dependencies correctly identified
- [ ] Waves assigned for parallel execution
- [ ] must_haves derived from phase goal
</quality_gate>
Task(
  prompt="<agent-instructions>\n{planner_instructions_content}\n</agent-instructions>\n\n" + filled_prompt,
  subagent_type="general-purpose",
  model="{planner_model}",
  description="Plan Phase {phase}"
)
显示阶段横幅:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Kata ► 正在规划阶段 {X} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ 正在启动规划代理...
填充内联内容并启动代理:
markdown
<planning_context>

**阶段:** {phase_number}
**模式:** {标准模式 | 缺口补全模式}

**项目状态:**
{state_content}

**路线图:**
{roadmap_content}

**需求(若存在):**
{requirements_content}

**阶段上下文(若存在):**
{context_content}

**研究结果(若存在):**
{research_content}

**关联问题(来自STATE.md):**
{issue_context_section}

**缺口补全(若使用--gaps模式):**
{verification_content}
{uat_content}

</planning_context>

<downstream_consumer>
输出结果将被`/kata-execute-phase`使用
规划必须是可执行的提示,包含:

- 前置元数据(wave、depends_on、files_modified、autonomous)
- XML格式的任务
- 验证标准
- 用于目标反向验证的must_haves
</downstream_consumer>

<quality_gate>
返回PLANNING COMPLETE前需满足:

- [ ] 已在阶段目录中创建PLAN.md文件
- [ ] 每个规划都有有效的前置元数据
- [ ] 任务具体且可执行
- [ ] 依赖关系已正确识别
- [ ] 已分配用于并行执行的Wave
- [ ] 已从阶段目标推导must_haves
</quality_gate>
Task(
  prompt="<agent-instructions>\n{planner_instructions_content}\n</agent-instructions>\n\n" + filled_prompt,
  subagent_type="general-purpose",
  model="{planner_model}",
  description="Plan Phase {phase}"
)

9. Handle Planner Return

9. 处理规划代理的返回结果

Parse planner output:
## PLANNING COMPLETE
:
  • Display:
    Planner created {N} plan(s). Files on disk.
  • If
    --skip-verify
    : Skip to step 13
  • Check config:
    WORKFLOW_PLAN_CHECK=$(cat .planning/config.json 2>/dev/null | grep -o '"plan_check"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "true")
  • If
    workflow.plan_check
    is
    false
    : Skip to step 13
  • Otherwise: Proceed to step 10
## CHECKPOINT REACHED
:
  • Present to user, get response, spawn continuation (see step 12)
## PLANNING INCONCLUSIVE
:
  • Show what was attempted
  • Offer: Add context, Retry, Manual
  • Wait for user response
解析规划代理的输出:
返回
## PLANNING COMPLETE
  • 显示:
    规划代理已创建{N}个规划文件。文件已保存至磁盘。
  • 若使用
    --skip-verify
    :跳至步骤13
  • 检查配置:
    WORKFLOW_PLAN_CHECK=$(cat .planning/config.json 2>/dev/null | grep -o '"plan_check"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "true")
  • workflow.plan_check
    false
    :跳至步骤13
  • 其他情况:继续执行步骤10
返回
## CHECKPOINT REACHED
  • 将结果展示给用户,获取响应,启动后续流程(见步骤12)
返回
## PLANNING INCONCLUSIVE
  • 展示已尝试的内容
  • 提供选项:添加上下文、重试、手动处理
  • 等待用户响应

10. Spawn kata-plan-checker Agent

10. 启动kata-plan-checker Agent

Display: ` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Kata ► VERIFYING PLANS ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ Spawning plan checker...
Read plans and requirements for the checker:
bash
undefined
显示: ` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Kata ► 正在验证规划 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆ 正在启动规划校验代理...
读取规划和需求文件,供校验代理使用:
bash
undefined

Read all plans in phase directory

读取阶段目录中的所有规划文件

PLANS_CONTENT=$(cat "${PHASE_DIR}"/*-PLAN.md 2>/dev/null)
PLANS_CONTENT=$(cat "${PHASE_DIR}"/*-PLAN.md 2>/dev/null)

Read requirements (reuse from step 7 if available)

读取需求文件(可复用步骤7中已读取的内容)

REQUIREMENTS_CONTENT=$(cat .planning/REQUIREMENTS.md 2>/dev/null)

Fill checker prompt with inlined content and spawn:

```markdown
<verification_context>

**Phase:** {phase_number}
**Phase Goal:** {goal from ROADMAP}

**Plans to verify:**
{plans_content}

**Requirements (if exists):**
{requirements_content}

</verification_context>

<expected_output>
Return one of:
- ## VERIFICATION PASSED — all checks pass
- ## ISSUES FOUND — structured issue list
</expected_output>
Task(
  prompt="<agent-instructions>\n{plan_checker_instructions_content}\n</agent-instructions>\n\n" + checker_prompt,
  subagent_type="general-purpose",
  model="{checker_model}",
  description="Verify Phase {phase} plans"
)
REQUIREMENTS_CONTENT=$(cat .planning/REQUIREMENTS.md 2>/dev/null)

填充校验提示并启动代理:

```markdown
<verification_context>

**阶段:** {phase_number}
**阶段目标:** {来自ROADMAP的目标}

**待验证的规划:**
{plans_content}

**需求(若存在):**
{requirements_content}

</verification_context>

<expected_output>
返回以下结果之一:
- ## VERIFICATION PASSED — 所有检查通过
- ## ISSUES FOUND — 结构化的问题列表
</expected_output>
Task(
  prompt="<agent-instructions>\n{plan_checker_instructions_content}\n</agent-instructions>\n\n" + checker_prompt,
  subagent_type="general-purpose",
  model="{checker_model}",
  description="Verify Phase {phase} plans"
)

11. Handle Checker Return

11. 处理校验代理的返回结果

If
## VERIFICATION PASSED
:
  • Display:
    Plans verified. Checking GitHub integration...
  • Execute Step 13 now — run the GitHub config check and issue update
If
## ISSUES FOUND
:
  • Display:
    Checker found issues:
  • List issues from checker output
  • Check iteration count
  • Proceed to step 12
若返回
## VERIFICATION PASSED
  • 显示:
    规划验证通过。正在检查GitHub集成...
  • 立即执行步骤13 — 运行GitHub配置检查和问题更新
若返回
## ISSUES FOUND
  • 显示:
    校验代理发现以下问题:
  • 列出校验输出中的问题
  • 检查迭代次数
  • 继续执行步骤12

12. Revision Loop (Max 3 Iterations)

12. 修订循环(最多3次迭代)

Track:
iteration_count
(starts at 1 after initial plan + check)
If iteration_count < 3:
Display:
Sending back to planner for revision... (iteration {N}/3)
Read current plans for revision context:
bash
PLANS_CONTENT=$(cat "${PHASE_DIR}"/*-PLAN.md 2>/dev/null)
Spawn kata-planner with revision prompt:
markdown
<revision_context>

**Phase:** {phase_number}
**Mode:** revision

**Existing plans:**
{plans_content}

**Checker issues:**
{structured_issues_from_checker}

</revision_context>

<instructions>
Make targeted updates to address checker issues.
Do NOT replan from scratch unless issues are fundamental.
Return what changed.
</instructions>
Task(
  prompt="<agent-instructions>\n{planner_instructions_content}\n</agent-instructions>\n\n" + revision_prompt,
  subagent_type="general-purpose",
  model="{planner_model}",
  description="Revise Phase {phase} plans"
)
  • After planner returns → spawn checker again (step 10)
  • Increment iteration_count
If iteration_count >= 3:
Display:
Max iterations reached. {N} issues remain:
  • List remaining issues
Offer options:
  1. Force proceed (execute despite issues)
  2. Provide guidance (user gives direction, retry)
  3. Abandon (exit planning)
Wait for user response.
跟踪:
iteration_count
(初始规划+校验后从1开始计数)
若iteration_count < 3:
显示:
正在将规划返回给代理进行修订...(第{N}/3次迭代)
读取当前规划作为修订上下文:
bash
PLANS_CONTENT=$(cat "${PHASE_DIR}"/*-PLAN.md 2>/dev/null)
使用修订提示启动kata-planner:
markdown
<revision_context>

**阶段:** {phase_number}
**模式:** 修订

**现有规划:**
{plans_content}

**校验代理发现的问题:**
{structured_issues_from_checker}

</revision_context>

<instructions>
针对校验发现的问题进行针对性更新。
除非问题非常严重,否则请勿从头重新规划。
返回具体的修改内容。
</instructions>
Task(
  prompt="<agent-instructions>\n{planner_instructions_content}\n</agent-instructions>\n\n" + revision_prompt,
  subagent_type="general-purpose",
  model="{planner_model}",
  description="Revise Phase {phase} plans"
)
  • 规划代理返回后 → 重新启动校验代理(步骤10)
  • 递增iteration_count
若iteration_count >= 3:
显示:
已达到最大迭代次数。剩余{N}个问题:
  • 列出剩余问题
提供选项:
  1. 强制继续(忽略问题执行)
  2. 提供指导(用户给出方向后重试)
  3. 放弃(退出规划流程)
等待用户响应。

13. GitHub Integration Check

13. GitHub集成检查

Check config guards:
bash
GITHUB_ENABLED=$(cat .planning/config.json 2>/dev/null | grep -o '"enabled"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "false")
ISSUE_MODE=$(cat .planning/config.json 2>/dev/null | grep -o '"issueMode"[[:space:]]*:[[:space:]]*"[^"]*"' | grep -o '"[^"]*"$' | tr -d '"' || echo "never")
If
GITHUB_ENABLED != true
OR
ISSUE_MODE = never
:
  • Log:
    Skipping GitHub issue update (github.enabled=${GITHUB_ENABLED}, issueMode=${ISSUE_MODE})
  • Skip to
    <offer_next>
If enabled, find phase issue:
bash
undefined
检查配置限制:
bash
GITHUB_ENABLED=$(cat .planning/config.json 2>/dev/null | grep -o '"enabled"[[:space:]]*:[[:space:]]*[^,}]*' | grep -o 'true\|false' || echo "false")
ISSUE_MODE=$(cat .planning/config.json 2>/dev/null | grep -o '"issueMode"[[:space:]]*:[[:space:]]*"[^"]*"' | grep -o '"[^"]*"$' | tr -d '"' || echo "never")
GITHUB_ENABLED != true
ISSUE_MODE = never
  • 日志:
    Skipping GitHub issue update (github.enabled=${GITHUB_ENABLED}, issueMode=${ISSUE_MODE})
  • 跳至
    <offer_next>
若已启用,查找阶段对应的GitHub问题:
bash
undefined

Get milestone version from ROADMAP.md (the one marked "In Progress")

从ROADMAP.md中获取标记为"In Progress"的里程碑版本

VERSION=$(grep -E "^### v[0-9]+.[0-9]+.*(In Progress)" .planning/ROADMAP.md | grep -oE "v[0-9]+.[0-9]+(.[0-9]+)?" | head -1 | tr -d 'v' || echo "")
VERSION=$(grep -E "^### v[0-9]+.[0-9]+.*(In Progress)" .planning/ROADMAP.md | grep -oE "v[0-9]+.[0-9]+(.[0-9]+)?" | head -1 | tr -d 'v' || echo "")

Fallback: try to find any version if no "In Progress" found

回退方案:若未找到"In Progress"的版本,尝试查找任意版本

[ -z "$VERSION" ] && VERSION=$(grep -oE 'v[0-9]+.[0-9]+(.[0-9]+)?' .planning/ROADMAP.md | head -1 | tr -d 'v' || echo "")
if [ -z "$VERSION" ]; then echo "Warning: Could not determine milestone version. Skipping GitHub issue update."

Continue to offer_next (non-blocking)

fi
[ -z "$VERSION" ] && VERSION=$(grep -oE 'v[0-9]+.[0-9]+(.[0-9]+)?' .planning/ROADMAP.md | head -1 | tr -d 'v' || echo "")
if [ -z "$VERSION" ]; then echo "警告:无法确定里程碑版本。跳过GitHub问题更新。"

继续执行offer_next(非阻塞)

fi

Find phase issue number

查找阶段对应的问题编号

ISSUE_NUMBER=$(gh issue list
--label "phase"
--milestone "v${VERSION}"
--json number,title
--jq ".[] | select(.title | startswith("Phase ${PHASE}:")) | .number"
2>/dev/null)
if [ -z "$ISSUE_NUMBER" ]; then echo "Warning: Could not find GitHub Issue for Phase ${PHASE}. Skipping checklist update."

Continue to offer_next (non-blocking)

fi

**Build plan checklist from PLAN.md files:**

```bash
PLAN_CHECKLIST=""
PLAN_COUNT=0
for plan_file in $(find "${PHASE_DIR}" -maxdepth 1 -name "*-PLAN.md" 2>/dev/null | sort); do
  PLAN_NUM=$(basename "$plan_file" | sed -E 's/.*-([0-9]+)-PLAN\.md/\1/')
  # Extract brief objective from plan (first line after <objective>)
  PLAN_OBJECTIVE=$(grep -A2 "<objective>" "$plan_file" | head -2 | tail -1 | sed 's/^ *//' | head -c 60)
  # Fallback if objective extraction fails
  if [ -z "$PLAN_OBJECTIVE" ]; then
    PLAN_OBJECTIVE=$(basename "$plan_file" .md | sed 's/-PLAN$//' | sed 's/-/ /g')
  fi
  PLAN_CHECKLIST="${PLAN_CHECKLIST}- [ ] Plan ${PLAN_NUM}: ${PLAN_OBJECTIVE}
"
  PLAN_COUNT=$((PLAN_COUNT + 1))
done
Update issue body with plan checklist:
Use the script at
./scripts/update-issue-plans.py
relative to this skill's base directory.
Construct the full path from the "Base directory for this skill" shown at invocation, then run:
bash
undefined
ISSUE_NUMBER=$(gh issue list
--label "phase"
--milestone "v${VERSION}"
--json number,title
--jq ".[] | select(.title | startswith("Phase ${PHASE}:")) | .number"
2>/dev/null)
if [ -z "$ISSUE_NUMBER" ]; then echo "警告:未找到阶段${PHASE}对应的GitHub问题。跳过检查清单更新。"

继续执行offer_next(非阻塞)

fi

**从PLAN.md文件构建规划检查清单:**

```bash
PLAN_CHECKLIST=""
PLAN_COUNT=0
for plan_file in $(find "${PHASE_DIR}" -maxdepth 1 -name "*-PLAN.md" 2>/dev/null | sort); do
  PLAN_NUM=$(basename "$plan_file" | sed -E 's/.*-([0-9]+)-PLAN\.md/\1/')
  # 从规划中提取简短目标(<objective>后的第一行)
  PLAN_OBJECTIVE=$(grep -A2 "<objective>" "$plan_file" | head -2 | tail -1 | sed 's/^ *//' | head -c 60)
  # 若目标提取失败,使用回退方案
  if [ -z "$PLAN_OBJECTIVE" ]; then
    PLAN_OBJECTIVE=$(basename "$plan_file" .md | sed 's/-PLAN$//' | sed 's/-/ /g')
  fi
  PLAN_CHECKLIST="${PLAN_CHECKLIST}- [ ] 规划${PLAN_NUM}:${PLAN_OBJECTIVE}
"
  PLAN_COUNT=$((PLAN_COUNT + 1))
done
使用规划检查清单更新问题内容:
使用本技能基础目录下的
./scripts/update-issue-plans.py
脚本。
从调用时显示的"Base directory for this skill"中获取完整路径,然后运行:
bash
undefined

Write checklist to temp file

将检查清单写入临时文件

printf '%s\n' "$PLAN_CHECKLIST" > /tmp/phase-plan-checklist.md
printf '%s\n' "$PLAN_CHECKLIST" > /tmp/phase-plan-checklist.md

SKILL_BASE_DIR should be set to the base directory from skill invocation header

SKILL_BASE_DIR应设置为技能调用头中显示的基础目录

e.g., SKILL_BASE_DIR="/path/to/skills/plan-phase"

示例:SKILL_BASE_DIR="/path/to/skills/plan-phase"

python3 "${SKILL_BASE_DIR}/scripts/update-issue-plans.py" "$ISSUE_NUMBER" /tmp/phase-plan-checklist.md
&& GITHUB_UPDATE_SUCCESS=true
|| echo "Warning: Script failed, but continuing (non-blocking)"
python3 "${SKILL_BASE_DIR}/scripts/update-issue-plans.py" "$ISSUE_NUMBER" /tmp/phase-plan-checklist.md
&& GITHUB_UPDATE_SUCCESS=true
|| echo "警告:脚本执行失败,但将继续流程(非阻塞)"

Clean up

清理临时文件

rm -f /tmp/phase-plan-checklist.md

**Track result for display:**

Store `ISSUE_NUMBER` and `PLAN_COUNT` for display in `<offer_next>` if update succeeded.

**After GitHub check completes (success or skip), proceed to Step 14.**

**Error handling principle:** All GitHub operations are non-blocking. Missing issue, auth issues, or update failures warn but do not stop the planning workflow.
rm -f /tmp/phase-plan-checklist.md

**跟踪结果用于展示:**

若更新成功,存储`ISSUE_NUMBER`和`PLAN_COUNT`,用于在`<offer_next>`中展示。

**GitHub检查完成后(无论成功或跳过),继续执行步骤14。**

**错误处理原则:** 所有GitHub操作均为非阻塞。缺失问题、认证问题或更新失败仅会发出警告,不会终止规划工作流。

14. Present Final Status

14. 展示最终状态

Display the planning summary and route to
<offer_next>
.
</process>
<offer_next> Output this markdown directly (not as a code block):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Kata ► PHASE {X} PLANNED ✓ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Phase {X}: {Name} — {N} plan(s) in {M} wave(s)
WavePlansWhat it builds
101, 02[objectives]
203[objective]
Research: {Completed | Used existing | Skipped} Verification: {Passed | Passed with override | Skipped}
{If GITHUB_UPDATE_SUCCESS=true:} GitHub Issue: #{ISSUE_NUMBER} updated with {PLAN_COUNT} plan checklist items
───────────────────────────────────────────────────────────────
显示规划摘要,然后进入
<offer_next>
</process>
<offer_next> 直接输出以下markdown内容(不要放在代码块中):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Kata ► 阶段{X}规划完成 ✓ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
阶段{X}:{名称} — 共{M}个Wave,包含{N}个规划
Wave规划编号构建内容
101、02[目标描述]
203[目标描述]
研究状态:{已完成 | 使用已有研究 | 已跳过} 验证状态:{已通过 | 已通过(用户覆盖) | 已跳过}
{若GITHUB_UPDATE_SUCCESS=true:} GitHub问题:#{ISSUE_NUMBER} 已更新,添加了{PLAN_COUNT}个规划检查清单项
───────────────────────────────────────────────────────────────

▶ Next Up

▶ 下一步操作

Execute Phase {X} — run all {N} plans
/kata-execute-phase {X}
<sub>/clear first → fresh context window</sub>
───────────────────────────────────────────────────────────────
Also available:
  • cat .planning/phases/{phase-dir}/*-PLAN.md — review plans
  • /kata-plan-phase {X} --research — re-research first
─────────────────────────────────────────────────────────────── </offer_next>
<success_criteria>
  • .planning/ directory validated
  • Phase validated against roadmap
  • Phase directory created if needed
  • Research completed (unless --skip-research or --gaps or exists)
  • kata-phase-researcher spawned if research needed
  • Existing plans checked
  • kata-planner spawned with context (including RESEARCH.md if available)
  • Plans created (PLANNING COMPLETE or CHECKPOINT handled)
  • kata-plan-checker spawned (unless --skip-verify)
  • Verification passed OR user override OR max iterations with user decision
  • GitHub issue updated with plan checklist (if github.enabled and issueMode != never)
  • User sees status between agent spawns
  • User knows next steps (execute or review) </success_criteria>
执行阶段{X} — 运行全部{N}个规划
/kata-execute-phase {X}
<sub>/clear first → 清空上下文窗口,获取全新环境</sub>
───────────────────────────────────────────────────────────────
其他可用操作:
  • cat .planning/phases/{phase-dir}/*-PLAN.md — 查看规划内容
  • /kata-plan-phase {X} --research — 先重新进行研究,再规划
─────────────────────────────────────────────────────────────── </offer_next>
<success_criteria>
  • 已验证.planning/目录存在
  • 已对照路线图验证阶段有效性
  • 已按需创建阶段目录
  • 已完成研究(除非使用--skip-research、--gaps或已有研究)
  • 已在需要时启动kata-phase-researcher
  • 已检查现有规划
  • 已为kata-planner提供上下文(包括可用的RESEARCH.md)
  • 已创建规划(PLANNING COMPLETE或已处理CHECKPOINT)
  • 已启动kata-plan-checker(除非使用--skip-verify)
  • 验证已通过,或用户已覆盖,或已达到最大迭代次数并获取用户决策
  • 已更新GitHub问题的规划检查清单(若github.enabled为true且issueMode != never)
  • 用户可查看代理启动间的状态
  • 用户了解下一步操作(执行或查看规划) </success_criteria>