Files
yidaima/RuoYi-Vue/docs/superpowers/plans/2026-06-18-business-effect-amount-prompt-fix.md

144 lines
5.1 KiB
Markdown
Raw Normal View History

# Business Effect Amount Prompt Fix Implementation Plan
> **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:** Prevent business blueprint generation from repeatedly producing invalid numeric effect amounts by documenting the safe numeric DSL in both generation and correction prompts.
**Architecture:** Keep validation and runtime behavior unchanged. Add one private prompt helper in `AiGenerateServiceImpl` and reuse it from both prompt builders so their numeric contracts cannot drift.
**Tech Stack:** Java 8, Spring Boot, JUnit 4, Mockito, Maven
---
### Task 1: Lock the prompt contract with regression tests
**Files:**
- Modify: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/AiGenerateServiceImplTest.java`
- [ ] **Step 1: Extend the initial-prompt test**
In `generateBusinessBlueprintUsesSavedDatabaseAndPersistsActions`, assert that the
captured prompt includes the numeric DSL contract:
```java
assertTrue(prompt.contains("INCREASE_NUMBER and DECREASE_NUMBER require"));
assertTrue(prompt.contains("numeric literal or ${param.saved_column}"));
assertTrue(prompt.contains("Do not use arithmetic expressions such as stock - 1"));
```
- [ ] **Step 2: Add an invalid-amount correction test**
Add a test that returns an invalid blueprint first and a valid blueprint second,
then checks the correction prompt:
```java
@Test
public void generateBusinessBlueprintCorrectionPromptExplainsNumericAmountContract()
{
when(frontProjectMapper.selectFrontProjectByUserAndId(7L, 10L)).thenReturn(project());
mockSavedLibraryTables();
when(deepSeekClient.chat(anyString())).thenReturn(
businessBlueprintWithInvalidAmountResponse(),
executableBusinessBlueprintResponse());
service.generateBusinessBlueprint(7L, 10L, businessBlueprintRequest());
ArgumentCaptor<String> promptCaptor = ArgumentCaptor.forClass(String.class);
verify(deepSeekClient, times(2)).chat(promptCaptor.capture());
String correctionPrompt = promptCaptor.getAllValues().get(1);
assertTrue(correctionPrompt.contains("Business effect amount is invalid"));
assertTrue(correctionPrompt.contains("INCREASE_NUMBER and DECREASE_NUMBER require"));
assertTrue(correctionPrompt.contains("numeric literal or ${param.saved_column}"));
assertTrue(correctionPrompt.contains("Do not use arithmetic expressions such as stock - 1"));
}
```
Add this fixture beside the other business-blueprint response helpers:
```java
private String businessBlueprintWithInvalidAmountResponse()
{
return executableBusinessBlueprintResponse().replace(
"\"amount\": \"1\"", "\"amount\": \"stock - 1\"");
}
```
- [ ] **Step 3: Run the focused tests and verify RED**
Run:
```powershell
mvn -pl ruoyi-generator -Dtest=AiGenerateServiceImplTest test
```
Expected: the new prompt assertions fail because the numeric contract is absent.
### Task 2: Reuse one numeric DSL constraint in both prompts
**Files:**
- Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/AiGenerateServiceImpl.java`
- Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/AiGenerateServiceImplTest.java`
- [ ] **Step 1: Add the shared prompt helper**
Add:
```java
private void appendBusinessBlueprintNumericExpressionConstraints(StringBuilder prompt)
{
prompt.append("INCREASE_NUMBER and DECREASE_NUMBER require targetTable, targetField, conditionFields, and a non-empty amount.\n");
prompt.append("NUMBER_GTE.compareValue, effects.amount, and effects.minValue must be a numeric literal or ${param.saved_column}, where saved_column is a real saved database column. DECREASE_NUMBER.minValue may be omitted and defaults to 0.\n");
prompt.append("Do not use arithmetic expressions such as stock - 1, SQL fragments, units, or descriptive text in numeric expression fields.\n");
}
```
- [ ] **Step 2: Call the helper from the initial prompt**
Immediately after the supported effects and value requirements in
`buildBusinessBlueprintPrompt`, call:
```java
appendBusinessBlueprintNumericExpressionConstraints(prompt);
```
- [ ] **Step 3: Call the helper from the correction prompt**
After appending the validation error in `buildBusinessBlueprintCorrectionPrompt`,
call:
```java
appendBusinessBlueprintNumericExpressionConstraints(prompt);
```
- [ ] **Step 4: Run the focused test suite and verify GREEN**
Run:
```powershell
mvn -pl ruoyi-generator -Dtest=AiGenerateServiceImplTest test
```
Expected: all `AiGenerateServiceImplTest` tests pass.
- [ ] **Step 5: Run the generator module regression suite**
Run:
```powershell
mvn -pl ruoyi-generator test
```
Expected: the module finishes with zero failures and zero errors.
- [ ] **Step 6: Inspect the final diff**
Run:
```powershell
git diff --check
git diff -- ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/AiGenerateServiceImpl.java ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/AiGenerateServiceImplTest.java
```
Expected: no whitespace errors and only the numeric prompt contract plus its
regression tests are added.