From 5c5d589f0db6535492c1dae12da963574c7e580a Mon Sep 17 00:00:00 2001 From: docushell-admin Date: Wed, 24 Jun 2026 12:00:04 +0530 Subject: [PATCH] Close patch 0.1.1 public install wording Signed-off-by: docushell-admin --- ...h_0_1_1_public_install_wording_closeout.py | 137 ++++++++++++++++++ .../scripts/test_release_candidate_prep.py | 1 + CHANGELOG.md | 1 + Makefile | 1 + README.md | 10 ++ docs/public-boundary-claims.json | 4 + docs/validation/README.md | 4 + ...-wording-closeout-validation-2026-06-24.md | 95 ++++++++++++ python/QUICKSTART.md | 6 + python/README.md | 6 + 10 files changed, 265 insertions(+) create mode 100644 .github/scripts/test_patch_0_1_1_public_install_wording_closeout.py create mode 100644 docs/validation/patch-0-1-1-public-install-wording-closeout-validation-2026-06-24.md 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 new file mode 100644 index 0000000..dd4464a --- /dev/null +++ b/.github/scripts/test_patch_0_1_1_public_install_wording_closeout.py @@ -0,0 +1,137 @@ +#!/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-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" +SOURCE_COMMIT = "4a573dc96175cf10b90b8e6928e2c2408cb763e3" +SOURCE_TREE = "71c874291b17d92d641470f01d2dedaf8a48d8ea" +PYPI_PACKAGE = "ethos-pdf==0.1.1" +NPM_PACKAGE = "@docushell/ethos-pdf@0.1.1" +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 git(*args: str) -> str: + return subprocess.check_output( + ["git", *args], + cwd=ROOT, + encoding="utf-8", + stderr=subprocess.DEVNULL, + ).strip() + + +class Patch011PublicInstallWordingCloseoutTests(unittest.TestCase): + def test_record_is_source_bound_and_indexed(self) -> None: + record = normalized(RECORD) + readme = normalized(VALIDATION_README) + + self.assertIn(RECORD.name, readme) + self.assertIn("patch 0.1.1 public installation wording closeout", readme) + self.assertIn(f"Validated source HEAD before this record: `{SOURCE_SHORT}`", read(RECORD)) + self.assertIn(f"Patch 0.1.1 public install wording closeout source commit: `{SOURCE_COMMIT}`", record) + self.assertIn(f"Patch 0.1.1 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_exposes_bounded_public_install_paths(self) -> None: + readme = normalized(README) + + for expected in ( + "cargo add ethos-doc-core@0.1.1", + "cargo add ethos-verify@0.1.1", + "cargo add ethos-pdf@0.1.1", + "python3 -m pip install ethos-pdf==0.1.1", + "npm install -g @docushell/ethos-pdf@0.1.1", + "GitHub Release `v0.1.1` also provides evaluation CLI archives for macOS arm64 and Linux x64.", + "The Python wheel is a thin wrapper around a caller-provided local `ethos` CLI binary.", + "It does not bundle the CLI or PDFium.", + "`ETHOS_PDFIUM_LIBRARY_PATH`", + ): + self.assertIn(expected, readme) + + 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) + + def test_public_boundary_claims_track_install_wording(self) -> None: + payload = json.loads(read(CLAIMS)) + claims = payload["surfaces"]["readme"]["claims"] + + 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.", + "It does not bundle the CLI or PDFium.", + "npm install -g @docushell/ethos-pdf@0.1.1", + ): + self.assertIn(expected, claims) + + 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)) + + def test_release_candidate_prep_runs_wording_guard_after_publication_closeout(self) -> None: + makefile = read(MAKEFILE) + closeout_guard = "$(PYTHON) .github/scripts/test_patch_0_1_1_python_publication_closeout.py" + wording_guard = "$(PYTHON) .github/scripts/test_patch_0_1_1_public_install_wording_closeout.py" + npm_guard = "$(PYTHON) .github/scripts/test_npm_binary_package_scaffold.py" + block = target_block("release-candidate-prep") + + self.assertIn(wording_guard, block) + self.assertEqual(1, makefile.count(wording_guard)) + self.assertLess(block.index(closeout_guard), block.index(wording_guard)) + self.assertLess(block.index(wording_guard), block.index(npm_guard)) + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/scripts/test_release_candidate_prep.py b/.github/scripts/test_release_candidate_prep.py index 657303d..614727b 100644 --- a/.github/scripts/test_release_candidate_prep.py +++ b/.github/scripts/test_release_candidate_prep.py @@ -36,6 +36,7 @@ "$(PYTHON) .github/scripts/test_patch_0_1_1_python_deterministic_wheel_approval_request.py", "$(PYTHON) .github/scripts/test_patch_0_1_1_python_deterministic_wheel_approval_decision.py", "$(PYTHON) .github/scripts/test_patch_0_1_1_python_publication_closeout.py", + "$(PYTHON) .github/scripts/test_patch_0_1_1_public_install_wording_closeout.py", "$(PYTHON) .github/scripts/test_npm_binary_package_scaffold.py", "npm test --prefix packages/npm/ethos-pdf", "$(PYTHON) .github/scripts/test_npm_vendor_binary_payload_strategy.py", diff --git a/CHANGELOG.md b/CHANGELOG.md index e2e47d4..c0cc6c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- boundary-exception: document bounded patch `0.1.1` public install paths for published evaluation surfaces while retaining hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` blockers. - boundary-exception: close patch `0.1.1` Python PyPI publication with exact registry evidence; no public install wording, hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, or `ethos-rag` boundary change. - boundary-exception: approve exact patch `0.1.1` deterministic Python PyPI wheel publication decision for later operator upload; no PyPI upload or support-boundary change. - boundary-exception: request exact patch `0.1.1` deterministic Python PyPI wheel approval for decider review; no PyPI upload or support-boundary change. diff --git a/Makefile b/Makefile index 12c5432..d8f98b6 100644 --- a/Makefile +++ b/Makefile @@ -278,6 +278,7 @@ release-candidate-prep: $(PYTHON) .github/scripts/test_patch_0_1_1_python_deterministic_wheel_approval_request.py $(PYTHON) .github/scripts/test_patch_0_1_1_python_deterministic_wheel_approval_decision.py $(PYTHON) .github/scripts/test_patch_0_1_1_python_publication_closeout.py + $(PYTHON) .github/scripts/test_patch_0_1_1_public_install_wording_closeout.py $(PYTHON) .github/scripts/test_npm_binary_package_scaffold.py npm test --prefix packages/npm/ethos-pdf $(PYTHON) .github/scripts/test_npm_vendor_binary_payload_strategy.py diff --git a/README.md b/README.md index f1ebe15..5eaaba7 100644 --- a/README.md +++ b/README.md @@ -130,6 +130,16 @@ cargo add ethos-verify@0.1.1 cargo add ethos-pdf@0.1.1 ``` +To install the Python wrapper from PyPI: + +```bash +python3 -m pip install ethos-pdf==0.1.1 +``` + +The Python wheel is a thin wrapper around a caller-provided local `ethos` CLI binary. It does not +bundle the CLI or PDFium. Install or provide `ethos` separately, and keep +`ETHOS_PDFIUM_LIBRARY_PATH` set for PDFium-backed commands. + To install the npm CLI package on a supported first-release platform: ```bash diff --git a/docs/public-boundary-claims.json b/docs/public-boundary-claims.json index e4756a1..ded4e93 100644 --- a/docs/public-boundary-claims.json +++ b/docs/public-boundary-claims.json @@ -8,7 +8,11 @@ "The Python `ethos-pdf` wheel, npm `@docushell/ethos-pdf@0.1.1` package, and macOS arm64/Linux x64 CLI artifacts are available for evaluation with caller-provided PDFium.", "Hosted surfaces, production positioning, Windows packaged artifacts, bundled project-maintained PDFium builds, `ethos-doc`, `ethos-rag`, public benchmark reports, public benchmark claims, and speed, footprint, parser-quality, table-quality, or production claims remain blocked.", "PDFium-backed commands require caller-provided PDFium through `ETHOS_PDFIUM_LIBRARY_PATH`.", + "python3 -m pip install ethos-pdf==0.1.1", + "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.", + "npm install -g @docushell/ethos-pdf@0.1.1", "Unsupported platforms fail before invoking a binary.", "GitHub Release `v0.1.1` also provides evaluation CLI archives for macOS arm64 and Linux x64." ] diff --git a/docs/validation/README.md b/docs/validation/README.md index edd836b..ffe044e 100644 --- a/docs/validation/README.md +++ b/docs/validation/README.md @@ -640,6 +640,10 @@ recording the exact current-main source candidate and required follow-up evidenc Python PyPI publication closeout validation records successful publication of the exact deterministic `ethos-pdf==0.1.1` wheel and live PyPI registry verification while keeping public installation wording in a separate bounded docs lane. +- `patch-0-1-1-public-install-wording-closeout-validation-2026-06-24.md` - patch 0.1.1 + public installation wording closeout validation documents published evaluation install paths for + Rust crates, the Python wheel, npm package, and GitHub Release CLI artifacts while retaining + hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` blockers. - `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-1-public-install-wording-closeout-validation-2026-06-24.md b/docs/validation/patch-0-1-1-public-install-wording-closeout-validation-2026-06-24.md new file mode 100644 index 0000000..2318998 --- /dev/null +++ b/docs/validation/patch-0-1-1-public-install-wording-closeout-validation-2026-06-24.md @@ -0,0 +1,95 @@ +# Patch 0.1.1 Public Installation Wording Closeout Validation - 2026-06-24 + +Validated source HEAD before this record: `4a573dc`. + +Patch 0.1.1 public install wording closeout source commit: +`4a573dc96175cf10b90b8e6928e2c2408cb763e3`. + +Patch 0.1.1 public install wording closeout source tree: +`71c874291b17d92d641470f01d2dedaf8a48d8ea`. + +Status: **patch 0.1.1 public installation wording recorded for published evaluation surfaces** + +This record closes the bounded patch `0.1.1` public installation wording lane after CLI artifact, +Rust crates.io, npm, and Python PyPI publication closeout records were merged. It updates install +wording for the already-published evaluation surfaces only. It does not approve hosted surfaces, +production positioning, Windows packaged artifacts, bundled project-maintained PDFium builds, +`ethos-doc`, `ethos-rag`, public benchmark reports, public benchmark claims, speed claims, +footprint claims, parser-quality claims, table-quality claims, or production claims. + +## Approved Install Wording + +README install wording now includes: + +```text +cargo add ethos-doc-core@0.1.1 +cargo add ethos-verify@0.1.1 +cargo add ethos-pdf@0.1.1 +python3 -m pip install ethos-pdf==0.1.1 +npm install -g @docushell/ethos-pdf@0.1.1 +GitHub Release v0.1.1 evaluation CLI archives for macOS arm64 and Linux x64 +``` + +The Python wording is explicitly bounded: + +```text +The Python wheel is a thin wrapper around a caller-provided local ethos CLI binary. +It does not bundle the CLI or PDFium. +PDFium-backed commands still require ETHOS_PDFIUM_LIBRARY_PATH. +``` + +## Files In Scope + +- `README.md` +- `python/README.md` +- `python/QUICKSTART.md` +- `docs/public-boundary-claims.json` +- `docs/validation/README.md` +- `CHANGELOG.md` + +## Non-Approvals + +- This record does not approve hosted surfaces. +- This record does not approve production positioning. +- This record does not approve Windows packaged artifacts. +- This record does not approve bundled project-maintained PDFium builds. +- This record does not approve public benchmark reports. +- This record does not approve public benchmark claims. +- This record does not approve speed claims. +- This record does not approve footprint claims. +- This record does not approve parser-quality claims. +- This record does not approve table-quality claims. +- This record does not approve `ethos-doc`. +- This record does not approve `ethos-rag`. + +## Retained Boundaries + +- 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`. +- The Python wheel remains a wrapper around a caller-provided local `ethos` CLI binary. + +## Commands + +```sh +python3 .github/scripts/test_patch_0_1_1_public_install_wording_closeout.py +python3 .github/scripts/public_boundary_claims_gate.py +python3 .github/scripts/claims_gate.py +python3 .github/scripts/test_public_surface_posture.py +make light-check PYTHON=python3 +make release-candidate-prep PYTHON=python3 +git diff --check +``` + +## Result + +```text +patch 0.1.1 public installation wording closeout recorded +published evaluation install paths are documented without changing retained support boundaries +``` diff --git a/python/QUICKSTART.md b/python/QUICKSTART.md index ad6c29f..42fb89d 100644 --- a/python/QUICKSTART.md +++ b/python/QUICKSTART.md @@ -3,6 +3,12 @@ The `ethos-pdf` Python package is a thin wrapper around a caller-provided local `ethos` CLI binary. 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 +``` + ## PDFium Setup PDF-backed parse and crop commands require a caller-provided PDFium dynamic library. diff --git a/python/README.md b/python/README.md index 3f545b4..a653e5a 100644 --- a/python/README.md +++ b/python/README.md @@ -2,6 +2,12 @@ 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 +``` + The package exposes a public semver API beginning at `0.1.0` for Python `>=3.8`. Patch releases must not break public function signatures, exception classes, or documented return shapes. Minor releases may add backward-compatible API, and major releases may break API after a release-scope