From 68b51ae2d5503db2e909c9be5fb8d201b06f09a3 Mon Sep 17 00:00:00 2001 From: docushell-admin Date: Mon, 22 Jun 2026 10:55:12 +0530 Subject: [PATCH] Record package publication approval request Signed-off-by: docushell-admin --- ...e_publication_current_registry_assembly.py | 216 ++++++++++++++++++ ...kage_publication_final_approval_request.py | 214 +++++++++++++++++ ...t_milestone_e_prep_guard_sequence_index.py | 2 + .../scripts/test_milestone_e_prep_scope.py | 2 + ...est_milestone_e_validation_record_index.py | 53 +++++ .github/workflows/ci.yml | 4 + Makefile | 2 + docs/execution-status.md | 4 + docs/milestone-e-prep-scope.md | 15 ++ docs/roadmap.md | 9 + docs/validation/README.md | 8 + ...registry-assembly-validation-2026-06-22.md | 110 +++++++++ ...-approval-request-validation-2026-06-22.md | 144 ++++++++++++ 13 files changed, 783 insertions(+) create mode 100644 .github/scripts/test_milestone_e_package_publication_current_registry_assembly.py create mode 100644 .github/scripts/test_milestone_e_package_publication_final_approval_request.py create mode 100644 docs/validation/milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.md create mode 100644 docs/validation/milestone-e-package-publication-final-approval-request-validation-2026-06-22.md diff --git a/.github/scripts/test_milestone_e_package_publication_current_registry_assembly.py b/.github/scripts/test_milestone_e_package_publication_current_registry_assembly.py new file mode 100644 index 0000000..d8a39d9 --- /dev/null +++ b/.github/scripts/test_milestone_e_package_publication_current_registry_assembly.py @@ -0,0 +1,216 @@ +#!/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] +SCRIPT = ROOT / ".github/scripts/package_publication_candidate_activation.py" +RECORD = ( + ROOT + / "docs/validation/" + "milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.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" +CI_WORKFLOW = ROOT / ".github/workflows/ci.yml" + +SOURCE_COMMIT = "b48e2f2c7ff6f3507bbf84c6d603cf4a385b9875" +SOURCE_SHORT = "b48e2f2" +SOURCE_TREE = "4d660bd7c1de69259d0f8c59e6ac8d1c2cb6a3a3" +FORBIDDEN_SCOPE_EXPANSION = [ + "package publication approved", + "package publication is approved", + "public installation approved", + "public installation is approved", + "public installation wording is approved", + "package tag creation approved", + "release-ready", + "release artifact approved", + "package-ready", + "packages are published", + "published packages", + "production-ready", + "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 git(*args: str) -> str: + return subprocess.check_output( + ["git", *args], + cwd=ROOT, + encoding="utf-8", + stderr=subprocess.DEVNULL, + ).strip() + + +def run_candidate_activation() -> dict: + result = subprocess.run( + ["python3", str(SCRIPT), "--json"], + cwd=ROOT, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + encoding="utf-8", + ) + if result.returncode != 0: + raise AssertionError( + "candidate activation script failed\n" + f"stdout:\n{result.stdout}\n" + f"stderr:\n{result.stderr}" + ) + return json.loads(result.stdout) + + +class MilestoneEPackagePublicationCurrentRegistryAssemblyTests(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + cls.result = run_candidate_activation() + + def test_current_registry_equivalent_assembly_passes_after_manifest_activation(self) -> None: + result = self.result + commands = [entry["command"] for entry in result["commands"]] + + self.assertEqual("pass", result["status"]) + self.assertEqual("0.1.0", result["candidate_version"]) + self.assertEqual(["ethos-doc-core", "ethos-verify", "ethos-pdf"], result["candidate_packages"]) + self.assertEqual("pass", result["registry_equivalent_consumer_check"]) + self.assertTrue(result["source_manifest_activation_applied"]) + self.assertTrue(result["source_manifests_remain_blocked"]) + self.assertFalse(result["package_publication_approved"]) + self.assertFalse(result["public_installation_approved"]) + self.assertIn("cargo package --locked --offline -p ethos-doc-core --allow-dirty --no-verify", commands) + self.assertIn("assemble candidate package artifact -p ethos-verify", commands) + self.assertIn("assemble candidate package artifact -p ethos-pdf", commands) + self.assertIn("cargo check --locked --offline", commands) + + def test_artifacts_and_manifest_shape_are_current(self) -> None: + result = self.result + activation = result["manifest_activation"] + artifacts = {artifact["package"]: artifact for artifact in result["artifacts"]} + + self.assertEqual("ethos-doc-core", activation["core_package_name"]) + self.assertEqual("ethos_core", activation["core_library_name"]) + self.assertEqual("ethos-core", activation["dependency_key"]) + self.assertEqual(["grounding", "verify-types"], activation["verify_core_features"]) + self.assertEqual(["full"], activation["pdf_core_features"]) + self.assertEqual({"ethos-doc-core", "ethos-verify", "ethos-pdf"}, set(artifacts)) + for artifact in artifacts.values(): + self.assertRegex(artifact["sha256"], r"^[0-9a-f]{64}$") + self.assertTrue(artifact["crate_file"].endswith("-0.1.0.crate")) + + def test_source_manifests_tags_and_registry_state_remain_blocked(self) -> None: + for manifest in ( + ROOT / "crates/ethos-core/Cargo.toml", + ROOT / "crates/ethos-verify/Cargo.toml", + ROOT / "crates/ethos-pdf/Cargo.toml", + ): + text = read(manifest) + self.assertIn("publish = false", text, str(manifest)) + self.assertIn('publication_status = "blocked"', text, str(manifest)) + + for tag in ( + "ethos-package-ethos-doc-core-0.1.0", + "ethos-package-ethos-verify-0.1.0", + "ethos-package-ethos-pdf-0.1.0", + ): + self.assertEqual("", git("tag", "--list", tag)) + self.assertFalse((ROOT / ".cargo/config.toml").exists()) + self.assertFalse((ROOT / "target/package-registry").exists()) + + def test_record_is_indexed_and_source_bound(self) -> None: + readme = normalized(VALIDATION_README) + record = normalized(RECORD) + + self.assertIn(RECORD.name, readme) + self.assertIn("package publication current registry-equivalent assembly validation", readme) + self.assertIn(f"Validated source HEAD before this record: `{SOURCE_SHORT}`", read(RECORD)) + self.assertIn(f"Current registry-equivalent assembly source commit: `{SOURCE_COMMIT}`", record) + self.assertIn(f"Current registry-equivalent assembly source tree: `{SOURCE_TREE}`", record) + self.assertEqual(SOURCE_COMMIT, git("rev-parse", SOURCE_SHORT)) + self.assertEqual(SOURCE_TREE, git("rev-parse", f"{SOURCE_SHORT}^{{tree}}")) + + def test_docs_reference_current_assembly_and_retained_blockers(self) -> None: + for path in (PREP_SCOPE, ROADMAP, EXECUTION_STATUS, VALIDATION_README): + doc = normalized(path) + + self.assertIn(RECORD.name, doc, str(path)) + self.assertIn("current registry-equivalent assembly", doc.lower(), str(path)) + self.assertIn("package publication remains blocked", doc, str(path)) + self.assertIn("public installation remains blocked", doc, str(path)) + + def test_make_and_ci_run_current_assembly_after_manifest_activation(self) -> None: + make_block = target_block("milestone-e-prep") + ci = read(CI_WORKFLOW) + manifest_guard = "test_milestone_e_package_publication_manifest_activation_applied.py" + assembly_guard = "test_milestone_e_package_publication_current_registry_assembly.py" + readiness_guard = "test_milestone_e_public_facing_readiness_ledger.py" + + for text, prefix in ((make_block, "$(PYTHON) .github/scripts/"), (ci, "python3 .github/scripts/")): + self.assertIn(prefix + assembly_guard, text) + self.assertEqual(1, text.count(prefix + assembly_guard)) + self.assertLess(text.index(prefix + manifest_guard), text.index(prefix + assembly_guard)) + self.assertLess(text.index(prefix + assembly_guard), text.index(prefix + readiness_guard)) + + def test_record_avoids_scope_expansion_language_or_private_paths(self) -> None: + lower = normalized(RECORD).lower() + raw = read(RECORD) + + for phrase in FORBIDDEN_SCOPE_EXPANSION: + self.assertNotIn(phrase, 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_package_publication_final_approval_request.py b/.github/scripts/test_milestone_e_package_publication_final_approval_request.py new file mode 100644 index 0000000..5a7cf6f --- /dev/null +++ b/.github/scripts/test_milestone_e_package_publication_final_approval_request.py @@ -0,0 +1,214 @@ +#!/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 re +import subprocess +import unittest +from pathlib import Path + +from makefile_guard import target_block + + +ROOT = Path(__file__).resolve().parents[2] +RECORD = ( + ROOT + / "docs/validation/" + "milestone-e-package-publication-final-approval-request-validation-2026-06-22.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" +CI_WORKFLOW = ROOT / ".github/workflows/ci.yml" + +SOURCE_COMMIT = "b48e2f2c7ff6f3507bbf84c6d603cf4a385b9875" +SOURCE_SHORT = "b48e2f2" +SOURCE_TREE = "4d660bd7c1de69259d0f8c59e6ac8d1c2cb6a3a3" +EXACT_CRATES = ["ethos-doc-core", "ethos-verify", "ethos-pdf"] +EXACT_TAGS = [ + "ethos-package-ethos-doc-core-0.1.0", + "ethos-package-ethos-verify-0.1.0", + "ethos-package-ethos-pdf-0.1.0", +] +EXACT_PUBLIC_WORDING = ( + "Ethos Rust crates ethos-doc-core, ethos-verify, and ethos-pdf version 0.1.0 are proposed " + "for crates.io installation only after explicit package-publication approval and package-tag " + "creation. ethos-pdf requires caller-provided PDFium through ETHOS_PDFIUM_LIBRARY_PATH. " + "Wheels, npm packages, binaries, hosted surfaces, production positioning, public benchmark " + "reports, public benchmark claims, project-maintained PDFium builds, ethos-doc, and ethos-rag " + "remain blocked." +) +REQUIRED_PACKET_FIELDS = [ + "Decision requested: approve exact crates.io publication preparation inputs for later decider signoff.", + "Approver requested: docushell-admin acting as decider.", + "Exact candidate crate list requested: `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` only.", + "Exact package version map requested: `ethos-doc-core = 0.1.0`, `ethos-verify = 0.1.0`, and `ethos-pdf = 0.1.0`.", + "Exact package tag source commit requested: `b48e2f2c7ff6f3507bbf84c6d603cf4a385b9875`.", + "Exact package tag source tree requested: `4d660bd7c1de69259d0f8c59e6ac8d1c2cb6a3a3`.", + "Exact publish-flag activation requested later: remove `publish = false` from the three candidate crate manifests only after decider approval.", + "Exact metadata activation requested later: change `publication_status = \"blocked\"` only after decider approval.", + "Exact public installation wording requested later:", +] +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 git(*args: str) -> str: + return subprocess.check_output( + ["git", *args], + cwd=ROOT, + encoding="utf-8", + stderr=subprocess.DEVNULL, + ).strip() + + +class MilestoneEPackagePublicationFinalApprovalRequestTests(unittest.TestCase): + def test_request_record_is_indexed_and_source_bound(self) -> None: + readme = normalized(VALIDATION_README) + record = normalized(RECORD) + + self.assertIn(RECORD.name, readme) + self.assertIn("package publication final approval request validation", readme) + self.assertIn(f"Validated source HEAD before this record: `{SOURCE_SHORT}`", read(RECORD)) + self.assertIn(f"Final approval request source commit: `{SOURCE_COMMIT}`", record) + self.assertIn(f"Final approval request source tree: `{SOURCE_TREE}`", record) + self.assertEqual(SOURCE_COMMIT, git("rev-parse", SOURCE_SHORT)) + self.assertEqual(SOURCE_TREE, git("rev-parse", f"{SOURCE_SHORT}^{{tree}}")) + + def test_request_packet_names_exact_surface_version_tags_and_wording(self) -> None: + record = normalized(RECORD) + + self.assertIn("Status: **pass for exact package-publication approval request packet with publication blocked**", record) + for field in REQUIRED_PACKET_FIELDS: + self.assertIn(field, record) + for crate in EXACT_CRATES: + self.assertIn(crate, record) + self.assertIn(f"{crate} = 0.1.0", record) + for tag in EXACT_TAGS: + self.assertIn(tag, record) + self.assertIn(EXACT_PUBLIC_WORDING, record) + self.assertIn("`ethos-doc` remains excluded", record) + self.assertIn("`ethos-rag` remains excluded", record) + + def test_request_does_not_mutate_manifests_or_create_tags(self) -> None: + for manifest in ( + ROOT / "crates/ethos-core/Cargo.toml", + ROOT / "crates/ethos-verify/Cargo.toml", + ROOT / "crates/ethos-pdf/Cargo.toml", + ): + text = read(manifest) + self.assertIn("publish = false", text, str(manifest)) + self.assertIn('publication_status = "blocked"', text, str(manifest)) + + for tag in EXACT_TAGS: + self.assertEqual("", git("tag", "--list", tag)) + self.assertFalse((ROOT / ".cargo/config.toml").exists()) + self.assertFalse((ROOT / "target/package-registry").exists()) + + def test_request_references_current_evidence_and_retains_blockers(self) -> None: + record = normalized(RECORD) + + self.assertIn( + "milestone-e-package-publication-current-dry-run-smoke-validation-2026-06-22.md", + record, + ) + self.assertIn( + "milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.md", + record, + ) + self.assertIn( + "milestone-e-package-publication-manifest-activation-applied-validation-2026-06-22.md", + record, + ) + self.assertIn("Package publication remains blocked pending explicit decider approval.", record) + self.assertIn("Public installation remains blocked pending explicit decider approval.", record) + + def test_docs_reference_request_packet_and_retained_blockers(self) -> None: + for path in (PREP_SCOPE, ROADMAP, EXECUTION_STATUS, VALIDATION_README): + doc = normalized(path) + + self.assertIn(RECORD.name, doc, str(path)) + self.assertIn("final approval request", doc.lower(), str(path)) + self.assertIn("package publication remains blocked", doc, str(path)) + self.assertIn("public installation remains blocked", doc, str(path)) + + def test_make_and_ci_run_request_after_current_assembly(self) -> None: + make_block = target_block("milestone-e-prep") + ci = read(CI_WORKFLOW) + assembly_guard = "test_milestone_e_package_publication_current_registry_assembly.py" + request_guard = "test_milestone_e_package_publication_final_approval_request.py" + readiness_guard = "test_milestone_e_public_facing_readiness_ledger.py" + + for text, prefix in ((make_block, "$(PYTHON) .github/scripts/"), (ci, "python3 .github/scripts/")): + self.assertIn(prefix + request_guard, text) + self.assertEqual(1, text.count(prefix + request_guard)) + self.assertLess(text.index(prefix + assembly_guard), text.index(prefix + request_guard)) + self.assertLess(text.index(prefix + request_guard), text.index(prefix + readiness_guard)) + + def test_record_avoids_scope_expansion_language_or_private_paths(self) -> None: + lower = normalized(RECORD).lower() + raw = read(RECORD) + + for phrase in FORBIDDEN_SCOPE_EXPANSION: + self.assertNotIn(phrase, 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_prep_guard_sequence_index.py b/.github/scripts/test_milestone_e_prep_guard_sequence_index.py index 1133dc3..93aa780 100644 --- a/.github/scripts/test_milestone_e_prep_guard_sequence_index.py +++ b/.github/scripts/test_milestone_e_prep_guard_sequence_index.py @@ -117,6 +117,8 @@ "$(PYTHON) .github/scripts/test_milestone_e_package_publication_candidate_activation_evidence.py", "$(PYTHON) .github/scripts/test_milestone_e_package_publication_approval_decision_refresh.py", "$(PYTHON) .github/scripts/test_milestone_e_package_publication_manifest_activation_applied.py", + "$(PYTHON) .github/scripts/test_milestone_e_package_publication_current_registry_assembly.py", + "$(PYTHON) .github/scripts/test_milestone_e_package_publication_final_approval_request.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_public_beta_current_main_source_only_approval.py", diff --git a/.github/scripts/test_milestone_e_prep_scope.py b/.github/scripts/test_milestone_e_prep_scope.py index 6a39700..e173ab3 100644 --- a/.github/scripts/test_milestone_e_prep_scope.py +++ b/.github/scripts/test_milestone_e_prep_scope.py @@ -416,6 +416,8 @@ def test_make_target_is_narrow_and_guarded(self) -> None: "$(PYTHON) .github/scripts/test_milestone_e_package_publication_candidate_activation_evidence.py", "$(PYTHON) .github/scripts/test_milestone_e_package_publication_approval_decision_refresh.py", "$(PYTHON) .github/scripts/test_milestone_e_package_publication_manifest_activation_applied.py", + "$(PYTHON) .github/scripts/test_milestone_e_package_publication_current_registry_assembly.py", + "$(PYTHON) .github/scripts/test_milestone_e_package_publication_final_approval_request.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_public_beta_current_main_source_only_approval.py", diff --git a/.github/scripts/test_milestone_e_validation_record_index.py b/.github/scripts/test_milestone_e_validation_record_index.py index c176e71..9ec2bb4 100644 --- a/.github/scripts/test_milestone_e_validation_record_index.py +++ b/.github/scripts/test_milestone_e_validation_record_index.py @@ -306,6 +306,14 @@ class RecordCoverage: "milestone-e-package-publication-manifest-activation-applied-validation-2026-06-22.md", "test_milestone_e_package_publication_manifest_activation_applied.py", ), + RecordCoverage( + "milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.md", + "test_milestone_e_package_publication_current_registry_assembly.py", + ), + RecordCoverage( + "milestone-e-package-publication-final-approval-request-validation-2026-06-22.md", + "test_milestone_e_package_publication_final_approval_request.py", + ), RecordCoverage( "milestone-e-public-facing-readiness-ledger-validation-2026-06-21.md", "test_milestone_e_public_facing_readiness_ledger.py", @@ -447,6 +455,15 @@ def test_index_guards_run_after_row_and_schema_records(self) -> None: package_approval_decision_refresh_guard = ( "test_milestone_e_package_publication_approval_decision_refresh.py" ) + package_manifest_activation_applied_guard = ( + "test_milestone_e_package_publication_manifest_activation_applied.py" + ) + package_current_registry_assembly_guard = ( + "test_milestone_e_package_publication_current_registry_assembly.py" + ) + package_final_approval_request_guard = ( + "test_milestone_e_package_publication_final_approval_request.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" @@ -547,6 +564,18 @@ def test_index_guards_run_after_row_and_schema_records(self) -> None: ) self.assertLess( text.index(prefix + package_approval_decision_refresh_guard), + text.index(prefix + package_manifest_activation_applied_guard), + ) + self.assertLess( + text.index(prefix + package_manifest_activation_applied_guard), + text.index(prefix + package_current_registry_assembly_guard), + ) + self.assertLess( + text.index(prefix + package_current_registry_assembly_guard), + text.index(prefix + package_final_approval_request_guard), + ) + self.assertLess( + text.index(prefix + package_final_approval_request_guard), text.index(prefix + readiness_guard), ) self.assertLess(text.index(prefix + readiness_guard), text.index(prefix + beta_refresh_guard)) @@ -592,6 +621,30 @@ def test_index_guards_run_after_row_and_schema_records(self) -> None: text.index(prefix + package_approval_decision_refresh_guard), text.index(prefix + index_guard), ) + self.assertLess( + text.index(prefix + package_manifest_activation_applied_guard), + text.index(prefix + command_guard), + ) + self.assertLess( + text.index(prefix + package_manifest_activation_applied_guard), + text.index(prefix + index_guard), + ) + self.assertLess( + text.index(prefix + package_current_registry_assembly_guard), + text.index(prefix + command_guard), + ) + self.assertLess( + text.index(prefix + package_current_registry_assembly_guard), + text.index(prefix + index_guard), + ) + self.assertLess( + text.index(prefix + package_final_approval_request_guard), + text.index(prefix + command_guard), + ) + self.assertLess( + text.index(prefix + package_final_approval_request_guard), + text.index(prefix + index_guard), + ) self.assertLess( text.index(prefix + package_registry_evidence_review_guard), text.index(prefix + command_guard), diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 15e9625..b88f3cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -248,6 +248,10 @@ jobs: run: python3 .github/scripts/test_milestone_e_package_publication_approval_decision_refresh.py - name: Milestone E package publication manifest activation applied tests run: python3 .github/scripts/test_milestone_e_package_publication_manifest_activation_applied.py + - name: Milestone E package publication current registry-equivalent assembly tests + run: python3 .github/scripts/test_milestone_e_package_publication_current_registry_assembly.py + - name: Milestone E package publication final approval request tests + run: python3 .github/scripts/test_milestone_e_package_publication_final_approval_request.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 diff --git a/Makefile b/Makefile index c093de9..18b5600 100644 --- a/Makefile +++ b/Makefile @@ -231,6 +231,8 @@ milestone-e-prep: $(PYTHON) .github/scripts/test_milestone_e_package_publication_candidate_activation_evidence.py $(PYTHON) .github/scripts/test_milestone_e_package_publication_approval_decision_refresh.py $(PYTHON) .github/scripts/test_milestone_e_package_publication_manifest_activation_applied.py + $(PYTHON) .github/scripts/test_milestone_e_package_publication_current_registry_assembly.py + $(PYTHON) .github/scripts/test_milestone_e_package_publication_final_approval_request.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_public_beta_current_main_source_only_approval.py diff --git a/docs/execution-status.md b/docs/execution-status.md index bb2e9e9..a8f2454 100644 --- a/docs/execution-status.md +++ b/docs/execution-status.md @@ -217,6 +217,10 @@ The package publication approval decision refresh in `docs/validation/milestone- The package publication manifest activation applied record in `docs/validation/milestone-e-package-publication-manifest-activation-applied-validation-2026-06-22.md` records the source package name `ethos-doc-core`, Rust library name `ethos_core`, and workspace dependency activation for review only. `publish = false`, package publication, and public installation remain blocked. +The package publication current registry-equivalent assembly record in `docs/validation/milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.md` records non-public assembly evidence for `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` against source commit `b48e2f2` / tree `4d660bd7c1de69259d0f8c59e6ac8d1c2cb6a3a3`. Package publication remains blocked, and public installation remains blocked. + +The package publication final approval request in `docs/validation/milestone-e-package-publication-final-approval-request-validation-2026-06-22.md` records exact candidate crates, version map, package tag names, source binding, proposed public installation wording, and explicit exclusions for decider review. Package publication remains blocked, and public installation remains blocked. + | 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 d7c0294..6667e60 100644 --- a/docs/milestone-e-prep-scope.md +++ b/docs/milestone-e-prep-scope.md @@ -164,6 +164,15 @@ The package publication manifest activation applied follow-up is recorded in It records the source package name `ethos-doc-core`, Rust library name `ethos_core`, and workspace dependency activation for review only; `publish = false`, public installation, and package publication remain blocked. +The package publication current registry-equivalent assembly follow-up is recorded in +`docs/validation/milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.md`. +It records current registry-equivalent assembly evidence for `ethos-doc-core`, `ethos-verify`, and +`ethos-pdf`; public installation and package publication remain blocked. +The package publication final approval request is recorded in +`docs/validation/milestone-e-package-publication-final-approval-request-validation-2026-06-22.md`. +It records exact candidate crates, version map, package tag names, source binding, proposed public +installation wording, and explicit exclusions for decider review; public installation and package +publication remain 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 @@ -355,6 +364,12 @@ or broad demo-generation workflows. - The package publication manifest activation applied follow-up records the source package name `ethos-doc-core`, Rust library name `ethos_core`, and workspace dependency activation for review only; `publish = false`, public installation, and package publication remain blocked. +- The package publication current registry-equivalent assembly follow-up records non-public + assembly evidence for `ethos-doc-core`, `ethos-verify`, and `ethos-pdf`; public installation and + package publication remain blocked. +- The package publication final approval request records exact candidate crates, version map, + package tag names, source binding, proposed public installation wording, and explicit exclusions + for decider review; public installation and package publication remain blocked. - The public-facing readiness ledger records the current-main source-only public beta source binding and package-publication gap retention; it does not approve package publication, approve public installation, or soften any current diff --git a/docs/roadmap.md b/docs/roadmap.md index a4d6001..3a476ab 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -134,6 +134,15 @@ The manifest activation applied follow-up is recorded in and records the source package name `ethos-doc-core`, Rust library name `ethos_core`, and workspace dependency activation for review only; `publish = false`, public installation, and package publication remain blocked. +The current registry-equivalent assembly follow-up is recorded in +[`docs/validation/milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.md`](validation/milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.md) +and records non-public assembly evidence for `ethos-doc-core`, `ethos-verify`, and `ethos-pdf`; +public installation and package publication remain blocked. +The final approval request is recorded in +[`docs/validation/milestone-e-package-publication-final-approval-request-validation-2026-06-22.md`](validation/milestone-e-package-publication-final-approval-request-validation-2026-06-22.md) +and records exact candidate crates, version map, package tag names, source binding, proposed public +installation wording, and explicit exclusions for decider review; 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, diff --git a/docs/validation/README.md b/docs/validation/README.md index da64bb4..5b47fd4 100644 --- a/docs/validation/README.md +++ b/docs/validation/README.md @@ -390,6 +390,14 @@ recording the exact current-main source candidate and required follow-up evidenc package publication manifest activation applied validation for the source package name `ethos-doc-core`, Rust library name `ethos_core`, workspace dependency activation, and retained `publish = false` blockers; package publication and public installation remain blocked. +- `milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.md` - package + publication current registry-equivalent assembly validation after source manifest activation; the + record keeps package publication and public installation blocked while recording non-public + assembly evidence for `ethos-doc-core`, `ethos-verify`, and `ethos-pdf`. +- `milestone-e-package-publication-final-approval-request-validation-2026-06-22.md` - package + publication final approval request validation; the record keeps package publication and public + installation blocked while recording exact candidate crates, version map, package tag names, + source binding, proposed public installation wording, and explicit exclusions for decider review. - `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 diff --git a/docs/validation/milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.md b/docs/validation/milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.md new file mode 100644 index 0000000..7e3b2f6 --- /dev/null +++ b/docs/validation/milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.md @@ -0,0 +1,110 @@ +# Milestone E Package Publication Current Registry-Equivalent Assembly Validation - 2026-06-22 + +## Purpose + +Refresh registry-equivalent dependent package assembly evidence after source manifest activation +and the current dry-run smoke evidence refresh. + +This record validates the current non-public assembly rehearsal for `ethos-doc-core`, +`ethos-verify`, and `ethos-pdf`. It does not approve package publication, public installation, +public installation wording, package tag creation, removing `publish = false`, or real-version +cargo publish. + +## Status + +Status: **pass for current registry-equivalent assembly evidence with publication blocked**. + +Decision: current registry-equivalent assembly evidence is recorded; package publication remains +blocked. + +Ethos remains source-only pre-alpha outside the approved GitHub source-repository public beta +surface. Package publication remains blocked. Public installation remains blocked. + +## Subject + +- Repository: `docushell/ethos` +- Validated source HEAD before this record: `b48e2f2` +- Current registry-equivalent assembly source commit: + `b48e2f2c7ff6f3507bbf84c6d603cf4a385b9875` +- Current registry-equivalent assembly source tree: + `4d660bd7c1de69259d0f8c59e6ac8d1c2cb6a3a3` +- Lane: package publication +- Candidate packages: `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` +- Candidate package version: `0.1.0` +- Evidence command: `.github/scripts/package_publication_candidate_activation.py --json` +- Current dry-run smoke record: + `docs/validation/milestone-e-package-publication-current-dry-run-smoke-validation-2026-06-22.md` +- Manifest activation applied record: + `docs/validation/milestone-e-package-publication-manifest-activation-applied-validation-2026-06-22.md` + +## Evidence Review + +- The current source tree already uses package name `ethos-doc-core` for `crates/ethos-core` and + keeps Rust library name `ethos_core`. +- The current source tree keeps workspace dependency key `ethos-core` while resolving package + `ethos-doc-core`. +- `ethos-verify` retains core features `grounding` and `verify-types`. +- `ethos-pdf` retains core feature `full`. +- The non-public assembly command assembles `ethos-doc-core-0.1.0.crate`, + `ethos-verify-0.1.0.crate`, and `ethos-pdf-0.1.0.crate`. +- The unpacked registry-equivalent consumer resolves `ethos-doc-core`, `ethos-verify`, and + `ethos-pdf` and passes `cargo check --locked --offline`. +- Source manifests retain `publish = false` and `publication_status = "blocked"`. +- No package tag exists for `ethos-package-ethos-doc-core-0.1.0`, + `ethos-package-ethos-verify-0.1.0`, or `ethos-package-ethos-pdf-0.1.0`. + +## Non-Approvals + +- This evidence does not approve package publication. +- This evidence does not approve public installation. +- This evidence does not approve public installation wording. +- This evidence does not select a package publication version. +- This evidence does not create package tags. +- This evidence does not remove `publish = false`. +- This evidence does not create a source-tree package registry. +- This evidence does not approve real-version cargo publish. +- This evidence does not approve hosted surfaces. +- This evidence does not approve production positioning. +- This evidence does not approve public benchmark reports. +- This evidence does not approve public benchmark claims. + +## Retained Blockers + +- exact package publication approval remains required +- exact package version selection remains blocked +- exact package tag creation remains blocked +- publish-flag activation remains blocked +- public installation wording approval remains blocked +- public installation remains blocked +- package publication remains blocked +- real-version cargo publish remains blocked +- hosted surfaces remain blocked +- production positioning remains blocked +- Public reports remain blocked +- Public result wording remains blocked + +## Commands + +```sh +python3 .github/scripts/package_publication_candidate_activation.py --json +python3 .github/scripts/test_milestone_e_package_publication_current_registry_assembly.py +python3 .github/scripts/test_milestone_e_package_publication_dry_run_smoke.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 +``` + +## Result + +```text +Current registry-equivalent assembly validation passed +Temporary package artifacts assembled for ethos-doc-core, ethos-verify, and ethos-pdf +Registry-equivalent consumer check passed +Source manifests retained publish=false and publication_status=blocked +Package publication and public installation remained blocked +Public-surface posture and claims gates passed +Milestone E prep target passed +git diff --check passed +``` diff --git a/docs/validation/milestone-e-package-publication-final-approval-request-validation-2026-06-22.md b/docs/validation/milestone-e-package-publication-final-approval-request-validation-2026-06-22.md new file mode 100644 index 0000000..8a1c8e2 --- /dev/null +++ b/docs/validation/milestone-e-package-publication-final-approval-request-validation-2026-06-22.md @@ -0,0 +1,144 @@ +# Milestone E Package Publication Final Approval Request Validation - 2026-06-22 + +## Purpose + +Record the exact package-publication approval request packet for decider review after current +source manifest activation, current dry-run smoke evidence, and current registry-equivalent +assembly evidence are present. + +This record does not approve package publication, public installation, public installation wording, +package tag creation, removing `publish = false`, metadata activation, or real-version cargo +publish. It records the exact fields that must be accepted or rejected by the decider. + +## Status + +Status: **pass for exact package-publication approval request packet with publication blocked**. + +Decision: exact approval request packet recorded for decider review. + +Ethos remains source-only pre-alpha outside the approved GitHub source-repository public beta +surface. Package publication remains blocked. Public installation remains blocked. + +## Subject + +- Repository: `docushell/ethos` +- Validated source HEAD before this record: `b48e2f2` +- Final approval request source commit: + `b48e2f2c7ff6f3507bbf84c6d603cf4a385b9875` +- Final approval request source tree: + `4d660bd7c1de69259d0f8c59e6ac8d1c2cb6a3a3` +- Lane: package publication +- Current dry-run smoke record: + `docs/validation/milestone-e-package-publication-current-dry-run-smoke-validation-2026-06-22.md` +- Current registry-equivalent assembly record: + `docs/validation/milestone-e-package-publication-current-registry-assembly-validation-2026-06-22.md` +- Manifest activation applied record: + `docs/validation/milestone-e-package-publication-manifest-activation-applied-validation-2026-06-22.md` + +## Exact Request Fields + +- Decision requested: approve exact crates.io publication preparation inputs for later decider + signoff. +- Approver requested: docushell-admin acting as decider. +- Date requested: 2026-06-22. +- Exact candidate crate list requested: `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` only. +- Exact package version map requested: `ethos-doc-core = 0.1.0`, `ethos-verify = 0.1.0`, and + `ethos-pdf = 0.1.0`. +- Exact package tag name set requested: `ethos-package-ethos-doc-core-0.1.0`, + `ethos-package-ethos-verify-0.1.0`, and `ethos-package-ethos-pdf-0.1.0`. +- Exact package tag source commit requested: `b48e2f2c7ff6f3507bbf84c6d603cf4a385b9875`. +- Exact package tag source tree requested: `4d660bd7c1de69259d0f8c59e6ac8d1c2cb6a3a3`. +- Exact manifest activation reviewed: `ethos-doc-core` package name is active in source, Rust + library name remains `ethos_core`, and workspace dependency key `ethos-core` resolves package + `ethos-doc-core`. +- Exact publish-flag activation requested later: remove `publish = false` from the three candidate + crate manifests only after decider approval. +- Exact metadata activation requested later: change `publication_status = "blocked"` only after + decider approval. +- Exact public installation wording requested later: Ethos Rust crates ethos-doc-core, + ethos-verify, and ethos-pdf version 0.1.0 are proposed for crates.io installation only after + explicit package-publication approval and package-tag creation. ethos-pdf requires + caller-provided PDFium through ETHOS_PDFIUM_LIBRARY_PATH. Wheels, npm packages, binaries, hosted + surfaces, production positioning, public benchmark reports, public benchmark claims, + project-maintained PDFium builds, ethos-doc, and ethos-rag remain blocked. + +## Explicit Exclusions + +- wheels remain blocked +- npm packages remain blocked +- binaries 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 +- `ethos-doc` remains excluded +- `ethos-rag` remains excluded +- broader public wording remains blocked +- Public reports remain blocked +- Public result wording remains blocked + +## Evidence Bound To This Request + +- Source binding: `b48e2f2c7ff6f3507bbf84c6d603cf4a385b9875` / + `4d660bd7c1de69259d0f8c59e6ac8d1c2cb6a3a3`. +- Current dry-run smoke: `ethos-doc-core` local package assembly passes; `ethos-verify` and + `ethos-pdf` source-tree checks pass. +- Current registry-equivalent assembly: temporary candidate artifacts assemble and the unpacked + consumer passes `cargo check --locked --offline`. +- PDFium boundary: `ethos-pdf` remains caller-provided through `ETHOS_PDFIUM_LIBRARY_PATH`; no + project-maintained PDFium build is part of this request. +- Public-surface posture and claims gates must pass again after any later exact wording change. +- Milestone E prep must pass again after any later exact approval record. + +## Non-Approvals + +- This request packet does not approve package publication. +- This request packet does not approve public installation. +- This request packet does not approve public installation wording. +- This request packet does not create package tags. +- This request packet does not remove `publish = false`. +- This request packet does not activate package metadata. +- This request packet does not approve real-version cargo publish. +- This request packet does not approve hosted surfaces. +- This request packet does not approve production positioning. +- This request packet does not approve public benchmark reports. +- This request packet does not approve public benchmark claims. + +## Retained Blockers + +- Package publication remains blocked pending explicit decider approval. +- Public installation remains blocked pending explicit decider approval. +- Package tag creation remains blocked pending explicit decider approval. +- Publish-flag activation remains blocked pending explicit decider approval. +- Metadata activation remains blocked pending explicit decider approval. +- Real-version cargo publish remains blocked. +- Hosted surfaces remain blocked. +- Production positioning remains blocked. +- Public reports remain blocked. +- Public result wording remains blocked. + +## Commands + +```sh +python3 .github/scripts/test_milestone_e_package_publication_final_approval_request.py +python3 .github/scripts/test_milestone_e_package_publication_current_registry_assembly.py +python3 .github/scripts/test_milestone_e_package_publication_dry_run_smoke.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 +``` + +## Result + +```text +Final approval request packet validation passed +Exact candidate crate list, version map, tag names, source binding, and wording were recorded +Current dry-run smoke and registry-equivalent assembly evidence were recorded +Package publication and public installation remained blocked +Public-surface posture and claims gates passed +Milestone E prep target passed +git diff --check passed +```