diff --git a/.gitattributes b/.gitattributes
index 678bce8..239061f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -24,6 +24,10 @@
*.svg text eol=lf
*.cff text eol=lf
+# The fallback selection source is retained byte-for-byte alongside its
+# newline-normalized, human-readable JSON projection.
+benchmarks/evidence/alignment-external-v1/*.raw binary
+
# Anything genuinely binary must never be touched.
*.png binary
*.jpg binary
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 46023ef..00242f2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,40 @@ All notable changes to miniVERL are recorded here. The format follows
## [Unreleased]
+## [0.7.0] - 2026-08-10
+
+### External Alignment Gate result
+
+- The first preregistered external-alignment study terminated at starting-
+ checkpoint selection. Two declared lineages and eight candidates all
+ measured 0/64 retained JSONNav utility against the unchanged 20% floor. No
+ checkpoint was selected; teacher qualification, continuation SFT/DPO/KD/OPD
+ training and the reserved final test did not run. This is a study-design and
+ precondition finding, not a post-training method comparison.
+- Added a schema-valid early-stop result and 512 privacy-safe JSONNav
+ selection rows. `miniverl pilot --study-result ...` returns
+ `do_not_continue_this_study` and `insufficient_evidence` without turning one
+ stopped study into a universal method recommendation.
+- Preserved the original fallback selection artifact and published a corrected
+ lineage-only projection plus correction manifest. The primary and fallback
+ selection manifests are disclosed as separately generated but byte- and
+ task-identical, not independent samples.
+- Granite Guardian values are explicitly unqualified diagnostics. Granite and
+ PairRM qualification, PairRM method preference and teacher qualification are
+ `not_run`; the necessary retained-utility failure does not depend on them.
+- Added a generated checkpoint gate matrix and study-flow diagram with mobile
+ layouts, plus the external-study page, English/Chinese release framing and
+ browser visual coverage.
+
+### Foundation and artifact hardening
+
+- The bridge validates bundle trees before opening content; refuses symlinks,
+ reparse points, non-regular or escaping entries and bounded-tree violations;
+ and distinguishes complete, incomplete and uninspected privacy checks.
+- Dataset extension sidecars bind source digest and row count, conversion
+ revalidates source identity before publication, and row provenance uses
+ bounded contiguous runs.
+
### Fixed
- A reward scaffold saved with a UTF-8 byte-order mark is no longer reported as
@@ -768,7 +802,8 @@ Same-tokenizer only; one trajectory per forward pass; `swap` unavailable for
quantized models; only Qwen3 and Qwen2 architectures tested; single-seed GPU
results. The full list is in `docs/limitations.md`.
-[Unreleased]: https://github.com/DaoyuanLi2816/mini-verl/compare/v0.6.3...HEAD
+[Unreleased]: https://github.com/DaoyuanLi2816/mini-verl/compare/v0.7.0...HEAD
+[0.7.0]: https://github.com/DaoyuanLi2816/mini-verl/compare/v0.6.3...v0.7.0
[0.6.3]: https://github.com/DaoyuanLi2816/mini-verl/compare/v0.6.2...v0.6.3
[0.6.2]: https://github.com/DaoyuanLi2816/mini-verl/compare/v0.6.1...v0.6.2
[0.6.1]: https://github.com/DaoyuanLi2816/mini-verl/compare/v0.6.0...v0.6.1
diff --git a/CITATION.cff b/CITATION.cff
index b70d900..c306427 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -2,8 +2,8 @@ cff-version: 1.2.0
title: "miniVERL: Auditable single-GPU alignment and distillation runtime"
message: "If you use miniVERL in your work, please cite it as below."
type: software
-version: 0.6.3
-date-released: 2026-08-06
+version: 0.7.0
+date-released: 2026-08-10
license: Apache-2.0
repository-code: "https://github.com/DaoyuanLi2816/mini-verl"
url: "https://github.com/DaoyuanLi2816/mini-verl"
@@ -32,7 +32,11 @@ abstract: >-
algorithmic parity with PPO. miniVERL is designed for one personal CUDA GPU,
automatically selects bf16 or fp16, and requires neither Ray nor a cluster.
Published performance is measured on one RTX 4080; other GPU models use the
- same code path but remain unmeasured.
+ same code path but remain unmeasured. The v0.7.0 external-alignment study
+ terminated at its preregistered checkpoint-selection gate: two declared
+ lineages and eight candidates all scored 0/64 retained JSONNav utility, so
+ no teacher qualification, continuation method comparison or reserved final
+ test was run.
authors:
- family-names: Li
given-names: Daoyuan
diff --git a/PROJECT_STATE.md b/PROJECT_STATE.md
index d964c47..4cc89d5 100644
--- a/PROJECT_STATE.md
+++ b/PROJECT_STATE.md
@@ -6,16 +6,39 @@ and what it printed.
Last updated: 2026-08-10.
-Canonical release state: stable `v0.6.3` (`005a4549da713716e64c3ae80ff55fb131519f79`), development `0.7.0.dev0`.
+Canonical release state: releasing `v0.7.0`.
Every public version claim is generated from `release-state.yaml` and gated by
`python scripts/release_state.py --check`.
-## v0.7.0 External alignment evidence — IN PROGRESS
+## v0.7.0 External Alignment Gate — EVIDENCE RELEASE IN PROGRESS
-Branch `v0.7.0-foundation`, based on `0bd194600aeb65b90eadd14bfa1ec313aa2a9c36`.
-Not yet pushed. Commit author is
-`Daoyuan Li <94409450+DaoyuanLi2816@users.noreply.github.com>` on every commit,
-matching the 9:1 dominant identity since v0.6.0.
+Branch `v0.7.0-evidence-release` starts from the exact post-PR-#52 main commit
+`a8272e2b5674e12107461a81d285f1a3d56588a5`. PR #51 merged the public
+preregistration/outcome as `c50aa93b95e6fe4a6aa6251491d3c2b5a9480ebe`;
+PR #52 corrected the handoff boundary before merge. Every source commit author
+is `Daoyuan Li <94409450+DaoyuanLi2816@users.noreply.github.com>`.
+
+Current scientific state is terminal and unchanged: two declared lineages,
+eight candidates, 0/64 JSONNav retained utility for every candidate, no
+selected checkpoint, no teacher qualification, no continuation method and no
+final-test access. The release work is evidence projection and documentation,
+not a restarted experiment.
+
+### Evidence-release identities
+
+| evidence | state / SHA-256 |
+| --- | --- |
+| original fallback selection | preserved byte-for-byte; `53efeb1af196fe8a2fd3733f3f9d6a9ce101fcc76365fc45515adc47cc7d3cd3` |
+| corrected fallback projection | lineage metadata only; `6f23de43f03a69275d8bedc9b029a1b728fb2004a9b3a225c66ba1fee671592b` |
+| primary / fallback selection manifests | both `e1e165e3547c7784b17e93b7e665df66ea6cafa70bec093a69377bc6683bc20b`; separately generated, task-identical, not independent |
+| portable JSONNav selection rows | 512 rows, no prompts/responses/absolute paths; `18d5733e70bfe292e282bd5b6e3fc94869837fab30a151a642aa11c3e4c9d771` |
+| early-stop result | schema-validated; digest recorded by the final release validation |
+| final test | `not_accessed`, zero tasks scored |
+
+Amendment 4 is explicitly post-selection and pre-release. It changes no
+quantitative value, gate, threshold, endpoint or decision. Granite Guardian is
+an unqualified diagnostic only; Granite and PairRM qualification, method-level
+preference evaluation and teacher qualification are `not_run`.
### Phase A progress
@@ -209,11 +232,11 @@ harmful compliance 0.37–0.77 with room to fall. Only utility is a hard zero.
### The zero was validated before it was believed
-Every rollout ended at `PARSE_ERROR_LIMIT` with **zero tool calls emitted** and
-exactly 128 tokens — a uniform deterministic failure across four adapters
-including the base model. That signature fits a misconfigured harness as well
-as an incapable policy, and 128 = 2 turns x the 64-token per-turn budget is
-exactly what a too-small budget would produce.
+Every primary-lineage rollout ended at `PARSE_ERROR_LIMIT` with zero valid tool
+calls and exactly 128 tokens. Fallback-lineage rollouts emitted two to four
+JSONNav tool calls and ended by final answer, max turns or repeated-call limit,
+but still solved 0/64 for every adapter. These are distinct observed failure
+behaviors, not one uniform signature.
The environment's oracle clears the identical settings 8/8, all
`FINAL_ANSWER`, at 64, 128 and 256 tokens per turn and at both difficulties.
@@ -257,13 +280,21 @@ Contributor audit over the merged range: 16 commits, sole author
GPU spent across all of v0.7 so far: **1.2 hours** of the 48-hour envelope,
peak reserved 5.25 GiB against the 14.5 GiB gate.
-### Next action
-
-Both lineages failed and the outcome is merged. The next session executes
-`docs/handoffs/v0.7.0-final-execution-prompt.md`: make `miniverl pilot` return
-the recommendation against downstream alignment, write the study page and its
-data-bound figures, update both READMEs, add an evidence comment to issue #39
-while keeping it open, and release v0.7.0.
+### Release action
+
+The evidence-release branch adds the schema-valid early-stop result, portable
+selection rows, original/corrected fallback relation, identical-suite
+disclosure, `miniverl pilot --study-result`, the study page and data-bound
+figures. After its full green validation it will release v0.7.0, add an
+evidence comment to issue #39 while keeping the issue open, then advance main
+to `0.7.1.dev0` through a separate state-sync PR.
+
+Local release gates on implementation commit `013993a8cd5002a9ed166ba1e6948305f92c1bfb`
+plus its quality-record-only update pass 2,098 CPU tests with 6 platform skips
+and 21 deselections at 86.35% combined branch coverage. The available RTX 4080
+suite passes 8 tests and the opt-in network suite passes 15. Ruff, format,
+mypy, actionlint, strict MkDocs, four-viewport browser checks, package/Twine,
+clean-install and extracted-sdist gates pass.
No continuation arm, no teacher qualification and no method comparison will
run — none of them is scientifically authorized by the selection outcome.
diff --git a/PYPI.md b/PYPI.md
index 4a3ac4c..6931f7d 100644
--- a/PYPI.md
+++ b/PYPI.md
@@ -1,5 +1,5 @@
+
+The optional Granite harmful-compliance numbers are deliberately absent from
+this headline matrix. Granite Guardian was executed only as an **unqualified
+diagnostic**; the decision does not depend on it.
+
+## Harness validation
+
+The environment oracle solved 8/8 tasks under the pinned path, and the
+executable regression also checks the 64-, 128- and 256-token per-turn budgets
+and both difficulty levels. This rules out a broken JSONNav environment path;
+it does not turn either candidate lineage into a competent JSONNav policy.
+
+## Why the lineages lacked matched utility competence
+
+HH-RLHF is conversational preference data, not a JSONNav tool-use corpus. The
+fallback anchor did have measured strict tool-protocol competence, but on the
+separate `tool_policy` environment with different tools and state. Its public
+provenance does not establish JSONNav competence. In retrospect, the gate
+tested a precondition neither lineage met. Changing that endpoint after seeing
+the zero would invalidate the preregistration, so it was retained and the
+design mismatch is the published finding.
+
+## Identical-suite disclosure
+
+The primary and fallback selection manifests were separately generated from
+the same deterministic seed, endpoint counts, algorithm and reserved final
+IDs. They are byte-identical (SHA-256
+`e1e165e3547c7784b17e93b7e665df66ea6cafa70bec093a69377bc6683bc20b`),
+contain identical task IDs and are disjoint from the final suite. They are
+**not independent evaluation samples**. Using the same tasks has no effect on
+the conclusion that both lineages failed the necessary gate, but it limits how
+the two runs may be described.
+
+## Metadata correction and provenance
+
+The fallback generator hard-coded the primary lineage label. Original bytes
+are preserved with SHA-256
+`53efeb1af196fe8a2fd3733f3f9d6a9ce101fcc76365fc45515adc47cc7d3cd3`.
+The [corrected projection](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.7.0/benchmarks/evidence/alignment-external-v1/fallback-start-selection.corrected.json)
+has SHA-256
+`6f23de43f03a69275d8bedc9b029a1b728fb2004a9b3a225c66ba1fee671592b`.
+Only `lineage`, `lineage_id`, `lineage_description` and `lineage_anchor` differ;
+candidate metrics and the selection decision compare equal. See the
+[correction manifest](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.7.0/benchmarks/evidence/alignment-external-v1/fallback-correction-manifest.json).
+
+## Evaluator qualification boundary
+
+| evaluator | implementation | execution | qualification | result use |
+| --- | --- | --- | --- | --- |
+| IFEval | implemented | selection split | not required | selection metric |
+| XSTest string match | implemented | selection split | not required | scoped refusal metric |
+| Granite Guardian | implemented | selection split | **not run** | unqualified diagnostic only |
+| PairRM | implemented | method comparison not run | **not run** | no preference result |
+| Teacher | — | not run | **not run** | requires a selected checkpoint |
+
+The XSTest result uses the documented string-match classifier, not a GPT-4
+judge. No evaluator or teacher qualification artifact exists, and no human
+preference measurement exists.
+
+## Cost and stopped work
+
+Primary selection used 2,454.4 GPU-seconds and 5.246 GiB peak reserved VRAM;
+fallback selection used 1,764.4 GPU-seconds and 5.145 GiB. Candidate training
+cost is reported separately in the preserved manifests. No teacher
+qualification, continuation training or final-test generation was run after
+the stop.
+
+## What v0.7.0 establishes
+
+It establishes that the preregistered fail-fast gate was enforced; both
+declared starting-policy lineages lacked competence on the selected retained-
+utility environment; the portable endpoint and evidence infrastructure can
+represent an early stop without fabricating method rows; and the original
+metadata defect is traceable.
+
+It does **not** establish whether OPD is better or worse than SFT, DPO or KD;
+does not qualify Granite, PairRM or a teacher; does not provide a broad safety
+result; and does not access the reserved final test. A future comparison would
+require a preregistered starting lineage with independently established,
+task-matched retained utility. That is a limitation, not a roadmap commitment.
+
+## Reproduce the evidence-only checks
+
+```bash
+python scripts/publish_alignment_external_artifacts.py
+miniverl pilot --study-result benchmarks/results/alignment-external-v1.json --json
+pytest -q tests/unit/test_alignment_external_evidence_release.py
+```
+
+The portable JSONNav evidence contains 512 rows and no prompts, response text
+or absolute paths. Its SHA-256 is
+`18d5733e70bfe292e282bd5b6e3fc94869837fab30a151a642aa11c3e4c9d771`.
diff --git a/docs/alignment-external/checkpoint-gate-matrix-mobile.svg b/docs/alignment-external/checkpoint-gate-matrix-mobile.svg
new file mode 100644
index 0000000..a4961d5
--- /dev/null
+++ b/docs/alignment-external/checkpoint-gate-matrix-mobile.svg
@@ -0,0 +1,51 @@
+
diff --git a/docs/alignment-external/checkpoint-gate-matrix.svg b/docs/alignment-external/checkpoint-gate-matrix.svg
new file mode 100644
index 0000000..8ffb97a
--- /dev/null
+++ b/docs/alignment-external/checkpoint-gate-matrix.svg
@@ -0,0 +1,63 @@
+
diff --git a/docs/alignment-external/study-early-stop-mobile.svg b/docs/alignment-external/study-early-stop-mobile.svg
new file mode 100644
index 0000000..580c235
--- /dev/null
+++ b/docs/alignment-external/study-early-stop-mobile.svg
@@ -0,0 +1,32 @@
+
diff --git a/docs/alignment-external/study-early-stop.svg b/docs/alignment-external/study-early-stop.svg
new file mode 100644
index 0000000..966ff8f
--- /dev/null
+++ b/docs/alignment-external/study-early-stop.svg
@@ -0,0 +1,32 @@
+
diff --git a/docs/generated/quality.json b/docs/generated/quality.json
index 50ac7a6..ae76639 100644
--- a/docs/generated/quality.json
+++ b/docs/generated/quality.json
@@ -1,41 +1,41 @@
{
"schema_version": 2,
- "release": "0.6.3",
- "status": "released",
- "quality_floor": "1,560+ tests and 85%+ branch coverage at v0.6.3",
+ "release": "0.7.0",
+ "status": "candidate",
+ "quality_floor": "2,000+ tests and 85%+ branch coverage at v0.7.0",
"local_validation": {
"scope": "the maintainer's workstation, where the GPU and Windows-specific paths actually run",
- "commit": "e8a36db60b2146b684204df8a8bea3e20c11d8e4",
- "commit_relationship": "final pull-request head; the squash merge that became the release commit has a different hash and was not itself measured here",
- "measured_at": "2026-08-05T18:20:00-07:00",
+ "commit": "013993a8cd5002a9ed166ba1e6948305f92c1bfb",
+ "commit_relationship": "implementation commit plus the following quality-record-only update; the final pull-request head is validated by CI",
+ "measured_at": "2026-08-10T23:56:04-07:00",
"platform": "Windows 11 Pro 10.0.22631",
"python": "CPython 3.12",
"coverage_mode": "branch",
"cpu_non_gpu_non_network": {
- "passed": 1830,
- "skipped": 2,
- "deselected": 6,
- "branch_coverage_percent": 86.1,
+ "passed": 2098,
+ "skipped": 6,
+ "deselected": 21,
+ "branch_coverage_percent": 86.35,
"skip_reason": "symlink creation requires privileges on Windows; hard-link and case aliases cover the same guard"
},
"gpu": {
- "passed": 5,
+ "passed": 8,
"hardware": "NVIDIA GeForce RTX 4080"
},
"network": {
- "passed": 3
+ "passed": 15
}
},
"release_validation": {
"scope": "the exact published commit, validated by CI rather than locally",
- "commit": "005a4549da713716e64c3ae80ff55fb131519f79",
+ "commit": "pending",
"workflows": {
"ci": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31080175904",
"build": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31080175961",
"docs": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31080175972",
"release": "https://github.com/DaoyuanLi2816/mini-verl/actions/runs/31084165317"
},
- "conclusion": "success",
+ "conclusion": "pending exact release-commit CI",
"gpu_coverage": "none; no GPU runner is configured for this repository, so the GPU counts above exist only from the local measurement"
}
}
diff --git a/docs/index.md b/docs/index.md
index dc69100..fee9eb6 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -24,6 +24,20 @@ The result is a typed trajectory log, checksummed teacher cache, manifest and
self-contained report. For CUDA wheels and memory-aware recipes, use the
[single-GPU guide](single-gpu-guide.md).
+## v0.7.0 evidence release: the external study stopped at its first gate
+
+**0 selected checkpoints · 0 qualified teachers · 0 continuation arms · 0
+final-test tasks accessed.** Every candidate in both declared lineages scored
+0/64 retained JSONNav utility against an unchanged 20% floor. The result is a
+preregistered checkpoint-selection failure, not a method comparison.
+
+```bash
+miniverl pilot --study-result benchmarks/results/alignment-external-v1.json --json
+```
+
+[Read the early-stop study](alignment-external/alignment-external-v1.md){ .md-button .md-button--primary }
+[Inspect the evidence contract](https://github.com/DaoyuanLi2816/mini-verl/blob/v0.7.0/benchmarks/results/alignment-external-v1.json){ .md-button }
+
## Choose a path