Browse Source

chore: normalize salary workflow task ids

backup/master-local-20261012
pwklppg 1 month ago
parent
commit
79f0646da8
  1. 46
      changes/n05-salary-calc/.spec-superflow.yaml
  2. 18
      changes/n05-salary-calc/.superpowers/sdd/execution-plan.json
  3. 10
      changes/n05-salary-calc/.superpowers/sdd/execution-recommendation.json
  4. 37
      changes/n05-salary-calc/.superpowers/sdd/plans/r2-eddde134568a3cf09036f21af22f716d287f8e960ca5f23d96bd01a32a4f8511/checkpoints/1.md
  5. 8
      changes/n05-salary-calc/.superpowers/sdd/reviews/T1.md
  6. 19
      changes/n05-salary-calc/tasks.md

46
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. # Derived data. Always rebuildable from artifacts. Lost/corrupt → fall back to content-level detection.
# === Core state === # === Core state ===
state: exploring state: approved-for-build
workflow: auto workflow: full
revision: null revision: 2
# === Hashes (fast staleness detection) === # === Hashes (fast staleness detection) ===
artifacts_hash: null artifacts_hash: sha256:1f79edb313023fb4cb069ee751d14107c3a770b840f580cfdb8eb411d42e0eb1
contract_hash: null contract_hash: sha256:ce264c979b71f9f9b4d95881dd1f3fd8a1d62c3d848fd508e26cc5ce5b76d3c0
# === Execution progress === # === Execution progress ===
execution_mode: null execution_mode: sdd
execution_plan_hash: null execution_plan_hash: sha256:eddde134568a3cf09036f21af22f716d287f8e960ca5f23d96bd01a32a4f8511
execution_plan_revision: null execution_plan_revision: 2
batches_completed: 0 batches_completed: 0
test_result: null test_result: null
spec_merged: false spec_merged: false
@ -21,23 +21,23 @@ spec_publication_receipt: null
# === Metadata === # === Metadata ===
change_name: n05-salary-calc change_name: n05-salary-calc
last_transition: 2026-09-20T07:28:30.273Z last_transition: 2026-09-20T07:50:58.240Z
last_transition_from: null last_transition_from: bridging
last_transition_to: null last_transition_to: approved-for-build
# === Decision points === # === Decision points ===
dp_0_decisions: 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: null dp_0_result: confirmed
dp_0_confirmed: null dp_0_confirmed: true
dp_0_timestamp: null dp_0_timestamp: 2026-09-20T07:28:51Z
dp_1_result: null dp_1_result: confirmed: 后端薪资计算器范围、计算口径、城市政策模型、历史记录生命周期、接口、错误码、隐私与验收标准均已确认
dp_1_timestamp: null dp_1_timestamp: 2026-09-20T07:29:03Z
dp_2_result: null dp_2_result: approved: proposal, 2 delta specs, design, and tasks validated with 22 requirements and 9 implementation tasks
dp_2_timestamp: null dp_2_timestamp: 2026-09-20T07:37:16Z
dp_3_result: null dp_3_result: approved: execution contract W1-W4, 22 requirements mapped, no unmapped requirements
dp_3_timestamp: null dp_3_timestamp: 2026-09-20T07:50:57Z
dp_4_result: null dp_4_result: sdd: plan revision 2; user-confirmed-revision; 规范化 tasks.md 任务编号以兼容 checkpoint CLI;W1-W4 范围与依赖不变
dp_4_timestamp: null dp_4_timestamp: 2026-09-20T07:55:11.103Z
dp_5_result: null dp_5_result: null
dp_5_timestamp: null dp_5_timestamp: null
dp_5_decisions: null dp_5_decisions: null

18
changes/n05-salary-calc/.superpowers/sdd/execution-plan.json

@ -1,7 +1,7 @@
{ {
"mode": "sdd", "mode": "sdd",
"source": "user-confirmed", "source": "user-confirmed-revision",
"rationale": "用户确认采用 SDD;按 W1-W4 串行执行并以 review receipt 控制依赖", "rationale": "规范化 tasks.md 任务编号以兼容 checkpoint CLI;W1-W4 范围与依赖不变",
"waves": [ "waves": [
{ {
"id": "W1", "id": "W1",
@ -47,10 +47,10 @@
] ]
} }
], ],
"artifacts_hash": "sha256:1f79edb313023fb4cb069ee751d14107c3a770b840f580cfdb8eb411d42e0eb1", "artifacts_hash": "sha256:2820966ebe5197fbfd6dfc5c18ff31dc2a11fc6170510bdc35f00a82d1f0b684",
"contract_hash": "sha256:ce264c979b71f9f9b4d95881dd1f3fd8a1d62c3d848fd508e26cc5ce5b76d3c0", "contract_hash": "sha256:ce264c979b71f9f9b4d95881dd1f3fd8a1d62c3d848fd508e26cc5ce5b76d3c0",
"workflow": "full", "workflow": "full",
"revision": 1, "revision": 2,
"recommendation": { "recommendation": {
"available_modes": [ "available_modes": [
"inline", "inline",
@ -139,17 +139,17 @@
] ]
} }
], ],
"artifacts_hash": "sha256:1f79edb313023fb4cb069ee751d14107c3a770b840f580cfdb8eb411d42e0eb1", "artifacts_hash": "sha256:2820966ebe5197fbfd6dfc5c18ff31dc2a11fc6170510bdc35f00a82d1f0b684",
"contract_hash": "sha256:ce264c979b71f9f9b4d95881dd1f3fd8a1d62c3d848fd508e26cc5ce5b76d3c0", "contract_hash": "sha256:ce264c979b71f9f9b4d95881dd1f3fd8a1d62c3d848fd508e26cc5ce5b76d3c0",
"workflow": "full", "workflow": "full",
"execution_plan_revision_at_recommendation": null, "execution_plan_revision_at_recommendation": 1,
"created_at": "2026-09-20T07:51:06.272Z", "created_at": "2026-09-20T07:55:10.974Z",
"hash": "sha256:493fc777a6cd5437d94a6b034432cc1d9379156bba780d40baf954e56c447deb" "hash": "sha256:a57b53ceb85db7eb53d357bbca5af289cd06b89cbfc1f41d73319bdc41289368"
}, },
"selection": { "selection": {
"confirmed": true, "confirmed": true,
"followed_recommendation": true, "followed_recommendation": true,
"acknowledged_non_recommendation": false "acknowledged_non_recommendation": false
}, },
"hash": "sha256:bae5d637af45064d6ed6290c047ac7ce5e9304d36d509952e2aa81159a357f79" "hash": "sha256:eddde134568a3cf09036f21af22f716d287f8e960ca5f23d96bd01a32a4f8511"
} }

10
changes/n05-salary-calc/.superpowers/sdd/execution-recommendation.json

@ -65,10 +65,10 @@
] ]
} }
], ],
"artifacts_hash": "sha256:1f79edb313023fb4cb069ee751d14107c3a770b840f580cfdb8eb411d42e0eb1", "artifacts_hash": "sha256:2820966ebe5197fbfd6dfc5c18ff31dc2a11fc6170510bdc35f00a82d1f0b684",
"contract_hash": null, "contract_hash": "sha256:ce264c979b71f9f9b4d95881dd1f3fd8a1d62c3d848fd508e26cc5ce5b76d3c0",
"workflow": "full", "workflow": "full",
"execution_plan_revision_at_recommendation": null, "execution_plan_revision_at_recommendation": 1,
"created_at": "2026-09-20T07:37:33.952Z", "created_at": "2026-09-20T07:55:10.974Z",
"hash": "sha256:94a0df29fc6848ea7aa5c978fdbbcf7543590e84886acc40bb833b702de785f9" "hash": "sha256:a57b53ceb85db7eb53d357bbca5af289cd06b89cbfc1f41d73319bdc41289368"
} }

37
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

8
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

19
changes/n05-salary-calc/tasks.md

@ -11,15 +11,15 @@
## Tasks ## 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`。依赖:无。 - [ ] 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。 - [ ] 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。 - [ ] 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。 - [ ] 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。 - [ ] 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。 - [ ] 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。 - [ ] 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。 - [ ] 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。 - [ ] 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 ## Requirement-to-Task Coverage
@ -53,3 +53,4 @@
- `V41` 目标城市全量覆盖、字段合法且采集截止日基线明确;不得以示例城市或缺失城市代替正式发布。 - `V41` 目标城市全量覆盖、字段合法且采集截止日基线明确;不得以示例城市或缺失城市代替正式发布。
- 六个接口、计算边界、政策版本冲突、幂等并发、用户隔离、物理删除和账号注销清理全部有自动化证据。 - 六个接口、计算边界、政策版本冲突、幂等并发、用户隔离、物理删除和账号注销清理全部有自动化证据。
- `mvn -Dtest=Salary*Test test`、`mvn clean verify`、`python docs/verify_openapi.py` 和真实 MySQL/Docker 黑盒验收通过后才能进入 release-archivist。 - `mvn -Dtest=Salary*Test test`、`mvn clean verify`、`python docs/verify_openapi.py` 和真实 MySQL/Docker 黑盒验收通过后才能进入 release-archivist。

Loading…
Cancel
Save