Эх сурвалжийг харах

test(R189): 测试侧产物闭环

- docs/tdd/orchestration/report-test-2026-11-13-R189.md: 主报告(4120例/4003过=97.16%)
- docs/tdd/test/automation-run-2026-11-13-R189.md: 12项套件实测明细
- docs/tdd/notice-2026-11-13-R189-研发通知.md: P1契约RED 48+存量25通知
- docs/tdd/test/blockers.md: B-189-1(SSH故障)/B-189-2(窗口13类验)/B-142-2销号
- docs/tdd/test/inventory.md + automation-status.md: 台账重扫(跨源4567)
- .tdd/_r189_*.log: 8项套件原始日志
- _r189_*.cjs: 节点派发器脚本

★ 关键事实:langgraph@251 连续第2轮51/51全绿 → B-142-2销号;
  窗口13契约类48预期RED取证;全站红92零缺陷回归
E2E Test Bot 28 минут өмнө
parent
commit
67fb0a1f5a

+ 10 - 0
.tdd/_r189_admin_live.log

@@ -0,0 +1,10 @@
+
+Running 5 tests using 1 worker
+
+[1/5] [admin-desktop] › e2e-live\admin-live.spec.js:117:3 › 管理端 UI · 登录与主框架 › TC-A-U01 登录页可渲染(标题/账号/密码/登录按钮)
+[2/5] [admin-desktop] › e2e-live\admin-live.spec.js:129:3 › 管理端 UI · 登录与主框架 › TC-A-U02 滑块人机验证存在且可拖动通过
+[3/5] [admin-desktop] › e2e-live\admin-live.spec.js:145:3 › 管理端 UI · 登录与主框架 › TC-A-U03 未登录访问后台受保护路由被拦截到登录页
+[4/5] [admin-desktop] › e2e-live\admin-live.spec.js:156:3 › 管理端 UI · 登录与主框架 › TC-A-U04 管理员真实登录(滑块 + 凭据)进入后台主框架
+[5/5] [admin-desktop] › e2e-live\admin-live.spec.js:184:3 › 管理端 UI · 登录与主框架 › TC-A-U05 后台核心菜单可访问(用户管理/数据看板)
+  5 passed (1.4m)
+EXIT=0

+ 44 - 0
.tdd/_r189_api.log

@@ -0,0 +1,44 @@
+
+Running 32 tests using 1 worker
+
+[1/32] [desktop] › e2e\api\api-smoke.spec.js:18:3 › API级冒烟(远程后端) › 自注册链路可用(拿到有效 token)
+[2/32] [desktop] › e2e\api\api-smoke.spec.js:24:3 › API级冒烟(远程后端) › 家庭成员列表接口可调用 (code=200)
+[3/32] [desktop] › e2e\api\api-smoke.spec.js:30:3 › API级冒烟(远程后端) › 能量概览接口可调用 (code=200)
+[4/32] [desktop] › e2e\api\api-smoke.spec.js:36:3 › API级冒烟(远程后端) › 成员列表参数校验生效(越权家庭 → 403)
+[5/32] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:56:1 › [TC-G-N03] 非微信H5兜底登录:手机号注册登录路径 UA 无关
+[6/32] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:63:1 › [TC-G-N02/P-N06/C-N03/T-N04/S-N03/X-N07] 多端 UA 兼容:同请求不同客户端返回一致
+[7/32] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:79:1 › [TC-A-N04/X-N02] 限流熔断稳定性:爆发请求下系统不死(不出现 5xx 雪崩)
+[desktop] › e2e\api\nonfunc-perf-compat.spec.js:79:1 › [TC-A-N04/X-N02] 限流熔断稳定性:爆发请求下系统不死(不出现 5xx 雪崩)
+[限流] 状态分布=[200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200] 其中429=0
+
+[8/32] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:92:1 › [TC-P-N02/X-N01] 并发不串数据:并行 AI 请求各自独立响应
+[9/32] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:117:1 › [响应时间基线] 已登录家庭列表单请求耗时冒烟 ≤ 8s
+[desktop] › e2e\api\nonfunc-perf-compat.spec.js:117:1 › [响应时间基线] 已登录家庭列表单请求耗时冒烟 ≤ 8s
+[耗时] 家庭列表 92ms
+
+[10/32] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:128:6 › [TC-C-N01/X-N04] 任务打卡幂等:重复提交不重复计分(需任务流夹具)
+[11/32] [desktop] › e2e\api\nonfunc-perf-compat.spec.js:133:6 › [TC-X-N03] 活动名额并发不超卖:100 名额 / 瞬时 500 请求(需活动夹具 + 压测授权)
+[12/32] [desktop] › e2e\api\nonfunc-security.spec.js:50:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权访问能量概览被拒(401/403)
+[13/32] [desktop] › e2e\api\nonfunc-security.spec.js:55:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权访问家庭成员列表被拒(401/403)
+[14/32] [desktop] › e2e\api\nonfunc-security.spec.js:60:3 › 非功能/安全接口冒烟 › [TC-G-N04] 未授权调用 AI 健康教练被拒(401/403)
+[15/32] [desktop] › e2e\api\nonfunc-security.spec.js:66:3 › 非功能/安全接口冒烟 › [TC-P-N09] IDOR:越权访问他人家庭成员列表 → 403
+[16/32] [desktop] › e2e\api\nonfunc-security.spec.js:78:3 › 非功能/安全接口冒烟 › [TC-A-N05] 非管理员访问后台接口被拒(401/403)
+[17/32] [desktop] › e2e\api\nonfunc-security.spec.js:84:3 › 非功能/安全接口冒烟 › [TC-C-N07] 角色切换接口未授权被拒(401/403)
+[18/32] [desktop] › e2e\api\nonfunc-security.spec.js:89:3 › 非功能/安全接口冒烟 › [TC-C-N07] 权限提升防护:家长不可切换为未持有角色
+[19/32] [desktop] › e2e\api\nonfunc-security.spec.js:96:3 › 非功能/安全接口冒烟 › [TC-C-N07] 角色切换自身合法角色正常(基线)
+[20/32] [desktop] › e2e\api\nonfunc-security.spec.js:104:3 › 非功能/安全接口冒烟 › [TC-P-N10] AI 健康教练 XSS:query 注入脚本不回显原始脚本且不错 500
+[21/32] [desktop] › e2e\api\nonfunc-security.spec.js:112:3 › 非功能/安全接口冒烟 › [TC-A-N06] 活动反馈存储型 XSS:提交含脚本 comment,列表不回显原始脚本
+[22/32] [desktop] › e2e\api\nonfunc-security.spec.js:133:3 › 非功能/安全接口冒烟 › [TC-P-N11] 报告上传非 PDF/恶意内容被拒(非 200)
+[23/32] [desktop] › e2e\api\traceability-p94-p95-c26.spec.js:38:3 › SC-P-94 历史完成任务三类流 › TC-P-94 正常流:分页结构完整且仅返回已完成记录
+[24/32] [desktop] › e2e\api\traceability-p94-p95-c26.spec.js:50:3 › SC-P-94 历史完成任务三类流 › TC-P-94-E 异常流:非法分页/非法 category 不 5xx 且结构稳定
+[25/32] [desktop] › e2e\api\traceability-p94-p95-c26.spec.js:66:3 › SC-P-94 历史完成任务三类流 › TC-P-94-P 权限流:传非本家庭 memberId 不返回他人任务数据
+[26/32] [desktop] › e2e\api\traceability-p94-p95-c26.spec.js:82:3 › SC-P-95 成长历史记录三类流 › TC-P-95 正常流:打卡记录流返回可遍历数组
+[27/32] [desktop] › e2e\api\traceability-p94-p95-c26.spec.js:88:3 › SC-P-95 成长历史记录三类流 › TC-P-95-E 异常流:非法筛选与非法分页不 5xx
+[28/32] [desktop] › e2e\api\traceability-p94-p95-c26.spec.js:101:3 › SC-P-95 成长历史记录三类流 › TC-P-95-P 权限流:非本家庭 memberId 不返回他人打卡记录
+[29/32] [desktop] › e2e\api\traceability-p94-p95-c26.spec.js:114:8 › 契约缺口待修复(2026-11-10 实测) › TC-P-95:/api/growth/record/list 带/不带 memberId 均返回 code=500「服务器内部错误」,成长档案记录聚合口径未落地
+[30/32] [desktop] › e2e\api\traceability-p94-p95-c26.spec.js:116:8 › 契约缺口待修复(2026-11-10 实测) › TC-C-26:睡眠选项配置读取契约未落地 —— /api/health/sleep/tags 返回 404;/api/config/public/value 带 key=sleep.quality.tags 返回 code=500
+[31/32] [desktop] › e2e\api\traceability-p94-p95-c26.spec.js:118:8 › 契约缺口待修复(2026-11-10 实测) › TC-A-27-S:后台维护契约未落地 —— /api/admin/sleep/tags 返回 404;需确认是否改由 /api/admin/config/* 通用配置承载
+[32/32] [desktop] › e2e\api\traceability-p94-p95-c26.spec.js:120:8 › 契约缺口待修复(2026-11-10 实测) › SC-P-96 / 前端页面类断言:远程环境未托管前端 SPA,纯 UI 与页面跳转断言需本地/真机环境执行
+  7 skipped
+  25 passed (28.0s)
+API_EXIT=0

+ 13 - 0
.tdd/_r189_fe_jest.log

@@ -0,0 +1,13 @@
+          |                         ^
+      288 |     // 全为无效记录 → 空分组
+      289 |     expect(invokeGrouping(component, [{ checkinDate: 'bad' }, { foo: 1 }]).length).toBe(0)
+      290 |   })
+
+      at Object.<anonymous> (__tests__/pages/growth-main/growthHistory.dayGroupView.test.js:287:25)
+
+
+Test Suites: 2 failed, 40 passed, 42 total
+Tests:       3 failed, 12 skipped, 609 passed, 624 total
+Snapshots:   0 total
+Time:        172.323 s
+FE_EXIT=0

+ 11 - 0
.tdd/_r189_frontend_live.log

@@ -0,0 +1,11 @@
+
+Running 6 tests using 1 worker
+
+[1/6] [frontend-mobile] › e2e-live\frontend-live.spec.js:47:3 › 小程序 H5 UI · 游客浏览与导航 › TC-F-U01 首页可渲染(标题/落地路由/TabBar 四项)
+[2/6] [frontend-mobile] › e2e-live\frontend-live.spec.js:72:3 › 小程序 H5 UI · 游客浏览与导航 › TC-F-U02 首页核心内容渲染(五维沙盘 / 三步引导)
+[3/6] [frontend-mobile] › e2e-live\frontend-live.spec.js:86:3 › 小程序 H5 UI · 游客浏览与导航 › TC-F-U03 TabBar 切换到「健康」正常跳转且无异常
+[4/6] [frontend-mobile] › e2e-live\frontend-live.spec.js:104:3 › 小程序 H5 UI · 游客浏览与导航 › TC-F-U04 TabBar 切换到「成长」正常跳转
+[5/6] [frontend-mobile] › e2e-live\frontend-live.spec.js:117:3 › 小程序 H5 UI · 游客浏览与导航 › TC-F-U05 未登录访问「我的」应出现登录/注册入口(鉴权引导)
+[6/6] [frontend-mobile] › e2e-live\frontend-live.spec.js:126:3 › 小程序 H5 UI · 游客浏览与导航 › TC-F-U06 首屏关键资源加载无失败(无 requestfailed)
+  6 passed (46.2s)
+EXIT=0

+ 57 - 0
.tdd/_r189_health.log

@@ -0,0 +1,57 @@
+
+Running 13 tests using 1 worker
+
+[1/13] [health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U01 POST /api/huawei-health/auth-url 未鉴权应被拒绝(401/403)
+[health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U01 POST /api/huawei-health/auth-url 未鉴权应被拒绝(401/403)
+[TC-H-U01] POST /api/huawei-health/auth-url -> HTTP 401
+
+[2/13] [health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U02 POST /api/huawei-health/callback 未鉴权应被拒绝(401/403)
+[health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U02 POST /api/huawei-health/callback 未鉴权应被拒绝(401/403)
+[TC-H-U02] POST /api/huawei-health/callback -> HTTP 401
+
+[3/13] [health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U03 POST /api/huawei-health/sync 未鉴权应被拒绝(401/403)
+[health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U03 POST /api/huawei-health/sync 未鉴权应被拒绝(401/403)
+[TC-H-U03] POST /api/huawei-health/sync -> HTTP 401
+
+[4/13] [health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U04 POST /api/huawei-health/revoke 未鉴权应被拒绝(401/403)
+[health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U04 POST /api/huawei-health/revoke 未鉴权应被拒绝(401/403)
+[TC-H-U04] POST /api/huawei-health/revoke -> HTTP 401
+
+[5/13] [health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U05 POST /api/huawei-health/status 未鉴权应被拒绝(401/403)
+[health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U05 POST /api/huawei-health/status 未鉴权应被拒绝(401/403)
+[TC-H-U05] POST /api/huawei-health/status -> HTTP 401
+
+[6/13] [health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U06 POST /api/xiaomi-health/auth-url 未鉴权应被拒绝(401/403)
+[health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U06 POST /api/xiaomi-health/auth-url 未鉴权应被拒绝(401/403)
+[TC-H-U06] POST /api/xiaomi-health/auth-url -> HTTP 401
+
+[7/13] [health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U07 POST /api/xiaomi-health/callback 未鉴权应被拒绝(401/403)
+[health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U07 POST /api/xiaomi-health/callback 未鉴权应被拒绝(401/403)
+[TC-H-U07] POST /api/xiaomi-health/callback -> HTTP 401
+
+[8/13] [health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U08 POST /api/xiaomi-health/sync 未鉴权应被拒绝(401/403)
+[health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U08 POST /api/xiaomi-health/sync 未鉴权应被拒绝(401/403)
+[TC-H-U08] POST /api/xiaomi-health/sync -> HTTP 401
+
+[9/13] [health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U09 POST /api/xiaomi-health/revoke 未鉴权应被拒绝(401/403)
+[health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U09 POST /api/xiaomi-health/revoke 未鉴权应被拒绝(401/403)
+[TC-H-U09] POST /api/xiaomi-health/revoke -> HTTP 401
+
+[10/13] [health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U10 POST /api/xiaomi-health/status 未鉴权应被拒绝(401/403)
+[health-api] › e2e-live\health-contract.spec.js:41:5 › 华为/小米运动健康接入 · 鉴权契约(§4.43/§4.44) › TC-H-U10 POST /api/xiaomi-health/status 未鉴权应被拒绝(401/403)
+[TC-H-U10] POST /api/xiaomi-health/status -> HTTP 401
+
+[11/13] [health-api] › e2e-live\health-contract.spec.js:74:5 › 健康方案 · 鉴权契约(§4.49.1/§4.49.2) › TC-HP-U01 POST /api/health/plan/adjust 未鉴权应被拒绝(401/403) · HL-04/R4 健康方案对话式调整
+[health-api] › e2e-live\health-contract.spec.js:74:5 › 健康方案 · 鉴权契约(§4.49.1/§4.49.2) › TC-HP-U01 POST /api/health/plan/adjust 未鉴权应被拒绝(401/403) · HL-04/R4 健康方案对话式调整
+[TC-HP-U01] POST /api/health/plan/adjust -> HTTP 401
+
+[12/13] [health-api] › e2e-live\health-contract.spec.js:74:5 › 健康方案 · 鉴权契约(§4.49.1/§4.49.2) › TC-HP-U02 POST /api/health/plan/attribution 未鉴权应被拒绝(401/403) · HL-03/R2 健康方案归因
+[health-api] › e2e-live\health-contract.spec.js:74:5 › 健康方案 · 鉴权契约(§4.49.1/§4.49.2) › TC-HP-U02 POST /api/health/plan/attribution 未鉴权应被拒绝(401/403) · HL-03/R2 健康方案归因
+[TC-HP-U02] POST /api/health/plan/attribution -> HTTP 401
+
+[13/13] [health-api] › e2e-live\health-contract.spec.js:74:5 › 健康方案 · 鉴权契约(§4.49.1/§4.49.2) › TC-HP-U03 POST /api/health/plan/generate 未鉴权应被拒绝(401/403) · HL-03/R3 生成不确定点补充(followUpAnswers)
+[health-api] › e2e-live\health-contract.spec.js:74:5 › 健康方案 · 鉴权契约(§4.49.1/§4.49.2) › TC-HP-U03 POST /api/health/plan/generate 未鉴权应被拒绝(401/403) · HL-03/R3 生成不确定点补充(followUpAnswers)
+[TC-HP-U03] POST /api/health/plan/generate -> HTTP 401
+
+  13 passed (4.2s)
+HEALTH_EXIT=0

+ 11 - 0
.tdd/_r189_root_jest.log

@@ -0,0 +1,11 @@
+
+    Cause:
+    AggregateError:
+
+
+
+Test Suites: 2 failed, 2 total
+Tests:       16 failed, 7 passed, 23 total
+Snapshots:   0 total
+Time:        9.795 s, estimated 11 s
+ROOT_EXIT=0

+ 9 - 0
.tdd/_r189_shop_api.log

@@ -0,0 +1,9 @@
+
+Running 4 tests using 1 worker
+
+[1/4] [shop-api] › e2e-live\shop-sort-api.spec.js:37:3 › 商城价格排序 · 后端排序契约(需求变更 S1) › TC-S-U01 price asc 生效(对应 buildSort → price_asc)
+[2/4] [shop-api] › e2e-live\shop-sort-api.spec.js:45:3 › 商城价格排序 · 后端排序契约(需求变更 S1) › TC-S-U02 price desc 生效(对应 buildSort → price_desc)
+[3/4] [shop-api] › e2e-live\shop-sort-api.spec.js:53:3 › 商城价格排序 · 后端排序契约(需求变更 S1) › TC-S-U03 默认排序不变(对应 buildSort → default,不传 sort)
+[4/4] [shop-api] › e2e-live\shop-sort-api.spec.js:61:3 › 商城价格排序 · 后端排序契约(需求变更 S1) › TC-S-U04 非法排序列被白名单拦截(不 5xx、不注入)
+  4 passed (6.9s)
+SHOP_EXIT=0

+ 11 - 0
.tdd/_r189_web_jest.log

@@ -0,0 +1,11 @@
+PASS src/views/admin/review/__tests__/auditRowMapping.spec.js
+PASS src/__tests__/Families.actionMenu.spec.js
+PASS src/__tests__/views/FamiliesReportEntry.spec.js
+PASS src/__tests__/views/FamiliesPlanEntry.spec.js
+PASS src/__tests__/utils/indicatorSeeds.test.js
+
+Test Suites: 17 passed, 17 total
+Tests:       116 passed, 116 total
+Snapshots:   0 total
+Time:        208.842 s
+WEB_EXIT=0

+ 62 - 0
_r189_189_admin.cjs

@@ -0,0 +1,62 @@
+// R162: 189 admin-live UI E2E kick/read(String.raw 保反斜杠路径,修复 Location not found)
+const BASE = process.env.BASE_189 || 'http://192.168.16.189:4090';
+const AUTH = 'Basic ' + Buffer.from('opencode:' + (process.env.OPENCODE_SERVER_PASSWORD || 'IwinTrue@123')).toString('base64');
+const H = { Authorization: AUTH, 'Content-Type': 'application/json' };
+const CWD = String.raw`C:\code\cfc`;
+const LOC = '?location%5Bdirectory%5D=' + encodeURIComponent(CWD);
+const LOG = String.raw`C:\code\cfc\_r189_admin-live_test.log`;
+const SLEEP = ms => new Promise(r => setTimeout(r, ms));
+
+function buildKickCmd() {
+  return [
+    'cd ' + CWD,
+    'if (Test-Path ' + LOG + ') { Remove-Item ' + LOG + ' -Force }',
+    `Start-Process -FilePath cmd.exe -ArgumentList '/c','cd /d ${CWD}\\tests && set PLAYWRIGHT_HTML_REPORT=false && npx playwright test -c playwright.config.live.js --project=admin-desktop --reporter=line > ${LOG} 2>&1' -WindowStyle Hidden -PassThru | Select-Object Id`,
+    'start-sleep -Seconds 3',
+    'echo KICKED'
+  ].join('; ');
+}
+function buildReadCmd() {
+  return [
+    'echo READ_BEGIN',
+    'if (Test-Path ' + LOG + ') { Get-Content ' + LOG + ' -Tail 200 }',
+    'if (Test-Path ' + LOG + '.err) { echo ERR_BEGIN; Get-Content ' + LOG + '.err -Tail 30 }',
+    'echo READ_END'
+  ].join('; ');
+}
+async function j(url, opt) {
+  try {
+    const r = await fetch(url, Object.assign({ headers: H }, opt));
+    const t = await r.text();
+    try { return { status: r.status, json: JSON.parse(t) }; } catch { return { status: r.status, text: t }; }
+  } catch (e) { return { status: 0, err: e.message }; }
+}
+async function openShell(cmd, capMs = 30000) {
+  const cr = await j(BASE + '/api/shell' + LOC, { method: 'POST', body: JSON.stringify({ command: cmd, cwd: CWD }) });
+  const cj = (cr.json) || {};
+  const id = (cj.data && cj.data.id) || cj.id;
+  if (!id) return { err: 'create failed ' + cr.status + ' ' + JSON.stringify(cj).slice(0, 200), id: null };
+  const t0 = Date.now();
+  while (Date.now() - t0 < capMs) {
+    await SLEEP(2000);
+    const s = await j(BASE + '/api/shell/' + id + LOC);
+    const d = (s.json && s.json.data) || null;
+    if (d && d.status && d.status !== 'running') return { id, status: d.status };
+    if (!d) continue;
+  }
+  return { id, status: 'timeout' };
+}
+(async () => {
+  const mode = process.argv[2] || 'kick';
+  if (mode === 'kick') {
+    const k = await openShell(buildKickCmd(), 30000);
+    console.log('KICK', k.err || ('id=' + k.id + ' status=' + k.status));
+    return;
+  }
+  const r = await openShell(buildReadCmd(), 30000);
+  if (r.err) { console.log('READ_ERR', r.err); process.exit(1); }
+  const o = await j(BASE + '/api/shell/' + r.id + '/output' + LOC + '&limit=200000');
+  console.log('OUT_BEGIN');
+  console.log((o.json && o.json.data && o.json.data.output) || '(empty)');
+  console.log('OUT_END');
+})().catch(e => { console.error('ERR', e.message); process.exit(1); });

+ 62 - 0
_r189_251_lg.cjs

@@ -0,0 +1,62 @@
+// R150 251 langgraph 派发器:kick(分离启动)+ read(单次读日志),不在等待期新建 shell(B-125)
+const BASE = process.env.BASE || 'http://192.168.16.251:4096';
+const DIR = process.env.DIR || '/sc-data/cfc/cfc-langgraph';
+const LOG = process.env.LOG || '/tmp/r189_pytest.log';
+const AUTH = 'Basic ' + Buffer.from('opencode:' + (process.env.OPENCODE_SERVER_PASSWORD || 'IwinTrue@123')).toString('base64');
+const H = { Authorization: AUTH, 'Content-Type': 'application/json' };
+const LOC = '?location%5Bdirectory%5D=' + encodeURIComponent(DIR);
+
+async function j(url, opt) {
+  try {
+    const r = await fetch(url, Object.assign({ headers: H }, opt || {}));
+    const t = await r.text();
+    try { return { status: r.status, json: JSON.parse(t) }; } catch { return { status: r.status, text: t }; }
+  } catch (e) { return { status: 0, err: e.message }; }
+}
+
+async function sh(cmd, capMs) {
+  const cr = await j(BASE + '/api/shell' + LOC, { method: 'POST', body: JSON.stringify({ command: cmd, cwd: DIR }) });
+  const id = cr.json && cr.json.data && cr.json.data.id;
+  if (!id) return { err: 'create ' + cr.status + ' ' + JSON.stringify(cr).slice(0, 200) };
+  const t0 = Date.now();
+  while (Date.now() - t0 < (capMs || 60000)) {
+    await new Promise(r => setTimeout(r, 2500));
+    const s = await j(BASE + '/api/shell/' + id + LOC);
+    const d = (s.json && s.json.data) || null;
+    if (!d) continue;
+    if (d.status && d.status !== 'running') {
+      const o = await j(BASE + '/api/shell/' + id + '/output' + LOC + '&limit=200000');
+      return { code: d.status, out: (o.json && o.json.data && o.json.data.output) || '' };
+    }
+  }
+  return { err: 'timeout' };
+}
+
+(async () => {
+  const mode = process.argv[2] || 'kick';
+  // R173 增:LOG 若从本机 env 注入,Git Bash(MSYS) 会把 /tmp/x 改写成 C:/Users/.../x,
+  // 远端 `tail` 恒报 No such file,且 kick 的重定向也会失败 → 看起来像「日志没生成」。
+  // 这里直接挡住 Windows 风格路径,强制调用方使用远端 POSIX 路径。
+  if (LOG.includes(':') || LOG.includes('\\')) {
+    console.error('BAD_LOG_PATH=' + LOG + ' 请使用远端 POSIX 路径(如 /tmp/rX_pytest.log),不要经由本地 env 注入');
+    process.exit(2);
+  }
+  if (mode === 'kick') {
+    // R156 修:251 系统 /usr/bin/python 无 pytest,必须用节点 venv(.venv/bin/python → python3.11);
+    // 退出码另存变量后再写盘(B-126:$? 直接内联在 kick 串里可能落盘失败)。
+    // R173 复现(B-126 第 6 轮):手工 kick 用 `echo EXIT=$?` 时 186 行日志零 EXIT 行;
+    // 已在 /tmp/r173_probe.log 验证「先存 rc 再落盘」可写入 → 保留 rc 写法为唯一正确姿势。
+    const inner = "cd " + DIR + " && .venv/bin/python -m pytest -q --ignore=tests/qna --ignore=tests/test_chat.py > " + LOG + " 2>&1; rc=$?; echo EXIT=$rc >> " + LOG;
+    const cmd = "rm -f " + LOG + "; setsid nohup bash -c '" + inner + "' >/dev/null 2>&1 & echo KICKED";
+    const r = await sh(cmd, 40000);
+    console.log('KICK=' + JSON.stringify(r).slice(0, 400));
+    const h = await sh('cd ' + DIR + ' && git rev-parse --short HEAD; date', 30000);
+    console.log('NODE_HEAD=' + ((h.out || h.err || '').trim()));
+  } else if (mode === 'read') {
+    const r = await sh('tail -c 4000 ' + LOG, 45000);
+    console.log(r.err ? 'READ_ERR=' + r.err : r.out);
+  } else if (mode === 'run') {
+    const r = await sh(process.argv[3], 120000);
+    console.log(r.err ? 'ERR=' + r.err : r.out);
+  }
+})();

+ 67 - 0
docs/tdd/notice-2026-11-13-R189-研发通知.md

@@ -0,0 +1,67 @@
+# R189 轮研发通知(2026-11-13)
+
+## 状态摘要
+
+| 项目 | 内容 |
+|------|------|
+| 汇报轮次 | **R189**(2026-11-13 10:45~11:30) |
+| 基线 → 收尾 | `00121ff2f`(R188)→ `6124352d7`(本地 = 远端 HEAD) |
+| 全站覆盖率 | 4120 例 / 4003 过 / 92 红 / 25 跳 = **97.16%** |
+| 零回归确认 | ✅ 浏览器六件套全绿;API 0 红;fe/web 零漂移;后端存量 25 红零漂移 |
+| **本轮正向项** | langgraph **连续 2 轮 51/51** → B-142-2 **销号** |
+| 主要阻塞 | ① git SSH 22 CLOSED → 推送受阻(B-189-1);② 48 前瞻契约 RED 待实现(P1) |
+
+---
+
+## 一、优先级事项(⏰ 按序处理)
+
+### P1 · 窗口 13 契约测试类 48 RED 实现(本轮新增、最紧急)
+
+| SC-key | 提交 sha | 类名 | 例数 | 当前结果 | 预期 | 描述 |
+|--------|----------|------|------|----------|------|------|
+| S-cfc-183 | 5f2a09b02 | PlanContentSafetyReviewContractTest | 9 | 5P/4F | RED 4/5 | AI 方案内容安全复核缺失 |
+| **S-cfc-184** | 64f8a3875 | TeacherAssessmentRecordContractTest | 4 | 1P/3F | RED 3/1 | 必填拦截/重复覆盖未落地 |
+| S-cfc-188 | 883a6eeab | FamilyAutoCreateForPurchaseContractTest | 5 | 1P/4F | RED 4/5 | 自动建家庭接口缺失 |
+| S-cfc-189 | bbc441e08 | TeacherLoginSwitchContractTest | 16 | **16P/0F** | **GREEN** ✅ | 已实现,可直接收尾 |
+| S-cfc-191 | 23e2ddd66 | TeacherMessagePushContractTest | 20 | **20P/0F** | **GREEN** ✅ | 已实现,可直接收尾 |
+| S-cfc-196 | fb1702975 | TeacherPlanCreateContractTest | 13 | 9P/4F | RED 4/9 | 权限门禁未落地 |
+| —(窗口) | — | TeacherMindRecordContractTest | 13 | 1P/12F | RED 高 | mind 记录边界 |
+| —(窗口) | — | TeacherAppointmentGuardContractTest | 14 | 4P/10F | RED | 预约守卫 |
+| —(窗口) | — | GuideFamilyTaskReviewContractTest | 5 | 3P/2F | RED | 家庭任务审核 |
+| —(窗口) | — | NutritionPlanTeacherContractTest | 4 | 1P/3F | RED | 营养师计划 |
+| —(窗口) | — | TeacherDataIsolationScT13ContractTest | 9 | 5P/4F | RED | 数据隔离 |
+| —(窗口) | — | TeacherDimensionScoreContractTest | 6 | 4P/2F | RED | 维度评分 |
+| —(窗口) | — | TeacherPlanActivateContractTest | 15 | **15P/0F** | **GREEN** ✅ | 已实现,可直接收尾 |
+
+> **行动**:P1 类中 **GREEN 3 个直接收 YELLOW/GREEN**;其余 10 个由对应研发认领 SC-T key 实现使绿。
+
+### P2 · git SSH 22 故障(B-189-1,运维/平台侧)
+
+- 现象:`git.iwintrue.com` / 251 **SSH 22 CLOSED**(R188 09:39 尚可 push),导致本轮测试产物与台账的 push 受阻。
+- 替代路径:HTTP 可读确认 `http://git.iwintrue.com/liaoxg/cfc.git` HEAD=`6124352d7` 与本地一致,fetch/push 须等 SSH 恢复。
+- 行动:**请运维检查 Gogs SSH 服务**(端口 22 / 或 251 上的 sshd)。
+
+### P3 · 存量 25 红后端(跨 24 轮承袭)
+
+- 类清单:`EnergySystemFlowTest` 6F / `DimensionRegistryMapContractTest` 3F / `OrchestrationEngineTest`·`OrchestrationIntegrationTest`·`MembershipPaySwitchTest`·`PaymentServiceORDRoutingTest`·`UserServiceWechatLoginTest`(×2)·`TeamProfitCronContractTest` 各 1F 等。
+- 行动:按计划逐类修复;优先 `TeamProfitCronContractTest`(平台费截断影响计费)。
+
+---
+
+## 二、本轮已闭环 / 观察推进
+
+- ✅ **B-142-2(langgraph 上游凭据/配额)**:连续 2 轮 51/51 全绿 → **销号**。
+- ⏳ B-186-1(live chat 120s 挂死):pytest 绿但 live 链路仍挂,独立观察。
+- ⏳ B-36 根级黑盒 16 红(9082 未起):承袭。
+- ⏳ B-DX-1 dx 桥接 2 例 skip(404):承袭。
+
+---
+
+## 三、证据链
+
+- 报告:`docs/tdd/orchestration/report-test-2026-11-13-R189.md`
+- 执行日志:`docs/tdd/test/automation-run-2026-11-13-R189.md`
+- blockers:`docs/tdd/test/blockers.md`(含 B-189-1/B-189-2 段)
+- 台账:`docs/tdd/test/{discovery,inventory,automation-status}.md`(已刷新)
+
+> 📤 推送状态:⚠️ 本轮 SSH 22 故障,推送受阻(见 §一 P2)。

+ 267 - 0
docs/tdd/orchestration/report-test-2026-11-13-R189.md

@@ -0,0 +1,267 @@
+# 测试负责人工作汇报(R189 轮)
+
+> 本汇报按《测试负责人工作汇报模板》填写。R189 为**实测轮 + 窗口契约验证轮**:基线 `cfclub @ 00121ff2f`(R188 收口 09:39),当前 HEAD `6124352d7`(11:11,含并行研发/测试会话在窗口内推入的契约测试与台账回填)。
+> **拓扑(用户指令)**:浏览器经 `http://cfc.iwintrue.com/admin`(后台)+ `http://cfc.iwintrue.com/frontend`(小程序);189 与本机为浏览器节点(**每节点仅 1 个浏览器任务**,本机串行);langgraph 部署 251 → **本轮已实派 251 并实跑**。
+> **★ 本轮关键事实**
+> ① **窗口(00121ff2f..6124352d7)源码/SRS/场景/接口文档零变更**(diff 命中 0)→ G12 ✅,用例无需更新;
+> ② 窗口**新增 13 个契约测试类(S-cfc-183/184/188/189/191/196 等域,133 例)全部定向实测**:**85 过 / 48 红 / 0 错**——48 红**全部为预期 RED(TDD 契约先行、研发未实现)**,无意外失败、无回归;其中 LoginSwitch 16/16、MessagePush 20/20、PlanActivate 15/15 三个 GREEN 类全绿;
+> ③ **langgraph@251 51/51 全绿(连续第 2 轮)**——B-142-2(上游 401/429 环境红)观察 2/2,满足销号判据;
+> ④ 浏览器六件套全绿(admin 5/5×2 节点、frontend 6/6、shop 4/4、health 13/13),线上 API 32 例 0 红,fe/web Jest 零漂移。
+> ★ **全站可比:4120 例 / 4003 过 = 97.16%(剔 skip 97.75%),红 92(后端 73 = 存量 25 + 契约预期 RED 48;fe 3 预期 RED;根级 16 环境)——红数上升全部源于窗口新增契约 RED,无缺陷回归。**
+
+---
+
+## 基本信息
+
+| 项目 | 内容 |
+|------|------|
+| 汇报人 | 测试负责人(自动化测试闭环任务 / 软件测试专家团·陆谨) |
+| 汇报周期 | 2026年11月13日 09:56 ~ 11:30(第 189 轮) |
+| 基线 | `cfclub @ 00121ff2f`(R188 收口);本轮收尾 HEAD `6124352d7`(并行会话并发推进,本地=远端) |
+| 窗口内需求变更 | **零** — `docs/superpowers/specs` / `tests/test-cases` / `API_REFERENCE.md` / 用户场景 窗口零变更(G12 ✅,未触发用例编写闸门) |
+| 窗口内源码变更 | **零** — `git diff --name-only 00121ff2f..6124352d7` 对 `src`、需求、用例、接口文档命中 0;34 个变更文件全部为 `docs/*` 与 `cfc-backend/src/test/**`(13 个新增契约测试类) |
+| 负责模块/单元 | 全站:管理端 admin@本机 + 189 · 小程序 H5 fe@本机 · cfc-langgraph@251(**本轮实派**) · cfc-backend JUnit(全量采信 R188 + 窗口契约类实测) · cfc-web/cfc-frontend Jest · 线上 API 非功能层 |
+
+---
+
+## 一、本轮工作数据汇总
+
+### 1.1 测试用例建设
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **本轮新增测试用例数\*** | **0 个**(新增**133 例契约测试语法入库**) | SRS/场景/接口文档窗口零变更,未触发用例编写闸门(G12 ✅);窗口内并行会话新增 13 个契约测试类(S-cfc-183/184/188/189/191/196 等)已入库并于本轮逐类实测 |
+| **本轮验证执行测试数\*** | **4120 个** | 后端 **3244**(R188 全量采信 3111 + 窗口 13 契约类实测 133)+ 前端 Jest 624 + 管理端 116 + langgraph 51(**251 实派**)+ 浏览器 30(admin 5×2 + frontend 6 + shop 4 + health 13 + dx 2 跳)+ 线上 API 32 + 根级 23 |
+| **用例通过率** | **97.16%**(4003/4120;剔除 skip **97.75%**) | 红 92 / 跳 25;环比 R188(98.27%)−1.11pct,**红数上升 48 全部为窗口新增契约预期 RED(TDD 先行态),零缺陷回归** |
+| **用例台账** | `discovery.md` / `inventory.md` 已重扫重写 | inventory 跨源 **4567**(md 719 / PW 571 / py 48 / Java @Test **3229** / 场景 11);Java 测试文件 388(较 R188 375 **+13**,即窗口契约类) |
+
+### 1.2 会话与任务分发
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **分派任务数\*** | **6 个** | R189-1 本机 `admin-desktop`(5/5,1.4m);R189-2 本机 `frontend-mobile`(6/6,46.2s);R189-3 本机 `shop-api`(4/4,6.9s)+ `health`(13/13,4.2s);R189-4 **189** `admin-desktop`(5/5 EXIT=0,1.3m);R189-5 **251** `langgraph pytest`(**51/51**,495.56s);R189-6 后端窗口契约类定向(133 例,2m05s) |
+| **恢复智能体会话数\*** | 0 个 | 各节点实探 200/ok(189:4090、251:4096、251:9000、本机 4091 全可达);未遇中断会话 |
+| **当前在用会话数** | 0 个 | 全部结束;251 残留 pytest 进程已清理(B-177-1 观察 3/2→4/2) |
+
+### 1.2b 各会话当前工作状态列表
+
+| 会话标签 | 会话 ID/地址 | 当前状态 | 当前任务 | 静默/空闲时长 | 工作目录 | 备注 |
+|----------|--------------|----------|----------|---------------|----------|------|
+| `local-admin` | 本机 Playwright | done | admin-desktop UI E2E | 1.4m | `d:\cfc\tests` | **5/5**;TC-A-U01~U05 全过 |
+| `local-frontend` | 本机 Playwright | done | frontend-mobile UI E2E | 46.2s | `d:\cfc\tests` | **6/6**;B-185 维持消除 |
+| `local-shop` | 本机 Playwright | done | shop-sort API E2E | 6.9s | `d:\cfc\tests` | **4/4** |
+| `local-health` | 本机 Playwright | done | health 鉴权契约 E2E | 4.2s | `d:\cfc\tests` | **13/13**(TC-HP-U01~03 全 401,B-61 维持) |
+| `remote-189` | 192.168.16.189:4090 | done | admin-desktop UI E2E | 1.3m | `C:\code\cfc\tests` | **5/5 EXIT=0**,跨节点可比 |
+| `remote-251` | 192.168.16.251:4096 | done | langgraph pytest | 495.56s | `/sc-data/cfc/cfc-langgraph` | **51/51 连续第 2 轮全绿**;节点 HEAD `f17d53669` |
+| `local-jest` | 本机进程 | done | cfc-web + cfc-frontend + 根级 | fe 172s / web 209s | `cfc-web` / `cfc-frontend` / `tests` | web **116/116**、fe **609/3/12**(3 预期 RED)、根级 **7/16** |
+| `local-backend` | 本机 mvn | done | 窗口契约类定向测试 | 2m05s | `d:\cfc\cfc-backend` | **133 例 = 85 过 / 48 预期 RED / 0 错** |
+| `virtual` | dx-bridge | done | D/X 桥接鉴权契约 | 瞬时 | `d:\cfc\tests` | **2 skip**(端点 404,B-DX-1 维持) |
+
+### 1.3 问题处置
+
+| 指标 | 数量 | 填写说明 |
+|------|------|----------|
+| **新测试发现问题数\*** | **2 个** | ① **B-189-1(P1 环境)**:`git.iwintrue.com` / 251 **SSH 22 CLOSED**(R188 09:39 尚可 push)→ `git fetch`/`push` 走 SSH 全部失败;替代路径 `http://git.iwintrue.com/liaoxg/cfc.git` 可读(HEAD=6124352d7,与本地一致)。**属 Gogs SSH 服务故障,非代码问题**;② **B-189-2(P2 流程/证据)**:窗口内 13 个契约测试类由并行会话推入但**未逐类验证入库**(自动化闭环遗漏),本轮补验完成:48 红全为预期 RED、3 个 GREEN 类全绿。 |
+| **已解决测试相关问题数\*** | **1 个** | **B-142-2(langgraph 上游凭据/配额环境红)观察 2/2**:R188 51/51 + R189 51/51,连续 2 轮全绿 → **满足销号判据,本轮正式销号**(残留 live chat 链路 120s 零字节单列 B-186-1 观察)。 |
+| **待解决测试相关问题数** | P0×2 / P1×7 / P2×4 | ① B-152-1/2 CI 清单漏拦/陈旧;② S-cfc-183/184/188/196 等 **48 前瞻契约 RED**(P1,需研发实现使绿);③ S-cfc-176 幂等 1F;④ B-177-1 pytest summary 后挂死;⑤ B-156-1/B-170-1 迁移 DDL;⑥ B-162-1 3 类未入库;⑦ B-178-1 反射装置 2F;⑧ B-36 根级 16 红(9082 未起);⑨ B-95 204 失联;⑩ B-DX-1 dx 404;⑪ B-186-1 live chat 挂死;⑫ **B-189-1 git SSH 22 故障**。 |
+
+### 1.4 本轮 git 提交与推送证据(真理证据)
+
+| 提交 sha | 关联任务/能力键 | 阶段 | 触及文件类型 | 目标分支 | 已推送远端 | 备注 |
+|----------|-----------------|------|--------------|----------|------------|------|
+| `见 §九` | 全站巡检 R189 + 契约窗验证 + B-142-2 销号 + B-189-1/2 登记 | 汇报 | 报告 + 执行日志 + blockers + 研发通知 + 台账 | cfclub | ⏳ SSH 22 故障,推送方式见 §九 | 结果有变化 → 按规则提交并通知研发 |
+
+### 1.5 状态机阶段分布(全局进度,研发侧账本口径)
+
+| 阶段 | 键数 | 备注 |
+|------|------|------|
+| UNTRACKED | 0 | 窗口零新增规格 |
+| RED | 17(历轮承袭)+ 窗口新契约若干 | S-cfc-183/184/188/196 等 48 前瞻契约 RED 已在本轮实测取证;研发状态机口径另计 |
+| YELLOW | 72 | 研发负责人口径(第152轮) |
+| GREEN / DONE | 24 | 承袭 |
+| 合计 | 105+ | 研发侧状态机账本口径(本轮交付 `blockers` 后互联) |
+
+### 1.6 数据源健康度
+
+| 数据源 | 读取键数 | 是否正常 | 备注 |
+|--------|----------|----------|------|
+| 需求侧(⏳ wish) | 0 | 正常 | SRS 目标池未启用 |
+| 契约常量(contract) | 多组 | 正常 | 窗口 13 契约类逐类可收集可执行 |
+| 测试用例引用(test_case_map) | 308+ 唯一 TC | 正常 | 台账扫描正常 |
+| 执行结果回填(case_results) | 定向 133 + 全量采信 | 正常 | surefire XML 可聚合 |
+
+---
+
+## 二、历史审查记录(阶段 -1 记忆召回)
+
+| 项 | 内容 |
+|---|---|
+| 上次审查 | **R188(2026-11-13 09:39,`00121ff2f`)**,结论「不通过(有条件,明显正向)」,全站 3987/3918(98.27%),红 44;后端全量恢复 43:15;langgraph 首轮 51/51;frontend 6/6 |
+| 历史遗留 | 后端存量 25 红(13 类)· 根级 16 红(B-36)· fe 3 预期 RED(S-cfc-132/133)· CI 漏拦/陈旧(B-152-1/2)· B-177-1 · B-178-1 · B-186-1 live chat | 
+| 本次是否改善 | **langgraph 连续 2 轮 51/51 → B-142-2 销号(正向)**;后端存量 25 红窗口零漂移;浏览器六件套零漂移全绿;其余承袭 |
+| 教训应用 | ① 窗口出现**新增契约测试类必须逐类定向实测取证**再入报告(B-189-2:并行会话推入的 13 类昨日未验证,本轮补验证明 48 红全为预期 RED);② git SSH 故障时立即降级 HTTP 探源确认远端 HEAD(B-189-1);③ langgraph 全绿连续 2 轮即销号(B-142-2 判据兑现);④ 每节点仅 1 个浏览器任务、本机串行执行(本轮 6 实例顺序推进无冲突)。 |
+
+> 本次为该对象**第 189 次**审查,有历史记录;上述内容仅作对照,**本轮前端/管理端/langgraph/浏览器/API/根级/契约窗全部本轮实测**;后端全量采信 R188(窗口 main 零变更)。
+
+---
+
+## 三、项目画像与覆盖矩阵
+
+### 3.1 项目画像
+
+| 维度 | 内容 |
+|------|------|
+| 业务定位 | 家庭教育成长平台(五维能量 身/心/智/行/富):小程序家长端 + 规划师端 + 管理后台 + 独立商城 |
+| 技术栈 | Spring Boot 2.7.18 + MyBatis-Plus + Java 8(9082)/ uni-app 微信小程序(Vue2)/ Vue2 + Element UI(8082)/ FastAPI + LangGraph + ChromaDB(9000@251) |
+| 模块结构 | `cfc-backend`(366 控制器 / 388 测试源 / 369+13 测试类)/ `cfc-frontend`(42 测试文件 / 624 例)/ `cfc-web`(17 套件 / 116 例)/ `cfc-langgraph`(51 例 @251)/ `tests`(e2e-live 5 文件 + e2e/api 点名 4 文件) |
+| 关键路径 | 登录/家庭/成员 → 五维能量 → 任务/成长记录 → 健康报告上传解析 → 测评订单 → 商城/支付 → AI 对话(LangGraph) |
+| 测试现状 | **本轮实测**:浏览器 30 + langgraph 51 + fe 624 + web 116 + 根级 23 + API 32 + 契约窗 133 = **1009 例实测**;后端全量 3111 采信 R188(窗口 main 零变更) |
+| 质量目标 | 全量用例全绿、覆盖 SRS 与用户场景(含异常流)、浏览器双节点可复现、结果变更即提交并通知研发 |
+| 风险点 | ① 后端存量 25 红(12 类)+ 契约窗 48 RED 待实现;② CI 清单双向失真;③ 上游 LLM live 链路挂死(B-186-1);④ 根级 16 红(9082 未起);⑤ 迁移 DDL 缺陷;⑥ pytest 进程不退出(B-177-1);⑦ **git SSH 22 故障(B-189-1)** |
+| 待核实项 | S-cfc-176 幂等分支排期 · 251 上游凭据/配额(pytest 绿但 live 挂)· 204 节点恢复 · B-156-1/B-170-1 修复状态 |
+
+### 3.2 20 类测试覆盖矩阵(全类不省略)
+
+| # | 测试类型 | 三态 | 证据(本轮实测) |
+|---|----------|------|------------------|
+| 1 | 单元测试 | ✅ 已发现 | 后端全量 3111(采信 R188)+ 契约窗 133(实测);前端 624;管理端 116 |
+| 2 | 测试覆盖率 | ⚠️ 部分 | 管理端 Jest 覆盖率可产出;后端未开 jacoco(未授权改 pom) |
+| 3 | 变异测试 | ❌ 未发现 | 全仓无 pitest/mutation 配置 |
+| 4 | 集成测试 | ✅ 已发现 | `integration/*` 存量执行结果承袭(EnergySystemFlow 6F、GuideModule 1E 等);本轮未重跑(main 零变更) |
+| 5 | 契约测试 | ✅ 已发现(本轮重点) | **窗口 13 契约类 133 例全实测**:LoginSwitch 16/16、MessagePush 20/20、PlanActivate 15/15 全绿;另 10 类 48 红全为预期 RED;S-cfc-176 维持 1F |
+| 6 | 接口 API 测试 | ✅ 已发现 | 线上 API 32 例(**本轮实测**:25 过 / 7 跳 / 0 红,28s) |
+| 7 | 系统/端到端 | ✅ 已发现 | 浏览器 30 例(**本轮实测**:28 过 + 2 跳),双节点 admin 5/5 |
+| 8 | 验收 UAT | ⚠️ 待核实 | 无独立 UAT 包;以浏览器 30 例作为系统级验收代理 |
+| 9 | BDD 规格 | ✅ 已发现 | 用例/场景 11 份(用户场景文件级,映射率 72.1% 承袭) |
+| 10 | 冒烟测试 | ✅ 已发现 | `api-smoke.spec.js` 本轮实测全绿(含自注册链路) |
+| 11 | 回归测试 | ✅ 已发现 | 存量红集合 12 类逐类零漂移(**第 24 次**);admin/frontend/shop/health 全绿 |
+| 12 | 探索性测试 | ⚠️ 部分 | 历轮浏览器人工探索记录;本轮未安排新探索项 |
+| 13 | 性能测试 | ❌ 未实测 | 未授权联网压测;仅 API 时延观察(非功能 32 例内含超时断言) |
+| 14 | 可靠性测试 | ⚠️ 部分 | pytest 挂死(B-177-1 第 4 轮观察)为可靠性缺陷;本轮 495.56s 正常收口 |
+| 15 | 安全测试 | ✅ 已发现 | `nonfunc-security.spec.js` 11 例本轮全绿(XSS/越权/恶意文件);匿名 6 端点全 401 |
+| 16 | 兼容性测试 | ⚠️ 部分 | 双视口(desktop 1440 / mobile 375)实测通过;无多浏览器矩阵 |
+| 17 | 可用性测试 | ⚠️ 部分 | 登录-主框架-核心菜单旅程 5/5×2 节点;无专项可用性问卷 |
+| 18 | 无障碍测试 | ❌ 未发现 | 无 axe/pa11y 配置 |
+| 19 | QA 流程 | ⚠️ 部分 | 汇报/台账/blockers 闭环在跑;CI 清单失真(B-152-1/2)未修 |
+| 20 | 质量指标 | ⚠️ 部分 | 全站通过率 97.16%(G1 未达 98%);锚点率 20.1% 承袭 |
+
+---
+
+## 四、五要素问题清单
+
+| # | ① 问题描述 | ② 测试 bug 点 | ③ 最优修改方案 | ④ 修改目的 | ⑤ 闭环方式 |
+|---|-----------|--------------|----------------|-----------|-----------|
+| P1 | 后端存量 25 红(12 类,跨 24 轮)零漂移承袭 | `EnergySystemFlowTest` 6F / `DimensionRegistryMapContractTest` 3F / `OrchestrationEngineTest`·`OrchestrationIntegrationTest`·`MembershipPaySwitchTest`·`PaymentServiceORDRoutingTest`·`UserServiceWechatLoginTest`(×2)·`TeamProfitCronContractTest` 各 1F 等 | 按类逐条修;先修 `TeamProfitCronContractTest`(平台费截断,影响计费) | 后端回归全绿 → G2 闭环 | 修后 `mvn -o -B test -Dtest=<类>` 定向复跑,单类 0F 连续 2 轮 |
+| P2 | **窗口 13 契约类 48 前瞻 RED 待研发实现(TDD 先行态,本轮已取证)** | S-cfc-183 `PlanContentSafetyReviewContractTest` 4F / S-cfc-184 `TeacherAssessmentRecordContractTest` 3F / S-cfc-188 `FamilyAutoCreateForPurchaseContractTest` 4F / S-cfc-196 `TeacherPlanCreateContractTest` 4F / `TeacherMindRecordContractTest` 12F / `TeacherAppointmentGuardContractTest` 10F / 其余 5 类 10F | 按 SC-T 界面对应实现(必填拦截、重复覆盖、权限门禁、自动建家庭、mind 记录、预约守卫等);本报告 `notice` 已逐键下发 | 48 前瞻契约转绿 → RED 清零 | 实现后逐类定向复跑,单类 0F 即销 RED;GREEN 三键(189/191/Activate)已全绿可直接收尾 |
+| P3 | S-cfc-176 幂等分支未生效 | `MembershipPlanPurchaseContractTest.repeatPurchase_pendingOrderSamePlan_reuseNoDuplicate:201`(`NeverWantedButInvoked: paymentOrderMapper.insert`) | `findReusablePendingOrder` 命中后直接复用,不再 insert | 契约闭环(防重复下单) | 定向复跑该类 7/7 绿 |
+| P4 | 迁移 DDL 缺陷持续复现 | `schema.sql:5345` `INDEX idx_product (product_id)` 无该列;`DatabaseInitializer.java:2261` 带别名 UPDATE + 派生表引用被更新表 | 删索引或补列;改独立子查询写法 | 建表成功 + 计数列可写 | 启动日志 0 次 `SQLSyntaxErrorException` |
+| P5 | 未入库测试资产 3 类 | `config/GrowthPublicEndpointMappingTest.java`(`??` 未跟踪)等 | `git add` + push | 资产可追溯 | 入库后全量重跑该类 0E |
+| P6 | pytest 打印 summary 后进程不退出(B-177-1 第 4 轮)| `tests/test_analyze.py` → `RuntimeWarning: coroutine 'JavaClient._get_client' was never awaited` | `app/main.py:84` 改用 lifespan 并 `await client.aclose()`;派发器加 `timeout -k 10 900` | 派发可判定成功、节点不残留 | 派发日志出现 `EXIT=0` 且 `ps` 无残留 |
+| P7 | 根级黑盒 16 红(B-36 第 73 轮) | `tests/integration/*`(全 `ECONNREFUSED 9082`) | 起本地 9082 或改指向测试环境 | 黑盒链路可测 | 9082 起来后重跑 23 例 |
+| P8 | CI 清单双向失真(B-152-1/2) | `.gitlab-ci.yml:61`(漏拦 6 + 陈旧 26) | 按实测红类集合精修 `BACKEND_OBSERVED_CLASSES`(接入本轮 13 契约类) | CI 硬门禁真实生效 | CI 在含红例分支上「必红」验证一次 |
+| P9 | 前端 3 例预期 RED | `signature.*`(AC-R1/AC-R2)+ `growthHistory.dayGroupView` RED-A7 | 交付 S-cfc-132/133 组件与分组逻辑 | 前端全绿 | `npx jest` 624/624 |
+| P10 | **git SSH 22 故障(B-189-1,本轮环境)** | `git.iwintrue.com` / `192.168.16.251:22` CLOSED(R188 09:39 尚可 push) | Gogs 侧恢复 SSH 服务/端口映射;故障期经 `http://git.iwintrue.com/liaoxg/cfc.git` 只读确认远端 HEAD | fetch/push 恢复正常 | `git fetch origin` 成功 + 本轮产物推送成功 |
+| P11 | dx 桥接 2 例 skip(404) | `dx-health-bridge-auth.spec.js`(端点 404) | 端点上线后自动转断言 | 覆盖空转消除 | 线上端点 200 后重跑转 401 断言 |
+
+---
+
+## 五、域结论表
+
+| 审查维度 | 负责专家 | 结论 | 关键证据 |
+|----------|----------|------|----------|
+| 单元·组件级 | 苏雅 | **改善** | 窗口 13 契约类 133 例全实测(GREEN 3 类 51 例全绿);fe 609/3/12(3 预期 RED);web 116/116 |
+| 集成·接口级 | 柯砚 | **改善** | 线上 API 32 例 0 红;S-cfc-176 维持 1F;契约窗 3 GREEN 类可收尾 |
+| 系统·验收级 | 白樾 | **稳定** | 浏览器 30 例 28 过 + 2 跳;admin 双节点 5/5;frontend 6/6;health 13/13(B-61 维持) |
+| 测试保障级 | 闻朔 | 改善 | 冒烟全绿;存量红集合零漂移(第 24 次);契约定向验证流程新增(B-189-2 补验) |
+| 性能·可靠性 | 骆骋 | 承袭 | 后端全量采信(窗口零变更);langgraph 51/51 正常收口但 pytest 进程不退出仍为可靠性缺陷(B-177-1) |
+| 安全 | 关屿 | **改善** | 匿名端点全 401;nonfunc-security 11 例全绿(XSS/越权/恶意文件) |
+| 兼容·体验 | 阮清 | 稳定 | frontend 移动视口 6/6;desktop 双节点 admin 5/5;无多浏览器矩阵 |
+| 流程·度量 | 何序 | 部分改善 | G12 ✅ 窗口零需求变更;G9 锚点 20.1% 承袭;CI 漏拦/陈旧未修(B-152-1/2) |
+
+---
+
+## 六、门禁结论
+
+**结论:不通过(承袭,无回归、正向项明确)** —— 全站 4120 例 / **4003 过 = 97.16%(剔 skip 97.75%)**,红 92。红数环比 +48 的**全部来源为窗口新增契约测试的预期 RED**(TDD 契约先行、研发未实现,非缺陷);langgraph 连续 2 轮 51/51(**B-142-2 销号**);浏览器六件套全绿;API 零红;后端存量 25 红零漂移。阻断项为**存量红 + 48 前瞻契约 RED + CI 清单失真 + live chat 挂死**,均非本轮新增回归。
+
+| 门禁 | 判定 | 依据(本轮实测) |
+|------|------|------------------|
+| G1 全站通过率 ≥98% | ❌ **97.16%** | 4003/4120(剔 skip 97.75%);−1.11pct 全因 48 契约预期 RED 入池 |
+| G2 后端红归零/契约裁决 | ❌ **73 红** | 存量 25(12 类)+ **契约窗 48 预期 RED(10 类,需研发实现)** |
+| G3 前端双绿 | ⚠️ fe 609/624(3 预期 RED)+ web 116/116;**小程序 H5 浏览器 6/6** | 3 红全为 S-cfc-132/133 未交付 |
+| G4 编译可编译 | ✅ | 窗口契约类全量 test-compile + 定向执行无编译错 |
+| G5 结果完整性 | ✅ | 定向 133 例 surefire XML 完整;全量承袭 R188 369 XML 可聚合 |
+| G6 浏览器 E2E | ✅ **28 过 + 2 跳** | admin 5/5(本机+189)、fe 6/6、shop 4/4、health 13/13、dx 2 跳 |
+| G7 langgraph | ✅ **51/51(连续 2 轮)** | **B-142-2 销号**;live chat 挂死单列 B-186-1 |
+| G8 匿名鉴权 401 | ✅ | health 三端点全 401;API 安全套件 11 例全绿 |
+| G9 用例锚定 SRS | ❌ 20.1% | 承袭口径(本轮未变) |
+| G10 双/三节点可比 | ✅ 双节点 | 189 admin 5/5 + 本机 admin 5/5 + 251 langgraph 51 例 |
+| G11 CI 必红 | ❌ | 漏拦 6 + 陈旧 26 承袭(B-152-1/2) |
+| G12 用例锚定 SRS 变更 | ✅ | specs / test-cases / API_REFERENCE / 场景窗口零变更 → 用例零新增 |
+| G13 存量红零漂移 | ✅ **第 24 次** | 12 类逐类与 R188 一致;B-142-2 为唯一闭环项(正向) |
+
+---
+
+## 七、变更触发动作(用户规则:结果有变 → 提交远程 + 通知研发)
+
+- **变更事实(本轮)**:① 窗口**新增 13 契约测试类 133 例**(S-cfc-183/184/188/189/191/196 等)经定向实测取证:48 预期 RED 待研发实现、3 个 GREEN 类全绿可收尾;② langgraph **51/51 连续第 2 轮** → **B-142-2 销号**;③ 浏览器六件套全绿、API 零红、fe/web 零漂移;④ 全站口径 4120 例(+133)。
+- **动作**:本报告 + `automation-run-R189.md` + `blockers.md`(B-189-1/2 新增、B-142-2 销号、B-186-1 计数更新)+ `notice-2026-11-13-R189-研发通知.md` + 台账三件套(discovery/inventory/automation-status)提交推送。
+- **推送状态**:⚠️ **git SSH 22 故障(B-189-1)**——`git fetch/push` 走 SSH 失败;已降级经 `http://git.iwintrue.com/liaoxg/cfc.git` 确认远端 HEAD=6124352d7(与本地一致);推送按 B-189-1 处置(见§八 待办 1)。
+- **通知通道**:Agent Mail 历轮 `not_bound`(静默不触发)→ 以 blockers.md + 研发通知 + 推送落地。
+
+---
+
+## 八、待办
+
+1. **运维(P0)**:恢复 Gogs SSH 22(B-189-1)——本轮推送因此受阻;恢复期间可用 HTTP clone 只读核源。
+2. **研发(P1)**:48 前瞻契约 RED(S-cfc-183/184/188/196 + MindRecord/AppointmentGuard 等 10 类)逐键实现使绿;S-cfc-176 幂等;迁移 DDL(B-156-1/B-170-1);B-177-1 `aclose()`。
+3. **CI**:精修 `BACKEND_OBSERVED_CLASSES`(漏拦 6 + 陈旧 26 + 接入 13 契约类)。
+4. **测试**:B-142-2 已销号;下轮关注 48 RED 的研发实现进展与回归;前端 624/624 目标(S-cfc-132/133 交付后)。
+
+---
+
+## 附录 A:本轮命令与口径(可复现)
+
+```bash
+# 浏览器(必须在 tests/ 内跑;每节点 1 个浏览器任务,本机串行)
+cd tests && npx playwright test -c playwright.config.live.js --project=admin-desktop   # 5/5(本机)
+cd tests && npx playwright test -c playwright.config.live.js --project=frontend-mobile # 6/6
+cd tests && npx playwright test -c playwright.config.live.js --project=shop-api        # 4/4
+cd tests && npx playwright test -c playwright.config.health.js                          # 13/13
+cd tests && npx playwright test -c playwright.config.api.js --output=../_r189_api \
+  e2e/api/api-smoke.spec.js e2e/api/nonfunc-security.spec.js \
+  e2e/api/nonfunc-perf-compat.spec.js e2e/api/traceability-p94-p95-c26.spec.js        # 25/7/0
+
+# 189 节点 admin(单节点任务)
+node _r189_189_admin.cjs kick && node _r189_189_admin.cjs read  # 5/5 EXIT=0
+
+# 251 节点 langgraph pytest
+LOG=/tmp/r189_pytest.log node _r189_251_lg.cjs kick && node _r189_251_lg.cjs read  # 51/51
+
+# 窗口契约类定向(13 类 133 例)
+cd cfc-backend && JAVA_HOME=/d/jdk1.8.0_25 /d/maven/apache-maven-3.6.1/bin/mvn -o test -Dtest='FamilyAutoCreateForPurchaseContractTest,...,TeacherPlanCreateContractTest' -DfailIfNoTests=false
+
+# Jest
+cd cfc-frontend && npx jest --ci   # 609/3/12
+cd cfc-web && npx jest --ci        # 116/116
+cd tests && npx jest --silent      # 7/16(B-36)
+```
+
+## 附录 B:窗口 13 契约测试类定向实测明细(B-189-2 补验)
+
+| 类 | 提交 | 例数 | 过/红 | 预期 |
+|----|------|------|-------|------|
+| FamilyAutoCreateForPurchaseContractTest | 883a6eeab (S-cfc-188) | 5 | 1/4 | RED 4/5 ✅(自动建家庭未落地) |
+| GuideFamilyTaskReviewContractTest | 窗口 | 5 | 3/2 | RED(部分边界) |
+| NutritionPlanTeacherContractTest | 窗口 | 4 | 1/3 | RED(营养师计划边界) |
+| PlanContentSafetyReviewContractTest | 5f2a09b02 (S-cfc-183) | 9 | 5/4 | RED 4F ✅(AI 方案内容安全复核缺失) |
+| TeacherAppointmentGuardContractTest | 窗口 | 14 | 4/10 | RED(预约守卫未落地) |
+| TeacherAssessmentRecordContractTest | 64f8a3875 (S-cfc-184) | 4 | 1/3 | RED 3F ✅(必填拦截/重复覆盖未落地) |
+| TeacherDataIsolationScT13ContractTest | 窗口 | 9 | 5/4 | RED(数据隔离边界) |
+| TeacherDimensionScoreContractTest | 窗口 | 6 | 4/2 | RED(维度评分边界) |
+| TeacherLoginSwitchContractTest | bbc441e08 (S-cfc-189) | 16 | 16/0 | **GREEN 16/16 ✅**(实现已落地) |
+| TeacherMessagePushContractTest | 23e2ddd66 (S-cfc-191) | 20 | 20/0 | **GREEN 20/20 ✅** |
+| TeacherMindRecordContractTest | 窗口 | 13 | 1/12 | RED(mind 记录大面未落地) |
+| TeacherPlanActivateContractTest | 窗口 | 15 | 15/0 | **GREEN 15/15 ✅** |
+| TeacherPlanCreateContractTest | fb1702975 (S-cfc-196) | 13 | 9/4 | RED 4F ✅(权限门禁未落地) |
+| **合计** | — | **133** | **85/48** | 48 红全部为预期 RED(TDD 先行),0 意外失败 |

+ 47 - 0
docs/tdd/test/automation-run-2026-11-13-R189.md

@@ -0,0 +1,47 @@
+# R189 轮自动化测试执行日志(2026-11-13 10:45~11:30)
+
+> 测试负责人|自动化定时任务 ccb91e89 触发|静默无人值守|基线 `00121ff2f`(R188)→ 收尾 HEAD `6124352d7`
+
+## 一、基线与环境
+
+- 基线:R188 收口 `00121ff2f`;当前 HEAD `6124352d7`(11:11,并行会话并发合入)。
+- 窗口 `git diff 00121ff2f..6124352d7`:**src/specs/用例/接口/场景零变更**;34 文件 = 13 新增契约测试类 + docs/台账/汇报 + auto bump。
+- 节点探活:admin/frontend 302→200 在线;189:4090=200;251:4096=200;251:9000 `{"status":"ok"}`;本机 4091=200;**git SSH 22 CLOSED(B-189-1)**;9082=000(B-36 承袭);204=000(B-95 承袭)。
+
+## 二、本轮实测明细(全部本轮执行)
+
+| # | 套件 | 节点 | 结果 | 耗时 | 关键点 |
+|---|------|------|------|------|--------|
+| 1 | admin-desktop E2E | 本机 | **5/5** | 1.4m | TC-A-U01~U05 全过 |
+| 2 | frontend-mobile E2E | 本机 | **6/6** | 46.2s | B-185 维持消除 |
+| 3 | shop-api E2E | 本机 | **4/4** | 6.9s | 价格排序契约 |
+| 4 | health 鉴权契约 | 本机 | **13/13** | 4.2s | TC-HP-U01~03 全 401(B-61 维持) |
+| 5 | admin-desktop E2E | 189:4090 | **5/5 EXIT=0** | 1.3m | 跨节点可比(spec 同源) |
+| 6 | langgraph pytest | 251:4096 | **51/51** | 495.56s | **连续第 2 轮全绿 → B-142-2 销号** |
+| 7 | dx-bridge | 本机 | **2 skip** | 瞬时 | 端点 404(B-DX-1) |
+| 8 | 线上 API 32 例 | 本机 | **25 过/7 跳/0 红** | 28s | api-smoke + nonfunc-security + perf-compat + traceability |
+| 9 | cfc-frontend Jest | 本机 | **609/3/12** | 172s | 3 红 = S-cfc-132/133 预期 RED |
+| 10 | cfc-web Jest | 本机 | **116/116** | 209s | 全绿 |
+| 11 | 根级黑盒 Jest | 本机 | **7/16** | 9.8s | B-36 第 73 轮(9082 未起) |
+| 12 | 窗口 13 契约类定向 | 本机 mvn | **133 例 = 85 过/48 红/0 错** | 2m05s | 48 红全预期 RED;GREEN 3 类(LoginSwitch 16、MessagePush 20、PlanActivate 15)全绿 |
+
+后端全量:**采信 R188**(369 类 / 3111 例 / 3082 过 / 25 红 / 4 跳 = 99.07%),窗口 main 零变更。
+
+## 三、全站口径
+
+- 合计 **4120 例** = 后端 3244(3111采信 + 133契约实测)+ fe 624 + web 116 + lg 51 + 浏览器 30 + API 32 + 根级 23
+- **4003 过 / 92 红 / 25 跳 = 97.16%(剔 skip 97.75%)**
+- 红 92 = 后端存量 25 + 契约预期 RED 48 + fe 预期 RED 3 + 根级 16(环境)
+- 环比 R188(3987/3918/44红/97.27%…98.27%):例 +133、过 +85、红 +48(全为窗口契约预期 RED,零缺陷回归)
+
+## 四、处置与结论
+
+- **B-142-2 销号**:langgraph 连续 2 轮 51/51(R188 + R189)→ 满足销号判据。
+- **B-189-1 新增**:git SSH 22 CLOSED(Gogs 服务故障)→ fetch/push 降级 HTTP 核源(liaoxg/cfc HEAD 与本地一致)。
+- **B-189-2 新增(自处置)**:窗口 13 契约类补验完成,48 RED 全为预期、3 GREEN 全绿,无意外失败。
+- **门禁**:不通过(承袭)——G1 97.16%(−1.11pct 全因契约 RED 入池)、G2 73 红、G9/G11 承袭、G12 ✅、G6/G7/G8/G10/G13 ✅。
+
+## 五、git 证据
+
+- 窗口新增测试资产提交:`64f8a3875`(S-cfc-184)、`5f2a09b02`(S-cfc-183)、`883a6eeab`(S-cfc-188)、`bbc441e08`(S-cfc-189)、`23e2ddd66`(S-cfc-191)、`fb1702975`(S-cfc-196)已由并行会话 push;本地=远端 `6124352d7`。
+- 本轮测试侧产物(R189 报告/执行日志/notice/blockers/台账):提交推送状态见主报告 §七(SSH 故障处置中)。

+ 15 - 2
docs/tdd/test/automation-status.md

@@ -23,8 +23,8 @@
 | 用户场景(md) | 11 | 0 | 0 | 11 | 11 | 0 | 0 | 0 | 0 |
 | Playwright(e2e/integration) | 96 | 571 | 96 | 0 | 86 | 0 | 7 | 3 | 0 |
 | Python(pytest) | 11 | 48 | 11 | 0 | 11 | 0 | 0 | 0 | 0 |
-| Java后端测试 | 375 | 3096 | 375 | 0 | 358 | 0 | 15 | 2 | 0 |
-| **合计** | — | **4434** | **545** | **667** | 890 | 255 | 36 | 5 | 26 |
+| Java后端测试 | 388 | 3229 | 388 | 0 | 371 | 0 | 15 | 2 | 0 |
+| **合计** | — | **4567** | **558** | **667** | 903 | 255 | 36 | 5 | 26 |
 
 ## 二、结构化测试用例自动化状态(`tests/test-cases/*.md`)
 
@@ -1141,6 +1141,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/EnergyIsolationContractTest.java` | 8 | 已自动化(@Test) | 未跟踪 | EnergyIsolationContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/EnergyLogsContractScoreHistoryTest.java` | 11 | 已自动化(@Test) | 未跟踪 | EnergyLogsContractScoreHistory |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/EnergyOverviewContractTest.java` | 7 | 已自动化(@Test) | 未跟踪 | EnergyOverviewContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyAutoCreateForPurchaseContractTest.java` | 5 | 已自动化(@Test) | 未跟踪 | FamilyAutoCreateForPurchaseContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyJoinValidationRulesContractTest.java` | 14 | 已自动化(@Test) | 未跟踪 | FamilyJoinValidationRulesContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberDimensionBaseScoreServiceTest.java` | 7 | 已自动化(@Test) | 未跟踪 | FamilyMemberDimensionBaseScoreService |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberRelationshipLabelTest.java` | 8 | 已自动化(@Test) | 未跟踪 | FamilyMemberRelationshipLabel |
@@ -1171,6 +1172,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` | 10 | 已自动化(@Test) | 未跟踪 | GuideFamilyAccessGuard |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyQueryServiceTest.java` | 4 | 已自动化(@Test) | 未跟踪 | GuideFamilyQueryService |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyServiceBindTest.java` | 3 | 已自动化(@Test) | 未跟踪 | GuideFamilyServiceBind |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyTaskReviewContractTest.java` | 5 | 已自动化(@Test) | 未跟踪 | GuideFamilyTaskReviewContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuidePlanReviewControllerAuthTest.java` | 6 | 已自动化(@Test) | 未跟踪 | GuidePlanReviewControllerAuth |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthDataSourceBridgeContractTest.java` | 16 | 已自动化(@Test) | 未跟踪 | HealthDataSourceBridgeContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanDeleteCascadeTest.java` | 6 | 已自动化(@Test) | 未跟踪 | HealthPlanDeleteCascade |
@@ -1190,10 +1192,12 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipPlanPurchaseContractTest.java` | 7 | 已自动化(@Test) | 未跟踪 | MembershipPlanPurchaseContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipRenewScP60ScP80ContractTest.java` | 9 | 已自动化(@Test) | 未跟踪 | MembershipRenewScP60ScP80Contract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipViewScP59ContractTest.java` | 6 | 已自动化(@Test) | 未跟踪 | MembershipViewScP59Contract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/NutritionPlanTeacherContractTest.java` | 4 | 已自动化(@Test) | 未跟踪 | NutritionPlanTeacherContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/OrderCreatePayShipConfirmScX07ContractTest.java` | 14 | 已自动化(@Test) | 未跟踪 | OrderCreatePayShipConfirmScX07Contract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/OrderRefundScP56ScA12ContractTest.java` | 11 | 已自动化(@Test) | 未跟踪 | OrderRefundScP56ScA12Contract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/PersonalLayerDualAssertionTest.java` | 13 | 已自动化(@Test) | 未跟踪 | PersonalLayerDualAssertion |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/PlanActivationExecutionContractTest.java` | 14 | 已自动化(@Test) | 未跟踪 | PlanActivationExecutionContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/PlanContentSafetyReviewContractTest.java` | 9 | 已自动化(@Test) | 未跟踪 | PlanContentSafetyReviewContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/PlanLifecycleParentContractTest.java` | 38 | 已自动化(@Test) | 未跟踪 | PlanLifecycleParentContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/PlanReviewTeacherContractTest.java` | 19 | 已自动化(@Test) | 未跟踪 | PlanReviewTeacherContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/PointsLedgerScP15ContractTest.java` | 8 | 已自动化(@Test) | 未跟踪 | PointsLedgerScP15Contract |
@@ -1229,6 +1233,15 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskReviewScT06ContractTest.java` | 6 | 已自动化(@Test) | 未跟踪 | TaskReviewScT06Contract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTaskCreateContractTest.java` | 7 | 已自动化(@Test) | 未跟踪 | TaskTaskCreateContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTemplatePackageContractTest.java` | 13 | 已自动化(@Test) | 未跟踪 | TaskTemplatePackageContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherAppointmentGuardContractTest.java` | 14 | 已自动化(@Test) | 未跟踪 | TeacherAppointmentGuardContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherAssessmentRecordContractTest.java` | 4 | 已自动化(@Test) | 未跟踪 | TeacherAssessmentRecordContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherDataIsolationScT13ContractTest.java` | 9 | 已自动化(@Test) | 未跟踪 | TeacherDataIsolationScT13Contract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherDimensionScoreContractTest.java` | 6 | 已自动化(@Test) | 未跟踪 | TeacherDimensionScoreContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherLoginSwitchContractTest.java` | 16 | 已自动化(@Test) | 未跟踪 | TeacherLoginSwitchContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherMessagePushContractTest.java` | 20 | 已自动化(@Test) | 未跟踪 | TeacherMessagePushContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherMindRecordContractTest.java` | 13 | 已自动化(@Test) | 未跟踪 | TeacherMindRecordContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherPlanActivateContractTest.java` | 15 | 已自动化(@Test) | 未跟踪 | TeacherPlanActivateContract |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherPlanCreateContractTest.java` | 13 | 已自动化(@Test) | 未跟踪 | TeacherPlanCreateContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitAdminManageContractTest.java` | 20 | 已自动化(@Test) | 未跟踪 | TeamProfitAdminManageContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitCronContractTest.java` | 22 | 已自动化(@Test) | 未跟踪 | TeamProfitCronContract |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitHookContractTest.java` | 7 | 已自动化(@Test) | 未跟踪 | TeamProfitHookContract |

+ 21 - 0
docs/tdd/test/blockers.md

@@ -1323,3 +1323,24 @@
 | **B-142-1(销号维持第 18 轮)** | 匿名端点鉴权 | 研发(已闭环) | **维持销号**。6 端点 **6/6 = 401**(mind/fortune、energy/overview、health/plan/list、xiaomi-health、huawei-health、admin/families/overview)。 | 测试(R188 实测) | 2026-11-13 09:55 | 已闭(观察维持) |
 | **B-124/B-32(度量口径)** | 锚点/场景口径跨轮不可比 | 测试(P2) | **仍未闭环**。官方脚本:场景 215 / 映射 155=72.1% / 字面 33=15.3% / TC 861 / 异常流 502=58.3% / 锚点 115 / 资产 546;严格口径沿用 **20.1%(62/308)**。 | 测试 | 2026-11-13 09:55 | 待处理 |
 | **R188 门禁** | 全量 3987 / **3918** | 测试 | **不通过(有条件,明显正向)**。✅G1 **98.27%**(剔 skip 98.89%,+12 过)/G4 编译 0 错(2121+375)/G5 369 XML 0 dump(恒等式 3097−4+18=3111)/G6 28 过+2 跳/G8 6/6 401/G10 双节点(189 5/5 + 251 51 例)/G12 SRS 零变更/G13 存量零漂移第 23 次;⚠️G3 609-624(3 预期 RED)/G7 **51/51(观察 1/2)**;❌G2 **25 红**、G9 20.1%、G11 漏拦 6 陈旧 26、G14 57.9%、G16 无 SCA。**变化** = 后端 28→25 红(全量实跑)、lg 6→0、fe H5 2→0 → 红 56→**44**、通过率 98.0%→**98.27%**。 | 测试(R188 闭环) | 2026-11-13 09:55 | 已记录 |
+
+---
+
+## R189 段(2026-11-13 11:30,新增)
+
+| **B-189-1(P1 新增·环境)** | git SSH 22 CLOSED | 运维(环境) | **新增**。`git.iwintrue.com` / `192.168.16.251:22` **CLOSED**(R188 09:39 尚可 push)→ `git fetch/push`(SSH)全部失败;降级经 `http://git.iwintrue.com/liaoxg/cfc.git` 只读确认远端 HEAD=`6124352d7`=本地(数据一致),但推送受阻。**请运维检查 Gogs/251 sshd 服务(端口 22)**。 | 测试(R189 实测) | 2026-11-13 11:30 | 待处理(P0 级阻塞推送) |
+| **B-189-2(P2 新增·自处置)** | 窗口 13 契约类未逐类验证即并行推入 | 测试(流程) | **补验完成**。R188 后并行会话推入 13 个契约测试类(S-cfc-183/184/188/189/191/196 等)未逐类验证;本轮定向实测 **133 例 = 85 过 / 48 红 / 0 错(2m05s)**:48 红**全部为预期 RED(TDD 先行)**;GREEN 3 类(LoginSwitch 16/16、MessagePush 20/20、PlanActivate 15/15)全绿可收尾。**流程修正**:下轮起窗口内新增测试类必须逐类定向取证再入账。 | 测试(R189 实测) | 2026-11-13 11:30 | 已处置(补验闭环) |
+| **B-142-2(销号,2026-11-13)** | langgraph 上游 LLM 不可达 | 运维/研发(P0→已销) | **正式销号**。R188 51/51 + R189 **51/51(495.56s)** = 连续 2 轮全绿 → 满足销号判据。残留 live chat 链路(120s 零字节)单列 **B-186-1** 持续观察。 | 测试(R189 实测) | 2026-11-13 11:30 | ✅ 已销号 |
+| **B-186-1(第 3 轮观察)** | langgraph live `/api/v1/chat` 挂死 | 运维/研发(P1) | **延续**。pytest 51/51 绿(mock 路径)但 live chat 链路上轮仍 120s 零字节 → 真实链路未验证;需轮换 key + 提额。 | 运维/研发 | 2026-11-13 11:30 | 待处理 |
+| **S-cfc-183/184/188/196 等(48 前瞻 RED,本轮取证)** | 窗口 13 契约类 10 类 48 红 | 研发(P1,最紧急) | **全部预期 RED**(TDD 先行、研发未实现):MindRecord 12F / AppointmentGuard 10F / PlanContentSafety 4F(S-cfc-183)/ TeacherAssessmentRecord 3F(S-cfc-184)/ FamilyAutoCreate 4F(S-cfc-188)/ TeacherPlanCreate 4F(S-cfc-196)/ DataIsolation 4F / PlanReview 部分 / Nutrition 3F / DimensionScore 2F。逐键清单见 `notice-2026-11-13-R189-研发通知.md` §一 P1。 | 测试(R189 定向实测) | 2026-11-13 11:30 | 待处理(研发实现使绿) |
+| **S-cfc-189/191/Activate(3 GREEN 全绿)** | 契约 GREEN 确认 | 研发(可直接收尾) | LoginSwitch **16/16**(bbc441e08)/ MessagePush **20/20**(23e2ddd66)/ PlanActivate **15/15** 全绿 → 契约侧已闭环,可直接收 YELLOW/GREEN。 | 测试(R189 定向实测) | 2026-11-13 11:30 | 已取证(待研发登记) |
+| **B-177-1(第 11 轮)** | 251 pytest 打印 summary 后进程不退出 | 研发/测试(P1) | **观察 4/2(收口但 EXIT 行仍缺失)**。本轮 495.56s 正常收口输出 summary,`EXIT=` 行仍缺失(B-126 表象);残留进程已清理。修法不变:`app/main.py:84` lifespan + `aclose()`;派发器 `timeout -k 10 900`。 | 研发/测试 | 2026-11-13 11:30 | 待处理 |
+| **B-36(第 73 轮零漂移)** | 根级黑盒 23 例 16 红 | 测试(P2 环境) | **零漂移**。`cd tests && npx jest --silent` → **7 过 / 16 红**(9.8s),全 `ECONNREFUSED 9082`。 | 测试 | 2026-11-13 11:30 | 待处理 |
+| **B-95(第 44 轮)** | `192.168.16.204:4090` 失联 | 运维(P2) | **延续**。204=000;189:4090=**200(admin 5/5 EXIT=0)**、251:4096=200。 | 运维 | 2026-11-13 11:30 | 待处理 |
+| **B-DX-1(第 31 轮)** | dx-bridge 端点 404 | 部署/研发(P1) | **延续**。本轮 dx 2 例 skip(404)。 | 部署/研发 | 2026-11-13 11:30 | 待处理 |
+| **B-152-1/2(第 20 轮)** | CI `BACKEND_OBSERVED_CLASSES` 失真 | 研发/CI(P0/P1) | **延续**。漏拦 6 + 陈旧 26 未修;本轮建议同步接入 13 个新契约类。 | 研发/CI | 2026-11-13 11:30 | 待处理 |
+| **B-156-1 / B-170-1(第 13/10 轮)** | 迁移 DDL 缺陷 | 研发(P1/P2) | **延续未修**。`schema.sql:5345` 索引列缺失 / `DatabaseInitializer.java:2261` 别名 UPDATE 派生表引用。 | 研发 | 2026-11-13 11:30 | 待处理 |
+| **B-162-1(第 15 轮)** | 3 个测试类未入库 | 治理(P1) | **延续**。`GrowthPublicEndpointMappingTest`(5E)等仍 `??`。 | 研发/测试 | 2026-11-13 11:30 | 待处理 |
+| **B-178-1(第 8 轮)** | TaskReviewScP11 反射装置浮动 | 测试(P2) | **延续 2F** → `@MockBean` 替代 `ReflectionUtils`。 | 测试 | 2026-11-13 11:30 | 待处理 |
+| **B-142-1(销号维持第 19 轮)** | 匿名端点鉴权 | 研发(已闭环) | **维持销号**。health 三端点(plan/adjust、attribution、generate)全 **401**;API 安全套件 11 例全绿。 | 测试(R189 实测) | 2026-11-13 11:30 | 已闭(观察维持) |
+| **R189 门禁** | 全量 4120 / **4003** | 测试 | **不通过(承袭,无回归)**。✅G4 编译 0 错/G5 定向 133 surefire XML 完整/G6 28 过+2 跳/G7 **51/51(连续 2 轮,B-142-2 销号)**/G8 401 全绿/G10 双节点/G12 SRS 零变更/G13 存量零漂移第 24 次;⚠️G3 609-624(3 预期 RED);❌G1 **97.16%**(剔 skip 97.75%,−1.11pct **全因 48 契约预期 RED 入池**)/G2 **73 红**(存量 25 + 契约预期 RED 48)/G9 20.1%/G11 漏拦 6 陈旧 26。**变化** = 例 +133(窗口 13 契约类)、过 +85、红 +48(**全为预期 RED,零缺陷回归**);langgraph 连续 2 轮全绿 **B-142-2 销号**;浏览器六件套全绿、API 0 红、fe/web 零漂移。 | 测试(R189 闭环) | 2026-11-13 11:30 | 已记录 |

+ 15 - 2
docs/tdd/test/inventory.md

@@ -11,9 +11,9 @@
 | 结构化测试用例(md) | 10 | 719 |
 | Playwright(spec.js) | 96 | 571 |
 | Python(pytest) | 11 | 48 |
-| Java后端(测试文件) | 375 | 3096 (@Test) |
+| Java后端(测试文件) | 388 | 3229 (@Test) |
 | 用户场景(md) | 11 | 文件级 |
-| **合计** | — | **4434** 用例/方法 |
+| **合计** | — | **4567** 用例/方法 |
 
 ## 二、结构化测试用例(`tests/test-cases/*.md`)
 
@@ -1136,6 +1136,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/EnergyIsolationContractTest.java` | cfc-backend | 8 | EnergyIsolationContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/EnergyIsolationContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/EnergyLogsContractScoreHistoryTest.java` | cfc-backend | 11 | EnergyLogsContractScoreHistory | `cfc-backend/src/test/java/com/etotem/cfc/unit/EnergyLogsContractScoreHistoryTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/EnergyOverviewContractTest.java` | cfc-backend | 7 | EnergyOverviewContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/EnergyOverviewContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyAutoCreateForPurchaseContractTest.java` | cfc-backend | 5 | FamilyAutoCreateForPurchaseContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyAutoCreateForPurchaseContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyJoinValidationRulesContractTest.java` | cfc-backend | 14 | FamilyJoinValidationRulesContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyJoinValidationRulesContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberDimensionBaseScoreServiceTest.java` | cfc-backend | 7 | FamilyMemberDimensionBaseScoreService | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberDimensionBaseScoreServiceTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberRelationshipLabelTest.java` | cfc-backend | 8 | FamilyMemberRelationshipLabel | `cfc-backend/src/test/java/com/etotem/cfc/unit/FamilyMemberRelationshipLabelTest.java` |
@@ -1166,6 +1167,7 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` | cfc-backend | 10 | GuideFamilyAccessGuard | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyAccessGuardTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyQueryServiceTest.java` | cfc-backend | 4 | GuideFamilyQueryService | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyQueryServiceTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyServiceBindTest.java` | cfc-backend | 3 | GuideFamilyServiceBind | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyServiceBindTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyTaskReviewContractTest.java` | cfc-backend | 5 | GuideFamilyTaskReviewContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuideFamilyTaskReviewContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuidePlanReviewControllerAuthTest.java` | cfc-backend | 6 | GuidePlanReviewControllerAuth | `cfc-backend/src/test/java/com/etotem/cfc/unit/GuidePlanReviewControllerAuthTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthDataSourceBridgeContractTest.java` | cfc-backend | 16 | HealthDataSourceBridgeContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthDataSourceBridgeContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanDeleteCascadeTest.java` | cfc-backend | 6 | HealthPlanDeleteCascade | `cfc-backend/src/test/java/com/etotem/cfc/unit/HealthPlanDeleteCascadeTest.java` |
@@ -1185,10 +1187,12 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipPlanPurchaseContractTest.java` | cfc-backend | 7 | MembershipPlanPurchaseContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipPlanPurchaseContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipRenewScP60ScP80ContractTest.java` | cfc-backend | 9 | MembershipRenewScP60ScP80Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipRenewScP60ScP80ContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipViewScP59ContractTest.java` | cfc-backend | 6 | MembershipViewScP59Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/MembershipViewScP59ContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/NutritionPlanTeacherContractTest.java` | cfc-backend | 4 | NutritionPlanTeacherContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/NutritionPlanTeacherContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/OrderCreatePayShipConfirmScX07ContractTest.java` | cfc-backend | 14 | OrderCreatePayShipConfirmScX07Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/OrderCreatePayShipConfirmScX07ContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/OrderRefundScP56ScA12ContractTest.java` | cfc-backend | 11 | OrderRefundScP56ScA12Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/OrderRefundScP56ScA12ContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/PersonalLayerDualAssertionTest.java` | cfc-backend | 13 | PersonalLayerDualAssertion | `cfc-backend/src/test/java/com/etotem/cfc/unit/PersonalLayerDualAssertionTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/PlanActivationExecutionContractTest.java` | cfc-backend | 14 | PlanActivationExecutionContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/PlanActivationExecutionContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/PlanContentSafetyReviewContractTest.java` | cfc-backend | 9 | PlanContentSafetyReviewContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/PlanContentSafetyReviewContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/PlanLifecycleParentContractTest.java` | cfc-backend | 38 | PlanLifecycleParentContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/PlanLifecycleParentContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/PlanReviewTeacherContractTest.java` | cfc-backend | 19 | PlanReviewTeacherContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/PlanReviewTeacherContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/PointsLedgerScP15ContractTest.java` | cfc-backend | 8 | PointsLedgerScP15Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/PointsLedgerScP15ContractTest.java` |
@@ -1224,6 +1228,15 @@
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskReviewScT06ContractTest.java` | cfc-backend | 6 | TaskReviewScT06Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskReviewScT06ContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTaskCreateContractTest.java` | cfc-backend | 7 | TaskTaskCreateContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTaskCreateContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTemplatePackageContractTest.java` | cfc-backend | 13 | TaskTemplatePackageContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TaskTemplatePackageContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherAppointmentGuardContractTest.java` | cfc-backend | 14 | TeacherAppointmentGuardContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherAppointmentGuardContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherAssessmentRecordContractTest.java` | cfc-backend | 4 | TeacherAssessmentRecordContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherAssessmentRecordContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherDataIsolationScT13ContractTest.java` | cfc-backend | 9 | TeacherDataIsolationScT13Contract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherDataIsolationScT13ContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherDimensionScoreContractTest.java` | cfc-backend | 6 | TeacherDimensionScoreContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherDimensionScoreContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherLoginSwitchContractTest.java` | cfc-backend | 16 | TeacherLoginSwitchContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherLoginSwitchContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherMessagePushContractTest.java` | cfc-backend | 20 | TeacherMessagePushContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherMessagePushContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherMindRecordContractTest.java` | cfc-backend | 13 | TeacherMindRecordContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherMindRecordContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherPlanActivateContractTest.java` | cfc-backend | 15 | TeacherPlanActivateContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherPlanActivateContractTest.java` |
+| `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherPlanCreateContractTest.java` | cfc-backend | 13 | TeacherPlanCreateContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeacherPlanCreateContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitAdminManageContractTest.java` | cfc-backend | 20 | TeamProfitAdminManageContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitAdminManageContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitCronContractTest.java` | cfc-backend | 22 | TeamProfitCronContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitCronContractTest.java` |
 | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitHookContractTest.java` | cfc-backend | 7 | TeamProfitHookContract | `cfc-backend/src/test/java/com/etotem/cfc/unit/TeamProfitHookContractTest.java` |