You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
10 KiB
10 KiB
n05-salary-calc 执行合同
Intent Lock
- 变更名称:
n05-salary-calc - 要解决的问题:当前后端没有城市职工社保、公积金、大病固定费和到手工资估算能力,求职者无法基于地级行政区默认参数、个人覆盖项和累计预扣法获得可复核的结果,也无法保存独立的历史快照。
- 范围内:新增仅限登录
STUDENT的/salary-calculator/**后端模块;新增V40/V41城市政策和历史表;实现城市参数、用户覆盖、工资计算、累计预扣、历史保存/查询/物理删除、政策版本校验、幂等并发、账号注销清理、OpenAPI 和测试。 - 范围外:前端页面、ADMIN 政策维护、企业成本、年终奖/股权/多收入来源、年度汇算、非居民税制、薪资参考、Offer 关联、个人数据导出和港澳台政策。
Approved Behavior
- 已批准需求摘要:
specs/salary-calculation/spec.md与specs/salary-history/spec.md中的 22 条### Requirement全部批准,覆盖:- STUDENT-only 权限和六个接口。
- 城市政策目录、地级行政区粒度、版本元数据和全量种子。
- 用户覆盖优先、基数截断、个人五险一金、大病固定费。
- 累计月份、专项附加扣除、居民个人综合所得累计预扣、到手工资和完整结果拆解。
- 输入范围、金额精度和
9801–9805错误语义。 - 自动保存历史、完整可重建快照、幂等并发、个人隔离、分页、不可编辑、物理删除和长期保留。
- 历史不进业务审计日志或数据导出,账号注销时物理清理。
V40/V41迁移、全量城市覆盖、唯一键、索引和完整性约束。
- 关键场景:城市政策版本冲突不生成历史;覆盖基数超出城市范围返回 400;
monthIndex表示累计计税月份;累计税额不产生负数;相同幂等键只创建一条历史;跨用户历史统一返回 404;城市停用不影响旧历史;账号注销完成删除全部薪资历史。 - 验收检查:六个接口的 MockMvc/E2E 场景,城市种子完整性测试,金额边界测试,幂等并发测试,权限与注销测试,OpenAPI 校验,真实 MySQL/Docker 黑盒验收。
- 未映射需求:无。22 条需求均在
tasks.md的 Requirement-to-Task Coverage 中有任务覆盖。
Design Constraints
- 架构约束:新增
com.mydreamjob.salarycalculator模块,复用ApiResponse、PageResponse、SecurityContext、UserRepository、DeletionGuardInterceptor和现有注销事务;不引入外部服务。 - 接口约束:只提供以下接口,并仅在成功请求时创建历史:
GET /salary-calculator/citiesGET /salary-calculator/cities/{cityCode}POST /salary-calculator/calculationsGET /salary-calculator/calculationsGET /salary-calculator/calculations/{id}DELETE /salary-calculator/calculations/{id}
- 计算约束:使用
BigDecimal;城市只提供社保/公积金/大病参数;全国税率表、速算扣除数、5,000 元减除费用和税率版本在代码中维护;expectedPolicyVersion必须匹配。 - 数据约束:只新增
salary_city_policy和salary_calculation_history;城市编码唯一,历史用户+幂等键唯一;输入、最终参数和结果 JSON 快照必须可独立读取;账号注销物理删除历史。 - 隐私约束:日志不得记录金额、基数、税额或快照;历史不写业务审计日志、不进入个人数据导出。
Execution Plan
- 推荐模式:
sdd。任务跨越迁移、查询、计算、历史、权限/注销、测试和文档多个波次,需要显式依赖和 review receipt。 - 用户确认状态:DP-4 待 DP-3 通过后由
build-executor重新运行ssf execution recommend并由用户确认。本合同不把推荐自动视为已选择。 - 执行计划命令:待 DP-4 确认后由
build-executor执行ssf execution plan <change-dir> --mode sdd --confirm --reason "<用户确认原因>" --wave ...。 - 计划 revision / artifact hash:由
ssf execution plan或状态重建记录。
Execution Waves
Wave W1 - 数据基础
- Wave ID:
W1 - 任务:
1,2 - 依赖 wave:无
- 策略:
serial - 目标:完成
V40表结构、领域持久化基础、V41城市政策种子及全量种子校验。 - 输入:
V39现状、官方行政区划清单、公开城市政策资料、实体/Repository 约定。 - 输出:两张业务表、实体、Repository、城市种子和迁移/种子测试。
- 完成标准:H2/MySQL 迁移成功;目标城市全覆盖、编码唯一、字段合法、日期不晚于采集截止日、版本号非空。
- Review gate:报告
.superpowers/sdd/reviews/W1.md;wave 完成时记录 base/head SHA;ssf execution review必须为pass。
Wave W2 - 城市查询与计算引擎
- Wave ID:
W2 - 任务:
3,4 - 依赖 wave:
W1 - 策略:
serial - 目标:实现城市列表/详情接口和精确薪资计算引擎。
- 输入:W1 实体/Repository/城市种子、公式约束、DTO 与校验规则。
- 输出:城市 Service/Controller/DTO;计算器、税率表、输入/结果 DTO;服务与控制器测试。
- 完成标准:STUDENT 可查询城市默认参数;基数截断、覆盖率、个人缴费、累计预扣、税额下限和金额精度测试通过。
- Review gate:报告
.superpowers/sdd/reviews/W2.md;wave 完成时记录 base/head SHA;ssf execution review必须为pass。
Wave W3 - 历史、幂等、权限与注销
- Wave ID:
W3 - 任务:
5,6,7 - 依赖 wave:
W2 - 策略:
serial - 目标:实现计算并保存、历史 CRUD、政策版本校验、幂等并发、用户隔离、注销守卫和物理清理。
- 输入:W2 计算服务和城市接口;历史表/Repository;现有错误码与注销事务。
- 输出:计算/历史 Service 与 Controller、
9801–9805、幂等指纹、注销清理调用及集成测试。 - 完成标准:正常计算返回历史 ID;版本冲突返回 409/9805;同键重放返回原历史;跨用户 404;删除物理生效;注销完成无历史残留。
- Review gate:报告
.superpowers/sdd/reviews/W3.md;wave 完成时记录 base/head SHA;ssf execution review必须为pass。
Wave W4 - 发布证明与文档
- Wave ID:
W4 - 任务:
8,9 - 依赖 wave:
W3 - 策略:
serial - 目标:补齐模块测试、OpenAPI、API/联调文档、README/路线图,执行全量回归和真实 MySQL/Docker 黑盒验收。
- 输入:W1–W3 全部代码和测试;现有 OpenAPI 校验脚本。
- 输出:六个接口的静态契约和文档、模块专项测试、全量构建结果、MySQL 黑盒验收记录。
- 完成标准:
mvn -Dtest=Salary*Test test、mvn clean verify、python docs/verify_openapi.py通过;真实 MySQL/Docker 迁移与六个接口验收通过。 - Review gate:报告
.superpowers/sdd/reviews/W4.md;wave 完成时记录 base/head SHA;ssf execution review必须为pass。
Test Obligations
- 必须先从失败测试开始的行为:城市种子完整性和范围校验;基数截断与用户覆盖;个人养老/医疗/失业/公积金/大病费用;累计月份与累计预扣;政策版本冲突;幂等重放/冲突;跨用户历史隔离;物理删除;账号注销清理。
- 必需的边界情况:基数下限、上限和区间中值;比例 0;大病固定费为 0;专项附加扣除为 0 和大于月薪;
monthIndex=1和 12;税率档边界;重复删除;城市停用后的旧历史;金额超过两位小数;size=101。 - 回归敏感区域:现有账号注销守卫和完成事务;用户角色读取;
ErrorCode新增值;SecurityConfig路由;既有 OpenAPI 路径总数;H2 与 MySQL 对 JSON/唯一约束的行为差异。 - 测试命令:专项
mvn -Dtest=Salary*Test test;完整mvn clean verify;契约python docs/verify_openapi.py;发布门禁另执行真实 MySQL/Docker 黑盒验收。
Execution Mode
- 可用方式与推荐:
inline、batch-inline、sdd;推荐sdd。 - 用户确认的模式:DP-4 阶段确认,本合同不代替用户选择。
- 推荐理由 / 项目事实:9 个任务拆为 4 个有依赖的 wave,跨数据库迁移、计算、API、权限和历史生命周期,必须保留 review receipt。
- 非推荐选择的风险确认:不适用;若用户选择非推荐模式,必须由 CLI 记录
--acknowledge-recommendation。 - 执行计划命令:由
build-executor在 DP-4 后运行。 - 允许的修订:仅可保留或升级为
sdd;新 revision 必须先刷新 recommendation,并清除旧 receipt。 - 计划 revision / artifact hash:执行计划保存后记录。
Verification Dimensions
| 维度 | 状态 | 发现 |
|---|---|---|
| Completeness | Pending | 等待实现与测试证据 |
| Correctness | Pending | 等待金额、迁移和接口验证 |
| Coherence | Pending | 等待实现与规格逐条对照 |
总体结论:Pending,等待实现和 wave review 证据。
Review Gates
- 强制审查点:每个 Execution Wave 完成后必须记录
ssf execution review的passreceipt;W1–W4 的报告路径分别由 wave 完成时生成。 - 阻塞类别:依赖 wave 未通过、review receipt 为
fail、缺失或过期、合同与 specs 不一致、城市种子不完整。 - 收口条件:W1–W4 均有当前 revision 的
passreceipt;专项/全量/OpenAPI/MySQL 证据存在;没有未映射需求或未解决的 P1/P2 审查问题。
Escalation Rules
- 何时回退到
specifying:目标城市定义、计算口径、权限语义、历史生命周期或错误码发生变化;新增或删除已批准需求;必须扩大范围到前端、ADMIN、奖金、年度汇算或薪资参考。 - 何时回退到
bridging:execution-contract.md与 proposal/spec/design/tasks 不一致;执行 wave 改变依赖或完成标准;城市数据或注销集成方案改变架构约束。 - 何时不得继续实现:DP-3 未批准、没有当前 execution plan、依赖 wave 未 pass、review receipt 缺失/过期、V41 无法满足目标城市全量覆盖、发现未处理的安全/隐私回归。
- DP-4 规则:
sdd模式仅在重新运行 recommendation 并由用户显式确认后写入 execution plan;不得由 Agent 自动代替用户确认。