diff --git a/.github/scripts/test_milestone_e_prep_guard_sequence_index.py b/.github/scripts/test_milestone_e_prep_guard_sequence_index.py index 5e7e452e..f444e815 100644 --- a/.github/scripts/test_milestone_e_prep_guard_sequence_index.py +++ b/.github/scripts/test_milestone_e_prep_guard_sequence_index.py @@ -107,6 +107,7 @@ "$(PYTHON) .github/scripts/test_milestone_e_package_publication_decision_bundle_validation_record.py", "$(PYTHON) .github/scripts/test_milestone_e_package_publication_pre_approval_gap_ledger.py", "$(PYTHON) .github/scripts/test_milestone_e_public_facing_readiness_ledger.py", + "$(PYTHON) .github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py", "$(PYTHON) .github/scripts/test_milestone_e_validation_command_index.py", "$(PYTHON) .github/scripts/test_milestone_e_validation_command_index_validation_record.py", "$(PYTHON) .github/scripts/test_milestone_e_validation_record_index.py", diff --git a/.github/scripts/test_milestone_e_prep_scope.py b/.github/scripts/test_milestone_e_prep_scope.py index 2140f4ad..3759e025 100644 --- a/.github/scripts/test_milestone_e_prep_scope.py +++ b/.github/scripts/test_milestone_e_prep_scope.py @@ -406,6 +406,7 @@ def test_make_target_is_narrow_and_guarded(self) -> None: "$(PYTHON) .github/scripts/test_milestone_e_package_publication_decision_bundle_validation_record.py", "$(PYTHON) .github/scripts/test_milestone_e_package_publication_pre_approval_gap_ledger.py", "$(PYTHON) .github/scripts/test_milestone_e_public_facing_readiness_ledger.py", + "$(PYTHON) .github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py", "$(PYTHON) .github/scripts/test_milestone_e_validation_command_index.py", "$(PYTHON) .github/scripts/test_milestone_e_validation_command_index_validation_record.py", "$(PYTHON) .github/scripts/test_milestone_e_validation_record_index.py", diff --git a/.github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py b/.github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py new file mode 100644 index 00000000..504cfab9 --- /dev/null +++ b/.github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py @@ -0,0 +1,245 @@ +#!/usr/bin/env python3 +# +# Copyright 2026 The Ethos maintainers +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import annotations + +import json +import re +import subprocess +import unittest +from pathlib import Path + +from makefile_guard import target_block + + +ROOT = Path(__file__).resolve().parents[2] +PREP = ROOT / "docs/milestone-e-public-beta-current-main-refresh-prep.json" +SCHEMA = ROOT / "schemas/ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json" +PUBLIC_BETA_PREP = ROOT / "docs/milestone-e-public-beta-approval-prep.json" +READINESS_LEDGER = ROOT / "docs/milestone-e-public-facing-readiness-ledger.json" +RECORD = ( + ROOT + / "docs/validation/" + "milestone-e-public-beta-current-main-refresh-prep-validation-2026-06-21.md" +) +VALIDATION_README = ROOT / "docs/validation/README.md" +PREP_SCOPE = ROOT / "docs/milestone-e-prep-scope.md" +ROADMAP = ROOT / "docs/roadmap.md" +EXECUTION_STATUS = ROOT / "docs/execution-status.md" +SCHEMAS_README = ROOT / "schemas/README.md" +VALIDATE_EXAMPLES = ROOT / "schemas/validate_examples.py" +CI_WORKFLOW = ROOT / ".github/workflows/ci.yml" + +REFRESH_COMMIT = "9262b281ee2cfb7fb0c9adf9f70afafe624e6878" +REFRESH_TREE = "9f18f9e40c57551aef9b0cb2a53641c87207546b" +EXPECTED_BOUNDARY = [ + "public reports remain blocked", + "release artifacts remain blocked", + "package publication remains blocked", + "hosted surfaces remain blocked", + "public result wording remains blocked", + "performance claims remain blocked", + "quality claims remain blocked", + "footprint claims remain blocked", + "table-quality claims remain blocked", + "parser-quality claims remain blocked", +] +FORBIDDEN_SCOPE_EXPANSION = [ + "public reports are approved", + "public result wording approved", + "release-ready", + "release artifact approved", + "package-ready", + "package publication is approved", + "package publication approved", + "packages are published", + "published packages", + "production-ready", + "production positioning approved", + "benchmark-validated", + "public benchmark pass", + "speed validated", + "fastest", + "launch-ready", + "hosted surface approved", + "hosted demo approved", + "demo-ready", + "performance validated", + "quality validated", + "footprint validated", + "table-quality validated", + "parser-quality validated", +] + + +def read(path: Path) -> str: + return path.read_text(encoding="utf-8") + + +def normalized(path: Path) -> str: + return re.sub(r"\s+", " ", read(path)) + + +def load_json(path: Path) -> dict: + return json.loads(path.read_text(encoding="utf-8")) + + +def git(*args: str) -> str: + return subprocess.check_output( + ["git", *args], + cwd=ROOT, + encoding="utf-8", + stderr=subprocess.DEVNULL, + ).strip() + + +class MilestoneEPublicBetaCurrentMainRefreshPrepTests(unittest.TestCase): + def test_refresh_prep_records_candidate_without_approval(self) -> None: + prep = load_json(PREP) + + self.assertEqual(1, prep["schema_version"]) + self.assertEqual("source-only-pre-alpha-internal-milestone-e-prep", prep["status"]) + self.assertEqual("public_beta_current_main_refresh_prep", prep["scope"]) + self.assertEqual("public-beta-approval", prep["lane_id"]) + self.assertEqual("current_main_refresh_prepared_approval_blocked", prep["decision_state"]) + self.assertEqual(REFRESH_COMMIT, prep["refresh_candidate"]["candidate_commit"]) + self.assertEqual(REFRESH_TREE, prep["refresh_candidate"]["candidate_tree"]) + self.assertIn("no refreshed source approval", prep["refresh_candidate"]["candidate_state"]) + self.assertEqual(EXPECTED_BOUNDARY, prep["public_boundary"]) + + def test_refresh_candidate_resolves_in_repository_history(self) -> None: + prep = load_json(PREP) + + self.assertEqual(REFRESH_COMMIT, git("rev-parse", REFRESH_COMMIT)) + self.assertEqual(REFRESH_TREE, git("rev-parse", f"{REFRESH_COMMIT}^{{tree}}")) + subprocess.check_call( + ["git", "merge-base", "--is-ancestor", REFRESH_COMMIT, "HEAD"], + cwd=ROOT, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + self.assertEqual(REFRESH_COMMIT, prep["refresh_candidate"]["candidate_commit"]) + self.assertEqual(REFRESH_TREE, prep["refresh_candidate"]["candidate_tree"]) + + def test_existing_public_beta_and_readiness_bindings_stay_separate(self) -> None: + prep = load_json(PREP) + public_beta = load_json(PUBLIC_BETA_PREP) + readiness = load_json(READINESS_LEDGER) + + self.assertEqual(public_beta["approved_public_beta_source"], prep["existing_public_beta_source"]) + self.assertEqual( + readiness["current_main_refresh_candidate"]["candidate_commit"], + prep["prior_readiness_ledger_candidate"]["candidate_commit"], + ) + self.assertNotEqual( + prep["existing_public_beta_source"]["tree"], + prep["refresh_candidate"]["candidate_tree"], + ) + self.assertNotEqual( + prep["prior_readiness_ledger_candidate"]["candidate_tree"], + prep["refresh_candidate"]["candidate_tree"], + ) + + def test_required_evidence_non_approvals_and_blockers_are_explicit(self) -> None: + prep = load_json(PREP) + + self.assertEqual(7, len(prep["refresh_required_evidence"])) + self.assertEqual(8, len(prep["refresh_non_approvals"])) + self.assertEqual(14, len(prep["retained_blockers"])) + self.assertIn("dedicated source-only public beta refresh decision record", prep["refresh_required_evidence"]) + self.assertIn("exact refreshed source commit and tree", prep["refresh_required_evidence"]) + self.assertIn("this prep does not refresh the reviewed public beta source state", prep["refresh_non_approvals"]) + self.assertIn("this prep does not approve package publication", prep["refresh_non_approvals"]) + self.assertIn("package publication remains blocked", prep["retained_blockers"]) + self.assertIn("public installation remains blocked", prep["retained_blockers"]) + self.assertIn("public benchmark claims remain blocked", prep["retained_blockers"]) + + def test_schema_validation_covers_current_main_refresh_prep(self) -> None: + schema = load_json(SCHEMA) + validate_examples = read(VALIDATE_EXAMPLES) + schemas_readme = read(SCHEMAS_README) + + self.assertEqual(False, schema["additionalProperties"]) + self.assertIn("refresh_candidate", schema["required"]) + self.assertIn("existing_public_beta_source", schema["required"]) + self.assertEqual(7, schema["properties"]["refresh_required_evidence"]["minItems"]) + self.assertEqual(8, schema["properties"]["refresh_non_approvals"]["minItems"]) + self.assertIn("ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json", validate_examples) + self.assertIn("docs\" / \"milestone-e-public-beta-current-main-refresh-prep.json", validate_examples) + self.assertIn("ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json", schemas_readme) + self.assertIn("docs/milestone-e-public-beta-current-main-refresh-prep.json", schemas_readme) + + def test_validation_record_indexes_commands_and_boundaries(self) -> None: + readme = read(VALIDATION_README) + record = normalized(RECORD) + record_lower = record.lower() + prep = load_json(PREP) + + self.assertIn(RECORD.name, readme) + self.assertIn("public beta current-main refresh prep validation", re.sub(r"\s+", " ", readme)) + self.assertIn("Validated source HEAD before this record: `9262b28`", read(RECORD)) + for gate in prep["required_gates"]: + self.assertIn(gate, record) + for blocker in prep["retained_blockers"]: + self.assertIn(blocker.lower(), record_lower) + self.assertIn("Ethos remains source-only pre-alpha", record) + self.assertIn("Public reports remain blocked", record) + self.assertIn("Public result wording remains blocked", record) + + def test_docs_reference_current_main_refresh_prep(self) -> None: + for path in (PREP_SCOPE, ROADMAP, EXECUTION_STATUS, VALIDATION_README): + doc = normalized(path) + + self.assertIn("docs/milestone-e-public-beta-current-main-refresh-prep.json", doc, str(path)) + self.assertIn("public beta current-main refresh prep", doc, str(path)) + self.assertIn("current-main refresh candidate", doc, str(path)) + self.assertIn("package publication remains blocked", doc, str(path)) + + def test_make_and_ci_run_refresh_prep_after_readiness_ledger(self) -> None: + make_block = target_block("milestone-e-prep") + ci = read(CI_WORKFLOW) + readiness_guard = "test_milestone_e_public_facing_readiness_ledger.py" + refresh_guard = "test_milestone_e_public_beta_current_main_refresh_prep.py" + command_guard = "test_milestone_e_validation_command_index.py" + + for text, prefix in ((make_block, "$(PYTHON) .github/scripts/"), (ci, "python3 .github/scripts/")): + self.assertIn(prefix + refresh_guard, text) + self.assertEqual(1, text.count(prefix + refresh_guard)) + self.assertLess(text.index(prefix + readiness_guard), text.index(prefix + refresh_guard)) + self.assertLess(text.index(prefix + refresh_guard), text.index(prefix + command_guard)) + + def test_refresh_prep_avoids_scope_expansion_language_or_private_paths(self) -> None: + lower = json.dumps(load_json(PREP), sort_keys=True).lower() + record_lower = normalized(RECORD).lower() + raw = read(PREP) + read(RECORD) + + for phrase in FORBIDDEN_SCOPE_EXPANSION: + self.assertNotIn(phrase, lower) + self.assertNotIn(phrase, record_lower) + self.assertNotIn("/Users/", raw) + self.assertNotIn("/private/tmp", raw) + self.assertNotIn("/private/var", raw) + self.assertNotIn("/var/folders", raw) + self.assertNotIn("saumildiwaker", raw) + self.assertNotIn("Desktop/Stuff", raw) + self.assertNotIn("project/repo/ethos", raw) + self.assertNotIn("docs/.roadmap.md.swp", raw) + self.assertNotIn("web/", raw) + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/scripts/test_milestone_e_public_boundary_alignment.py b/.github/scripts/test_milestone_e_public_boundary_alignment.py index e0a9c788..8438eab9 100644 --- a/.github/scripts/test_milestone_e_public_boundary_alignment.py +++ b/.github/scripts/test_milestone_e_public_boundary_alignment.py @@ -89,6 +89,10 @@ class BoundaryArtifact: "docs/milestone-e-public-facing-readiness-ledger.json", "schemas/ethos-milestone-e-public-facing-readiness-ledger.schema.json", ), + BoundaryArtifact( + "docs/milestone-e-public-beta-current-main-refresh-prep.json", + "schemas/ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json", + ), ) diff --git a/.github/scripts/test_milestone_e_schema_registry_alignment.py b/.github/scripts/test_milestone_e_schema_registry_alignment.py index 9d451ac1..b034d80d 100644 --- a/.github/scripts/test_milestone_e_schema_registry_alignment.py +++ b/.github/scripts/test_milestone_e_schema_registry_alignment.py @@ -99,6 +99,11 @@ def schema_name(self) -> str: "docs/milestone-e-public-facing-readiness-ledger.json", "public_facing_readiness_current_main_ledger", ), + RegistryEntry( + "schemas/ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json", + "docs/milestone-e-public-beta-current-main-refresh-prep.json", + "public_beta_current_main_refresh_prep", + ), ) @@ -160,7 +165,7 @@ def assert_tracked_file(self, path: str) -> None: self.assertEqual(0, result.returncode, path) def test_registry_has_exact_tracked_schema_artifact_pairs(self) -> None: - self.assertEqual(10, len(EXPECTED_REGISTRY)) + self.assertEqual(11, len(EXPECTED_REGISTRY)) self.assertEqual( len(EXPECTED_REGISTRY), len({(entry.schema, entry.artifact) for entry in EXPECTED_REGISTRY}), diff --git a/.github/scripts/test_milestone_e_source_status_alignment.py b/.github/scripts/test_milestone_e_source_status_alignment.py index c0a16933..b11fbe4d 100644 --- a/.github/scripts/test_milestone_e_source_status_alignment.py +++ b/.github/scripts/test_milestone_e_source_status_alignment.py @@ -115,6 +115,10 @@ class SourceStatusArtifact: "docs/milestone-e-public-facing-readiness-ledger.json", "schemas/ethos-milestone-e-public-facing-readiness-ledger.schema.json", ), + SourceStatusArtifact( + "docs/milestone-e-public-beta-current-main-refresh-prep.json", + "schemas/ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json", + ), ) STATUS_VALIDATION_RECORDS = ( diff --git a/.github/scripts/test_milestone_e_validation_record_index.py b/.github/scripts/test_milestone_e_validation_record_index.py index c541465e..5138a012 100644 --- a/.github/scripts/test_milestone_e_validation_record_index.py +++ b/.github/scripts/test_milestone_e_validation_record_index.py @@ -262,6 +262,10 @@ class RecordCoverage: "milestone-e-public-facing-readiness-ledger-validation-2026-06-21.md", "test_milestone_e_public_facing_readiness_ledger.py", ), + RecordCoverage( + "milestone-e-public-beta-current-main-refresh-prep-validation-2026-06-21.md", + "test_milestone_e_public_beta_current_main_refresh_prep.py", + ), RecordCoverage( "milestone-e-validation-command-index-validation-2026-06-20.md", "test_milestone_e_validation_command_index_validation_record.py", @@ -362,6 +366,7 @@ def test_index_guards_run_after_row_and_schema_records(self) -> None: ) package_gap_ledger_guard = "test_milestone_e_package_publication_pre_approval_gap_ledger.py" readiness_guard = "test_milestone_e_public_facing_readiness_ledger.py" + beta_refresh_guard = "test_milestone_e_public_beta_current_main_refresh_prep.py" command_guard = "test_milestone_e_validation_command_index_validation_record.py" index_guard = "test_milestone_e_validation_record_index.py" index_record_guard = "test_milestone_e_validation_record_index_validation_record.py" @@ -419,8 +424,9 @@ def test_index_guards_run_after_row_and_schema_records(self) -> None: text.index(prefix + package_gap_ledger_guard), ) self.assertLess(text.index(prefix + package_gap_ledger_guard), text.index(prefix + readiness_guard)) - self.assertLess(text.index(prefix + readiness_guard), text.index(prefix + command_guard)) - self.assertLess(text.index(prefix + readiness_guard), text.index(prefix + index_guard)) + self.assertLess(text.index(prefix + readiness_guard), text.index(prefix + beta_refresh_guard)) + self.assertLess(text.index(prefix + beta_refresh_guard), text.index(prefix + command_guard)) + self.assertLess(text.index(prefix + beta_refresh_guard), text.index(prefix + index_guard)) self.assertLess(text.index(prefix + package_manifest_activation_guard), text.index(prefix + command_guard)) self.assertLess(text.index(prefix + package_manifest_activation_guard), text.index(prefix + index_guard)) self.assertLess(text.index(prefix + package_tag_guard), text.index(prefix + command_guard)) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3ea623d4..3bd33a1e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -228,6 +228,8 @@ jobs: run: python3 .github/scripts/test_milestone_e_package_publication_pre_approval_gap_ledger.py - name: Milestone E public-facing readiness ledger tests run: python3 .github/scripts/test_milestone_e_public_facing_readiness_ledger.py + - name: Milestone E public beta current-main refresh prep tests + run: python3 .github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py - name: Milestone E validation-command index tests run: python3 .github/scripts/test_milestone_e_validation_command_index.py - name: Milestone E validation-command index validation record tests diff --git a/Makefile b/Makefile index 97b5ceee..9e4625b5 100644 --- a/Makefile +++ b/Makefile @@ -221,6 +221,7 @@ milestone-e-prep: $(PYTHON) .github/scripts/test_milestone_e_package_publication_decision_bundle_validation_record.py $(PYTHON) .github/scripts/test_milestone_e_package_publication_pre_approval_gap_ledger.py $(PYTHON) .github/scripts/test_milestone_e_public_facing_readiness_ledger.py + $(PYTHON) .github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py $(PYTHON) .github/scripts/test_milestone_e_validation_command_index.py $(PYTHON) .github/scripts/test_milestone_e_validation_command_index_validation_record.py $(PYTHON) .github/scripts/test_milestone_e_validation_record_index.py diff --git a/docs/execution-status.md b/docs/execution-status.md index 27fd3be7..02fd3ac3 100644 --- a/docs/execution-status.md +++ b/docs/execution-status.md @@ -191,6 +191,8 @@ records close H1 and H2 only within their stated boundaries. Milestone A has an accepted internal Gate Zero decision for roadmap control, Milestone B is internally closed for the current source-tree validation scope, Milestone C has an internal artifact-validation closeout record, and Milestone D is internally closed for the current source-only pre-alpha scope. Milestone E prep is limited to the source-only boundary in `docs/milestone-e-prep-scope.md`, the internal fixture inventory in `docs/milestone-e-fixture-candidates.json`, the internal fixture-promotion criteria in `docs/milestone-e-fixture-promotion-criteria.json`, the internal trust-loop walkthrough plan in `docs/milestone-e-internal-trust-loop-walkthrough.json`, the internal trust-loop use protocol in `docs/milestone-e-internal-trust-loop-use-protocol.json`, the internal trust-loop rehearsal/evidence matrix in `docs/milestone-e-internal-trust-loop-rehearsal-evidence-matrix.json`, the internal trust-loop blocker ledger in `docs/milestone-e-internal-trust-loop-blocker-ledger.json`, the public approval lane blocker ledger in `docs/milestone-e-public-approval-lane-blockers.json`, public beta approval prep in `docs/milestone-e-public-beta-approval-prep.json`, public beta required-evidence records in `docs/validation/`, source-only public beta approval in `docs/validation/milestone-e-public-beta-source-only-approval-validation-2026-06-20.md`, package publication approval prep in `docs/milestone-e-package-publication-approval-prep.json`, package publication evidence records in `docs/validation/`, package publication metadata-readiness follow-up in `docs/validation/milestone-e-package-publication-metadata-readiness-closeout-validation-2026-06-21.md`, package publication dry-run/smoke follow-up in `docs/validation/milestone-e-package-publication-dry-run-smoke-closeout-validation-2026-06-21.md`, package publication version/tag policy follow-up in `docs/validation/milestone-e-package-publication-version-tag-policy-closeout-validation-2026-06-21.md`, package publication PDFium boundary follow-up in `docs/validation/milestone-e-package-publication-pdfium-boundary-closeout-validation-2026-06-21.md`, package publication dependency-ordering follow-up in `docs/validation/milestone-e-package-publication-dependency-ordering-closeout-validation-2026-06-21.md`, package publication manifest-migration prep follow-up in `docs/validation/milestone-e-package-publication-manifest-migration-prep-validation-2026-06-21.md`, package publication manifest-activation prep follow-up in `docs/validation/milestone-e-package-publication-manifest-activation-prep-validation-2026-06-21.md`, package publication registry-assembly prep follow-up in `docs/validation/milestone-e-package-publication-registry-assembly-prep-validation-2026-06-21.md`, package publication registry-assembly activation prep follow-up in `docs/validation/milestone-e-package-publication-registry-assembly-activation-prep-validation-2026-06-21.md`, package publication real-version-selection prep follow-up in `docs/validation/milestone-e-package-publication-real-version-selection-prep-validation-2026-06-21.md`, and package publication tag-creation prep follow-up in `docs/validation/milestone-e-package-publication-tag-creation-prep-validation-2026-06-21.md` until explicit blockers are resolved. The public beta approval prep lane approves only source-only public beta evaluation for the GitHub source repository. The package publication approval prep lane approves only internal Rust crate publication preparation for the five ADR-0006 reserved priority crates.io identifiers; it does not approve package publication. The package publication evidence records document current prep blockers and do not approve package publication. The metadata-readiness follow-up records README, NOTICE, manifest metadata, and include-list readiness for `ethos-core`, `ethos-verify`, and `ethos-pdf`; it does not approve package publication. The dry-run/smoke follow-up records local package assembly for `ethos-core` and source-tree checks for `ethos-verify` and `ethos-pdf`; public installation and package publication remain blocked. The version/tag policy follow-up records separation between source-tree version, reserved placeholder version, source snapshot tag, and future package tag namespace; real package version selection, package tag creation, public installation, and package publication remain blocked. The real-version-selection prep follow-up records a future SemVer candidate review boundary while selecting no package publication version; real package version selection approval, package tag creation, public installation, and package publication remain blocked. The tag-creation prep follow-up records a future package tag creation review boundary while creating no package tag; package tag creation, public installation, and package publication remain blocked. The PDFium boundary follow-up records the current source-tree `ethos-pdf` boundary; project-maintained PDFium builds, public installation, and package publication remain blocked. The dependency-ordering follow-up records the future dependent-candidate ordering constraint; registry-backed dependent package assembly, package dependency manifest migration, public installation, and package publication remain blocked. The manifest-migration prep follow-up records future manifest shape while current Cargo manifests remain unchanged; registry-backed dependent package assembly, package dependency manifest activation, public installation, and package publication remain blocked. The manifest-activation prep follow-up records future package dependency manifest activation review while current Cargo manifests remain unchanged; registry-backed dependent package assembly activation, package dependency manifest activation, public installation, and package publication remain blocked. The registry-assembly prep follow-up records future non-public dependent candidate assembly rehearsal while no registry is created and current Cargo manifests remain unchanged; registry-backed dependent package assembly activation, package dependency manifest activation, public installation, and package publication remain blocked. The registry-assembly activation prep follow-up records future registry-backed dependent package assembly activation review while no registry is created and no registry-backed assembly is activated; registry-backed dependent package assembly activation, public installation, and package publication remain blocked. The public-facing readiness ledger in `docs/milestone-e-public-facing-readiness-ledger.json`, schema-bound by `schemas/ethos-milestone-e-public-facing-readiness-ledger.schema.json`, records current main `847e12d` / tree `9d3701aa14d98017626583c2a0a0ef45ac0df79f` as a current-main refresh candidate only, keeps the reviewed source-only public beta binding at `d755e7c` / `3f9e1c4`, and retains package-publication resolution gaps while package publication remains blocked. The Milestone E prep source-only closeout record in `docs/validation/milestone-e-final-closeout-validation-2026-06-20.md` closes only that current internal prep boundary. The E prep JSON files are schema-bound, but that does not promote any fixture beyond internal source-only planning, does not refresh the reviewed source-only public beta source state, does not approve package publication, hosted surfaces, production positioning, public benchmark reports, or public benchmark claims, and does not resolve or soften blockers outside the source-only public beta approval and package prep approval boundaries. The product can demonstrate a narrow parser-backed grounding loop today, but the decision cannot be used as public benchmark credibility. +The public beta current-main refresh prep in `docs/milestone-e-public-beta-current-main-refresh-prep.json`, schema-bound by `schemas/ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json`, records current main `9262b28` / tree `9f18f9e40c57551aef9b0cb2a53641c87207546b` as a current-main refresh candidate only. This public beta current-main refresh prep does not refresh the reviewed source-only public beta source state, change the approved public beta wording, approve package publication, approve public installation, or soften any current public-facing blocker. + | Work item | Current status | Remaining blocker | | --- | --- | --- | | PDFium Phase 1 profile | Landed: pinned profile, V8/XFA-disabled state, platform hashes, runtime library hashes, and provenance are recorded | Phase 2 project-maintained builds still block Public Beta | diff --git a/docs/milestone-e-prep-scope.md b/docs/milestone-e-prep-scope.md index 9596a470..fce69ba2 100644 --- a/docs/milestone-e-prep-scope.md +++ b/docs/milestone-e-prep-scope.md @@ -98,6 +98,11 @@ The public-facing readiness ledger lives in `847e12d` / tree `9d3701aa14d98017626583c2a0a0ef45ac0df79f` as a current-main refresh candidate only, keeps the reviewed source-only public beta binding at `d755e7c` / `3f9e1c4`, and retains package-publication resolution gaps while package publication remains blocked. +The public beta current-main refresh prep lane lives in +`docs/milestone-e-public-beta-current-main-refresh-prep.json` and is schema-bound by +`schemas/ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json`. It records current +main `9262b28` / tree `9f18f9e40c57551aef9b0cb2a53641c87207546b` as a current-main refresh +candidate only and does not refresh the reviewed source-only public beta source state. The metadata-readiness follow-up record under `docs/validation/` covers README, NOTICE, manifest metadata, and include-list readiness for `ethos-core`, `ethos-verify`, and `ethos-pdf` only. `ethos-doc` and `ethos-rag` remain reserved placeholders without in-tree package manifests, and @@ -286,6 +291,10 @@ or broad demo-generation workflows. package-publication gap retention; it does not refresh the reviewed source-only public beta source state, approve package publication, approve public installation, or soften any current public-facing blocker. +- The public beta current-main refresh prep remains limited to refresh evidence preparation for + current main `9262b28`; it does not change the approved public beta wording, refresh the reviewed + source-only public beta source state, approve package publication, approve public installation, or + soften any current public-facing blocker. - Blocked-output alignment remains identical across the use protocol, rehearsal/evidence matrix, blocker ledger, and matching schemas. - Evidence-lane alignment remains identical across the rehearsal/evidence matrix, blocker ledger, diff --git a/docs/milestone-e-public-beta-current-main-refresh-prep.json b/docs/milestone-e-public-beta-current-main-refresh-prep.json new file mode 100644 index 00000000..459264e5 --- /dev/null +++ b/docs/milestone-e-public-beta-current-main-refresh-prep.json @@ -0,0 +1,88 @@ +{ + "schema_version": 1, + "status": "source-only-pre-alpha-internal-milestone-e-prep", + "scope": "public_beta_current_main_refresh_prep", + "lane_id": "public-beta-approval", + "lane_name": "Public beta approval", + "decision_state": "current_main_refresh_prepared_approval_blocked", + "refresh_candidate": { + "surface": "GitHub source repository docushell/ethos source-only evaluation", + "candidate_commit": "9262b281ee2cfb7fb0c9adf9f70afafe624e6878", + "candidate_tree": "9f18f9e40c57551aef9b0cb2a53641c87207546b", + "candidate_boundary": "source-only clone, build, and validation commands only", + "candidate_state": "prepared for later exact source-only public beta refresh review; no refreshed source approval is granted by this prep" + }, + "existing_public_beta_source": { + "surface": "GitHub source repository docushell/ethos source-only evaluation", + "reviewed_commit": "d755e7c", + "merged_main_commit": "3f9e1c4", + "tree": "a9e913b0ba7ecd1567479b2ec773342868cba126", + "boundary": "source-only clone, build, and validation commands only" + }, + "prior_readiness_ledger_candidate": { + "candidate_commit": "847e12db42d4519665b1486ccb35c85fe01f00b0", + "candidate_tree": "9d3701aa14d98017626583c2a0a0ef45ac0df79f", + "ledger_record": "docs/milestone-e-public-facing-readiness-ledger.json", + "boundary": "readiness ledger candidate only; not a refreshed reviewed public beta source state" + }, + "refresh_required_evidence": [ + "dedicated source-only public beta refresh decision record", + "exact refreshed source commit and tree", + "public-surface posture check for exact changed surfaces", + "claims gate after exact wording or surface changes", + "make milestone-e-prep after the refreshed source binding", + "cargo build --locked -p ethos-cli for the source checkout path", + "decider signoff on exact refreshed source surface and wording" + ], + "refresh_non_approvals": [ + "this prep does not refresh the reviewed public beta source state", + "this prep does not change the approved public beta wording", + "this prep does not approve package publication", + "this prep does not approve public installation", + "this prep does not approve hosted surfaces", + "this prep does not approve production positioning", + "this prep does not approve public benchmark reports or public benchmark claims", + "this prep does not approve release artifacts, binaries, wheels, npm packages, crate publication, or project-maintained PDFium builds" + ], + "retained_blockers": [ + "package publication remains blocked", + "public installation remains blocked", + "real-version cargo publish remains blocked", + "hosted surfaces remain blocked", + "production positioning remains blocked", + "public benchmark reports remain blocked", + "public benchmark claims remain blocked", + "release artifacts remain blocked", + "binaries remain blocked", + "wheels remain blocked", + "npm packages remain blocked", + "crate publication remains blocked", + "project-maintained PDFium builds remain blocked", + "broader public wording remains blocked" + ], + "public_boundary": [ + "public reports remain blocked", + "release artifacts remain blocked", + "package publication remains blocked", + "hosted surfaces remain blocked", + "public result wording remains blocked", + "performance claims remain blocked", + "quality claims remain blocked", + "footprint claims remain blocked", + "table-quality claims remain blocked", + "parser-quality claims remain blocked" + ], + "required_gates": [ + "python3 .github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py", + "python3 .github/scripts/test_milestone_e_public_facing_readiness_ledger.py", + "python3 .github/scripts/test_milestone_e_public_beta_approval_prep.py", + "python3 schemas/validate_examples.py", + "python3 .github/scripts/test_public_surface_posture.py", + "python3 .github/scripts/claims_gate.py", + "cargo build --locked -p ethos-cli", + "make milestone-e-prep PYTHON=/bin/python", + "git diff --check" + ], + "gate_script": ".github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py", + "validation_record": "docs/validation/milestone-e-public-beta-current-main-refresh-prep-validation-2026-06-21.md" +} diff --git a/docs/roadmap.md b/docs/roadmap.md index c5462fdf..662f8a00 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -150,6 +150,13 @@ it records current main `847e12d` / tree `9d3701aa14d98017626583c2a0a0ef45ac0df7 current-main refresh candidate only, keeps the reviewed source-only public beta binding at `d755e7c` / `3f9e1c4`, and retains package-publication resolution gaps while package publication remains blocked. +The public beta current-main refresh prep lane is recorded in +[`docs/milestone-e-public-beta-current-main-refresh-prep.json`](milestone-e-public-beta-current-main-refresh-prep.json) +and schema-bound by +[`schemas/ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json`](../schemas/ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json); +it records current main `9262b28` / tree `9f18f9e40c57551aef9b0cb2a53641c87207546b` as a +current-main refresh candidate only and does not refresh the reviewed source-only public beta source +state. This prep only identifies tracked trust-loop fixture candidates and guard wiring for internal continuation; blocked-output alignment keeps the current trust-loop protocol, rehearsal/evidence matrix, blocker ledger, and matching schemas on the same explicit blockers, while evidence-lane @@ -174,7 +181,10 @@ The package publication approval prep lane remains `prep_approved_publication_bl approve package publication, and does not broaden public wording. The public-facing readiness ledger records a current-main refresh candidate and package-publication gap retention only; it does not approve package publication, public installation, hosted surfaces, production positioning, -public benchmark reports, public benchmark claims, or broader public wording. The +public benchmark reports, public benchmark claims, or broader public wording. The public beta +current-main refresh prep records refresh evidence inputs only; it does not change the approved +public beta wording, approve package publication, approve public installation, or broaden public +wording. The Milestone E prep source-only closeout is recorded in [`docs/validation/milestone-e-final-closeout-validation-2026-06-20.md`](validation/milestone-e-final-closeout-validation-2026-06-20.md) for the current internal prep boundary only. This prep does not resolve or soften blockers, approve @@ -189,7 +199,7 @@ public-facing claims. | B | weeks 9-14 | **`ethos verify` alpha first**: native Ethos JSON + synthetic and pinned real OpenDataLoader verification demos, stale fingerprint checks, capability-limited reports, deterministic evidence matching including split-quote coverage, explicit unsupported non-v1 claim reporting, adapter structure diagnostics; then reading order, blocks, headings, lists, Markdown/text exporters, Python wheel scaffold, quality dashboard, Windows x64 nightly determinism | [13-B exit checklist](milestone-b-exit-checklist.md) | | C | weeks 15-22 | Simple/bordered tables; RAG chunker + citations; non-text region coordinates; security report + default-chunk exclusion; debug overlay; internal benchmark snapshot | Current artifact-validation checkpoint recorded in [Milestone C closeout validation](validation/milestone-c-closeout-validation-2026-06-18.md); broader debug/crop/table follow-ups remain explicit | | D | weeks 23-30 | [`verify_citations` v1 contract prep](milestone-d-verify-citations-contract.md); [`claim_kind_boundary` v1 contract prep](milestone-d-claim-kind-boundary-contract.md); [`grounding_source` v1 contract prep](milestone-d-grounding-source-contract.md); [`capability_downgrade` v1 contract prep](milestone-d-capability-downgrade-contract.md); [`opendataloader_adapter_shape` v1 contract prep](milestone-d-opendataloader-adapter-shape-contract.md); [`crop_element` v1 contract prep](milestone-d-crop-element-contract.md) plus internal resolver and source-bound CLI/Python descriptor/rendered carriers; [`crop_element_surface_shape` v1 contract prep](milestone-d-crop-element-surface-shape-contract.md); [`sandbox_subprocess` v1 contract prep](milestone-d-sandbox-subprocess-contract.md); [contract closeout validation](validation/milestone-d-contract-closeout-validation-2026-06-19.md); [final closeout validation](validation/milestone-d-final-closeout-validation-2026-06-19.md); Node/MCP/hosted crop surfaces, sandbox-backed crop behavior, foreign-adapter crop coordinates, and cross-platform rendered-crop byte identity are explicit post-D blockers, not D closeout requirements | 13-D exit complete for source-only pre-alpha scope | -| E | weeks 31-40 | Initial source-only prep scope in [`docs/milestone-e-prep-scope.md`](milestone-e-prep-scope.md), with current internal prep closeout recorded in [`docs/validation/milestone-e-final-closeout-validation-2026-06-20.md`](validation/milestone-e-final-closeout-validation-2026-06-20.md); source-only public beta evaluation is tracked in [`docs/milestone-e-public-beta-approval-prep.json`](milestone-e-public-beta-approval-prep.json) with exact wording and exclusions; package publication approval prep is tracked in [`docs/milestone-e-package-publication-approval-prep.json`](milestone-e-package-publication-approval-prep.json) as internal Rust crate publication prep only, with evidence, metadata-readiness, dry-run/smoke, version/tag policy, PDFium boundary, and dependency-ordering records under `docs/validation/`; current-main public-facing readiness is tracked in [`docs/milestone-e-public-facing-readiness-ledger.json`](milestone-e-public-facing-readiness-ledger.json) without approving a refreshed source-only public beta source state or package publication; actual package publication, later public-report, project-maintained PDFium build, stable CLI/Python docs, and hosted demo work remain blocked on explicit claim-audit and release-scope decisions | Release 1 claim audit + source-only public-beta checkpoint | +| E | weeks 31-40 | Initial source-only prep scope in [`docs/milestone-e-prep-scope.md`](milestone-e-prep-scope.md), with current internal prep closeout recorded in [`docs/validation/milestone-e-final-closeout-validation-2026-06-20.md`](validation/milestone-e-final-closeout-validation-2026-06-20.md); source-only public beta evaluation is tracked in [`docs/milestone-e-public-beta-approval-prep.json`](milestone-e-public-beta-approval-prep.json) with exact wording and exclusions; package publication approval prep is tracked in [`docs/milestone-e-package-publication-approval-prep.json`](milestone-e-package-publication-approval-prep.json) as internal Rust crate publication prep only, with evidence, metadata-readiness, dry-run/smoke, version/tag policy, PDFium boundary, and dependency-ordering records under `docs/validation/`; current-main public-facing readiness is tracked in [`docs/milestone-e-public-facing-readiness-ledger.json`](milestone-e-public-facing-readiness-ledger.json) without approving a refreshed source-only public beta source state or package publication; current-main source-only public beta refresh prep is tracked in [`docs/milestone-e-public-beta-current-main-refresh-prep.json`](milestone-e-public-beta-current-main-refresh-prep.json) without changing approved wording or approving package publication; actual package publication, later public-report, project-maintained PDFium build, stable CLI/Python docs, and hosted demo work remain blocked on explicit claim-audit and release-scope decisions | Release 1 claim audit + source-only public-beta checkpoint | | F / Release 2 | post-E | Complex tables, formula/LaTeX, chart classification, optional enrichment modules (never base) | Scoped after E from beta fixtures | Fallback charter: ADR-0005 selected `PROCEED`. If a future Gate Zero successor decision rejects diff --git a/docs/validation/README.md b/docs/validation/README.md index 088bb824..9a2c8167 100644 --- a/docs/validation/README.md +++ b/docs/validation/README.md @@ -14,6 +14,8 @@ Current package publication evidence records keep publication blocked while trac inventory, metadata/readiness, dry-run planning, version/tag policy, and PDFium boundary blockers. The public-facing readiness ledger keeps the current-main refresh candidate and package publication resolution gaps explicit without approving package publication or public installation. +The public beta current-main refresh prep record keeps refreshed source approval blocked while +recording the exact current-main source candidate and required follow-up evidence. - `advisory-scan-2026-06-16.md` - full `cargo-deny` advisory, ban, license, and source scan passed with a sidecar Rust 1.94 toolchain and `cargo-deny 0.19.9`; release artifacts still @@ -331,6 +333,12 @@ resolution gaps explicit without approving package publication or public install current-main refresh candidate and package-publication gap-retention artifact; current main `847e12d` / tree `9d3701aa14d98017626583c2a0a0ef45ac0df79f` is not treated as a refreshed reviewed source-only public beta source state, and package publication remains blocked. +- `milestone-e-public-beta-current-main-refresh-prep-validation-2026-06-21.md` - public beta + current-main refresh prep validation recorded + `docs/milestone-e-public-beta-current-main-refresh-prep.json` as a current-main refresh + candidate artifact for commit `9262b28` / tree `9f18f9e40c57551aef9b0cb2a53641c87207546b`; + refreshed reviewed source-only public beta state, public installation, and package publication + remain blocked. - `milestone-e-validation-command-index-validation-2026-06-20.md` - internal Milestone E validation-command index validation passed through command-alignment checks, schema enum checks, row-record checks, public-surface posture checks, `make milestone-e-prep`, and diff hygiene; the diff --git a/docs/validation/milestone-e-public-beta-current-main-refresh-prep-validation-2026-06-21.md b/docs/validation/milestone-e-public-beta-current-main-refresh-prep-validation-2026-06-21.md new file mode 100644 index 00000000..a77efede --- /dev/null +++ b/docs/validation/milestone-e-public-beta-current-main-refresh-prep-validation-2026-06-21.md @@ -0,0 +1,111 @@ +# Milestone E Public Beta Current-Main Refresh Prep Validation - 2026-06-21 + +## Purpose + +Record source-only public beta current-main refresh preparation without approving a refreshed +reviewed public beta source state. + +This record binds current main as a source-only refresh candidate and lists the evidence still +required before a later exact refresh decision. It does not refresh the reviewed public beta source +state, change the approved public beta wording, approve package publication, approve public +installation, approve hosted surfaces, approve production positioning, approve public benchmark +reports, approve public benchmark claims, approve release artifacts, approve binaries, approve +wheels, approve npm packages, approve crate publication, approve project-maintained PDFium builds, +or approve broader public wording. + +## Status + +Status: **pass for public beta current-main refresh prep validation with refresh approval +blocked**. + +Ethos remains source-only pre-alpha outside the approved source-only public beta surface and +internal package publication prep boundary. + +Package publication remains blocked. + +Public installation remains blocked. + +## Subject + +- Repository: `docushell/ethos` +- Validated source HEAD before this record: `9262b28` +- Lane: public beta current-main refresh prep +- Evidence area: exact current-main source candidate and retained refresh blockers + +## Refresh Candidate + +- surface: GitHub source repository docushell/ethos source-only evaluation +- candidate commit: `9262b281ee2cfb7fb0c9adf9f70afafe624e6878` +- candidate tree: `9f18f9e40c57551aef9b0cb2a53641c87207546b` +- candidate boundary: source-only clone, build, and validation commands only +- candidate state: prepared for later exact source-only public beta refresh review; no refreshed + source approval is granted by this prep + +## Existing Reviewed Public Beta Binding + +- reviewed commit: `d755e7c` +- merged main commit: `3f9e1c4` +- reviewed tree: `a9e913b0ba7ecd1567479b2ec773342868cba126` +- boundary: source-only clone, build, and validation commands only + +## Prior Readiness Ledger Candidate + +- candidate commit: `847e12db42d4519665b1486ccb35c85fe01f00b0` +- candidate tree: `9d3701aa14d98017626583c2a0a0ef45ac0df79f` +- ledger record: `docs/milestone-e-public-facing-readiness-ledger.json` +- boundary: readiness ledger candidate only; not a refreshed reviewed public beta source state + +## Required Refresh Evidence + +- dedicated source-only public beta refresh decision record +- exact refreshed source commit and tree +- public-surface posture check for exact changed surfaces +- claims gate after exact wording or surface changes +- make milestone-e-prep after the refreshed source binding +- cargo build --locked -p ethos-cli for the source checkout path +- decider signoff on exact refreshed source surface and wording + +## Non-Approvals Retained + +- this prep does not refresh the reviewed public beta source state +- this prep does not change the approved public beta wording +- this prep does not approve package publication +- this prep does not approve public installation +- this prep does not approve hosted surfaces +- this prep does not approve production positioning +- this prep does not approve public benchmark reports or public benchmark claims +- this prep does not approve release artifacts, binaries, wheels, npm packages, crate publication, + or project-maintained PDFium builds + +## Commands + +```sh +python3 .github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py +python3 .github/scripts/test_milestone_e_public_facing_readiness_ledger.py +python3 .github/scripts/test_milestone_e_public_beta_approval_prep.py +python3 schemas/validate_examples.py +python3 .github/scripts/test_public_surface_posture.py +python3 .github/scripts/claims_gate.py +cargo build --locked -p ethos-cli +make milestone-e-prep PYTHON=/bin/python +git diff --check +``` + +## Explicit Boundaries + +- Public reports remain blocked. +- Public result wording remains blocked. +- Package publication remains blocked. +- Public installation remains blocked. +- Real-version cargo publish remains blocked. +- Release artifacts remain blocked. +- Binaries remain blocked. +- Wheels remain blocked. +- Npm packages remain blocked. +- Crate publication remains blocked. +- Hosted surfaces remain blocked. +- Production positioning remains blocked. +- Public benchmark reports remain blocked. +- Public benchmark claims remain blocked. +- Project-maintained PDFium builds remain blocked. +- Broader public wording remains blocked. diff --git a/schemas/README.md b/schemas/README.md index cf9f978e..7328fdfc 100644 --- a/schemas/README.md +++ b/schemas/README.md @@ -33,6 +33,7 @@ bumps and downstream sign-off; output-changing heuristics are semver events (PRD | `ethos-milestone-e-public-beta-approval-prep.schema.json` | Milestone E source-only public beta approval prep | | `ethos-milestone-e-package-publication-approval-prep.schema.json` | Milestone E source-only package publication approval prep | | `ethos-milestone-e-public-facing-readiness-ledger.schema.json` | Milestone E source-only public-facing readiness current-main ledger | +| `ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json` | Milestone E source-only public beta current-main refresh prep | | `ethos-deterministic-profile.schema.json` | `profiles/ethos-deterministic-v*.json` checker | Conventions: snake_case keys; `additionalProperties: false` everywhere except the @@ -133,12 +134,13 @@ blocker ledger at `docs/milestone-e-internal-trust-loop-blocker-ledger.json`, an lane blocker ledger at `docs/milestone-e-public-approval-lane-blockers.json`, public beta approval prep at `docs/milestone-e-public-beta-approval-prep.json`, and package publication approval prep at `docs/milestone-e-package-publication-approval-prep.json`, and public-facing readiness ledger at -`docs/milestone-e-public-facing-readiness-ledger.json` are schema-validated here. +`docs/milestone-e-public-facing-readiness-ledger.json`, and public beta current-main refresh prep at +`docs/milestone-e-public-beta-current-main-refresh-prep.json` are schema-validated here. Their path tracking, candidate-to-criteria-to-walkthrough alignment, diagnostic-boundary alignment, evidence-lane alignment, explicit blocker alignment, public approval lane blockers, public beta approval prep blockers, package publication approval prep blockers, current-main -refresh candidate binding, package-publication gap retention, and public-posture boundaries are -checked by the Milestone E prep repository guards. +refresh candidate binding, package-publication gap retention, public beta current-main refresh prep +boundaries, and public-posture boundaries are checked by the Milestone E prep repository guards. Derived artifacts not schema'd here: `document.md` / `document.txt` (deterministic exports specified by the exporter config, Milestone B) and `debug.html` (Milestone C). diff --git a/schemas/ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json b/schemas/ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json new file mode 100644 index 00000000..985c5963 --- /dev/null +++ b/schemas/ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json @@ -0,0 +1,197 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "urn:ethos:schema:milestone-e-public-beta-current-main-refresh-prep:1", + "title": "Ethos Milestone E public beta current-main refresh prep", + "description": "Source-only Milestone E prep artifact for preparing a later exact source-only public beta current-main refresh review while keeping package publication, public installation, hosted surfaces, production positioning, public benchmark surfaces, and broader public wording blocked.", + "type": "object", + "required": [ + "schema_version", + "status", + "scope", + "lane_id", + "lane_name", + "decision_state", + "refresh_candidate", + "existing_public_beta_source", + "prior_readiness_ledger_candidate", + "refresh_required_evidence", + "refresh_non_approvals", + "retained_blockers", + "public_boundary", + "required_gates", + "gate_script", + "validation_record" + ], + "additionalProperties": false, + "properties": { + "schema_version": { "const": 1 }, + "status": { "const": "source-only-pre-alpha-internal-milestone-e-prep" }, + "scope": { "const": "public_beta_current_main_refresh_prep" }, + "lane_id": { "const": "public-beta-approval" }, + "lane_name": { "const": "Public beta approval" }, + "decision_state": { "const": "current_main_refresh_prepared_approval_blocked" }, + "refresh_candidate": { "$ref": "#/$defs/refresh_candidate" }, + "existing_public_beta_source": { "$ref": "#/$defs/existing_public_beta_source" }, + "prior_readiness_ledger_candidate": { "$ref": "#/$defs/prior_readiness_ledger_candidate" }, + "refresh_required_evidence": { + "type": "array", + "minItems": 7, + "maxItems": 7, + "items": { "$ref": "#/$defs/refresh_required_evidence" }, + "uniqueItems": true + }, + "refresh_non_approvals": { + "type": "array", + "minItems": 8, + "maxItems": 8, + "items": { "$ref": "#/$defs/refresh_non_approval" }, + "uniqueItems": true + }, + "retained_blockers": { + "type": "array", + "minItems": 14, + "maxItems": 14, + "items": { "$ref": "#/$defs/retained_blocker" }, + "uniqueItems": true + }, + "public_boundary": { + "type": "array", + "minItems": 10, + "maxItems": 10, + "items": { "$ref": "#/$defs/public_boundary" }, + "uniqueItems": true + }, + "required_gates": { + "type": "array", + "minItems": 9, + "maxItems": 9, + "items": { "$ref": "#/$defs/required_gate" }, + "uniqueItems": true + }, + "gate_script": { + "const": ".github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py" + }, + "validation_record": { + "const": "docs/validation/milestone-e-public-beta-current-main-refresh-prep-validation-2026-06-21.md" + } + }, + "$defs": { + "refresh_candidate": { + "type": "object", + "required": [ + "surface", + "candidate_commit", + "candidate_tree", + "candidate_boundary", + "candidate_state" + ], + "additionalProperties": false, + "properties": { + "surface": { + "const": "GitHub source repository docushell/ethos source-only evaluation" + }, + "candidate_commit": { "const": "9262b281ee2cfb7fb0c9adf9f70afafe624e6878" }, + "candidate_tree": { "const": "9f18f9e40c57551aef9b0cb2a53641c87207546b" }, + "candidate_boundary": { "const": "source-only clone, build, and validation commands only" }, + "candidate_state": { + "const": "prepared for later exact source-only public beta refresh review; no refreshed source approval is granted by this prep" + } + } + }, + "existing_public_beta_source": { + "type": "object", + "required": ["surface", "reviewed_commit", "merged_main_commit", "tree", "boundary"], + "additionalProperties": false, + "properties": { + "surface": { + "const": "GitHub source repository docushell/ethos source-only evaluation" + }, + "reviewed_commit": { "const": "d755e7c" }, + "merged_main_commit": { "const": "3f9e1c4" }, + "tree": { "const": "a9e913b0ba7ecd1567479b2ec773342868cba126" }, + "boundary": { "const": "source-only clone, build, and validation commands only" } + } + }, + "prior_readiness_ledger_candidate": { + "type": "object", + "required": ["candidate_commit", "candidate_tree", "ledger_record", "boundary"], + "additionalProperties": false, + "properties": { + "candidate_commit": { "const": "847e12db42d4519665b1486ccb35c85fe01f00b0" }, + "candidate_tree": { "const": "9d3701aa14d98017626583c2a0a0ef45ac0df79f" }, + "ledger_record": { "const": "docs/milestone-e-public-facing-readiness-ledger.json" }, + "boundary": { + "const": "readiness ledger candidate only; not a refreshed reviewed public beta source state" + } + } + }, + "refresh_required_evidence": { + "enum": [ + "dedicated source-only public beta refresh decision record", + "exact refreshed source commit and tree", + "public-surface posture check for exact changed surfaces", + "claims gate after exact wording or surface changes", + "make milestone-e-prep after the refreshed source binding", + "cargo build --locked -p ethos-cli for the source checkout path", + "decider signoff on exact refreshed source surface and wording" + ] + }, + "refresh_non_approval": { + "enum": [ + "this prep does not refresh the reviewed public beta source state", + "this prep does not change the approved public beta wording", + "this prep does not approve package publication", + "this prep does not approve public installation", + "this prep does not approve hosted surfaces", + "this prep does not approve production positioning", + "this prep does not approve public benchmark reports or public benchmark claims", + "this prep does not approve release artifacts, binaries, wheels, npm packages, crate publication, or project-maintained PDFium builds" + ] + }, + "retained_blocker": { + "enum": [ + "package publication remains blocked", + "public installation remains blocked", + "real-version cargo publish remains blocked", + "hosted surfaces remain blocked", + "production positioning remains blocked", + "public benchmark reports remain blocked", + "public benchmark claims remain blocked", + "release artifacts remain blocked", + "binaries remain blocked", + "wheels remain blocked", + "npm packages remain blocked", + "crate publication remains blocked", + "project-maintained PDFium builds remain blocked", + "broader public wording remains blocked" + ] + }, + "public_boundary": { + "enum": [ + "public reports remain blocked", + "release artifacts remain blocked", + "package publication remains blocked", + "hosted surfaces remain blocked", + "public result wording remains blocked", + "performance claims remain blocked", + "quality claims remain blocked", + "footprint claims remain blocked", + "table-quality claims remain blocked", + "parser-quality claims remain blocked" + ] + }, + "required_gate": { + "enum": [ + "python3 .github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py", + "python3 .github/scripts/test_milestone_e_public_facing_readiness_ledger.py", + "python3 .github/scripts/test_milestone_e_public_beta_approval_prep.py", + "python3 schemas/validate_examples.py", + "python3 .github/scripts/test_public_surface_posture.py", + "python3 .github/scripts/claims_gate.py", + "cargo build --locked -p ethos-cli", + "make milestone-e-prep PYTHON=/bin/python", + "git diff --check" + ] + } + } +} diff --git a/schemas/validate_examples.py b/schemas/validate_examples.py index eafe39df..542e2f01 100644 --- a/schemas/validate_examples.py +++ b/schemas/validate_examples.py @@ -143,6 +143,9 @@ ("ethos-milestone-e-public-facing-readiness-ledger.schema.json", [ ROOT / "docs" / "milestone-e-public-facing-readiness-ledger.json", ]), + ("ethos-milestone-e-public-beta-current-main-refresh-prep.schema.json", [ + ROOT / "docs" / "milestone-e-public-beta-current-main-refresh-prep.json", + ]), ("ethos-deterministic-profile.schema.json", [ROOT / "profiles" / "ethos-deterministic-v1.json"]), ]