feat: expand EasyCode software factory workflows
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user