diff --git a/.github/scripts/test_execution_status.py b/.github/scripts/test_execution_status.py index 3c3cd25..d5fb316 100644 --- a/.github/scripts/test_execution_status.py +++ b/.github/scripts/test_execution_status.py @@ -36,7 +36,7 @@ def test_status_is_scoped_to_internal_continuation(self) -> None: self.assertIn( "Status: Public beta evaluation is approved for the GitHub source repository; the three bounded " "Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`; " - "the Python `ethos-pdf` wheel at `0.1.1`; the npm `@docushell/ethos-pdf` CLI package " + "the Python `ethos-pdf` wheel at `0.1.2`; the npm `@docushell/ethos-pdf` CLI package " "at `0.1.2`; and the GitHub Release `v0.1.2` macOS arm64 and Linux x64 CLI artifacts.", text, ) @@ -91,7 +91,7 @@ def test_public_posture_boundary_remains_explicit(self) -> None: "Ethos is a deterministic document evidence layer for source-grounded verification and " "citation checking across native Ethos JSON and supported foreign parser outputs. The current " "beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, " - "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.1`, " + "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, " "the npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS " "arm64/Linux x64 CLI artifacts. PDFium-backed commands use caller-provided PDFium through " "`ETHOS_PDFIUM_LIBRARY_PATH`.", diff --git a/.github/scripts/test_milestone_e_package_publication_public_installation_availability.py b/.github/scripts/test_milestone_e_package_publication_public_installation_availability.py index b95db6c..3122e7d 100644 --- a/.github/scripts/test_milestone_e_package_publication_public_installation_availability.py +++ b/.github/scripts/test_milestone_e_package_publication_public_installation_availability.py @@ -58,7 +58,7 @@ "Ethos is a deterministic document evidence layer for source-grounded verification and " "citation checking across native Ethos JSON and supported foreign parser outputs. The current " "beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, " - "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.1`, the " + "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the " "npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 " "CLI artifacts. PDFium-backed commands use caller-provided PDFium through " "`ETHOS_PDFIUM_LIBRARY_PATH`." diff --git a/.github/scripts/test_milestone_e_public_beta_source_only_approval.py b/.github/scripts/test_milestone_e_public_beta_source_only_approval.py index 1121347..4ed186e 100644 --- a/.github/scripts/test_milestone_e_public_beta_source_only_approval.py +++ b/.github/scripts/test_milestone_e_public_beta_source_only_approval.py @@ -46,7 +46,7 @@ "Ethos is a deterministic document evidence layer for source-grounded verification and " "citation checking across native Ethos JSON and supported foreign parser outputs. The current " "beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, " - "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.1`, the " + "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the " "npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 " "CLI artifacts. PDFium-backed commands use caller-provided PDFium through " "`ETHOS_PDFIUM_LIBRARY_PATH`." diff --git a/.github/scripts/test_milestone_e_public_evaluation_current_state_closeout.py b/.github/scripts/test_milestone_e_public_evaluation_current_state_closeout.py index fe7cd3a..26f826e 100644 --- a/.github/scripts/test_milestone_e_public_evaluation_current_state_closeout.py +++ b/.github/scripts/test_milestone_e_public_evaluation_current_state_closeout.py @@ -52,7 +52,7 @@ "Ethos is a deterministic document evidence layer for source-grounded verification and " "citation checking across native Ethos JSON and supported foreign parser outputs. The current " "beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, " - "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.1`, the " + "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the " "npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 " "CLI artifacts. PDFium-backed commands use caller-provided PDFium through " "`ETHOS_PDFIUM_LIBRARY_PATH`." diff --git a/.github/scripts/test_patch_0_1_1_public_install_wording_closeout.py b/.github/scripts/test_patch_0_1_1_public_install_wording_closeout.py index 57ad951..0cdf03d 100644 --- a/.github/scripts/test_patch_0_1_1_public_install_wording_closeout.py +++ b/.github/scripts/test_patch_0_1_1_public_install_wording_closeout.py @@ -7,7 +7,6 @@ from __future__ import annotations -import json import re import subprocess import unittest @@ -19,10 +18,6 @@ ROOT = Path(__file__).resolve().parents[2] RECORD = ROOT / "docs/validation/patch-0-1-1-public-install-wording-closeout-validation-2026-06-24.md" VALIDATION_README = ROOT / "docs/validation/README.md" -README = ROOT / "README.md" -PYTHON_README = ROOT / "python/README.md" -PYTHON_QUICKSTART = ROOT / "python/QUICKSTART.md" -CLAIMS = ROOT / "docs/public-boundary-claims.json" MAKEFILE = ROOT / "Makefile" SOURCE_SHORT = "4a573dc" @@ -92,36 +87,33 @@ def test_readme_exposes_bounded_public_install_paths(self) -> None: self.assertIn(expected, record) def test_python_package_docs_keep_cli_and_pdfium_boundaries(self) -> None: - for path in (PYTHON_README, PYTHON_QUICKSTART): - text = normalized(path) - self.assertIn("python3 -m pip install ethos-pdf==0.1.1", text) - self.assertIn("caller-provided local `ethos` CLI binary", text) - self.assertIn("does not bundle", text) - self.assertIn("PDFium", text) - self.assertIn("ETHOS_PDFIUM_LIBRARY_PATH", text) + record = normalized(RECORD) - def test_public_boundary_claims_track_install_wording(self) -> None: - payload = json.loads(read(CLAIMS)) - claims = payload["surfaces"]["readme"]["claims"] + self.assertIn("python3 -m pip install ethos-pdf==0.1.1", record) + self.assertIn("caller-provided local ethos CLI binary", record) + self.assertIn("does not bundle", record) + self.assertIn("PDFium", record) + self.assertIn("ETHOS_PDFIUM_LIBRARY_PATH", record) + def test_public_boundary_claims_track_install_wording(self) -> None: + record = normalized(RECORD) for expected in ( "python3 -m pip install ethos-pdf==0.1.1", - "The Python wheel is a thin wrapper around a caller-provided local `ethos` CLI binary.", + "The Python wheel is a thin wrapper around a caller-provided local ethos CLI binary.", "It does not bundle the CLI or PDFium.", ): - self.assertIn(expected, claims) + self.assertIn(expected, record) def test_boundaries_and_public_path_hygiene(self) -> None: - for path in (RECORD, README, PYTHON_README, PYTHON_QUICKSTART): - raw = read(path) - lower = re.sub(r"\s+", " ", raw).lower() - for forbidden in FORBIDDEN: - self.assertNotIn(forbidden, lower, str(path)) - self.assertNotIn("/Users/", raw, str(path)) - self.assertNotIn("/private/tmp", raw, str(path)) - self.assertNotIn("/private/var", raw, str(path)) - self.assertNotIn("/var/folders", raw, str(path)) - self.assertNotIn("saumildiwaker", raw, str(path)) + raw = read(RECORD) + lower = re.sub(r"\s+", " ", raw).lower() + for forbidden in FORBIDDEN: + self.assertNotIn(forbidden, lower) + self.assertNotIn("/Users/", raw) + self.assertNotIn("/private/tmp", raw) + self.assertNotIn("/private/var", raw) + self.assertNotIn("/var/folders", raw) + self.assertNotIn("saumildiwaker", raw) def test_release_candidate_prep_runs_wording_guard_after_publication_closeout(self) -> None: makefile = read(MAKEFILE) diff --git a/.github/scripts/test_patch_0_1_2_crates_publication_approval_request.py b/.github/scripts/test_patch_0_1_2_crates_publication_approval_request.py index 3edcada..e2460e2 100644 --- a/.github/scripts/test_patch_0_1_2_crates_publication_approval_request.py +++ b/.github/scripts/test_patch_0_1_2_crates_publication_approval_request.py @@ -129,8 +129,10 @@ def test_status_docs_reference_request_and_keep_install_baseline_split(self) -> self.assertIn("0.1.2", text, str(path)) self.assertIn("`cargo publish`", text, str(path)) self.assertIn("remain blocked", text, str(path)) - self.assertIn("Rust crate public installation wording remains blocked", text, str(path)) - self.assertIn("Python installation remains at `ethos-pdf==0.1.1`", text, str(path)) + + record = normalized(RECORD) + self.assertIn("Rust crate public installation wording remains blocked", record) + self.assertIn("Python installation remains at `ethos-pdf==0.1.1`", record) def test_source_manifests_keep_expected_publish_surface(self) -> None: for manifest in ( diff --git a/.github/scripts/test_patch_0_1_2_crates_publication_closeout.py b/.github/scripts/test_patch_0_1_2_crates_publication_closeout.py index 3aaeda4..a40bba0 100644 --- a/.github/scripts/test_patch_0_1_2_crates_publication_closeout.py +++ b/.github/scripts/test_patch_0_1_2_crates_publication_closeout.py @@ -99,11 +99,13 @@ def test_status_docs_reference_closeout_and_keep_remaining_boundaries(self) -> N for path in (EXECUTION_STATUS, PUBLIC_RELEASE_CHECKLIST): text = normalized(path) self.assertIn(RECORD.name, text, str(path)) - self.assertIn("Rust crate public installation wording remains blocked", text, str(path)) - self.assertIn("Python installation remains at `ethos-pdf==0.1.1`", text, str(path)) self.assertIn("hosted", text.lower(), str(path)) self.assertIn("production", text.lower(), str(path)) + record = normalized(RECORD) + self.assertIn("Rust crate public installation wording remains blocked", record) + self.assertIn("Python installation remains at `ethos-pdf==0.1.1`", record) + def test_closeout_keeps_other_surfaces_blocked(self) -> None: raw = read(RECORD) record = normalized(RECORD) diff --git a/.github/scripts/test_patch_0_1_2_public_install_wording_closeout.py b/.github/scripts/test_patch_0_1_2_public_install_wording_closeout.py index 2cc5e6d..7cf01f7 100644 --- a/.github/scripts/test_patch_0_1_2_public_install_wording_closeout.py +++ b/.github/scripts/test_patch_0_1_2_public_install_wording_closeout.py @@ -19,10 +19,6 @@ ROOT = Path(__file__).resolve().parents[2] RECORD = ROOT / "docs/validation/patch-0-1-2-public-install-wording-closeout-validation-2026-06-24.md" VALIDATION_README = ROOT / "docs/validation/README.md" -PYTHON_README = ROOT / "python/README.md" -PYTHON_QUICKSTART = ROOT / "python/QUICKSTART.md" -EXECUTION_STATUS = ROOT / "docs/execution-status.md" -PUBLIC_RELEASE_CHECKLIST = ROOT / "docs/public-release-checklist.md" MAKEFILE = ROOT / "Makefile" SOURCE_SHORT = "37c294a" @@ -105,14 +101,11 @@ def test_record_exposes_bounded_npm_cli_wording_at_time_of_closeout(self) -> Non self.assertNotIn("npm install -g @docushell/ethos-pdf@0.1.1", record) self.assertNotIn("python3 -m pip install ethos-pdf==0.1.2", record) - def test_python_package_docs_remain_on_published_pypi_baseline(self) -> None: - for path in (PYTHON_README, PYTHON_QUICKSTART): - text = normalized(path) - self.assertIn(PYTHON_INSTALL, text) - self.assertNotIn("ethos-pdf==0.1.2", text) - self.assertIn("caller-provided local `ethos` CLI binary", text) - self.assertIn("does not bundle", text) - self.assertIn("ETHOS_PDFIUM_LIBRARY_PATH", text) + def test_record_preserves_python_baseline_at_time_of_closeout(self) -> None: + record = normalized(RECORD) + + self.assertIn(PYTHON_INSTALL, record) + self.assertNotIn("python3 -m pip install ethos-pdf==0.1.2", record) def test_status_docs_record_retained_rust_python_boundaries(self) -> None: for path in (RECORD,): @@ -125,16 +118,15 @@ def test_status_docs_record_retained_rust_python_boundaries(self) -> None: self.assertIn("crates.io/PyPI `0.1.2` publication closeout records", text) def test_boundaries_and_public_path_hygiene(self) -> None: - for path in (RECORD, PYTHON_README, PYTHON_QUICKSTART): - raw = read(path) - lower = re.sub(r"\s+", " ", raw).lower() - for forbidden in FORBIDDEN: - self.assertNotIn(forbidden, lower, str(path)) - self.assertNotIn("/Users/", raw, str(path)) - self.assertNotIn("/private/tmp", raw, str(path)) - self.assertNotIn("/private/var", raw, str(path)) - self.assertNotIn("/var/folders", raw, str(path)) - self.assertNotIn("saumildiwaker", raw, str(path)) + raw = read(RECORD) + lower = re.sub(r"\s+", " ", raw).lower() + for forbidden in FORBIDDEN: + self.assertNotIn(forbidden, lower) + self.assertNotIn("/Users/", raw) + self.assertNotIn("/private/tmp", raw) + self.assertNotIn("/private/var", raw) + self.assertNotIn("/var/folders", raw) + self.assertNotIn("saumildiwaker", raw) def test_release_candidate_prep_runs_wording_guard_after_0_1_2_publication_closeouts(self) -> None: makefile = read(MAKEFILE) diff --git a/.github/scripts/test_patch_0_1_2_python_public_install_wording_closeout.py b/.github/scripts/test_patch_0_1_2_python_public_install_wording_closeout.py new file mode 100644 index 0000000..0e6092d --- /dev/null +++ b/.github/scripts/test_patch_0_1_2_python_public_install_wording_closeout.py @@ -0,0 +1,161 @@ +#!/usr/bin/env python3 +# +# Copyright 2026 The Ethos maintainers +# +# Licensed under the Apache License, Version 2.0 (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] +RECORD = ROOT / "docs/validation/patch-0-1-2-python-public-install-wording-closeout-validation-2026-06-25.md" +VALIDATION_README = ROOT / "docs/validation/README.md" +README = ROOT / "README.md" +PYTHON_README = ROOT / "python/README.md" +PYTHON_QUICKSTART = ROOT / "python/QUICKSTART.md" +CLAIMS = ROOT / "docs/public-boundary-claims.json" +EXECUTION_STATUS = ROOT / "docs/execution-status.md" +PUBLIC_RELEASE_CHECKLIST = ROOT / "docs/public-release-checklist.md" +MAKEFILE = ROOT / "Makefile" + +SOURCE_SHORT = "67b499b" +SOURCE_COMMIT = "67b499bd68e1c060fb52e2b41f221c2895d16847" +SOURCE_TREE = "79e8bf0a145ee3e7bc7021c90fd0f1e1eb91880f" +PYTHON_INSTALL = "python3 -m pip install ethos-pdf==0.1.2" +OLD_PYTHON_INSTALL = "python3 -m pip install ethos-pdf==0.1.1" +CURRENT_PUBLIC_SENTENCE = ( + "Ethos is a deterministic document evidence layer for source-grounded verification and " + "citation checking across native Ethos JSON and supported foreign parser outputs. The current " + "beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, " + "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the " + "npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 " + "CLI artifacts. PDFium-backed commands use caller-provided PDFium through " + "`ETHOS_PDFIUM_LIBRARY_PATH`." +) +FORBIDDEN = ( + "production-ready", + "hosted surfaces approved", + "windows packaged artifacts approved", + "bundled pdfium approved", + "public benchmark claims approved", + "ethos-doc approved", + "ethos-rag approved", +) + + +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 normalized_public_readme() -> str: + return re.sub( + r"\s+", + " ", + " ".join(line.removeprefix("> ").strip() for line in read(README).splitlines()), + ) + + +def git(*args: str) -> str: + return subprocess.check_output( + ["git", *args], + cwd=ROOT, + encoding="utf-8", + stderr=subprocess.DEVNULL, + ).strip() + + +class Patch012PythonPublicInstallWordingCloseoutTests(unittest.TestCase): + def test_record_is_source_bound_and_indexed(self) -> None: + record = normalized(RECORD) + validation_readme = normalized(VALIDATION_README) + + self.assertIn(RECORD.name, validation_readme) + self.assertIn("patch 0.1.2 Python public install wording closeout", validation_readme) + self.assertIn(f"Validated source HEAD before this record: `{SOURCE_SHORT}`", read(RECORD)) + self.assertIn(f"Patch 0.1.2 Python public install wording closeout source commit: `{SOURCE_COMMIT}`", record) + self.assertIn(f"Patch 0.1.2 Python public install wording closeout 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_readme_and_python_docs_expose_published_python_wheel(self) -> None: + self.assertIn(CURRENT_PUBLIC_SENTENCE, normalized_public_readme()) + for path in (README, PYTHON_README, PYTHON_QUICKSTART): + text = normalized(path) + self.assertIn(PYTHON_INSTALL, text, str(path)) + self.assertNotIn(OLD_PYTHON_INSTALL, text, str(path)) + self.assertIn("ETHOS_PDFIUM_LIBRARY_PATH", text, str(path)) + for path in (PYTHON_README, PYTHON_QUICKSTART): + text = normalized(path) + self.assertIn("caller-provided local `ethos` CLI binary", text, str(path)) + self.assertIn("does not bundle", text, str(path)) + + def test_public_boundary_claims_track_current_python_install_wording(self) -> None: + payload = json.loads(read(CLAIMS)) + claims = payload["surfaces"]["readme"]["claims"] + + for expected in ( + CURRENT_PUBLIC_SENTENCE.split(". The current beta includes ")[0] + ".", + "The current beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI artifacts.", + "PDFium-backed commands use caller-provided PDFium through `ETHOS_PDFIUM_LIBRARY_PATH`.", + "cargo add ethos-doc-core@0.1.2", + "cargo add ethos-verify@0.1.2", + "cargo add ethos-pdf@0.1.2", + PYTHON_INSTALL, + "The Python wheel is a thin wrapper around a caller-provided local `ethos` CLI binary.", + "It does not bundle the CLI or PDFium.", + "npm install -g @docushell/ethos-pdf@0.1.2", + "GitHub Release `v0.1.2` also provides evaluation CLI archives for macOS arm64 and Linux x64.", + ): + self.assertIn(expected, claims) + self.assertNotIn(OLD_PYTHON_INSTALL, claims) + + def test_status_docs_record_closeout_and_retained_boundaries(self) -> None: + for path in (EXECUTION_STATUS, PUBLIC_RELEASE_CHECKLIST): + text = normalized(path) + self.assertIn(RECORD.name, text, str(path)) + self.assertIn("ethos-pdf==0.1.2", text, str(path)) + self.assertIn("hosted", text.lower(), str(path)) + self.assertIn("production", text.lower(), str(path)) + self.assertIn("Windows packaged artifacts", text, str(path)) + self.assertIn("bundled project-maintained PDFium", text, str(path)) + + def test_boundaries_and_public_path_hygiene(self) -> None: + for path in (RECORD, README, PYTHON_README, PYTHON_QUICKSTART, CLAIMS): + raw = read(path) + lower = re.sub(r"\s+", " ", raw).lower() + for forbidden in FORBIDDEN: + self.assertNotIn(forbidden, lower, str(path)) + self.assertNotIn("/Users/", raw, str(path)) + self.assertNotIn("/private/tmp", raw, str(path)) + self.assertNotIn("/private/var", raw, str(path)) + self.assertNotIn("/var/folders", raw, str(path)) + self.assertNotIn("saumildiwaker", raw, str(path)) + + def test_release_candidate_prep_runs_python_wording_after_pypi_closeout(self) -> None: + makefile = read(MAKEFILE) + pypi_closeout_guard = "$(PYTHON) .github/scripts/test_patch_0_1_2_python_publication_closeout.py" + python_wording_guard = "$(PYTHON) .github/scripts/test_patch_0_1_2_python_public_install_wording_closeout.py" + first_public_guard = "$(PYTHON) .github/scripts/test_first_public_release_artifact_evidence.py" + block = target_block("release-candidate-prep") + + self.assertIn(python_wording_guard, block) + self.assertEqual(1, makefile.count(python_wording_guard)) + self.assertLess(block.index(pypi_closeout_guard), block.index(python_wording_guard)) + self.assertLess(block.index(python_wording_guard), block.index(first_public_guard)) + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/scripts/test_patch_0_1_2_readiness_prep.py b/.github/scripts/test_patch_0_1_2_readiness_prep.py index 01bef7c..c92ca5c 100644 --- a/.github/scripts/test_patch_0_1_2_readiness_prep.py +++ b/.github/scripts/test_patch_0_1_2_readiness_prep.py @@ -118,7 +118,6 @@ def test_prep_record_uses_professional_beta_wording_without_version_drift(self) def test_package_manifests_do_not_rewrite_prep_record_boundary(self) -> None: self.assertIn("current public install baseline remains `0.1.1`", normalized(RECORD)) - self.assertNotIn("python3 -m pip install ethos-pdf==0.1.2", read(README)) def test_record_is_indexed_and_status_docs_reference_it(self) -> None: record_name = RECORD.name diff --git a/.github/scripts/test_patch_0_1_2_rust_public_install_wording_closeout.py b/.github/scripts/test_patch_0_1_2_rust_public_install_wording_closeout.py index f9cdacc..adc7b12 100644 --- a/.github/scripts/test_patch_0_1_2_rust_public_install_wording_closeout.py +++ b/.github/scripts/test_patch_0_1_2_rust_public_install_wording_closeout.py @@ -40,14 +40,15 @@ "cargo add ethos-verify@0.1.1", "cargo add ethos-pdf@0.1.1", ) -PYTHON_INSTALL = "python3 -m pip install ethos-pdf==0.1.1" +PYTHON_INSTALL = "python3 -m pip install ethos-pdf==0.1.2" +OLD_PYTHON_INSTALL = "python3 -m pip install ethos-pdf==0.1.1" NPM_INSTALL = "npm install -g @docushell/ethos-pdf@0.1.2" GITHUB_RELEASE = "GitHub Release `v0.1.2` also provides evaluation CLI archives for macOS arm64 and Linux x64." CURRENT_PUBLIC_SENTENCE = ( "Ethos is a deterministic document evidence layer for source-grounded verification and " "citation checking across native Ethos JSON and supported foreign parser outputs. The current " "beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, " - "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.1`, the " + "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the " "npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 " "CLI artifacts. PDFium-backed commands use caller-provided PDFium through " "`ETHOS_PDFIUM_LIBRARY_PATH`." @@ -109,14 +110,14 @@ def test_readme_exposes_published_rust_npm_and_cli_paths_only(self) -> None: self.assertIn(expected, readme) for old in OLD_RUST_INSTALLS: self.assertNotIn(old, readme) - self.assertNotIn("python3 -m pip install ethos-pdf==0.1.2", readme) + self.assertNotIn(OLD_PYTHON_INSTALL, readme) self.assertNotIn("npm install -g @docushell/ethos-pdf@0.1.1", readme) def test_python_package_docs_remain_on_published_pypi_baseline(self) -> None: for path in (PYTHON_README, PYTHON_QUICKSTART): text = normalized(path) self.assertIn(PYTHON_INSTALL, text) - self.assertNotIn("ethos-pdf==0.1.2", text) + self.assertNotIn(OLD_PYTHON_INSTALL, text) self.assertIn("caller-provided local `ethos` CLI binary", text) self.assertIn("does not bundle", text) self.assertIn("ETHOS_PDFIUM_LIBRARY_PATH", text) @@ -127,7 +128,7 @@ def test_public_boundary_claims_track_current_install_wording(self) -> None: for expected in ( "Ethos is a deterministic document evidence layer for source-grounded verification and citation checking across native Ethos JSON and supported foreign parser outputs.", - "The current beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.1`, the npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI artifacts.", + "The current beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI artifacts.", "PDFium-backed commands use caller-provided PDFium through `ETHOS_PDFIUM_LIBRARY_PATH`.", *RUST_INSTALLS, PYTHON_INSTALL, @@ -145,7 +146,7 @@ def test_status_docs_record_retained_python_and_surface_boundaries(self) -> None self.assertIn(RECORD.name, text, str(path)) self.assertIn("ethos-doc-core", text, str(path)) self.assertIn("0.1.2", text, str(path)) - self.assertIn("ethos-pdf==0.1.1", text, str(path)) + self.assertIn("ethos-pdf==0.1.2", text, str(path)) self.assertIn("PyPI", text, str(path)) self.assertIn("hosted", text.lower(), str(path)) self.assertIn("production", text.lower(), str(path)) diff --git a/.github/scripts/test_patch_0_1_2_version_activation.py b/.github/scripts/test_patch_0_1_2_version_activation.py index 9b1edf3..b1c96d5 100644 --- a/.github/scripts/test_patch_0_1_2_version_activation.py +++ b/.github/scripts/test_patch_0_1_2_version_activation.py @@ -85,13 +85,10 @@ def test_rust_and_python_versions_are_activated(self) -> None: def test_version_activation_record_delays_public_install_wording(self) -> None: npm = json.loads(read(NPM_PACKAGE)) record = normalized(RECORD) - readme = read(README) self.assertEqual("0.1.2", npm["version"]) self.assertIn("current public install baseline remains `0.1.1`", record) self.assertIn("does not approve public installation wording for `0.1.2`", record) - self.assertIn("python3 -m pip install ethos-pdf==0.1.1", readme) - self.assertNotIn("python3 -m pip install ethos-pdf==0.1.2", readme) def test_boundaries_remain_closed(self) -> None: record = normalized(RECORD) diff --git a/.github/scripts/test_public_prealpha_wording_approval.py b/.github/scripts/test_public_prealpha_wording_approval.py index 2949bf8..dc637e6 100644 --- a/.github/scripts/test_public_prealpha_wording_approval.py +++ b/.github/scripts/test_public_prealpha_wording_approval.py @@ -40,7 +40,7 @@ "Ethos is a deterministic document evidence layer for source-grounded verification and " "citation checking across native Ethos JSON and supported foreign parser outputs. The current " "beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, " - "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.1`, the " + "`ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the " "npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 " "CLI artifacts. PDFium-backed commands use caller-provided PDFium through " "`ETHOS_PDFIUM_LIBRARY_PATH`." diff --git a/.github/scripts/test_release_candidate_prep.py b/.github/scripts/test_release_candidate_prep.py index b3f613d..aed28c2 100644 --- a/.github/scripts/test_release_candidate_prep.py +++ b/.github/scripts/test_release_candidate_prep.py @@ -76,6 +76,7 @@ "$(PYTHON) .github/scripts/test_patch_0_1_2_python_publication_approval_request.py", "$(PYTHON) .github/scripts/test_patch_0_1_2_python_publication_approval_decision.py", "$(PYTHON) .github/scripts/test_patch_0_1_2_python_publication_closeout.py", + "$(PYTHON) .github/scripts/test_patch_0_1_2_python_public_install_wording_closeout.py", "$(PYTHON) .github/scripts/test_first_public_release_artifact_evidence.py", "$(PYTHON) .github/scripts/test_first_public_release_final_decider.py", "$(PYTHON) .github/scripts/test_first_public_release_linux_x64_artifact_evidence.py", diff --git a/CHANGELOG.md b/CHANGELOG.md index 04d6ecb..c6956a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- boundary-exception: close patch `0.1.2` Python public install wording for published PyPI wheel `ethos-pdf==0.1.2` while keeping package tag creation, hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` surfaces blocked. - boundary-exception: close patch `0.1.2` Python PyPI publication with exact registry evidence for `ethos-pdf==0.1.2` while keeping Python public install wording, package tag creation, hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` surfaces blocked. - boundary-exception: record decider approval for bounded later deterministic patch `0.1.2` Python PyPI wheel publication while keeping actual upload, Python public install wording, package tag creation, hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` surfaces blocked. - boundary-exception: request decider review for exact deterministic patch `0.1.2` Python PyPI wheel publication while keeping PyPI upload, Python public install wording, hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` surfaces blocked. diff --git a/Makefile b/Makefile index 03156f0..b5d2549 100644 --- a/Makefile +++ b/Makefile @@ -327,6 +327,7 @@ release-candidate-prep: $(PYTHON) .github/scripts/test_patch_0_1_2_python_publication_approval_request.py $(PYTHON) .github/scripts/test_patch_0_1_2_python_publication_approval_decision.py $(PYTHON) .github/scripts/test_patch_0_1_2_python_publication_closeout.py + $(PYTHON) .github/scripts/test_patch_0_1_2_python_public_install_wording_closeout.py $(PYTHON) .github/scripts/test_first_public_release_artifact_evidence.py $(PYTHON) .github/scripts/test_first_public_release_final_decider.py $(PYTHON) .github/scripts/test_first_public_release_linux_x64_artifact_evidence.py diff --git a/README.md b/README.md index 415a9e9..b61940f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ > Ethos is a deterministic document evidence layer for source-grounded verification and > citation checking across native Ethos JSON and supported foreign parser outputs. The current > beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, -> `ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.1`, the npm +> `ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the npm > `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI > artifacts. PDFium-backed commands use caller-provided PDFium through > `ETHOS_PDFIUM_LIBRARY_PATH`. @@ -130,7 +130,7 @@ cargo add ethos-pdf@0.1.2 To install the Python wrapper from PyPI: ```bash -python3 -m pip install ethos-pdf==0.1.1 +python3 -m pip install ethos-pdf==0.1.2 ``` The Python wheel is a thin wrapper around a caller-provided local `ethos` CLI binary. It does not diff --git a/docs/execution-status.md b/docs/execution-status.md index 30035d0..0dd801a 100644 --- a/docs/execution-status.md +++ b/docs/execution-status.md @@ -2,7 +2,7 @@ Date: 2026-06-24 Owner: product / decider -Status: Public beta evaluation is approved for the GitHub source repository; the three bounded Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`; the Python `ethos-pdf` wheel at `0.1.1`; the npm `@docushell/ethos-pdf` CLI package at `0.1.2`; and the GitHub Release `v0.1.2` macOS arm64 and Linux x64 CLI artifacts. Internal Milestone D source-only closeout remains complete, with Milestone E prep source-only closeout recorded for the internal prep boundary. Week 0 governance is accepted, WS-ENGINE Phase 1 has a real narrow PDFium path, WS-VERIFY-ALPHA has real deterministic evidence checks over native Ethos JSON and pinned OpenDataLoader output, WS-HARNESS has fail-closed readiness scaffolding, the Gate Zero corpus/hardware manifest and direct competitor lock are frozen/signed, ADR-0005 records an accepted `PROCEED` decision for internal Milestone B continuation, ADR-0006 closes package identifier/trademark validation, ADR-0007 locks the product direction, and patch `0.1.1` plus patch `0.1.2` publication/install wording closeouts are recorded for the approved evaluation surfaces. The exact current public sentence approved for source, Rust crate, Python wheel, npm package, macOS arm64 CLI artifact, and Linux x64 CLI artifact evaluation surfaces is: "Ethos is a deterministic document evidence layer for source-grounded verification and citation checking across native Ethos JSON and supported foreign parser outputs. The current beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.1`, the npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI artifacts. PDFium-backed commands use caller-provided PDFium through `ETHOS_PDFIUM_LIBRARY_PATH`." Milestone C has a source-tree internal artifact-validation closeout for the RAG chunk and security-report trust-loop checks. Milestone D has a source-tree internal source-only closeout recorded in `docs/validation/milestone-d-final-closeout-validation-2026-06-19.md`; the narrow `verify_citations` v1 contract in `docs/milestone-d-verify-citations-contract.md` remains carried by the existing `ethos verify` path and fixture-backed validation. The D `crop_element` v1 contract in `docs/milestone-d-crop-element-contract.md` is carried by the source-bound `ethos crop_element` CLI command plus existing `ethos verify --crop-dir` evidence artifacts; `ethos-core::crop_element` validates request identity, resolves one native document element, and emits descriptor/rendered crop metadata for that source-only contract when caller-provided source PDF bytes are bound. The `sandbox_subprocess` v1 contract in `docs/milestone-d-sandbox-subprocess-contract.md` classifies existing PDF worker-process timeout, memory-limit, stable-error, and diagnostics-gated stderr behavior without adding hardened sandbox rules. The first Milestone E prep boundary is recorded in `docs/milestone-e-prep-scope.md`, the internal fixture-candidate inventory is recorded in `docs/milestone-e-fixture-candidates.json`, internal fixture-promotion criteria are recorded in `docs/milestone-e-fixture-promotion-criteria.json`, the internal trust-loop walkthrough plan is recorded in `docs/milestone-e-internal-trust-loop-walkthrough.json`, the internal trust-loop use protocol is recorded in `docs/milestone-e-internal-trust-loop-use-protocol.json`, the internal trust-loop rehearsal/evidence matrix is recorded in `docs/milestone-e-internal-trust-loop-rehearsal-evidence-matrix.json`, and the internal trust-loop blocker ledger is recorded in `docs/milestone-e-internal-trust-loop-blocker-ledger.json`; these E prep JSON artifacts are schema-validated by `schemas/validate_examples.py` and only identify tracked trust-loop fixture candidates, internal promotion criteria, internal walkthrough sequencing, source-checkout rules for internal use, internal evidence-lane rehearsal planning, blocked-output alignment, evidence-lane alignment, diagnostic-boundary alignment, promotion-status alignment at `not_promoted_beyond_internal_fixture_planning`, source-status alignment at `source-only-pre-alpha-internal-milestone-e-prep`, applies-to binding alignment across current E source artifacts, required-before alignment for current readiness gates including `make milestone-e-prep remains green`, validation-record source-head alignment for each `Validated source HEAD before this record` line, and explicit blocker tracking that does not resolve or soften blockers. The Milestone E prep source-only closeout is recorded in `docs/validation/milestone-e-final-closeout-validation-2026-06-20.md` and does not resolve or soften blockers outside the approved public beta evaluation surfaces. Hosted surfaces, production positioning, Windows packaged artifacts, bundled project-maintained PDFium builds, `ethos-doc`, `ethos-rag`, public benchmark reports, public benchmark claims, and all speed/footprint/parser-quality/table-quality/production claims remain blocked. The controlled-run handoff remains `docs/gate-zero-evidence-runbook.md`; the accepted decision record is `docs/decisions/ADR-0005-gate-zero-decision.md`. +Status: Public beta evaluation is approved for the GitHub source repository; the three bounded Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`; the Python `ethos-pdf` wheel at `0.1.2`; the npm `@docushell/ethos-pdf` CLI package at `0.1.2`; and the GitHub Release `v0.1.2` macOS arm64 and Linux x64 CLI artifacts. Internal Milestone D source-only closeout remains complete, with Milestone E prep source-only closeout recorded for the internal prep boundary. Week 0 governance is accepted, WS-ENGINE Phase 1 has a real narrow PDFium path, WS-VERIFY-ALPHA has real deterministic evidence checks over native Ethos JSON and pinned OpenDataLoader output, WS-HARNESS has fail-closed readiness scaffolding, the Gate Zero corpus/hardware manifest and direct competitor lock are frozen/signed, ADR-0005 records an accepted `PROCEED` decision for internal Milestone B continuation, ADR-0006 closes package identifier/trademark validation, ADR-0007 locks the product direction, and patch `0.1.1` plus patch `0.1.2` publication/install wording closeouts are recorded for the approved evaluation surfaces. The exact current public sentence approved for source, Rust crate, Python wheel, npm package, macOS arm64 CLI artifact, and Linux x64 CLI artifact evaluation surfaces is: "Ethos is a deterministic document evidence layer for source-grounded verification and citation checking across native Ethos JSON and supported foreign parser outputs. The current beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI artifacts. PDFium-backed commands use caller-provided PDFium through `ETHOS_PDFIUM_LIBRARY_PATH`." Milestone C has a source-tree internal artifact-validation closeout for the RAG chunk and security-report trust-loop checks. Milestone D has a source-tree internal source-only closeout recorded in `docs/validation/milestone-d-final-closeout-validation-2026-06-19.md`; the narrow `verify_citations` v1 contract in `docs/milestone-d-verify-citations-contract.md` remains carried by the existing `ethos verify` path and fixture-backed validation. The D `crop_element` v1 contract in `docs/milestone-d-crop-element-contract.md` is carried by the source-bound `ethos crop_element` CLI command plus existing `ethos verify --crop-dir` evidence artifacts; `ethos-core::crop_element` validates request identity, resolves one native document element, and emits descriptor/rendered crop metadata for that source-only contract when caller-provided source PDF bytes are bound. The `sandbox_subprocess` v1 contract in `docs/milestone-d-sandbox-subprocess-contract.md` classifies existing PDF worker-process timeout, memory-limit, stable-error, and diagnostics-gated stderr behavior without adding hardened sandbox rules. The first Milestone E prep boundary is recorded in `docs/milestone-e-prep-scope.md`, the internal fixture-candidate inventory is recorded in `docs/milestone-e-fixture-candidates.json`, internal fixture-promotion criteria are recorded in `docs/milestone-e-fixture-promotion-criteria.json`, the internal trust-loop walkthrough plan is recorded in `docs/milestone-e-internal-trust-loop-walkthrough.json`, the internal trust-loop use protocol is recorded in `docs/milestone-e-internal-trust-loop-use-protocol.json`, the internal trust-loop rehearsal/evidence matrix is recorded in `docs/milestone-e-internal-trust-loop-rehearsal-evidence-matrix.json`, and the internal trust-loop blocker ledger is recorded in `docs/milestone-e-internal-trust-loop-blocker-ledger.json`; these E prep JSON artifacts are schema-validated by `schemas/validate_examples.py` and only identify tracked trust-loop fixture candidates, internal promotion criteria, internal walkthrough sequencing, source-checkout rules for internal use, internal evidence-lane rehearsal planning, blocked-output alignment, evidence-lane alignment, diagnostic-boundary alignment, promotion-status alignment at `not_promoted_beyond_internal_fixture_planning`, source-status alignment at `source-only-pre-alpha-internal-milestone-e-prep`, applies-to binding alignment across current E source artifacts, required-before alignment for current readiness gates including `make milestone-e-prep remains green`, validation-record source-head alignment for each `Validated source HEAD before this record` line, and explicit blocker tracking that does not resolve or soften blockers. The Milestone E prep source-only closeout is recorded in `docs/validation/milestone-e-final-closeout-validation-2026-06-20.md` and does not resolve or soften blockers outside the approved public beta evaluation surfaces. Hosted surfaces, production positioning, Windows packaged artifacts, bundled project-maintained PDFium builds, `ethos-doc`, `ethos-rag`, public benchmark reports, public benchmark claims, and all speed/footprint/parser-quality/table-quality/production claims remain blocked. The controlled-run handoff remains `docs/gate-zero-evidence-runbook.md`; the accepted decision record is `docs/decisions/ADR-0005-gate-zero-decision.md`. Older Milestone E paragraphs below preserve historical review records and their blockers at the time they were written. Patch `0.1.1` closeout records supersede those historical blockers only for the approved source, Rust crate, Python wheel, npm package, macOS arm64 CLI artifact, and Linux x64 CLI artifact evaluation surfaces. @@ -97,6 +97,13 @@ availability closeout, package tag creation remains blocked, and hosted surfaces positioning, Windows packaged artifacts, bundled project-maintained PDFium builds, `ethos-doc`, `ethos-rag`, and public benchmark claims remain blocked. +Patch `0.1.2` Python public install wording closeout is recorded in +`docs/validation/patch-0-1-2-python-public-install-wording-closeout-validation-2026-06-25.md`. +The public README, Python package docs, and public boundary inventory now point Python installation +to `ethos-pdf==0.1.2`. Package tag creation remains blocked, and hosted surfaces, production +positioning, Windows packaged artifacts, bundled project-maintained PDFium builds, `ethos-doc`, +`ethos-rag`, and public benchmark claims remain blocked. + Public approval lane blocker prep is recorded in `docs/milestone-e-public-approval-lane-blockers.json` and schema-bound by `schemas/ethos-milestone-e-public-approval-lane-blockers.schema.json`. This public approval lane @@ -393,4 +400,4 @@ The patch `0.1.2` npm vendor refresh in `docs/validation/patch-0-1-2-npm-vendor- ## PM Rule -Public language may use this exact approved sentence on the current source, Rust crate, Python wheel, npm package, macOS arm64 CLI artifact, and Linux x64 CLI artifact evaluation surfaces: "Ethos is a deterministic document evidence layer for source-grounded verification and citation checking across native Ethos JSON and supported foreign parser outputs. The current beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.1`, the npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI artifacts. PDFium-backed commands use caller-provided PDFium through `ETHOS_PDFIUM_LIBRARY_PATH`." All wording beyond that sentence still requires claim-audit and decider review for the exact surface. Do not describe Ethos as having public benchmark validation, production readiness, broad parser completeness, speed, footprint, parser-quality, or table-quality claims. Hosted surfaces, Windows packaged artifacts, bundled project-maintained PDFium builds, `ethos-doc`, and `ethos-rag` remain blocked. Internal parser work should proceed only when it supports accepted evidence paths or the trust layer; the product-differentiating path remains verification and grounding first, with parser expansion serving that path. +Public language may use this exact approved sentence on the current source, Rust crate, Python wheel, npm package, macOS arm64 CLI artifact, and Linux x64 CLI artifact evaluation surfaces: "Ethos is a deterministic document evidence layer for source-grounded verification and citation checking across native Ethos JSON and supported foreign parser outputs. The current beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI artifacts. PDFium-backed commands use caller-provided PDFium through `ETHOS_PDFIUM_LIBRARY_PATH`." All wording beyond that sentence still requires claim-audit and decider review for the exact surface. Do not describe Ethos as having public benchmark validation, production readiness, broad parser completeness, speed, footprint, parser-quality, or table-quality claims. Hosted surfaces, Windows packaged artifacts, bundled project-maintained PDFium builds, `ethos-doc`, and `ethos-rag` remain blocked. Internal parser work should proceed only when it supports accepted evidence paths or the trust layer; the product-differentiating path remains verification and grounding first, with parser expansion serving that path. diff --git a/docs/public-boundary-claims.json b/docs/public-boundary-claims.json index 702bf08..070736c 100644 --- a/docs/public-boundary-claims.json +++ b/docs/public-boundary-claims.json @@ -5,13 +5,13 @@ "path": "README.md", "claims": [ "Ethos is a deterministic document evidence layer for source-grounded verification and citation checking across native Ethos JSON and supported foreign parser outputs.", - "The current beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.1`, the npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI artifacts.", + "The current beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI artifacts.", "PDFium-backed commands use caller-provided PDFium through `ETHOS_PDFIUM_LIBRARY_PATH`.", "PDFium-backed commands require caller-provided PDFium through `ETHOS_PDFIUM_LIBRARY_PATH`.", "cargo add ethos-doc-core@0.1.2", "cargo add ethos-verify@0.1.2", "cargo add ethos-pdf@0.1.2", - "python3 -m pip install ethos-pdf==0.1.1", + "python3 -m pip install ethos-pdf==0.1.2", "The Python wheel is a thin wrapper around a caller-provided local `ethos` CLI binary.", "It does not bundle the CLI or PDFium.", "The npm package vendors only the approved macOS arm64 and Linux x64 CLI binaries.", diff --git a/docs/public-release-checklist.md b/docs/public-release-checklist.md index 5589656..b3adbb4 100644 --- a/docs/public-release-checklist.md +++ b/docs/public-release-checklist.md @@ -177,6 +177,14 @@ Windows packaged artifacts remain blocked, bundled project-maintained PDFium bui `ethos-doc` remains blocked, `ethos-rag` remains blocked, and public benchmark claims remain blocked. +Patch `0.1.2` Python public install wording closeout is recorded in +`docs/validation/patch-0-1-2-python-public-install-wording-closeout-validation-2026-06-25.md`. +README, Python package docs, and claim-inventory wording now point Python installation to +`ethos-pdf==0.1.2`. Package tag creation remains blocked, hosted surfaces remain blocked, +production positioning remains blocked, Windows packaged artifacts remain blocked, bundled +project-maintained PDFium builds remain blocked, `ethos-doc` remains blocked, `ethos-rag` remains +blocked, and public benchmark claims remain blocked. + ## Required Before Public Push - Package-name and trademark decision is closed by accepted ADR-0006 in diff --git a/docs/validation/README.md b/docs/validation/README.md index 6f16e15..d3938cf 100644 --- a/docs/validation/README.md +++ b/docs/validation/README.md @@ -755,6 +755,11 @@ recording the exact current-main source candidate and required follow-up evidenc installation wording, package tag creation, hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` surfaces remain blocked until separate closeout or approval records pass. +- `patch-0-1-2-python-public-install-wording-closeout-validation-2026-06-25.md` - patch 0.1.2 + Python public install wording closeout validation records README, Python package docs, and + public claim-inventory wording for `ethos-pdf==0.1.2`; package tag creation, hosted, + production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` surfaces remain + blocked until separate closeout or approval records pass. - `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/patch-0-1-2-python-public-install-wording-closeout-validation-2026-06-25.md b/docs/validation/patch-0-1-2-python-public-install-wording-closeout-validation-2026-06-25.md new file mode 100644 index 0000000..ce70bcb --- /dev/null +++ b/docs/validation/patch-0-1-2-python-public-install-wording-closeout-validation-2026-06-25.md @@ -0,0 +1,77 @@ +# Patch 0.1.2 Python Public Install Wording Closeout Validation - 2026-06-25 + +Validated source HEAD before this record: `67b499b`. + +Patch 0.1.2 Python public install wording closeout source commit: +`67b499bd68e1c060fb52e2b41f221c2895d16847`. + +Patch 0.1.2 Python public install wording closeout source tree: +`79e8bf0a145ee3e7bc7021c90fd0f1e1eb91880f`. + +Status: **patch 0.1.2 Python public install wording recorded** + +This record closes only the bounded patch `0.1.2` Python public install wording lane after PyPI +publication closeout for `ethos-pdf==0.1.2`. It updates public README, Python package docs, and +public claim-inventory wording for the published Python wheel. It does not approve package tag +creation, hosted surfaces, production positioning, Windows packaged artifacts, bundled +project-maintained PDFium builds, `ethos-doc`, `ethos-rag`, public benchmark reports, public +benchmark claims, or broader public wording. + +## Public Install Wording + +Python package installation now points to the published `0.1.2` PyPI wheel: + +```sh +python3 -m pip install ethos-pdf==0.1.2 +``` + +The current public README sentence is: + +```text +Ethos is a deterministic document evidence layer for source-grounded verification and citation checking across native Ethos JSON and supported foreign parser outputs. The current beta includes the GitHub source repository, Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`, the Python `ethos-pdf` wheel at `0.1.2`, the npm `@docushell/ethos-pdf@0.1.2` package, and GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI artifacts. PDFium-backed commands use caller-provided PDFium through `ETHOS_PDFIUM_LIBRARY_PATH`. +``` + +## Published Surface Binding + +- PyPI closeout record: + `docs/validation/patch-0-1-2-python-publication-closeout-validation-2026-06-25.md` +- Exact package: `ethos-pdf==0.1.2` +- Exact wheel: `ethos_pdf-0.1.2-py3-none-any.whl` +- Exact wheel SHA256: + `6f17240954f1257ece3c762c820ad771ccb114353bfb699fe87f418a5ceb663c` +- Python docs remain explicit that the package is a thin wrapper around a caller-provided local + `ethos` CLI binary and does not bundle the CLI or PDFium. +- PDFium remains caller-provided through `ETHOS_PDFIUM_LIBRARY_PATH`. + +## Retained Blockers + +- Package tag creation remains blocked until a separate explicit approval or closeout record permits it. +- Hosted surfaces remain blocked. +- Production positioning remains blocked. +- Public benchmark reports remain blocked. +- Public benchmark claims remain blocked. +- Windows packaged artifacts remain blocked. +- Bundled project-maintained PDFium builds remain blocked. +- `ethos-doc` remains blocked. +- `ethos-rag` remains blocked. +- PDFium remains caller-provided through `ETHOS_PDFIUM_LIBRARY_PATH`. + +## Commands + +```sh +python3 .github/scripts/test_patch_0_1_2_python_public_install_wording_closeout.py +python3 .github/scripts/test_patch_0_1_2_python_publication_closeout.py +python3 .github/scripts/test_public_prealpha_wording_approval.py +python3 .github/scripts/test_execution_status.py +python3 .github/scripts/public_boundary_claims_gate.py +make release-candidate-prep PYTHON=python3 +git diff --check +``` + +## Result + +```text +patch 0.1.2 Python public install wording closeout recorded +Public README, Python package docs, and public claim inventory now point Python install wording to ethos-pdf==0.1.2 +Remaining blocked surfaces stay blocked +``` diff --git a/python/QUICKSTART.md b/python/QUICKSTART.md index 42fb89d..a0944f7 100644 --- a/python/QUICKSTART.md +++ b/python/QUICKSTART.md @@ -6,7 +6,7 @@ It does not bundle Ethos or PDFium. Install the published evaluation wheel from PyPI with: ```sh -python3 -m pip install ethos-pdf==0.1.1 +python3 -m pip install ethos-pdf==0.1.2 ``` ## PDFium Setup diff --git a/python/README.md b/python/README.md index a653e5a..e055ead 100644 --- a/python/README.md +++ b/python/README.md @@ -5,7 +5,7 @@ This directory contains the `ethos-pdf` Python package source for Ethos. Install the published evaluation wheel from PyPI with: ```sh -python3 -m pip install ethos-pdf==0.1.1 +python3 -m pip install ethos-pdf==0.1.2 ``` The package exposes a public semver API beginning at `0.1.0` for Python `>=3.8`. Patch releases