persona-harness 0.3.2-alpha.3 → 0.3.3-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/dist/cli/plan-prompts.js +4 -0
- package/dist/cli/plan-prompts.js.map +1 -1
- package/dist/cli/plan.js +92 -1
- package/dist/cli/plan.js.map +1 -1
- package/dist/cli/workflow-output.js +5 -0
- package/dist/cli/workflow-output.js.map +1 -1
- package/dist/cli/workflow-status.js +47 -4
- package/dist/cli/workflow-status.js.map +1 -1
- package/dist/phase0/java-role-discovery.js +26 -1
- package/dist/phase0/java-role-discovery.js.map +1 -1
- package/docs/current/release/v0.3.2-alpha.3-on-off-ab-review.md +220 -0
- package/docs/current/release/v0.3.3-alpha.0-release-notes.md +132 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,35 @@ This project uses npm prerelease versions for tester-facing alpha builds. During
|
|
|
8
8
|
|
|
9
9
|
No unreleased changes yet.
|
|
10
10
|
|
|
11
|
+
## [0.3.3-alpha.0] - 2026-06-23
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- Added Existing Project Adaptation Mode to `ph plan`, with automatic `greenfield` versus `existing-code` project mode output.
|
|
16
|
+
- Added existing Java source discovery for package root and layer/style hints so brownfield projects can prefer their current package, naming, repository, DTO, and domain flow.
|
|
17
|
+
- Added plan/prompt/workflow guidance that existing code wins over greenfield guidance.
|
|
18
|
+
- Added README read coverage fallback from `.persona/evidence` when filled workflow reports omit explicit README ranges.
|
|
19
|
+
- Added existing Spring-style role discovery coverage for Controller, Service, Repository, DTO, Domain, Exception, and Test files.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Changed Java Role Read Follow-up to ask for representative role files instead of every discovered Java file, while still recording full role-discovery evidence.
|
|
24
|
+
- Relaxed workflow finish classification when raw-shell checklist text remains but final verification was rerun through `npx ph bearshell`.
|
|
25
|
+
|
|
26
|
+
### Verification
|
|
27
|
+
|
|
28
|
+
- Existing Spring-style smoke used a current local tarball install, `npx ph init`, accepted plan workflow, and OpenCode `openai/gpt-5.4-mini-fast` with the short prompt `README.md 보고 구현해줘`.
|
|
29
|
+
- Observed `Mode: existing-code`, package root `com.acme.todo`, layer hints `domain, dto, repository, service, web`.
|
|
30
|
+
- Generated code stayed in the existing `web/service/repository/dto/domain` package flow rather than forcing `presentation/application/domain/infrastructure`.
|
|
31
|
+
- Java role discovery evidence covered Controller, Service, Repository, DTO, Domain, and Test files.
|
|
32
|
+
- `gradle test`, `gradle build`, and HTTP smoke passed through the generated project.
|
|
33
|
+
|
|
34
|
+
### Known Gaps
|
|
35
|
+
|
|
36
|
+
- OpenCode may still inspect package metadata such as `node_modules/persona-harness/package.json` before settling into the workflow rail.
|
|
37
|
+
- Agents may still perform an initial raw shell probe before rerunning final verification through `npx ph bearshell`.
|
|
38
|
+
- Long README continuation remains the next product gap; full TDD workflow is still future scope.
|
|
39
|
+
|
|
11
40
|
## [0.3.2-alpha.3] - 2026-06-23
|
|
12
41
|
|
|
13
42
|
### Added
|
package/dist/cli/plan-prompts.js
CHANGED
|
@@ -10,6 +10,8 @@ export function createPlanOnlyPrompt() {
|
|
|
10
10
|
"긴 README.md나 plan은 한 번에 다 읽었다고 가정하지 말고, Read 출력이 잘리면 `npx ph bearshell --shell 'sed -n \"1,220p\" README.md'`, `npx ph bearshell --shell 'sed -n \"221,440p\" README.md'`처럼 범위를 나눠 끝까지 읽어줘.",
|
|
11
11
|
"",
|
|
12
12
|
"계획에는 요구사항 요약, Java/Spring Gradle 기술 선택, package/layer 구조, storage/persistence 선택, repository boundary, DTO boundary, domain behavior 기준을 포함해줘.",
|
|
13
|
+
"기존 Java/Spring 코드가 있으면 먼저 package/layer/naming/repository/DTO/domain style을 발견하고, existing code wins over greenfield guidance 원칙으로 그 구조에 맞춘 계획을 작성해줘.",
|
|
14
|
+
"새 프로젝트처럼 기존 코드가 없을 때만 0% -> 80% greenfield baseline package flow를 기본값으로 사용해줘.",
|
|
13
15
|
"",
|
|
14
16
|
"계획이 불확실하면 구현하지 말고 질문이나 가정을 .persona/workflow/plan.md에 명확히 남겨줘.",
|
|
15
17
|
"",
|
|
@@ -33,6 +35,8 @@ export function createImplementationPrompt() {
|
|
|
33
35
|
"구현 보고서의 Read Coverage에는 체크만 하지 말고 `README read method`, `README ranges read`, `Plan read method`, `Plan ranges read`, `Unread ranges`를 실제 실행 증거 기준으로 적어줘.",
|
|
34
36
|
"",
|
|
35
37
|
"구현 중에는 Java/Spring Gradle backend Clean Code 범위를 유지하고, plan에 없는 frontend/infra/desktop 범위로 확장하지 마.",
|
|
38
|
+
"기존 Java/Spring 코드가 있으면 먼저 package/layer/naming/repository/DTO/domain style을 읽고, existing code wins over greenfield guidance 원칙으로 현재 프로젝트 흐름에 맞춰 구현해줘.",
|
|
39
|
+
"새 프로젝트처럼 기존 코드가 없을 때만 0% -> 80% greenfield baseline package flow를 기본값으로 사용해줘.",
|
|
36
40
|
"실행 가능한 Spring Boot 앱이면 `bootJar`를 비활성화하지 마. `gradle build` 출력에 `:bootJar SKIPPED`가 나오면 build 통과로 기록하지 말고, Spring Boot plugin / Gradle wrapper / JDK toolchain 호환성을 맞춰 다시 검증해줘.",
|
|
37
41
|
"가능하면 생성 프로젝트에 Gradle wrapper를 포함하고, 검증은 `./gradlew test`, `./gradlew build`, `./gradlew bootRun` 또는 Windows `gradlew.bat` 기준으로 기록해줘.",
|
|
38
42
|
"",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-prompts.js","sourceRoot":"","sources":["../../src/cli/plan-prompts.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,yIAAyI;QACzI,EAAE;QACF,8GAA8G;QAC9G,uGAAuG;QACvG,EAAE;QACF,4HAA4H;QAC5H,EAAE;QACF,6LAA6L;QAC7L,EAAE;QACF,gJAAgJ;QAChJ,EAAE;QACF,gEAAgE;QAChE,EAAE;QACF,8HAA8H;QAC9H,EAAE;QACF,6FAA6F;KAC9F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO;QACL,mFAAmF;QACnF,EAAE;QACF,sLAAsL;QACtL,EAAE;QACF,8GAA8G;QAC9G,uGAAuG;QACvG,EAAE;QACF,6IAA6I;QAC7I,EAAE;QACF,6LAA6L;QAC7L,2JAA2J;QAC3J,EAAE;QACF,oGAAoG;QACpG,gLAAgL;QAChL,sIAAsI;QACtI,EAAE;QACF,0GAA0G;QAC1G,EAAE;QACF,mIAAmI;QACnI,EAAE;QACF,iMAAiM;QACjM,EAAE;QACF,6FAA6F;KAC9F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"plan-prompts.js","sourceRoot":"","sources":["../../src/cli/plan-prompts.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,yIAAyI;QACzI,EAAE;QACF,8GAA8G;QAC9G,uGAAuG;QACvG,EAAE;QACF,4HAA4H;QAC5H,EAAE;QACF,6LAA6L;QAC7L,EAAE;QACF,gJAAgJ;QAChJ,uJAAuJ;QACvJ,+EAA+E;QAC/E,EAAE;QACF,gEAAgE;QAChE,EAAE;QACF,8HAA8H;QAC9H,EAAE;QACF,6FAA6F;KAC9F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO;QACL,mFAAmF;QACnF,EAAE;QACF,sLAAsL;QACtL,EAAE;QACF,8GAA8G;QAC9G,uGAAuG;QACvG,EAAE;QACF,6IAA6I;QAC7I,EAAE;QACF,6LAA6L;QAC7L,2JAA2J;QAC3J,EAAE;QACF,oGAAoG;QACpG,uJAAuJ;QACvJ,+EAA+E;QAC/E,gLAAgL;QAChL,sIAAsI;QACtI,EAAE;QACF,0GAA0G;QAC1G,EAAE;QACF,mIAAmI;QACnI,EAAE;QACF,iMAAiM;QACjM,EAAE;QACF,6FAA6F;KAC9F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
|
package/dist/cli/plan.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { join, resolve } from "node:path";
|
|
3
3
|
import process from "node:process";
|
|
4
4
|
import { loadBackendPolicyOverlay } from "../phase0/policy-overlay.js";
|
|
@@ -13,6 +13,8 @@ export const PLAN_PATH = ".persona/workflow/plan.md";
|
|
|
13
13
|
export const IMPLEMENTATION_REPORT_PATH = ".persona/workflow/implementation-report.md";
|
|
14
14
|
export const REVIEW_REPORT_PATH = ".persona/workflow/review-report.md";
|
|
15
15
|
const README_PATH = "README.md";
|
|
16
|
+
const EXISTING_CODE_SCAN_ROOTS = ["src/main/java", "src/test/java"];
|
|
17
|
+
const EXISTING_CODE_SCAN_LIMIT = 40;
|
|
16
18
|
function readReadmeHeading(projectDir) {
|
|
17
19
|
const readmePath = join(projectDir, README_PATH);
|
|
18
20
|
if (!existsSync(readmePath)) {
|
|
@@ -52,6 +54,93 @@ function readmeLines(projectDir) {
|
|
|
52
54
|
heading === undefined ? "README status: missing" : `README heading: ${heading}`,
|
|
53
55
|
];
|
|
54
56
|
}
|
|
57
|
+
function collectJavaSourceFiles(projectDir) {
|
|
58
|
+
const javaFiles = [];
|
|
59
|
+
const visit = (relativeDir) => {
|
|
60
|
+
if (javaFiles.length >= EXISTING_CODE_SCAN_LIMIT) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const absoluteDir = join(projectDir, relativeDir);
|
|
64
|
+
if (!existsSync(absoluteDir)) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
for (const entry of readdirSync(absoluteDir).sort()) {
|
|
68
|
+
const relativePath = `${relativeDir}/${entry}`;
|
|
69
|
+
const absolutePath = join(projectDir, relativePath);
|
|
70
|
+
const stat = statSync(absolutePath);
|
|
71
|
+
if (stat.isDirectory()) {
|
|
72
|
+
visit(relativePath);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (stat.isFile() && entry.endsWith(".java")) {
|
|
76
|
+
javaFiles.push(relativePath);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
for (const root of EXISTING_CODE_SCAN_ROOTS) {
|
|
81
|
+
visit(root);
|
|
82
|
+
}
|
|
83
|
+
return javaFiles;
|
|
84
|
+
}
|
|
85
|
+
function packageNameFromJavaFile(projectDir, relativePath) {
|
|
86
|
+
const match = /^package\s+([^;]+);/m.exec(readFileSync(join(projectDir, relativePath), "utf8"));
|
|
87
|
+
return match?.[1]?.trim();
|
|
88
|
+
}
|
|
89
|
+
function commonPackagePrefix(packages) {
|
|
90
|
+
if (packages.length === 0) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
const segments = packages[0]?.split(".") ?? [];
|
|
94
|
+
let prefixLength = segments.length;
|
|
95
|
+
for (const packageName of packages.slice(1)) {
|
|
96
|
+
const current = packageName.split(".");
|
|
97
|
+
while (prefixLength > 0 && segments.slice(0, prefixLength).join(".") !== current.slice(0, prefixLength).join(".")) {
|
|
98
|
+
prefixLength -= 1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return prefixLength > 0 ? segments.slice(0, prefixLength).join(".") : undefined;
|
|
102
|
+
}
|
|
103
|
+
function layerNamesFromJavaFiles(files) {
|
|
104
|
+
const layerCandidates = new Set();
|
|
105
|
+
for (const file of files) {
|
|
106
|
+
for (const segment of file.split("/")) {
|
|
107
|
+
if (/^(presentation|application|domain|infrastructure|controller|service|repository|dto|web|global|config|exception)$/i.test(segment)) {
|
|
108
|
+
layerCandidates.add(segment);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return [...layerCandidates].sort();
|
|
113
|
+
}
|
|
114
|
+
function projectModeLines(projectDir) {
|
|
115
|
+
const javaFiles = collectJavaSourceFiles(projectDir);
|
|
116
|
+
if (javaFiles.length === 0) {
|
|
117
|
+
return [
|
|
118
|
+
"## Project Mode",
|
|
119
|
+
"",
|
|
120
|
+
"Mode: greenfield",
|
|
121
|
+
"",
|
|
122
|
+
"- Goal: create a consistent 0% -> 80% Java/Spring backend baseline for a new project.",
|
|
123
|
+
"- Use the Java/Spring backend baseline package flow when README/profile do not define an existing convention.",
|
|
124
|
+
"- Keep the baseline advisory: user requirements and explicit instructions still win.",
|
|
125
|
+
];
|
|
126
|
+
}
|
|
127
|
+
const packages = javaFiles
|
|
128
|
+
.map((file) => packageNameFromJavaFile(projectDir, file))
|
|
129
|
+
.filter((packageName) => packageName !== undefined);
|
|
130
|
+
const packageRoot = commonPackagePrefix(packages);
|
|
131
|
+
const layers = layerNamesFromJavaFiles(javaFiles);
|
|
132
|
+
return [
|
|
133
|
+
"## Project Mode",
|
|
134
|
+
"",
|
|
135
|
+
"Mode: existing-code",
|
|
136
|
+
"",
|
|
137
|
+
`- Existing source files detected: ${javaFiles.length}`,
|
|
138
|
+
packageRoot === undefined ? "- Existing package root: unknown" : `- Existing package root: ${packageRoot}`,
|
|
139
|
+
layers.length === 0 ? "- Existing layer/style hints: none detected" : `- Existing layer/style hints: ${layers.join(", ")}`,
|
|
140
|
+
"- existing code wins over greenfield guidance: follow current package, naming, layer, repository, DTO, and domain style before introducing the baseline structure.",
|
|
141
|
+
"- If current code conflicts with profile guidance, record the conflict in this plan before implementation.",
|
|
142
|
+
];
|
|
143
|
+
}
|
|
55
144
|
function createPlanDraft(projectDir) {
|
|
56
145
|
const policyOverlaySummary = policyOverlayLines(projectDir);
|
|
57
146
|
return [
|
|
@@ -67,6 +156,8 @@ function createPlanDraft(projectDir) {
|
|
|
67
156
|
...profileSummaryLines(projectDir),
|
|
68
157
|
...(policyOverlaySummary.length > 0 ? ["", ...policyOverlaySummary] : []),
|
|
69
158
|
"",
|
|
159
|
+
...projectModeLines(projectDir),
|
|
160
|
+
"",
|
|
70
161
|
"## Architecture / Technology Plan",
|
|
71
162
|
"",
|
|
72
163
|
"- [ ] 요구사항의 핵심 유스케이스를 README 기준으로 정리한다.",
|
package/dist/cli/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/cli/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/cli/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -98,6 +98,11 @@ export function passedImplementOutput() {
|
|
|
98
98
|
"4. Continue 220-line ranges until the README line count is covered.",
|
|
99
99
|
"5. Record README ranges read in `.persona/workflow/implementation-report.md`.",
|
|
100
100
|
"",
|
|
101
|
+
"Project mode:",
|
|
102
|
+
"- If existing Java/Spring source files already exist, discover their package/layer/naming/repository/DTO/domain style first.",
|
|
103
|
+
"- existing code wins over greenfield guidance: match the current project before introducing the baseline package flow.",
|
|
104
|
+
"- If no source files exist, use the Java/Spring greenfield 0% -> 80% baseline.",
|
|
105
|
+
"",
|
|
101
106
|
"Required context:",
|
|
102
107
|
"- README.md",
|
|
103
108
|
"- .persona/project-profile.jsonc",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-output.js","sourceRoot":"","sources":["../../src/cli/workflow-output.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workflow-output.js","sourceRoot":"","sources":["../../src/cli/workflow-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,12 +32,43 @@ function hasFilesDeep(dirPath) {
|
|
|
32
32
|
function readExistingFiles(filePaths) {
|
|
33
33
|
return filePaths.filter((filePath) => existsSync(filePath)).map((filePath) => readFileSync(filePath, "utf8")).join("\n");
|
|
34
34
|
}
|
|
35
|
+
function hasReadmeEvidenceDeep(dirPath) {
|
|
36
|
+
if (!existsSync(dirPath)) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
for (const entry of readdirSync(dirPath)) {
|
|
40
|
+
const entryPath = join(dirPath, entry);
|
|
41
|
+
const stat = statSync(entryPath);
|
|
42
|
+
if (stat.isDirectory()) {
|
|
43
|
+
if (hasReadmeEvidenceDeep(entryPath)) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (!stat.isFile()) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const lowerEntry = entry.toLowerCase();
|
|
52
|
+
if (lowerEntry.includes("readme.md")) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
if (!lowerEntry.endsWith(".json")) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const evidenceText = readFileSync(entryPath, "utf8");
|
|
59
|
+
if (/["/\\]README\.md["/\\]?|README\.md/i.test(evidenceText)) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
35
65
|
const RAW_SHELL_PATTERN = /raw shell|직접\s*썼|직접\s*사용|raw\s+command/i;
|
|
36
66
|
const DIRECT_RULES_READ_PATTERN = /(?:read|읽)[^\n]*(?:\.persona\/rules|\.persona\\rules)|\.persona\/rules\/|\.persona\\rules\\/i;
|
|
37
67
|
const FINAL_VERIFICATION_PATTERN = /(?:\.\/)?gradlew?\s+(?:test|build|bootRun)\b|gradle\s+(?:test|build|bootRun)\b|bootRun\b|curl\b/i;
|
|
38
68
|
const RAW_FINAL_VERIFICATION_PATTERN = /(?:raw shell|직접\s*썼|직접\s*사용|raw\s+command)[^\n]*(?:final verification|최종\s*검증)|(?:final verification|최종\s*검증)[^\n]*(?:raw shell|직접\s*썼|직접\s*사용|raw\s+command)/i;
|
|
39
69
|
const RAW_WITHOUT_BEARSHELL_PATTERN = /(?:raw shell|직접\s*썼|직접\s*사용|raw\s+command)[^\n]*(?:bearshell)[^\n]*(?:not provided|not used|없|않|못|미사용|제공되지)/i;
|
|
40
70
|
const FINAL_VERIFICATION_RERUN_PATTERN = /(?:final verification|최종\s*검증)[^\n]*(?:rerun|re-run|다시\s*실행|재실행|다시\s*검증)[^\n]*(?:bearshell|npx\s+ph\s+bearshell)|(?:final verification|최종\s*검증)[^\n]*(?:bearshell|npx\s+ph\s+bearshell)[^\n]*(?:rerun|re-run|다시\s*실행|재실행|다시\s*검증)|(?:bearshell|npx\s+ph\s+bearshell)[^\n]*(?:rerun|re-run|다시\s*실행|재실행|다시\s*검증)[^\n]*(?:final verification|최종\s*검증)/i;
|
|
71
|
+
const RAW_SHELL_TEMPLATE_CHECKLIST_PATTERN = /raw shell을 직접 썼다면|if raw shell/i;
|
|
41
72
|
const README_RANGES_FIELD_PATTERN = /^-\s*README ranges read:\s*(.*)$/i;
|
|
42
73
|
const README_RANGES_HEADING_PATTERN = /^##+\s*README ranges read:?\s*$/i;
|
|
43
74
|
const READ_COVERAGE_STOP_PATTERN = /^-\s*(?:Plan read method|Plan ranges read|Unread ranges|Read evidence notes):/i;
|
|
@@ -97,6 +128,13 @@ function readCoverage(projectDir, implementationStatus) {
|
|
|
97
128
|
readCoverageFinding: "PASS",
|
|
98
129
|
};
|
|
99
130
|
}
|
|
131
|
+
if (hasReadmeEvidenceDeep(join(projectDir, EVIDENCE_DIR))) {
|
|
132
|
+
return {
|
|
133
|
+
readCoverage: "README read evidence observed",
|
|
134
|
+
readCoverageBlocking: false,
|
|
135
|
+
readCoverageFinding: "PASS",
|
|
136
|
+
};
|
|
137
|
+
}
|
|
100
138
|
return {
|
|
101
139
|
readCoverage: "README.md exists but README ranges read is empty",
|
|
102
140
|
readCoverageBlocking: true,
|
|
@@ -118,11 +156,16 @@ function commandDiscipline(projectDir, implementationStatus, reviewStatus) {
|
|
|
118
156
|
const hasBearshell = reportText.includes("npx ph bearshell");
|
|
119
157
|
const hasRawShell = RAW_SHELL_PATTERN.test(reportText);
|
|
120
158
|
const hasDirectRulesRead = DIRECT_RULES_READ_PATTERN.test(reportText);
|
|
121
|
-
const
|
|
122
|
-
const
|
|
123
|
-
const
|
|
159
|
+
const lines = reportText.split(/\r?\n/);
|
|
160
|
+
const hasFinalVerification = lines.some((line) => FINAL_VERIFICATION_PATTERN.test(line));
|
|
161
|
+
const hasFinalVerificationRerun = lines.some((line) => FINAL_VERIFICATION_RERUN_PATTERN.test(line));
|
|
162
|
+
const hasRawWithoutBearshell = lines.some((line) => !RAW_SHELL_TEMPLATE_CHECKLIST_PATTERN.test(line)
|
|
163
|
+
&& !FINAL_VERIFICATION_RERUN_PATTERN.test(line)
|
|
164
|
+
&& RAW_WITHOUT_BEARSHELL_PATTERN.test(line));
|
|
165
|
+
const hasRawFinalVerification = !hasFinalVerificationRerun && lines.some((line) => !RAW_SHELL_TEMPLATE_CHECKLIST_PATTERN.test(line)
|
|
166
|
+
&& !FINAL_VERIFICATION_RERUN_PATTERN.test(line)
|
|
124
167
|
&& (RAW_FINAL_VERIFICATION_PATTERN.test(line)
|
|
125
|
-
|| (!line.includes("npx ph bearshell") && RAW_SHELL_PATTERN.test(line) && FINAL_VERIFICATION_PATTERN.test(line)))) || (hasRawWithoutBearshell && hasFinalVerification);
|
|
168
|
+
|| (!line.includes("npx ph bearshell") && RAW_SHELL_PATTERN.test(line) && FINAL_VERIFICATION_PATTERN.test(line)))) || (!hasFinalVerificationRerun && hasRawWithoutBearshell && hasFinalVerification);
|
|
126
169
|
if (hasRawFinalVerification) {
|
|
127
170
|
return {
|
|
128
171
|
commandDiscipline: "raw shell used for final verification; rerun test/build/bootRun through `npx ph bearshell`",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-status.js","sourceRoot":"","sources":["../../src/cli/workflow-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACzE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,OAAO,MAAM,cAAc,CAAA;AAkBlC,MAAM,SAAS,GAAG,2BAA2B,CAAA;AAC7C,MAAM,0BAA0B,GAAG,4CAA4C,CAAA;AAC/E,MAAM,kBAAkB,GAAG,oCAAoC,CAAA;AAC/D,MAAM,YAAY,GAAG,mBAAmB,CAAA;AACxC,MAAM,WAAW,GAAG,WAAW,CAAA;AAE/B,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;IACtE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAA;AACxC,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;QAChC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,SAA4B;IACrD,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC1H,CAAC;AAED,MAAM,iBAAiB,GAAG,yCAAyC,CAAA;AACnE,MAAM,yBAAyB,GAAG,8FAA8F,CAAA;AAChI,MAAM,0BAA0B,GAAG,kGAAkG,CAAA;AACrI,MAAM,8BAA8B,GAAG,gKAAgK,CAAA;AACvM,MAAM,6BAA6B,GAAG,8GAA8G,CAAA;AACpJ,MAAM,gCAAgC,GAAG,qVAAqV,CAAA;
|
|
1
|
+
{"version":3,"file":"workflow-status.js","sourceRoot":"","sources":["../../src/cli/workflow-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,18 @@ import { createInjectionBlock } from "./injection.js";
|
|
|
3
3
|
import { isInstalledPersonaHarnessPackageFile } from "./target-file.js";
|
|
4
4
|
const JAVA_PATH_PATTERN = /(?:[A-Za-z]:)?(?:\/|\.{1,2}\/)?[^\s"'`<>|]*src\/(?:main|test)\/java\/[^\s"'`<>|]+?\.java\b/g;
|
|
5
5
|
const DISCOVERY_TOOL_NAMES = new Set(["glob", "ls", "list", "find", "bash", "shell", "bearshell"]);
|
|
6
|
+
const FOLLOW_UP_ROLE_ORDER = [
|
|
7
|
+
"controller",
|
|
8
|
+
"service",
|
|
9
|
+
"repository",
|
|
10
|
+
"request-dto",
|
|
11
|
+
"response-dto",
|
|
12
|
+
"domain",
|
|
13
|
+
"exception",
|
|
14
|
+
"test",
|
|
15
|
+
"entity",
|
|
16
|
+
"java-common",
|
|
17
|
+
];
|
|
6
18
|
export function isJavaRoleDiscoveryTool(toolName) {
|
|
7
19
|
const normalizedToolName = toolName.toLowerCase();
|
|
8
20
|
return (DISCOVERY_TOOL_NAMES.has(normalizedToolName) ||
|
|
@@ -46,6 +58,18 @@ function uniqueSharedSkills(injections) {
|
|
|
46
58
|
}
|
|
47
59
|
return [...skillsByKey.values()];
|
|
48
60
|
}
|
|
61
|
+
function representativeInjectionsByRole(injections) {
|
|
62
|
+
const injectionsByRole = new Map();
|
|
63
|
+
for (const injection of injections) {
|
|
64
|
+
if (!injectionsByRole.has(injection.fileRole)) {
|
|
65
|
+
injectionsByRole.set(injection.fileRole, injection);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return FOLLOW_UP_ROLE_ORDER.flatMap((role) => {
|
|
69
|
+
const injection = injectionsByRole.get(role);
|
|
70
|
+
return injection === undefined ? [] : [injection];
|
|
71
|
+
});
|
|
72
|
+
}
|
|
49
73
|
export function formatJavaRoleDiscoveryBlock(injections) {
|
|
50
74
|
const roleLines = injections.map((injection) => `- ${injection.fileRole}: ${injection.targetFile}`);
|
|
51
75
|
return [
|
|
@@ -62,7 +86,8 @@ export function createJavaRoleReadFollowUp(injections) {
|
|
|
62
86
|
if (injections.length === 0) {
|
|
63
87
|
return undefined;
|
|
64
88
|
}
|
|
65
|
-
const
|
|
89
|
+
const representativeInjections = representativeInjectionsByRole(injections);
|
|
90
|
+
const readLines = representativeInjections.map((injection) => `- read ${injection.targetFile} (${injection.fileRole})`);
|
|
66
91
|
return {
|
|
67
92
|
targetFile: "<java-role-read-follow-up>",
|
|
68
93
|
fileRole: "java-common",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"java-role-discovery.js","sourceRoot":"","sources":["../../src/phase0/java-role-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,oCAAoC,EAAE,MAAM,kBAAkB,CAAA;AAGvE,MAAM,iBAAiB,GAAG,6FAA6F,CAAA;AACvH,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"java-role-discovery.js","sourceRoot":"","sources":["../../src/phase0/java-role-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# v0.3.2-alpha.3 ON/OFF A/B Review
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Validate Persona Harness `0.3.2-alpha.3` with three fresh Java/Spring Gradle README fixtures.
|
|
6
|
+
|
|
7
|
+
Each fixture was run twice with the same short OpenCode prompt:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
README.md 보고 구현해줘
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The ON runs used `npm install -D persona-harness@alpha` and `npx ph init`.
|
|
14
|
+
The OFF runs used only `README.md` and `package.json`.
|
|
15
|
+
|
|
16
|
+
This review compares workflow behavior, requirement adherence, and backend Clean Code uniformity. It is not a generated app product-quality certification.
|
|
17
|
+
|
|
18
|
+
## Setup
|
|
19
|
+
|
|
20
|
+
- Date: 2026-06-23
|
|
21
|
+
- Package: `persona-harness@0.3.2-alpha.3`
|
|
22
|
+
- Model: `openai/gpt-5.4-mini-fast`
|
|
23
|
+
- Run root: `/Users/yongtae/Desktop/persona-ab-alpha3-20260623-114102`
|
|
24
|
+
- Fixtures:
|
|
25
|
+
- `cafe-order-api`
|
|
26
|
+
- `study-group-api`
|
|
27
|
+
- `parking-permit-api`
|
|
28
|
+
|
|
29
|
+
Each README asked for:
|
|
30
|
+
|
|
31
|
+
- Gradle only, no `pom.xml`
|
|
32
|
+
- Java/Spring Boot REST API
|
|
33
|
+
- `presentation / application / domain / infrastructure` separation
|
|
34
|
+
- Repository interface in `domain`, implementation in `infrastructure`
|
|
35
|
+
- Application Service must not own storage state or id sequence
|
|
36
|
+
- Domain model should be class-based with behavior, not passive record-only data
|
|
37
|
+
- Request/Response DTO boundary
|
|
38
|
+
|
|
39
|
+
## Run Matrix
|
|
40
|
+
|
|
41
|
+
| Fixture | Mode | OpenCode exit | `gradle test` recheck | `gradle build` recheck | Workflow status |
|
|
42
|
+
| --- | --- | ---: | --- | --- | --- |
|
|
43
|
+
| Cafe Order API | ON | 0 | PASS | PASS | WARN, finish PASS |
|
|
44
|
+
| Cafe Order API | OFF | 0 | PASS | FAIL | n/a |
|
|
45
|
+
| Study Group API | ON | 0 | PASS | PASS | WARN, finish did not PASS |
|
|
46
|
+
| Study Group API | OFF | 0 | PASS | PASS | n/a |
|
|
47
|
+
| Parking Permit API | ON | 0 | PASS | PASS | PASS |
|
|
48
|
+
| Parking Permit API | OFF | 0 | PASS | PASS | n/a |
|
|
49
|
+
|
|
50
|
+
Notes:
|
|
51
|
+
|
|
52
|
+
- `cafe-order-api-off` failed `gradle build` at `bootJar` with a Gradle/Spring Boot compatibility error after using Spring Boot `3.3.0` on local Gradle `9.4.0`.
|
|
53
|
+
- All six generated apps passed `gradle test` when rechecked after generation.
|
|
54
|
+
- All ON runs produced `.persona/evidence`, but evidence depth varied strongly by run.
|
|
55
|
+
|
|
56
|
+
## Structure Comparison
|
|
57
|
+
|
|
58
|
+
### Cafe Order API
|
|
59
|
+
|
|
60
|
+
ON generated a domain-first package layout:
|
|
61
|
+
|
|
62
|
+
- `customer/application/domain/infrastructure/presentation`
|
|
63
|
+
- `menu/application/domain/infrastructure/presentation`
|
|
64
|
+
- `order/application/domain/infrastructure/presentation`
|
|
65
|
+
- `global/exception`
|
|
66
|
+
- `application/dto/command`, `application/dto/result`, `presentation/dto/request`, `presentation/dto/response`
|
|
67
|
+
- JDBC repositories, Flyway, H2
|
|
68
|
+
|
|
69
|
+
OFF generated a flatter package layout:
|
|
70
|
+
|
|
71
|
+
- `application`
|
|
72
|
+
- `domain`
|
|
73
|
+
- `infrastructure`
|
|
74
|
+
- `presentation`
|
|
75
|
+
- in-memory repositories
|
|
76
|
+
- no tests
|
|
77
|
+
|
|
78
|
+
Result: ON was more uniform and closer to the intended package flow. OFF followed the broad layer names, but with less domain-by-domain separation and a weaker verification surface.
|
|
79
|
+
|
|
80
|
+
### Study Group API
|
|
81
|
+
|
|
82
|
+
ON generated:
|
|
83
|
+
|
|
84
|
+
- `studygroup/application/domain/infrastructure/presentation`
|
|
85
|
+
- `global/exception`
|
|
86
|
+
- command/result and request/response DTO packages
|
|
87
|
+
- JDBC repositories, Flyway, H2
|
|
88
|
+
- an extra participation repository boundary
|
|
89
|
+
|
|
90
|
+
OFF generated:
|
|
91
|
+
|
|
92
|
+
- flat `application/domain/infrastructure/presentation`
|
|
93
|
+
- in-memory repositories
|
|
94
|
+
- presentation DTOs
|
|
95
|
+
- integration test
|
|
96
|
+
|
|
97
|
+
Result: both were acceptable structurally. ON was more consistent with the domain package style and storage abstraction; OFF was simpler and still clean enough for the small fixture.
|
|
98
|
+
|
|
99
|
+
### Parking Permit API
|
|
100
|
+
|
|
101
|
+
ON generated:
|
|
102
|
+
|
|
103
|
+
- `vehicle/application/domain/infrastructure/presentation`
|
|
104
|
+
- `parkingzone/application/domain/infrastructure/presentation`
|
|
105
|
+
- `parkingpermit/application/domain/infrastructure/presentation`
|
|
106
|
+
- `global/exception`, `global/presentation`, `config`
|
|
107
|
+
- command/result and request/response DTO packages
|
|
108
|
+
- JDBC repositories, Flyway, H2
|
|
109
|
+
- Gradle wrapper
|
|
110
|
+
|
|
111
|
+
OFF generated:
|
|
112
|
+
|
|
113
|
+
- flat `application/domain/infrastructure/presentation`
|
|
114
|
+
- in-memory repositories
|
|
115
|
+
- Gradle wrapper
|
|
116
|
+
|
|
117
|
+
Result: ON was the clearest positive signal. It followed the target package shape closely and completed `ph workflow finish implement` PASS after report corrections.
|
|
118
|
+
|
|
119
|
+
## Rubric Result
|
|
120
|
+
|
|
121
|
+
| Criterion | ON Result | OFF Result | Read |
|
|
122
|
+
| --- | --- | --- | --- |
|
|
123
|
+
| Gradle only | 3/3 PASS | 3/3 PASS | Tie |
|
|
124
|
+
| No Maven `pom.xml` | 3/3 PASS | 3/3 PASS | Tie |
|
|
125
|
+
| Build recheck | 3/3 PASS | 2/3 PASS | ON better |
|
|
126
|
+
| Test recheck | 3/3 PASS | 3/3 PASS | Tie |
|
|
127
|
+
| Domain-first package flow | 3/3 strong | 0/3 strong, 3/3 flat-layer acceptable | ON better |
|
|
128
|
+
| Repository port in domain | 3/3 PASS | 3/3 PASS | Tie |
|
|
129
|
+
| Repository adapter in infrastructure | 3/3 PASS | 3/3 PASS | Tie |
|
|
130
|
+
| Service-owned storage/id sequence | 3/3 no service field hits | 3/3 no service field hits | Tie |
|
|
131
|
+
| Domain class behavior | 3/3 no domain records | 3/3 no domain records | Tie |
|
|
132
|
+
| DTO boundary | 3/3 strong, command/result + request/response | 3/3 acceptable, mostly presentation DTOs | ON better |
|
|
133
|
+
| Workflow artifacts | 3/3 present | n/a | ON-only |
|
|
134
|
+
| Evidence trail | 3/3 present | n/a | ON-only |
|
|
135
|
+
|
|
136
|
+
## Workflow Findings
|
|
137
|
+
|
|
138
|
+
ON runs reliably entered the workflow rail:
|
|
139
|
+
|
|
140
|
+
- `npx ph workflow implement` was attempted in all ON runs.
|
|
141
|
+
- Missing plan/report artifacts were detected.
|
|
142
|
+
- The model then used `npx ph plan --auto-accept`.
|
|
143
|
+
- Reports were filled in all ON runs.
|
|
144
|
+
|
|
145
|
+
But workflow completion is still noisy:
|
|
146
|
+
|
|
147
|
+
- Cafe ON: `ph workflow finish implement` eventually PASS, but `ph workflow check` still WARN because a raw shell environment probe remained.
|
|
148
|
+
- Study ON: code/test/build/HTTP smoke succeeded, but `ph workflow finish implement` did not PASS because raw shell history stayed sticky even after bearshell retries.
|
|
149
|
+
- Parking ON: `ph workflow finish implement` PASS after adding the README read range in a format the checker accepted.
|
|
150
|
+
|
|
151
|
+
This is the strongest non-code finding: workflow finish is useful, but too format-sensitive and history-sensitive for smooth TUI usage.
|
|
152
|
+
|
|
153
|
+
## Evidence Findings
|
|
154
|
+
|
|
155
|
+
| Fixture | ON evidence count | Java evidence | Role follow-up |
|
|
156
|
+
| --- | ---: | ---: | ---: |
|
|
157
|
+
| Cafe | 124 | 118 | 2 |
|
|
158
|
+
| Study | 3 | 0 | 0 |
|
|
159
|
+
| Parking | 6 | 3 | 0 |
|
|
160
|
+
|
|
161
|
+
The Cafe ON run produced rich Java role discovery evidence. Study and Parking produced only shallow evidence despite producing good code. This means generated code quality can improve even when role-discovery evidence is thin, but the evidence trail is not yet uniformly reliable.
|
|
162
|
+
|
|
163
|
+
## Similarity And Uniformity
|
|
164
|
+
|
|
165
|
+
Same prompt, same README structure, different domains:
|
|
166
|
+
|
|
167
|
+
- ON outputs were more uniform across the three fixtures:
|
|
168
|
+
- domain package per feature
|
|
169
|
+
- command/result DTOs in application
|
|
170
|
+
- request/response DTOs in presentation
|
|
171
|
+
- JDBC/Flyway/H2 persistence
|
|
172
|
+
- global exception handling
|
|
173
|
+
- OFF outputs were also generally clean, but less uniform:
|
|
174
|
+
- flat package layout
|
|
175
|
+
- in-memory repositories
|
|
176
|
+
- less consistent DTO organization
|
|
177
|
+
- one build failure in Cafe due dependency/plugin compatibility
|
|
178
|
+
|
|
179
|
+
The practical read is not "OFF is bad." The read is: with the architecture expectations already written in README, a strong model can produce decent OFF results, but Persona Harness ON biases the result toward a more consistent backend shape and leaves auditable workflow artifacts.
|
|
180
|
+
|
|
181
|
+
## Cold Analysis
|
|
182
|
+
|
|
183
|
+
Positive:
|
|
184
|
+
|
|
185
|
+
- ON was stronger on structure uniformity and build reliability.
|
|
186
|
+
- No ON run generated Maven.
|
|
187
|
+
- No ON run put storage state or id sequence fields in Application Service.
|
|
188
|
+
- Domain models were class-based in all ON runs.
|
|
189
|
+
- Parking ON is a strong representative demo for the current MVP.
|
|
190
|
+
|
|
191
|
+
Mixed:
|
|
192
|
+
|
|
193
|
+
- OFF was better than expected because each README already included explicit architecture expectations.
|
|
194
|
+
- ON took longer and sometimes got stuck fighting workflow report formatting.
|
|
195
|
+
- ON evidence was inconsistent: Cafe had excellent role evidence; Study/Parking had shallow evidence.
|
|
196
|
+
|
|
197
|
+
Negative:
|
|
198
|
+
|
|
199
|
+
- `ph workflow finish implement` is still too brittle around raw shell history and README range formatting.
|
|
200
|
+
- ON models still read `.persona/rules` directly instead of only following command surfaces.
|
|
201
|
+
- The harness encourages stronger shape, but does not yet guarantee full workflow discipline in short TUI requests.
|
|
202
|
+
|
|
203
|
+
## Decision
|
|
204
|
+
|
|
205
|
+
`0.3.2-alpha.3` shows a meaningful ON-positive signal for backend Clean Code uniformity, especially package shape and DTO/repository organization.
|
|
206
|
+
|
|
207
|
+
It is good enough to continue the Java backend MVP path, but the next work should not be another broad A/B loop. The next work should reduce workflow friction:
|
|
208
|
+
|
|
209
|
+
1. Make `ph workflow finish implement` less brittle or provide a clearer recovery command.
|
|
210
|
+
2. Make README range recording automatic from evidence where possible.
|
|
211
|
+
3. Make final verification prefer `ph bearshell` without penalizing earlier harmless environment probes.
|
|
212
|
+
4. Improve Java role discovery consistency so Study/Parking also produce role follow-up evidence.
|
|
213
|
+
|
|
214
|
+
## Next Actions
|
|
215
|
+
|
|
216
|
+
- P0: implement a smoother workflow continuation/finalization command for AI agents.
|
|
217
|
+
- P0: reduce `ph workflow finish implement` false friction around raw shell probes.
|
|
218
|
+
- P1: make `ph workflow check` explain exactly what command/report line will satisfy the gate.
|
|
219
|
+
- P1: run one future ON-only smoke against a longer README to validate continuation behavior.
|
|
220
|
+
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# v0.3.3-alpha.0 Release Notes
|
|
2
|
+
|
|
3
|
+
## Version
|
|
4
|
+
|
|
5
|
+
`v0.3.3-alpha.0`
|
|
6
|
+
|
|
7
|
+
## Dist Tag
|
|
8
|
+
|
|
9
|
+
`alpha`
|
|
10
|
+
|
|
11
|
+
During the alpha pilot, `latest` may also point to the current alpha build to avoid stale default installs. This is not a stable support claim.
|
|
12
|
+
|
|
13
|
+
## npm Package
|
|
14
|
+
|
|
15
|
+
`persona-harness@0.3.3-alpha.0`
|
|
16
|
+
|
|
17
|
+
## Summary
|
|
18
|
+
|
|
19
|
+
This alpha adds Existing Project Adaptation Mode. Persona Harness now separates new-project generation from existing-project work:
|
|
20
|
+
|
|
21
|
+
- empty Java/Spring projects receive greenfield `0% -> 80%` baseline guidance;
|
|
22
|
+
- non-empty Java/Spring projects receive existing-code discovery and should follow the current package/layer/style first.
|
|
23
|
+
|
|
24
|
+
## What Changed
|
|
25
|
+
|
|
26
|
+
- `ph plan` now records `Project Mode`.
|
|
27
|
+
- Empty projects are marked `Mode: greenfield`.
|
|
28
|
+
- Projects with existing `src/main/java` or `src/test/java` Java files are marked `Mode: existing-code`.
|
|
29
|
+
- Existing-code plans include detected source count, package root, and layer/style hints.
|
|
30
|
+
- Plan-only prompts, implementation prompts, and `ph workflow implement` now state:
|
|
31
|
+
- existing code wins over greenfield guidance;
|
|
32
|
+
- current package/layer/naming/repository/DTO/domain style should be discovered before implementation.
|
|
33
|
+
- Java Role Read Follow-up now asks the agent to read representative files by role instead of every discovered Java file.
|
|
34
|
+
- `ph workflow finish implement` can infer README read coverage from `.persona/evidence` when report ranges are missing.
|
|
35
|
+
- `ph workflow finish implement` no longer blocks only because template raw-shell checklist text remains, when final verification was rerun through `npx ph bearshell`.
|
|
36
|
+
|
|
37
|
+
## Existing Project Smoke
|
|
38
|
+
|
|
39
|
+
Smoke setup:
|
|
40
|
+
|
|
41
|
+
- local tarball install into a repo-external temporary project;
|
|
42
|
+
- `npx ph init`;
|
|
43
|
+
- `npx ph plan --auto-accept`;
|
|
44
|
+
- existing Java package flow:
|
|
45
|
+
- `com.acme.todo.web`;
|
|
46
|
+
- `com.acme.todo.service`;
|
|
47
|
+
- `com.acme.todo.repository`;
|
|
48
|
+
- `com.acme.todo.dto`;
|
|
49
|
+
- `com.acme.todo.domain`;
|
|
50
|
+
- OpenCode `1.17.7`;
|
|
51
|
+
- model: `openai/gpt-5.4-mini-fast`;
|
|
52
|
+
- prompt: `README.md 보고 구현해줘`.
|
|
53
|
+
|
|
54
|
+
Observed:
|
|
55
|
+
|
|
56
|
+
- `ph plan` detected `Mode: existing-code`.
|
|
57
|
+
- package root was detected as `com.acme.todo`.
|
|
58
|
+
- layer/style hints were detected as `domain, dto, repository, service, web`.
|
|
59
|
+
- OpenCode eventually ran `npx ph workflow implement`.
|
|
60
|
+
- Generated code stayed in the existing `web/service/repository/dto/domain` flow instead of forcing `presentation/application/domain/infrastructure`.
|
|
61
|
+
- Java role discovery evidence covered Controller, Service, Repository, DTO, Domain, and Test files.
|
|
62
|
+
- Gradle test/build passed.
|
|
63
|
+
- HTTP smoke for create todo, add tag, and query by tag passed.
|
|
64
|
+
|
|
65
|
+
## Supported Scope
|
|
66
|
+
|
|
67
|
+
- Java/Spring backend MVP.
|
|
68
|
+
- Greenfield backend baseline guidance.
|
|
69
|
+
- Existing Java/Spring backend project adaptation guidance.
|
|
70
|
+
- OpenCode plugin workflow.
|
|
71
|
+
- AI-facing profile/plan/workflow rails.
|
|
72
|
+
- Report-only workflow diagnostics and evidence.
|
|
73
|
+
|
|
74
|
+
## Not Supported
|
|
75
|
+
|
|
76
|
+
- Generated app product-quality certification.
|
|
77
|
+
- Rule compliance enforcement.
|
|
78
|
+
- AST/linter/build-failure gates for rule compliance.
|
|
79
|
+
- Frontend, infra, desktop, or full TDD workflow productization.
|
|
80
|
+
- Automatic completion of long README sequences.
|
|
81
|
+
|
|
82
|
+
## Verification
|
|
83
|
+
|
|
84
|
+
Pre-publish commands:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npm test
|
|
88
|
+
npm run typecheck
|
|
89
|
+
npm run build
|
|
90
|
+
npm run report:rules
|
|
91
|
+
npm run check:scope:strict
|
|
92
|
+
npm run check:injection-value
|
|
93
|
+
npm pack --dry-run
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Result:
|
|
97
|
+
|
|
98
|
+
- `npm test`: PASS, 36 test files / 238 tests.
|
|
99
|
+
- `npm run typecheck`: PASS.
|
|
100
|
+
- `npm run build`: PASS.
|
|
101
|
+
- `npm run report:rules`: PASS, rule diagnostics count `0`.
|
|
102
|
+
- `npm run check:scope:strict`: PASS, scope diagnostics count `0`.
|
|
103
|
+
- `npm run check:injection-value`: PASS, current window `3/3`, decision `continue-java-mvp`.
|
|
104
|
+
- `npm pack --dry-run`: PASS, `persona-harness-0.3.3-alpha.0.tgz`, 229 files, 245.3 kB package size.
|
|
105
|
+
- Existing-project smoke recheck: PASS for `ph workflow finish implement` after final verification rerun through `npx ph bearshell`.
|
|
106
|
+
|
|
107
|
+
## Package Contents Notes
|
|
108
|
+
|
|
109
|
+
- Includes Java/Spring backend `.persona/rules`.
|
|
110
|
+
- Includes Java shared-skill reference.
|
|
111
|
+
- Includes `docs/current/release`.
|
|
112
|
+
- Keeps frontend/infra/desktop productization out of the supported alpha scope.
|
|
113
|
+
|
|
114
|
+
## Known Gaps
|
|
115
|
+
|
|
116
|
+
- OpenCode may still inspect package metadata such as `node_modules/persona-harness/package.json` before settling into the workflow rail.
|
|
117
|
+
- Agents may still perform an initial raw shell probe before rerunning final verification through `npx ph bearshell`.
|
|
118
|
+
- Workflow finish still relies on report/evidence text, not generated app quality certification.
|
|
119
|
+
- Continuation workflow for long README implementations remains the next likely P0.
|
|
120
|
+
|
|
121
|
+
## Next
|
|
122
|
+
|
|
123
|
+
- Publish `persona-harness@0.3.3-alpha.0` with the `alpha` tag.
|
|
124
|
+
- Ask external testers to rerun existing-project and clean-project smoke with:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
npm install -D persona-harness@alpha
|
|
128
|
+
npx ph init
|
|
129
|
+
npx ph plan --auto-accept
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
- Next feature candidate: continuation workflow for long README completion.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "persona-harness",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3-alpha.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "OpenCode plugin for Java/Spring backend Clean Code guidance injection and local/tarball Persona Harness verification.",
|