|
| 1 | +# F2 Feature 抽取:feat-gen-plan-convergence |
| 2 | + |
| 3 | +## 语言格式 |
| 4 | +默认:仅英文。 |
| 5 | +当 `.humanize/config.json` 中 `chinese_plan=true` 时,会生成单独的 `_zh` 仅中文版本。 |
| 6 | +在两个文件中保持标识符(`AC-1`、task IDs、文件路径、API 名称、命令行 flags)不变。 |
| 7 | + |
| 8 | +## 目标描述 |
| 9 | + |
| 10 | +从本地 `main` 抽取 F2(`feat-gen-plan-convergence`)特性集,将其功能记录到独立分析文档 |
| 11 | +`docs/f2-gen-plan-convergence-analysis.md`,基于 `origin/main` 创建本地 feature 分支 |
| 12 | +`feat/gen-plan-convergence`,并为后续提交 PR 准备好 cherry-pick 的提交,但不向任何 remote |
| 13 | +push。 |
| 14 | + |
| 15 | +F2 由 9 个提交组成(SHAs:`c283a92`、`9c0eef7`、`5156a05`、`002308a`、`8ba3a57`、 |
| 16 | +`437567b`、`3c8caf5`、`4a57429`、`821f225`),它们为 `gen-plan` 命令加入了 Claude-Codex |
| 17 | +辩论与收敛工作流。其中的 revert 成对提交(`5156a05` + `002308a`)净效果为 0,通过 |
| 18 | +`cherry-pick -n` 方式处理。 |
| 19 | + |
| 20 | +## 验收标准 |
| 21 | + |
| 22 | +遵循 TDD 思路,每条标准都包含正向与反向测试,便于确定性验证。 |
| 23 | + |
| 24 | +- AC-1:分析文档存在于 `docs/f2-gen-plan-convergence-analysis.md` |
| 25 | + - 正向测试(预期 PASS): |
| 26 | + - 指定路径存在该文件 |
| 27 | + - 文件仅英文(不包含 CJK 字符) |
| 28 | + - 文件覆盖 F2 的全部 5 个子特性:(a) Claude-Codex 辩论流程,(b) Codex 优先的规划与收敛 |
| 29 | + 循环,(c) task-tag 路由(`coding`/`analyze`),(d) 收敛循环最多 3 轮,(e) `_zh` 输出且 |
| 30 | + 默认仅英文 |
| 31 | + - 文件在 `feat/gen-plan-convergence` 上已提交 |
| 32 | + - 反向测试(预期 FAIL): |
| 33 | + - 缺少任一子特性的文件应在内容评审中失败 |
| 34 | + - 含有 CJK 字符的文件违反项目规则 |
| 35 | + - 文件未提交或缺失将同时导致 AC-5 与 AC-1 失败 |
| 36 | + |
| 37 | +- AC-2:本地存在 feature 分支 `feat/gen-plan-convergence`,且基于 `origin/main` |
| 38 | + - 正向测试(预期 PASS): |
| 39 | + - `git branch --list feat/gen-plan-convergence` 返回该分支名 |
| 40 | + - `git merge-base --is-ancestor 7e0c3ae feat/gen-plan-convergence` 以 0 退出 |
| 41 | + (确认 base 固定为当前 `origin/main` HEAD) |
| 42 | + - 反向测试(预期 FAIL): |
| 43 | + - 本地分支列表中不存在该分支 |
| 44 | + - 分支基于本地 `main` 或错误的提交 |
| 45 | + |
| 46 | +- AC-3:从 `origin/main` 到 `feat/gen-plan-convergence` 的净 diff 是允许列表的子集 |
| 47 | + - 允许列表: |
| 48 | + - `commands/gen-plan.md` |
| 49 | + - `prompt-template/plan/gen-plan-template.md` |
| 50 | + - `scripts/validate-gen-plan-io.sh` |
| 51 | + - `tests/test-gen-plan.sh` |
| 52 | + - `commands/start-rlcr-loop.md` |
| 53 | + - `hooks/loop-codex-stop-hook.sh` |
| 54 | + - `scripts/setup-rlcr-loop.sh` |
| 55 | + - `tests/run-all-tests.sh` |
| 56 | + - `tests/test-task-tag-routing.sh` |
| 57 | + - `.claude-plugin/plugin.json` |
| 58 | + - `.claude-plugin/marketplace.json` |
| 59 | + - `README.md` |
| 60 | + - `docs/f2-gen-plan-convergence-analysis.md` |
| 61 | + - 正向测试(预期 PASS): |
| 62 | + - `git diff --stat origin/main...feat/gen-plan-convergence` 仅列出允许列表内的文件 |
| 63 | + - `hooks/lib/loop-common.sh` 与 `tests/test-plan-type-routing.sh` 不出现 |
| 64 | + (确认 revert pair 的净效应为 0) |
| 65 | + - 反向测试(预期 FAIL): |
| 66 | + - diff 中出现任何允许列表之外的文件,说明泄露了无关改动 |
| 67 | + - 出现 `hooks/lib/loop-common.sh` 表示 revert pair 未被正确处理 |
| 68 | + |
| 69 | +- AC-4:未执行任何 remote push(用户显式覆盖 `AGENTS.md` 的默认自动 push 行为) |
| 70 | + - 正向测试(预期 PASS): |
| 71 | + - `git ls-remote zenus feat/gen-plan-convergence` 返回空(无远程 ref) |
| 72 | + - `git ls-remote origin feat/gen-plan-convergence` 返回空 |
| 73 | + - 反向测试(预期 FAIL): |
| 74 | + - 在 `zenus` 或 `origin` 任一 remote 上发现该分支 ref |
| 75 | + |
| 76 | +- AC-5:所有操作完成后工作区干净 |
| 77 | + - 正向测试(预期 PASS): |
| 78 | + - 在 `feat/gen-plan-convergence` 上执行 `git status` 显示 "nothing to commit, working tree clean" |
| 79 | + - 反向测试(预期 FAIL): |
| 80 | + - 仍残留与 F2 相关的未暂存改动或未跟踪文件 |
| 81 | + |
| 82 | +- AC-6:版本策略被明确延后决策 |
| 83 | + - 正向测试(预期 PASS): |
| 84 | + - `docs/f2-gen-plan-convergence-analysis.md` 注明:版本 bump 的对齐延后,等待上游维护者决策 |
| 85 | + (对应 runbook 4.5) |
| 86 | + - `feat/gen-plan-convergence` 上的版本文件与 `origin/main` 一致(而非 F2 bump 后的值),因为 |
| 87 | + cherry-pick 冲突通过接受 `origin/main` 版本解决 |
| 88 | + - 反向测试(预期 FAIL): |
| 89 | + - 版本文件彼此不一致,且没有显式文档说明 |
| 90 | + |
| 91 | +## 边界范围 |
| 92 | + |
| 93 | +边界范围定义了可接受的实现质量与取舍空间。 |
| 94 | + |
| 95 | +### 上界(最大可接受范围) |
| 96 | + |
| 97 | +应用全部 9 个 SHA,并在 `feat/gen-plan-convergence` 上形成 2 个提交:一个提交包含经过整理的 F2 |
| 98 | +代码变更(版本冲突通过保留 `origin/main` 的值解决),另一个提交包含分析文档。分析文档提供逐提交 |
| 99 | +拆解,按子特性描述实现细节并引用相关测试用例。所有 `tests/test-gen-plan.sh` 用例通过。 |
| 100 | + |
| 101 | +### 下界(最小可接受范围) |
| 102 | + |
| 103 | +通过 `cherry-pick -n` 应用全部 9 个 SHA;版本文件冲突通过接受 `origin/main` 的值解决;最终作为一个 |
| 104 | +合并后的代码提交。分析文档用简洁文字覆盖全部 5 个子特性。`tests/test-gen-plan.sh` 通过。diff 在允许列表内。 |
| 105 | + |
| 106 | +### 允许/禁止项 |
| 107 | + |
| 108 | +- 可用:`cherry-pick -n`(批量不提交)或逐个 SHA `cherry-pick` |
| 109 | +- 可用:在 cherry-pick 期间用 `git checkout --ours` 解决版本文件冲突 |
| 110 | +- 可用:对任何空 pick 使用 `git cherry-pick --skip`(提交已在 base 中) |
| 111 | +- 可用:抽取分支上形成 1 或 2 个提交 |
| 112 | +- 禁止:对任何 remote 执行 `git push`(`origin`、`zenus` 或其他) |
| 113 | +- 禁止:对 `origin/main` 进行 force-push 或 rebase |
| 114 | +- 禁止:在分析文档中出现 CJK 字符 |
| 115 | + |
| 116 | +> **关于确定性约束的说明**:不 push 要求、base commit(`7e0c3ae`)、分支名(`feat/gen-plan-convergence`)、 |
| 117 | +> 以及分析文档路径都是固定的。提交粒度可在 1–2 个提交范围内自由选择。 |
| 118 | +
|
| 119 | +## 可行性提示与建议 |
| 120 | + |
| 121 | +> **注意**:本节仅用于参考与理解。它们是概念性建议,不是强制要求。 |
| 122 | +
|
| 123 | +### 概念方案 |
| 124 | + |
| 125 | +```bash |
| 126 | +# 1. Verify environment |
| 127 | +git fetch origin |
| 128 | +for sha in c283a92 9c0eef7 5156a05 002308a 8ba3a57 437567b 3c8caf5 4a57429 821f225; do |
| 129 | + git cat-file -e "${sha}^{commit}" || echo "MISSING $sha" |
| 130 | +done |
| 131 | + |
| 132 | +# 2. Create branch pinned to current origin/main |
| 133 | +git switch -c feat/gen-plan-convergence 7e0c3ae |
| 134 | + |
| 135 | +# 3. Cherry-pick all 9 SHAs with no-commit |
| 136 | +git cherry-pick -n \ |
| 137 | + c283a92 9c0eef7 5156a05 002308a 8ba3a57 437567b 3c8caf5 4a57429 821f225 |
| 138 | + |
| 139 | +# 4. Resolve version-file conflicts: keep origin/main values |
| 140 | +# (If git stops with conflicts on plugin.json, marketplace.json, README.md) |
| 141 | +git checkout --ours \ |
| 142 | + .claude-plugin/plugin.json \ |
| 143 | + .claude-plugin/marketplace.json \ |
| 144 | + README.md |
| 145 | +git add \ |
| 146 | + .claude-plugin/plugin.json \ |
| 147 | + .claude-plugin/marketplace.json \ |
| 148 | + README.md |
| 149 | + |
| 150 | +# 5. Handle empty picks if any |
| 151 | +# git cherry-pick --skip (for any SHAs that are already in base) |
| 152 | + |
| 153 | +# 6. Verify non-empty result |
| 154 | +if git diff --quiet && git diff --cached --quiet; then |
| 155 | + echo "Empty cherry-pick result. Stop and re-check SHA assignment." |
| 156 | + exit 1 |
| 157 | +fi |
| 158 | + |
| 159 | +# 7. Curate and commit code changes |
| 160 | +git add -p # or add specific allowlisted files |
| 161 | +git commit -m "feat: extract F2 gen-plan-convergence changes |
| 162 | +
|
| 163 | +Cherry-picked from SHAs: c283a92 9c0eef7 8ba3a57 437567b 3c8caf5 4a57429 821f225 |
| 164 | +Revert pair 5156a05+002308a included (net-zero; hooks/lib/loop-common.sh not in diff) |
| 165 | +Version files kept at origin/main values; version bump deferred per runbook 4.5" |
| 166 | + |
| 167 | +# 8. Write and commit analysis document |
| 168 | +# ... write docs/f2-gen-plan-convergence-analysis.md ... |
| 169 | +git add docs/f2-gen-plan-convergence-analysis.md |
| 170 | +git commit -m "docs: add F2 gen-plan-convergence feature analysis" |
| 171 | + |
| 172 | +# 9. Verify |
| 173 | +git diff --stat origin/main...HEAD |
| 174 | +./tests/test-gen-plan.sh |
| 175 | +git status |
| 176 | +``` |
| 177 | + |
| 178 | +### 相关参考 |
| 179 | + |
| 180 | +- `docs/feature-commit-map.md` - F2 的规范 SHA 列表(F2 小节,9 个提交) |
| 181 | +- `docs/feature-pr-workflow.md` - 抽取 runbook(完整流程见 4.1–4.5) |
| 182 | +- `commands/gen-plan.md` - F2 修改的主要文件(覆盖全部 5 个子特性) |
| 183 | +- `prompt-template/plan/gen-plan-template.md` - 与 gen-plan.md 保持同步的模板 |
| 184 | +- `scripts/validate-gen-plan-io.sh` - 在提交 6(`437567b`)中修改了 IO 校验 |
| 185 | +- `tests/test-gen-plan.sh` - 主要验证套件(随 F2 提交逐步扩展) |
| 186 | +- `tests/test-task-tag-routing.sh` - 在提交 5(`8ba3a57`)中新增,用于 tag 路由测试 |
| 187 | + |
| 188 | +## 依赖与顺序 |
| 189 | + |
| 190 | +### 里程碑 |
| 191 | + |
| 192 | +1. 里程碑 1:环境验证 |
| 193 | + - Phase A:拉取上游(`git fetch origin`),验证 `origin/main` HEAD 为 `7e0c3ae` |
| 194 | + - Phase B:用 `git cat-file -e` 验证全部 9 个 F2 SHA 存在 |
| 195 | + |
| 196 | +2. 里程碑 2:分支创建与 cherry-pick |
| 197 | + - Phase A:从 `7e0c3ae` 创建 `feat/gen-plan-convergence` |
| 198 | + - Phase B:对全部 9 个 SHA 执行 `cherry-pick -n`;跳过任何空 pick |
| 199 | + - Phase C:通过接受 `origin/main` 的值解决版本文件冲突 |
| 200 | + - Phase D:验证结果非空;整理并提交代码变更 |
| 201 | + |
| 202 | +3. 里程碑 3:分析文档 |
| 203 | + - Phase A:分析净 diff,理解全部 5 个子特性 |
| 204 | + - Phase B:编写 `docs/f2-gen-plan-convergence-analysis.md`(仅英文) |
| 205 | + - Phase C:将分析文档作为分支上的第二个提交 |
| 206 | + |
| 207 | +4. 里程碑 4:验证 |
| 208 | + - Phase A:运行 `./tests/test-gen-plan.sh` |
| 209 | + - Phase B:验证 `git diff --stat origin/main...HEAD` 为允许列表子集 |
| 210 | + - Phase C:确认 `git status` 干净,且该分支不存在任何远程 ref |
| 211 | + |
| 212 | +里程碑 2 与里程碑 3 部分重叠:里程碑 3 的分析文档需要基于里程碑 2 Phase B 的 cherry-pick 暂存结果进行检查。 |
| 213 | +但分析文档的提交顺序在代码提交之后。 |
| 214 | + |
| 215 | +## 任务拆解 |
| 216 | + |
| 217 | +每个任务都恰好包含一个路由 tag: |
| 218 | +- `coding`:由 Codex worker 实现(`/humanize:codex-worker`) |
| 219 | +- `analyze`:通过 Codex analyzer 执行(`/humanize:ask-codex`) |
| 220 | + |
| 221 | +| Task ID | 描述 | 目标 AC | Tag | 依赖 | |
| 222 | +|---------|-------------|-----------|-----|------------| |
| 223 | +| task1 | 拉取 origin;用 `git cat-file -e` 验证全部 9 个 F2 SHA 存在 | AC-2 | coding | - | |
| 224 | +| task2 | 从 `origin/main` 的 `7e0c3ae` 创建 `feat/gen-plan-convergence` 分支 | AC-2 | coding | task1 | |
| 225 | +| task3 | 对全部 9 个 SHA 执行 `cherry-pick -n`;用 `--ours` 解决版本文件冲突;跳过空 pick | AC-3 | coding | task2 | |
| 226 | +| task4 | 通过 `add -p` 整理暂存变更;验证非空;提交代码变更(commit 1) | AC-3, AC-5 | coding | task3 | |
| 227 | +| task5 | 分析净 diff;编写并提交 `docs/f2-gen-plan-convergence-analysis.md`(commit 2) | AC-1, AC-5, AC-6 | analyze | task4 | |
| 228 | +| task6 | 在 feature 分支上运行 `./tests/test-gen-plan.sh` | AC-3 | coding | task4 | |
| 229 | +| task7 | 验证 diff 为允许列表子集;确认版本延后策略已文档化 | AC-3, AC-6 | analyze | task4, task5 | |
| 230 | +| task8 | 最终检查:工作区干净、未远程 push、分支存在且 base 正确 | AC-2, AC-4, AC-5 | coding | task5, task6, task7 | |
| 231 | + |
| 232 | +## Codex 团队工作流 |
| 233 | + |
| 234 | +### Batch 1 - Planning Codex |
| 235 | +- 输入:原始草稿 + 仓库上下文(feature-commit-map.md、feature-pr-workflow.md) |
| 236 | +- 输出:风险图(RLCR loop 冲突——通过“无活跃状态”缓解;remote 命名不匹配——通过适配命令缓解; |
| 237 | + revert pair;版本 bump 冲突;upstream-main 缺失——通过直接使用 `origin/main` 缓解),缺失 |
| 238 | + 要求(输出位置、提交策略、版本策略、push 意图) |
| 239 | + |
| 240 | +### Batch 2 - Implementation Codex Team |
| 241 | +- 输入:本收敛后的计划 + 下方精简的实现交接摘要 |
| 242 | +- 输出:分支创建、cherry-pick 执行、冲突解决、分析文档、测试执行 |
| 243 | +- 交接摘要: |
| 244 | + - 范围:将 9 个 F2 SHA 抽取到 `feat/gen-plan-convergence`;编写分析文档;不 push |
| 245 | + - 关键约束:仅英文输出、不向任何 remote push、通过接受 `origin/main` 的值解决版本文件冲突、 |
| 246 | + 跳过空 pick |
| 247 | + - 高风险点:版本文件冲突(`.claude-plugin/plugin.json`、`.claude-plugin/marketplace.json`、 |
| 248 | + `README.md`),因为 F2 将版本从 v1.10.x bump 到 v1.11.1 base;revert pair(通过 |
| 249 | + `cherry-pick -n` 处理;`hooks/lib/loop-common.sh` 净效应为 0) |
| 250 | + - 必要验证:SHA 存在性检查、非空 patch 检查、diff 允许列表检查、`tests/test-gen-plan.sh` 通过、 |
| 251 | + 版本延后策略已文档化 |
| 252 | + |
| 253 | +### Batch 3 - Review Codex Team |
| 254 | +- 输入:实现总结、变更文件、测试结果 |
| 255 | +- 输出:独立质量评审,验证 F2 完整性、未泄露无关文件、未远程 push、分析文档正确性 |
| 256 | + |
| 257 | +## Claude-Codex 讨论 |
| 258 | + |
| 259 | +### 共识 |
| 260 | +- `cherry-pick -n`(批量不提交)在存在 revert pair 的情况下是正确做法 |
| 261 | +- `origin/main` 的 `7e0c3ae` 是正确的 base(因为 `origin` = upstream `humania-org`) |
| 262 | +- `docs/f2-gen-plan-convergence-analysis.md` 是分析文档的合适路径 |
| 263 | +- `tests/test-gen-plan.sh` 是主要验证命令(确认存在) |
| 264 | +- 版本 bump 对齐延后(对应 runbook 4.5,版本策略 gate) |
| 265 | +- 不 push 是用户对 `AGENTS.md` 默认自动 push 行为的显式覆盖 |
| 266 | + |
| 267 | +### 已解决分歧 |
| 268 | +- Push 策略 vs AGENTS.md:Codex 提出了冲突;通过注意到用户草稿明确写了 “don't push, just prepare locally” |
| 269 | + 而解决——任务级指令覆盖 AGENTS.md 默认值。 |
| 270 | +- AC-3 允许列表缺少分析文档:Codex 指出缺口;Claude 将 `docs/f2-gen-plan-convergence-analysis.md` |
| 271 | + 加入允许列表。 |
| 272 | +- 任务顺序(1 个提交 vs 文档创建):Codex 指出不一致;Claude 明确 2 个提交(先代码后文档),并将 |
| 273 | + task5 调整到 task4 之后。 |
| 274 | +- AC-3 语义:从“必须包含所有列出文件”改为“不出现允许列表之外的文件”(子集检查),以适配 revert pair |
| 275 | + 的净效应文件。 |
| 276 | +- 冲突解决策略:Codex 要求明确策略;Claude 指定对版本文件使用 `git checkout --ours` |
| 277 | + (接受 `origin/main` 的值)。 |
| 278 | +- 空 pick 处理:Codex 要求显式处理;Claude 添加 `git cherry-pick --skip`,用于跳过 base 中已存在的提交。 |
| 279 | + |
| 280 | +## 收敛日志 |
| 281 | + |
| 282 | +- Round 1:Codex 提出了 push 策略冲突(AGENTS.md)、SHA 描述不充分、测试脚本不确定性、版本文件描述模糊、 |
| 283 | + 分析文档路径未定。Claude 解决了全部 5 项。 |
| 284 | +- Round 2:Codex 提出了 AC-3 允许列表遗漏分析文档、任务顺序不一致(1 个提交 vs 文档创建顺序)、AC-3 |
| 285 | + “必需文件”语义过严。Claude 解决了全部 3 项(将文档加入允许列表、引入 2 提交方案、改为子集检查语义)。 |
| 286 | +- Round 3:Codex 提出了 cherry-pick 冲突解决(版本文件)与空 pick 处理。达到最大轮数。Claude 在最终计划中 |
| 287 | + 解决两项:版本冲突使用 `git checkout --ours`;空 pick 使用 `--skip`。 |
| 288 | +- 最终状态:`partially_converged`(达到最大 3 轮;Round 3 的问题已在最终计划中由 Claude 解决;无用户决策待定) |
| 289 | + |
| 290 | +## 待用户决定 |
| 291 | + |
| 292 | +无。所有 Claude/Codex 分歧均已技术性解决。原始中文草稿中的歧义(“不用提交”=“不提交/不 push”)通过阅读完整句子解决: |
| 293 | +“这次loop不用提交,只需要在本地做好提交的准备” = “不 push/提交这个 loop,只需要在本地把提交准备好”。 |
| 294 | +本地 git commit 是预期行为;不进行远程 push。 |
| 295 | + |
| 296 | +## 实现说明 |
| 297 | + |
| 298 | +### 代码风格要求 |
| 299 | +- 实现代码与注释中不得出现计划专用术语,例如 "AC-"、"Milestone"、"Step"、"Phase" 等工作流标记 |
| 300 | +- 这些术语仅用于计划文档,不应进入最终代码库 |
| 301 | +- 改用语义清晰、贴合领域的命名 |
| 302 | + |
| 303 | +--- |
| 304 | + |
| 305 | +## 原始设计草稿 |
| 306 | + |
| 307 | +<!-- 以下保留用户原始草稿以供参考,请勿修改。 --> |
| 308 | + |
| 309 | +--- 原始设计草稿开始 --- |
| 310 | + |
| 311 | +请你根据@/home/dyzhang/projects/pytorch_qemu/humanize/docs/feature-pr-workflow.md的内容,分析F2的功能和内容。 |
| 312 | +分析的结果要写成一个md文件. |
| 313 | + |
| 314 | +然后你要在本地创建F2 的branch分支,把相关的功能摘到里面去。 |
| 315 | + |
| 316 | +这次loop不用提交,只需要在本地做好提交的准备。 |
| 317 | + |
| 318 | + |
| 319 | +--- 原始设计草稿结束 --- |
0 commit comments