fix: 验收对照表按子项记结果不再虚报通过

This commit is contained in:
Nixevol
2026-09-30 16:24:56 +08:00
parent c72d1f0427
commit cb9512fe11
11 changed files with 1138 additions and 93 deletions
+546 -28
View File
@@ -1,120 +1,638 @@
{
"generated_at": "2026-09-30T02:20:32Z",
"generated_at": "2026-09-30T08:17:19Z",
"items": [
{
"id": "F01",
"status": "pass",
"note": "已测:开通一端、错误密码 MQTT 拒绝、正确密码可连;批量校验/停用/删除转让/同号重开未在本用例穷尽"
"note": "F01a 通过(test/accept/accept_test.go runEndpointCreate);F01b 通过(internal/admin/endpoints_test.go TestEndpointImportDuplicateRejectsAll、TestEndpointImportBOMAndCreate);F01c 通过(internal/app/identity/lifecycle_test.go TestF01DisableVoidsScheduledAndRejectsNew;internal/admin/endpoints_test.go TestEndpointDisableKickAndUnlock);F01d 通过(internal/app/identity/lifecycle_test.go TestF01DeleteOwnerTransfersEarliest);F01e 通过(internal/app/identity/lifecycle_test.go TestF01DeleteReopenNoOldReceipts)",
"subs": [
{
"id": "F01a",
"summary": "开通一端并可 MQTT 登录",
"status": "pass",
"evidence": "test/accept/accept_test.go runEndpointCreate"
},
{
"id": "F01b",
"summary": "批量开通整批校验",
"status": "pass",
"evidence": "internal/admin/endpoints_test.go TestEndpointImportDuplicateRejectsAll、TestEndpointImportBOMAndCreate"
},
{
"id": "F01c",
"summary": "停用",
"status": "pass",
"evidence": "internal/app/identity/lifecycle_test.go TestF01DisableVoidsScheduledAndRejectsNew;internal/admin/endpoints_test.go TestEndpointDisableKickAndUnlock"
},
{
"id": "F01d",
"summary": "删除群主转让",
"status": "pass",
"evidence": "internal/app/identity/lifecycle_test.go TestF01DeleteOwnerTransfersEarliest"
},
{
"id": "F01e",
"summary": "删除后同编号重开不串数据",
"status": "pass",
"evidence": "internal/app/identity/lifecycle_test.go TestF01DeleteReopenNoOldReceipts"
}
],
"passed": 5,
"total": 5
},
{
"id": "F02",
"status": "pass",
"note": "已测:密码登录后 hello 成功(会话令牌路径可用);顶号/锁定/重置踢线未在本用例穷尽"
"note": "F02a 通过(test/accept/accept_test.go;internal/broker/f02_test.go TestF02PasswordLoginReturnsTokenAndHandshake);F02b 通过(internal/broker/f02_test.go TestF02TakenOverByPasswordLogin、TestF02OldTokenRejectedAfterPasswordLogin);F02c 通过(internal/broker/f02_test.go TestF02TokenReconnectDifferentIPKeepsToken);F02d 通过(internal/broker/f02_test.go TestF02IPLockDoesNotAffectOtherIP、TestF02EndpointLockAllowsTokenReconnect);F02e 通过(internal/broker/f02_test.go TestF02AdminResetPasswordFatal;cmd/nixmsg/fatal_revoked_integration_test.go TestUplinkResetPasswordFatal);F02f 通过(internal/broker/f02_test.go TestF02DBErrorClosesWithout086;internal/broker/broker_test.go TestInternalAuthErrorDoesNotReturnBadPassword)",
"subs": [
{
"id": "F02a",
"summary": "密码登录后 hello / 会话令牌",
"status": "pass",
"evidence": "test/accept/accept_test.go;internal/broker/f02_test.go TestF02PasswordLoginReturnsTokenAndHandshake"
},
{
"id": "F02b",
"summary": "新设备密码登录后旧设备退出",
"status": "pass",
"evidence": "internal/broker/f02_test.go TestF02TakenOverByPasswordLogin、TestF02OldTokenRejectedAfterPasswordLogin"
},
{
"id": "F02c",
"summary": "换 IP 用令牌重连",
"status": "pass",
"evidence": "internal/broker/f02_test.go TestF02TokenReconnectDifferentIPKeepsToken"
},
{
"id": "F02d",
"summary": "两种密码锁定",
"status": "pass",
"evidence": "internal/broker/f02_test.go TestF02IPLockDoesNotAffectOtherIP、TestF02EndpointLockAllowsTokenReconnect"
},
{
"id": "F02e",
"summary": "重置密码后被踢",
"status": "pass",
"evidence": "internal/broker/f02_test.go TestF02AdminResetPasswordFatal;cmd/nixmsg/fatal_revoked_integration_test.go TestUplinkResetPasswordFatal"
},
{
"id": "F02f",
"summary": "服务器故障不误报密码错误",
"status": "pass",
"evidence": "internal/broker/f02_test.go TestF02DBErrorClosesWithout086;internal/broker/broker_test.go TestInternalAuthErrorDoesNotReturnBadPassword"
}
],
"passed": 6,
"total": 6
},
{
"id": "F03",
"status": "pass",
"note": "已测:directory.list 可列出端;关掉连接后约 1s 内 presence.get 为离线;未测:1000 端全表 1s、真拔网线心跳超时"
"status": "partial",
"note": "F03a 通过(test/accept/rest_accept_test.go;internal/app/presence/presence_test.go TestF03PresenceAndDirectory);F03b 通过(test/accept/rest_accept_test.go;internal/app/presence/presence_test.go TestF03PresenceAndDirectory);F03c 未测(环境/时长限制,本波不跑);F03d 未测(环境限制;验收用关连接模拟断线)",
"subs": [
{
"id": "F03a",
"summary": "断开后状态及时变离线",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go;internal/app/presence/presence_test.go TestF03PresenceAndDirectory"
},
{
"id": "F03b",
"summary": "目录可列出",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go;internal/app/presence/presence_test.go TestF03PresenceAndDirectory"
},
{
"id": "F03c",
"summary": "1000 端全表 1s 内返回",
"status": "untested",
"note": "环境/时长限制,本波不跑"
},
{
"id": "F03d",
"summary": "真拔网线后心跳超时离线",
"status": "untested",
"note": "环境限制;验收用关连接模拟断线"
}
],
"passed": 2,
"total": 4
},
{
"id": "F04",
"status": "pass",
"note": "已测:订阅 alice 后上下线各收到 presence;未订阅的 bob/carol 上下线不通知"
"note": "F04a 通过(test/accept/rest_accept_test.go;internal/app/presence/presence_test.go TestF04PresenceWatch)",
"subs": [
{
"id": "F04a",
"summary": "只通知订阅了的端",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go;internal/app/presence/presence_test.go TestF04PresenceWatch"
}
],
"passed": 1,
"total": 1
},
{
"id": "F05",
"status": "pass",
"note": "已测:双端在线单聊送达与确认;崩溃续传见 Q3;消息号冲突/密码门/配额未穷尽"
"note": "F05a 通过(test/accept/accept_test.go runMessagingAccept);F05b 通过(test/chaos/q3_crash_test.go TestQ3CrashSubmitThenRestart);F05c 通过(internal/app/message/submit_test.go TestSubmitTable/conflict);F05d 通过(internal/app/message/submit_test.go TestSubmitTable 对话密码用例);F05e 通过(internal/app/message/submit_test.go TestSubmitTable/quota_exceeded)",
"subs": [
{
"id": "F05a",
"summary": "双端在线单聊送达与确认",
"status": "pass",
"evidence": "test/accept/accept_test.go runMessagingAccept"
},
{
"id": "F05b",
"summary": "崩溃不丢已提交消息",
"status": "pass",
"evidence": "test/chaos/q3_crash_test.go TestQ3CrashSubmitThenRestart"
},
{
"id": "F05c",
"summary": "消息号冲突",
"status": "pass",
"evidence": "internal/app/message/submit_test.go TestSubmitTable/conflict"
},
{
"id": "F05d",
"summary": "密码门生效",
"status": "pass",
"evidence": "internal/app/message/submit_test.go TestSubmitTable 对话密码用例"
},
{
"id": "F05e",
"summary": "配额生效",
"status": "pass",
"evidence": "internal/app/message/submit_test.go TestSubmitTable/quota_exceeded"
}
],
"passed": 5,
"total": 5
},
{
"id": "F06",
"status": "pass",
"note": "已测:群成员收到同一份、发送者不收到自己的;入群前不补未单独覆盖"
"note": "F06a 通过(test/accept/accept_test.go;internal/app/group/group_test.go TestF06GroupSendMembership);F06b 通过(internal/app/group/group_test.go TestF06GroupSendMembership(发送后入群无旧投递))",
"subs": [
{
"id": "F06a",
"summary": "群成员收到同一份、发送者不收到自己的",
"status": "pass",
"evidence": "test/accept/accept_test.go;internal/app/group/group_test.go TestF06GroupSendMembership"
},
{
"id": "F06b",
"summary": "入群前不补",
"status": "pass",
"evidence": "internal/app/group/group_test.go TestF06GroupSendMembership(发送后入群无旧投递)"
}
],
"passed": 2,
"total": 2
},
{
"id": "F07",
"status": "pass",
"note": "已测:256KiB 送达;多 1 字节 body_too_large;max_receive_bytes=1024 时大正文 rejected/too_large 回执且连接仍可用"
"note": "F07a 通过(test/accept/rest_accept_test.go);F07b 通过(test/accept/rest_accept_test.go body_too_large);F07c 通过(test/accept/rest_accept_test.go max_receive_bytes=1024)",
"subs": [
{
"id": "F07a",
"summary": "256 KiB 通过",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go"
},
{
"id": "F07b",
"summary": "超出拒绝",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go body_too_large"
},
{
"id": "F07c",
"summary": "接收上限生效",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go max_receive_bytes=1024"
}
],
"passed": 3,
"total": 3
},
{
"id": "F08",
"status": "pass",
"note": "已测:提交成功后杀进程重启,离线保留消息续传;toxiproxy 弱网见 Q3 chaos 测试;应用层去重未单独断言"
"status": "partial",
"note": "F08a 通过(test/accept/accept_test.go;test/chaos/q3_crash_test.go);F08b 通过(internal/app/message/submit_test.go TestSubmitTable/idempotent_hit);F08c 通过(test/chaos/q3_weak_test.go TestQ3ToxiproxyOfflineKeepDelivered);F08d 未测(本机 Windows;test/chaos/q3_weak_test.go TestQ3NetemUntested)",
"subs": [
{
"id": "F08a",
"summary": "重启后续传",
"status": "pass",
"evidence": "test/accept/accept_test.go;test/chaos/q3_crash_test.go"
},
{
"id": "F08b",
"summary": "应用层不重复(同号同指纹)",
"status": "pass",
"evidence": "internal/app/message/submit_test.go TestSubmitTable/idempotent_hit"
},
{
"id": "F08c",
"summary": "toxiproxy 弱网保留送达",
"status": "pass",
"evidence": "test/chaos/q3_weak_test.go TestQ3ToxiproxyOfflineKeepDelivered"
},
{
"id": "F08d",
"summary": "Linux netem 20% 丢包",
"status": "untested",
"note": "本机 Windows;test/chaos/q3_weak_test.go TestQ3NetemUntested"
}
],
"passed": 3,
"total": 4
},
{
"id": "F09",
"status": "pass",
"note": "已测:选离线保留且接收方稍后上线能送达;超时过期未在本用例拨钟验证"
"note": "F09a 通过(test/accept/accept_test.go);F09b 通过(internal/app/message/delivery_test.go TestDeliveryStateMachine/F09_keep_ttl_expire_via_cleanup)",
"subs": [
{
"id": "F09a",
"summary": "离线保留期内上线送达",
"status": "pass",
"evidence": "test/accept/accept_test.go"
},
{
"id": "F09b",
"summary": "超时过期",
"status": "pass",
"evidence": "internal/app/message/delivery_test.go TestDeliveryStateMachine/F09_keep_ttl_expire_via_cleanup"
}
],
"passed": 2,
"total": 2
},
{
"id": "F10",
"status": "pass",
"note": "已测:grace=3s 短断线重连送到;超宽限丢弃并回执 dropped;杀进程重启后宽限内重连续传"
"note": "F10a 通过(test/accept/rest_accept_test.go);F10b 通过(test/accept/rest_accept_test.go);F10c 通过(test/accept/rest_accept_test.go)",
"subs": [
{
"id": "F10a",
"summary": "短断线送到",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go"
},
{
"id": "F10b",
"summary": "长断线丢弃",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go"
},
{
"id": "F10c",
"summary": "服务器重启后宽限内重连送到",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go"
}
],
"passed": 3,
"total": 3
},
{
"id": "F11",
"status": "pass",
"note": "已测:指定约 2s 后的 send_at_ms 后发送方断开,到点接收方在线收到"
"note": "F11a 通过(test/accept/rest_accept_test.go)",
"subs": [
{
"id": "F11a",
"summary": "发送方离线后到点仍发送",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go"
}
],
"passed": 1,
"total": 1
},
{
"id": "F12",
"status": "pass",
"note": "已测:延迟窗口内撤回对方无 msg/revoked"
"note": "F12a 通过(test/accept/accept_test.go)",
"subs": [
{
"id": "F12a",
"summary": "延迟窗口内撤回对方收不到",
"status": "pass",
"evidence": "test/accept/accept_test.go"
}
],
"passed": 1,
"total": 1
},
{
"id": "F13",
"status": "pass",
"note": "已测:未推送前撤回成功;群部分撤回未覆盖"
"note": "F13a 通过(test/accept/accept_test.go);F13b 通过(internal/app/message/delivery_test.go TestDeliveryStateMachine/F13_recall_race_partial)",
"subs": [
{
"id": "F13a",
"summary": "未推送必撤成功",
"status": "pass",
"evidence": "test/accept/accept_test.go"
},
{
"id": "F13b",
"summary": "群部分确认得到部分撤回",
"status": "pass",
"evidence": "internal/app/message/delivery_test.go TestDeliveryStateMachine/F13_recall_race_partial"
}
],
"passed": 2,
"total": 2
},
{
"id": "F14",
"status": "pass",
"note": "已测:发送方离线期间对方确认,发送方重连后补到 state=accepted 回执"
"note": "F14a 通过(test/accept/rest_accept_test.go)",
"subs": [
{
"id": "F14a",
"summary": "回执能补送给当时离线的发送方",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go"
}
],
"passed": 1,
"total": 1
},
{
"id": "F15",
"status": "pass",
"note": "已测:不带密拒绝、带对后第二条免密、改密失效、对方先发可免密回、拉群须当次密码、5 账号×10 错触发总数锁后正确密也 rate_limited 且已有授权仍可发"
"note": "F15a 通过(test/accept/rest_accept_test.go;internal/app/identity/self_talk_test.go TestF15TalkPasswordAuth);F15b 通过(test/accept/rest_accept_test.go;internal/app/identity/self_talk_test.go TestF15ReplyGrantAndChange);F15c 通过(test/accept/rest_accept_test.go;internal/app/identity/self_talk_test.go);F15d 通过(test/accept/rest_accept_test.go;internal/app/identity/self_talk_test.go TestF15JoinNeedsPasswordDespiteGrant);F15e 通过(test/accept/rest_accept_test.go)",
"subs": [
{
"id": "F15a",
"summary": "输一次记住",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go;internal/app/identity/self_talk_test.go TestF15TalkPasswordAuth"
},
{
"id": "F15b",
"summary": "改密失效",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go;internal/app/identity/self_talk_test.go TestF15ReplyGrantAndChange"
},
{
"id": "F15c",
"summary": "回复免密",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go;internal/app/identity/self_talk_test.go"
},
{
"id": "F15d",
"summary": "进群仍要密码",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go;internal/app/identity/self_talk_test.go TestF15JoinNeedsPasswordDespiteGrant"
},
{
"id": "F15e",
"summary": "防多账号轮流猜",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go"
}
],
"passed": 5,
"total": 5
},
{
"id": "F16",
"status": "pass",
"note": "已测:建群并拉成员后可群发;群主权限/退出/解散同号等未穷尽"
"note": "F16a 通过(test/accept/accept_test.go);F16b 通过(internal/app/group/group_test.go TestF16CreateAddPasswordAndOwner);F16c 通过(internal/app/group/group_test.go TestF16LeaveRemoveDissolve);F16d 通过(internal/app/group/group_test.go TestF16LeaveRemoveDissolve)",
"subs": [
{
"id": "F16a",
"summary": "建群拉成员后可群发",
"status": "pass",
"evidence": "test/accept/accept_test.go"
},
{
"id": "F16b",
"summary": "群主权限",
"status": "pass",
"evidence": "internal/app/group/group_test.go TestF16CreateAddPasswordAndOwner"
},
{
"id": "F16c",
"summary": "退出后不再收到",
"status": "pass",
"evidence": "internal/app/group/group_test.go TestF16LeaveRemoveDissolve"
},
{
"id": "F16d",
"summary": "解散后同编号新群不收旧消息",
"status": "pass",
"evidence": "internal/app/group/group_test.go TestF16LeaveRemoveDissolve"
}
],
"passed": 4,
"total": 4
},
{
"id": "F17",
"status": "pass",
"note": "已测:管理登录、错误密码锁定、无 CSRF 被拒 / 有 CSRF 可通过;管端开通见 F01;管注册见 F23;令牌越权/查记录无正文等未穷尽"
"note": "F17a 通过(test/accept/accept_test.go runAdminAuth);F17b 通过(test/accept/accept_test.go runEndpointCreate);F17c 通过(test/accept/accept_test.go runRegistration;internal/admin/a3_test.go TestRegistrationToggleAndGenerate);F17d 通过(internal/admin/a3_test.go TestGroupsCRUD);F17e 通过(internal/admin/a3_test.go TestMessageDetailHasNoBody);F17f 通过(internal/admin/admin_test.go TestAPITokenAuthAndRestrictions)",
"subs": [
{
"id": "F17a",
"summary": "管理登录、CSRF、错误密码锁定",
"status": "pass",
"evidence": "test/accept/accept_test.go runAdminAuth"
},
{
"id": "F17b",
"summary": "管端开通",
"status": "pass",
"evidence": "test/accept/accept_test.go runEndpointCreate"
},
{
"id": "F17c",
"summary": "管注册",
"status": "pass",
"evidence": "test/accept/accept_test.go runRegistration;internal/admin/a3_test.go TestRegistrationToggleAndGenerate"
},
{
"id": "F17d",
"summary": "管群",
"status": "pass",
"evidence": "internal/admin/a3_test.go TestGroupsCRUD"
},
{
"id": "F17e",
"summary": "查记录响应无正文",
"status": "pass",
"evidence": "internal/admin/a3_test.go TestMessageDetailHasNoBody"
},
{
"id": "F17f",
"summary": "API 令牌可用且不能越权",
"status": "pass",
"evidence": "internal/admin/admin_test.go TestAPITokenAuthAndRestrictions"
}
],
"passed": 6,
"total": 6
},
{
"id": "F18",
"status": "pass",
"note": "已测:确认后 message_bodies 为空;同号重试不再投递;record_retention_days=0 完成后 status=not_found 且消息行消失"
"note": "F18a 通过(test/accept/rest_accept_test.go;internal/app/message/delivery_test.go TestDeliveryStateMachine/F18_body_gone_record_zero_idempotent_kept);F18b 通过(test/accept/rest_accept_test.go);F18c 通过(test/accept/rest_accept_test.go;internal/app/message/submit_test.go TestSubmitTable/idempotent_hit)",
"subs": [
{
"id": "F18a",
"summary": "送达后正文消失",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go;internal/app/message/delivery_test.go TestDeliveryStateMachine/F18_body_gone_record_zero_idempotent_kept"
},
{
"id": "F18b",
"summary": "记录天数 0 时连记录消失",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go"
},
{
"id": "F18c",
"summary": "防重仍在",
"status": "pass",
"evidence": "test/accept/rest_accept_test.go;internal/app/message/submit_test.go TestSubmitTable/idempotent_hit"
}
],
"passed": 3,
"total": 3
},
{
"id": "F19",
"status": "pass",
"note": "已测:仓库内 SDK 接入清单已通过——Go sdk/go/itest_checklist_test.go;JS sdk/js/test/checklist.test.ts;Python sdk/python/tests/test_checklist.py;Java sdk/java ChecklistTest;本波不重跑四套全量(见 RELEASE 第 4 节回归记录)"
"note": "F19a 通过(sdk/go/itest_checklist_test.go;sdk/js/test/checklist.test.ts;sdk/python/tests/test_checklist.py;sdk/java ChecklistTest)",
"subs": [
{
"id": "F19a",
"summary": "四种 SDK 接入清单(仓库内已有测试,本波不重跑全量)",
"status": "pass",
"evidence": "sdk/go/itest_checklist_test.go;sdk/js/test/checklist.test.ts;sdk/python/tests/test_checklist.py;sdk/java ChecklistTest"
}
],
"passed": 1,
"total": 1
},
{
"id": "F20",
"status": "pass",
"note": "已测:裸 MQTT WebSocket 登录、hello、发、收、确认"
"note": "F20a 通过(test/accept/accept_test.go runMessagingAccept)",
"subs": [
{
"id": "F20a",
"summary": "裸 MQTT WebSocket 登录、收、确认、发",
"status": "pass",
"evidence": "test/accept/accept_test.go runMessagingAccept"
}
],
"passed": 1,
"total": 1
},
{
"id": "F21",
"status": "pass",
"note": "已测:同一 listen 端口提供 /healthz、管理 API、注册、WebSocket /mqtt;后台分离端口未测"
"status": "partial",
"note": "F21a 通过(test/accept/accept_test.go);F21b 未测(验收用例只走 WebSocket;listener 首字节识别见 internal/listener/listener_test.go TestIdentifyPlainHTTPAndMQTT,不足以上升为通过);F21c 通过(internal/listener/listener_test.go TestAdminSeparateMQTTClosedAndAdmin404OnListen)",
"subs": [
{
"id": "F21a",
"summary": "同一 listen 端口提供后台、WebSocket、注册",
"status": "pass",
"evidence": "test/accept/accept_test.go"
},
{
"id": "F21b",
"summary": "裸 TCP MQTT 登录收发",
"status": "untested",
"note": "验收用例只走 WebSocket;listener 首字节识别见 internal/listener/listener_test.go TestIdentifyPlainHTTPAndMQTT,不足以上升为通过"
},
{
"id": "F21c",
"summary": "后台可分到单独端口",
"status": "pass",
"evidence": "internal/listener/listener_test.go TestAdminSeparateMQTTClosedAndAdmin404OnListen"
}
],
"passed": 2,
"total": 3
},
{
"id": "F22",
"status": "pass",
"note": "已测:空目录 admin init + serve,/healthz 与 /readyz 成功,密码不在 serve 日志;未测:备份恢复、升级迁移、证书重载、Docker 全量、/metrics 抓取"
"status": "partial",
"note": "F22a 通过(test/accept/accept_test.go runInitHealthz);F22b 通过(cmd/nixmsg/commands_test.go TestBackupVacuumInto);F22c 通过(internal/store/db_test.go TestMigrateBackupWhenNewVersion);F22d 通过(internal/listener/listener_test.go TestCertReloadUsesNewCert);F22e 通过(internal/metrics/metrics_test.go TestMetricsHandlerExposesText;internal/httpx/metrics_test.go TestMetricsGateSharedPort);F22f 未测(镜像未推送;本波未跑 compose 全量)",
"subs": [
{
"id": "F22a",
"summary": "空目录 admin init + serve 健康检查",
"status": "pass",
"evidence": "test/accept/accept_test.go runInitHealthz"
},
{
"id": "F22b",
"summary": "备份",
"status": "pass",
"evidence": "cmd/nixmsg/commands_test.go TestBackupVacuumInto"
},
{
"id": "F22c",
"summary": "升级迁移前备份",
"status": "pass",
"evidence": "internal/store/db_test.go TestMigrateBackupWhenNewVersion"
},
{
"id": "F22d",
"summary": "证书按 mtime 重载",
"status": "pass",
"evidence": "internal/listener/listener_test.go TestCertReloadUsesNewCert"
},
{
"id": "F22e",
"summary": "指标可抓取",
"status": "pass",
"evidence": "internal/metrics/metrics_test.go TestMetricsHandlerExposesText;internal/httpx/metrics_test.go TestMetricsGateSharedPort"
},
{
"id": "F22f",
"summary": "Docker 全量冒烟",
"status": "untested",
"note": "镜像未推送;本波未跑 compose 全量"
}
],
"passed": 5,
"total": 6
},
{
"id": "F23",
"status": "pass",
"note": "已测:开关、错码、对码、换码;输错锁定未在本用例穷尽"
"note": "F23a 通过(test/accept/accept_test.go runRegistration;internal/app/identity/register_test.go TestRegisterF23_*);F23b 通过(internal/app/identity/register_test.go TestRegisterF23_WrongCodeLock)",
"subs": [
{
"id": "F23a",
"summary": "注册开关、安全码校验、换码不影响已注册",
"status": "pass",
"evidence": "test/accept/accept_test.go runRegistration;internal/app/identity/register_test.go TestRegisterF23_*"
},
{
"id": "F23b",
"summary": "输错锁定",
"status": "pass",
"evidence": "internal/app/identity/register_test.go TestRegisterF23_WrongCodeLock"
}
],
"passed": 2,
"total": 2
}
]
}