5.7 KiB
AI 单测目标引用与异步竞态修复实施计划
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: 让 AI 单测插件稳定按 master...DEV_1156339215001460262 分析真实 ft-loancapital-core 增量,并阻止较早的项目加载结果覆盖用户后来选择的项目。
Architecture: 将 Git 比较终点从隐式 HEAD 提升为 AiTestRequest.targetRef,增量分析和临时 worktree 均解析同一目标引用;工作区改动仅允许叠加在目标引用等于当前 HEAD 的场景。项目元数据加载使用单调递增的请求令牌,只有最新令牌可以更新 JavaFX 控件。
Tech Stack: Java 17(WorkUtils 运行时)、JavaFX、Spring、Maven、JUnit 5、Mockito、Git CLI
Global Constraints
- 真实业务项目使用
D:/bestpay-srdcloud/ft-loancapital-core;该目录不存在时集成回归测试使用 JUnit assumption 跳过。 - 默认基线为
master;目标引用可填写分支或 Commit,并对当前真实场景使用DEV_1156339215001460262。 - 不修改真实业务仓库、不切换其分支、不提交其文件。
- 不触碰 WorkUtils 中现有未跟踪的审计文档、截图和 SQL 文件。
- 全程单线程实施,不使用子代理。
Task 1: 显式 baseline 与 targetRef 的增量分析
Files:
- Modify:
src/main/java/com/example/workutils/biz/aitest/git/GitIncrementAnalyzer.java - Modify:
src/main/java/com/example/workutils/biz/aitest/application/AiTestRequest.java - Modify:
src/main/java/com/example/workutils/biz/aitest/application/AiTestWorkflow.java - Modify:
src/main/java/com/example/workutils/biz/aitest/git/TemporaryWorktreeManager.java - Test:
src/test/java/com/example/workutils/biz/aitest/git/GitIncrementAnalyzerTest.java - Test:
src/test/java/com/example/workutils/biz/aitest/git/TemporaryWorktreeManagerTest.java - Test:
src/test/java/com/example/workutils/biz/aitest/application/AiTestWorkflowTest.java
Interfaces:
-
Produces:
GitIncrementAnalyzer.analyze(Path, String baseline, String targetRef, boolean includeWorkingTree) -
Produces:
TemporaryWorktreeManager.create(Path, String targetRef, boolean includeWorkingTree) -
Produces:
AiTestRequest.targetRef() -
Step 1: 写失败测试:构造
master与未检出的DEV_*分支,断言分析结果来自 DEV 而不是当前 HEAD;断言临时 worktree 检出目标引用。 -
Step 2: 运行聚焦测试确认 RED:
mvn -Dtest=GitIncrementAnalyzerTest,TemporaryWorktreeManagerTest,AiTestWorkflowTest test,预期因新签名或仍使用 HEAD 而失败。 -
Step 3: 最小实现:解析 baseline/target commit,以其 merge-base 到 target commit 生成 patch;workflow 将 request 的 targetRef 贯穿到分析和 worktree。
-
Step 4: 运行聚焦测试确认 GREEN:同一 Maven 命令全部通过。
Task 2: 真实 ft-loancapital-core 回归
Files:
- Create:
src/test/java/com/example/workutils/biz/aitest/project/FtLoanCapitalCoreRegressionTest.java
Interfaces:
-
Consumes:
MavenProjectAnalyzer.analyze(Path) -
Consumes:
GitIncrementAnalyzer.analyze(Path, "master", "DEV_1156339215001460262", false) -
Step 1: 写真实只读回归测试:断言解析到
ft-loancapital-core-start,并断言 master 到 DEV 的增量包含已知 service Java 文件及新增行。 -
Step 2: 运行测试确认结果:
mvn -Dtest=FtLoanCapitalCoreRegressionTest test;真实仓库存在时必须通过,不存在时仅跳过。
Task 3: 项目加载的最新请求获胜
Files:
- Create:
src/main/java/com/example/workutils/biz/aitest/LatestRequestGate.java - Modify:
src/main/java/com/example/workutils/biz/aitest/AiTestPane.java - Create:
src/test/java/com/example/workutils/biz/aitest/LatestRequestGateTest.java - Modify:
src/test/java/com/example/workutils/biz/aitest/AiTestPaneArchitectureTest.java
Interfaces:
-
Produces:
LatestRequestGate.next()返回请求令牌。 -
Produces:
LatestRequestGate.isLatest(long)仅对最后发出的令牌返回 true。 -
Step 1: 写失败测试:先申请旧令牌再申请新令牌,断言旧令牌失效、新令牌有效;架构测试断言项目加载成功与失败回调都经过 gate。
-
Step 2: 运行聚焦测试确认 RED:
mvn -Dtest=LatestRequestGateTest,AiTestPaneArchitectureTest test,预期类不存在或 Pane 未使用 gate。 -
Step 3: 最小实现:
loadProject发出令牌,清空旧模块;后台成功或失败回到 FX 线程时仅允许最新请求更新 UI。 -
Step 4: 运行聚焦测试确认 GREEN:同一 Maven 命令全部通过。
Task 4: UI 参数与完整验证
Files:
- Modify:
src/main/java/com/example/workutils/biz/aitest/AiTestPane.java - Modify:
src/test/java/com/example/workutils/biz/aitest/AiTestPaneArchitectureTest.java
Interfaces:
-
UI 提供
baselineField(默认master)与targetRefField(默认HEAD,加载项目后显示当前分支)。 -
Step 1: 写失败测试:断言 Pane 存在独立 targetRef 字段,且 baseline 默认 master。
-
Step 2: 最小实现:把 targetRef 写入
AiTestRequest,校验 baseline、targetRef、项目和模块均已选择。 -
Step 3: 运行 AI 单测插件测试:
mvn -Dtest='com.example.workutils.biz.aitest.**' test。 -
Step 4: 运行全量验证:
mvn test、mvn -DskipTests package、git diff --check。 -
Step 5: 检查
git status仅包含本次文件和用户原有未跟踪文件,然后提交到 WorkUtilsmaster。