From 6a61e6f558d464c8a69e46a9f9d335c81d6c8544 Mon Sep 17 00:00:00 2001 From: docushell-admin Date: Wed, 1 Jul 2026 11:57:14 +0530 Subject: [PATCH] Record app answer release prep packet Signed-off-by: docushell-admin --- .../test_app_answer_release_release_prep.py | 189 ++++++++++++++++++ CHANGELOG.md | 4 + Makefile | 9 +- docs/execution-status.md | 8 + docs/public-release-checklist.md | 10 + docs/validation/README.md | 8 + ...ract-release-prep-validation-2026-07-01.md | 157 +++++++++++++++ 7 files changed, 384 insertions(+), 1 deletion(-) create mode 100644 .github/scripts/test_app_answer_release_release_prep.py create mode 100644 docs/validation/app-answer-release-contract-release-prep-validation-2026-07-01.md diff --git a/.github/scripts/test_app_answer_release_release_prep.py b/.github/scripts/test_app_answer_release_release_prep.py new file mode 100644 index 0000000..30f1704 --- /dev/null +++ b/.github/scripts/test_app_answer_release_release_prep.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python3 +# +# Copyright 2026 The Ethos maintainers +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# + +from __future__ import annotations + +import re +import unittest +from pathlib import Path + +from makefile_guard import target_block +from validation_record_source import assert_record_source_binding + + +ROOT = Path(__file__).resolve().parents[2] +RECORD = ROOT / "docs/validation/app-answer-release-contract-release-prep-validation-2026-07-01.md" +VALIDATION_README = ROOT / "docs/validation/README.md" +EXECUTION_STATUS = ROOT / "docs/execution-status.md" +PUBLIC_RELEASE_CHECKLIST = ROOT / "docs/public-release-checklist.md" +README = ROOT / "README.md" +CHANGELOG = ROOT / "CHANGELOG.md" +MAKEFILE = ROOT / "Makefile" +PYTHON_INIT = ROOT / "python/ethos_pdf/__init__.py" +NPM_PACKAGE = ROOT / "packages/npm/ethos-pdf/package.json" +CARGO_TOML = ROOT / "Cargo.toml" + +SOURCE_SHORT = "d386568" +SOURCE_COMMIT = "d386568ef680f36f4a395543b21d34d2b17baccb" +SOURCE_TREE = "5891ab9c1e2fb4a9094d3d52c59ec57630aa871f" +CURRENT_BASELINE = "0.2.0" +SUGGESTED_TARGET = "0.3.0" +RECORD_NAME = "app-answer-release-contract-release-prep-validation-2026-07-01.md" + +PRIVATE_PATH_MARKERS = ( + "/" + "Users/", + "/" + "private/tmp", + "/" + "private/var", + "/" + "var/folders", + "saumil" + "diwaker", + "Desktop/" + "Stuff", + "project/repo/" + "ethos", +) + + +def read(path: Path) -> str: + return path.read_text(encoding="utf-8") + + +def normalized(path: Path) -> str: + return re.sub(r"\s+", " ", read(path)) + + +class AppAnswerReleaseReleasePrepTests(unittest.TestCase): + def test_record_is_source_bound_and_indexed(self) -> None: + raw = read(RECORD) + record = normalized(RECORD) + + assert_record_source_binding( + self, + root=ROOT, + raw_record=raw, + normalized_record=record, + validated_head=SOURCE_SHORT, + source_label="app-answer-release contract release prep", + source_commit=SOURCE_COMMIT, + source_tree=SOURCE_TREE, + ) + + for path in (VALIDATION_README, EXECUTION_STATUS, PUBLIC_RELEASE_CHECKLIST): + text = normalized(path) + self.assertIn(RECORD_NAME, text, str(path)) + self.assertIn("app-answer-release contract release prep", text.lower(), str(path)) + self.assertIn("remain blocked", text, str(path)) + + def test_packet_names_scope_version_and_public_surfaces(self) -> None: + record = normalized(RECORD) + + self.assertIn( + "Status: **app-answer-release contract release-prep packet recorded; version bump, " + "package publication, tag creation, artifact publication, installable `0.3.0` wording, " + "npm publication, and DocuShell integration remain blocked**", + record, + ) + self.assertIn(f"Current published baseline: `{CURRENT_BASELINE}` Rust and Python surfaces", record) + self.assertIn(f"Suggested target version for decider review: `{SUGGESTED_TARGET}`", record) + self.assertIn("Target version proposal is not an approval.", record) + for surface in [ + "docs/app-answer-release-contract.md", + "schemas/ethos-app-answer-release-decision.schema.json", + "schemas/examples/app-answer-release-decision.example.json", + "examples/app-answer-release/run_python_demo.py", + "examples/app-answer-release/expected-decision.json", + "make app-answer-release-contract PYTHON=python3", + "make app-answer-release-demo PYTHON=python3", + ]: + self.assertIn(surface, record) + + def test_package_decisions_are_bounded_and_npm_is_out_by_default(self) -> None: + record = normalized(RECORD) + + self.assertIn("Rust decision requested", record) + self.assertIn("workspace uses lockstep source versions", record) + self.assertIn("`ethos-doc-core`, `ethos-verify`, and `ethos-pdf` together", record) + self.assertIn("Python decision requested", record) + self.assertIn("`ethos-pdf==0.3.0`", record) + self.assertIn("npm decision requested: keep npm out of scope by default", record) + self.assertIn("not a Node API or Node SDK", record) + self.assertIn("CLI artifact decision requested: keep GitHub Release CLI artifact publication out of scope by default", record) + self.assertIn("release tag `v0.3.0`", record) + + def test_product_boundary_and_non_approvals_remain_explicit(self) -> None: + raw = read(RECORD) + record = normalized(RECORD) + lower = record.lower() + + self.assertIn("Ethos owns citation grounding and derived proof summaries.", record) + self.assertIn("Applications own question relevance labels.", record) + self.assertIn("Applications own source-fact, synthesis, and unsupported-claim labels.", record) + self.assertIn("Ethos verified citation grounding.", record) + self.assertIn("Answer relevance: direct, partial, or off-topic.", record) + + for required in [ + "This prep record does not approve a version bump.", + "This prep record does not create a release-candidate branch.", + "This prep record does not approve `cargo publish`.", + "This prep record does not approve PyPI upload.", + "This prep record does not approve `npm publish`.", + "This prep record does not create a GitHub Release.", + "This prep record does not approve installable `0.3.0` public wording.", + "This prep record does not approve a Node API, Node SDK, N-API binding, or WASM package.", + "This prep record does not approve DocuShell integration.", + ]: + self.assertIn(required, record) + + for forbidden in [ + "version bump approved", + "cargo publish approved", + "pypi upload approved", + "npm publish approved", + "github release approved", + "tag creation approved", + "installable `0.3.0` public wording approved", + "ethos verified the answer", + ]: + self.assertNotIn(forbidden, lower) + for private in PRIVATE_PATH_MARKERS: + self.assertNotIn(private, raw) + + def test_current_public_install_surfaces_are_not_bumped(self) -> None: + self.assertIn('version = "0.2.0"', read(CARGO_TOML)) + self.assertIn('__version__ = "0.2.0"', read(PYTHON_INIT)) + self.assertIn('"version": "0.2.1"', read(NPM_PACKAGE)) + self.assertIn("cargo add ethos-doc-core@0.2.0", read(README)) + self.assertIn("python3 -m pip install ethos-pdf==0.2.0", read(README)) + self.assertIn("npm install -g @docushell/ethos-pdf@0.2.1", read(README)) + self.assertNotIn("cargo add ethos-doc-core@0.3.0", read(README)) + self.assertNotIn("python3 -m pip install ethos-pdf==0.3.0", read(README)) + self.assertNotIn("npm install -g @docushell/ethos-pdf@0.3.0", read(README)) + + def test_make_target_runs_scoped_release_prep_guard(self) -> None: + block = target_block("app-answer-release-release-prep") + commands = [line.strip() for line in block.splitlines() if line.strip()] + + self.assertEqual( + [ + "$(MAKE) app-answer-release-contract PYTHON=$(PYTHON)", + "$(PYTHON) .github/scripts/test_app_answer_release_release_prep.py", + "$(PYTHON) .github/scripts/test_public_surface_posture.py", + "$(PYTHON) .github/scripts/test_ci_workflow.py", + "git diff --check", + ], + commands, + ) + self.assertIn("test_app_answer_release_release_prep.py", read(MAKEFILE)) + + def test_changelog_records_boundary_exception_without_publication(self) -> None: + text = normalized(CHANGELOG) + + self.assertIn("boundary-exception: record app-answer-release contract release-prep packet", text) + self.assertIn("publication, tag creation, artifact publication, installable `0.3.0` wording", text) + self.assertIn("DocuShell integration blocked", text) + + +if __name__ == "__main__": + unittest.main() diff --git a/CHANGELOG.md b/CHANGELOG.md index b269e56..9a31be7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +- boundary-exception: record app-answer-release contract release-prep packet for decider review + while keeping version bump, package publication, tag creation, artifact publication, + installable `0.3.0` wording, npm publication, hosted, production, Windows, bundled PDFium, + benchmark, `ethos-doc`, `ethos-rag`, and DocuShell integration blocked. - boundary-exception: record passing `ethos-doc-core 0.2.0` locked cargo publish dry-run evidence while keeping actual `cargo publish`, dependent-crate dry-runs, PyPI upload, npm publish, GitHub Release artifact publication, release/package tags, installable `0.2.0` wording, hosted, diff --git a/Makefile b/Makefile index 8720283..356638d 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ LAYOUT_EVALUATOR_OUT ?= $(ROOT)/target/layout-evaluator-alpha .PHONY: milestone-d-grounding-source-contract .PHONY: milestone-d-crop-element-surface-shape-contract .PHONY: milestone-d-claim-kind-boundary-contract -.PHONY: app-answer-release-contract app-answer-release-demo +.PHONY: app-answer-release-contract app-answer-release-demo app-answer-release-release-prep $(ETHOS_BIN): cargo build --locked -p ethos-cli @@ -76,6 +76,13 @@ app-answer-release-demo: $(PYTHON) .github/scripts/test_app_answer_release_demo.py git diff --check +app-answer-release-release-prep: + $(MAKE) app-answer-release-contract PYTHON=$(PYTHON) + $(PYTHON) .github/scripts/test_app_answer_release_release_prep.py + $(PYTHON) .github/scripts/test_public_surface_posture.py + $(PYTHON) .github/scripts/test_ci_workflow.py + git diff --check + milestone-d-verify-citations-contract: cargo test --locked -p ethos-cli --test verify $(PYTHON) schemas/validate_examples.py diff --git a/docs/execution-status.md b/docs/execution-status.md index 4a94b8d..00e1cd1 100644 --- a/docs/execution-status.md +++ b/docs/execution-status.md @@ -4,6 +4,14 @@ Date: 2026-06-25 Owner: product / decider Status: v0.2.0 public beta/evaluation surfaces are live for the GitHub source repository; Rust library crates `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.2.0`; the Python `ethos-pdf` wheel at `0.2.0`; npm `@docushell/ethos-pdf@0.2.1`; and GitHub Release `v0.2.0` macOS arm64/Linux x64 CLI artifacts. npm `@docushell/ethos-pdf@0.2.0` is deprecated because it shipped stale CLI binaries that reported `ethos 0.1.2`; use `0.2.1`. PDFium-backed commands use caller-provided PDFium through `ETHOS_PDFIUM_LIBRARY_PATH`. 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. +App-answer-release contract release prep is recorded in +`docs/validation/app-answer-release-contract-release-prep-validation-2026-07-01.md` for decider +review only. It binds the merged app-release source surfaces, proposes `0.3.0` for review, and +keeps version bump, package publication, tag creation, artifact publication, installable `0.3.0` +wording, npm publication, hosted surfaces, production positioning, Windows packaged artifacts, +bundled project-maintained PDFium builds, public benchmark claims, `ethos-doc`, `ethos-rag`, and +DocuShell integration blocked pending explicit approval and later evidence records. + Historical baseline before v0.2.0 closeout: Public beta evaluation was 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 historical public sentence approved for source, Rust crate, Python wheel, npm package, macOS arm64 CLI artifact, and Linux x64 CLI artifact evaluation surfaces was: "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`. v0.2.0 release-candidate activation is recorded in `docs/v0-2-0-release-prep.md`. The diff --git a/docs/public-release-checklist.md b/docs/public-release-checklist.md index 2f82340..bed968d 100644 --- a/docs/public-release-checklist.md +++ b/docs/public-release-checklist.md @@ -14,6 +14,16 @@ production positioning, Windows packaged artifacts, bundled project-maintained P public benchmark reports, public benchmark claims, speed, footprint, parser-quality, table-quality, `ethos-doc`, and `ethos-rag` remain blocked. +App-answer-release contract release prep is recorded in +`docs/validation/app-answer-release-contract-release-prep-validation-2026-07-01.md` for decider +review only. It proposes `0.3.0` for review, lists the merged contract/schema/helper/demo surfaces, +and requests Rust, Python, npm, CLI artifact, and tag decisions. It does not approve version bump, +package publication, tag creation, artifact publication, installable `0.3.0` wording, npm +publication, hosted surfaces, production positioning, Windows packaged artifacts, bundled +project-maintained PDFium builds, public benchmark reports, public benchmark claims, `ethos-doc`, +`ethos-rag`, or DocuShell integration. Those actions remain blocked pending explicit approval and +later evidence records. + v0.2.0 release approval request is recorded in `docs/validation/v0-2-0-release-approval-request-validation-2026-06-25.md` for decider review only. It does not approve version bump, release-candidate branch creation, package publication, diff --git a/docs/validation/README.md b/docs/validation/README.md index 1b3ad88..5d7bc47 100644 --- a/docs/validation/README.md +++ b/docs/validation/README.md @@ -10,6 +10,14 @@ in `docs/public-release-checklist.md`. Records: +App-answer-release contract release prep is recorded in +`app-answer-release-contract-release-prep-validation-2026-07-01.md` for decider review only. It +binds the merged source commit and tree, proposed `0.3.0` target version for review, app-release +source surfaces, package-surface decisions, product boundary wording, non-approvals, retained +blockers, and guard commands. Version bump, package publication, tag creation, artifact +publication, installable `0.3.0` wording, npm publication, and DocuShell integration remain +blocked pending explicit approval and later evidence records. + v0.2.0 publication closeout is recorded in `v0-2-0-publication-closeout-validation-2026-06-25.md`. It records crates.io publication for `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` at `0.2.0`; PyPI `ethos-pdf==0.2.0`; diff --git a/docs/validation/app-answer-release-contract-release-prep-validation-2026-07-01.md b/docs/validation/app-answer-release-contract-release-prep-validation-2026-07-01.md new file mode 100644 index 0000000..8b5f996 --- /dev/null +++ b/docs/validation/app-answer-release-contract-release-prep-validation-2026-07-01.md @@ -0,0 +1,157 @@ +# App Answer Release Contract Release Prep Validation - 2026-07-01 + +Validated source HEAD before this record: `d386568`. + +app-answer-release contract release prep source commit: +`d386568ef680f36f4a395543b21d34d2b17baccb`. + +app-answer-release contract release prep source tree: +`5891ab9c1e2fb4a9094d3d52c59ec57630aa871f`. + +Status: **app-answer-release contract release-prep packet recorded; version bump, package +publication, tag creation, artifact publication, installable `0.3.0` wording, npm publication, +and DocuShell integration remain blocked** + +This record prepares the next decider review for the app-answer-release contract that landed on +`main`. It does not approve or perform a version bump, create a release-candidate branch, run +`cargo publish`, upload to PyPI, run `npm publish`, create a GitHub Release, upload CLI artifacts, +create release or package tags, change public install wording, approve hosted surfaces, approve +production positioning, approve Windows packaged artifacts, approve bundled project-maintained +PDFium builds, approve `ethos-doc`, approve `ethos-rag`, approve public benchmark reports, or +approve DocuShell integration. + +## Subject + +- Repository: `docushell/ethos` +- Lane: app-answer-release contract release prep +- Prep source commit: `d386568ef680f36f4a395543b21d34d2b17baccb` +- Prep source tree: `5891ab9c1e2fb4a9094d3d52c59ec57630aa871f` +- Current published baseline: `0.2.0` Rust and Python surfaces, npm + `@docushell/ethos-pdf@0.2.1`, and GitHub Release `v0.2.0` macOS arm64/Linux x64 CLI artifacts. +- Suggested target version for decider review: `0.3.0`. +- Target version proposal is not an approval. + +## Source Surfaces In Scope + +The merged source candidate contains the app-answer-release contract path: + +- `docs/app-answer-release-contract.md` +- `schemas/ethos-app-answer-release-decision.schema.json` +- `schemas/examples/app-answer-release-decision.example.json` +- `examples/app-answer-release/README.md` +- `examples/app-answer-release/run_python_demo.py` +- `examples/app-answer-release/verification-report.json` +- `examples/app-answer-release/proof-summary.json` +- `examples/app-answer-release/claims.json` +- `examples/app-answer-release/expected-decision.json` +- Rust `derive_app_answer_release_decision(...)` and `VerificationReport::proof_summary()` under + the `ethos-doc-core` `verify-types` feature. +- Python `proof_summary(...)` and `app_answer_release_decision(...)` exported by `ethos_pdf`. +- CI/source guards: `make app-answer-release-contract PYTHON=python3` and + `make app-answer-release-demo PYTHON=python3`. + +## Package Surface Decisions Requested + +- Rust decision requested: decide whether the next public Rust release should carry the app + helper through `ethos-doc-core`. Because this workspace uses lockstep source versions, a + proposed `0.3.0` Rust release should explicitly decide whether the public Rust crate set remains + `ethos-doc-core`, `ethos-verify`, and `ethos-pdf` together. +- Python decision requested: decide whether the Python helper should ship as `ethos-pdf==0.3.0`. + The package name remains historical; the helper does not add PDF parsing, an LLM demo, or a + hosted API. +- npm decision requested: keep npm out of scope by default. `@docushell/ethos-pdf` is currently a + CLI binary distribution package, not a Node API or Node SDK. A CLI alignment release would need a + separate explicit decision. +- CLI artifact decision requested: keep GitHub Release CLI artifact publication out of scope by + default unless the decider chooses a full lockstep CLI/artifact release. +- Tag decision requested: keep release tag `v0.3.0` and any package tags blocked until an exact + approval decision and later evidence records pass. + +## Product Boundary Preserved + +The contract keeps these ownership lines: + +- Ethos owns citation grounding and derived proof summaries. +- Applications own question relevance labels. +- Applications own source-fact, synthesis, and unsupported-claim labels. +- Applications own final, review, and blocked answer-release policy. + +The release packet must not describe Ethos as verifying complete answers. Safe wording remains: + +```text +Ethos verified citation grounding. +Answer relevance: direct, partial, or off-topic. +``` + +## Non-Approvals + +- This prep record does not approve a version bump. +- This prep record does not create a release-candidate branch. +- This prep record does not approve `cargo publish`. +- This prep record does not publish any crate. +- This prep record does not approve PyPI upload. +- This prep record does not upload any Python distribution. +- This prep record does not approve `npm publish`. +- This prep record does not publish any npm package. +- This prep record does not create a GitHub Release. +- This prep record does not upload CLI artifacts. +- This prep record does not create a release tag. +- This prep record does not create package tags. +- This prep record does not approve installable `0.3.0` public wording. +- This prep record does not approve a Node API, Node SDK, N-API binding, or WASM package. +- This prep record does not approve hosted surfaces. +- This prep record does not approve production positioning. +- This prep record does not approve Windows packaged artifacts. +- This prep record does not approve bundled project-maintained PDFium builds. +- This prep record does not approve public benchmark reports. +- This prep record does not approve public benchmark claims. +- This prep record does not approve `ethos-doc`. +- This prep record does not approve `ethos-rag`. +- This prep record does not approve DocuShell integration. + +## Retained Blockers + +- Explicit decider approval remains required before any `0.3.0` release-candidate branch. +- Rust workspace/package version bump remains blocked until approval. +- Python metadata and `ethos_pdf.__version__` bump remain blocked until approval and Python scope + acceptance. +- npm package version bump remains blocked unless a separate npm CLI alignment decision is + accepted. +- `CHANGELOG.md` final release wording remains blocked until approval. +- `cargo publish` remains blocked until release-candidate dry-runs pass and a separate operator + action is approved. +- PyPI upload remains blocked until Python scope is accepted and deterministic wheel evidence + passes. +- `npm publish` remains blocked until npm scope is accepted and package evidence passes. +- GitHub Release CLI artifact publication remains blocked unless the release scope explicitly + includes CLI artifacts and artifact evidence passes. +- Release tag and package tag creation remain blocked until explicit approval and closeout + evidence pass. +- Installable `0.3.0` public wording remains blocked until registry/artifact availability and + smoke closeout records pass. +- DocuShell integration remains blocked until the contract is released or an explicit + source-dependency decision is recorded. + +## Guard Commands + +```sh +cargo fmt --check +make app-answer-release-contract PYTHON=python3 +python3 .github/scripts/test_app_answer_release_release_prep.py +python3 .github/scripts/test_public_surface_posture.py +python3 .github/scripts/test_ci_workflow.py +python3 .github/scripts/claims_gate.py +python3 .github/scripts/public_boundary_claims_gate.py +git diff --check +``` + +## Result + +```text +app-answer-release contract release-prep packet recorded +Suggested target version, source surfaces, package-surface decisions, product boundary, +non-approvals, retained blockers, and guard commands were recorded +version bump, package publication, tag creation, artifact publication, installable wording, npm +publication, and DocuShell integration remain blocked pending explicit approval and later evidence +records +```