@chenmk/superflow 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INSTALL.en.md +106 -0
- package/INSTALL.md +664 -0
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/README.zh-CN.md +117 -0
- package/assets/context-templates/business-rules.md +98 -0
- package/assets/context-templates/decisions.md +153 -0
- package/assets/context-templates/external-systems.md +166 -0
- package/assets/context-templates/incidents.md +89 -0
- package/assets/manifest.json +53 -0
- package/assets/prompts/superflow-archive.md +9 -0
- package/assets/prompts/superflow-clarify.md +10 -0
- package/assets/prompts/superflow-design.md +10 -0
- package/assets/prompts/superflow-docs.md +10 -0
- package/assets/prompts/superflow-implement.md +10 -0
- package/assets/prompts/superflow-pipeline.md +13 -0
- package/assets/prompts/superflow-verify.md +10 -0
- package/assets/rules/superflow-phase-guard.md +50 -0
- package/assets/scripts/claude-auto-backup-hook.sh +313 -0
- package/assets/scripts/codex-auto-backup-hook.sh +361 -0
- package/assets/scripts/install-sql-pre-commit.sh +44 -0
- package/assets/scripts/superflow-contract-hooks.sh +744 -0
- package/assets/scripts/superflow-delivery-check.sh +315 -0
- package/assets/scripts/superflow-dependency-update-hook.sh +161 -0
- package/assets/scripts/superflow-enforce-hook.sh +70 -0
- package/assets/scripts/superflow-hook-guard.sh +132 -0
- package/assets/scripts/superflow-integration-evidence-hook.sh +80 -0
- package/assets/scripts/superflow-sql-sync-hook.py +950 -0
- package/assets/scripts/superflow-test-report-lint.py +433 -0
- package/assets/scripts/superflow-verify-integration.sh +90 -0
- package/assets/scripts/sync-settings-json.py +52 -0
- package/assets/skills/api-doc-changelog/SKILL.md +193 -0
- package/assets/skills/openspec-apply-change/SKILL.md +156 -0
- package/assets/skills/openspec-archive-change/SKILL.md +114 -0
- package/assets/skills/openspec-explore/SKILL.md +288 -0
- package/assets/skills/openspec-propose/SKILL.md +110 -0
- package/assets/skills/superflow-archive/SKILL.md +61 -0
- package/assets/skills/superflow-clarify/SKILL.md +146 -0
- package/assets/skills/superflow-clarify/agents/openai.yaml +4 -0
- package/assets/skills/superflow-design/SKILL.md +83 -0
- package/assets/skills/superflow-design/agents/openai.yaml +4 -0
- package/assets/skills/superflow-docs/SKILL.md +316 -0
- package/assets/skills/superflow-docs/agents/openai.yaml +4 -0
- package/assets/skills/superflow-hotfix/SKILL.md +48 -0
- package/assets/skills/superflow-implement/SKILL.md +461 -0
- package/assets/skills/superflow-implement/agents/openai.yaml +4 -0
- package/assets/skills/superflow-pipeline/SKILL.md +844 -0
- package/assets/skills/superflow-pipeline/agents/openai.yaml +4 -0
- package/assets/skills/superflow-pipeline/references/api-design-template.md +431 -0
- package/assets/skills/superflow-pipeline/references/architecture-design-template.md +119 -0
- package/assets/skills/superflow-pipeline/references/batch-prompt-template.md +536 -0
- package/assets/skills/superflow-pipeline/references/batch-split-guide.md +140 -0
- package/assets/skills/superflow-pipeline/references/decision-point.md +30 -0
- package/assets/skills/superflow-pipeline/references/dirty-worktree.md +35 -0
- package/assets/skills/superflow-pipeline/references/document-templates.md +123 -0
- package/assets/skills/superflow-pipeline/references/feature-gated-workflow.md +124 -0
- package/assets/skills/superflow-pipeline/references/implementation-prompt-template.md +1056 -0
- package/assets/skills/superflow-pipeline/references/mock-strategy-guide.md +86 -0
- package/assets/skills/superflow-pipeline/references/openspec-format.md +57 -0
- package/assets/skills/superflow-pipeline/references/orchestration.md +639 -0
- package/assets/skills/superflow-pipeline/references/p0-baseline-template.md +174 -0
- package/assets/skills/superflow-pipeline/references/project-config.md +40 -0
- package/assets/skills/superflow-pipeline/references/prompt-usage-template.md +152 -0
- package/assets/skills/superflow-pipeline/references/quality-gate.md +299 -0
- package/assets/skills/superflow-pipeline/references/quality-standards.md +190 -0
- package/assets/skills/superflow-pipeline/references/reviewer-checklist.md +154 -0
- package/assets/skills/superflow-pipeline/references/sql-risk-review-checklist.md +323 -0
- package/assets/skills/superflow-pipeline/references/subagent-progress.md +90 -0
- package/assets/skills/superflow-pipeline/references/superpower-technical-design-template.md +125 -0
- package/assets/skills/superflow-pipeline/references/test-execution-template.md +220 -0
- package/assets/skills/superflow-pipeline/references/test-guide.md +30 -0
- package/assets/skills/superflow-pipeline/references/traceability-matrix.md +106 -0
- package/assets/skills/superflow-pipeline/references/validation-integrity.md +134 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-archive.sh +178 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-env.sh +118 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-guard.sh +428 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-handoff.sh +296 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-state.sh +574 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-status.sh +172 -0
- package/assets/skills/superflow-pipeline/scripts/superflow-yaml-validate.sh +138 -0
- package/assets/skills/superflow-table-impact-analysis/SKILL.md +77 -0
- package/assets/skills/superflow-tweak/SKILL.md +46 -0
- package/assets/skills/superflow-verify/SKILL.md +112 -0
- package/assets/skills-en/api-doc-changelog/SKILL.md +193 -0
- package/assets/skills-en/openspec-apply-change/SKILL.md +156 -0
- package/assets/skills-en/openspec-archive-change/SKILL.md +114 -0
- package/assets/skills-en/openspec-explore/SKILL.md +288 -0
- package/assets/skills-en/openspec-propose/SKILL.md +110 -0
- package/assets/skills-en/superflow-archive/SKILL.md +61 -0
- package/assets/skills-en/superflow-clarify/SKILL.md +146 -0
- package/assets/skills-en/superflow-clarify/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-design/SKILL.md +83 -0
- package/assets/skills-en/superflow-design/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-docs/SKILL.md +316 -0
- package/assets/skills-en/superflow-docs/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-hotfix/SKILL.md +48 -0
- package/assets/skills-en/superflow-implement/SKILL.md +461 -0
- package/assets/skills-en/superflow-implement/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-pipeline/SKILL.md +844 -0
- package/assets/skills-en/superflow-pipeline/agents/openai.yaml +4 -0
- package/assets/skills-en/superflow-pipeline/references/api-design-template.md +431 -0
- package/assets/skills-en/superflow-pipeline/references/architecture-design-template.md +119 -0
- package/assets/skills-en/superflow-pipeline/references/batch-prompt-template.md +536 -0
- package/assets/skills-en/superflow-pipeline/references/batch-split-guide.md +140 -0
- package/assets/skills-en/superflow-pipeline/references/decision-point.md +30 -0
- package/assets/skills-en/superflow-pipeline/references/dirty-worktree.md +35 -0
- package/assets/skills-en/superflow-pipeline/references/document-templates.md +123 -0
- package/assets/skills-en/superflow-pipeline/references/feature-gated-workflow.md +124 -0
- package/assets/skills-en/superflow-pipeline/references/implementation-prompt-template.md +1056 -0
- package/assets/skills-en/superflow-pipeline/references/mock-strategy-guide.md +86 -0
- package/assets/skills-en/superflow-pipeline/references/openspec-format.md +57 -0
- package/assets/skills-en/superflow-pipeline/references/orchestration.md +639 -0
- package/assets/skills-en/superflow-pipeline/references/p0-baseline-template.md +174 -0
- package/assets/skills-en/superflow-pipeline/references/project-config.md +40 -0
- package/assets/skills-en/superflow-pipeline/references/prompt-usage-template.md +152 -0
- package/assets/skills-en/superflow-pipeline/references/quality-gate.md +299 -0
- package/assets/skills-en/superflow-pipeline/references/quality-standards.md +190 -0
- package/assets/skills-en/superflow-pipeline/references/reviewer-checklist.md +154 -0
- package/assets/skills-en/superflow-pipeline/references/sql-risk-review-checklist.md +323 -0
- package/assets/skills-en/superflow-pipeline/references/subagent-progress.md +90 -0
- package/assets/skills-en/superflow-pipeline/references/superpower-technical-design-template.md +125 -0
- package/assets/skills-en/superflow-pipeline/references/test-execution-template.md +220 -0
- package/assets/skills-en/superflow-pipeline/references/test-guide.md +30 -0
- package/assets/skills-en/superflow-pipeline/references/traceability-matrix.md +106 -0
- package/assets/skills-en/superflow-pipeline/references/validation-integrity.md +134 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-archive.sh +178 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-env.sh +118 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-guard.sh +428 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-handoff.sh +296 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-state.sh +574 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-status.sh +172 -0
- package/assets/skills-en/superflow-pipeline/scripts/superflow-yaml-validate.sh +138 -0
- package/assets/skills-en/superflow-table-impact-analysis/SKILL.md +77 -0
- package/assets/skills-en/superflow-tweak/SKILL.md +46 -0
- package/assets/skills-en/superflow-verify/SKILL.md +112 -0
- package/dist/cli/index.js +186 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/archive.js +6 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/clarify.js +6 -0
- package/dist/commands/clarify.js.map +1 -0
- package/dist/commands/design.js +6 -0
- package/dist/commands/design.js.map +1 -0
- package/dist/commands/docs.js +6 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/doctor.js +473 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/implement.js +6 -0
- package/dist/commands/implement.js.map +1 -0
- package/dist/commands/init.js +471 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/pipeline.js +6 -0
- package/dist/commands/pipeline.js.map +1 -0
- package/dist/commands/scan.js +59 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.js +173 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.js +213 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.js +187 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.js +6 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/assets.js +27 -0
- package/dist/core/assets.js.map +1 -0
- package/dist/core/context.js +100 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/dependencies.js +146 -0
- package/dist/core/dependencies.js.map +1 -0
- package/dist/core/detect.js +71 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/i18n.js +103 -0
- package/dist/core/i18n.js.map +1 -0
- package/dist/core/integrity.js +46 -0
- package/dist/core/integrity.js.map +1 -0
- package/dist/core/manifest.js +18 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/prompts.js +20 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/registry.js +134 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/rules.js +17 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/scripts.js +40 -0
- package/dist/core/scripts.js.map +1 -0
- package/dist/core/skill-check.js +31 -0
- package/dist/core/skill-check.js.map +1 -0
- package/dist/core/skills.js +56 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/state.js +43 -0
- package/dist/core/state.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/path.js +11 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/shell.js +29 -0
- package/dist/utils/shell.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
# 实现编排指南:多 Agent 协作开发
|
|
2
|
+
|
|
3
|
+
> **分批实现优先**:对复杂需求,编排前必须先按 [分批实现拆分指南](batch-split-guide.md) 拆分为 P0 → P1 → P2 → P3 → P4 批次。每批独立编排、独立验收,通过后才能开始下一批。
|
|
4
|
+
|
|
5
|
+
## 编排决策
|
|
6
|
+
|
|
7
|
+
### 何时使用单 Agent vs 多 Agent
|
|
8
|
+
|
|
9
|
+
| 场景 | 推荐方案 | 理由 |
|
|
10
|
+
|------|---------|------|
|
|
11
|
+
| 任务数量 <= 5 个,无复杂依赖 | 单 Agent 串行 | 上下文切换成本低于协作成本 |
|
|
12
|
+
| 任务数量 > 5 个,有明确分组 | Agent Team(2-4 人) | 并行开发,缩短周期 |
|
|
13
|
+
| 涉及多个模块(Controller/Service/Mapper) | Agent Team | 模块间解耦,可并行 |
|
|
14
|
+
| 有严格的跨模块依赖 | 单 Agent 或 Leader + Worker | 避免冲突,顺序执行 |
|
|
15
|
+
| 需要同时修改同一文件 | 单 Agent | 避免代码冲突 |
|
|
16
|
+
|
|
17
|
+
### 任务分组原则
|
|
18
|
+
|
|
19
|
+
按**文件亲和性**和**依赖关系**分组:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
Group 1: Controller 层变更(Bug 9, 10)
|
|
23
|
+
- 同一文件 PvdDebugController.java
|
|
24
|
+
- 无外部依赖
|
|
25
|
+
|
|
26
|
+
Group 2: Service 核心逻辑(Bug 1, 2, 5, 8)
|
|
27
|
+
- DebugFlowService.java
|
|
28
|
+
- AiRecognitionService.java
|
|
29
|
+
- 有内部依赖(Bug 8 依赖 Bug 2 的冲突处理)
|
|
30
|
+
|
|
31
|
+
Group 3: 灯色控制(Bug 3, 4)
|
|
32
|
+
- LightControlService.java
|
|
33
|
+
- DeviceOnlineLightSyncListener.java
|
|
34
|
+
- 共享 Listener 逻辑
|
|
35
|
+
|
|
36
|
+
Group 4: 独立模块(Bug 6, 7, 11)
|
|
37
|
+
- MapManagerServiceImpl.java
|
|
38
|
+
- ModeSwitchService.java
|
|
39
|
+
- PvdDebugReportExportService.java
|
|
40
|
+
- 完全独立,可并行
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Agent 角色定义
|
|
46
|
+
|
|
47
|
+
### 角色 1:Leader(主控 Agent)
|
|
48
|
+
|
|
49
|
+
**职责**:
|
|
50
|
+
- 读取 tasks.md 和 design.md,理解全部任务
|
|
51
|
+
- 创建 TaskList,按依赖拓扑排序
|
|
52
|
+
- 将任务分配给 Worker Agent
|
|
53
|
+
- 监控进度,处理阻塞任务
|
|
54
|
+
- **亲自执行集成测试和回归测试(不依赖 Worker 报告)**
|
|
55
|
+
- 汇总质量报告
|
|
56
|
+
|
|
57
|
+
**必须遵守**:
|
|
58
|
+
- **不要直接编码**,只负责协调和集成验证
|
|
59
|
+
- **不信任 Worker 的测试报告**,必须亲自验证至少 30% 的关键用例
|
|
60
|
+
- **必须执行进程验证**,确认测试的是新代码而非旧进程
|
|
61
|
+
|
|
62
|
+
### 角色 2:Worker(执行 Agent)
|
|
63
|
+
|
|
64
|
+
**职责**:
|
|
65
|
+
- 接收 Leader 分配的 1-3 个相关任务
|
|
66
|
+
- 读取 design.md 对应章节理解设计
|
|
67
|
+
- 修改代码、编译、**启动应用、真实接口测试**
|
|
68
|
+
- 向 Leader 报告完成状态(包含进程验证证据)
|
|
69
|
+
|
|
70
|
+
**必须遵守**:
|
|
71
|
+
- 不修改分配任务之外的文件
|
|
72
|
+
- 每完成一个任务立即报告(不等全组完成)
|
|
73
|
+
- 遇到阻塞立即上报,不自行绕过
|
|
74
|
+
- **必须执行进程验证后才能报告完成**
|
|
75
|
+
- **编译成功 ≠ 完成,必须通过全部质量门禁才算完成**
|
|
76
|
+
|
|
77
|
+
### 角色 3:Tester(独立测试 Agent,强制参与)
|
|
78
|
+
|
|
79
|
+
**职责**:
|
|
80
|
+
- **独立于 Worker**,接收 Leader 分配的测试任务
|
|
81
|
+
- 按 tests.md 的用例独立执行测试(不依赖 Worker 的自测报告)
|
|
82
|
+
- 验证接口、数据库、日志,输出客观测试结果
|
|
83
|
+
- 发现失败时,向 Leader 报告失败现象,不直接向 Worker 反馈
|
|
84
|
+
|
|
85
|
+
**必须遵守**:
|
|
86
|
+
- **与 Worker 完全分离**:Worker 负责开发,Tester 负责验证,不能是同一人
|
|
87
|
+
- **独立验证**:不参考 Worker 的测试报告,从头执行测试
|
|
88
|
+
- **客观报告**:如实报告失败,不替 Worker 找理由("可能环境问题"、"应该没改这块")
|
|
89
|
+
- **覆盖全部用例**:必须执行 tests.md 中所有标注 [自动化] 的用例,不能抽样
|
|
90
|
+
|
|
91
|
+
**Tester 的测试流程**:
|
|
92
|
+
```
|
|
93
|
+
接收测试任务 → 读取 tests.md → 独立执行测试
|
|
94
|
+
→ 通过:向 Leader 报告"测试通过,证据如下..."
|
|
95
|
+
→ 失败:向 Leader 报告"测试失败,现象如下..."
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Tester 报告格式**:
|
|
99
|
+
```
|
|
100
|
+
测试报告:
|
|
101
|
+
- 任务 ID: Task 5.1
|
|
102
|
+
- 测试人: Tester(独立)
|
|
103
|
+
- 测试用例: 共 X 个,执行 X 个,通过 X 个,失败 X 个
|
|
104
|
+
- 失败详情:
|
|
105
|
+
- 用例 1: [接口/断言/数据库/日志] 预期... 实际...
|
|
106
|
+
- 用例 2: ...
|
|
107
|
+
- 结论: 通过 / 不通过
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 角色 4:Reviewer(评审 Agent,可选)
|
|
111
|
+
|
|
112
|
+
**职责**:
|
|
113
|
+
- 对 Worker 提交的代码进行 review
|
|
114
|
+
- 检查编码规范、安全漏洞、性能问题
|
|
115
|
+
- 验证是否符合 design.md 的设计方案
|
|
116
|
+
- 使用 `code-review-java` skill 进行评审
|
|
117
|
+
|
|
118
|
+
**必须遵守**:
|
|
119
|
+
- **Worker 必须在测试前先自审代码**,不能等全部编码完成再补审
|
|
120
|
+
- **Reviewer 必须在 Tester 测试前完成评审**,不能事后补做
|
|
121
|
+
- 发现 CRITICAL/HIGH 级别问题,Worker 必须修复并重新评审后才能继续
|
|
122
|
+
- build 阶段准备进入 verify 前,Leader 必须加载 Superpowers
|
|
123
|
+
`requesting-code-review`,完成一次面向全量 diff、OpenSpec/SDD 合同、
|
|
124
|
+
API/DB/真实入口证据和任务勾选一致性的最终评审;未完成该评审不得运行
|
|
125
|
+
`superflow-guard.sh ... implement --apply`。
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 交付判断标准(强制执行)
|
|
130
|
+
|
|
131
|
+
### 核心原则
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
❌ 完成代码修改 ≠ 完成任务
|
|
135
|
+
❌ 编译成功 ≠ 完成任务
|
|
136
|
+
❌ 单元测试通过 ≠ 完成任务
|
|
137
|
+
❌ Worker 自测通过 ≠ 完成任务
|
|
138
|
+
✅ 集成测试完成(启动 + 调接口 + 验数据库 + 查日志)= 任务完成前提
|
|
139
|
+
✅ 独立 Tester 验证通过 = 任务完成
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 任务完成定义
|
|
143
|
+
|
|
144
|
+
一个任务只有满足以下**全部条件**,才能标记为"完成":
|
|
145
|
+
|
|
146
|
+
| # | 条件 | 验证人 | 说明 |
|
|
147
|
+
|---|------|--------|------|
|
|
148
|
+
| 1 | 代码已修改 | Worker | git diff 确认 |
|
|
149
|
+
| 2 | 代码自审通过 | Worker | 已执行 review,无 CRITICAL/HIGH |
|
|
150
|
+
| 3 | 编译通过 | Worker | clean compile 无 ERROR |
|
|
151
|
+
| 4 | 应用已重新启动 | Worker | 进程验证通过(新进程、新时间戳) |
|
|
152
|
+
| 5 | **接口已真实调用** | **Worker** | **逐项执行 L3 checklist,记录 curl + 响应** |
|
|
153
|
+
| 6 | **数据库已验证** | **Worker** | **SHOW CREATE TABLE / SELECT 确认数据状态** |
|
|
154
|
+
| 7 | **日志已检查** | **Worker** | **grep ERROR 无 ERROR** |
|
|
155
|
+
| 8 | test-report 已回填 | Worker | 包含 curl、响应、DB、日志证据 |
|
|
156
|
+
| 9 | **独立 Tester 测试通过** | **Tester** | **Tester 独立执行全部用例,客观报告** |
|
|
157
|
+
| 10 | Leader 已独立验证 | Leader | Leader 亲自验证或抽查 |
|
|
158
|
+
| 11 | build→verify 最终代码评审通过 | Leader/Reviewer | 使用 `requesting-code-review`,确认无 CRITICAL/HIGH 遗留 |
|
|
159
|
+
|
|
160
|
+
**关键规则**:
|
|
161
|
+
- **Worker 不只是开发,还必须完成步骤 4~8(启动 + 接口调用 + 数据库验证 + 日志检查 + 报告回填)**
|
|
162
|
+
- **缺少步骤 4~8 中任一证据,Worker 不得报告"完成"**
|
|
163
|
+
- **Tester 独立测试后,向 Leader 报告客观结果(通过/失败)**
|
|
164
|
+
- **Leader 根据 Tester 报告 + Worker 证据判断是否完成,不信任口头报告**
|
|
165
|
+
- **build 阶段必须先完成最终 code review,再进入 verify;verify 阶段负责复验、
|
|
166
|
+
失败决策、branch/worktree 收口和 archive 前确认,不替代 build 阶段评审**
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 构建工具命令矩阵
|
|
171
|
+
|
|
172
|
+
实现阶段涉及编译、启动、测试,**必须先识别项目使用的构建工具**。
|
|
173
|
+
|
|
174
|
+
### 如何判断构建工具
|
|
175
|
+
|
|
176
|
+
1. 检查项目根目录:
|
|
177
|
+
- 存在 `pom.xml` → **Maven**
|
|
178
|
+
- 存在 `build.gradle` 或 `build.gradle.kts` → **Gradle**
|
|
179
|
+
2. 如果两者都存在,优先使用 Gradle(较新的项目)
|
|
180
|
+
|
|
181
|
+
### 命令对照表
|
|
182
|
+
|
|
183
|
+
| 操作 | Maven | Gradle |
|
|
184
|
+
|------|-------|--------|
|
|
185
|
+
| 编译 | `mvn clean compile -DskipTests` | `./gradlew clean compileJava -x test` |
|
|
186
|
+
| 单元测试 | `mvn test` | `./gradlew test` |
|
|
187
|
+
| 启动应用 | `mvn spring-boot:run -Dspring-boot.run.profiles={profile}` | `./gradlew bootRun --args='--spring.profiles.active={profile}'` |
|
|
188
|
+
| 打包 | `mvn clean package -DskipTests` | `./gradlew clean bootJar -x test` |
|
|
189
|
+
|
|
190
|
+
### 关键注意事项
|
|
191
|
+
|
|
192
|
+
1. **Spring Profile 传递方式不同**
|
|
193
|
+
- Maven: `-Dspring-boot.run.profiles=cmk`
|
|
194
|
+
- Gradle: `--args='--spring.profiles.active=cmk'`
|
|
195
|
+
- **绝对不能用 `-D` 给 Gradle 传 profile,会无效!**
|
|
196
|
+
|
|
197
|
+
2. **必须先 clean**
|
|
198
|
+
- 每次修改后必须执行 clean,确保加载新编译的 class
|
|
199
|
+
- 不能依赖增量编译
|
|
200
|
+
|
|
201
|
+
3. **启动前先停止旧进程(只停自己的,不碰别人的)**
|
|
202
|
+
- `pkill -f "spring-boot:run"` 或 `pkill -f "GradleDaemon"`
|
|
203
|
+
- **启动前必须检查端口占用**:`lsof -i :{port}` 或 `netstat -tlnp | grep {port}`
|
|
204
|
+
- **如果端口被其他 agent 占用**:自己换一个端口启动,不得关闭其他进程
|
|
205
|
+
- 确认端口释放后再启动
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 编排工作流
|
|
210
|
+
|
|
211
|
+
### Phase 1:初始化(Leader 执行)
|
|
212
|
+
|
|
213
|
+
1. **读取文档**:
|
|
214
|
+
```
|
|
215
|
+
design.md → 理解源码修改点
|
|
216
|
+
tasks.md → 提取所有任务和依赖
|
|
217
|
+
tests.md → 提取验证方法
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
2. **识别构建工具**:
|
|
221
|
+
- 检查 `pom.xml` 或 `build.gradle`
|
|
222
|
+
- 确定启动命令(Maven vs Gradle)
|
|
223
|
+
|
|
224
|
+
3. **构建任务依赖图**:
|
|
225
|
+
```
|
|
226
|
+
Task 5.1 (markException修复)
|
|
227
|
+
|
|
|
228
|
+
Task 7.1 (switchMode释放锁)
|
|
229
|
+
|
|
|
230
|
+
Task 9.1 + 10.1 (Controller修改)
|
|
231
|
+
|
|
|
232
|
+
Task 2.1 + 8.1 (绑定流程)
|
|
233
|
+
|
|
|
234
|
+
Task 1.1 (AI识别)
|
|
235
|
+
|
|
|
236
|
+
Task 3.1 + 4.1 (灯色同步)
|
|
237
|
+
|
|
|
238
|
+
Task 6.1 (地图校验)
|
|
239
|
+
Task 11.1 (导出统计)
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
4. **分组决策**:
|
|
243
|
+
- Group A (独立): Task 5, 7, 9, 10, 11 → Worker-1
|
|
244
|
+
- Group B (绑定链): Task 1, 2, 8 → Worker-2
|
|
245
|
+
- Group C (灯色链): Task 3, 4 → Worker-3
|
|
246
|
+
- Group D (独立): Task 6 → Worker-4
|
|
247
|
+
|
|
248
|
+
### Phase 2:并行开发与测试(Workers + Testers 执行)
|
|
249
|
+
|
|
250
|
+
**Worker 流程(Worker 只做开发到启动,Tester 独立验证):**
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
Worker 流程:
|
|
254
|
+
[开始] → 数据库前置门禁(SHOW CREATE TABLE 确认结构)→ 修改代码 → 代码自审 → 编译(clean) → 进程验证 → 启动应用 → [报告:应用已启动,等待测试]
|
|
255
|
+
↑ |
|
|
256
|
+
│ 数据库缺失时 → 执行汇总 SQL → 复查确认 ──┘
|
|
257
|
+
↑ ↑ |
|
|
258
|
+
│ └───────── 自审发现问题,修复后重新自审 ────┤
|
|
259
|
+
└──────────────── 编译/启动失败,修复后重新编译 ───┘
|
|
260
|
+
|
|
261
|
+
Tester 流程(Worker 启动后):
|
|
262
|
+
[接收任务] → 读取 tests.md → 独立执行测试 → 数据库验证 → 日志检查 → [报告:测试通过/失败]
|
|
263
|
+
↑ |
|
|
264
|
+
└──────── 测试失败,报告 Leader ────────────────┘
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
**关键分离原则**:
|
|
268
|
+
- Worker 不报告"测试通过",只报告"应用已启动,可供测试"
|
|
269
|
+
- Tester 独立执行测试,不参考 Worker 的自测结果
|
|
270
|
+
- Tester 的测试报告直接发给 Leader,不发给 Worker
|
|
271
|
+
- Leader 根据 Tester 报告判断任务是否完成
|
|
272
|
+
|
|
273
|
+
**代码自审要求(每个任务修改后必须先做)**:
|
|
274
|
+
1. 读取修改后的文件,逐行检查
|
|
275
|
+
2. 对照 design.md 检查是否按设计实现
|
|
276
|
+
3. 检查:空指针风险、异常处理、事务边界、日志规范
|
|
277
|
+
4. 使用 `code-review-java` skill 进行正式评审
|
|
278
|
+
5. **自审未通过不得进入编译环节**
|
|
279
|
+
|
|
280
|
+
**Worker-1** 执行 Group A:
|
|
281
|
+
```
|
|
282
|
+
[开始] → 修改 markException → 代码自审 → 编译 → 进程验证 → 启动 → 接口测试 → DB验证 → 日志检查 → [完成报告]
|
|
283
|
+
→ 修改 switchMode → 代码自审 → 编译 → 进程验证 → 启动 → 接口测试 → DB验证 → 日志检查 → [完成报告]
|
|
284
|
+
→ 修改 Controller → 代码自审 → 编译 → 进程验证 → 启动 → 接口测试 → DB验证 → 日志检查 → [完成报告]
|
|
285
|
+
→ 修改导出统计 → 代码自审 → 编译 → 进程验证 → 启动 → 接口测试 → DB验证 → 日志检查 → [完成报告]
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**Worker-2** 执行 Group B(注意依赖顺序):
|
|
289
|
+
```
|
|
290
|
+
[开始] → 修改 aiRecognize → 代码自审 → 编译 → 进程验证 → 启动 → 接口测试 → DB验证 → 日志检查 → [完成报告]
|
|
291
|
+
→ 修改 confirmAndBind → 代码自审 → 编译 → 进程验证 → 启动 → 接口测试 → DB验证 → 日志检查 → [完成报告]
|
|
292
|
+
→ 修改 markConflictAsException → 代码自审 → 编译 → 进程验证 → 启动 → 接口测试 → DB验证 → 日志检查 → [完成报告]
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Phase 3:进程验证(Worker 和 Leader 都必须执行)
|
|
296
|
+
|
|
297
|
+
#### 为什么需要进程验证
|
|
298
|
+
|
|
299
|
+
Worker 可能看到端口监听就误以为应用启动成功,但实际上:
|
|
300
|
+
- 端口被旧进程占用(IDEA 之前启动的)
|
|
301
|
+
- 启动命令错误导致 profile 未生效
|
|
302
|
+
- 增量编译未加载新代码
|
|
303
|
+
|
|
304
|
+
#### 验证步骤
|
|
305
|
+
|
|
306
|
+
**步骤 1:停止所有旧进程**
|
|
307
|
+
```bash
|
|
308
|
+
pkill -f "spring-boot:run" 2>/dev/null || true
|
|
309
|
+
pkill -f "GradleDaemon" 2>/dev/null || true
|
|
310
|
+
sleep 2
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**步骤 2:确认端口已释放**
|
|
314
|
+
```bash
|
|
315
|
+
# 应该无输出,如果有输出说明旧进程还在
|
|
316
|
+
netstat -tlnp 2>/dev/null | grep {port} || ss -tlnp | grep {port}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**步骤 3:清理并重新编译**
|
|
320
|
+
```bash
|
|
321
|
+
# Maven
|
|
322
|
+
mvn clean compile -DskipTests
|
|
323
|
+
|
|
324
|
+
# Gradle
|
|
325
|
+
./gradlew clean compileJava -x test
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**步骤 4:启动应用**
|
|
329
|
+
```bash
|
|
330
|
+
# Maven
|
|
331
|
+
nohup mvn spring-boot:run -Dspring-boot.run.profiles={profile} > app.log 2>&1 &
|
|
332
|
+
|
|
333
|
+
# Gradle
|
|
334
|
+
nohup ./gradlew bootRun --args='--spring.profiles.active={profile}' > app.log 2>&1 &
|
|
335
|
+
|
|
336
|
+
echo $! > /tmp/app.pid # 记录 PID
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
**步骤 5:等待并确认是新进程**
|
|
340
|
+
```bash
|
|
341
|
+
sleep 15 # 等待启动
|
|
342
|
+
|
|
343
|
+
# 获取监听端口的 PID
|
|
344
|
+
NEW_PID=$(cat /tmp/app.pid)
|
|
345
|
+
|
|
346
|
+
# 检查进程存在且启动时间接近当前时间
|
|
347
|
+
ps -o pid,lstart,cmd -p $NEW_PID
|
|
348
|
+
|
|
349
|
+
# 检查端口绑定的是否是这个 PID
|
|
350
|
+
netstat -tlnp | grep {port}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
**步骤 6:检查日志确认本次启动**
|
|
354
|
+
```bash
|
|
355
|
+
tail -30 app.log
|
|
356
|
+
# 日志中必须有本次启动的时间戳
|
|
357
|
+
# 如果看到几天前的日志或旧时间戳,说明是旧进程!必须停止重来!
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
**步骤 7:验证加载的是新代码**
|
|
361
|
+
```bash
|
|
362
|
+
# Gradle
|
|
363
|
+
ls -la build/classes/java/main/{修改的类路径}.class
|
|
364
|
+
|
|
365
|
+
# Maven
|
|
366
|
+
ls -la target/classes/{修改的类路径}.class
|
|
367
|
+
|
|
368
|
+
# 时间戳应该在本次编译时间附近(5分钟内)
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
**步骤 8:健康检查**
|
|
372
|
+
```bash
|
|
373
|
+
curl -s http://localhost:{port}{context-path}/actuator/health | grep UP
|
|
374
|
+
# 必须返回 UP,否则启动失败
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### Phase 4:集成验证(Leader 执行)
|
|
378
|
+
|
|
379
|
+
所有 Worker 完成后:
|
|
380
|
+
|
|
381
|
+
1. **合并检查**:确认没有同一文件的冲突修改
|
|
382
|
+
2. **Leader 亲自执行全量编译**:使用正确的构建工具命令
|
|
383
|
+
3. **Leader 亲自执行进程验证**:按 Phase 3 步骤执行
|
|
384
|
+
4. **Leader 亲自执行回归测试**:
|
|
385
|
+
```
|
|
386
|
+
start → aiRecognize → confirm → finish
|
|
387
|
+
```
|
|
388
|
+
5. **全链路验证**:
|
|
389
|
+
- Bug 1: AI 识别后 debug_status = 1
|
|
390
|
+
- Bug 2: 绑定后 debug_status = 2,灯色 = AUTO_CTRL
|
|
391
|
+
- Bug 3: 已完成设备上线后灯色 = AUTO_CTRL
|
|
392
|
+
- Bug 4: PENDING 设备灯色 = PURPLE+FLICKER
|
|
393
|
+
- Bug 5: markException 后 debug_status = 3
|
|
394
|
+
- Bug 6: 地图保存冲突时事务回滚
|
|
395
|
+
- Bug 7: 模式切换后可立即再次切换
|
|
396
|
+
- Bug 8: 绑定冲突后 debug_status = 3
|
|
397
|
+
- Bug 9: 成功时 message = "绑定成功"
|
|
398
|
+
- Bug 10: 冲突时 code != 0
|
|
399
|
+
- Bug 11: 导出 Excel 设备总数按 IP 去重
|
|
400
|
+
|
|
401
|
+
### Phase 5:强制质量门禁(必须全部满足)
|
|
402
|
+
|
|
403
|
+
⚠️ **以下门禁为强制要求,任一未通过不得交付。**
|
|
404
|
+
|
|
405
|
+
#### 门禁 1:编译门禁
|
|
406
|
+
- **执行**:`mvn clean compile -DskipTests` 或 `./gradlew clean compileJava -x test`
|
|
407
|
+
- **通过标准**:BUILD SUCCESS,无 ERROR 级别日志
|
|
408
|
+
- **验证人**:Worker 执行,Leader 抽查
|
|
409
|
+
- **失败处理**:修复代码后重新 clean compile
|
|
410
|
+
|
|
411
|
+
#### 门禁 2:启动门禁
|
|
412
|
+
- **执行**:按构建工具命令矩阵正确启动应用
|
|
413
|
+
- **通过标准**:
|
|
414
|
+
1. 进程是新启动的(非旧进程)——通过进程验证确认
|
|
415
|
+
2. 健康检查返回 UP:`curl http://localhost:{port}{context-path}/actuator/health`
|
|
416
|
+
3. 日志中出现本次启动时间戳
|
|
417
|
+
- **验证人**:Worker 执行并报告 PID,Leader 独立验证
|
|
418
|
+
- **禁止**:看到端口监听就报告 UP,必须验证是新进程
|
|
419
|
+
|
|
420
|
+
#### 门禁 3:接口测试门禁
|
|
421
|
+
- **执行**:按 tests.md 逐个执行 curl 命令
|
|
422
|
+
- **通过标准**:所有 Scenario 的断言全部通过
|
|
423
|
+
- **验证人**:Worker 执行,Leader 独立验证(不信任 Worker 报告)
|
|
424
|
+
- **禁止**:仅 grep 代码就认为修复正确,必须实际调接口
|
|
425
|
+
|
|
426
|
+
#### 门禁 4:数据库验证门禁
|
|
427
|
+
- **执行**:mysql 查询验证数据状态
|
|
428
|
+
- **通过标准**:数据状态符合 tests.md 断言
|
|
429
|
+
- **验证人**:Worker 执行,Leader 抽查关键数据
|
|
430
|
+
|
|
431
|
+
#### 门禁 5:日志门禁
|
|
432
|
+
- **执行**:`grep ERROR logs/mpgs.log` 或 `grep ERROR app.log`
|
|
433
|
+
- **通过标准**:
|
|
434
|
+
1. 无 ERROR 级别日志(除已知无关错误)
|
|
435
|
+
2. 关键日志出现(如 `[Bug5] markException called`)
|
|
436
|
+
- **验证人**:Worker + Leader 都必须检查
|
|
437
|
+
|
|
438
|
+
#### 门禁 6:代码评审门禁
|
|
439
|
+
- **执行**:使用 `code-review-java` skill
|
|
440
|
+
- **通过标准**:无 CRITICAL / HIGH 级别问题
|
|
441
|
+
- **验证人**:Reviewer 或 Leader
|
|
442
|
+
|
|
443
|
+
#### 门禁 7:全链路回归门禁
|
|
444
|
+
- **执行**:按 tests.md 的 end-to-end 场景完整执行一遍
|
|
445
|
+
- **通过标准**:全流程通过,无异常
|
|
446
|
+
- **验证人**:Leader 必须亲自执行
|
|
447
|
+
|
|
448
|
+
#### 门禁未通过的处理
|
|
449
|
+
|
|
450
|
+
1. **Worker 执行时门禁未通过**:
|
|
451
|
+
- 不得报告任务完成
|
|
452
|
+
- 必须修复问题并重新执行全部门禁
|
|
453
|
+
- 若无法修复,立即上报 Leader
|
|
454
|
+
|
|
455
|
+
2. **Leader 验证时门禁未通过**:
|
|
456
|
+
- 标记 Worker 任务为"未完成"
|
|
457
|
+
- 要求 Worker 重新执行
|
|
458
|
+
- 连续 2 次未通过,Leader 亲自介入修复
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
462
|
+
## 通信协议
|
|
463
|
+
|
|
464
|
+
### Leader → Worker 消息格式
|
|
465
|
+
|
|
466
|
+
```
|
|
467
|
+
任务分配:
|
|
468
|
+
- 任务 ID: Task 5.1
|
|
469
|
+
- 修改文件: DebugFlowService.java
|
|
470
|
+
- 修改方法: markException()
|
|
471
|
+
- 源码锚点: DebugFlowService.java:911-969
|
|
472
|
+
- design.md 对应章节: ## Bug 5
|
|
473
|
+
- 验收标准:
|
|
474
|
+
1. 调用 markException 后 debug_status = 3
|
|
475
|
+
2. 不校验 debugSessionId
|
|
476
|
+
3. 插入 device_debug_record
|
|
477
|
+
- 阻塞条件: 无
|
|
478
|
+
- 预计工时: 0.5 人天
|
|
479
|
+
- 强调:必须通过全部质量门禁才能报告完成,编译成功不算完成
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
### Worker → Leader 报告格式(应用启动后)
|
|
483
|
+
|
|
484
|
+
```
|
|
485
|
+
开发完成报告:
|
|
486
|
+
- 任务 ID: Task 5.1
|
|
487
|
+
- 状态: 开发完成 / 阻塞中 / 失败
|
|
488
|
+
- 修改文件: DebugFlowService.java
|
|
489
|
+
- 修改内容摘要: 移除 validateDebugSessionId() 调用,直接透传
|
|
490
|
+
- 数据库前置门禁:
|
|
491
|
+
- 检查的表/字段: {列出}
|
|
492
|
+
- 汇总 SQL 文件路径: {路径}
|
|
493
|
+
- 执行的脚本: {具体脚本}
|
|
494
|
+
- 执行结果: {成功/失败}
|
|
495
|
+
- 复查确认: {SHOW CREATE TABLE 结果摘要}
|
|
496
|
+
- 代码自审结果: 通过(无 CRITICAL/HIGH 问题)
|
|
497
|
+
- 检查项: 空指针 ✓ 异常处理 ✓ 事务边界 ✓ 日志规范 ✓
|
|
498
|
+
- 编译状态: 通过(mvn clean compile -DskipTests)
|
|
499
|
+
- 进程验证:
|
|
500
|
+
- PID: 12345
|
|
501
|
+
- 启动时间: 2026-05-08 14:32:15
|
|
502
|
+
- class 文件时间戳: 2026-05-08 14:31:58(编译后)
|
|
503
|
+
- 健康检查: UP ✓
|
|
504
|
+
- 说明: 应用已启动,等待 Tester 独立测试
|
|
505
|
+
- 阻塞原因: (如适用)
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### Leader → Tester 测试分配格式
|
|
509
|
+
|
|
510
|
+
```
|
|
511
|
+
测试任务:
|
|
512
|
+
- 任务 ID: Task 5.1
|
|
513
|
+
- 测试范围: tests.md 中 Bug 5 的全部用例
|
|
514
|
+
- 应用状态: Worker 已启动,PID: 12345,健康检查: UP
|
|
515
|
+
- 测试要求:
|
|
516
|
+
1. 独立执行全部用例,不参考 Worker 的自测结果
|
|
517
|
+
2. 覆盖接口测试、数据库验证、日志检查
|
|
518
|
+
3. 如实报告失败,不替 Worker 找理由
|
|
519
|
+
- 报告对象: 直接回复 Leader,不发给 Worker
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
### Tester → Leader 测试报告格式
|
|
523
|
+
|
|
524
|
+
```
|
|
525
|
+
独立测试报告:
|
|
526
|
+
- 任务 ID: Task 5.1
|
|
527
|
+
- 测试人: Tester(独立)
|
|
528
|
+
- 测试用例: 共 X 个,执行 X 个,通过 X 个,失败 X 个
|
|
529
|
+
- 测试详情:
|
|
530
|
+
- 用例 1 [通过]: 接口返回值 code=0,数据库 debug_status=3,日志无 ERROR
|
|
531
|
+
- 用例 2 [失败]: 预期... 实际... 现象...
|
|
532
|
+
- 数据库验证: ...
|
|
533
|
+
- 日志检查: ...
|
|
534
|
+
- 结论: 通过 / 不通过
|
|
535
|
+
- 备注: (如适用)
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
---
|
|
539
|
+
|
|
540
|
+
## 禁止事项(红线)
|
|
541
|
+
|
|
542
|
+
以下行为在实现阶段**严格禁止**:
|
|
543
|
+
|
|
544
|
+
1. **禁止编译成功就交付**
|
|
545
|
+
- ❌ 错误:"代码已修改,编译通过,任务完成"
|
|
546
|
+
- ✅ 正确:"代码已修改,编译通过,应用已启动,独立 Tester 验证通过,任务完成"
|
|
547
|
+
|
|
548
|
+
2. **禁止 Worker 自测自报"完成"**
|
|
549
|
+
- ❌ 错误:Worker 自己测自己报"测试通过,任务完成"
|
|
550
|
+
- ✅ 正确:Worker 只报告"开发完成,应用已启动",等待独立 Tester 验证
|
|
551
|
+
|
|
552
|
+
3. **禁止 Tester 参考 Worker 的自测结果**
|
|
553
|
+
- ❌ 错误:Tester 看了 Worker 的报告后"差不多就行"
|
|
554
|
+
- ✅ 正确:Tester 独立从头执行全部用例,不参考 Worker 报告
|
|
555
|
+
|
|
556
|
+
4. **禁止复用旧进程测试新代码**
|
|
557
|
+
- ❌ 错误:端口已有监听,直接 curl 测试
|
|
558
|
+
- ✅ 正确:先停止旧进程,重新编译启动,确认是新进程后再测试
|
|
559
|
+
|
|
560
|
+
5. **禁止仅做代码层面验证**
|
|
561
|
+
- ❌ 错误:grep 代码确认修复逻辑正确,未实际调接口
|
|
562
|
+
- ✅ 正确:必须实际调接口验证运行时行为
|
|
563
|
+
|
|
564
|
+
6. **禁止信任 Worker/Tester 报告而不自己验证**
|
|
565
|
+
- ❌ 错误:Worker 说"测试通过"或 Tester 说"都过了",Leader 直接相信
|
|
566
|
+
- ✅ 正确:Leader 必须独立执行关键验证(至少抽查 30% 的测试用例)
|
|
567
|
+
|
|
568
|
+
7. **禁止跳过 clean 直接编译**
|
|
569
|
+
- ❌ 错误:`mvn compile`(无 clean)
|
|
570
|
+
- ✅ 正确:`mvn clean compile`(确保加载新 class)
|
|
571
|
+
|
|
572
|
+
8. **禁止混淆 Maven/Gradle 命令**
|
|
573
|
+
- ❌ 错误:对 Gradle 项目使用 `-Dspring-boot.run.profiles=xxx`
|
|
574
|
+
- ✅ 正确:Gradle 用 `--args='--spring.profiles.active=xxx'`
|
|
575
|
+
|
|
576
|
+
9. **禁止忽略 ERROR 日志**
|
|
577
|
+
- ❌ 错误:测试通过了,但日志中有 ERROR,视而不见
|
|
578
|
+
- ✅ 正确:测试通过 + 日志无 ERROR 才算通过
|
|
579
|
+
|
|
580
|
+
10. **禁止跳过代码评审直接编译/测试**
|
|
581
|
+
- ❌ 错误:代码改完直接编译,等全部任务做完再补审
|
|
582
|
+
- ✅ 正确:每个任务修改后先自审(检查空指针、异常、事务、日志),自审通过后再编译
|
|
583
|
+
|
|
584
|
+
11. **禁止跳过数据库前置门禁直接写代码**
|
|
585
|
+
- ❌ 错误:不管数据库表结构是否满足设计,直接改业务代码
|
|
586
|
+
- ✅ 正确:先连接开发环境数据库 SHOW CREATE TABLE 确认结构 → 发现缺失时执行汇总 SQL → 确认生效后再写代码
|
|
587
|
+
|
|
588
|
+
12. **禁止自行创建独立 SQL 文件**
|
|
589
|
+
- ❌ 错误:每个任务各建一个 SQL 文件
|
|
590
|
+
- ✅ 正确:所有 SQL 统一追加到需求级汇总 SQL 文件
|
|
591
|
+
|
|
592
|
+
13. **禁止用代码绕过数据库结构缺失**
|
|
593
|
+
- ❌ 错误:发现字段不存在时加 if-null 判断兼容
|
|
594
|
+
- ✅ 正确:停止编码 → 执行汇总 SQL → 确认生效后继续
|
|
595
|
+
|
|
596
|
+
---
|
|
597
|
+
|
|
598
|
+
## 故障处理
|
|
599
|
+
|
|
600
|
+
### Worker 长时间无响应
|
|
601
|
+
|
|
602
|
+
1. Leader 发送状态查询消息
|
|
603
|
+
2. 超过 10 分钟无响应 → 标记为超时,重新分配任务
|
|
604
|
+
3. 新 Worker 从上次保存点继续
|
|
605
|
+
|
|
606
|
+
### 代码冲突
|
|
607
|
+
|
|
608
|
+
1. 发现同一文件被多个 Worker 修改
|
|
609
|
+
2. Leader 协调:确定修改范围是否重叠
|
|
610
|
+
3. 若重叠:顺序执行,后执行的 Worker 先 pull 最新代码
|
|
611
|
+
4. 若无重叠:可同时修改不同方法
|
|
612
|
+
|
|
613
|
+
### 测试失败
|
|
614
|
+
|
|
615
|
+
1. Worker 记录失败现象(接口返回值/数据库状态/日志)
|
|
616
|
+
2. 对照 design.md 分析根因
|
|
617
|
+
3. 若 design 方案有问题 → 上报 Leader → 暂停相关任务
|
|
618
|
+
4. 若实现问题 → 修复后重新验证(从 clean compile 开始)
|
|
619
|
+
|
|
620
|
+
### 编译错误
|
|
621
|
+
|
|
622
|
+
1. Worker 尝试自行修复(通常是小问题:import 缺失、语法错误)
|
|
623
|
+
2. 无法修复 → 上报 Leader
|
|
624
|
+
3. Leader 判断是否为跨模块依赖问题
|
|
625
|
+
|
|
626
|
+
### 应用启动失败
|
|
627
|
+
|
|
628
|
+
1. 检查启动命令是否正确(Maven vs Gradle)
|
|
629
|
+
2. 检查 profile 是否生效(查看日志中的激活 profile)
|
|
630
|
+
3. 检查端口是否被占用(旧进程未停止)
|
|
631
|
+
4. 检查数据库连接配置是否正确
|
|
632
|
+
5. 若无法解决,上报 Leader 协调
|
|
633
|
+
|
|
634
|
+
### 进程混淆(旧进程占端口)
|
|
635
|
+
|
|
636
|
+
1. Worker 发现测试的日志时间戳不对
|
|
637
|
+
2. 立即停止测试,杀死旧进程
|
|
638
|
+
3. 重新执行完整的进程验证流程
|
|
639
|
+
4. 重新编译、启动、测试
|