Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 137 additions & 0 deletions .github/scripts/test_patch_0_1_1_public_install_wording_closeout.py
Original file line number Diff line number Diff line change
@@ -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()
1 change: 1 addition & 0 deletions .github/scripts/test_release_candidate_prep.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions docs/public-boundary-claims.json
Original file line number Diff line number Diff line change
Expand Up @@ -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."
]
Expand Down
4 changes: 4 additions & 0 deletions docs/validation/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
```
6 changes: 6 additions & 0 deletions python/QUICKSTART.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
6 changes: 6 additions & 0 deletions python/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading