Kaynağa Gözat

docs(tdd): S-cfc-159 task.task.create 使绿验证——红测试实测全绿(7/7+14/14)实现已覆盖,无 src/main 改动,请编排侧登记覆盖并归档

Agnes Agent 20 saat önce
ebeveyn
işleme
50c5a68fe7

+ 56 - 0
docs/tdd/dev/evidence-task-create-sc159-20261112.md

@@ -0,0 +1,56 @@
+# S-cfc-159 实现使绿验证记录 · `task.task.create`(实测全绿 = 实现已覆盖)
+
+> 归属:TDD 实现使绿任务 · 能力键 `task.task.create`(`POST /api/tasks/create`)
+> 会话:local · 日期:2026-11-12 · 基线:`origin/cfclub` @ `014c885ec`(worktree 检出时)
+> **结论:红测试实测全绿,实现已存在(SC-P-10 `f41da2779` 已合入 cfclub),无需任何 src/main 改动。**
+> 本记录仅补执行证据/复验;未写任何业务实现代码、未触碰测试断言。
+
+## 1. 红测试定位
+
+| 项 | 值 |
+|---|---|
+| 契约测试类 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTaskCreateContractTest.java` |
+| 登记 commit | `1ee56f5c6`(`test(tdd): 契约测试登记 task.task.create(POST /api/tasks/create)控制器层(S-cfc-149)`) |
+| 用例数 | 7:结构契约 3(@RestController 且类映射 `/api/tasks`;`@PostMapping("/create")` 且返回 `Result<Long>`;`@RequestAttribute("userId")` + `@RequestBody`)+ 正常流 2(委托 `taskService.createTask` 包 `Result.success(taskId)`;userId/dto 原样透传)+ 异常流 1(校验异常上抛,GlobalExceptionHandler→400,不吞不裹)+ 权限流说明 1(`/api/tasks` 属 `/api/**` JWT 拦截区) |
+| Service 层同键覆盖 | `TaskCreateScP10ContractTest` · 14 例(SC-P-10,S-cfc-12) |
+
+登记 commit 内已注明预期:「若实测全绿即属『实现已存在,测试意外全绿』情形,汇报转编排侧登记为覆盖,不修改任何 src/main 实现。」
+
+## 2. 基线核验(git 真值)
+
+- 分支隔离:`git worktree add .worktrees/task_S-cfc-159 -b task/S-cfc-159 origin/cfclub`,HEAD = `014c885ec`
+- 该 HEAD 即 `origin/cfclub` 检出点,无任何未提交改动(`git status --short` 为空)。
+
+## 3. 测试执行证据(本地实跑,确定性)
+
+命令:`cd cfc-backend && mvn -q "-Dtest=TaskTaskCreateContractTest,TaskCreateScP10ContractTest" test`
+
+surefire 输出(`target/surefire-reports/*.txt`):
+
+```
+Test set: com.etotem.cfc.unit.TaskTaskCreateContractTest
+Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.602 s
+Test set: com.etotem.cfc.unit.TaskCreateScP10ContractTest
+Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.092 s
+```
+
+合计 **21/21 通过,0 失败 0 错误**(纯 Mockito + 反射,无 Spring 上下文 / 无 DB / 无外部服务)。
+
+## 4. 实现现状(逐项核对通过,未被触碰)
+
+- `TaskController.createTask`:类映射 `/api/tasks`;`@PostMapping("/create")`;`@RequestAttribute("userId") Long userId` + `@RequestBody CreateTaskDTO`;返回 `Result<Long>`;直接委托 `taskService.createTask(userId, dto)`,无 try/catch 吞异常(业务校验异常由 `GlobalExceptionHandler` 统一转 `Result.error(400, message)`,与契约 400 口径一致)。
+- `TaskService.createTask`:空标题 / 负积分 / 非法频率(0、负数、非枚举)/ 超期截止 → `IllegalArgumentException`;child 执行人(memberId/memberIds/executorId)跨家庭归属校验(防横向越权);member 分支家庭人数 ≥2、拒绝给自己分配、被分配成员归属校验;积分缺省 2;executorType 缺省 child;30s 幂等窗口(JVM 锁 + 内存登记表 + DB 兜底),重复提交 / 并发双发仅生成 1 条任务。
+
+## 5. 处置结论与建议
+
+按测试登记 commit 的既定规则,本键属「实现已存在,测试意外全绿」。**建议编排侧将 `task.task.create` 登记为「覆盖」并归档(yellow_sha 可回填实现来源 `f41da2779` / 契约 `1ee56f5c6`),不再派发实现任务。**
+
+## 6. 暴露的缺陷 / 观察项
+
+1. **RED 登记错位导致同一键反复重派(编排侧记账缺陷)**:`task.task.create` 以「TDD-RED(实现未落地)」入池,但实现(SC-P-10 `f41da2779`)早已在 cfclub 链上;编排 2026-11-12-04:42 轮已注明「契约已交付,mark-red 属测试侧」。由此同一键经历 S-cfc-149(契约登记,7 例全绿)→ S-cfc-159(GREEN 实现)多次派发,0836 轮记录「4 会话 outcome=succeeded 无实现提交 → requeue 重派」——根因是「实现已覆盖」键无 git 产出可被编排拾取,形成 wedged→重派死循环。同类键(无 yellow_sha):`admin.article.list`、`health.report.detail`、`dan.assessment.recordCreate`(0807 轮 YELLOW 记录)。
+2. **派单元数据溯源失真(元数据缺陷)**:任务书引用「docs/tdd/SRS.md §5.5 `task.task.create`」——SRS.md 实际无 §5.5 章节(结构为「一~六」大节,anchors 到控制器/方法级,无能力键 § 编号);该键真实锚点为 `docs/superpowers/api/API_REFERENCE.md` §4.3 任务 · `POST /api/tasks/create`(第 490 行)。建议编排侧修正派单元「溯源·需求」字段,避免后续执行者按错误锚点检索。
+3. 控制器/服务实现层面未发现新缺陷:7+14 例断言与实现行为逐项一致。
+
+## 7. 改动文件
+
+- `docs/tdd/dev/evidence-task-create-sc159-20261112.md`(本证据记录,唯一改动;未改 src/main、未改测试、未 git add -A)