# v0.4.0-rc.1 Release Notes

## Version

`v0.4.0-rc.1`

## Dist Tag

`next`

`0.4.0-rc.1` is a workflow closure rail product milestone candidate. Publish it
with npm dist-tag `next`. Do not move `latest`; `latest` is currently observed at
`0.3.9-alpha.8`.

## Summary

This release candidate refreshes the previously parked RC draft from current
alpha8 state. It packages the closure rail convergence that routes active
workflow guidance and finish blockers through closure state/payload.

Included closure rail state:

- `workflow continue` uses the closure rail as its single source, without old
  follow-up dual-rendering;
- `workflow finish implement` blocker/reason rendering uses closure
  payload/state via `workflowClosureFinishReasons`;
- `workflow closure status --json` remains a state snapshot;
- `workflow closure next --json` includes `nextStep` and first actionable
  blocker details;
- old string layers `workflow-post-build-closure.ts`,
  `workflow-continue-followups.ts`, and `workflow-finish-reasons.ts` are retired.

Not included:

- no `closure run` executor;
- no report auto-fill;
- no ticket auto-archive;
- no workflow auto-finish;
- no finish gate weakening.

## Product Usability Signal

Alpha8 registry smoke provides the release-candidate evidence base:

- no-token closure rail smoke passed from registry `persona-harness@alpha` /
  `0.3.9-alpha.8`;
- Korean idea-first input was preserved;
- `workflow continue`, `workflow closure status --json`,
  `workflow closure next --json`, and `workflow finish implement` shared the
  closure blocker order;
- implementation-to-finish product usability smoke passed once from registry
  `persona-harness@alpha`;
- final `workflow finish implement` passed under closure-state routing;
- terminal closure state had `currentTicket: null`, no pending tickets, filled
  reports, verification passed, and empty blockers.

Boundary:

- one product usability success-path smoke only;
- not eval/A-B evidence;
- not PH superiority proof;
- not generated app quality certification;
- not a closure guarantee;
- not a general reliability guarantee.

## Eval Status

Eval remains stopped. `docs/current/injection-value-status.json` remains
`injection-effect-not-proven`.

This RC must not reinterpret old eval results, claim PH superiority, or use
generated app output as product-quality certification.

## Verification

Release-prep verification for this worktree:

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

Observed result on 2026-06-29:

- `npm test`: passed, 70 files / 464 tests.
- `npm run typecheck`: passed.
- `npm run build`: passed.
- `npm run check:docs`: passed.
- `npm run smoke:product-mvp`: passed.
- `npm pack --dry-run`: passed for `persona-harness@0.4.0-rc.1`.
  - filename: `persona-harness-0.4.0-rc.1.tgz`;
  - package size: `395.7 kB`;
  - unpacked size: `1.6 MB`;
  - shasum: `a78f331ed4f1bb85506cad44e9041185c4f370d0`;
  - total files: `379`.
- `git diff --check`: passed.

## Publish Notes

- Preferred publish command: `npm publish --tag next`.
- Do not move `latest`.
- If npm requires OTP/2FA, stop after the first failure and hand off the exact
  command for the user to run.
- Create and push `v0.4.0-rc.1` only after registry verification confirms
  `persona-harness@0.4.0-rc.1` exists with the release prep commit as gitHead.

## Post-Publish Verification

User-completed publish was verified on 2026-06-29.

Registry facts:

- package: `persona-harness@0.4.0-rc.1`;
- gitHead: `981b7b75d035ad16ee5e2b7f8bec5482d19f2873`;
- dist.shasum: `c987701b4ed55324e1a555f4e31545e4d0cb3757`;
- dist-tags: `next=0.4.0-rc.1`, `alpha=0.3.9-alpha.8`,
  `latest=0.3.9-alpha.8`.

Git facts:

- local and origin tag `v0.4.0-rc.1` point at
  `981b7b75d035ad16ee5e2b7f8bec5482d19f2873`;
- local `main` and `origin/main` include the release prep commit.

Boundary:

- no republish was performed;
- `latest` was not moved by this post-publish verification;
- no eval/model/OpenCode run was performed;
- no PH superiority proof, generated app quality certification, closure
  guarantee, or general reliability guarantee is claimed.

## `@next` Real-User Smoke

External Smoke verified `persona-harness@0.4.0-rc.1` from registry `next`.

- Stage 1 no-token closure rail smoke: PASS in a stable local workspace.
- Stage 2 local implementation-to-finish proxy trial: PASS.
  - OpenCode invocation used stdin plus `openai/gpt-5.4-mini-fast`.
  - Generated app shape: Java/Spring/Gradle Todo API.
  - `gradlew test` / `gradlew build`: PASS.
  - Implementation and review reports were filled.
  - `req-1` was archived.
  - `workflow closure next` reached terminal complete state.
  - final `workflow finish implement`: exit 0.
- `closure run` remains deferred because this local trial finished with the
  planner / continue / finish surfaces only.
- Windows SSH remote validation was BLOCKED by SCP/SSH hang before product
  behavior. Do not count it as Windows product PASS or FAIL.

Windows local operator validation:

- source note:
  `/Users/yongtae/Desktop/persona-harness-artifacts/archive/2026-06-24-desktop-persona-runs/rc1-windows-validation-path-20260629-173647/user-local-operator-pass-20260629/RESULT.md`;
- source transcript:
  `/Users/yongtae/.codex/attachments/19c17ce4-6035-418d-8fe3-6abadff31797/pasted-text.txt`;
- workspace: `D:\persona-harness-smoke-rc1-next-local-20260629-174728`;
- install source/version: registry `persona-harness@next`, installed
  `0.4.0-rc.1`;
- setup PASS: init/default backend, doctor, bootstrap; Runtime readiness PASS;
- Korean preservation PASS: `TODO 웹 서비스 만들래` was preserved in
  requirements, backlog, task card, continue output, and closure JSON;
- closure planner / finish strictness PASS:
  - first blocker: `verification-unknown`;
  - expected no-model finish block: `FINISH_EXIT=1`;
  - blockers: `verification-unknown`, `implementation-report-missing`,
    `review-report-missing`, `evidence-missing`, `pending-ticket`;
- no auto mutation: implementation/review reports stayed `Status: template`,
  the ticket stayed pending, and there was no auto-fill, auto-archive, or gate
  weakening.

Proxy feedback from existing trial artifacts:

- archive:
  `/Users/yongtae/Desktop/persona-harness-artifacts/archive/2026-06-24-desktop-persona-runs/rc1-next-real-user-20260629-164520/proxy-feedback-20260629`;
- source trial archive:
  `/Users/yongtae/Desktop/persona-harness-artifacts/archive/2026-06-24-desktop-persona-runs/rc1-next-real-user-20260629-164520`;
- workflow rail helpful signal: triggered;
- `closure status` -> `closure next` -> `workflow finish` helped return to
  terminal/complete state without guessing;
- decisive state cues: `currentTicket: null`, `pendingTickets: []`,
  `finish: passed`, `nextStep: terminal`;
- commands-too-many: not triggered;
- closure confusing: tolerable;
- closure run requested: not triggered.

Soak plan:

- keep `0.4.0-rc.1` soaking under `@next`;
- collect real external user feedback before stable `0.4.0`;
- unblock/stabilize the Windows validation path, or use an alternate reliable
  Windows verification route;
- Windows no-model closure surface route is now satisfied through direct local
  PowerShell operator validation;
- SSH/SCP remote route and SSH command transport remain unsuitable for stable
  evidence because of instability/mojibake risk;
- Windows current-head `002359c` focused SSH continuation was exercised but is
  PARTIAL/BLOCKED, not an implementation-to-finish PASS:
  - archive:
    `/Users/yongtae/Desktop/persona-harness-artifacts/archive/2026-06-24-desktop-persona-runs/current-head-002359c-ssh-focused-continuation-20260629-200215`;
  - the existing Windows D workspace was reachable over SSH and the prior
    Korean/stdin issue was no longer the blocker;
  - timeout alone was not the root cause; wrapper props were absent, but custom
    `gradlew.bat` could run;
  - initial Gradle failure was missing `junit-platform-launcher`; repair added
    `testRuntimeOnly 'org.junit.platform:junit-platform-launcher'`;
  - after repair, bearshell `gradlew.bat test` and build passed;
  - backend-shape generated with major shape checks mostly PASS, while DTO
    boundary and Verification report WARN remain;
  - source scan did not observe fake `gradle-shim`, Java `HttpServer`,
    CommonJS, or Express bypasses;
  - OpenCode closure continuation hung during the build bearshell step, reports
    stayed template, `req-1` stayed pending, and final
    `workflow finish implement` exited 1;
  - product learning: Windows can reach repair build/test PASS, but
    closure/report/archive/finish follow-through remains a blocker; future
    Windows validation should include a less script-heavy TUI/operator flow
    because the current automation/PowerShell/SSH route may overfit validation
    mechanics;
- that less-script-heavy Windows operator route is itself BLOCKED before model
  until the guide/current CLI surface is corrected and reverified:
  - archive:
    `/Users/yongtae/Desktop/persona-harness-artifacts/archive/2026-06-24-desktop-persona-runs/less-script-heavy-windows-operator-exec-20260629-203000`;
  - a fresh D workspace installed current tarball `0.4.0-rc.1`; init, doctor,
    and bootstrap passed;
  - Korean preservation failed even with
    `Get-Content -LiteralPath idea-utf8.txt -Raw -Encoding UTF8 | npx ph workflow draft --stdin`;
    requirements `Original idea` became `??? ? ? API ???`;
  - the guide expected `workflow approve requirements`, `workflow split`, and
    `workflow next`, but the installed CLI reported unknown command for those
    in the run;
  - no OpenCode/model implementation executed;
  - final no-model finish exited 1 with expected blockers;
- current HEAD `e688d39 fix(cli): guard lossy Windows stdin and pack stale dist`
  addresses those two current-head/fresh-tarball blockers for a future package:
  - pure question-mark replacement input such as `??? ? ? API ???` is rejected
    by `workflow draft --stdin` / `workflow capture --stdin` before requirements
    are written;
  - the existing `媛...???` mojibake guard remains and normal Korean UTF-8 stdin
    remains preserved;
  - `prepack: npm run build` prevents local smoke tarballs from carrying stale
    `dist`, which caused the guide/current CLI mismatch where
    `workflow approve requirements`, `workflow split`, and `workflow next`
    appeared missing;
  - this does not reconstruct already-lost `?` text, does not repair existing
    broken artifacts, and is not proof that published `0.4.0-rc.1 @next`
    already contains the fix;
- current-head `e688d39` Windows operator retry confirmed preflight progress but
  remained BLOCKED before app output:
  - archive:
    `/Users/yongtae/Desktop/persona-harness-artifacts/archive/2026-06-24-desktop-persona-runs/current-head-e688d39-windows-operator-retry-20260629-204500`;
  - fresh current HEAD tarball with `e688d39` installed on Windows D-drive;
  - packaging/stale `dist` issue was resolved and current command surface was
    available;
  - lossy `??? ? ? API ???` stdin was rejected without writing requirements;
  - Korean `간단한 할 일 API 만들래` was preserved when PowerShell encoding
    variables were set to UTF-8;
  - no-token workflow draft/approve/split/next/continue/check/closure
    status/next passed;
  - implementation-to-finish blocked before app output: OpenCode started and
    read workflow/profile/planner context, README was absent, and a malformed
    duplicated `.persona/policies` path hit `external_directory` auto-reject;
  - no `src` or Gradle files were generated, reports stayed template, ticket
    stayed pending, and final `workflow finish implement` exited 1;
  - blocker moved from Windows input/packaging/command surface to OpenCode
    implementation entry/context path; stable `0.4.0` remains deferred;
- current HEAD `a307ac0 fix(cli): guide README-absent workflow entry` addresses
  the CLI-owned part of that entry/context ambiguity:
  - CLI investigation did not find the malformed duplicated
    `.persona/policies` absolute path in CLI/operator prompt output, so it is
    likely model/operator generated;
  - README-absent workspaces still had rail guidance that could over-emphasize
    README or `.persona/policies` directory reading;
  - `workflow implement`, `workflow continue`, and `plan --implement` now
    explicitly handle README absence and guide agents to repo-relative
    source-of-truth files: `.persona/project-profile.jsonc`,
    `.persona/policies/overlay.jsonc`, `.persona/workflow/plan.md`, and the
    current ticket / requirements source;
  - README-present behavior keeps README chunk guidance;
  - this reduces entry/context ambiguity but does not guarantee model
    follow-through, weaken finish gates, auto-fill reports, or auto-archive
    tickets;
- current-head `a307ac0` Windows operator retry confirmed preflight progress but
  remained implementation-to-finish PARTIAL/NOT PASS:
  - result:
    `/Users/yongtae/Desktop/persona-harness-artifacts/archive/2026-06-24-desktop-persona-runs/current-head-a307ac0-windows-operator-retry-20260629-212905/RESULT.md`;
  - stale `dist` was fixed, approve/split/next command surface was available,
    lossy `???` stdin was rejected, Korean was preserved, no-token
    workflow/closure preflight passed, README-absent guidance was observed, and
    the malformed duplicated `.persona/policies` path did not recur;
  - OpenCode read `.persona/policies/overlay.jsonc`, but no app output was
    generated and `src` / Gradle files were absent;
  - the model still filled reports/report-filled and archived `step-1`;
  - final `workflow finish implement` exited 1 on `STACK_MISMATCH` plus pending
    `step-2`, `step-3`, and `step-4`;
  - interpretation: previous Windows input/packaging/README-absent path
    blockers improved or resolved, while the new blocker is report/archive
    integrity before final finish. The finish gate correctly blocked, but
    report-filled/archive steps may be too permissive before real
    implementation/evidence. Stable `0.4.0` remains deferred;
- current HEAD `8660ef3 fix(cli): guard ticket archive on closure blockers`
  addresses the archive side of that integrity blocker:
  - `plan --report-filled` remains a report marker, not a product-quality gate;
  - `workflow archive <ticket>` now reads closure state and refuses to move work
    to history when non-ticket closure blockers remain;
  - archive-blocking non-ticket blockers include `verification-unknown`,
    `evidence-missing`, `report-coverage-missing`, and stack / verification /
    report blockers;
  - pending-ticket and history-repair blockers are not archive blockers;
  - if reports are marked filled but no app/evidence/verification exists,
    archive exits 1 and leaves backlog/work ticket pending;
  - no report auto-fill, no auto-archive, and no finish gate weakening is
    introduced;
- current-head `8660ef3` Windows operator retry then classified as
  INTEGRITY-PASS/PARTIAL:
  - archive:
    `/Users/yongtae/Desktop/persona-harness-artifacts/archive/2026-06-24-desktop-persona-runs/current-head-8660ef3-windows-operator-retry-20260629-221043/RESULT.md`;
  - fresh tarball preflight passed: prepack/build, approve/split/next/archive
    command surface, lossy `???` rejection, Korean UTF-8 preservation,
    README-absent guidance, and no-token workflow/closure preflight;
  - no-app/no-evidence `workflow archive step-1` exited 1 with
    `verification-unknown`, `implementation-report-missing`, and
    `review-report-missing`, and `workflow next` kept `step-1` current;
  - after OpenCode generated a minimal Java/Spring/Gradle skeleton and evidence
    made verification passed, `step-1` moved to history;
  - final finish still exited 1 because `step-2`, `step-3`, and `step-4`
    remained pending, with backend-shape WARNs remaining;
  - interpretation: integrity guard verified; single ticket archived after
    evidence; finish blocked correctly due pending tickets, so stable `0.4.0`
    remains deferred;
- current HEAD `0784135 fix(cli): block controller repository closure` adds
  the first scoped hard convention blocker:
  - existing observer signal `controller.repository-dependency` is promoted to
    hard workflow closure blocker
    `architecture-controller-repository-direct-dependency`;
  - applies only to ready Java/Spring service-layer profile styles and only
    when typed evidence names the Controller, Repository, source file, and
    direct dependency;
  - `workflow check`, `workflow closure next --json`, `workflow continue`,
    `workflow finish implement`, and `workflow archive <ticket>` surface/block
    this violation consistently;
  - action wording tells the agent to route the Controller through a Service
    layer instead;
  - compliant Controller -> Service -> Repository paths have no architecture
    blocker;
  - other backend-shape WARNs remain report-only; this is not broad
    architecture correctness enforcement and does not add `closure run`, custom
    conventions, report auto-fill, auto-archive, or finish gate weakening;
- current HEAD `7fda771f74008f42082c3a85377262c8fc7ccf5f` has GUARD Phase
  0-3 QA PASS and package-surface smoke PASS on a fresh current tarball, not the
  published `0.4.0-rc.1 @next` package:
  - included commits: `c2819ac fix(cli): add opt-in direct verification gate`,
    `ffeafa9 fix(cli): support convention blocker levels`,
    `2f561a0 fix(runtime): warn on write-time convention violations`, and
    `7fda771 refactor(cli): add convention registry`;
  - QA verification: focused 134 tests PASS, full `npm test` 70 files / 486
    tests PASS, typecheck PASS, build PASS, product smoke PASS, and built CLI
    smoke PASS;
  - package-surface smoke tarball:
    `/Users/yongtae/Desktop/persona-harness-artifacts/archive/2026-06-24-desktop-persona-runs/current-head-7fda771-guard-package-surface-smoke-20260630-001558/pack/persona-harness-0.4.0-rc.1.tgz`;
    shasum `b703953aab409f1cd7ac578c5af76b3d3e42cf90`, sha256
    `2155ac28c48367c85d2a4163ba56ecea5dd1842b1d0e0935313c665ab9d55b7c`;
  - Phase 0 PASS: opt-in `enforce.executeVerification: true` direct
    verification gate for the supported Java/Spring/Gradle slice. Fake
    agent-written passed evidence no longer passes; PH-run direct `gradlew
    test` / JUnit success passes; JUnit failure blocks. Disabled mode keeps the
    existing structured bearshell evidence flow;
  - Phase 1 PASS: convention levels `report|warn|block`; the scoped
    `controller.repository-dependency` block level creates
    `architecture-controller-repository-direct-dependency`; warn/report do not
    hard-block and compliant Controller -> Service -> Repository has no blocker;
  - Phase 2 PASS/PARTIAL by design: write-time convention guard is
    warning-only because hook deny/rewrite is not supported by the current plugin
    hook result type. Do not call this hard enforcement;
  - Phase 3 PASS: convention registry aligns id/default level/blocker/fix path
    across observe, check, closure, continue, and write-warning surfaces. BYO
    `.persona/conventions/*.yml` ast-grep authoring remains future work;
  - boundaries: scoped product enforcement behavior only; no eval/A-B proof, PH
    superiority, generated app quality certification, broad architecture
    correctness, general reliability, or closure guarantee;
- post-rc1 current HEAD includes `002359c fix(cli): reject lossy Windows stdin
  mojibake` after the rc1 Windows implementation trial was blocked before the
  model by an ASCII-safe script using
  `Get-Content -Raw | npx ph workflow draft --stdin`; PowerShell 5.x can read
  UTF-8 no-BOM files as ANSI/CP949 first and produce already-lossy text such as
  `媛꾨떒??????API 留뚮뱾?`;
- for future Windows file-pipe trials, use
  `Get-Content -LiteralPath <path> -Raw -Encoding UTF8 | npx ph workflow draft --stdin`
  and the same `-Encoding UTF8` form for `workflow capture --stdin`; the new
  guard rejects lossy mojibake nonzero instead of writing corrupted
  requirements, but it cannot repair existing broken artifacts and is not in
  the published rc1 registry package until a future package includes it;
- watch report consistency/noise during soak: `verification passed` plus
  report-only WARN/backend-shape split can confuse users;
- keep `closure run` deferred unless repeated same-step friction appears;
- do not move to stable `0.4.0` until those preconditions are addressed.

Boundary:

- product usability smoke only;
- no eval/A-B evidence;
- no PH superiority proof;
- no generated app quality certification;
- no closure guarantee;
- no general reliability guarantee;
- no `latest` move.
