cc-devflow 4.5.1 → 4.5.3
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/.claude/skills/cc-act/CHANGELOG.md +27 -0
- package/.claude/skills/cc-act/PLAYBOOK.md +32 -1
- package/.claude/skills/cc-act/SKILL.md +53 -7
- package/.claude/skills/cc-act/assets/PR_BRIEF_TEMPLATE.md +35 -1
- package/.claude/skills/cc-act/assets/RELEASE_NOTE_TEMPLATE.md +10 -1
- package/.claude/skills/cc-act/references/closure-contract.md +11 -0
- package/.claude/skills/cc-act/scripts/cc-act-common.sh +32 -1
- package/.claude/skills/cc-act/scripts/render-pr-brief.sh +130 -0
- package/.claude/skills/cc-act/scripts/verify-act-gate.sh +23 -1
- package/.claude/skills/cc-check/CHANGELOG.md +26 -0
- package/.claude/skills/cc-check/PLAYBOOK.md +128 -1
- package/.claude/skills/cc-check/SKILL.md +147 -7
- package/.claude/skills/cc-check/assets/REPORT_CARD_TEMPLATE.json +164 -1
- package/.claude/skills/cc-check/references/gate-contract.md +11 -0
- package/.claude/skills/cc-check/references/review-contract.md +104 -0
- package/.claude/skills/cc-check/scripts/render-report-card.js +209 -5
- package/.claude/skills/cc-check/scripts/verify-gate.sh +28 -0
- package/.claude/skills/cc-do/CHANGELOG.md +12 -0
- package/.claude/skills/cc-do/PLAYBOOK.md +14 -9
- package/.claude/skills/cc-do/SKILL.md +24 -13
- package/.claude/skills/cc-do/references/execution-recovery.md +16 -5
- package/.claude/skills/cc-do/scripts/verify-task-gates.sh +19 -6
- package/.claude/skills/cc-do/scripts/write-task-checkpoint.sh +14 -2
- package/.claude/skills/cc-investigate/CHANGELOG.md +31 -0
- package/.claude/skills/cc-investigate/PLAYBOOK.md +124 -8
- package/.claude/skills/cc-investigate/SKILL.md +252 -17
- package/.claude/skills/cc-investigate/assets/ANALYSIS_TEMPLATE.md +112 -3
- package/.claude/skills/cc-investigate/assets/TASKS_TEMPLATE.md +17 -5
- package/.claude/skills/cc-investigate/assets/TASK_MANIFEST_TEMPLATE.json +141 -1
- package/.claude/skills/cc-investigate/references/investigation-contract.md +192 -0
- package/.claude/skills/cc-plan/CHANGELOG.md +26 -0
- package/.claude/skills/cc-plan/PLAYBOOK.md +18 -6
- package/.claude/skills/cc-plan/SKILL.md +72 -34
- package/.claude/skills/cc-plan/assets/DESIGN_TEMPLATE.md +30 -3
- package/.claude/skills/cc-plan/assets/TASKS_TEMPLATE.md +28 -0
- package/.claude/skills/cc-plan/assets/TASK_MANIFEST_TEMPLATE.json +46 -1
- package/.claude/skills/cc-plan/assets/TINY_DESIGN_TEMPLATE.md +24 -0
- package/.claude/skills/cc-plan/references/planning-contract.md +18 -4
- package/.claude/skills/cc-roadmap/CHANGELOG.md +14 -0
- package/.claude/skills/cc-roadmap/PLAYBOOK.md +10 -7
- package/.claude/skills/cc-roadmap/SKILL.md +43 -23
- package/.claude/skills/cc-roadmap/assets/BACKLOG_TEMPLATE.md +10 -0
- package/.claude/skills/cc-roadmap/assets/ROADMAP_TEMPLATE.md +15 -0
- package/.claude/skills/cc-roadmap/assets/TRACKING_TEMPLATE.json +1 -1
- package/.claude/skills/cc-roadmap/references/roadmap-dialogue.md +11 -7
- package/.claude/skills/cc-simplify/CHANGELOG.md +21 -0
- package/.claude/skills/cc-simplify/SKILL.md +264 -35
- package/.claude/skills/cc-spec-init/CHANGELOG.md +6 -0
- package/.claude/skills/cc-spec-init/SKILL.md +14 -1
- package/CHANGELOG.md +37 -0
- package/README.md +10 -2
- package/README.zh-CN.md +10 -2
- package/docs/examples/example-bindings.json +7 -7
- package/docs/examples/full-design-blocked/BACKLOG.md +1 -1
- package/docs/examples/full-design-blocked/README.md +1 -1
- package/docs/examples/full-design-blocked/ROADMAP.md +1 -1
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/design.md +1 -1
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/planning/tasks.md +1 -1
- package/docs/examples/full-design-blocked/changes/REQ-002-bulk-invite-import/review/report-card.json +140 -3
- package/docs/examples/full-design-blocked/roadmap-tracking.json +1 -1
- package/docs/examples/local-handoff/BACKLOG.md +1 -1
- package/docs/examples/local-handoff/README.md +1 -1
- package/docs/examples/local-handoff/ROADMAP.md +1 -1
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/design.md +1 -1
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/planning/tasks.md +1 -1
- package/docs/examples/local-handoff/changes/REQ-003-audit-log-export/review/report-card.json +92 -0
- package/docs/examples/local-handoff/roadmap-tracking.json +1 -1
- package/docs/examples/pdca-loop/BACKLOG.md +1 -1
- package/docs/examples/pdca-loop/README.md +1 -1
- package/docs/examples/pdca-loop/ROADMAP.md +1 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/handoff/pr-brief.md +20 -0
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/design.md +1 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/task-manifest.json +2 -2
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/planning/tasks.md +1 -1
- package/docs/examples/pdca-loop/changes/REQ-001-copy-invite-link/review/report-card.json +92 -0
- package/docs/examples/pdca-loop/roadmap-tracking.json +1 -1
- package/docs/skill-strategy-audit.md +48 -0
- package/lib/skill-runtime/__tests__/runtime.integration.test.js +19 -1
- package/lib/skill-runtime/review.js +64 -1
- package/lib/skill-runtime/schemas.js +161 -4
- package/package.json +1 -1
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# CC-Act Skill Changelog
|
|
2
2
|
|
|
3
|
+
## v1.8.0 - 2026-04-28
|
|
4
|
+
|
|
5
|
+
- add remote state consistency rules for issue, PR, tracker, `needs-info`, and `ready-for-agent` closeout handoffs
|
|
6
|
+
- require dangerous git actions to have explicit ship semantics and user confirmation before reset, clean, branch deletion, or whole-tree restore
|
|
7
|
+
- require tooling changes to prove the real hook, adapt, publish, lint, or verification entrypoint still works
|
|
8
|
+
|
|
9
|
+
## v1.7.0 - 2026-04-28
|
|
10
|
+
|
|
11
|
+
- carry cc-check QA feedback-loop and behavior evidence into PR briefs, handoffs, and release notes so ship materials preserve expected/actual/reproduction truth
|
|
12
|
+
- add durable follow-up brief rules for current behavior, desired behavior, key interfaces, acceptance criteria, and out-of-scope boundaries
|
|
13
|
+
- teach shared follow-up and evidence extraction to include report-card followup briefs and QA architecture follow-ups
|
|
14
|
+
- extend readiness dashboard guidance with feedback-loop quality and behavior evidence checks
|
|
15
|
+
|
|
16
|
+
## v1.6.4 - 2026-04-28
|
|
17
|
+
|
|
18
|
+
- add a readiness dashboard covering review freshness, review quality, specialist facets, QA coverage, browser QA, failure ownership, documentation release, and PR body accuracy
|
|
19
|
+
- require verification to rerun on every cc-act invocation while keeping ship actions idempotent
|
|
20
|
+
- update `verify-act-gate.sh` to recognize `claimEvidence`, review freshness, QA coverage/browser status, and unresolved failure ownership
|
|
21
|
+
- update `render-pr-brief.sh`, shared evidence extraction, and the PR brief template with readiness and PR body accuracy fields
|
|
22
|
+
|
|
23
|
+
## v1.6.3 - 2026-04-28
|
|
24
|
+
|
|
25
|
+
- require PR briefs and PR bodies to carry the reviewed base/head SHA, review packet summary, finding triage, and QA / claim evidence summary
|
|
26
|
+
- require post-merge closeout to verify the merged result instead of relying only on pre-merge evidence
|
|
27
|
+
- add destructive cleanup confirmation rules for branch, worktree, discard, and archive actions
|
|
28
|
+
- update `render-pr-brief.sh` and the PR brief template with review range and merged-result verification fields
|
|
29
|
+
|
|
3
30
|
## v1.6.2 - 2026-04-27
|
|
4
31
|
|
|
5
32
|
- require closeout handoff documents to resolve the runtime output policy before writing PR briefs, release notes, resume indexes, or status handoffs
|
|
@@ -25,6 +25,8 @@
|
|
|
25
25
|
1. 运行 `scripts/verify-act-gate.sh --dir <requirement-dir>`
|
|
26
26
|
2. 确认 `review/report-card.json` 是 `pass`,且没有未解释的 gaps / reroute
|
|
27
27
|
3. 确认 `planning/tasks.md` 不再有未完成项
|
|
28
|
+
4. 确认 `review.freshness` 新鲜、`runtime.failureOwnership` 无未解释失败、`qa.coverageAudit` / `qa.browserEvidence` 有证据或明确 skip
|
|
29
|
+
5. 确认 `qa.feedbackLoop` / `qa.behaviorEvidence` 能支撑行为结论;不可复现时必须写清缺什么 artifact / 权限 / 输入
|
|
28
30
|
|
|
29
31
|
如果 gate 没闭合,直接回 `cc-check` 或 `cc-do`,不要在 `cc-act` 自我安慰。
|
|
30
32
|
|
|
@@ -70,6 +72,7 @@ Ship 必须属于这 4 种模式之一:
|
|
|
70
72
|
|
|
71
73
|
- `cc-act` 可以做清理和收尾修复
|
|
72
74
|
- 但只要现实被改写,就必须重新证明
|
|
75
|
+
- verification 每次进 `cc-act` 都要重新跑;只有 push、PR 更新、文档生成这类动作可以因幂等状态跳过
|
|
73
76
|
|
|
74
77
|
## Phase 2.5: Ship Hygiene
|
|
75
78
|
|
|
@@ -80,6 +83,7 @@ Ship 必须属于这 4 种模式之一:
|
|
|
80
83
|
3. 检查提交边界,按逻辑单元拆分,保证提交顺序不引用未来代码。
|
|
81
84
|
4. 如果有 WIP commit,只能用非破坏性 rebase / fixup 处理,不允许盲目 soft reset。
|
|
82
85
|
5. push 前比较 local / remote HEAD;PR 前检查是否已有打开 PR / MR。
|
|
86
|
+
6. 生成 readiness dashboard:review freshness、review quality、QA coverage、browser QA、feedback loop、behavior evidence、failure ownership、documentation release、PR body accuracy。
|
|
83
87
|
|
|
84
88
|
## Phase 3: Build Delivery Pack
|
|
85
89
|
|
|
@@ -104,6 +108,20 @@ Ship 必须属于这 4 种模式之一:
|
|
|
104
108
|
1. `scripts/sync-act-docs.sh --dir <requirement-dir>`
|
|
105
109
|
2. `scripts/render-pr-brief.sh --dir <requirement-dir>`
|
|
106
110
|
|
|
111
|
+
`pr-brief.md` 还必须带上 `cc-check` 的 review range:
|
|
112
|
+
|
|
113
|
+
- reviewed base SHA
|
|
114
|
+
- reviewed head SHA
|
|
115
|
+
- review packet path / summary
|
|
116
|
+
- finding triage summary
|
|
117
|
+
- QA / claim evidence summary
|
|
118
|
+
- QA behavior evidence and feedback-loop quality
|
|
119
|
+
- readiness dashboard
|
|
120
|
+
- PR body accuracy check
|
|
121
|
+
- Durable follow-up briefs: current behavior、desired behavior、key interfaces、acceptance criteria、out of scope
|
|
122
|
+
|
|
123
|
+
缺这些字段时,可以生成 local handoff,但不能声称 PR body 已经可 review。
|
|
124
|
+
|
|
107
125
|
## Phase 4: Sync Docs
|
|
108
126
|
|
|
109
127
|
文档同步不是装饰动作,而是 ship 的一部分。
|
|
@@ -125,7 +143,8 @@ Ship 必须属于这 4 种模式之一:
|
|
|
125
143
|
- 按 `references/git-commit-guidelines.md` 完成提交
|
|
126
144
|
- 推送当前分支
|
|
127
145
|
- 用 `gh pr create` 创建 PR / MR
|
|
128
|
-
- PR body 以 `pr-brief.md` 为真相源,并包含 Summary、Test Coverage、Pre-Landing Review、Scope Drift、Plan Completion、Verification Results、Documentation、Test plan
|
|
146
|
+
- PR body 以 `pr-brief.md` 为真相源,并包含 Summary、Test Coverage、Pre-Landing Review、Readiness Dashboard、Scope Drift、Plan Completion、Verification Results、Documentation、Test plan
|
|
147
|
+
- 创建前检查 PR body 是否来自当前 report-card 和当前 diff,不继承旧 body
|
|
129
148
|
|
|
130
149
|
### `update-pr`
|
|
131
150
|
|
|
@@ -133,6 +152,7 @@ Ship 必须属于这 4 种模式之一:
|
|
|
133
152
|
- 不重新造一个 PR
|
|
134
153
|
- 刷新已有 PR / MR body
|
|
135
154
|
- 确保 body 由本次最新 `cc-check` 结果与 doc sync 状态重建,不沿用旧 body
|
|
155
|
+
- PR body 与当前 commits / diff 不一致时,必须先更新 body,再继续交付判断
|
|
136
156
|
|
|
137
157
|
### `local-handoff`
|
|
138
158
|
|
|
@@ -142,8 +162,15 @@ Ship 必须属于这 4 种模式之一:
|
|
|
142
162
|
### `post-merge-closeout`
|
|
143
163
|
|
|
144
164
|
- 不做 feature branch PR 动作
|
|
165
|
+
- 在 merged result 上重跑必要 gate,并记录命令、exit status、关键观察
|
|
145
166
|
- 完成 release note、文档同步、backlog/roadmap 回写、归档
|
|
146
167
|
|
|
168
|
+
### destructive cleanup
|
|
169
|
+
|
|
170
|
+
- 删除 branch、worktree、未合并提交、requirement archive 前,先列出对象
|
|
171
|
+
- 丢弃未合并工作必须要求用户显式确认
|
|
172
|
+
- 无法确认时保留现场,切到 `local-handoff`
|
|
173
|
+
|
|
147
174
|
如果 `gh` 不可用、push 失败、远端不可达,就不要硬凹 `create-pr` / `update-pr`。切到 `local-handoff`,把阻塞和下一步写清楚。
|
|
148
175
|
|
|
149
176
|
## Phase 6: Write Back The Learning
|
|
@@ -159,6 +186,8 @@ Ship 必须属于这 4 种模式之一:
|
|
|
159
186
|
- 长期方向写 `devflow/roadmap/roadmap.md`
|
|
160
187
|
- 下一轮待排队动作写 `devflow/roadmap/backlog.md`
|
|
161
188
|
- 不要把噪音和碎念回写成系统真相
|
|
189
|
+
- follow-up 必须是 durable brief:用领域语言写 current behavior、desired behavior、key interfaces、acceptance criteria、out of scope
|
|
190
|
+
- 独立行为拆独立条目;有依赖关系时写明顺序,方便下一轮并行或排队
|
|
162
191
|
|
|
163
192
|
## Phase 7: Declare The Next Entry
|
|
164
193
|
|
|
@@ -176,6 +205,8 @@ Ship 必须属于这 4 种模式之一:
|
|
|
176
205
|
3. reviewer / 接手者 还需不需要追问“所以我现在该看哪个文件”?
|
|
177
206
|
4. `cc-simplify`、单测、e2e、commit/push 的结果是不是都能追溯?
|
|
178
207
|
5. PR body / release note / handoff / changelog 说的是不是同一套现实?
|
|
208
|
+
6. readiness dashboard 有没有 blocker 或 stale warning?
|
|
209
|
+
7. follow-up 是不是行为契约,而不是“改某文件某行”的易腐烂 TODO?
|
|
179
210
|
|
|
180
211
|
如果第 1 或第 3 题答案不是“能”,说明 `cc-act` 仍然太重或太糊。
|
|
181
212
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cc-act
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.8.0
|
|
4
4
|
description: 'Use when verified work must be shipped or handed off with a clear landing path: run simplify and required tests, create or update a PR, prepare a local handoff, close out merged work, sync docs, write release notes, and fold follow-ups back into backlog or roadmap.'
|
|
5
5
|
triggers:
|
|
6
6
|
- 准备提 PR
|
|
@@ -41,7 +41,7 @@ entry_gate:
|
|
|
41
41
|
- If simplify, tests, or act changes code or verification scope, return to cc-check immediately.
|
|
42
42
|
exit_criteria:
|
|
43
43
|
- The ship mode is explicit, delivery materials match that mode, and the next maintainer has one clear entry point.
|
|
44
|
-
- Docs, PR text, release notes, handoff artifacts, and test evidence reflect the same proven facts.
|
|
44
|
+
- Docs, PR text, release notes, handoff artifacts, review range, readiness dashboard, PR body accuracy check, and test evidence reflect the same proven facts.
|
|
45
45
|
- Follow-up items are written back to roadmap/backlog instead of lingering in chat memory.
|
|
46
46
|
reroutes:
|
|
47
47
|
- when: Verification is stale, incomplete, or changed during act.
|
|
@@ -126,7 +126,9 @@ tool_budget:
|
|
|
126
126
|
2. 再读 `planning/design.md` 或 `planning/analysis.md`、`planning/tasks.md`、`planning/task-manifest.json`、`change-meta.json`、相关 capability spec;如果已有 `handoff/resume-index.md`,一并读取,确认这次到底完成了什么。
|
|
127
127
|
3. 运行 `scripts/verify-act-gate.sh --dir <requirement-dir>`,确认 gate 真的闭合。
|
|
128
128
|
4. 运行 `scripts/detect-ship-target.sh`,识别当前分支、base branch、PR 状态与推荐 ship 路径。
|
|
129
|
-
5.
|
|
129
|
+
5. 检查 `review.freshness`、`runtime.failureOwnership`、`qa.coverageAudit`、`qa.browserEvidence`,确认 readiness dashboard 没有 blocker。
|
|
130
|
+
6. 检查 `qa.feedbackLoop`、`qa.behaviorEvidence`、`qa.architectureFollowUps` 和 follow-up brief,确认交付材料继承的是行为证据,不是聊天记忆或易腐烂 TODO。
|
|
131
|
+
7. 如果在 `cc-act` 期间因为 `cc-simplify`、单测、e2e、review 修复而改了代码,必须回 `cc-check`,不能带着旧证明继续 ship。
|
|
130
132
|
|
|
131
133
|
## Ship Modes
|
|
132
134
|
|
|
@@ -146,7 +148,7 @@ tool_budget:
|
|
|
146
148
|
- 但要把 handoff 与下一步写清楚
|
|
147
149
|
4. `post-merge-closeout`
|
|
148
150
|
- 当前已在 base branch,或 requirement 已完成合并
|
|
149
|
-
- 重点是 release note、doc sync、backlog writeback、归档
|
|
151
|
+
- 重点是 merged-result verification、release note、doc sync、backlog writeback、归档
|
|
150
152
|
|
|
151
153
|
不要发明第五种模糊模式。
|
|
152
154
|
|
|
@@ -207,9 +209,40 @@ tool_budget:
|
|
|
207
209
|
2. Scope completion:PR 简报必须包含 `cc-check` 的 plan completion、scope drift、review finding、验证结果摘要。
|
|
208
210
|
3. Version and changelog:如果项目有 `VERSION`、`package.json`、`CHANGELOG.md`,先判断是否已 bump / 是否漂移;不要重复 bump,也不要覆盖 changelog。
|
|
209
211
|
4. Bisectable commits:提交按逻辑单元拆分,顺序保证每个 commit 独立可理解、尽量可验证;小于 50 行且少于 4 文件可单 commit。
|
|
210
|
-
5. Fresh final verification
|
|
212
|
+
5. Fresh final verification:每次进入 `cc-act` 都要重跑 entry gate、simplify、单测、e2e 或记录 skip;只有 push、PR 更新、doc 生成这类动作可以幂等跳过。以前跑过不等于现在仍然可信。
|
|
211
213
|
6. Push idempotency:push 前比较 local/remote HEAD;已同步就不重复 push,不可用就切 `local-handoff`。
|
|
212
214
|
7. PR idempotency:已有打开的 PR / MR 只更新 body,不重复创建。
|
|
215
|
+
8. Review range:PR brief / PR body 必须写清 `cc-check` 审过的 base/head SHA、review packet、finding triage 摘要。
|
|
216
|
+
9. Post-integration verification:本地合并或 post-merge closeout 后,必须在 merged result 上跑必要 gate;不能只继承合并前绿色。
|
|
217
|
+
10. Follow-up durability:PR brief / release note / backlog writeback 里的 follow-up 必须写成行为契约,包含 current behavior、desired behavior、key interfaces、acceptance criteria、out of scope;不要把当前文件路径或行号当成长期计划。
|
|
218
|
+
11. Remote state consistency:如果本次 closeout 触碰 GitHub issue / PR / tracker,必须记录当前 state、目标 state、允许转换、已保留事实和下一位 owner;`needs-info` 必须保留已确认事实和具体问题,`ready-for-agent` 必须有可执行 brief。
|
|
219
|
+
12. Tooling smoke:如果本次改动影响 hook、pre-commit、lint、publish、adapt 或验证脚本,必须跑真实入口或最接近真实入口的 smoke;只读配置文件不等于工具链可用。
|
|
220
|
+
|
|
221
|
+
## Readiness Dashboard
|
|
222
|
+
|
|
223
|
+
PR / handoff 之前必须把 readiness 压成一屏事实:
|
|
224
|
+
|
|
225
|
+
1. Review freshness:`review.freshness.status` 必须是 `fresh` 或 `not-applicable`。
|
|
226
|
+
2. Review quality:记录 `review.qualityScore`、specialist facet 覆盖、finding triage 摘要。
|
|
227
|
+
3. QA coverage:记录 `qa.coverageAudit` 的 coverage、gaps、e2e/eval requirement。
|
|
228
|
+
4. Browser QA:UI / 用户路径变更必须有 `qa.browserEvidence`,否则要有 skip reason。
|
|
229
|
+
5. Feedback loop:bugfix / 行为变更必须有 `qa.feedbackLoop`,否则要有不可复现或不适用原因。
|
|
230
|
+
6. Behavior evidence:expected / actual / reproduction steps 必须能被 reviewer 独立理解。
|
|
231
|
+
7. Failure ownership:`runtime.failureOwnership` 不能有未解释的 `in-branch` 或 `ambiguous` failure。
|
|
232
|
+
8. Documentation release:README / CLAUDE / architecture / handoff / changelog 的同步状态必须可审计。
|
|
233
|
+
9. PR body accuracy:PR body 必须从当前 `pr-brief.md`、当前 diff、当前 report-card 重建;已有 PR body 只能被刷新,不能被继承。
|
|
234
|
+
|
|
235
|
+
readiness dashboard 有 blocker 时,不能创建或更新 PR,只能 reroute 到 `cc-check` / `cc-do` 或生成 local handoff。
|
|
236
|
+
|
|
237
|
+
## Integration Safety
|
|
238
|
+
|
|
239
|
+
`cc-act` 可以清理交付路径,但不能悄悄做破坏性动作:
|
|
240
|
+
|
|
241
|
+
1. 删除 feature branch、删除 worktree、丢弃提交、归档 requirement 前,必须列出受影响对象。
|
|
242
|
+
2. 丢弃未合并工作必须要求用户显式确认;没有确认时只能转 `local-handoff`。
|
|
243
|
+
3. branch cleanup 只发生在 merge / PR / discard 语义已经清楚之后。
|
|
244
|
+
4. `post-merge-closeout` 必须记录 merged-result verification:命令、exit status、关键观察、失败时 reroute。
|
|
245
|
+
5. 危险 Git 动作必须有明确 ship 语义:`git push` 只在 `create-pr` / `update-pr` / release lane 执行,`git reset --hard`、`git clean -f`、`git branch -D`、整树 restore/checkout 必须先列出对象并取得用户确认;没有确认时写 handoff,不执行。
|
|
213
246
|
|
|
214
247
|
## Documentation Release
|
|
215
248
|
|
|
@@ -223,6 +256,16 @@ tool_budget:
|
|
|
223
256
|
6. Discoverability:新增文档必须能从 README、CLAUDE 或 handoff 入口找到。
|
|
224
257
|
7. TODO/backlog cleanup:只把有 diff 证据完成的事项移到 completed;新 follow-up 写回 backlog/roadmap。
|
|
225
258
|
|
|
259
|
+
## Issue And Follow-Up Handoff
|
|
260
|
+
|
|
261
|
+
当本次交付产生或更新 issue / PR / backlog follow-up 时,文案必须耐 refactor:
|
|
262
|
+
|
|
263
|
+
- 先写用户可观察行为:what happened / expected / reproduction 或 desired behavior。
|
|
264
|
+
- 再写 agent 可执行 contract:acceptance criteria、allowed scope、blocked by、verification command。
|
|
265
|
+
- 不把短期文件路径、行号、函数名写成长期事实;只有当前 reviewer 需要定位时才放进 PR brief 的实现备注。
|
|
266
|
+
- 多个 follow-up 必须按独立可验证切片拆开,并标明 `AFK` / `HITL`、blocked-by 和 owner。
|
|
267
|
+
- 已经问过或确认过的信息不能在 `needs-info` 里丢失;问题必须具体到 reporter 能直接补证据。
|
|
268
|
+
|
|
226
269
|
## Loop
|
|
227
270
|
|
|
228
271
|
1. 先锁定 ship 事实:当前分支、base branch、PR 状态、requirement 状态。
|
|
@@ -245,11 +288,12 @@ tool_budget:
|
|
|
245
288
|
- `local-handoff`:不假装已经发出,只生成可接手材料
|
|
246
289
|
- `post-merge-closeout`:跳过 PR,完成发布与闭环回写
|
|
247
290
|
11. 处理 PR / MR body:从当前 `pr-brief.md`、最新验证、review、doc sync、TODO/backlog 结果重新渲染,不复用旧 body。
|
|
248
|
-
12.
|
|
291
|
+
12. 在 `handoff/pr-brief.md` 写入 readiness dashboard 与 PR body accuracy check;已有 PR body 与当前事实不一致时先刷新再继续。
|
|
292
|
+
13. 回写 `devflow/roadmap/backlog.md` / `devflow/roadmap/roadmap.md`:
|
|
249
293
|
- 新发现的 follow-up
|
|
250
294
|
- 被推迟但必须保留的事项
|
|
251
295
|
- 因本次结果而改变优先级的事项
|
|
252
|
-
|
|
296
|
+
14. 如果 requirement 真正闭环,更新状态摘要并归档;否则把下一位接手者的入口写清楚。
|
|
253
297
|
|
|
254
298
|
## Output
|
|
255
299
|
|
|
@@ -261,6 +305,7 @@ tool_budget:
|
|
|
261
305
|
- 单测 / e2e 的通过证据,或明确记录的 skip / blocker
|
|
262
306
|
- 必要时创建或更新的 PR / MR
|
|
263
307
|
- PR / MR body 中的 Summary、Test Coverage、Pre-Landing Review、Scope Drift、Plan Completion、Verification Results、Documentation、Test plan
|
|
308
|
+
- readiness dashboard 和 PR body accuracy check
|
|
264
309
|
|
|
265
310
|
## Good Output
|
|
266
311
|
|
|
@@ -300,6 +345,7 @@ tool_budget:
|
|
|
300
345
|
10. `create-pr` / `update-pr` 模式默认要求提交历史符合 `references/git-commit-guidelines.md`,并完成正确的 push、PR 创建或更新动作。
|
|
301
346
|
11. CHANGELOG 只能基于当前 diff / commit history / release truth 更新,不允许覆盖既有历史条目。
|
|
302
347
|
12. PR / MR body 每次都从当前事实重建,不沿用旧 body 或旧测试输出。
|
|
348
|
+
13. Verification 每次执行 `cc-act` 都必须重新运行;只有已完成且可证明幂等的动作可以跳过。
|
|
303
349
|
|
|
304
350
|
## Exit Criteria
|
|
305
351
|
|
|
@@ -24,6 +24,27 @@
|
|
|
24
24
|
- Base branch:
|
|
25
25
|
- PR / MR:
|
|
26
26
|
|
|
27
|
+
## Review Range
|
|
28
|
+
|
|
29
|
+
- Reviewed base SHA:
|
|
30
|
+
- Reviewed head SHA:
|
|
31
|
+
- Review packet:
|
|
32
|
+
- Finding triage:
|
|
33
|
+
- QA / claim evidence:
|
|
34
|
+
|
|
35
|
+
## Readiness Dashboard
|
|
36
|
+
|
|
37
|
+
- Review freshness:
|
|
38
|
+
- Review quality:
|
|
39
|
+
- Specialist review facets:
|
|
40
|
+
- QA coverage:
|
|
41
|
+
- Browser QA:
|
|
42
|
+
- Feedback loop:
|
|
43
|
+
- Behavior evidence:
|
|
44
|
+
- Failure ownership:
|
|
45
|
+
- Documentation release:
|
|
46
|
+
- PR body accuracy:
|
|
47
|
+
|
|
27
48
|
## Summary
|
|
28
49
|
|
|
29
50
|
-
|
|
@@ -36,6 +57,15 @@
|
|
|
36
57
|
|
|
37
58
|
- `review/report-card.json` verdict:
|
|
38
59
|
- Fresh evidence:
|
|
60
|
+
- Merged-result verification:
|
|
61
|
+
|
|
62
|
+
## QA Behavior Evidence
|
|
63
|
+
|
|
64
|
+
- Feedback loop:
|
|
65
|
+
- Expected behavior:
|
|
66
|
+
- Actual behavior:
|
|
67
|
+
- Reproduction steps:
|
|
68
|
+
- Consistency:
|
|
39
69
|
|
|
40
70
|
## Documentation Sync
|
|
41
71
|
|
|
@@ -61,7 +91,11 @@
|
|
|
61
91
|
|
|
62
92
|
## Follow-Ups
|
|
63
93
|
|
|
64
|
-
-
|
|
94
|
+
- Current behavior:
|
|
95
|
+
- Desired behavior:
|
|
96
|
+
- Key interfaces:
|
|
97
|
+
- Acceptance criteria:
|
|
98
|
+
- Out of scope:
|
|
65
99
|
|
|
66
100
|
## Risks
|
|
67
101
|
|
|
@@ -20,10 +20,19 @@
|
|
|
20
20
|
|
|
21
21
|
-
|
|
22
22
|
|
|
23
|
+
## QA Behavior Evidence
|
|
24
|
+
|
|
25
|
+
- Feedback loop:
|
|
26
|
+
- User-visible behavior:
|
|
27
|
+
- Reproduction / verification path:
|
|
28
|
+
|
|
23
29
|
## Ops Notes
|
|
24
30
|
|
|
25
31
|
-
|
|
26
32
|
|
|
27
33
|
## Follow-Ups
|
|
28
34
|
|
|
29
|
-
-
|
|
35
|
+
- Current behavior:
|
|
36
|
+
- Desired behavior:
|
|
37
|
+
- Acceptance criteria:
|
|
38
|
+
- Out of scope:
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
4. `planning/tasks.md` 不能还有未完成项
|
|
9
9
|
5. 交付材料必须只总结现实,不补编故事
|
|
10
10
|
6. 如果文件结构变了,就同步对应目录的 `CLAUDE.md`
|
|
11
|
+
7. PR / handoff 必须记录 `cc-check` 审过的 base/head SHA、review packet、finding triage 摘要
|
|
12
|
+
8. readiness dashboard 必须说明 review freshness、QA coverage、browser evidence、failure ownership、documentation release、PR body accuracy
|
|
13
|
+
9. behavior handoff 必须带上 QA feedback loop、expected / actual / reproduction steps,以及 durable follow-up brief
|
|
11
14
|
|
|
12
15
|
## Ship Decision Contract
|
|
13
16
|
|
|
@@ -29,6 +32,11 @@
|
|
|
29
32
|
5. VERSION / package / changelog 漂移必须先分类处理,不能重复 bump 或覆盖发布历史
|
|
30
33
|
6. PR / MR body 必须从当前事实重建,不能沿用旧验证输出
|
|
31
34
|
7. push / PR 创建必须具备幂等检查:已同步则跳过,已存在 PR 则更新
|
|
35
|
+
8. 本地合并或 post-merge closeout 后必须在 merged result 上重跑必要 gate
|
|
36
|
+
9. 删除 branch、worktree、未合并提交、归档 requirement 前必须列出对象;丢弃未合并工作需要显式确认
|
|
37
|
+
10. verification 每次进入 `cc-act` 都必须重新跑;只有 push、PR 更新、文档生成等动作可以因为幂等状态跳过
|
|
38
|
+
11. PR body accuracy 必须对照当前 report-card、当前 diff、当前 commits;旧 body 不能作为证据源
|
|
39
|
+
12. follow-up 回写必须用行为契约表达,包含 current behavior、desired behavior、key interfaces、acceptance criteria、out of scope;不能只写文件路径或聊天 TODO
|
|
32
40
|
|
|
33
41
|
## Memory Consolidation
|
|
34
42
|
|
|
@@ -45,5 +53,8 @@
|
|
|
45
53
|
- reviewer 能接手
|
|
46
54
|
- maintainer 知道怎么验证
|
|
47
55
|
- PR / handoff / release 材料反映同一套事实
|
|
56
|
+
- readiness dashboard 没有 blocker,PR body accuracy 已检查或明确阻塞
|
|
57
|
+
- QA behavior evidence 和 feedback loop 已进入 PR / handoff / release 材料
|
|
58
|
+
- post-merge closeout 反映 merged result 的验证事实,而不是只反映合并前事实
|
|
48
59
|
- 下一轮计划入口更清楚
|
|
49
60
|
- 文档入口可发现,changelog 不丢历史,TODO / backlog 只记录有证据的事项
|
|
@@ -189,6 +189,30 @@ req_act_collect_followups() {
|
|
|
189
189
|
|
|
190
190
|
if [[ -f "$report_card" ]]; then
|
|
191
191
|
jq -r '(.gaps // [])[]?' "$report_card" 2>/dev/null | sed '/^$/d' > "$out_file" || true
|
|
192
|
+
jq -r '
|
|
193
|
+
(.followupBriefs // .review.followupBriefs // [])[]?
|
|
194
|
+
| [
|
|
195
|
+
("summary: " + (.summary // .title // "follow-up")),
|
|
196
|
+
("current: " + (.currentBehavior // "not recorded")),
|
|
197
|
+
("desired: " + (.desiredBehavior // "not recorded")),
|
|
198
|
+
("interfaces: " + ((.keyInterfaces // []) | join(", "))),
|
|
199
|
+
("acceptance: " + ((.acceptanceCriteria // []) | join("; "))),
|
|
200
|
+
("out-of-scope: " + ((.outOfScope // []) | join(", ")))
|
|
201
|
+
]
|
|
202
|
+
| join(" | ")
|
|
203
|
+
' "$report_card" 2>/dev/null | sed '/^$/d' >> "$out_file" || true
|
|
204
|
+
jq -r '
|
|
205
|
+
(.qa.architectureFollowUps // [])[]?
|
|
206
|
+
| [
|
|
207
|
+
("summary: " + (.summary // .title // "architecture follow-up")),
|
|
208
|
+
("current: " + (.currentBehavior // "not recorded")),
|
|
209
|
+
("desired: " + (.desiredBehavior // "not recorded")),
|
|
210
|
+
("interfaces: " + ((.keyInterfaces // []) | join(", "))),
|
|
211
|
+
("acceptance: " + ((.acceptanceCriteria // []) | join("; "))),
|
|
212
|
+
("out-of-scope: " + ((.outOfScope // []) | join(", ")))
|
|
213
|
+
]
|
|
214
|
+
| join(" | ")
|
|
215
|
+
' "$report_card" 2>/dev/null | sed '/^$/d' >> "$out_file" || true
|
|
192
216
|
fi
|
|
193
217
|
|
|
194
218
|
if [[ -f "$manifest" ]]; then
|
|
@@ -234,7 +258,14 @@ req_act_collect_evidence() {
|
|
|
234
258
|
local out_file="$2"
|
|
235
259
|
|
|
236
260
|
: > "$out_file"
|
|
237
|
-
jq -r '
|
|
261
|
+
jq -r '
|
|
262
|
+
(.evidence // [])[]?,
|
|
263
|
+
((.claimEvidence // [])[]? | "- " + (.claim // "claim") + ": " + (.status // "unknown") + " via " + (.commandOrArtifact // "artifact") + " - " + (.keyObservation // "")),
|
|
264
|
+
(if .qa.coverageAudit then "- qa.coverage: " + (.qa.coverageAudit.status // "unknown") + ", gaps=" + (((.qa.coverageAudit.gaps // []) | length) | tostring) else empty end),
|
|
265
|
+
(if .qa.browserEvidence then "- qa.browser: " + (.qa.browserEvidence.status // "unknown") + ", mode=" + (.qa.browserEvidence.mode // "unknown") else empty end),
|
|
266
|
+
(if .qa.feedbackLoop then "- qa.feedbackLoop: " + (.qa.feedbackLoop.status // "unknown") + ", mode=" + (.qa.feedbackLoop.mode // "unknown") + ", signal=" + (.qa.feedbackLoop.signalSharpness // "not recorded") else empty end),
|
|
267
|
+
(if .qa.behaviorEvidence then "- qa.behavior: " + (.qa.behaviorEvidence.status // "unknown") + ", expected=" + (.qa.behaviorEvidence.expectedBehavior // "not recorded") + ", actual=" + (.qa.behaviorEvidence.actualBehavior // "not recorded") else empty end)
|
|
268
|
+
' "$report_card" 2>/dev/null | sed '/^$/d' > "$out_file" || true
|
|
238
269
|
req_act_dedup_file "$out_file"
|
|
239
270
|
}
|
|
240
271
|
|
|
@@ -65,6 +65,31 @@ report_verdict="$(req_act_report_verdict "$report_card")"
|
|
|
65
65
|
output_language="$(req_act_output_language "$report_card")"
|
|
66
66
|
design_goal="$(req_act_design_goal "$design_file")"
|
|
67
67
|
main_risk="$(req_act_main_risk "$design_file")"
|
|
68
|
+
review_base_sha="$(jq -r '[.review.taskReviews.reviewPacket.baseSha?, .review.diffReview.reviewPacket.baseSha?] | map(select(. != null and . != "")) | first // "not recorded"' "$report_card")"
|
|
69
|
+
review_head_sha="$(jq -r '[.review.taskReviews.reviewPacket.headSha?, .review.diffReview.reviewPacket.headSha?] | map(select(. != null and . != "")) | first // "not recorded"' "$report_card")"
|
|
70
|
+
review_packet_summary="$(jq -r '
|
|
71
|
+
[
|
|
72
|
+
.review.taskReviews.reviewPacket.requirements?,
|
|
73
|
+
.review.diffReview.reviewPacket.requirements?
|
|
74
|
+
]
|
|
75
|
+
| map(select(. != null and . != ""))
|
|
76
|
+
| unique
|
|
77
|
+
| if length == 0 then "not recorded" else join("; ") end
|
|
78
|
+
' "$report_card")"
|
|
79
|
+
finding_triage_summary="$(jq -r '
|
|
80
|
+
[
|
|
81
|
+
(.review.taskReviews.findings? // []),
|
|
82
|
+
(.review.diffReview.findings? // []),
|
|
83
|
+
(.review.findings? // [])
|
|
84
|
+
]
|
|
85
|
+
| flatten
|
|
86
|
+
| map(.triageStatus? // .status? // "untriaged")
|
|
87
|
+
| if length == 0 then "no findings" else group_by(.) | map("\(.[0])=\(length)") | join(", ") end
|
|
88
|
+
' "$report_card")"
|
|
89
|
+
qa_claim_summary="$(jq -r '
|
|
90
|
+
"qa=\(.qa.status? // "not recorded"), claims=" +
|
|
91
|
+
(((.claimEvidence? // []) | map((.claim // "unknown") + ":" + (.status // "unknown")) | join(", ")) // "not recorded")
|
|
92
|
+
' "$report_card")"
|
|
68
93
|
|
|
69
94
|
tmp_changed="$(mktemp)"
|
|
70
95
|
tmp_verify="$(mktemp)"
|
|
@@ -95,6 +120,73 @@ if [[ -f "$doc_sync_report" ]]; then
|
|
|
95
120
|
fi
|
|
96
121
|
fi
|
|
97
122
|
|
|
123
|
+
review_freshness_summary="$(jq -r '
|
|
124
|
+
.review.freshness as $fresh |
|
|
125
|
+
if $fresh == null then
|
|
126
|
+
"not recorded"
|
|
127
|
+
else
|
|
128
|
+
"status=\($fresh.status // "unknown"), reviewed=\($fresh.reviewedCommit // "not recorded"), current=\($fresh.currentCommit // "not recorded"), commitsSinceReview=\($fresh.commitsSinceReview // "unknown")" +
|
|
129
|
+
(if (($fresh.staleReason // "") != "") then ", reason=\($fresh.staleReason)" else "" end)
|
|
130
|
+
end
|
|
131
|
+
' "$report_card")"
|
|
132
|
+
review_quality_summary="$(jq -r '
|
|
133
|
+
"qualityScore=\(.review.qualityScore // "not recorded")"
|
|
134
|
+
' "$report_card")"
|
|
135
|
+
specialist_review_summary="$(jq -r '
|
|
136
|
+
(.review.specialistReviews? // [])
|
|
137
|
+
| if length == 0 then
|
|
138
|
+
"no specialist facets recorded"
|
|
139
|
+
else
|
|
140
|
+
map((.name // "unknown") + ":" + (.status // "unknown")) | join(", ")
|
|
141
|
+
end
|
|
142
|
+
' "$report_card")"
|
|
143
|
+
qa_coverage_summary="$(jq -r '
|
|
144
|
+
.qa.coverageAudit as $coverage |
|
|
145
|
+
if $coverage == null then
|
|
146
|
+
"not recorded"
|
|
147
|
+
else
|
|
148
|
+
"status=\($coverage.status // "unknown"), coverage=\($coverage.coveragePct // "n/a"), gaps=\((($coverage.gaps // []) | length)), e2eRequired=\($coverage.e2eRequired // false), evalRequired=\($coverage.evalRequired // false)"
|
|
149
|
+
end
|
|
150
|
+
' "$report_card")"
|
|
151
|
+
browser_qa_summary="$(jq -r '
|
|
152
|
+
.qa.browserEvidence as $browser |
|
|
153
|
+
if $browser == null then
|
|
154
|
+
"not recorded"
|
|
155
|
+
else
|
|
156
|
+
"status=\($browser.status // "unknown"), mode=\($browser.mode // "unknown"), routes=\((($browser.affectedRoutes // []) | length)), issues=\((($browser.issues // []) | length)), consoleErrors=\((($browser.consoleErrors // []) | length))" +
|
|
157
|
+
(if (($browser.skipReason // "") != "") then ", skip=\($browser.skipReason)" else "" end)
|
|
158
|
+
end
|
|
159
|
+
' "$report_card")"
|
|
160
|
+
feedback_loop_summary="$(jq -r '
|
|
161
|
+
.qa.feedbackLoop as $loop |
|
|
162
|
+
if $loop == null then
|
|
163
|
+
"not recorded"
|
|
164
|
+
else
|
|
165
|
+
"status=\($loop.status // "unknown"), mode=\($loop.mode // "unknown"), determinism=\($loop.determinism // "not recorded"), reproductionRate=\($loop.reproductionRate // "not recorded")" +
|
|
166
|
+
(if (($loop.blockedReason // "") != "") then ", blocked=\($loop.blockedReason)" else "" end)
|
|
167
|
+
end
|
|
168
|
+
' "$report_card")"
|
|
169
|
+
behavior_evidence_summary="$(jq -r '
|
|
170
|
+
.qa.behaviorEvidence as $behavior |
|
|
171
|
+
if $behavior == null then
|
|
172
|
+
"not recorded"
|
|
173
|
+
else
|
|
174
|
+
"status=\($behavior.status // "unknown"), boundary=\($behavior.userFacingBoundary // "not recorded"), expected=\($behavior.expectedBehavior // "not recorded"), actual=\($behavior.actualBehavior // "not recorded"), steps=\((($behavior.reproductionSteps // []) | length))"
|
|
175
|
+
end
|
|
176
|
+
' "$report_card")"
|
|
177
|
+
failure_ownership_summary="$(jq -r '
|
|
178
|
+
(.runtime.failureOwnership? // [])
|
|
179
|
+
| if length == 0 then
|
|
180
|
+
"no open failures recorded"
|
|
181
|
+
else
|
|
182
|
+
group_by(.classification // "unknown")
|
|
183
|
+
| map("\(.[0].classification // "unknown")=\(length)")
|
|
184
|
+
| join(", ")
|
|
185
|
+
end
|
|
186
|
+
' "$report_card")"
|
|
187
|
+
documentation_release_summary="CLAUDE=${claude_status}; README=${readme_status}"
|
|
188
|
+
pr_body_accuracy_summary="body must be regenerated from this pr-brief, current report-card, and current diff before PR create/update"
|
|
189
|
+
|
|
98
190
|
{
|
|
99
191
|
echo "# PR Brief"
|
|
100
192
|
echo
|
|
@@ -120,6 +212,27 @@ fi
|
|
|
120
212
|
echo "- PR / MR: none"
|
|
121
213
|
fi
|
|
122
214
|
echo
|
|
215
|
+
echo "## Review Range"
|
|
216
|
+
echo
|
|
217
|
+
echo "- Reviewed base SHA: $review_base_sha"
|
|
218
|
+
echo "- Reviewed head SHA: $review_head_sha"
|
|
219
|
+
echo "- Review packet: $review_packet_summary"
|
|
220
|
+
echo "- Finding triage: $finding_triage_summary"
|
|
221
|
+
echo "- QA / claim evidence: $qa_claim_summary"
|
|
222
|
+
echo
|
|
223
|
+
echo "## Readiness Dashboard"
|
|
224
|
+
echo
|
|
225
|
+
echo "- Review freshness: $review_freshness_summary"
|
|
226
|
+
echo "- Review quality: $review_quality_summary"
|
|
227
|
+
echo "- Specialist review facets: $specialist_review_summary"
|
|
228
|
+
echo "- QA coverage: $qa_coverage_summary"
|
|
229
|
+
echo "- Browser QA: $browser_qa_summary"
|
|
230
|
+
echo "- Feedback loop: $feedback_loop_summary"
|
|
231
|
+
echo "- Behavior evidence: $behavior_evidence_summary"
|
|
232
|
+
echo "- Failure ownership: $failure_ownership_summary"
|
|
233
|
+
echo "- Documentation release: $documentation_release_summary"
|
|
234
|
+
echo "- PR body accuracy: $pr_body_accuracy_summary"
|
|
235
|
+
echo
|
|
123
236
|
echo "## Summary"
|
|
124
237
|
echo
|
|
125
238
|
if [[ -n "$report_summary" ]]; then
|
|
@@ -145,6 +258,11 @@ fi
|
|
|
145
258
|
echo "## Verification Evidence"
|
|
146
259
|
echo
|
|
147
260
|
echo "- \`report-card.json\` verdict: $report_verdict"
|
|
261
|
+
if [[ "$ship_mode" == "post-merge-closeout" ]]; then
|
|
262
|
+
echo "- Merged-result verification: required before closeout; record command, exit status, and key observation"
|
|
263
|
+
else
|
|
264
|
+
echo "- Merged-result verification: not applicable before merge"
|
|
265
|
+
fi
|
|
148
266
|
if [[ -s "$tmp_evidence" ]]; then
|
|
149
267
|
while IFS= read -r line; do
|
|
150
268
|
echo "- $line"
|
|
@@ -153,6 +271,18 @@ fi
|
|
|
153
271
|
echo "- No evidence lines captured yet."
|
|
154
272
|
fi
|
|
155
273
|
echo
|
|
274
|
+
echo "## QA Behavior Evidence"
|
|
275
|
+
echo
|
|
276
|
+
echo "- Feedback loop: $feedback_loop_summary"
|
|
277
|
+
echo "- Behavior evidence: $behavior_evidence_summary"
|
|
278
|
+
jq -r '
|
|
279
|
+
.qa.behaviorEvidence as $behavior |
|
|
280
|
+
if $behavior == null then empty else
|
|
281
|
+
(($behavior.reproductionSteps // [])[]? | "- Reproduction step: " + .),
|
|
282
|
+
(($behavior.domainLanguage // [])[]? | "- Domain language: " + .)
|
|
283
|
+
end
|
|
284
|
+
' "$report_card" 2>/dev/null | sed '/^$/d' || true
|
|
285
|
+
echo
|
|
156
286
|
echo "## Documentation Sync"
|
|
157
287
|
echo
|
|
158
288
|
echo "- \`CLAUDE.md\`: $claude_status"
|
|
@@ -37,8 +37,18 @@ tasks_file="$(req_act_tasks_path "$CHANGE_DIR")"
|
|
|
37
37
|
verdict="$(jq -r '.verdict // "unknown"' "$report_card" 2>/dev/null || echo unknown)"
|
|
38
38
|
reroute="$(jq -r '.reroute // "unknown"' "$report_card" 2>/dev/null || echo unknown)"
|
|
39
39
|
spec_sync_ready="$(jq -r '.specSyncReady // false' "$report_card" 2>/dev/null || echo false)"
|
|
40
|
-
evidence_count="$(jq -r '(.evidence // []) | length' "$report_card" 2>/dev/null || echo 0)"
|
|
40
|
+
evidence_count="$(jq -r '((.evidence // []) + (.claimEvidence // []) + (.quickGates // []) + (.strictGates // [])) | length' "$report_card" 2>/dev/null || echo 0)"
|
|
41
41
|
gap_count="$(jq -r '(.gaps // []) | length' "$report_card" 2>/dev/null || echo 0)"
|
|
42
|
+
review_freshness="$(jq -r '.review.freshness.status // "unknown"' "$report_card" 2>/dev/null || echo unknown)"
|
|
43
|
+
failure_ownership_open="$(jq -r '
|
|
44
|
+
(.runtime.failureOwnership? // [])
|
|
45
|
+
| map(select(((.classification? // "") | IN("in-branch", "ambiguous")) and ((.status? // "open") | IN("open", "pending"))))
|
|
46
|
+
| length
|
|
47
|
+
' "$report_card" 2>/dev/null || echo 0)"
|
|
48
|
+
coverage_status="$(jq -r '.qa.coverageAudit.status // "unknown"' "$report_card" 2>/dev/null || echo unknown)"
|
|
49
|
+
browser_status="$(jq -r '.qa.browserEvidence.status // "unknown"' "$report_card" 2>/dev/null || echo unknown)"
|
|
50
|
+
feedback_loop_status="$(jq -r '.qa.feedbackLoop.status // "skipped"' "$report_card" 2>/dev/null || echo skipped)"
|
|
51
|
+
behavior_evidence_status="$(jq -r '.qa.behaviorEvidence.status // "skipped"' "$report_card" 2>/dev/null || echo skipped)"
|
|
42
52
|
|
|
43
53
|
remaining_tasks="0"
|
|
44
54
|
if [[ -f "$tasks_file" ]]; then
|
|
@@ -50,6 +60,12 @@ fi
|
|
|
50
60
|
[[ "$spec_sync_ready" == "true" ]] || { echo "Gate open: spec_sync_ready=$spec_sync_ready" >&2; exit 1; }
|
|
51
61
|
[[ "$evidence_count" -gt 0 ]] || { echo "Gate open: evidence is empty" >&2; exit 1; }
|
|
52
62
|
[[ "$gap_count" -eq 0 ]] || { echo "Gate open: gaps=$gap_count" >&2; exit 1; }
|
|
63
|
+
[[ "$review_freshness" == "fresh" || "$review_freshness" == "not-applicable" ]] || { echo "Gate open: review_freshness=$review_freshness" >&2; exit 1; }
|
|
64
|
+
[[ "$failure_ownership_open" -eq 0 ]] || { echo "Gate open: failure_ownership_open=$failure_ownership_open" >&2; exit 1; }
|
|
65
|
+
[[ "$coverage_status" != "blocked" && "$coverage_status" != "fail" && "$coverage_status" != "pending" ]] || { echo "Gate open: coverage_status=$coverage_status" >&2; exit 1; }
|
|
66
|
+
[[ "$browser_status" != "blocked" && "$browser_status" != "fail" && "$browser_status" != "pending" ]] || { echo "Gate open: browser_status=$browser_status" >&2; exit 1; }
|
|
67
|
+
[[ "$feedback_loop_status" != "blocked" && "$feedback_loop_status" != "fail" && "$feedback_loop_status" != "pending" ]] || { echo "Gate open: feedback_loop_status=$feedback_loop_status" >&2; exit 1; }
|
|
68
|
+
[[ "$behavior_evidence_status" != "blocked" && "$behavior_evidence_status" != "fail" && "$behavior_evidence_status" != "pending" ]] || { echo "Gate open: behavior_evidence_status=$behavior_evidence_status" >&2; exit 1; }
|
|
53
69
|
[[ "$remaining_tasks" -eq 0 ]] || { echo "Gate open: remaining_tasks=$remaining_tasks" >&2; exit 1; }
|
|
54
70
|
|
|
55
71
|
cat <<EOF
|
|
@@ -59,5 +75,11 @@ REROUTE=$reroute
|
|
|
59
75
|
SPEC_SYNC_READY=$spec_sync_ready
|
|
60
76
|
EVIDENCE_COUNT=$evidence_count
|
|
61
77
|
GAP_COUNT=$gap_count
|
|
78
|
+
REVIEW_FRESHNESS=$review_freshness
|
|
79
|
+
FAILURE_OWNERSHIP_OPEN=$failure_ownership_open
|
|
80
|
+
COVERAGE_STATUS=$coverage_status
|
|
81
|
+
BROWSER_STATUS=$browser_status
|
|
82
|
+
FEEDBACK_LOOP_STATUS=$feedback_loop_status
|
|
83
|
+
BEHAVIOR_EVIDENCE_STATUS=$behavior_evidence_status
|
|
62
84
|
REMAINING_TASKS=$remaining_tasks
|
|
63
85
|
EOF
|
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# CC-Check Skill Changelog
|
|
2
2
|
|
|
3
|
+
## v1.10.0 - 2026-04-28
|
|
4
|
+
|
|
5
|
+
- add test fixture honesty review for partial fixtures, generated stubs, casts, and missing mock payload fields
|
|
6
|
+
- require fixture shortcuts to preserve public seam behavior instead of hiding contract or input-shape problems
|
|
7
|
+
|
|
8
|
+
## v1.9.0 - 2026-04-28
|
|
9
|
+
|
|
10
|
+
- add QA feedback-loop evidence so bugfix and behavior checks record reproduction mode, determinism, signal quality, and blocked loop reasons before a pass verdict
|
|
11
|
+
- add behavior evidence fields for expected behavior, actual behavior, reproduction steps, consistency, and domain language
|
|
12
|
+
- tighten test-quality review around public-interface tests, system-boundary mocks, and architecture follow-ups when no correct test seam exists
|
|
13
|
+
- update the report-card template, renderer, and gate validation for the new QA evidence shape while keeping older reports structurally compatible
|
|
14
|
+
|
|
15
|
+
## v1.8.4 - 2026-04-28
|
|
16
|
+
|
|
17
|
+
- add review freshness, quality score, specialist review facets, and finding confidence fingerprints so stale or noisy review evidence cannot masquerade as current proof
|
|
18
|
+
- add QA coverage audit and browser evidence fields for user-flow, route, screenshot, console, and skip-reason proof
|
|
19
|
+
- add runtime failure ownership so failing commands are classified as in-branch, pre-existing, environment, or ambiguous before verdict selection
|
|
20
|
+
- update the report-card template, renderer, and gate validation for the richer review and QA evidence shape
|
|
21
|
+
|
|
22
|
+
## v1.8.3 - 2026-04-28
|
|
23
|
+
|
|
24
|
+
- add native claim evidence matrix guidance so each completion claim maps to command or artifact proof
|
|
25
|
+
- add QA regression and test-quality review fields for red/green proof, mock boundaries, and test-only API smells
|
|
26
|
+
- require review packets and finding triage so review results can be audited without chat memory
|
|
27
|
+
- update report-card template, renderer, and gate validation for optional `claimEvidence` and `qa` fields
|
|
28
|
+
|
|
3
29
|
## v1.8.2 - 2026-04-27
|
|
4
30
|
|
|
5
31
|
- require verification reports to resolve the runtime output policy before writing human-readable verdicts or summaries
|