@heihei0299/matt-skills 1.6.4-test.0 → 2.0.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/.agents/skills/commit-check/SKILL.md +74 -42
- package/.agents/skills/commit-check/scripts/scan-sensitive.sh +12 -19
- package/.agents/skills/tdd-implement/SKILL.md +24 -27
- package/.agents/skills/tdd-implement/references/orchestration.md +137 -60
- package/.agents/skills/tdd-implement/references/stages.md +179 -215
- package/README.md +24 -5
- package/package.json +3 -1
- package/scripts/codex-smoke.js +140 -0
- package/template/.agents/skills/commit-check/SKILL.md +74 -42
- package/template/.agents/skills/commit-check/scripts/scan-sensitive.sh +12 -19
- package/template/.agents/skills/tdd-implement/SKILL.md +24 -27
- package/template/.agents/skills/tdd-implement/references/orchestration.md +137 -60
- package/template/.agents/skills/tdd-implement/references/stages.md +179 -215
- package/template/.opencode/commands/commit-check.md +9 -0
- package/template/AGENTS.md +7 -34
|
@@ -1,63 +1,95 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: commit-check
|
|
3
|
-
description: "
|
|
3
|
+
description: "检查 matt-skills 当前 staged commit 的范围、敏感信息和 commit message,并按改动路径执行对应同步检查。"
|
|
4
|
+
disable-model-invocation: true
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# Commit Check
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
用户显式调用 `/commit-check` 后运行本技能。它是提交前的 staged commit gate:检查将要提交的内容是否属于当前逻辑变更、是否包含敏感信息、以及 commit message 是否可追溯。
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
本技能只检查,不负责 staging,不执行 `git commit`,也不要求整个工作区干净。通过后报告 `ready to commit`,由调用方执行提交。
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
> 覆盖原 ① 审查文档 的全部检查项与原 ② 对齐 README 的全部检查项
|
|
13
|
+
## 三项核心 gate
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
- 文档描述与实现一致:无过期信息、无声称未实现的功能、无遗留的旧接口描述
|
|
17
|
-
- 发现不一致 → 先修文档(或更新实现),再进入下一步
|
|
18
|
-
- 改动涉及项目结构、分发文件、技能/命令清单时,检查 README 中对应的结构说明、映射表、清单是否同步
|
|
19
|
-
- 改动涉及用法/CLI/配置/示例时,检查 README 对应描述与实际一致
|
|
20
|
-
- **重点聚焦(README + matt-skills 流程)**:本次门禁优先对齐 `README.md` 与 matt-skills 流程相关文件——`AGENTS.md`(路由)、`CONTEXT.md`(术语)、`docs/agents/*`(`skill-design.md`/`runtime-discipline.md`/`issue-tracker.md`/`triage-labels.md`/`domain.md`)、`template/` 镜像(含 `.agents/skills` 全量、`AGENTS.md`、`CONTEXT.md`、`docs/agents`)、`.agents/skills/*`(技能正文与 `references/`)、`config/*` 与 `scripts/build-template.js`;改动触及上述任一文件时,逐项核对 README 的结构说明/清单/映射表与模板镜像是否同步,未同步先修复再 commit
|
|
21
|
-
- 存在模板镜像/分发副本时,确认源文件与副本同步(如有守护测试,跑一遍确认)
|
|
22
|
-
- **特例**:`AGENTS.md` 的 `tdd-implement ↔ implement` 路由行 + 技能文件 + `.gitignore` 的 `.pi/` 忽略,且存在 `AGENTS.md.bak` 时,视为模板同步预期增量,不回滚
|
|
23
|
-
### ② 保持目录卫生
|
|
15
|
+
### ① Staged scope
|
|
24
16
|
|
|
25
|
-
- `git status`
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
17
|
+
- 读取 `git diff --cached --name-status` 和 `git diff --cached`。
|
|
18
|
+
- staged diff 必须非空,并且只包含当前用户请求的逻辑变更。
|
|
19
|
+
- 列出 staged 文件和关键 diff,无法确认范围时报告疑点并阻塞。
|
|
20
|
+
- 调用方负责 `git add`;本技能不自动 stage、unstage 或清理文件。
|
|
21
|
+
- 工作区可以保留其它未暂存修改;不以 `git status` 全干净作为出口条件。
|
|
30
22
|
|
|
31
|
-
###
|
|
23
|
+
### ② Sensitive scan
|
|
32
24
|
|
|
33
|
-
|
|
34
|
-
> 模板:`feat(<scope>): <subject>` / `fix(<scope>): <subject>` — 例 `feat(tdd): add seam login`,`fix(ci): gate publish on verify`
|
|
35
|
-
- subject 描述变更内容而非过程(不说"我做了什么",说"改成了什么")
|
|
36
|
-
- 需要时补充 body:动机、影响范围、验收证据(测试结果、同步确认)
|
|
37
|
-
- 一次 commit 只含一个逻辑变更;多主题拆多个 commit
|
|
25
|
+
运行确定性扫描脚本,不手写 grep:
|
|
38
26
|
|
|
39
|
-
|
|
27
|
+
```bash
|
|
28
|
+
bash .agents/skills/commit-check/scripts/scan-sensitive.sh --staged-only
|
|
29
|
+
```
|
|
40
30
|
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
31
|
+
- 结构化 secret assignment 和 private key block → **fail**。
|
|
32
|
+
- 普通 `api_key`、`secret`、`token`、`password`、`.env` 等关键词 → **warning**,由调用方人工确认。
|
|
33
|
+
- 扫描只针对 staged diff;不因未暂存内容阻塞本次 commit。
|
|
44
34
|
|
|
45
|
-
|
|
35
|
+
### ③ Commit message
|
|
46
36
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
37
|
+
- 使用 `<type>(<scope>): <subject>` 基本格式;`type` 使用 `feat`、`fix`、`docs`、`chore`、`refactor`、`test` 等仓库约定值。
|
|
38
|
+
- subject 描述变更结果,不描述操作过程。
|
|
39
|
+
- body 可选;只有确实需要时补充动机、影响范围或验收证据。
|
|
40
|
+
- 一个 commit 只表达一个逻辑变更;多主题拆分提交。
|
|
41
|
+
- 本技能检查并给出 message 结论,但不代替调用方执行 commit。
|
|
50
42
|
|
|
51
|
-
|
|
43
|
+
## matt-skills 路径适配
|
|
52
44
|
|
|
53
|
-
|
|
45
|
+
以下 staged 路径触发 matt-skills 专属检查;普通源码或测试 commit 不触发这些额外检查:
|
|
54
46
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
47
|
+
```text
|
|
48
|
+
README.md
|
|
49
|
+
AGENTS.md
|
|
50
|
+
CONTEXT.md
|
|
51
|
+
docs/agents/**
|
|
52
|
+
template/**
|
|
53
|
+
.agents/skills/**
|
|
54
|
+
config/**
|
|
55
|
+
scripts/build-template.js
|
|
56
|
+
.opencode/commands/**
|
|
57
|
+
.pi/prompts/**
|
|
58
|
+
```
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
相关路径变更时:
|
|
61
61
|
|
|
62
|
-
-
|
|
63
|
-
-
|
|
62
|
+
- README、公开行为、命令、配置或流程描述变化 → 检查对应文档与实现一致;
|
|
63
|
+
- `AGENTS.md`、`CONTEXT.md`、`docs/agents/`、`template/`、技能或镜像变化 → 运行相关模板/契约测试,至少覆盖 `test/template-sync.test.js`;
|
|
64
|
+
- `commit-check` 自身变化 → 运行 `test/commit-check.test.js` 和 `test/commit-check-scan.test.js`;
|
|
65
|
+
- `tdd-implement` 变化 → 运行 `test/tdd-implement-stages.test.js`;
|
|
66
|
+
- `config/`、构建脚本、opencode command 或 pi prompt 变化 → 运行对应 CLI、模板或命令测试;
|
|
67
|
+
- 只检查本次 staged 路径相关的内容,不通读全部 README、docs 或模板。
|
|
68
|
+
|
|
69
|
+
这些是 matt-skills 的条件化仓库检查,不改变上面的三项核心 gate。
|
|
70
|
+
|
|
71
|
+
## Git history pointer
|
|
72
|
+
|
|
73
|
+
遵循 `CONTEXT.md` 和 `docs/agents/` 中的 Git History Preservation 规则。本技能只在当前会话存在 `BASE_HEAD` 时执行必要祖先校验:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
git merge-base --is-ancestor "$BASE_HEAD" HEAD
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
完整的禁止命令、恢复和 stash 规则只在仓库级文档维护,不在本技能重复展开。
|
|
80
|
+
|
|
81
|
+
## 执行顺序与出口
|
|
82
|
+
|
|
83
|
+
1. 检查 staged scope,确认 staged diff 非空且属于当前逻辑变更。
|
|
84
|
+
2. 执行 `scan-sensitive.sh --staged-only`。
|
|
85
|
+
3. 检查 commit message。
|
|
86
|
+
4. 根据 staged 路径执行必要的 matt-skills 条件化检查。
|
|
87
|
+
5. 输出 staged 文件、三项 gate 结果、warning、条件化检查结果和 `ready to commit` 或具体阻塞项。
|
|
88
|
+
|
|
89
|
+
发现阻塞项时停止并报告;不自动修复、不自动 stage、不自动 commit。
|
|
90
|
+
|
|
91
|
+
## 不负责的内容
|
|
92
|
+
|
|
93
|
+
- 不做完整代码审查;审查语义由对应审查流程负责。
|
|
94
|
+
- 不执行测试先行、typecheck、build、真实运行或 tracker 收尾;这些属于对应实现流程。
|
|
95
|
+
- 不成为任何实现流程的自动子步骤;仅按 staged 路径提供本仓库提交 gate。
|
|
@@ -1,36 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# Deterministic secret scan for commit-check
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
# FAIL — structured secrets (KEY=value assignments, private key blocks)
|
|
6
|
-
# WARN — bare keywords (may legitimately appear in docs that mention them)
|
|
7
|
-
# Checks the staged diff (fail) and, unless --staged-only is passed, reports
|
|
8
|
-
# matches in the unstaged diff (warn).
|
|
9
|
-
#
|
|
10
|
-
# Usage:
|
|
11
|
-
# scripts/scan-sensitive.sh # staged (fail) + unstaged (warn)
|
|
12
|
-
# scripts/scan-sensitive.sh --staged-only
|
|
2
|
+
# Deterministic staged-diff secret scan for commit-check.
|
|
3
|
+
# FAIL: structured assignments and private-key blocks.
|
|
4
|
+
# WARN: bare keywords that may legitimately appear in documentation.
|
|
13
5
|
set -euo pipefail
|
|
14
6
|
|
|
7
|
+
if [[ $# -gt 1 || ( $# -eq 1 && "$1" != "--staged-only" ) ]]; then
|
|
8
|
+
echo "usage: $0 [--staged-only]" >&2
|
|
9
|
+
exit 2
|
|
10
|
+
fi
|
|
11
|
+
|
|
15
12
|
fail_patterns='(api[_-]?key|secret|token|passwd|password)[[:space:]]*[=:][[:space:]]*[^[:space:]]{8,}|BEGIN (RSA|OPENSSH|EC|DSA) PRIVATE KEY'
|
|
16
13
|
warn_patterns='(api[_-]?key|secret|token|passwd|password|\.env)'
|
|
17
14
|
|
|
15
|
+
staged_diff=$(git diff --cached -U0)
|
|
18
16
|
fail=0
|
|
19
17
|
|
|
20
|
-
if
|
|
18
|
+
if grep -inE "$fail_patterns" <<< "$staged_diff"; then
|
|
21
19
|
echo "❌ Structured secrets found in STAGED diff — remove them before committing." >&2
|
|
22
20
|
fail=1
|
|
23
21
|
else
|
|
24
22
|
echo "✅ No structured secrets in staged diff."
|
|
25
|
-
if git diff --cached -U0 | grep -inE "$warn_patterns"; then
|
|
26
|
-
echo "⚠ Keyword matches in STAGED diff — eyeball whether they are real secrets." >&2
|
|
27
|
-
fi
|
|
28
23
|
fi
|
|
29
24
|
|
|
30
|
-
if
|
|
31
|
-
|
|
32
|
-
echo "⚠ Structured-secret matches in UNSTAGED diff — decide whether they belong in the commit." >&2
|
|
33
|
-
fi
|
|
25
|
+
if grep -inE "$warn_patterns" <<< "$staged_diff"; then
|
|
26
|
+
echo "⚠ Keyword matches in STAGED diff — eyeball whether they are real secrets." >&2
|
|
34
27
|
fi
|
|
35
28
|
|
|
36
29
|
exit "$fail"
|
|
@@ -1,48 +1,45 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tdd-implement
|
|
3
|
-
description: "
|
|
3
|
+
description: "完成已确认的 spec/ticket 的 test-first/TDD 交付闭环。"
|
|
4
|
+
disable-model-invocation: true
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
# TDD Implement
|
|
7
8
|
|
|
8
|
-
`seam` + `red-green`
|
|
9
|
+
`seam` + `red-green` 是本技能的领衔词。它把一个 spec 或 task issue 编排成四个交付阶段;TDD 的红-绿语义、测试质量和 mock 边界以 [tdd 技能](.agents/skills/tdd/SKILL.md) 为唯一事实源,本技能只定义交付编排。
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
本技能是 **Long-Horizon Skill**:阶段按顺序连续执行,并自带 **Turn Continuity** 与 **Chunking**。术语见 `CONTEXT.md`,技能设计规则见 `docs/agents/skill-design.md`。
|
|
11
12
|
|
|
12
|
-
##
|
|
13
|
+
## 入口与分支
|
|
13
14
|
|
|
14
|
-
-
|
|
15
|
-
- **多 issue
|
|
16
|
-
|
|
15
|
+
- **单 issue**:单个 `.scratch/<feature>/spec.md`、等价 spec 或 `Type: task` issue,按下方四个 Steps 完成一个交付闭环。
|
|
16
|
+
- **多 issue**:`.scratch/<feature>/issues/` 下存在多个 `Type: task` 文件时,先读取 [orchestration.md](references/orchestration.md),按 `Blocked by` 构建 DAG、Kahn 分层,再由主代理按层串行完成各 issue。
|
|
17
|
+
- `Type: research`、`prototype`、`grilling` 分流到对应技能,不进入本技能。
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
## Steps
|
|
19
|
+
多 issue 的 A0-A5 是编排控制活动,不是额外的产品交付阶段:依赖图、分层、串行调度、层收敛、全量收敛和回退/冲突处理的详规只在 [orchestration.md](references/orchestration.md) 中维护。
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
## 四阶段 Steps
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|------|--------|-------------------|------|
|
|
25
|
-
| ① 理解需求 | 读取 spec/ticket + `CONTEXT.md`/`docs/adr/`,澄清歧义 | 能复述需求且无未澄清歧义 | [stages.md#阶段-①](references/stages.md#阶段-①理解需求) |
|
|
26
|
-
| ② 确认 Seams | 列出待测公共接口 seams(名称+输入+预期输出),向用户确认并生成 Todo | 用户明确同意 seams 清单;Todo 已生成 | [stages.md#阶段-②](references/stages.md#阶段-②确认-seams测试接缝) |
|
|
27
|
-
| ③ TDD 开发循环 | 逐 seam 红-绿循环(红→绿→typecheck)串行推进至全绿 | 所有 seams 红-绿完成 + typecheck 通过 | [stages.md#阶段-③](references/stages.md#阶段-③tdd-开发循环) |
|
|
28
|
-
| ④ 完整测试套件 | 跑全量测试 | 全部测试通过(失败回 ③) | [stages.md#阶段-④](references/stages.md#阶段-④完整测试套件) |
|
|
29
|
-
| ⑤ Code Review | 按 [code-review](.agents/skills/code-review/SKILL.md) 双轴审查(Standards + Spec) | 双轴均通过 | [stages.md#阶段-⑤](references/stages.md#阶段-⑤code-review) |
|
|
30
|
-
| ⑥ Commit | 跑 [commit-check](.agents/skills/commit-check/SKILL.md) 门禁四项后提交 | commit 完成且历史校验通过 | [stages.md#阶段-⑥](references/stages.md#阶段-⑥commit) |
|
|
31
|
-
| ⑦ 收尾 | 文档对齐 → issue 状态与实施总结 → 目录卫生 | 文档已对齐、issue 已 `resolved`+总结落盘、工作区干净 | [stages.md#阶段-⑦](references/stages.md#阶段-⑦收尾文档对齐--issue-状态--实施总结) |
|
|
23
|
+
按序执行;每步达到可验证出口条件后立即进入下一步。每步开始前读取 [stages.md](references/stages.md) 中对应定义。
|
|
32
24
|
|
|
33
|
-
|
|
25
|
+
| Step | 做什么 | 出口条件 |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| ① **Contract** | 读取入口,提取 Acceptance Criteria,建立 Scope Ledger、Preflight、验证矩阵和 Behavior/Seam 边界 | 需求无待决歧义,验证命令已确定;知道做什么、从哪里验证、什么不做 |
|
|
28
|
+
| ② **Red-Green** | 以 Behavior 为粒度执行有效 Red → 最小 Green → formatter/typecheck → 最小相关测试 | 所有 Behaviors 均有有效 Red、实现全绿,formatter/typecheck 和最小相关测试通过 |
|
|
29
|
+
| ③ **Verify** | 运行当前 issue 影响范围测试、必要 build、要求的真实运行验证;执行一次 Standards + Spec Review | 最终 diff 的相关证据通过,真实运行验证完成(如要求),无 blocking finding |
|
|
30
|
+
| ④ **Deliver** | 对齐 docs/README,执行敏感信息扫描,检查 staged diff、commit message 和必要的 Git history,创建独立 commit,更新 issue/progress.md | commit 已创建,Acceptance Criteria 全部通过,Tracker 与工作区反映真实完成状态 |
|
|
34
31
|
|
|
35
|
-
|
|
32
|
+
## 运行时纪律
|
|
36
33
|
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
34
|
+
- 四个阶段都从入口连续执行到自身出口:预告下一步后立即执行;进度输出并入工具调用序列,输出后继续执行。只有合规交互点、明确的外部阻塞或阶段出口条件结束当前回合。
|
|
35
|
+
- 一个 seam 是公共可观察边界;一个 Behavior 是一个红-绿 cycle;一个 seam 可以包含多个 Behaviors。Seam/Behavior 的细节和 Todo 粒度见 [stages.md](references/stages.md)。
|
|
36
|
+
- 当前 issue 的范围、Acceptance Criteria、Out of Scope、测试/typecheck/build/真实运行证据和最终 commit 必须可追溯。Seam 或专项测试绿色不代表 issue 完成;四阶段出口全部满足后才可标记 `resolved`。
|
|
37
|
+
- 多 issue 模式中,每个 issue 只提交一个独立 commit;issue 影响范围测试在 Step ③ 执行,全仓测试由 orchestration 的 A4 在全部 issue 完成后执行一次。
|
|
40
38
|
|
|
41
39
|
## 引用
|
|
42
40
|
|
|
43
41
|
- TDD 核心规则:[tdd 技能](.agents/skills/tdd/SKILL.md)
|
|
44
42
|
- 测试标准:[tdd/tests.md](.agents/skills/tdd/tests.md)
|
|
45
43
|
- Mock 指南:[tdd/mocking.md](.agents/skills/tdd/mocking.md)
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
- 多 issue 编排详规:[orchestration.md](references/orchestration.md)(A0-A1 排序 + 主代理串行,不含子代理)
|
|
44
|
+
- 四阶段详规:[stages.md](references/stages.md)
|
|
45
|
+
- 多 issue 编排:[orchestration.md](references/orchestration.md)
|
|
@@ -1,89 +1,166 @@
|
|
|
1
|
-
# 多 issue
|
|
1
|
+
# 多 issue 编排(按依赖分层串行)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本文件仅在 `.scratch/<feature>/issues/` 下存在多个 `Type: task` issue 时生效。单 `spec` / 单 `task` 直接按 [stages.md](stages.md) 的四阶段闭环执行。A0-A5 是编排控制活动,不是额外的产品交付阶段。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
三入口(单 `spec` / 单 `task` / 多 `task`)在单 issue 层面同构:`spec`/`issue` 均为 `task` 闭环输入,`research`/`prototype`/`grilling` 分流不进本技能。编排层 Feature—`.scratch/<feature>/` 下全部 `task` 按 `Blocked by` 分层。
|
|
5
|
+
主代理按依赖分层、层内按编号串行执行;每个 issue 由同一个主代理完成 Contract → Red-Green → Verify → Deliver,并创建一个独立 commit。实现细节以 [stages.md](stages.md) 为准,TDD 语义以 [tdd 技能](.agents/skills/tdd/SKILL.md) 为准。
|
|
8
6
|
|
|
9
7
|
## 目录
|
|
10
8
|
|
|
11
|
-
- [A0
|
|
12
|
-
- [A1
|
|
13
|
-
- [A2
|
|
14
|
-
- [A3
|
|
15
|
-
- [A4
|
|
16
|
-
- [
|
|
17
|
-
- [边界](#边界)
|
|
9
|
+
- [A0:依赖图与编排 Preflight](#a0依赖图与编排-preflight)
|
|
10
|
+
- [A1:Kahn 拓扑分层](#a1kahn-拓扑分层)
|
|
11
|
+
- [A2:分层串行调度](#a2分层串行调度)
|
|
12
|
+
- [A3:层收敛](#a3层收敛)
|
|
13
|
+
- [A4:全量收敛](#a4全量收敛)
|
|
14
|
+
- [A5:回退与冲突处理](#a5回退与冲突处理)
|
|
18
15
|
|
|
19
16
|
---
|
|
20
17
|
|
|
21
|
-
|
|
18
|
+
## A0:依赖图与编排 Preflight
|
|
22
19
|
|
|
23
|
-
1. 扫描 `.scratch/<feature>/issues/` 下全部 `NN-<slug>.md`,逐文件解析 `Blocked by
|
|
24
|
-
- `Blocked by: None
|
|
25
|
-
- `Blocked by: 01, 02`
|
|
26
|
-
-
|
|
27
|
-
2. 以 issue 编号为节点、`Blocked by` 为有向边构建 DAG
|
|
28
|
-
3.
|
|
29
|
-
4.
|
|
30
|
-
|
|
20
|
+
1. 扫描 `.scratch/<feature>/issues/` 下全部 `NN-<slug>.md`,逐文件解析 `Blocked by`:
|
|
21
|
+
- `Blocked by: None`、`Blocked by: (无)` 或无此行:无依赖;
|
|
22
|
+
- `Blocked by: 01, 02` 或 `Blocked by: 01(…)`:依赖对应编号 issue;
|
|
23
|
+
- 无法解析:按无依赖处理,并在编排总结中记录告警。
|
|
24
|
+
2. 以 issue 编号为节点、`Blocked by` 为有向边构建 DAG;检测到环时列出环上节点并停止调度。
|
|
25
|
+
3. 读取共享 `spec.md`(若存在)、`CONTEXT.md` 和与本次改动有关的 ADR。
|
|
26
|
+
4. 完成编排级 Preflight:记录当前 `HEAD`、工作区状态、`BASE_HEAD=$(git rev-parse HEAD)`、测试/typecheck/build 命令、真实运行路径和敏感信息扫描脚本可用性。后续只使用已经确认的命令和路径。
|
|
27
|
+
5. 强制初始化 `.scratch/<feature>/progress.md`:
|
|
31
28
|
|
|
32
|
-
|
|
29
|
+
```markdown
|
|
30
|
+
## DAG
|
|
31
|
+
## Layers (Kahn L1..Ln)
|
|
32
|
+
## Progress
|
|
33
|
+
| NN | Status | Commit | Review | Tests |
|
|
34
|
+
|---|---|---|---|---|
|
|
35
|
+
```
|
|
33
36
|
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
`progress.md` 是派生视图,真相源仍是 `spec.md` 与 `issues/*.md`。
|
|
38
|
+
|
|
39
|
+
### A0 出口
|
|
40
|
+
|
|
41
|
+
- DAG 已构建且无环;
|
|
42
|
+
- 编排 Preflight 和 `BASE_HEAD` 已记录;
|
|
43
|
+
- `progress.md` 已存在并可回写;
|
|
44
|
+
- 依赖解析告警已记录。
|
|
45
|
+
|
|
46
|
+
## A1:Kahn 拓扑分层
|
|
47
|
+
|
|
48
|
+
对 DAG 做 Kahn 分层:
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
L1 = 全部入度为 0 的节点
|
|
36
52
|
L2 = 移除 L1 后入度为 0 的节点
|
|
37
|
-
|
|
53
|
+
...
|
|
38
54
|
Ln = 最后一层
|
|
39
55
|
```
|
|
40
56
|
|
|
41
|
-
|
|
57
|
+
每层内节点互无依赖,但仍由主代理按编号串行执行。层间必须串行。编排开始前一次性向用户展示 DAG 和 `L1..Ln`,得到确认后进入 A2;这是合规交互点,不把每个 seam 或每个 issue 的正常切换变成确认点。
|
|
42
58
|
|
|
43
|
-
###
|
|
59
|
+
### A1 出口
|
|
44
60
|
|
|
45
|
-
|
|
46
|
-
|
|
61
|
+
- Kahn 分层结果已展示并确认;
|
|
62
|
+
- 每个 issue 都属于一个层;
|
|
63
|
+
- 同文件预期冲突已记录,必要时已通过依赖顺序隔离。
|
|
64
|
+
|
|
65
|
+
## A2:分层串行调度
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
for each layer Li in L1..Ln:
|
|
47
69
|
for each issue in Li(按编号顺序):
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
70
|
+
主代理执行四阶段:
|
|
71
|
+
① Contract
|
|
72
|
+
② Red-Green
|
|
73
|
+
③ Verify(当前 issue 影响范围)
|
|
74
|
+
④ Deliver(独立 commit + Tracker 收尾)
|
|
75
|
+
产出回执卡片并回写 issue
|
|
76
|
+
强制更新 progress.md 的 Status/Commit/Review/Tests
|
|
77
|
+
通过 A3 层收敛后进入下一层
|
|
78
|
+
全部层完成后进入 A4
|
|
53
79
|
```
|
|
54
80
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
81
|
+
每个 issue 的 Verify 只运行当前 issue 影响范围内的完整测试;全仓测试不在每个 issue 中重复执行。每个 issue 只做一次正式 Standards + Spec Review;修复 blocking finding 后执行定向复核,不重新启动完整 review。
|
|
82
|
+
|
|
83
|
+
主代理在层内和层间连续调度:一个 issue 的 Deliver 出口满足后,立即取下一个 issue,直到全部层完成或发生明确外部阻塞。进度输出并入执行序列,不在正常切换点等待用户“继续”。
|
|
84
|
+
|
|
85
|
+
进入 A2 前记录的 `BASE_HEAD` 必须在每个 issue 的阶段出口和 commit 前校验:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
git merge-base --is-ancestor $BASE_HEAD HEAD
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
为达到工作区干净只删除本次产生的 `[DEBUG-...]` 和一次性临时产物;未经用户确认不使用 `git reset --hard`、`git checkout .`、`git clean -fd`、`git stash push --include-untracked` 或其他改写/丢弃历史的命令。
|
|
92
|
+
|
|
93
|
+
### Issue 回执卡片
|
|
94
|
+
|
|
95
|
+
每个 issue 完成后记录并回写:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
Issue: NN
|
|
99
|
+
Status: resolved
|
|
100
|
+
Commit: <hash> — <message>
|
|
101
|
+
Behaviors: <completed list>
|
|
102
|
+
Acceptance Criteria: <checkbox result>
|
|
103
|
+
Review: Standards + Spec, no blocking finding
|
|
104
|
+
Tests: <targeted command and actual result>
|
|
105
|
+
Runtime: <actual request/page-visible result or not required>
|
|
106
|
+
Docs: <updated files or no update required>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### A2 出口
|
|
110
|
+
|
|
111
|
+
- 当前层每个 issue 均完成四阶段并有独立 commit;
|
|
112
|
+
- issue、回执卡片和 `progress.md` 一致;
|
|
113
|
+
- 相关测试通过,工作区卫生和历史校验通过;
|
|
114
|
+
- 没有未记录的跨 issue 改动。
|
|
115
|
+
|
|
116
|
+
## A3:层收敛
|
|
117
|
+
|
|
118
|
+
每层全部 issue 串行完成后检查以下项目,全部通过才进入下一层:
|
|
119
|
+
|
|
120
|
+
1. 所有 issue `Status: resolved`,实施总结已落盘,`progress.md` 对应行已为 `done`;
|
|
121
|
+
2. 该层 issue 的相关测试通过;
|
|
122
|
+
3. `git status` 只显示预期改动或干净;
|
|
123
|
+
4. `git merge-base --is-ancestor $BASE_HEAD HEAD` 通过;
|
|
124
|
+
5. 不存在未分类的 scope 扩张、review blocking finding 或未清理临时产物。
|
|
125
|
+
|
|
126
|
+
任一项失败,定位到该层失败 issue,按 A5 回退并重做该 issue 的受影响阶段或 Behavior,然后重新收敛本层。
|
|
127
|
+
|
|
128
|
+
## A4:全量收敛
|
|
129
|
+
|
|
130
|
+
全部层完成且各层收敛通过后:
|
|
58
131
|
|
|
59
|
-
|
|
132
|
+
1. 按 A0 的验证矩阵运行一次仓库全量测试;这是多 issue 流程唯一的全量回归点。只有修复全量失败后才允许必要重跑;
|
|
133
|
+
2. 执行 `git merge-base --is-ancestor $BASE_HEAD HEAD`;失败时按 A5 恢复后重验;
|
|
134
|
+
3. 执行 `git status`,确认无 `[DEBUG-...]`、一次性脚本或未跟踪临时文件;
|
|
135
|
+
4. 汇总各 issue 回执卡片的 commit、Behaviors、Acceptance Criteria、测试、真实运行和文档对齐结果;汇总只在对话输出,不另写汇总文件。
|
|
60
136
|
|
|
61
|
-
|
|
62
|
-
1. 该层全部 issue `Status: resolved` 且 `## 实施总结` 已落盘且 `progress.md` 同步为 `done`
|
|
63
|
-
2. 相关测试通过(该层 issue 相关;全量仅在 A4)
|
|
64
|
-
3. `git status` 卫生(仅删本次临时产物)
|
|
65
|
-
4. 历史校验 `git merge-base --is-ancestor $BASE_HEAD HEAD` 通过
|
|
137
|
+
### A4 出口
|
|
66
138
|
|
|
67
|
-
|
|
139
|
+
- 全部 issue 已有独立 commit、实施总结和 `progress.md` 派生记录;
|
|
140
|
+
- 全量测试通过;
|
|
141
|
+
- 工作区卫生、历史校验和真实运行要求均满足;
|
|
142
|
+
- `progress.md` 与 `issues/*.md` 一致,不一致时以 issue 真相源为准并修复派生视图。
|
|
68
143
|
|
|
69
|
-
|
|
144
|
+
## A5:回退与冲突处理
|
|
70
145
|
|
|
71
|
-
|
|
72
|
-
1. **全量测试套件**:跑仓库完整测试套件(仅此一次全量)
|
|
73
|
-
2. **历史校验**:`git merge-base --is-ancestor $BASE_HEAD HEAD`,失败即 `reflog` 恢复后重跑
|
|
74
|
-
3. **目录卫生**:`git status` 无 `[DEBUG-...]` 残留、无未跟踪临时文件
|
|
75
|
-
4. **汇总总结**:在会话输出汇总各 issue 的回执卡片关键信息(提交 hash / seams / 验收 checkbox / 测试结果 / 文档对齐);不另写汇总文件
|
|
146
|
+
A5 负责所有编排级失败,不把失败静默吞掉,也不把不相关问题塞入当前 issue:
|
|
76
147
|
|
|
77
|
-
|
|
148
|
+
| 失败类别 | 处理 |
|
|
149
|
+
|---|---|
|
|
150
|
+
| Contract 歧义、验收缺口、范围变化 | 回到该 issue 的 Contract,补 Scope Ledger、Behavior 和验证矩阵 |
|
|
151
|
+
| Red-Green 的有效 Red、实现、typecheck 或 targeted test 失败 | 回到该 issue 的 Red-Green,修复当前 Behavior 并重新验证 |
|
|
152
|
+
| Verify 的测试、build、真实运行或 review blocking finding 失败 | 回到受影响 issue 的对应阶段;修复后只做受影响检查和 delta review |
|
|
153
|
+
| Deliver 的 docs、敏感扫描、commit 或 Tracker 失败 | 保持 issue 未 resolved,修复 Deliver 门禁后重新验证 |
|
|
154
|
+
| 全量测试失败 | 定位到引入失败的 issue,按上述路径修复;只在修复后重跑必要范围和全量测试 |
|
|
155
|
+
| `Blocked by` 依赖未完成 | 后续 issue 保持 `blocked`,前置 issue resolved 后自动解阻 |
|
|
156
|
+
| 多 issue 预期修改同一文件 | 记录冲突,按编号串行;无法安全归属时暂停并请求用户决定 |
|
|
157
|
+
| Git 历史祖先校验失败 | 立即停止写入,使用 `git reflog` 找回 `BASE_HEAD` 之后的提交,校验通过后继续 |
|
|
78
158
|
|
|
79
|
-
|
|
80
|
-
- 全量测试套件通过
|
|
81
|
-
- 工作区干净且 `progress.md` 与 `issues/*.md` 一致(不一致时以 `issues/*.md` 为准,`progress.md` 为派生可重算)
|
|
159
|
+
主代理不跨 issue 无记录改动;不通过第二次完整双轴 review 来掩盖定向修复。外部权限、model、browser 或 tool 不可用时遵循 [stages.md](stages.md) 的 Tool Failure Budget,最多一次有依据的 fallback,仍失败则标记 `blocked/unavailable` 并报告实际状态。
|
|
82
160
|
|
|
83
|
-
###
|
|
161
|
+
### A5 出口
|
|
84
162
|
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
- TDD 语义以 [tdd 技能](.agents/skills/tdd/SKILL.md) 为唯一事实源,不在本文件重写
|
|
163
|
+
- 失败原因已分类并记录;
|
|
164
|
+
- 回退目标明确,受影响证据已重新验证;
|
|
165
|
+
- 冲突已按依赖顺序解决或已明确请求用户决策;
|
|
166
|
+
- DAG 顺序、issue 状态、commit 和 `progress.md` 保持一致。
|