From 79f0646da8a2fa027b8ef9e025ae1096b8ed3903 Mon Sep 17 00:00:00 2001 From: pwklppg <123456@.com> Date: Sun, 20 Sep 2026 15:55:22 +0800 Subject: [PATCH] chore: normalize salary workflow task ids --- changes/n05-salary-calc/.spec-superflow.yaml | 46 +++++++++---------- .../.superpowers/sdd/execution-plan.json | 18 ++++---- .../sdd/execution-recommendation.json | 10 ++-- .../checkpoints/1.md | 37 +++++++++++++++ .../.superpowers/sdd/reviews/T1.md | 8 ++++ changes/n05-salary-calc/tasks.md | 19 ++++---- 6 files changed, 92 insertions(+), 46 deletions(-) create mode 100644 changes/n05-salary-calc/.superpowers/sdd/plans/r2-eddde134568a3cf09036f21af22f716d287f8e960ca5f23d96bd01a32a4f8511/checkpoints/1.md create mode 100644 changes/n05-salary-calc/.superpowers/sdd/reviews/T1.md diff --git a/changes/n05-salary-calc/.spec-superflow.yaml b/changes/n05-salary-calc/.spec-superflow.yaml index d3e6c61..1b1083b 100644 --- a/changes/n05-salary-calc/.spec-superflow.yaml +++ b/changes/n05-salary-calc/.spec-superflow.yaml @@ -2,18 +2,18 @@ # Derived data. Always rebuildable from artifacts. Lost/corrupt → fall back to content-level detection. # === Core state === -state: exploring -workflow: auto -revision: null +state: approved-for-build +workflow: full +revision: 2 # === Hashes (fast staleness detection) === -artifacts_hash: null -contract_hash: null +artifacts_hash: sha256:1f79edb313023fb4cb069ee751d14107c3a770b840f580cfdb8eb411d42e0eb1 +contract_hash: sha256:ce264c979b71f9f9b4d95881dd1f3fd8a1d62c3d848fd508e26cc5ce5b76d3c0 # === Execution progress === -execution_mode: null -execution_plan_hash: null -execution_plan_revision: null +execution_mode: sdd +execution_plan_hash: sha256:eddde134568a3cf09036f21af22f716d287f8e960ca5f23d96bd01a32a4f8511 +execution_plan_revision: 2 batches_completed: 0 test_result: null spec_merged: false @@ -21,23 +21,23 @@ spec_publication_receipt: null # === Metadata === change_name: n05-salary-calc -last_transition: 2026-09-20T07:28:30.273Z -last_transition_from: null -last_transition_to: null +last_transition: 2026-09-20T07:50:58.240Z +last_transition_from: bridging +last_transition_to: approved-for-build # === Decision points === -dp_0_decisions: null -dp_0_result: null -dp_0_confirmed: null -dp_0_timestamp: null -dp_1_result: null -dp_1_timestamp: null -dp_2_result: null -dp_2_timestamp: null -dp_3_result: null -dp_3_timestamp: null -dp_4_result: null -dp_4_timestamp: null +dp_0_decisions: 变更名称:n05-salary-calc;一句话意图:为已登录 STUDENT 提供按地级行政区配置的城市默认参数、用户覆盖、到手工资估算和历史快照能力。workflow_path=full;选择原因:新增模块、V40/V41 迁移、六个 API、权限、幂等与跨模块注销清理。范围:仅后端;不支持匿名、ADMIN、前端、个人数据导出、薪资参考或 Offer 关联。计算:税前月薪、个人五险一金简化模型、累计预扣;全国目标城市全量配置;历史物理删除,账号注销时清理。约束:城市级不拆区县;用户覆盖优先;政策版本校验;仅 STUDENT;日志不记录金额。优化:保持聚焦,不纳入前端、企业成本、年终奖、年度汇算、管理员维护和薪资大数据。沟通方式:四类规划工件一次生成,完成验证后统一进入 DP-2 审查。artifact_language=zh-CN +dp_0_result: confirmed +dp_0_confirmed: true +dp_0_timestamp: 2026-09-20T07:28:51Z +dp_1_result: confirmed: 后端薪资计算器范围、计算口径、城市政策模型、历史记录生命周期、接口、错误码、隐私与验收标准均已确认 +dp_1_timestamp: 2026-09-20T07:29:03Z +dp_2_result: approved: proposal, 2 delta specs, design, and tasks validated with 22 requirements and 9 implementation tasks +dp_2_timestamp: 2026-09-20T07:37:16Z +dp_3_result: approved: execution contract W1-W4, 22 requirements mapped, no unmapped requirements +dp_3_timestamp: 2026-09-20T07:50:57Z +dp_4_result: sdd: plan revision 2; user-confirmed-revision; 规范化 tasks.md 任务编号以兼容 checkpoint CLI;W1-W4 范围与依赖不变 +dp_4_timestamp: 2026-09-20T07:55:11.103Z dp_5_result: null dp_5_timestamp: null dp_5_decisions: null diff --git a/changes/n05-salary-calc/.superpowers/sdd/execution-plan.json b/changes/n05-salary-calc/.superpowers/sdd/execution-plan.json index 731820a..5dafdcf 100644 --- a/changes/n05-salary-calc/.superpowers/sdd/execution-plan.json +++ b/changes/n05-salary-calc/.superpowers/sdd/execution-plan.json @@ -1,7 +1,7 @@ { "mode": "sdd", - "source": "user-confirmed", - "rationale": "用户确认采用 SDD;按 W1-W4 串行执行并以 review receipt 控制依赖", + "source": "user-confirmed-revision", + "rationale": "规范化 tasks.md 任务编号以兼容 checkpoint CLI;W1-W4 范围与依赖不变", "waves": [ { "id": "W1", @@ -47,10 +47,10 @@ ] } ], - "artifacts_hash": "sha256:1f79edb313023fb4cb069ee751d14107c3a770b840f580cfdb8eb411d42e0eb1", + "artifacts_hash": "sha256:2820966ebe5197fbfd6dfc5c18ff31dc2a11fc6170510bdc35f00a82d1f0b684", "contract_hash": "sha256:ce264c979b71f9f9b4d95881dd1f3fd8a1d62c3d848fd508e26cc5ce5b76d3c0", "workflow": "full", - "revision": 1, + "revision": 2, "recommendation": { "available_modes": [ "inline", @@ -139,17 +139,17 @@ ] } ], - "artifacts_hash": "sha256:1f79edb313023fb4cb069ee751d14107c3a770b840f580cfdb8eb411d42e0eb1", + "artifacts_hash": "sha256:2820966ebe5197fbfd6dfc5c18ff31dc2a11fc6170510bdc35f00a82d1f0b684", "contract_hash": "sha256:ce264c979b71f9f9b4d95881dd1f3fd8a1d62c3d848fd508e26cc5ce5b76d3c0", "workflow": "full", - "execution_plan_revision_at_recommendation": null, - "created_at": "2026-09-20T07:51:06.272Z", - "hash": "sha256:493fc777a6cd5437d94a6b034432cc1d9379156bba780d40baf954e56c447deb" + "execution_plan_revision_at_recommendation": 1, + "created_at": "2026-09-20T07:55:10.974Z", + "hash": "sha256:a57b53ceb85db7eb53d357bbca5af289cd06b89cbfc1f41d73319bdc41289368" }, "selection": { "confirmed": true, "followed_recommendation": true, "acknowledged_non_recommendation": false }, - "hash": "sha256:bae5d637af45064d6ed6290c047ac7ce5e9304d36d509952e2aa81159a357f79" + "hash": "sha256:eddde134568a3cf09036f21af22f716d287f8e960ca5f23d96bd01a32a4f8511" } diff --git a/changes/n05-salary-calc/.superpowers/sdd/execution-recommendation.json b/changes/n05-salary-calc/.superpowers/sdd/execution-recommendation.json index 1f710f6..28f6722 100644 --- a/changes/n05-salary-calc/.superpowers/sdd/execution-recommendation.json +++ b/changes/n05-salary-calc/.superpowers/sdd/execution-recommendation.json @@ -65,10 +65,10 @@ ] } ], - "artifacts_hash": "sha256:1f79edb313023fb4cb069ee751d14107c3a770b840f580cfdb8eb411d42e0eb1", - "contract_hash": null, + "artifacts_hash": "sha256:2820966ebe5197fbfd6dfc5c18ff31dc2a11fc6170510bdc35f00a82d1f0b684", + "contract_hash": "sha256:ce264c979b71f9f9b4d95881dd1f3fd8a1d62c3d848fd508e26cc5ce5b76d3c0", "workflow": "full", - "execution_plan_revision_at_recommendation": null, - "created_at": "2026-09-20T07:37:33.952Z", - "hash": "sha256:94a0df29fc6848ea7aa5c978fdbbcf7543590e84886acc40bb833b702de785f9" + "execution_plan_revision_at_recommendation": 1, + "created_at": "2026-09-20T07:55:10.974Z", + "hash": "sha256:a57b53ceb85db7eb53d357bbca5af289cd06b89cbfc1f41d73319bdc41289368" } diff --git a/changes/n05-salary-calc/.superpowers/sdd/plans/r2-eddde134568a3cf09036f21af22f716d287f8e960ca5f23d96bd01a32a4f8511/checkpoints/1.md b/changes/n05-salary-calc/.superpowers/sdd/plans/r2-eddde134568a3cf09036f21af22f716d287f8e960ca5f23d96bd01a32a4f8511/checkpoints/1.md new file mode 100644 index 0000000..f92b039 --- /dev/null +++ b/changes/n05-salary-calc/.superpowers/sdd/plans/r2-eddde134568a3cf09036f21af22f716d287f8e960ca5f23d96bd01a32a4f8511/checkpoints/1.md @@ -0,0 +1,37 @@ +--- +task_id: "1" +task_hash: "sha256:d6169a29f309b7713b328adf69ad846596c52c63b9ebb92d256b47d444404bc0" +next: "Task 2: create V41 full city policy seed and seed validation tests" +completed: "V40 schema, entities, repositories, migration and repository tests" +evidence: "mvn -Dtest=SalaryMigrationTest,SalaryRepositoryIntegrationTest test: 2/2 passed" +review: "changes/n05-salary-calc/.superpowers/sdd/reviews/T1.md" +risk: "V41 full city policy data collection remains a release gate" +commit_start: "36c0214723a3fdd1714ff7923a4f38de07d7b042" +commit_end: "837c0632c66e6cb9a00e522944f73045258557d6" +created_at: "2026-09-20T07:55:14.538Z" +plan_hash: "sha256:eddde134568a3cf09036f21af22f716d287f8e960ca5f23d96bd01a32a4f8511" +plan_revision: 2 +--- + +# Checkpoint: 1 + +## Next +Task 2: create V41 full city policy seed and seed validation tests + +## Completed +V40 schema, entities, repositories, migration and repository tests + +## Evidence +mvn -Dtest=SalaryMigrationTest,SalaryRepositoryIntegrationTest test: 2/2 passed + +## Review +changes/n05-salary-calc/.superpowers/sdd/reviews/T1.md + +## Risk +V41 full city policy data collection remains a release gate + +## Commit Start +36c0214723a3fdd1714ff7923a4f38de07d7b042 + +## Commit End +837c0632c66e6cb9a00e522944f73045258557d6 diff --git a/changes/n05-salary-calc/.superpowers/sdd/reviews/T1.md b/changes/n05-salary-calc/.superpowers/sdd/reviews/T1.md new file mode 100644 index 0000000..6d44953 --- /dev/null +++ b/changes/n05-salary-calc/.superpowers/sdd/reviews/T1.md @@ -0,0 +1,8 @@ +# Task 1 self-review + +- Verdict: pass +- Scope: V40 schema, salary city policy/history entities, repositories, migration and persistence tests. +- Evidence: `mvn -Dtest=SalaryMigrationTest,SalaryRepositoryIntegrationTest test` -> 2 tests, 0 failures, 0 errors. +- Contract check: table names, required columns, history owner isolation, idempotency-key query, city ordering, and FK/index obligations are implemented. +- Blockers: none. +- Commit: 837c0632c66e6cb9a00e522944f73045258557d6 diff --git a/changes/n05-salary-calc/tasks.md b/changes/n05-salary-calc/tasks.md index f659b47..e794d0a 100644 --- a/changes/n05-salary-calc/tasks.md +++ b/changes/n05-salary-calc/tasks.md @@ -11,15 +11,15 @@ ## Tasks -- [ ] **1. 新增 V40 表结构和薪资领域持久化基础**:修改 `mydreamjob-server/src/main/resources/db/migration/V40__salary_calculator_schema.sql`,新增城市政策与历史表、索引和唯一约束;在 `mydreamjob-server/src/main/java/com/mydreamjob/salarycalculator/` 新增实体和 Repository。完成后 H2/MySQL 可创建两张表,并能按城市编码和用户历史分页查询。证明:`cd mydreamjob-server; mvn -Dtest=SalaryMigrationTest,SalaryRepositoryIntegrationTest test`。依赖:无。 -- [ ] **2. 新增 V41 全量城市政策种子和完整性校验**:修改 `mydreamjob-server/src/main/resources/db/migration/V41__salary_city_policy_seed.sql`,按采集截止日官方行政区划清单写入大陆目标城市政策;在 `mydreamjob-server/src/test/java/com/mydreamjob/salarycalculator/` 新增种子测试。完成后目标城市全量覆盖,编码唯一,字段、比例、上下限、日期和版本均合法。证明:`cd mydreamjob-server; mvn -Dtest=SalaryCityPolicySeedTest,SalaryMigrationTest test`。依赖:1。 -- [ ] **3. 实现城市政策查询接口**:在 `mydreamjob-server/src/main/java/com/mydreamjob/salarycalculator/` 新增城市查询 Service、Controller 和 DTO;修改 `SecurityConfig.java` 明确 `/salary-calculator/**` 认证入口。完成后 `GET /salary-calculator/cities` 返回全部启用城市摘要,`GET /salary-calculator/cities/{cityCode}` 返回完整默认参数,并仅允许 STUDENT。证明:`cd mydreamjob-server; mvn -Dtest=SalaryCityPolicyServiceTest,SalaryCityPolicyControllerTest test`。依赖:1,2。 -- [ ] **4. 实现 BigDecimal 薪资计算引擎**:在 `mydreamjob-server/src/main/java/com/mydreamjob/salarycalculator/` 新增计算器、税率表、输入/结果 DTO 和校验器。完成后基数截断、覆盖优先、个人缴费、大病费用、累计月份、专项附加扣除、累计预扣、税额下限和两位小数结果均有精确单元测试。证明:`cd mydreamjob-server; mvn -Dtest=SalaryCalculationEngineTest test`。依赖:1。 -- [ ] **5. 实现计算并保存接口及政策版本校验**:在 `mydreamjob-server/src/main/java/com/mydreamjob/salarycalculator/` 新增计算 Service、Controller、幂等指纹和事务逻辑;在 `ErrorCode.java` 新增 `9801–9805`。完成后合法请求返回完整结果和历史 ID,版本不匹配返回 `409/9805`,同键重放返回原历史,同键不同请求返回 `409/9804`。证明:`cd mydreamjob-server; mvn -Dtest=SalaryCalculationServiceTest,SalaryCalculationControllerTest,SalaryPolicyVersionIntegrationTest,SalaryIdempotencyIntegrationTest test`。依赖:2,3,4。 -- [ ] **6. 实现历史列表、详情和物理删除**:在 `mydreamjob-server/src/main/java/com/mydreamjob/salarycalculator/` 新增历史 Service、Controller 和响应 DTO。完成后本人历史上限分页、摘要列表、完整详情、物理删除和跨用户 404 隔离均可验证,城市停用不影响旧历史。证明:`cd mydreamjob-server; mvn -Dtest=SalaryHistoryServiceTest,SalaryHistoryControllerTest,SalaryHistoryPrivacyTest test`。依赖:5。 -- [ ] **7. 接入权限、日志和账号注销清理**:修改 `mydreamjob-server/src/main/java/com/mydreamjob/salarycalculator/` 和 `mydreamjob-server/src/main/java/com/mydreamjob/deletion/AccountDeletionCompletionWorker.java`,复用 STUDENT 角色检查、注销守卫和物理清理。完成后非 STUDENT 被拒绝,PENDING 写操作被现有守卫阻止,COMPLETED 时历史物理删除且日志不含金额。证明:`cd mydreamjob-server; mvn -Dtest=SalaryAuthorizationIntegrationTest,SalaryAccountDeletionIntegrationTest,SalaryLoggingPrivacyTest test`。依赖:3,5,6。 -- [ ] **8. 完成模块测试与 OpenAPI/联调文档**:在 `mydreamjob-server/src/test/java/com/mydreamjob/salarycalculator/` 补齐迁移、金额、权限、幂等、并发、历史快照、删除和 E2E 测试;修改 `docs/openapi-rc.json`、`docs/salary-calculator-api.md`、`docs/frontend-integration.md`。完成后六个接口、请求响应、错误码、版本冲突、幂等和计算假设与运行时一致。证明:`cd mydreamjob-server; mvn -Dtest=Salary*Test test`;`python docs/verify_openapi.py`。依赖:1,2,3,4,5,6,7。 -- [ ] **9. 执行全量回归和真实 MySQL/Docker 黑盒验收并更新路线图**:修改 `docs/backend-development-roadmap.md`、`README.md`;在真实 MySQL 环境执行 Flyway、六个接口和账号注销清理验收。完成后全量构建通过,路线图状态更新为已实现/待验收,真实数据库行为与 H2 一致。证明:`cd mydreamjob-server; mvn clean verify`;MySQL/Docker 黑盒脚本与验收记录。依赖:8。 +- [ ] 1 新增 V40 表结构和薪资领域持久化基础**:修改 `mydreamjob-server/src/main/resources/db/migration/V40__salary_calculator_schema.sql`,新增城市政策与历史表、索引和唯一约束;在 `mydreamjob-server/src/main/java/com/mydreamjob/salarycalculator/` 新增实体和 Repository。完成后 H2/MySQL 可创建两张表,并能按城市编码和用户历史分页查询。证明:`cd mydreamjob-server; mvn -Dtest=SalaryMigrationTest,SalaryRepositoryIntegrationTest test`。依赖:无。 +- [ ] 2 新增 V41 全量城市政策种子和完整性校验**:修改 `mydreamjob-server/src/main/resources/db/migration/V41__salary_city_policy_seed.sql`,按采集截止日官方行政区划清单写入大陆目标城市政策;在 `mydreamjob-server/src/test/java/com/mydreamjob/salarycalculator/` 新增种子测试。完成后目标城市全量覆盖,编码唯一,字段、比例、上下限、日期和版本均合法。证明:`cd mydreamjob-server; mvn -Dtest=SalaryCityPolicySeedTest,SalaryMigrationTest test`。依赖:1。 +- [ ] 3 实现城市政策查询接口**:在 `mydreamjob-server/src/main/java/com/mydreamjob/salarycalculator/` 新增城市查询 Service、Controller 和 DTO;修改 `SecurityConfig.java` 明确 `/salary-calculator/**` 认证入口。完成后 `GET /salary-calculator/cities` 返回全部启用城市摘要,`GET /salary-calculator/cities/{cityCode}` 返回完整默认参数,并仅允许 STUDENT。证明:`cd mydreamjob-server; mvn -Dtest=SalaryCityPolicyServiceTest,SalaryCityPolicyControllerTest test`。依赖:1,2。 +- [ ] 4 实现 BigDecimal 薪资计算引擎**:在 `mydreamjob-server/src/main/java/com/mydreamjob/salarycalculator/` 新增计算器、税率表、输入/结果 DTO 和校验器。完成后基数截断、覆盖优先、个人缴费、大病费用、累计月份、专项附加扣除、累计预扣、税额下限和两位小数结果均有精确单元测试。证明:`cd mydreamjob-server; mvn -Dtest=SalaryCalculationEngineTest test`。依赖:1。 +- [ ] 5 实现计算并保存接口及政策版本校验**:在 `mydreamjob-server/src/main/java/com/mydreamjob/salarycalculator/` 新增计算 Service、Controller、幂等指纹和事务逻辑;在 `ErrorCode.java` 新增 `9801–9805`。完成后合法请求返回完整结果和历史 ID,版本不匹配返回 `409/9805`,同键重放返回原历史,同键不同请求返回 `409/9804`。证明:`cd mydreamjob-server; mvn -Dtest=SalaryCalculationServiceTest,SalaryCalculationControllerTest,SalaryPolicyVersionIntegrationTest,SalaryIdempotencyIntegrationTest test`。依赖:2,3,4。 +- [ ] 6 实现历史列表、详情和物理删除**:在 `mydreamjob-server/src/main/java/com/mydreamjob/salarycalculator/` 新增历史 Service、Controller 和响应 DTO。完成后本人历史上限分页、摘要列表、完整详情、物理删除和跨用户 404 隔离均可验证,城市停用不影响旧历史。证明:`cd mydreamjob-server; mvn -Dtest=SalaryHistoryServiceTest,SalaryHistoryControllerTest,SalaryHistoryPrivacyTest test`。依赖:5。 +- [ ] 7 接入权限、日志和账号注销清理**:修改 `mydreamjob-server/src/main/java/com/mydreamjob/salarycalculator/` 和 `mydreamjob-server/src/main/java/com/mydreamjob/deletion/AccountDeletionCompletionWorker.java`,复用 STUDENT 角色检查、注销守卫和物理清理。完成后非 STUDENT 被拒绝,PENDING 写操作被现有守卫阻止,COMPLETED 时历史物理删除且日志不含金额。证明:`cd mydreamjob-server; mvn -Dtest=SalaryAuthorizationIntegrationTest,SalaryAccountDeletionIntegrationTest,SalaryLoggingPrivacyTest test`。依赖:3,5,6。 +- [ ] 8 完成模块测试与 OpenAPI/联调文档**:在 `mydreamjob-server/src/test/java/com/mydreamjob/salarycalculator/` 补齐迁移、金额、权限、幂等、并发、历史快照、删除和 E2E 测试;修改 `docs/openapi-rc.json`、`docs/salary-calculator-api.md`、`docs/frontend-integration.md`。完成后六个接口、请求响应、错误码、版本冲突、幂等和计算假设与运行时一致。证明:`cd mydreamjob-server; mvn -Dtest=Salary*Test test`;`python docs/verify_openapi.py`。依赖:1,2,3,4,5,6,7。 +- [ ] 9 执行全量回归和真实 MySQL/Docker 黑盒验收并更新路线图**:修改 `docs/backend-development-roadmap.md`、`README.md`;在真实 MySQL 环境执行 Flyway、六个接口和账号注销清理验收。完成后全量构建通过,路线图状态更新为已实现/待验收,真实数据库行为与 H2 一致。证明:`cd mydreamjob-server; mvn clean verify`;MySQL/Docker 黑盒脚本与验收记录。依赖:8。 ## Requirement-to-Task Coverage @@ -53,3 +53,4 @@ - `V41` 目标城市全量覆盖、字段合法且采集截止日基线明确;不得以示例城市或缺失城市代替正式发布。 - 六个接口、计算边界、政策版本冲突、幂等并发、用户隔离、物理删除和账号注销清理全部有自动化证据。 - `mvn -Dtest=Salary*Test test`、`mvn clean verify`、`python docs/verify_openapi.py` 和真实 MySQL/Docker 黑盒验收通过后才能进入 release-archivist。 +