From 10431f97eaf5c58365ea73aafc4b762aa9eb3705 Mon Sep 17 00:00:00 2001 From: docushell-admin Date: Thu, 25 Jun 2026 00:20:41 +0530 Subject: [PATCH] Request patch 0.1.2 crates publication approval Signed-off-by: docushell-admin --- ...1_2_crates_publication_approval_request.py | 166 ++++++++++++++++++ .../scripts/test_release_candidate_prep.py | 1 + CHANGELOG.md | 1 + Makefile | 1 + docs/execution-status.md | 8 + docs/public-release-checklist.md | 10 ++ docs/validation/README.md | 5 + ...-approval-request-validation-2026-06-25.md | 136 ++++++++++++++ 8 files changed, 328 insertions(+) create mode 100644 .github/scripts/test_patch_0_1_2_crates_publication_approval_request.py create mode 100644 docs/validation/patch-0-1-2-crates-publication-approval-request-validation-2026-06-25.md 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 new file mode 100644 index 0000000..3edcada --- /dev/null +++ b/.github/scripts/test_patch_0_1_2_crates_publication_approval_request.py @@ -0,0 +1,166 @@ +#!/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-crates-publication-approval-request-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" +MAKEFILE = ROOT / "Makefile" + +SOURCE_SHORT = "3bc3564" +SOURCE_COMMIT = "3bc3564e38c1168b2db72f38863d324b6b57bd4d" +SOURCE_TREE = "eda8c7a605a4eb29c155ae3b9e6e9f0c35798f8c" +VERSION = "0.1.2" +CRATES = ("ethos-doc-core", "ethos-verify", "ethos-pdf") +TAGS = ( + "ethos-package-ethos-doc-core-0.1.2", + "ethos-package-ethos-verify-0.1.2", + "ethos-package-ethos-pdf-0.1.2", +) +CRATE_HASHES = ( + "471956cac567f2d328ab2538291462a0bf57e082ef40dd86d877ffaa363bb632", + "cc4356aa24b304d2f18187d5c3a0c02f847031c1d74e2f6a902a742711d65bf4", + "9245cf03c71802c385d65ac8539e678e513114fdbb359543ad0d1373af02b900", +) +FORBIDDEN = ( + "cargo publish approved", + "crates are published", + "published crates", + "production-ready", + "hosted surfaces approved", + "windows packaged artifacts approved", + "bundled pdfium 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 Patch012CratesPublicationApprovalRequestTests(unittest.TestCase): + def test_request_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 crates.io publication approval request", validation_readme.lower()) + self.assertIn(f"Validated source HEAD before this record: `{SOURCE_SHORT}`", read(RECORD)) + self.assertIn(f"Patch 0.1.2 crates publication approval request source commit: `{SOURCE_COMMIT}`", record) + self.assertIn(f"Patch 0.1.2 crates publication approval request source tree: `{SOURCE_TREE}`", record) + self.assertEqual(SOURCE_COMMIT, git("rev-parse", SOURCE_SHORT)) + self.assertEqual(SOURCE_TREE, git("rev-parse", f"{SOURCE_SHORT}^{{tree}}")) + + def test_request_names_exact_crates_versions_tags_and_artifacts(self) -> None: + record = normalized(RECORD) + + self.assertIn( + "Status: **patch 0.1.2 crates.io publication approval request recorded; cargo publish remains blocked**", + record, + ) + for crate in CRATES: + self.assertIn(crate, record) + self.assertIn(f"{crate} = {VERSION}", record) + self.assertIn(f"{crate}-0.1.2.crate", record) + for tag in TAGS: + self.assertIn(tag, record) + for digest in CRATE_HASHES: + self.assertIn(digest, record) + self.assertIn("cargo publish --locked -p ethos-doc-core", record) + self.assertIn("cargo publish --locked -p ethos-verify", record) + self.assertIn("cargo publish --locked -p ethos-pdf", record) + + def test_request_retains_publication_install_and_surface_boundaries(self) -> None: + raw = read(RECORD) + record = normalized(RECORD) + lower = record.lower() + + for expected in ( + "This request record does not approve `cargo publish`.", + "Actual crates.io publication remains blocked pending explicit decider approval.", + "Rust crate public installation wording remains blocked pending explicit decider approval, operator publication, and registry closeout.", + "The `ethos-cli` package remains `publish = false`.", + "`ethos-doc` remains blocked.", + "`ethos-rag` remains blocked.", + "PDFium remains caller-provided through `ETHOS_PDFIUM_LIBRARY_PATH`.", + ): + self.assertIn(expected, record) + 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_status_docs_reference_request_and_keep_install_baseline_split(self) -> None: + for path in (EXECUTION_STATUS, PUBLIC_RELEASE_CHECKLIST): + text = normalized(path) + self.assertIn(RECORD.name, text, str(path)) + 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)) + + def test_source_manifests_keep_expected_publish_surface(self) -> None: + for manifest in ( + ROOT / "crates/ethos-core/Cargo.toml", + ROOT / "crates/ethos-verify/Cargo.toml", + ROOT / "crates/ethos-pdf/Cargo.toml", + ): + text = read(manifest) + self.assertNotIn("publish = false", text, str(manifest)) + self.assertIn('publication_status = "approved_for_crates_io_publication"', text, str(manifest)) + + for manifest in ( + ROOT / "crates/ethos-cli/Cargo.toml", + ROOT / "crates/ethos-layout/Cargo.toml", + ROOT / "crates/ethos-tables/Cargo.toml", + ): + self.assertIn("publish = false", read(manifest), str(manifest)) + + def test_release_candidate_prep_runs_request_guard_after_0_1_2_public_wording(self) -> None: + makefile = read(MAKEFILE) + wording_guard = "$(PYTHON) .github/scripts/test_patch_0_1_2_public_install_wording_closeout.py" + guard = "$(PYTHON) .github/scripts/test_patch_0_1_2_crates_publication_approval_request.py" + first_public_guard = "$(PYTHON) .github/scripts/test_first_public_release_artifact_evidence.py" + block = target_block("release-candidate-prep") + + self.assertIn(guard, block) + self.assertEqual(1, makefile.count(guard)) + self.assertLess(block.index(wording_guard), block.index(guard)) + self.assertLess(block.index(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 d68fa32..75ce946 100644 --- a/.github/scripts/test_release_candidate_prep.py +++ b/.github/scripts/test_release_candidate_prep.py @@ -69,6 +69,7 @@ "$(PYTHON) .github/scripts/test_patch_0_1_2_artifact_publication_closeout.py", "$(PYTHON) .github/scripts/test_patch_0_1_2_npm_vendor_refresh.py", "$(PYTHON) .github/scripts/test_patch_0_1_2_public_install_wording_closeout.py", + "$(PYTHON) .github/scripts/test_patch_0_1_2_crates_publication_approval_request.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 1d0a7d2..01c9e7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- boundary-exception: request decider review for exact patch `0.1.2` Rust crates.io publication of `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` while keeping `cargo publish`, package tag creation, Rust public install wording, PyPI publication, hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` surfaces blocked. - boundary-exception: close patch `0.1.2` public install wording for the published npm package and GitHub Release CLI artifacts while keeping Rust crates and Python wheel install wording on `0.1.1`, and retaining hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` blockers. - boundary-exception: close patch `0.1.2` npm publication with exact registry evidence for `@docushell/ethos-pdf@0.1.2` while keeping public install wording, hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` surfaces blocked. - boundary-exception: record patch `0.1.2` npm publication blocker after an approved `@docushell/ethos-pdf@0.1.2` publish attempt failed with npm `E404`; retry, registry closeout, public install wording, hosted, production, Windows, bundled PDFium, benchmark, `ethos-doc`, and `ethos-rag` surfaces remain blocked. diff --git a/Makefile b/Makefile index 206aa76..e8a0116 100644 --- a/Makefile +++ b/Makefile @@ -320,6 +320,7 @@ release-candidate-prep: $(PYTHON) .github/scripts/test_patch_0_1_2_artifact_publication_closeout.py $(PYTHON) .github/scripts/test_patch_0_1_2_npm_vendor_refresh.py $(PYTHON) .github/scripts/test_patch_0_1_2_public_install_wording_closeout.py + $(PYTHON) .github/scripts/test_patch_0_1_2_crates_publication_approval_request.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 2352a1e..5dc31b6 100644 --- a/docs/execution-status.md +++ b/docs/execution-status.md @@ -42,6 +42,14 @@ public README and public boundary inventory now point npm installation to remains at `0.1.1`, and Python installation remains at `ethos-pdf==0.1.1` until separate crates.io/PyPI `0.1.2` publication closeout records pass. +Patch `0.1.2` crates.io publication approval request is recorded in +`docs/validation/patch-0-1-2-crates-publication-approval-request-validation-2026-06-25.md` for +decider review only. It binds exact `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` crate +artifacts at `0.1.2`, SHA256 values, source commit, source tree, package tag names, and requested +operator commands. `cargo publish` remains blocked, package tag creation remains blocked, Rust +crate public installation wording remains blocked, and Python installation remains at +`ethos-pdf==0.1.1` until separate approval, operator publication, and closeout records pass. + 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 15ce24a..ad7c1b1 100644 --- a/docs/public-release-checklist.md +++ b/docs/public-release-checklist.md @@ -114,6 +114,16 @@ and GitHub Release CLI archives to `v0.1.2`. Rust crate installation remains at Python installation remains at `ethos-pdf==0.1.1` until separate crates.io/PyPI `0.1.2` publication closeout records pass. +Patch `0.1.2` crates.io publication approval request is recorded in +`docs/validation/patch-0-1-2-crates-publication-approval-request-validation-2026-06-25.md` for +decider review only. It binds exact `0.1.2` candidate crates, artifact hashes, source binding, +package tag names, and requested later operator commands, but `cargo publish` remains blocked, +package tag creation remains blocked, Rust crate public installation wording remains blocked, PyPI +publication 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 723ec55..faae04e 100644 --- a/docs/validation/README.md +++ b/docs/validation/README.md @@ -717,6 +717,11 @@ recording the exact current-main source candidate and required follow-up evidenc `@docushell/ethos-pdf@0.1.2` and GitHub Release `v0.1.2` CLI artifacts while keeping Rust crate and Python wheel install wording on the published `0.1.1` baseline until separate crates.io/PyPI `0.1.2` publication closeout records pass. +- `patch-0-1-2-crates-publication-approval-request-validation-2026-06-25.md` - patch 0.1.2 + crates.io publication approval request validation records exact `ethos-doc-core`, + `ethos-verify`, and `ethos-pdf` `0.1.2` crate artifacts, SHA256 values, source binding, + package tag names, publish order, requested later operator commands, and retained blockers; + `cargo publish`, tag creation, and Rust crate public installation wording remain blocked. - `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-crates-publication-approval-request-validation-2026-06-25.md b/docs/validation/patch-0-1-2-crates-publication-approval-request-validation-2026-06-25.md new file mode 100644 index 0000000..052443f --- /dev/null +++ b/docs/validation/patch-0-1-2-crates-publication-approval-request-validation-2026-06-25.md @@ -0,0 +1,136 @@ +# Patch 0.1.2 crates.io Publication Approval Request Validation - 2026-06-25 + +Validated source HEAD before this record: `3bc3564`. + +Patch 0.1.2 crates publication approval request source commit: `3bc3564e38c1168b2db72f38863d324b6b57bd4d`. + +Patch 0.1.2 crates publication approval request source tree: `eda8c7a605a4eb29c155ae3b9e6e9f0c35798f8c`. + +Status: **patch 0.1.2 crates.io publication approval request recorded; cargo publish remains blocked** + +This record requests decider review for publishing exactly the patch `0.1.2` Ethos Rust library +crate set to crates.io. It does not approve or perform `cargo publish`, create package tags, change +Rust crate public installation wording, approve PyPI upload, approve hosted surfaces, approve +production positioning, approve Windows packaged artifacts, approve bundled project-maintained +PDFium builds, approve `ethos-doc`, approve `ethos-rag`, or approve public benchmark reports or +claims. + +## Subject + +- Repository: `docushell/ethos` +- Lane: Rust crates publication +- Package source commit: `3bc3564e38c1168b2db72f38863d324b6b57bd4d` +- Package source tree: `eda8c7a605a4eb29c155ae3b9e6e9f0c35798f8c` +- Candidate crates: + - `ethos-doc-core = 0.1.2` + - `ethos-verify = 0.1.2` + - `ethos-pdf = 0.1.2` +- Excluded workspace packages: + - `ethos-cli` + - `ethos-layout` + - `ethos-tables` + - `ethos-grounding-opendataloader-json` + - reserved `ethos-doc` + - reserved `ethos-rag` + +## Exact Request Fields + +- Decision requested: approve exact patch `0.1.2` crates.io publication preparation inputs for + later operator execution. +- Approver requested: `docushell-admin` acting as decider. +- Date requested: 2026-06-25. +- Exact candidate crate list requested: `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` only. +- Exact package version map requested: `ethos-doc-core = 0.1.2`, `ethos-verify = 0.1.2`, and + `ethos-pdf = 0.1.2`. +- Exact package tag name set requested: `ethos-package-ethos-doc-core-0.1.2`, + `ethos-package-ethos-verify-0.1.2`, and `ethos-package-ethos-pdf-0.1.2`. +- Exact package tag source commit requested: `3bc3564e38c1168b2db72f38863d324b6b57bd4d`. +- Exact package tag source tree requested: `eda8c7a605a4eb29c155ae3b9e6e9f0c35798f8c`. +- Exact candidate package artifacts requested: + - `ethos-doc-core-0.1.2.crate` + - SHA256: `471956cac567f2d328ab2538291462a0bf57e082ef40dd86d877ffaa363bb632` + - `ethos-verify-0.1.2.crate` + - SHA256: `cc4356aa24b304d2f18187d5c3a0c02f847031c1d74e2f6a902a742711d65bf4` + - `ethos-pdf-0.1.2.crate` + - SHA256: `9245cf03c71802c385d65ac8539e678e513114fdbb359543ad0d1373af02b900` +- Exact operator commands requested for later approval: + - `cargo publish --locked -p ethos-doc-core` + - `cargo publish --locked -p ethos-verify` + - `cargo publish --locked -p ethos-pdf` + +## Requested Publication Order + +1. Publish `ethos-doc-core` first. +2. Publish `ethos-verify` after crates.io reports `ethos-doc-core = 0.1.2`. +3. Publish `ethos-pdf` after crates.io reports `ethos-doc-core = 0.1.2`. + +`ethos-verify` and `ethos-pdf` both depend on `ethos-doc-core`; no dependent crate publish should +be attempted until the base crate is visible from crates.io. + +## Evidence Bound To This Request + +- Candidate activation produced crate artifacts for exactly `ethos-doc-core`, `ethos-verify`, and + `ethos-pdf`. +- Candidate activation reported version `0.1.2`. +- Candidate activation reported registry-equivalent consumer check status `pass`. +- Candidate activation reported source manifest activation applied. +- Candidate activation reported package publication approval `false`. +- Candidate activation reported public installation approval `false`. +- `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` manifests do not contain `publish = false`. +- The `ethos-cli` package remains `publish = false`. +- The `ethos-layout` package remains `publish = false`. +- The `ethos-tables` package remains `publish = false`. +- PDFium remains caller-provided through `ETHOS_PDFIUM_LIBRARY_PATH`. + +## Non-Approvals + +- This request record does not approve `cargo publish`. +- This request record does not publish any crate. +- This request record does not create package tags. +- This request record does not approve Rust crate public installation wording. +- This request record does not approve PyPI upload. +- This request record does not approve the `ethos-cli` crate for publication. +- This request record does not approve hosted surfaces. +- This request record does not approve production positioning. +- This request record does not approve Windows packaged artifacts. +- This request record does not approve bundled project-maintained PDFium builds. +- This request record does not approve public benchmark reports. +- This request record does not approve public benchmark claims. +- This request record does not approve `ethos-doc`. +- This request record does not approve `ethos-rag`. + +## Retained Blockers + +- Actual crates.io publication remains blocked pending explicit decider approval. +- Rust crate public installation wording remains blocked pending explicit decider approval, operator + publication, and registry closeout. +- Package tag creation remains blocked pending explicit decider approval. +- Python installation remains at `ethos-pdf==0.1.1` until separate PyPI `0.1.2` approval, + operator publication, and closeout records pass. +- 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. + +## Commands + +```sh +python3 .github/scripts/test_patch_0_1_2_crates_publication_approval_request.py +python3 .github/scripts/package_publication_candidate_activation.py --json +python3 .github/scripts/test_patch_0_1_2_artifact_package_evidence.py +python3 .github/scripts/test_patch_0_1_2_public_install_wording_closeout.py +make release-candidate-prep PYTHON=python3 +git diff --check +``` + +## Result + +```text +patch 0.1.2 crates.io publication approval request recorded +Exact crate set, version map, package tag names, source binding, local crate artifact hashes, publish order, and retained blockers were recorded +cargo publish remains blocked pending explicit decider approval and later operator action +```