diff --git a/.github/scripts/test_patch_0_1_2_current_state_closeout.py b/.github/scripts/test_patch_0_1_2_current_state_closeout.py new file mode 100644 index 0000000..ae7dd68 --- /dev/null +++ b/.github/scripts/test_patch_0_1_2_current_state_closeout.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 +# +# Copyright 2026 The Ethos maintainers +# +# Licensed under the Apache License, Version 2.0 (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/patch-0-1-2-current-state-closeout-validation-2026-06-25.md" +VALIDATION_README = ROOT / "docs/validation/README.md" +EXECUTION_STATUS = ROOT / "docs/execution-status.md" +PUBLIC_RELEASE_CHECKLIST = ROOT / "docs/public-release-checklist.md" +CHANGELOG = ROOT / "CHANGELOG.md" +MAKEFILE = ROOT / "Makefile" + +SOURCE_SHORT = "aa4b5f2" +SOURCE_COMMIT = "aa4b5f2f3d58175e64572f42e9f4a8a88d9cede1" +SOURCE_TREE = "604b886cccfde24af3071a6babeda25f63230835" +APPROVED_SURFACES = ( + "GitHub source repository", + "Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2`", + "Python `ethos-pdf` wheel at `0.1.2`", + "npm `@docushell/ethos-pdf@0.1.2` package", + "GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI artifacts", + "Annotated package tags `ethos-package-ethos-doc-core-0.1.2`, `ethos-package-ethos-verify-0.1.2`, and `ethos-package-ethos-pdf-0.1.2`", +) +RETAINED_BLOCKERS = ( + "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.", + "Public benchmark reports remain blocked.", + "Public benchmark claims remain blocked.", + "Speed, footprint, parser-quality, table-quality, and production claims remain blocked.", +) +FORBIDDEN_CURRENT_STATUS = ( + "Patch `0.1.2` approved evaluation surfaces remain blocked", + "Patch `0.1.2` package tag creation remains blocked", + "Patch `0.1.2` is not package-release, artifact-release", +) + + +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 Patch012CurrentStateCloseoutTests(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.2` current-state closeout", readme.lower()) + self.assertIn(f"Validated source HEAD before this record: `{SOURCE_SHORT}`", read(RECORD)) + self.assertIn(f"Patch 0.1.2 current-state closeout source commit: `{SOURCE_COMMIT}`", record) + self.assertIn(f"Patch 0.1.2 current-state 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_record_closes_only_approved_patch_0_1_2_surfaces(self) -> None: + record = normalized(RECORD) + raw = read(RECORD) + + for surface in APPROVED_SURFACES: + self.assertIn(surface, record) + for blocker in RETAINED_BLOCKERS: + self.assertIn(blocker, record) + self.assertIn("This record does not approve any new public surface.", record) + self.assertIn("This record does not approve production positioning.", record) + 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_current_status_docs_reference_final_patch_state(self) -> None: + for path in (EXECUTION_STATUS, PUBLIC_RELEASE_CHECKLIST, VALIDATION_README): + text = normalized(path) + self.assertIn(RECORD.name, text, str(path)) + self.assertIn("patch `0.1.2` current-state closeout", text.lower(), str(path)) + self.assertIn("approved patch `0.1.2` evaluation surfaces are closed", text.lower(), str(path)) + self.assertIn("hosted surfaces remain blocked", text.lower(), str(path)) + self.assertIn("production positioning remains blocked", text.lower(), str(path)) + self.assertIn("public benchmark claims remain blocked", text.lower(), str(path)) + for forbidden in FORBIDDEN_CURRENT_STATUS: + self.assertNotIn(forbidden, text, str(path)) + + def test_changelog_records_narrow_boundary(self) -> None: + text = normalized(CHANGELOG) + self.assertIn( + "boundary-exception: close patch `0.1.2` current status for the approved evaluation surfaces", + text, + ) + self.assertIn("no hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, or `ethos-rag` boundary change", text) + + def test_release_candidate_prep_runs_current_state_after_package_tag_closeout(self) -> None: + makefile = read(MAKEFILE) + package_tag_guard = "$(PYTHON) .github/scripts/test_patch_0_1_2_package_tag_closeout.py" + current_state_guard = "$(PYTHON) .github/scripts/test_patch_0_1_2_current_state_closeout.py" + first_public_guard = "$(PYTHON) .github/scripts/test_first_public_release_artifact_evidence.py" + block = target_block("release-candidate-prep") + + self.assertIn(current_state_guard, block) + self.assertEqual(1, makefile.count(current_state_guard)) + self.assertLess(block.index(package_tag_guard), block.index(current_state_guard)) + self.assertLess(block.index(current_state_guard), block.index(first_public_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 797db6c..613839e 100644 --- a/.github/scripts/test_release_candidate_prep.py +++ b/.github/scripts/test_release_candidate_prep.py @@ -80,6 +80,7 @@ "$(PYTHON) .github/scripts/test_patch_0_1_2_package_tag_approval_request.py", "$(PYTHON) .github/scripts/test_patch_0_1_2_package_tag_approval_decision.py", "$(PYTHON) .github/scripts/test_patch_0_1_2_package_tag_closeout.py", + "$(PYTHON) .github/scripts/test_patch_0_1_2_current_state_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 eee16e6..d7ea667 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- boundary-exception: close patch `0.1.2` current status for the approved evaluation surfaces; no hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, or `ethos-rag` boundary change. - boundary-exception: close patch `0.1.2` package tag creation with exact remote tag evidence while retaining hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` blockers. - boundary-exception: record decider approval for exact patch `0.1.2` package tag creation while keeping actual tag creation as a later operator action and retaining hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` blockers. - boundary-exception: request decider review for exact patch `0.1.2` package tag creation while keeping tag creation, hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` surfaces blocked pending a separate approval decision. diff --git a/Makefile b/Makefile index abca964..8da7c28 100644 --- a/Makefile +++ b/Makefile @@ -331,6 +331,7 @@ release-candidate-prep: $(PYTHON) .github/scripts/test_patch_0_1_2_package_tag_approval_request.py $(PYTHON) .github/scripts/test_patch_0_1_2_package_tag_approval_decision.py $(PYTHON) .github/scripts/test_patch_0_1_2_package_tag_closeout.py + $(PYTHON) .github/scripts/test_patch_0_1_2_current_state_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/docs/execution-status.md b/docs/execution-status.md index 8e539a3..f44efdc 100644 --- a/docs/execution-status.md +++ b/docs/execution-status.md @@ -127,6 +127,14 @@ dereference to the approved package source commit. Hosted surfaces, production p packaged artifacts, bundled project-maintained PDFium builds, `ethos-doc`, `ethos-rag`, and public benchmark claims remain blocked. +Patch `0.1.2` current-state closeout is recorded in +`docs/validation/patch-0-1-2-current-state-closeout-validation-2026-06-25.md`. The approved patch +`0.1.2` evaluation surfaces are closed for the GitHub source repository, Rust crates, Python wheel, +npm package, macOS arm64/Linux x64 CLI artifacts, and annotated package tags. Hosted surfaces, +production positioning, Windows packaged artifacts, bundled project-maintained PDFium builds, +`ethos-doc`, `ethos-rag`, public benchmark reports, public benchmark claims, speed, footprint, +parser-quality, table-quality, and production 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 diff --git a/docs/public-release-checklist.md b/docs/public-release-checklist.md index 2f6b8e6..3e7f562 100644 --- a/docs/public-release-checklist.md +++ b/docs/public-release-checklist.md @@ -5,11 +5,15 @@ or launch announcement. It is intentionally stricter than the day-to-day enginee ## Current Status -Ethos is not package-release, artifact-release, benchmark-report, or launch-announcement ready. -It may be pushed as a public pre-alpha source repository only if the latest public-source -preflight passes and the current claim language is used. The package-name/trademark gate is -closed by ADR-0006, but public benchmark, parser-quality, table, heading, speed, footprint, and -rendered-crop byte-identity claims remain blocked. +Ethos has approved public beta/evaluation surfaces for 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, GitHub Release `v0.1.2` macOS arm64 and +Linux x64 CLI artifacts, and the three approved annotated package tags. The approved patch `0.1.2` +evaluation surfaces are closed by +`docs/validation/patch-0-1-2-current-state-closeout-validation-2026-06-25.md`. Hosted surfaces, +production positioning, Windows packaged artifacts, bundled project-maintained PDFium builds, +public benchmark reports, public benchmark claims, speed, footprint, parser-quality, table-quality, +`ethos-doc`, and `ethos-rag` remain blocked. Patch `0.1.1` readiness prep is recorded in `docs/validation/patch-0-1-1-readiness-prep-validation-2026-06-23.md` for review only. It records @@ -208,6 +212,14 @@ dereference to the approved package source commit. Hosted surfaces, production p packaged artifacts, bundled project-maintained PDFium builds, `ethos-doc`, `ethos-rag`, and public benchmark claims remain blocked. +Patch `0.1.2` current-state closeout is recorded in +`docs/validation/patch-0-1-2-current-state-closeout-validation-2026-06-25.md`. The approved patch +`0.1.2` evaluation surfaces are closed for the GitHub source repository, Rust crates, Python wheel, +npm package, macOS arm64/Linux x64 CLI artifacts, and annotated package tags. Hosted surfaces, +production positioning, Windows packaged artifacts, bundled project-maintained PDFium builds, +`ethos-doc`, `ethos-rag`, public benchmark reports, public benchmark claims, speed, footprint, +parser-quality, table-quality, and production 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 5ab8ef9..6c4a904 100644 --- a/docs/validation/README.md +++ b/docs/validation/README.md @@ -10,12 +10,17 @@ in `docs/public-release-checklist.md`. Records: -Patch `0.1.2` closeout records now document the approved public beta/evaluation npm package and -macOS arm64/Linux x64 CLI artifact surfaces, while Rust crate and Python wheel install wording -remain on the published `0.1.1` baseline. Patch `0.1.1` closeout records document the approved -public beta/evaluation surfaces for source, Rust crates, the Python wheel, npm package, and macOS -arm64/Linux x64 CLI artifacts. Historical package publication evidence records below keep their -at-the-time blocker wording for traceability. +Patch `0.1.2` closeout records now document that the approved patch `0.1.2` evaluation surfaces +are closed for the GitHub source repository, Rust crates, Python wheel, npm package, macOS +arm64/Linux x64 CLI artifacts, and the three approved annotated package tags. Hosted surfaces +remain blocked. Production positioning remains blocked. Windows packaged artifacts remain blocked. +Bundled project-maintained PDFium builds remain blocked. Public benchmark reports remain blocked. +Public benchmark claims remain blocked. Speed, footprint, parser-quality, table-quality, and +production claims remain blocked. `ethos-doc` and `ethos-rag` remain blocked. Patch `0.1.1` +closeout records document the approved public beta/evaluation surfaces for source, Rust crates, +the Python wheel, npm package, and macOS arm64/Linux x64 CLI artifacts. +The package publication evidence records below keep their at-the-time blocker wording for +traceability. The public beta current-main refresh prep record keeps refreshed source approval blocked while recording the exact current-main source candidate and required follow-up evidence. @@ -774,6 +779,10 @@ recording the exact current-main source candidate and required follow-up evidenc closeout validation records completed annotated package tag creation and remote tag evidence for the three approved package tags; hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` surfaces remain blocked until separate approval records pass. +- `patch-0-1-2-current-state-closeout-validation-2026-06-25.md` - patch `0.1.2` current-state + closeout validation records that the approved patch `0.1.2` evaluation surfaces are closed while + retaining hosted, production, Windows, bundled PDFium, benchmark, speed/footprint/parser-quality/ + table-quality, `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-2-current-state-closeout-validation-2026-06-25.md b/docs/validation/patch-0-1-2-current-state-closeout-validation-2026-06-25.md new file mode 100644 index 0000000..8cf3c9b --- /dev/null +++ b/docs/validation/patch-0-1-2-current-state-closeout-validation-2026-06-25.md @@ -0,0 +1,58 @@ +# Patch 0.1.2 Current-State Closeout Validation + +Validated source HEAD before this record: `aa4b5f2`. + +Patch 0.1.2 current-state closeout source commit: +`aa4b5f2f3d58175e64572f42e9f4a8a88d9cede1`. + +Patch 0.1.2 current-state closeout source tree: +`604b886cccfde24af3071a6babeda25f63230835`. + +Status: **patch 0.1.2 approved evaluation surfaces closed** + +This record closes only the current status summary after the patch `0.1.2` package tag closeout. +It does not approve any new public surface, does not approve production positioning, and does not +change support boundaries. + +## Closed Evaluation Surfaces + +- GitHub source repository +- Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.1.2` +- Python `ethos-pdf` wheel at `0.1.2` +- npm `@docushell/ethos-pdf@0.1.2` package +- GitHub Release `v0.1.2` macOS arm64/Linux x64 CLI artifacts +- Annotated package tags `ethos-package-ethos-doc-core-0.1.2`, + `ethos-package-ethos-verify-0.1.2`, and `ethos-package-ethos-pdf-0.1.2` + +## Retained Blockers + +- 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. +- Public benchmark reports remain blocked. +- Public benchmark claims remain blocked. +- Speed, footprint, parser-quality, table-quality, and production claims remain blocked. + +## Validation + +- `python3 .github/scripts/test_patch_0_1_2_package_tag_closeout.py` +- `python3 .github/scripts/test_patch_0_1_2_current_state_closeout.py` +- `python3 .github/scripts/test_execution_status.py` +- `python3 .github/scripts/test_release_candidate_prep.py` +- `make light-check PYTHON=python3` +- `make milestone-e-prep PYTHON=python3` +- `make release-candidate-prep PYTHON=python3` +- `git diff --check` + +## Non-Approvals + +- This record does not approve any new public surface. +- 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 `ethos-doc` or `ethos-rag`. +- This record does not approve public benchmark reports or public benchmark claims.