# v0.3.9-alpha.3 Release Notes

## Version

`v0.3.9-alpha.3`

## Dist Tag

`alpha`

During the alpha pilot, `latest` may be synchronized to the current alpha build to avoid stale default installs. This is not a stable support claim.

## Summary

This prerelease packages the verification-focused current-head changes after `persona-harness@0.3.9-alpha.2`.

Before alpha3 publish, registry `persona-harness@0.3.9-alpha.2` points to `gitHead` `ecc65560af26df78656f6135237f44cdbf9c2607`. Current release prep is based on HEAD `a5204db`, which includes the R1-R8 verification pass.

Persona Harness remains an AI coding workflow rail + evidence + continuation harness. It is not a Java Clean Code quality guarantee, generated app product-quality certification, AST/linter, or enforcement engine.

## What Changed

### Injection value honesty

- `98a7bce fix(docs): mark injection effect unproven`
  - `docs/current/injection-value-status.json` now uses `decision: injection-effect-not-proven`.
  - Prior self-rated `3/3 ON-positive` counts are retained only as legacy audit data, not measured evidence.
  - `scripts/check-injection-value.mjs` passes against the not-measured evidence state.
  - README package candidate examples were aligned to `0.3.9-alpha.2` before this release prep.

### Report-only Java observer CLI

- `2e50bf3 fix(cli): wire report-only Java observer`
  - Adds `ph observe <path>`.
  - Normalizes observer findings with `ruleId`, `result`, `evidence`, `confidence`, `source`, and `limitations`.
  - Keeps the observer report-only and non-enforcing.
  - Removes `parameters.split(",")` from observer parameter parsing.
  - Consolidates `isRecord` into a single shared helper.
  - Removes product analyzer `roomescape` / `/reservations` literals from `src`.

### Live observer trace evidence

- `fb17b0f fix(runtime): record live observer evidence`
  - Java write/edit hook paths can write `observer-report-only` evidence.
  - Evidence is best-effort and guarded by the existing runtime error boundary.
  - Observer failures warn instead of rejecting host hooks.
  - The evidence explicitly records `reportOnly: true` and `enforcement: false`.

### Observer adversarial coverage and fixture hygiene

- `45dcd42 fix(cli): harden observer adversarial coverage`
  - Adds adversarial Java observer/tokenizer coverage for nested generics, annotation comma arguments, lambdas, method references, text blocks, multiline signatures, and multi-class files.
  - Converts the core `ph observe` gate test toward structured finding assertions.
  - Ignores generated dogfooding/test `.persona` artifacts while leaving `AGENTS.md` as an explicit baseline candidate.
- `a5204db test(observe): restore repo example fixture`
  - Restores a tracked minimal Java `example/` fixture used by observe tests.

### Eval runner, replay, decision, and blind grading

- `10005b1 feat(eval): add onoff runner decision gate`
  - Adds `scripts/eval/run-onoff-eval.mjs`.
  - Adds `scripts/eval/decide.mjs`.
- `a748f3d test(eval): harden onoff measurement and blind grading`
  - Scores Gradle test outcomes from JUnit XML instead of PASS text.
  - Scores compile/build from exit code and build artifacts instead of log text.
  - Computes stack alignment from observer findings.
  - Records reproducibility pins, including model, model version, temperature, top-p, seed, timeout, OS, Java, Gradle, Node/npm, git commit, fixture hash, timestamps, and raw output paths.
  - Adds capture/replay support.
  - Adds blind grading package anonymization, sealed mapping, disagreement aggregation, and no-fake-score guards.

## External Smoke

External Smoke ran current-head verification on local tarball HEAD `a5204db`.

Source:

- package version: `0.3.9-alpha.2` before this release prep;
- tarball shasum: `2f61f432a21c7913c2463ef124236eb4528db59a`;
- tarball sha256: `1f5cf0fe6124e580353318a3b9a31c5159c71238d68b7b28bc28f3f7fd8164d0`;
- archive: `/Users/yongtae/Desktop/persona-harness-artifacts/archive/2026-06-24-desktop-persona-runs/score-uplift-r1-r8-current-head-20260627-142825-a5204db`.

Observed:

- clean local tarball install passed;
- `ph init`, `ph bootstrap backend`, and `ph doctor` passed;
- `ph observe --json example/` passed and emitted required finding keys;
- runtime observer report-only evidence was created without throwing or blocking;
- `run-onoff-eval --help` passed;
- `run-onoff-eval --dry-run` with model/version/temperature/top-p/seed pins passed;
- `run-onoff-eval --preflight` without a model failed as expected and created no `results.json`;
- replay with missing capture failed as expected and created no `results.json`;
- `decide.mjs` executed an objective verdict path from fixed JSON;
- `blind-grade.mjs` anonymize and aggregate paths executed.

Actual ON/OFF OpenCode eval was not run because `OPENCODE_MODEL`, `OPENCODE_MODEL_VERSION`, and provider keys were not pinned. No fake eval results were generated.

### Published alpha3 registry surface smoke

Published `persona-harness@0.3.9-alpha.3` registry install smoke passed.

Source:

- Windows clean project registry-only `npm install -D persona-harness@alpha`.
- Installed package: `persona-harness@0.3.9-alpha.3`.
- Registry dist-tags observed: `alpha=0.3.9-alpha.3`, `latest=0.3.9-alpha.3`.
- Registry `gitHead`: `d96941f6e212bd89f62cd0d7b12853a845cc1c86`.
- Registry shasum: `fcd8b7da9f0568510a73f9d25a1c083a8343e6b9`.
- origin/main and origin tag `v0.3.9-alpha.3` point to `d96941f`.

Observed package surfaces:

- `ph init`: PASS.
- `ph bootstrap backend`: PASS.
- `ph doctor`: PASS.
- `ph plan`: PASS.
- `ph workflow`: PASS.
- `ph review backend-shape`: PASS.
- `ph observe --json` fixture: PASS.
- Fresh/template `workflow finish implement` blocked as expected on missing implementation/review reports and evidence.

Latest-tag smoke also passed after dist-tag synchronization:

- Clean `npm install -D persona-harness` installed `0.3.9-alpha.3`.
- `ph init`: PASS.
- `ph doctor`: PASS.
- `ph observe --json` fixture: PASS.

Package-surface boundary:

- Eval runner scripts were not present under installed `node_modules/persona-harness/scripts/eval/*`.
- Package-level eval runner help/dry-run/preflight was not executed.
- This is a package-surface boundary, not a fake eval success.

### Post-publish repo-side eval pilot

Eval pilot execution remains repo-side tooling. The published alpha3 package does not include installed `scripts/eval/*` runner files; PH ON condition installs the registry package through `PERSONA_HARNESS_INSTALL_COMMAND=npm install -D persona-harness@0.3.9-alpha.3`.

`7d23167 fix(eval): match current opencode run surface` first tried this runner command:

```bash
opencode run --model {model} --file {promptFile} {message}
```

The default runner no longer uses unsupported `--prompt-file`, `--temperature`, `--top-p`, or `--seed` flags. Main-thread preflight after that fix passed, dry-run selected 4 runs, and the fix was pushed to origin/main as `7d231677c4440f6ebad99c3d21b9b9b412885940`.

The previous actual eval pilot produced real results/capture, but it failed because the old runner used unsupported current OpenCode flags. Treat that as a runner/environment failure, not PH product evidence.

The post-fix QA actual eval rerun on HEAD `7d23167` also produced real results/capture, but failed all conditions because OpenCode treated the positional message after `--file` as a file path:

```text
Error: File not found: README.md 보고 구현해줘
```

Result paths:

- Original results: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T061107129Z/results.json`.
- Replay results: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T061307346Z/results.json`.

This `7d23167` result was a runner/OpenCode invocation failure, not PH product evidence, not PH value verdict, and not generated app quality evidence. It was followed by the `505b656` runner fix and actual eval pilot below.

QA then probed current OpenCode invocation forms:

- `--file prompt.txt --command "README.md 보고 구현해줘"` failed with OpenCode UnknownError.
- `opencode run --model <model> "$(cat prompt.txt)"` succeeded in a harmless temp probe.

`505b656 fix(eval): pass opencode prompt as positional text` changed the runner to:

```bash
opencode run --model {model} {prompt}
```

Main thread confirmed HEAD `505b656`, removed accidental dependency dirty state, and pushed origin/main to `505b656ec18efb0f9c8ecfb2af9c1c1ae516ea52`. `source tmp/eval-pilot.env && ./tmp/run-eval-pilot.sh preflight` remained PASS.

Actual eval pilot on HEAD `505b656`:

- Dry-run: PASS, 4 runs selected.
- Original results: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T063154174Z/results.json`.
- Original raw/capture root: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T063154174Z/raw/`.
- Replay results: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T070237569Z/results.json`.
- Pins: model `openai/gpt-5.4-mini-fast`, model version `openai-oauth-2026-06-27-gpt-5.4-mini-fast`, timeout `900000`, PH install `npm install -D persona-harness@0.3.9-alpha.3`; provider key env blank with local OpenCode OAuth default.

Generated outputs:

- plain/claude/agents generated Maven/Spring projects with `pom.xml`, Java source/tests, and no Gradle files.
- ph-on generated a Gradle/Spring project with `build.gradle`, settings, wrapper scripts, Java source/tests, Flyway/resources, and PH artifacts.

Original outcomes:

| condition | compile | Gradle test | runtime | workflow | stack | failures |
| --- | --- | --- | --- | --- | --- | --- |
| plain | FAIL | ERROR | NOT RUN | NOT APPLICABLE | 0.75 | 3 |
| claude | FAIL | ERROR | NOT RUN | NOT APPLICABLE | 0.75 | 3 |
| agents | FAIL | ERROR | NOT RUN | NOT APPLICABLE | 0.75 | 3 |
| ph-on | PASS | PASS | NOT RUN | FAIL | 0.75 | 2 |

Original decide verdict: FAIL.

Reasons:

- runtimeSmokeRate missing for comparable decision;
- PH ON stack alignment improvement over plain below 20 percentage points.

Replay outcomes:

| condition | compile/test | runtime | workflow | stack | failures |
| --- | --- | --- | --- | --- | --- |
| agents/claude/plain | FAIL | NOT RUN | NOT APPLICABLE | 0.75 | 3 |
| ph-on | PASS | NOT RUN | NOT APPLICABLE | 0.75 | 1 |

Replay decide verdict before runtime-smoke preservation fix: FAIL.

Reasons:

- runtimeSmokeRate missing;
- stack alignment improvement below threshold.

Interpretation:

- This is real eval pilot evidence, not fake.
- It is not a pass and not proof PH beats baselines under the preregistered gate.
- It shows PH ON steered Gradle/Spring while OFF baselines generated Maven/Spring in this one pilot.
- PH ON had compile/test advantage under Gradle metrics.
- Decision gate still failed at this stage due missing replay runtime smoke and no stack alignment improvement.
- No generated app product quality certification.

`8f203d7 fix(eval): preserve runtime smoke on replay` fixed replay runtime-smoke determinism. Main thread confirmed HEAD `8f203d7` and pushed origin/main to `8f203d7fa90e767c0de591f6c1284a833b3c531a`.

Fix details:

- Changed files: `scripts/eval/eval-core.mjs`, `tests/eval-runner.test.ts`.
- QA verification: focused eval test PASS (13), typecheck PASS, full `npm test` PASS (64 files / 399 tests), build PASS.
- Replay reads captured `raw/runtime-smoke.log` `status:`.
- `status: 0` -> PASS.
- non-zero/null -> FAIL.
- missing status/log -> NOT RUN/null.
- No fake PASS.

Replay-fixed result:

- Existing actual capture replayed: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T072141547Z`.
- New replay result: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T080127352Z/results.json`.
- Replay runtime rates: agents=`1`, claude=`0`, ph-on=`1`, plain=`0`.
- Decide command: `node scripts/eval/decide.mjs experiments/eval-runs/2026-06-27T080127352Z/results.json`.
- Verdict: PASS.
- Reason: `PH ON met coded v0.4 threshold checks for supplied results`.

Updated interpretation:

- This is replay-reproducible `n=1` pilot PASS under the coded decide gate for the supplied results.
- It is not a full v0.4 matrix result.
- It is not generated app product quality certification.
- Original pilot signal remains: PH ON generated Gradle/Spring and reached build/test/runtime/workflow finish PASS; OFF baselines generated Maven/Spring and failed Gradle compile/test, with agents runtime/stack strong but build/test failing.
- Replay still does not preserve provider timeout/providerFailed or original PH ON workflow finish outcome exactly. QA marked that as future optional scope.

### Replay residual fix and 2-rep pilot

QA then fixed replay provider/workflow outcome preservation and added bounded eval runner concurrency:

- `0ff6ca6 fix(eval): preserve replay provider workflow outcomes`.
- `afcae34 feat(eval): add bounded runner concurrency`.
- origin/main: `afcae34ef696f76c7c7ab55e27b0f3d20a8421df`.
- QA verification: focused eval tests PASS (15), typecheck PASS, full `npm test` PASS (64 files / 401 tests), build PASS.

The follow-up pilot ran `backend-api-no-stack` x `plain`/`claude`/`agents`/`ph-on` x 2 reps with capture enabled and concurrency 2.

Result paths:

- Original results: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T082514617Z/results.json`.
- Replay results: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T085815683Z/results.json`.

Decision results:

- Original decide: FAIL.
  - PH ON runtimeSmokeRate regressed below plain.
  - PH ON failure-mode reduction was `-75%`, below the 20% threshold.
- Replay decide: FAIL.
  - PH ON runtimeSmokeRate regressed below claude.
  - PH ON failure-mode reduction was `-75%`, below the 20% threshold.
- Verdict is stable FAIL. Follow-up tie-break cleanup now makes the runtimeSmokeRate regression reason compare against `claude` in both original and replay.

Final runner cleanup after the 2-rep FAIL:

- `cde0833 fix(eval): stabilize decide baseline tie-break`.
  - Verdict logic is unchanged.
  - Original/replay 2-rep decide remain FAIL.
  - RuntimeSmokeRate regression reason now deterministically compares against `claude` in both original and replay.
- `dfab6fc fix(eval): clean runtime smoke process groups`.
  - Runtime-smoke command only now gets scoped POSIX process group cleanup.
  - Broad process killing was not added.
  - Windows descendant cleanup remains a separate future follow-up only if a Windows pilot shows orphaning.
- origin/main: `dfab6fcf7be4e278ccc417acdc9bd8389a6f7835`.

Aggregate:

| condition | runs | build | test | runtime | stack | workflow | failures |
| --- | --- | --- | --- | --- | --- | --- | --- |
| plain | 2 | 0% | 0% | 100% | 75% | 0% | 4 |
| claude | 2 | 0% | 0% | 50% | 37.5% | 0% | 6 |
| agents | 2 | 0% | 0% | 0% | 0% | 0% | 8 |
| ph-on | 2 | 50% | 50% | 0% | 100% | 0% | 7 |

PH ON run-level notes:

- r1: build FAIL, test ERROR, runtime FAIL, workflow FAIL, stack `1`, failures `4`.
- r2: build PASS, test PASS, runtime FAIL, workflow FAIL, stack `1`, failures `3`; OpenCode timed out after `900000ms` and the provider-limit label was preserved.
- PH ON r2 runtime smoke left an orphan Gradle/Java process; QA cleaned only that eval workspace path. The later `dfab6fc` cleanup is scoped to POSIX runtime-smoke process groups and does not claim Windows descendant cleanup.

Updated interpretation:

- The earlier replay-fixed `n=1` PASS remains recorded as a real pilot signal.
- The 2-rep follow-up is a stable FAIL and overrides full-matrix expansion readiness.
- Do not expand to the full v0.4 matrix from this evidence.
- PH ON improved stack alignment in this pilot, but regressed runtime and failure-mode outcomes versus OFF baselines.
- This is not generated app product quality certification and contains no fake metrics.

### Root-cause classification and serial n=2 rerun

QA inspected the existing 2-rep capture at:

- `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T082514617Z`.

Root-cause classification:

- Old PH ON r1:
  - build/test/runtime failed due generated Java compile error;
  - `OrderService.java` referenced missing `CustomerNotFoundException`;
  - workflow finish failed because implementation/review reports remained templates;
  - OpenCode exited status `0`;
  - no provider timeout.
- Old PH ON r2:
  - build/test passed;
  - runtime smoke failure was likely contaminated by timed-out OpenCode leaving bootRun/H2 lock: `Database may be already in use: .../order-intake.mv.db`;
  - workflow finish failed because reports were templates and `req-1` through `req-6` were pending;
  - OpenCode status was null/SIGTERM after timeout at `900000ms`.

Runner fix:

- `dde9bcc fix(eval): clean timed-out opencode process groups`.
- OpenCode/provider command only gets scoped process-group cleanup on timeout.
- No broad process killing was added.
- Verification passed focused tests, `npm run typecheck`, `npm test` (64 files / 404 tests), and `npm run build`.

Serial rerun:

- Same fixture/conditions/runs.
- `--concurrency 1`.
- Capture enabled.
- Original results: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T104740351Z/results.json`.
- Replay results: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T114723409Z/results.json`.
- Original and replay decide: FAIL.
- Decide reason: `PH ON stack alignment improvement over plain is below 20 percentage points`.

Serial aggregate, matched in original and replay:

| condition | build | test | runtime | stack | workflow | failures |
| --- | --- | --- | --- | --- | --- | --- |
| plain | 0% | 0% | 100% | 75% | n/a | 4 |
| claude | 0% | 0% | 50% | 37.5% | n/a | 6 |
| agents | 0% | 0% | 50% | 37.5% | n/a | 6 |
| ph-on | 100% | 100% | 100% | 75% | 100% | 0 |

PH ON notes:

- r1/r2 runtime logs both observed a Tomcat startup marker.
- No matching orphan opencode/persona-runtime-smoke/gradle bootRun/workspace process remained.

Interpretation:

- Serial n=2 external outcomes are green for PH ON versus OFF.
- Coded decide gate remains FAIL because plain baseline already has stackAlignmentRate `75%`, so PH ON does not clear the +20pp stack-improvement threshold.
- Record as external outcome green, coded gate stack-threshold fail.
- This is not a full v0.4 matrix result.
- This is not generated app product quality certification.
- This is not broad PH value proof.
- This does not move v0.5 AST forward.

### Fixture scope metadata and intermediate expansion

`b361a80 feat(eval): classify fixture scope metadata` adds fixture scope metadata to fresh eval results.

Fixture eligibility:

| fixture | scopeClass | singleTurnEligible | note |
| --- | --- | --- | --- |
| `backend-api-no-stack` | single-turn | true | prior fresh external-primary `n=2` PASS signal remains valid |
| `multi-step-backend` | stress-continuation | false | full fixture is not a fair single-turn pass/fail row |
| `multi-step-backend-small` | reduced-single-turn | true | paired reduced variant for the full multi-step fixture |
| `ambiguous-idea-first` | single-turn | true | intermediate pilot result below blocks matrix expansion |

### Reduced multi-step fixture

The official reduced multi-step pilot used fixture `multi-step-backend-small` with policy `external-primary-v0.4.1`, 4 conditions x 2 runs, concurrency 1, capture, and runtime smoke.

Result paths:

- Original results: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T153507167Z/results.json`.
- Replay results: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T233834010Z/results.json`.

Original metadata:

- no `replayOf`;
- gitCommit `e6e5f5e6359674c9e475aa68bfe20ad8cc61c173`;
- decisionPolicy `external-primary-v0.4.1`;
- fixture `multi-step-backend-small`.

Decision results:

- Original decide: PASS.
- Replay decide: PASS.

Aggregate, matched in original and replay:

| condition | build | test | runtime | stack | workflow | failures |
| --- | --- | --- | --- | --- | --- | --- |
| plain | 0% | 0% | 100% | 50% | n/a | 4 |
| claude | 0% | 0% | 100% | 75% | n/a | 4 |
| agents | 0% | 0% | 100% | 75% | n/a | 4 |
| ph-on | 100% | 100% | 100% | 88% | 100% | 0 |

PH ON run-level notes:

- r1: build/test/runtime/workflow PASS, stack `1.0`, failures `0`.
- r2: build/test/runtime/workflow PASS, stack `0.75`, failures `0`.
- PH ON instrumentation was valid: registry install status `0`, `npx ph init --default backend` status `0`, OpenCode ran in the PH-prepared workspace, `.persona/` and `.opencode/` were present, reports were filled, workflow finish PASSed, and `profileSummaryInjected` was observed 80 times in r1 and 105 times in r2.
- Baselines were PH-free: plain had no `.persona`/`.opencode`/AGENTS/CLAUDE, claude only had `CLAUDE.md`, and agents only had static `AGENTS.md`.

Interpretation:

- Full `multi-step-backend` remains external-primary FAIL with PH ON workflow `0%`.
- Reduced `multi-step-backend-small` is a Tier 1 external-primary PASS for the reduced fixture only.
- This is strong scope-size sensitivity evidence.
- Full `multi-step-backend` likely needs multi-turn, slicing, or continuation strategy before it can be used as a fair full-matrix row.
- This is not a full v0.4 matrix PASS, broad PH value proof, or generated app product quality certification.
- Tier 2 stack differentiation remains diagnostic/not assessed due fallback/low-confidence output, even though PH ON run metrics include observer-backed/high-confidence criteria.
- No old result is retroactively rewritten.

### Ambiguous idea-first intermediate pilot

The `ambiguous-idea-first` pilot used a single-turn eligible fixture with `plain`/`claude`/`agents`/`ph-on` x 2, concurrency 1, capture, runtime smoke, and policy `external-primary-v0.4.1`.

Result paths:

- Original results: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-27T235103424Z/results.json`.
- Replay results: `/Users/yongtae/Desktop/persona-harness/experiments/eval-runs/2026-06-28T010248114Z/results.json`.

Decision results:

- Original decide: FAIL.
- Replay decide: FAIL.
- Reason: `ambiguous-idea-first: Tier 1 workflow finish did not complete for every PH ON run`.

Aggregate, matched in original and replay:

| condition | build | test | runtime | workflow | stack | failures |
| --- | --- | --- | --- | --- | --- | --- |
| plain | 0% | 0% | 100% | n/a | 100% | 4 |
| claude | 50% | 50% | 50% | n/a | 50% | 4 |
| agents | 0% | 0% | 50% | n/a | 50% | 6 |
| ph-on | 100% | 100% | 100% | 50% | 100% | 2 |

PH ON run-level notes:

- r1: build/test/runtime/stack PASS, workflow FAIL, reports filled, pending tickets present, OpenCode timeout `900000ms`, labels provider limit/workflow dead-end.
- r2: build/test/runtime/workflow/stack PASS, failures `0`.
- PH ON instrumentation was valid.
- Baselines were PH-free.
- Fixture metadata was present: `scopeClass` single-turn, `singleTurnEligible` true, and eligible aggregate included all four conditions.

Interpretation:

- `backend-api-no-stack` PASS and `multi-step-backend-small` PASS remain valid signals.
- `ambiguous-idea-first` FAIL means the v0.4 single-turn matrix is not ready.
- The failure is workflow closure/follow-through variance, not build/test/runtime failure.
- Skills lane found no missing prompt surface, made no guidance change, and produced no commit. Existing guidance already covers idea-first assumptions, bounded subset/current ticket, continuation, reports/check/archive/finish, and focused tests passed.
- Remaining investigation is CLI/QA runner continuation/final-finish mechanics rather than adding more prompt text.
- Full v0.4 matrix remains blocked pending CLI/Skills root-cause or rerun policy.
- This is not generated app product quality certification, broad PH superiority, or a full matrix PASS.
- No old result is retroactively rewritten.

## Claim Boundaries

- This release packages measurement infrastructure and report-only observer surfaces.
- It reports real post-publish ON/OFF eval pilot results: a replay-fixed `n=1` coded gate PASS for supplied results, a concurrency-2 2-rep stable FAIL, a serial n=2 rerun with PH ON external outcomes green but coded gate stack-threshold FAIL, a reduced `multi-step-backend-small` external-primary PASS, and an `ambiguous-idea-first` external-primary FAIL.
- Published alpha3 registry smoke is package surface smoke only.
- Latest-tag smoke is also install/surface smoke only.
- Registry/latest install smoke did not include a generated-app OpenCode run; later repo-side eval pilots did generate apps. The replay-fixed `n=1` coded gate result PASSed for supplied results, but the 2-rep follow-up FAILed and is the current expansion gate signal.
- It does not verify package-level eval runner help/dry-run/preflight because `scripts/eval/*` was not present in the installed package.
- It does not treat the post-`7d23167` QA eval rerun failure as PH product evidence.
- It does not treat the replay-fixed `n=1` PASS as a full v0.4 matrix result or generated app quality certification.
- It does not treat the 2-rep FAIL as final PH value proof either; it is a small pilot gate result and a reason not to expand yet.
- It does not treat the reduced multi-step PASS as a full matrix PASS.
- It does not treat the ambiguous pilot FAIL as a final PH value verdict.
- It does not certify generated app product quality.
- It does not treat serial n=2 external green outcomes as broad PH value proof.
- Observer/backend-shape remain report-only.
- AST/linter/enforcement remain absent.
- `AGENTS.md` may remain a local baseline candidate and is not part of this release prep unless explicitly tracked by a later change.

## Verification

Repository verification from the release prep worktree:

```bash
npm run typecheck
npm test
npm run build
npm run check:docs
npm pack --dry-run
git diff --check
```

Observed result on 2026-06-27:

- `npm run typecheck`: passed.
- `npm test`: passed. Scope diagnostics and docs taxonomy diagnostics passed; 64 files / 397 tests passed.
- `npm run build`: passed.
- `npm run check:docs`: passed.
- `npm run check:injection-value`: passed with `decision: injection-effect-not-proven` and `count basis: not-measured-evidence`.
- `npm pack --dry-run`: passed for `persona-harness@0.3.9-alpha.3`.
  - Filename: `persona-harness-0.3.9-alpha.3.tgz`
  - Package contents: 352 files
- `git diff --check`: passed.

## Known Gaps

- A real ON/OFF eval pilot exists and replay-fixed decide PASSed for supplied `n=1` results. The concurrency-2 2-rep follow-up failed the coded gate, and the serial n=2 rerun made PH ON external outcomes green but still failed the coded gate on stack-threshold improvement.
- `backend-api-no-stack` and `multi-step-backend-small` provide valid PASS signals, but `ambiguous-idea-first` is a single-turn eligible FAIL due workflow closure/follow-through variance.
- Skills found no missing prompt surface for `ambiguous-idea-first`; full v0.4 single-turn matrix remains blocked pending CLI/QA runner continuation/final-finish mechanics or rerun policy.
- Full `multi-step-backend` is classified as stress/continuation and should not be used as a simple single-turn pass/fail row without a slicing/continuation strategy.
- Published alpha3 package surface did not include installed `scripts/eval/*`, so eval runner help/dry-run/preflight were not package-verified.
- The remaining decision question is whether HQ changes coded gate weighting/threshold or keeps FAIL until full matrix/other fixtures.
- No generated app product-quality certification is made.
- Report-only observer output can still have false positives or false negatives.
