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 dcffcfe4..5e7e452e 100644 --- a/.github/scripts/test_milestone_e_prep_guard_sequence_index.py +++ b/.github/scripts/test_milestone_e_prep_guard_sequence_index.py @@ -106,6 +106,7 @@ "$(PYTHON) .github/scripts/test_milestone_e_package_publication_registry_assembly_activation_prep.py", "$(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_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 8c2632ce..2140f4ad 100644 --- a/.github/scripts/test_milestone_e_prep_scope.py +++ b/.github/scripts/test_milestone_e_prep_scope.py @@ -405,6 +405,7 @@ def test_make_target_is_narrow_and_guarded(self) -> None: "$(PYTHON) .github/scripts/test_milestone_e_package_publication_registry_assembly_activation_prep.py", "$(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_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_boundary_alignment.py b/.github/scripts/test_milestone_e_public_boundary_alignment.py index b16cbd07..e0a9c788 100644 --- a/.github/scripts/test_milestone_e_public_boundary_alignment.py +++ b/.github/scripts/test_milestone_e_public_boundary_alignment.py @@ -85,6 +85,10 @@ class BoundaryArtifact: "docs/milestone-e-package-publication-approval-prep.json", "schemas/ethos-milestone-e-package-publication-approval-prep.schema.json", ), + BoundaryArtifact( + "docs/milestone-e-public-facing-readiness-ledger.json", + "schemas/ethos-milestone-e-public-facing-readiness-ledger.schema.json", + ), ) diff --git a/.github/scripts/test_milestone_e_public_facing_readiness_ledger.py b/.github/scripts/test_milestone_e_public_facing_readiness_ledger.py new file mode 100644 index 00000000..b41c7e09 --- /dev/null +++ b/.github/scripts/test_milestone_e_public_facing_readiness_ledger.py @@ -0,0 +1,265 @@ +#!/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] +LEDGER = ROOT / "docs/milestone-e-public-facing-readiness-ledger.json" +SCHEMA = ROOT / "schemas/ethos-milestone-e-public-facing-readiness-ledger.schema.json" +PUBLIC_BETA_PREP = ROOT / "docs/milestone-e-public-beta-approval-prep.json" +PACKAGE_PREP = ROOT / "docs/milestone-e-package-publication-approval-prep.json" +RECORD = ( + ROOT + / "docs/validation/" + "milestone-e-public-facing-readiness-ledger-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" + +CURRENT_MAIN_COMMIT = "847e12db42d4519665b1486ccb35c85fe01f00b0" +CURRENT_MAIN_TREE = "9d3701aa14d98017626583c2a0a0ef45ac0df79f" +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 MilestoneEPublicFacingReadinessLedgerTests(unittest.TestCase): + def test_ledger_records_current_main_without_new_approval(self) -> None: + ledger = load_json(LEDGER) + + self.assertEqual(1, ledger["schema_version"]) + self.assertEqual("source-only-pre-alpha-internal-milestone-e-prep", ledger["status"]) + self.assertEqual("public_facing_readiness_current_main_ledger", ledger["scope"]) + self.assertEqual( + "current_main_readiness_recorded_without_new_approval", + ledger["ledger_state"], + ) + self.assertEqual(CURRENT_MAIN_COMMIT, ledger["validated_current_main"]["commit"]) + self.assertEqual(CURRENT_MAIN_TREE, ledger["validated_current_main"]["tree"]) + self.assertIn("refresh candidate only", ledger["validated_current_main"]["candidate_status"]) + self.assertEqual(EXPECTED_BOUNDARY, ledger["public_boundary"]) + + def test_current_main_binding_resolves_in_repository_history(self) -> None: + ledger = load_json(LEDGER) + + self.assertEqual(CURRENT_MAIN_COMMIT, git("rev-parse", CURRENT_MAIN_COMMIT)) + self.assertEqual(CURRENT_MAIN_TREE, git("rev-parse", f"{CURRENT_MAIN_COMMIT}^{{tree}}")) + subprocess.check_call( + ["git", "merge-base", "--is-ancestor", CURRENT_MAIN_COMMIT, "HEAD"], + cwd=ROOT, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + self.assertEqual(CURRENT_MAIN_COMMIT, ledger["current_main_refresh_candidate"]["candidate_commit"]) + self.assertEqual( + git("rev-parse", f"{CURRENT_MAIN_COMMIT}^{{tree}}"), + ledger["current_main_refresh_candidate"]["candidate_tree"], + ) + + def test_existing_public_beta_binding_stays_separate(self) -> None: + ledger = load_json(LEDGER) + public_beta = load_json(PUBLIC_BETA_PREP) + + self.assertEqual( + public_beta["approved_public_beta_source"], + ledger["approved_public_beta_source"], + ) + self.assertEqual("d755e7c", ledger["approved_public_beta_source"]["reviewed_commit"]) + self.assertEqual("3f9e1c4", ledger["approved_public_beta_source"]["merged_main_commit"]) + self.assertNotEqual( + ledger["approved_public_beta_source"]["tree"], + ledger["current_main_refresh_candidate"]["candidate_tree"], + ) + self.assertIn( + "requires dedicated source-only public beta refresh approval", + ledger["current_main_refresh_candidate"]["refresh_status"], + ) + + def test_package_resolution_criteria_match_gap_ledger(self) -> None: + ledger = load_json(LEDGER) + package_prep = load_json(PACKAGE_PREP) + gap_ledger = package_prep["package_publication_pre_approval_gap_ledger"] + criteria = ledger["package_publication_resolution_criteria"] + + self.assertEqual("pre_approval_gaps_remain_unresolved", criteria["criteria_state"]) + self.assertEqual( + gap_ledger["required_resolution_inputs"], + criteria["required_resolution_inputs"], + ) + self.assertEqual(gap_ledger["retained_blockers"], criteria["retained_blockers"]) + + def test_cross_lane_blockers_and_non_approvals_are_explicit(self) -> None: + ledger = load_json(LEDGER) + + self.assertEqual(14, len(ledger["cross_lane_blockers"])) + self.assertEqual(12, len(ledger["non_approvals"])) + self.assertIn("package publication remains blocked", ledger["cross_lane_blockers"]) + self.assertIn("public installation remains blocked", ledger["cross_lane_blockers"]) + self.assertIn("hosted surfaces remain blocked", ledger["cross_lane_blockers"]) + self.assertIn("production positioning remains blocked", ledger["cross_lane_blockers"]) + self.assertIn("public benchmark claims remain blocked", ledger["cross_lane_blockers"]) + self.assertIn( + "this ledger does not refresh the reviewed public beta source state", + ledger["non_approvals"], + ) + self.assertIn("this ledger does not approve package publication", ledger["non_approvals"]) + self.assertIn("this ledger does not approve public installation", ledger["non_approvals"]) + + def test_schema_validation_covers_readiness_ledger(self) -> None: + schema = load_json(SCHEMA) + validate_examples = read(VALIDATE_EXAMPLES) + schemas_readme = read(SCHEMAS_README) + + self.assertEqual(False, schema["additionalProperties"]) + self.assertIn("current_main_refresh_candidate", schema["required"]) + self.assertIn("package_publication_resolution_criteria", schema["required"]) + self.assertEqual(14, schema["properties"]["cross_lane_blockers"]["minItems"]) + self.assertEqual(12, schema["properties"]["non_approvals"]["minItems"]) + self.assertIn("ethos-milestone-e-public-facing-readiness-ledger.schema.json", validate_examples) + self.assertIn("docs\" / \"milestone-e-public-facing-readiness-ledger.json", validate_examples) + self.assertIn("ethos-milestone-e-public-facing-readiness-ledger.schema.json", schemas_readme) + self.assertIn("docs/milestone-e-public-facing-readiness-ledger.json", schemas_readme) + + def test_validation_record_indexes_commands_and_boundaries(self) -> None: + readme = read(VALIDATION_README) + record = normalized(RECORD) + ledger = load_json(LEDGER) + + self.assertIn(RECORD.name, readme) + self.assertIn("public-facing readiness ledger validation", re.sub(r"\s+", " ", readme)) + self.assertIn("Validated source HEAD before this record: `847e12d`", read(RECORD)) + for gate in ledger["required_gates"]: + self.assertIn(gate, record) + for blocker in ledger["cross_lane_blockers"]: + self.assertIn(blocker, record) + 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_public_facing_readiness_ledger(self) -> None: + for path in (PREP_SCOPE, ROADMAP, EXECUTION_STATUS, VALIDATION_README): + doc = normalized(path) + + self.assertIn("docs/milestone-e-public-facing-readiness-ledger.json", doc, str(path)) + self.assertIn("public-facing readiness ledger", 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_readiness_ledger_after_package_gap_ledger(self) -> None: + make_block = target_block("milestone-e-prep") + ci = read(CI_WORKFLOW) + package_gap_guard = "test_milestone_e_package_publication_pre_approval_gap_ledger.py" + ledger_guard = "test_milestone_e_public_facing_readiness_ledger.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 + ledger_guard, text) + self.assertEqual(1, text.count(prefix + ledger_guard)) + self.assertLess(text.index(prefix + package_gap_guard), text.index(prefix + ledger_guard)) + self.assertLess(text.index(prefix + ledger_guard), text.index(prefix + command_guard)) + + def test_ledger_avoids_scope_expansion_language_or_private_paths(self) -> None: + lower = json.dumps(load_json(LEDGER), sort_keys=True).lower() + record_lower = normalized(RECORD).lower() + raw = read(LEDGER) + 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_schema_registry_alignment.py b/.github/scripts/test_milestone_e_schema_registry_alignment.py index 5b848292..9d451ac1 100644 --- a/.github/scripts/test_milestone_e_schema_registry_alignment.py +++ b/.github/scripts/test_milestone_e_schema_registry_alignment.py @@ -94,6 +94,11 @@ def schema_name(self) -> str: "docs/milestone-e-package-publication-approval-prep.json", "package_publication_approval_prep", ), + RegistryEntry( + "schemas/ethos-milestone-e-public-facing-readiness-ledger.schema.json", + "docs/milestone-e-public-facing-readiness-ledger.json", + "public_facing_readiness_current_main_ledger", + ), ) @@ -155,7 +160,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(9, len(EXPECTED_REGISTRY)) + self.assertEqual(10, 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 80b0f6b9..c0a16933 100644 --- a/.github/scripts/test_milestone_e_source_status_alignment.py +++ b/.github/scripts/test_milestone_e_source_status_alignment.py @@ -111,6 +111,10 @@ class SourceStatusArtifact: "docs/milestone-e-package-publication-approval-prep.json", "schemas/ethos-milestone-e-package-publication-approval-prep.schema.json", ), + SourceStatusArtifact( + "docs/milestone-e-public-facing-readiness-ledger.json", + "schemas/ethos-milestone-e-public-facing-readiness-ledger.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 9d8d894d..c541465e 100644 --- a/.github/scripts/test_milestone_e_validation_record_index.py +++ b/.github/scripts/test_milestone_e_validation_record_index.py @@ -258,6 +258,10 @@ class RecordCoverage: "milestone-e-package-publication-pre-approval-gap-ledger-validation-2026-06-21.md", "test_milestone_e_package_publication_pre_approval_gap_ledger.py", ), + RecordCoverage( + "milestone-e-public-facing-readiness-ledger-validation-2026-06-21.md", + "test_milestone_e_public_facing_readiness_ledger.py", + ), RecordCoverage( "milestone-e-validation-command-index-validation-2026-06-20.md", "test_milestone_e_validation_command_index_validation_record.py", @@ -357,6 +361,7 @@ def test_index_guards_run_after_row_and_schema_records(self) -> None: "test_milestone_e_package_publication_decision_bundle_validation_record.py" ) package_gap_ledger_guard = "test_milestone_e_package_publication_pre_approval_gap_ledger.py" + readiness_guard = "test_milestone_e_public_facing_readiness_ledger.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" @@ -413,8 +418,9 @@ def test_index_guards_run_after_row_and_schema_records(self) -> None: text.index(prefix + package_decision_bundle_guard), text.index(prefix + package_gap_ledger_guard), ) - self.assertLess(text.index(prefix + package_gap_ledger_guard), text.index(prefix + command_guard)) - self.assertLess(text.index(prefix + package_gap_ledger_guard), text.index(prefix + index_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 + 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 bd7490d9..3ea623d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -226,6 +226,8 @@ jobs: run: python3 .github/scripts/test_milestone_e_package_publication_decision_bundle_validation_record.py - name: Milestone E package publication pre-approval gap ledger tests 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 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 c2758f50..97b5ceee 100644 --- a/Makefile +++ b/Makefile @@ -220,6 +220,7 @@ milestone-e-prep: $(PYTHON) .github/scripts/test_milestone_e_package_publication_registry_assembly_activation_prep.py $(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_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 f5e6cabf..27fd3be7 100644 --- a/docs/execution-status.md +++ b/docs/execution-status.md @@ -189,7 +189,7 @@ records close H1 and H2 only within their stated boundaries. ## Current Milestone Posture -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 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 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. +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. | Work item | Current status | Remaining blocker | | --- | --- | --- | diff --git a/docs/milestone-e-prep-scope.md b/docs/milestone-e-prep-scope.md index e99434a6..9596a470 100644 --- a/docs/milestone-e-prep-scope.md +++ b/docs/milestone-e-prep-scope.md @@ -92,6 +92,12 @@ positioning, public benchmark reports, or public benchmark claims. The package publication evidence records under `docs/validation/` record reserved-name inventory reconciliation, metadata/license/README readiness, dry-run/smoke planning, version/tag policy, and PDFium packaging boundary evidence for that prep lane. They keep package publication blocked. +The public-facing readiness ledger lives in +`docs/milestone-e-public-facing-readiness-ledger.json` and is schema-bound by +`schemas/ethos-milestone-e-public-facing-readiness-ledger.schema.json`. It 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 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 @@ -276,6 +282,10 @@ or broad demo-generation workflows. - The package publication real-version-selection prep follow-up remains limited to future SemVer candidate review; no package publication version is selected, and real package version selection approval, package tag creation, public installation, and package publication remain blocked. +- The public-facing readiness ledger remains limited to current-main refresh candidate tracking and + 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. - 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-facing-readiness-ledger.json b/docs/milestone-e-public-facing-readiness-ledger.json new file mode 100644 index 00000000..532677b2 --- /dev/null +++ b/docs/milestone-e-public-facing-readiness-ledger.json @@ -0,0 +1,111 @@ +{ + "schema_version": 1, + "status": "source-only-pre-alpha-internal-milestone-e-prep", + "scope": "public_facing_readiness_current_main_ledger", + "ledger_state": "current_main_readiness_recorded_without_new_approval", + "validated_current_main": { + "commit": "847e12db42d4519665b1486ccb35c85fe01f00b0", + "tree": "9d3701aa14d98017626583c2a0a0ef45ac0df79f", + "candidate_status": "current main is recorded as a refresh candidate only; no new source-only public beta approval is granted by this ledger" + }, + "approved_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" + }, + "current_main_refresh_candidate": { + "surface": "GitHub source repository docushell/ethos source-only evaluation", + "candidate_commit": "847e12db42d4519665b1486ccb35c85fe01f00b0", + "candidate_tree": "9d3701aa14d98017626583c2a0a0ef45ac0df79f", + "refresh_status": "requires dedicated source-only public beta refresh approval before current main is treated as the reviewed public beta source state", + "required_refresh_inputs": [ + "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", + "decider signoff on exact refreshed source surface and wording" + ] + }, + "package_publication_resolution_criteria": { + "criteria_state": "pre_approval_gaps_remain_unresolved", + "required_resolution_inputs": [ + "exact package publication approval decision record", + "exact candidate crate list", + "exact SemVer package version or per-crate version map", + "exact package tag name", + "exact package_tag_source_commit and package source tree", + "exact package-name migration diff for ethos-doc-core", + "exact dependency manifest activation diff for ethos-verify and ethos-pdf", + "exact registry-backed dependent package assembly evidence", + "exact public installation wording and explicit exclusions", + "posture and claims gates after exact public installation wording changes" + ], + "retained_blockers": [ + "no package publication version is selected", + "no package tag is created", + "no package dependency manifest activation is approved", + "no registry-backed dependent package assembly activation is approved", + "public installation remains blocked", + "package publication remains blocked", + "real-version cargo publish remains blocked" + ] + }, + "cross_lane_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" + ], + "non_approvals": [ + "this ledger does not refresh the reviewed public beta source state", + "this ledger does not approve package publication", + "this ledger does not approve public installation", + "this ledger does not select a package publication version", + "this ledger does not create a package tag", + "this ledger does not change Cargo manifests", + "this ledger does not activate package dependency manifests", + "this ledger does not create a registry", + "this ledger does not approve hosted surfaces", + "this ledger does not approve production positioning", + "this ledger does not approve public benchmark reports or public benchmark claims", + "this ledger does not approve release artifacts, binaries, wheels, npm packages, crate publication, or project-maintained PDFium builds" + ], + "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_facing_readiness_ledger.py", + "python3 .github/scripts/test_milestone_e_public_beta_approval_prep.py", + "python3 .github/scripts/test_milestone_e_package_publication_approval_prep.py", + "python3 .github/scripts/test_milestone_e_package_publication_pre_approval_gap_ledger.py", + "python3 schemas/validate_examples.py", + "python3 .github/scripts/test_public_surface_posture.py", + "python3 .github/scripts/claims_gate.py", + "make milestone-e-prep PYTHON=/bin/python", + "git diff --check" + ], + "gate_script": ".github/scripts/test_milestone_e_public_facing_readiness_ledger.py", + "validation_record": "docs/validation/milestone-e-public-facing-readiness-ledger-validation-2026-06-21.md" +} diff --git a/docs/roadmap.md b/docs/roadmap.md index 6555c078..c5462fdf 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -142,6 +142,14 @@ package publication version; real package version selection approval, package ta installation, and package publication remain blocked. The tag-creation prep follow-up records future package tag creation review while creating no package tag; package tag creation, public installation, and package publication remain blocked. +The public-facing readiness ledger is recorded in +[`docs/milestone-e-public-facing-readiness-ledger.json`](milestone-e-public-facing-readiness-ledger.json) +and schema-bound by +[`schemas/ethos-milestone-e-public-facing-readiness-ledger.schema.json`](../schemas/ethos-milestone-e-public-facing-readiness-ledger.schema.json); +it 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. 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 @@ -163,7 +171,10 @@ benchmark report, public benchmark claim, release-artifact, binary, wheel, npm p publication, real-version cargo publish, and project-maintained PDFium build lanes remain blocked. The public beta approval prep lane records exact source-only public beta wording and exclusions. The package publication approval prep lane remains `prep_approved_publication_blocked`, does not -approve package publication, and does not broaden public wording. The +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 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 @@ -178,7 +189,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/`; 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; 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 3af8dfc1..088bb824 100644 --- a/docs/validation/README.md +++ b/docs/validation/README.md @@ -12,6 +12,8 @@ Records: Current package publication evidence records keep publication blocked while tracking reserved-name 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. - `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 @@ -324,6 +326,11 @@ inventory, metadata/readiness, dry-run planning, version/tag policy, and PDFium inputs; the record keeps package publication and public installation blocked while recording the missing version map, package tag, source binding, manifest activation diff, registry-backed assembly evidence, public installation wording, and posture/claims rerun requirements. +- `milestone-e-public-facing-readiness-ledger-validation-2026-06-21.md` - public-facing readiness + ledger validation recorded `docs/milestone-e-public-facing-readiness-ledger.json` as a + 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-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-facing-readiness-ledger-validation-2026-06-21.md b/docs/validation/milestone-e-public-facing-readiness-ledger-validation-2026-06-21.md new file mode 100644 index 00000000..681445ab --- /dev/null +++ b/docs/validation/milestone-e-public-facing-readiness-ledger-validation-2026-06-21.md @@ -0,0 +1,126 @@ +# Milestone E Public-Facing Readiness Ledger Validation - 2026-06-21 + +## Purpose + +Record a current-main public-facing readiness ledger without granting a new source-only public beta +refresh approval or approving any blocked package, hosted, production, public-report, or public +installation surface. + +This record binds the current main source state as a refresh candidate and consolidates package +publication pre-approval gaps. It does not refresh the reviewed public beta source state, approve +package publication, approve public installation, select a package publication version, create a +package tag, change Cargo manifests, activate package dependency manifests, create a registry, +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-facing readiness ledger validation with current-main refresh and package +publication blockers retained**. + +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: `847e12d` +- Lane: public-facing readiness current-main ledger +- Evidence area: source-only public beta refresh candidate and package publication resolution gaps + +## Current-Main Binding + +- current main candidate commit: `847e12db42d4519665b1486ccb35c85fe01f00b0` +- current main candidate tree: `9d3701aa14d98017626583c2a0a0ef45ac0df79f` +- ledger state: `current_main_readiness_recorded_without_new_approval` +- current main is recorded as a refresh candidate only; no new source-only public beta approval is + granted by this ledger + +## Existing Reviewed Source-Only Public Beta Binding + +- surface: GitHub source repository docushell/ethos source-only evaluation +- reviewed commit: `d755e7c` +- merged main commit: `3f9e1c4` +- reviewed tree: `a9e913b0ba7ecd1567479b2ec773342868cba126` +- boundary: source-only clone, build, and validation commands only + +## Required Source-Only Public Beta Refresh Inputs + +- 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 +- decider signoff on exact refreshed source surface and wording + +## Package Publication Resolution Criteria + +- criteria state: `pre_approval_gaps_remain_unresolved` +- exact package publication approval decision record +- exact candidate crate list +- exact SemVer package version or per-crate version map +- exact package tag name +- exact package_tag_source_commit and package source tree +- exact package-name migration diff for ethos-doc-core +- exact dependency manifest activation diff for ethos-verify and ethos-pdf +- exact registry-backed dependent package assembly evidence +- exact public installation wording and explicit exclusions +- posture and claims gates after exact public installation wording changes + +## Blockers Retained + +- no package publication version is selected +- no package tag is created +- no package dependency manifest activation is approved +- no registry-backed dependent package assembly activation is approved +- public installation remains blocked +- package publication 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 + +## Commands + +```sh +python3 .github/scripts/test_milestone_e_public_facing_readiness_ledger.py +python3 .github/scripts/test_milestone_e_public_beta_approval_prep.py +python3 .github/scripts/test_milestone_e_package_publication_approval_prep.py +python3 .github/scripts/test_milestone_e_package_publication_pre_approval_gap_ledger.py +python3 schemas/validate_examples.py +python3 .github/scripts/test_public_surface_posture.py +python3 .github/scripts/claims_gate.py +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. +- Hosted surfaces remain blocked. +- Production positioning remains blocked. +- Public benchmark reports remain blocked. +- Public benchmark claims remain blocked. +- Project-maintained PDFium builds remain blocked. diff --git a/schemas/README.md b/schemas/README.md index 8b5aef29..cf9f978e 100644 --- a/schemas/README.md +++ b/schemas/README.md @@ -32,6 +32,7 @@ bumps and downstream sign-off; output-changing heuristics are semver events (PRD | `ethos-milestone-e-public-approval-lane-blockers.schema.json` | Milestone E source-only public approval lane blocker ledger | | `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-deterministic-profile.schema.json` | `profiles/ethos-deterministic-v*.json` checker | Conventions: snake_case keys; `additionalProperties: false` everywhere except the @@ -131,11 +132,13 @@ rehearsal/evidence matrix at blocker ledger at `docs/milestone-e-internal-trust-loop-blocker-ledger.json`, and public approval 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` are schema-validated here. +`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. 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, and public-posture -boundaries are checked by the Milestone E prep repository guards. +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. 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-facing-readiness-ledger.schema.json b/schemas/ethos-milestone-e-public-facing-readiness-ledger.schema.json new file mode 100644 index 00000000..14b6d60d --- /dev/null +++ b/schemas/ethos-milestone-e-public-facing-readiness-ledger.schema.json @@ -0,0 +1,244 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "urn:ethos:schema:milestone-e-public-facing-readiness-ledger:1", + "title": "Ethos Milestone E public-facing readiness ledger", + "description": "Source-only Milestone E ledger for recording current-main public-facing readiness without approving a refreshed source-only public beta source state, package publication, public installation, hosted surfaces, production positioning, or public benchmark surfaces.", + "type": "object", + "required": [ + "schema_version", + "status", + "scope", + "ledger_state", + "validated_current_main", + "approved_public_beta_source", + "current_main_refresh_candidate", + "package_publication_resolution_criteria", + "cross_lane_blockers", + "non_approvals", + "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_facing_readiness_current_main_ledger" }, + "ledger_state": { "const": "current_main_readiness_recorded_without_new_approval" }, + "validated_current_main": { "$ref": "#/$defs/validated_current_main" }, + "approved_public_beta_source": { "$ref": "#/$defs/approved_public_beta_source" }, + "current_main_refresh_candidate": { "$ref": "#/$defs/current_main_refresh_candidate" }, + "package_publication_resolution_criteria": { + "$ref": "#/$defs/package_publication_resolution_criteria" + }, + "cross_lane_blockers": { + "type": "array", + "minItems": 14, + "maxItems": 14, + "items": { "$ref": "#/$defs/cross_lane_blocker" }, + "uniqueItems": true + }, + "non_approvals": { + "type": "array", + "minItems": 12, + "maxItems": 12, + "items": { "$ref": "#/$defs/non_approval" }, + "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_facing_readiness_ledger.py" + }, + "validation_record": { + "const": "docs/validation/milestone-e-public-facing-readiness-ledger-validation-2026-06-21.md" + } + }, + "$defs": { + "validated_current_main": { + "type": "object", + "required": ["commit", "tree", "candidate_status"], + "additionalProperties": false, + "properties": { + "commit": { "const": "847e12db42d4519665b1486ccb35c85fe01f00b0" }, + "tree": { "const": "9d3701aa14d98017626583c2a0a0ef45ac0df79f" }, + "candidate_status": { + "const": "current main is recorded as a refresh candidate only; no new source-only public beta approval is granted by this ledger" + } + } + }, + "approved_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" } + } + }, + "current_main_refresh_candidate": { + "type": "object", + "required": [ + "surface", + "candidate_commit", + "candidate_tree", + "refresh_status", + "required_refresh_inputs" + ], + "additionalProperties": false, + "properties": { + "surface": { + "const": "GitHub source repository docushell/ethos source-only evaluation" + }, + "candidate_commit": { "const": "847e12db42d4519665b1486ccb35c85fe01f00b0" }, + "candidate_tree": { "const": "9d3701aa14d98017626583c2a0a0ef45ac0df79f" }, + "refresh_status": { + "const": "requires dedicated source-only public beta refresh approval before current main is treated as the reviewed public beta source state" + }, + "required_refresh_inputs": { + "type": "array", + "minItems": 6, + "maxItems": 6, + "items": { "$ref": "#/$defs/required_refresh_input" }, + "uniqueItems": true + } + } + }, + "package_publication_resolution_criteria": { + "type": "object", + "required": ["criteria_state", "required_resolution_inputs", "retained_blockers"], + "additionalProperties": false, + "properties": { + "criteria_state": { "const": "pre_approval_gaps_remain_unresolved" }, + "required_resolution_inputs": { + "type": "array", + "minItems": 10, + "maxItems": 10, + "items": { "$ref": "#/$defs/package_required_resolution_input" }, + "uniqueItems": true + }, + "retained_blockers": { + "type": "array", + "minItems": 7, + "maxItems": 7, + "items": { "$ref": "#/$defs/package_retained_blocker" }, + "uniqueItems": true + } + } + }, + "required_refresh_input": { + "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", + "decider signoff on exact refreshed source surface and wording" + ] + }, + "package_required_resolution_input": { + "enum": [ + "exact package publication approval decision record", + "exact candidate crate list", + "exact SemVer package version or per-crate version map", + "exact package tag name", + "exact package_tag_source_commit and package source tree", + "exact package-name migration diff for ethos-doc-core", + "exact dependency manifest activation diff for ethos-verify and ethos-pdf", + "exact registry-backed dependent package assembly evidence", + "exact public installation wording and explicit exclusions", + "posture and claims gates after exact public installation wording changes" + ] + }, + "package_retained_blocker": { + "enum": [ + "no package publication version is selected", + "no package tag is created", + "no package dependency manifest activation is approved", + "no registry-backed dependent package assembly activation is approved", + "public installation remains blocked", + "package publication remains blocked", + "real-version cargo publish remains blocked" + ] + }, + "cross_lane_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" + ] + }, + "non_approval": { + "enum": [ + "this ledger does not refresh the reviewed public beta source state", + "this ledger does not approve package publication", + "this ledger does not approve public installation", + "this ledger does not select a package publication version", + "this ledger does not create a package tag", + "this ledger does not change Cargo manifests", + "this ledger does not activate package dependency manifests", + "this ledger does not create a registry", + "this ledger does not approve hosted surfaces", + "this ledger does not approve production positioning", + "this ledger does not approve public benchmark reports or public benchmark claims", + "this ledger does not approve release artifacts, binaries, wheels, npm packages, crate publication, or project-maintained PDFium builds" + ] + }, + "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_facing_readiness_ledger.py", + "python3 .github/scripts/test_milestone_e_public_beta_approval_prep.py", + "python3 .github/scripts/test_milestone_e_package_publication_approval_prep.py", + "python3 .github/scripts/test_milestone_e_package_publication_pre_approval_gap_ledger.py", + "python3 schemas/validate_examples.py", + "python3 .github/scripts/test_public_surface_posture.py", + "python3 .github/scripts/claims_gate.py", + "make milestone-e-prep PYTHON=/bin/python", + "git diff --check" + ] + } + } +} diff --git a/schemas/validate_examples.py b/schemas/validate_examples.py index 7f7f59cb..eafe39df 100644 --- a/schemas/validate_examples.py +++ b/schemas/validate_examples.py @@ -140,6 +140,9 @@ ("ethos-milestone-e-package-publication-approval-prep.schema.json", [ ROOT / "docs" / "milestone-e-package-publication-approval-prep.json", ]), + ("ethos-milestone-e-public-facing-readiness-ledger.schema.json", [ + ROOT / "docs" / "milestone-e-public-facing-readiness-ledger.json", + ]), ("ethos-deterministic-profile.schema.json", [ROOT / "profiles" / "ethos-deterministic-v1.json"]), ]