- approve only appListSecurityEvents and appGetSecurityEvent at operation level - keep appAcknowledgeSecurityEvent needs_verification - add HTTP+DB completed approval IT and update coverage gates/docs
9.4 KiB
P1R Account Security Events 状态推进
日期:2026-06-13
结论
本轮只推进 Account 用户安全事件只读 2 个 operation-level completed approval:
account:appListSecurityEventsaccount:appGetSecurityEvent
Account 仍不是整域 completed。account:appAcknowledgeSecurityEvent 继续保持 dedicated/needs_verification/requiresCommandId=true。
本轮未修改 OpenAPI,未修改 Account 业务实现,未修改 SQL migration,未把 account 加入 domain-level completed allowlist。
工作区与基线
工作区:
/Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0
基线 HEAD:
304f665 test(p1r): 收口 Content Admin RiskAction completed approval 门禁
实施前 coverage summary:
233 145 88 0 0 0
实施后 coverage summary:
233 147 86 0 0 0
实施后 Account 状态:
total=33
completed=12
needs_verification=21
incomplete=0
genericPersistence=0
ssePlaceholder=0
目标 operation 状态:
appListSecurityEvents dedicated completed false GET /app-api/muse/account/security-events
appGetSecurityEvent dedicated completed false GET /app-api/muse/account/security-events/{eventId}
必须保持 needs_verification:
appAcknowledgeSecurityEvent dedicated needs_verification true POST /app-api/muse/account/security-events/{eventId}/acknowledge
修改范围
本轮修改:
muse-cloud/scripts/p1r-audit-api-coverage.pydocs/superpowers/reports/p1r-api-coverage.jsondocs/superpowers/reports/p1r-api-coverage.mdmuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rApiCoverageReportTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rAccountRealApiGateTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rEventsRealApiGateTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rAiRealApiGateTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rKnowledgeRealApiGateTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rMarketRealApiGateTest.javamuse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rAccountSecurityEventsCompletedApprovalIT.javadocs/agent-specs/.agentdocs/agent-specs/2026-06-13-P1RAccountSecurityEventsCompletedApproval审阅版.mddocs/agent-specs/2026-06-13-P1RAccountSecurityEventsCompletedApproval执行版.mddocs/memorys/2026-06-13-P1RAccountSecurityEvents状态推进.md
未修改:
- 7 个 OpenAPI。
- Account 业务实现。
- SQL migration。
- Account domain-level completed allowlist。
- 既有 Account focused tests。
TDD evidence
RED 阶段先修改 P1R gate 期望值和 2 个 Security Events read operation completed 断言,在旧 scanner/report 下运行 focused P1R gates,预期失败已出现:
Tests run: 49, Failures: 10, Errors: 0, Skipped: 0
BUILD FAILURE
失败点来自旧 report 仍为 completed=145 / needsVerification=88,Account 仍为 10 completed / 23 needs_verification,以及 appListSecurityEvents / appGetSecurityEvent 仍为 needs_verification;没有编译错误或无关测试失败。
GREEN 阶段只把两个 account:* key 加入 scanner operation-level allowlist,重新生成 report,并完成 HTTP+DB _test evidence 和 focused gates。
MockMvc HTTP 入口 + DB 证据
新增:
muse-cloud/muse-server/src/test/java/cn/iocoder/muse/server/framework/api/P1rAccountSecurityEventsCompletedApprovalIT.java
验证方式:
- 使用 Spring Mock web context +
MockMvc。 - 通过
/app-api/muse/account/security-events与/app-api/muse/account/security-events/{eventId}HTTP 入口进入AppAccountSecurityController。 - 使用真实
AccountSecurityServiceImpl、mapper、tenant SQL interceptor 和 PostgreSQL_test数据库。 - Flyway clean/migrate V1-V21。
- 在隔离
_test库创建 test-localmember_userfixture,满足requireUser()的真实MemberUserMapper.selectById前置;该 fixture 不计入 P1R production schema evidence。 - 密码只从环境变量读取,拒绝 JVM password system property 和 JDBC credential query。
@AfterAll恢复p1r.flyway.url/p1r.flyway.user,避免污染同一 Surefire JVM 后续 Flyway 测试。
单类验证数据库:
muse_p1r_account_security_events_completed_approval_test
通过结果:
P1rAccountSecurityEventsCompletedApprovalIT: tests=8, failures=0, errors=0, skipped=0
覆盖内容:
- 拒绝非
_test数据库、JVM password system property 和 JDBC credential query。 - V1-V21 schema gate,覆盖
muse_member_security_event、muse_account_security_event_ack、muse_account_event_publish_outbox和 test-localmember_user。 idx_muse_member_security_user、trg_muse_member_security_updated_at、uk_muse_account_security_event_ack_command、ack user/event 索引和 updated_at trigger。- list 支持 severity、分页、owner/tenant 隔离,并合并当前用户最新 ack。
- detail 支持 eventId + owner 查询,返回脱敏 IP、脱敏 userAgent、脱敏 description / suggestedActions。
- 请求参数不能覆盖当前登录 owner。
- missing / invalid API version、invalid severity、missing user、missing event、非数字 eventId、跨 owner、跨 tenant 都不泄露目标事实。
- read happy/error 都使用
row_to_json(t)::text对member_user、muse_member_security_event、muse_account_security_event_ack、muse_account_command、muse_account_audit、muse_account_event_publish_outbox做全表快照 no-write。
组合验证
Account focused Maven 命令通过,muse-server 部分:
P1rAccountSecurityEventsCompletedApprovalIT: tests=8, failures=0, errors=0, skipped=0
P1rApiCoverageReportTest: tests=6, failures=0, errors=0, skipped=0
focused muse-server total: tests=19, failures=0, errors=0, skipped=0
member-server focused XML:
AccountSecurityServiceTest: tests=8, failures=0, errors=0, skipped=0
AppAccountSecurityControllerTest: tests=6, failures=0, errors=0, skipped=0
AccountSecurityEventAckMapperTest: tests=4, failures=0, errors=0, skipped=0
MemberSecurityEventMapperTest: tests=2, failures=0, errors=0, skipped=0
AccountConvertTest: tests=9, failures=0, errors=0, skipped=0
focused member-server total: tests=29, failures=0, errors=0, skipped=0
Account V20 Flyway 迁移门禁使用真实 PostgreSQL _test 库:
muse_p1r_account_security_events_flyway_test
通过结果:
P1rAccountEventsPublishFlywayMigrationIT: tests=4, failures=0, errors=0, skipped=0
flyway_success=true
migrations_executed=20
successful_migration_count=20
target_schema_version=20
flyway_latest=20:extend account events publish outbox
P1R mixed gates:
P1rApiCoverageReportTest: tests=6, failures=0, errors=0, skipped=0
P1rAccountRealApiGateTest: tests=5, failures=0, errors=0, skipped=0
P1rEventsRealApiGateTest: tests=7, failures=0, errors=0, skipped=0
P1rAiRealApiGateTest: tests=7, failures=0, errors=0, skipped=0
P1rKnowledgeRealApiGateTest: tests=8, failures=0, errors=0, skipped=0
P1rMarketRealApiGateTest: tests=6, failures=0, errors=0, skipped=0
P1rContentRealApiGateTest: tests=5, failures=0, errors=0, skipped=0
P1rMetaRealApiGateTest: tests=5, failures=0, errors=0, skipped=0
mixed total: tests=49, failures=0, errors=0, skipped=0
fresh implementation testing review 后处理:
Banach testing/data-integrity review: PASS
P2 residual: 新增 IT 未直接覆盖 X-API-Version: 2
处理结果: 已补 invalid API version HTTP+DB no-write 断言
复验: P1rAccountSecurityEventsCompletedApprovalIT 8/8 pass
复验: Account focused muse-server 19/19 pass
复验: P1R mixed gates 49/49 pass
复验: scanner/report 233/147/86
复验: XML 防空跑与 protected diff 通过
scanner / report 验证
命令:
python3 muse-cloud/scripts/p1r-audit-api-coverage.py --check
结果:
Generated docs/superpowers/reports/p1r-api-coverage.json
Generated docs/superpowers/reports/p1r-api-coverage.md
233 147 86 0 0 0
Account 聚合:
33 12 21 0 0 0
目标 operation 明细:
account appListSecurityEvents dedicated completed false GET /app-api/muse/account/security-events
account appGetSecurityEvent dedicated completed false GET /app-api/muse/account/security-events/{eventId}
account appAcknowledgeSecurityEvent dedicated needs_verification true POST /app-api/muse/account/security-events/{eventId}/acknowledge
protected diff
通过:
git diff --check
通过:
git diff --quiet -- docs/api-contracts muse-cloud/muse-module-member/muse-module-member-server/src/main/java muse-cloud/sql/muse
git diff --cached --quiet -- docs/api-contracts muse-cloud/muse-module-member/muse-module-member-server/src/main/java muse-cloud/sql/muse
结论:
protected_diff_empty=true
后续边界
本轮完成候选只代表 2 个 Account Security Events read operation-level completed approval。
仍不代表:
- Account 33/33 completed。
account:appAcknowledgeSecurityEventcompleted。- Account remaining 21 completed。
- Market remaining completed。
- Content remaining completed。
- 总 P1R completed。
提交或 push 前仍需要 fresh implementation spec/correctness review + fresh implementation quality/data-integrity/testing review 双 PASS。