diff --git a/.github/scripts/test_milestone_e_package_publication_approval_resolution_plan.py b/.github/scripts/test_milestone_e_package_publication_approval_resolution_plan.py new file mode 100644 index 0000000..3f1c551 --- /dev/null +++ b/.github/scripts/test_milestone_e_package_publication_approval_resolution_plan.py @@ -0,0 +1,183 @@ +#!/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. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under 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] +PREP = ROOT / "docs/milestone-e-package-publication-approval-prep.json" +RECORD = ( + ROOT + / "docs/validation/" + "milestone-e-package-publication-approval-resolution-plan-validation-2026-06-21.md" +) +VALIDATION_README = ROOT / "docs/validation/README.md" +PREP_SCOPE = ROOT / "docs/milestone-e-prep-scope.md" +ROADMAP = ROOT / "docs/roadmap.md" +EXECUTION_STATUS = ROOT / "docs/execution-status.md" +CI_WORKFLOW = ROOT / ".github/workflows/ci.yml" + +CURRENT_MAIN = "524535a621532b5382f91a38d9c3f85d6714a526" +CURRENT_MAIN_SHORT = "524535a" +CURRENT_TREE = "0785ffca8423c42e2c4105df7752e290cc88e5c2" +FORBIDDEN_SCOPE_EXPANSION = [ + "public reports are approved", + "public result wording approved", + "release-ready", + "release artifact approved", + "package-ready", + "package publication is approved", + "package publication approved", + "packages are published", + "published packages", + "production-ready", + "production positioning approved", + "benchmark-validated", + "public benchmark pass", + "speed validated", + "fastest", + "launch-ready", + "hosted surface approved", + "hosted demo approved", + "demo-ready", + "performance validated", + "quality validated", + "footprint validated", + "table-quality validated", + "parser-quality validated", +] + + +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 load_json(path: Path) -> dict: + return json.loads(path.read_text(encoding="utf-8")) + + +def git(*args: str) -> str: + return subprocess.check_output( + ["git", *args], + cwd=ROOT, + encoding="utf-8", + stderr=subprocess.DEVNULL, + ).strip() + + +class MilestoneEPackagePublicationApprovalResolutionPlanTests(unittest.TestCase): + def test_record_is_indexed_and_source_bound(self) -> None: + readme = read(VALIDATION_README) + record = normalized(RECORD) + + self.assertIn(RECORD.name, readme) + self.assertIn("package publication approval resolution-plan validation", re.sub(r"\s+", " ", readme)) + self.assertIn(f"Validated source HEAD before this record: `{CURRENT_MAIN_SHORT}`", read(RECORD)) + self.assertIn(f"Current source commit: `{CURRENT_MAIN}`", record) + self.assertIn(f"Current source tree: `{CURRENT_TREE}`", record) + self.assertEqual(CURRENT_MAIN, git("rev-parse", CURRENT_MAIN_SHORT)) + self.assertEqual(CURRENT_TREE, git("rev-parse", f"{CURRENT_MAIN_SHORT}^{{tree}}")) + + def test_record_covers_gap_ledger_and_request_packet_without_approval(self) -> None: + prep = load_json(PREP) + ledger = prep["package_publication_pre_approval_gap_ledger"] + packet = prep["package_publication_approval_request_packet"] + record = normalized(RECORD) + + self.assertIn(ledger["ledger_state"], record) + for row in ledger["gap_rows"]: + self.assertIn(row, record) + for action in ledger["blocked_actions"]: + self.assertIn(action, record) + for required in ledger["required_resolution_inputs"]: + self.assertIn(required, record) + for non_approval in ledger["non_approvals"]: + self.assertIn(non_approval, record) + for blocker in ledger["retained_blockers"]: + self.assertIn(blocker, record) + for crate in packet["candidate_crates"]: + self.assertIn(crate, record) + for exclusion in packet["explicit_exclusions"]: + self.assertIn(exclusion, record) + self.assertIn(packet["public_installation_wording"], record) + self.assertIn("Package publication remains blocked", record) + self.assertIn("Public installation remains blocked", record) + + def test_current_manifests_remain_non_publishable(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.assertIn("publish = false", text) + self.assertIn('reserved_crates_io_version = "0.0.0-reserved.0"', text) + + def test_docs_reference_resolution_plan_and_blockers(self) -> None: + for path in (PREP_SCOPE, ROADMAP, EXECUTION_STATUS, VALIDATION_README): + doc = normalized(path) + + self.assertIn(RECORD.name, doc, str(path)) + self.assertIn("package publication approval resolution plan", doc.lower(), str(path)) + self.assertIn("package publication remains blocked", doc, str(path)) + self.assertIn("public installation remains blocked", doc, str(path)) + + def test_make_and_ci_run_resolution_plan_after_gap_ledger(self) -> None: + make_block = target_block("milestone-e-prep") + ci = read(CI_WORKFLOW) + gap_guard = "test_milestone_e_package_publication_pre_approval_gap_ledger.py" + resolution_guard = "test_milestone_e_package_publication_approval_resolution_plan.py" + public_facing_guard = "test_milestone_e_public_facing_readiness_ledger.py" + + for text, prefix in ((make_block, "$(PYTHON) .github/scripts/"), (ci, "python3 .github/scripts/")): + self.assertIn(prefix + resolution_guard, text) + self.assertEqual(1, text.count(prefix + resolution_guard)) + self.assertLess(text.index(prefix + gap_guard), text.index(prefix + resolution_guard)) + self.assertLess(text.index(prefix + resolution_guard), text.index(prefix + public_facing_guard)) + + def test_record_avoids_scope_expansion_language_or_private_paths(self) -> None: + lower = normalized(RECORD).lower() + raw = read(RECORD) + + for phrase in FORBIDDEN_SCOPE_EXPANSION: + self.assertNotIn(phrase, lower) + self.assertNotIn("/Users/", raw) + self.assertNotIn("/private/tmp", raw) + self.assertNotIn("/private/var", raw) + self.assertNotIn("/var/folders", raw) + self.assertNotIn("saumildiwaker", raw) + self.assertNotIn("Desktop/Stuff", raw) + self.assertNotIn("project/repo/ethos", raw) + self.assertNotIn("docs/.roadmap.md.swp", raw) + self.assertNotIn("web/", raw) + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/scripts/test_milestone_e_prep_guard_sequence_index.py b/.github/scripts/test_milestone_e_prep_guard_sequence_index.py index b807c35..d259475 100644 --- a/.github/scripts/test_milestone_e_prep_guard_sequence_index.py +++ b/.github/scripts/test_milestone_e_prep_guard_sequence_index.py @@ -106,6 +106,7 @@ "$(PYTHON) .github/scripts/test_milestone_e_package_publication_registry_assembly_activation_prep.py", "$(PYTHON) .github/scripts/test_milestone_e_package_publication_decision_bundle_validation_record.py", "$(PYTHON) .github/scripts/test_milestone_e_package_publication_pre_approval_gap_ledger.py", + "$(PYTHON) .github/scripts/test_milestone_e_package_publication_approval_resolution_plan.py", "$(PYTHON) .github/scripts/test_milestone_e_public_facing_readiness_ledger.py", "$(PYTHON) .github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py", "$(PYTHON) .github/scripts/test_milestone_e_public_beta_current_main_source_only_approval.py", diff --git a/.github/scripts/test_milestone_e_prep_scope.py b/.github/scripts/test_milestone_e_prep_scope.py index 9d1f1ac..ebd3e83 100644 --- a/.github/scripts/test_milestone_e_prep_scope.py +++ b/.github/scripts/test_milestone_e_prep_scope.py @@ -405,6 +405,7 @@ def test_make_target_is_narrow_and_guarded(self) -> None: "$(PYTHON) .github/scripts/test_milestone_e_package_publication_registry_assembly_activation_prep.py", "$(PYTHON) .github/scripts/test_milestone_e_package_publication_decision_bundle_validation_record.py", "$(PYTHON) .github/scripts/test_milestone_e_package_publication_pre_approval_gap_ledger.py", + "$(PYTHON) .github/scripts/test_milestone_e_package_publication_approval_resolution_plan.py", "$(PYTHON) .github/scripts/test_milestone_e_public_facing_readiness_ledger.py", "$(PYTHON) .github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py", "$(PYTHON) .github/scripts/test_milestone_e_public_beta_current_main_source_only_approval.py", diff --git a/.github/scripts/test_milestone_e_validation_record_index.py b/.github/scripts/test_milestone_e_validation_record_index.py index 614b769..288cc51 100644 --- a/.github/scripts/test_milestone_e_validation_record_index.py +++ b/.github/scripts/test_milestone_e_validation_record_index.py @@ -258,6 +258,10 @@ class RecordCoverage: "milestone-e-package-publication-pre-approval-gap-ledger-validation-2026-06-21.md", "test_milestone_e_package_publication_pre_approval_gap_ledger.py", ), + RecordCoverage( + "milestone-e-package-publication-approval-resolution-plan-validation-2026-06-21.md", + "test_milestone_e_package_publication_approval_resolution_plan.py", + ), RecordCoverage( "milestone-e-public-facing-readiness-ledger-validation-2026-06-21.md", "test_milestone_e_public_facing_readiness_ledger.py", diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c9984ef..24f2cc8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -226,6 +226,8 @@ jobs: run: python3 .github/scripts/test_milestone_e_package_publication_decision_bundle_validation_record.py - name: Milestone E package publication pre-approval gap ledger tests run: python3 .github/scripts/test_milestone_e_package_publication_pre_approval_gap_ledger.py + - name: Milestone E package publication approval resolution-plan tests + run: python3 .github/scripts/test_milestone_e_package_publication_approval_resolution_plan.py - name: Milestone E public-facing readiness ledger tests run: python3 .github/scripts/test_milestone_e_public_facing_readiness_ledger.py - name: Milestone E public beta current-main refresh prep tests diff --git a/Makefile b/Makefile index c157bda..6452995 100644 --- a/Makefile +++ b/Makefile @@ -220,6 +220,7 @@ milestone-e-prep: $(PYTHON) .github/scripts/test_milestone_e_package_publication_registry_assembly_activation_prep.py $(PYTHON) .github/scripts/test_milestone_e_package_publication_decision_bundle_validation_record.py $(PYTHON) .github/scripts/test_milestone_e_package_publication_pre_approval_gap_ledger.py + $(PYTHON) .github/scripts/test_milestone_e_package_publication_approval_resolution_plan.py $(PYTHON) .github/scripts/test_milestone_e_public_facing_readiness_ledger.py $(PYTHON) .github/scripts/test_milestone_e_public_beta_current_main_refresh_prep.py $(PYTHON) .github/scripts/test_milestone_e_public_beta_current_main_source_only_approval.py diff --git a/docs/execution-status.md b/docs/execution-status.md index e548281..145db78 100644 --- a/docs/execution-status.md +++ b/docs/execution-status.md @@ -195,6 +195,8 @@ The public beta current-main refresh prep in `docs/milestone-e-public-beta-curre The current-main source-only public beta approval in `docs/validation/milestone-e-public-beta-current-main-source-only-approval-validation-2026-06-21.md` records reviewed commit `902c423`, merged main commit `6019a97`, and tree `f56fde854f6f6e4c4070209329f8c7b12310aa51` as the refreshed GitHub source-repository public beta source binding. Package publication remains blocked, public installation remains blocked, hosted surfaces remain blocked, production positioning remains blocked, public benchmark reports remain blocked, public benchmark claims remain blocked, release artifacts remain blocked, and public result wording remains blocked. +The package publication approval resolution plan in `docs/validation/milestone-e-package-publication-approval-resolution-plan-validation-2026-06-21.md` records current source commit `524535a` / tree `0785ffca8423c42e2c4105df7752e290cc88e5c2` as the source state for later exact package-publication decision review. It orders the remaining version, tag, manifest activation, registry-backed assembly, public installation wording, and posture/claims inputs while package publication remains blocked and public installation remains blocked. + | Work item | Current status | Remaining blocker | | --- | --- | --- | | PDFium Phase 1 profile | Landed: pinned profile, V8/XFA-disabled state, platform hashes, runtime library hashes, and provenance are recorded | Phase 2 project-maintained builds still block Public Beta | diff --git a/docs/milestone-e-prep-scope.md b/docs/milestone-e-prep-scope.md index 8a17513..1314dcc 100644 --- a/docs/milestone-e-prep-scope.md +++ b/docs/milestone-e-prep-scope.md @@ -107,6 +107,11 @@ The current-main source-only public beta approval is recorded in `docs/validation/milestone-e-public-beta-current-main-source-only-approval-validation-2026-06-21.md`. It pins reviewed commit `902c423`, merged main commit `6019a97`, and tree `f56fde854f6f6e4c4070209329f8c7b12310aa51` for the same source-only GitHub repository surface. +The package publication approval resolution plan is recorded in +`docs/validation/milestone-e-package-publication-approval-resolution-plan-validation-2026-06-21.md`. +It binds the future exact decision review to current source commit `524535a` / tree +`0785ffca8423c42e2c4105df7752e290cc88e5c2` while package publication remains blocked and public +installation remains blocked. The metadata-readiness follow-up record under `docs/validation/` covers README, NOTICE, manifest metadata, and include-list readiness for `ethos-core`, `ethos-verify`, and `ethos-pdf` only. `ethos-doc` and `ethos-rag` remain reserved placeholders without in-tree package manifests, and diff --git a/docs/roadmap.md b/docs/roadmap.md index c4deff7..4bbc026 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -160,6 +160,10 @@ The current-main source-only public beta approval is recorded in [`docs/validation/milestone-e-public-beta-current-main-source-only-approval-validation-2026-06-21.md`](validation/milestone-e-public-beta-current-main-source-only-approval-validation-2026-06-21.md) for reviewed commit `902c423`, merged main commit `6019a97`, and tree `f56fde854f6f6e4c4070209329f8c7b12310aa51`. +The package publication approval resolution plan is recorded in +[`docs/validation/milestone-e-package-publication-approval-resolution-plan-validation-2026-06-21.md`](validation/milestone-e-package-publication-approval-resolution-plan-validation-2026-06-21.md) +for current source commit `524535a` / tree `0785ffca8423c42e2c4105df7752e290cc88e5c2`, with +package publication remains blocked and public installation remains blocked. This prep only identifies tracked trust-loop fixture candidates and guard wiring for internal continuation; blocked-output alignment keeps the current trust-loop protocol, rehearsal/evidence matrix, blocker ledger, and matching schemas on the same explicit blockers, while evidence-lane @@ -202,7 +206,7 @@ public-facing claims. | B | weeks 9-14 | **`ethos verify` alpha first**: native Ethos JSON + synthetic and pinned real OpenDataLoader verification demos, stale fingerprint checks, capability-limited reports, deterministic evidence matching including split-quote coverage, explicit unsupported non-v1 claim reporting, adapter structure diagnostics; then reading order, blocks, headings, lists, Markdown/text exporters, Python wheel scaffold, quality dashboard, Windows x64 nightly determinism | [13-B exit checklist](milestone-b-exit-checklist.md) | | C | weeks 15-22 | Simple/bordered tables; RAG chunker + citations; non-text region coordinates; security report + default-chunk exclusion; debug overlay; internal benchmark snapshot | Current artifact-validation checkpoint recorded in [Milestone C closeout validation](validation/milestone-c-closeout-validation-2026-06-18.md); broader debug/crop/table follow-ups remain explicit | | D | weeks 23-30 | [`verify_citations` v1 contract prep](milestone-d-verify-citations-contract.md); [`claim_kind_boundary` v1 contract prep](milestone-d-claim-kind-boundary-contract.md); [`grounding_source` v1 contract prep](milestone-d-grounding-source-contract.md); [`capability_downgrade` v1 contract prep](milestone-d-capability-downgrade-contract.md); [`opendataloader_adapter_shape` v1 contract prep](milestone-d-opendataloader-adapter-shape-contract.md); [`crop_element` v1 contract prep](milestone-d-crop-element-contract.md) plus internal resolver and source-bound CLI/Python descriptor/rendered carriers; [`crop_element_surface_shape` v1 contract prep](milestone-d-crop-element-surface-shape-contract.md); [`sandbox_subprocess` v1 contract prep](milestone-d-sandbox-subprocess-contract.md); [contract closeout validation](validation/milestone-d-contract-closeout-validation-2026-06-19.md); [final closeout validation](validation/milestone-d-final-closeout-validation-2026-06-19.md); Node/MCP/hosted crop surfaces, sandbox-backed crop behavior, foreign-adapter crop coordinates, and cross-platform rendered-crop byte identity are explicit post-D blockers, not D closeout requirements | 13-D exit complete for source-only pre-alpha scope | -| E | weeks 31-40 | Initial source-only prep scope in [`docs/milestone-e-prep-scope.md`](milestone-e-prep-scope.md), with current internal prep closeout recorded in [`docs/validation/milestone-e-final-closeout-validation-2026-06-20.md`](validation/milestone-e-final-closeout-validation-2026-06-20.md); source-only public beta evaluation is tracked in [`docs/milestone-e-public-beta-approval-prep.json`](milestone-e-public-beta-approval-prep.json) with exact wording and exclusions; current-main source-only public beta approval is recorded in [`docs/validation/milestone-e-public-beta-current-main-source-only-approval-validation-2026-06-21.md`](validation/milestone-e-public-beta-current-main-source-only-approval-validation-2026-06-21.md); package publication approval prep is tracked in [`docs/milestone-e-package-publication-approval-prep.json`](milestone-e-package-publication-approval-prep.json) as internal Rust crate publication prep only, with evidence, metadata-readiness, dry-run/smoke, version/tag policy, PDFium boundary, and dependency-ordering records under `docs/validation/`; current-main public-facing readiness is tracked in [`docs/milestone-e-public-facing-readiness-ledger.json`](milestone-e-public-facing-readiness-ledger.json) without approving package publication; current-main source-only public beta refresh prep is tracked in [`docs/milestone-e-public-beta-current-main-refresh-prep.json`](milestone-e-public-beta-current-main-refresh-prep.json) without changing approved wording or approving package publication; actual package publication, later public-report, project-maintained PDFium build, stable CLI/Python docs, and hosted demo work remain blocked on explicit claim-audit and release-scope decisions | Release 1 claim audit + source-only public-beta checkpoint | +| E | weeks 31-40 | Initial source-only prep scope in [`docs/milestone-e-prep-scope.md`](milestone-e-prep-scope.md), with current internal prep closeout recorded in [`docs/validation/milestone-e-final-closeout-validation-2026-06-20.md`](validation/milestone-e-final-closeout-validation-2026-06-20.md); source-only public beta evaluation is tracked in [`docs/milestone-e-public-beta-approval-prep.json`](milestone-e-public-beta-approval-prep.json) with exact wording and exclusions; current-main source-only public beta approval is recorded in [`docs/validation/milestone-e-public-beta-current-main-source-only-approval-validation-2026-06-21.md`](validation/milestone-e-public-beta-current-main-source-only-approval-validation-2026-06-21.md); package publication approval prep is tracked in [`docs/milestone-e-package-publication-approval-prep.json`](milestone-e-package-publication-approval-prep.json) as internal Rust crate publication prep only, with evidence, metadata-readiness, dry-run/smoke, version/tag policy, PDFium boundary, dependency-ordering, and approval resolution-plan records under `docs/validation/`; current-main public-facing readiness is tracked in [`docs/milestone-e-public-facing-readiness-ledger.json`](milestone-e-public-facing-readiness-ledger.json) without approving package publication; current-main source-only public beta refresh prep is tracked in [`docs/milestone-e-public-beta-current-main-refresh-prep.json`](milestone-e-public-beta-current-main-refresh-prep.json) without changing approved wording or approving package publication; actual package publication, later public-report, project-maintained PDFium build, stable CLI/Python docs, and hosted demo work remain blocked on explicit claim-audit and release-scope decisions | Release 1 claim audit + source-only public-beta checkpoint | | F / Release 2 | post-E | Complex tables, formula/LaTeX, chart classification, optional enrichment modules (never base) | Scoped after E from beta fixtures | Fallback charter: ADR-0005 selected `PROCEED`. If a future Gate Zero successor decision rejects diff --git a/docs/validation/README.md b/docs/validation/README.md index 7e573f0..f9f87e8 100644 --- a/docs/validation/README.md +++ b/docs/validation/README.md @@ -328,6 +328,13 @@ recording the exact current-main source candidate and required follow-up evidenc inputs; the record keeps package publication and public installation blocked while recording the missing version map, package tag, source binding, manifest activation diff, registry-backed assembly evidence, public installation wording, and posture/claims rerun requirements. +- `milestone-e-package-publication-approval-resolution-plan-validation-2026-06-21.md` - package + publication approval resolution-plan validation for the package publication approval resolution + plan and current gap ledger; the resolution plan record binds the future exact decision review + to current source commit `524535a` / tree + `0785ffca8423c42e2c4105df7752e290cc88e5c2`, orders the remaining version, tag, manifest, + registry-backed assembly, public installation wording, and posture/claims inputs, and records + that package publication remains blocked and public installation remains blocked. - `milestone-e-public-facing-readiness-ledger-validation-2026-06-21.md` - public-facing readiness ledger validation recorded `docs/milestone-e-public-facing-readiness-ledger.json` as a current-main refresh candidate and package-publication gap-retention artifact; current main diff --git a/docs/validation/milestone-e-package-publication-approval-resolution-plan-validation-2026-06-21.md b/docs/validation/milestone-e-package-publication-approval-resolution-plan-validation-2026-06-21.md new file mode 100644 index 0000000..9456a0d --- /dev/null +++ b/docs/validation/milestone-e-package-publication-approval-resolution-plan-validation-2026-06-21.md @@ -0,0 +1,126 @@ +# Milestone E Package Publication Approval Resolution Plan Validation - 2026-06-21 + +## Purpose + +Record the next package publication approval resolution plan from the current gap ledger without +selecting a package version, creating a package tag, changing manifests, activating dependency +manifests, creating a registry, activating registry-backed dependent package assembly, inviting +public installation, or approving package publication. + +## Status + +Status: **pass for package publication approval resolution-plan validation with publication blocked**. + +Decision: record ordered resolution inputs only. + +Ethos remains source-only pre-alpha outside the approved GitHub source-repository public beta +surface. Package publication remains blocked. Public installation remains blocked. + +## Subject + +- Repository: `docushell/ethos` +- Validated source HEAD before this record: `524535a` +- Current source commit: `524535a621532b5382f91a38d9c3f85d6714a526` +- Current source tree: `0785ffca8423c42e2c4105df7752e290cc88e5c2` +- Lane: package publication +- Ledger state: pre_approval_gaps_recorded_publication_blocked + +## Candidate Surface Inputs + +- ethos-doc-core mapped from crates/ethos-core; package-name migration remains pending +- ethos-verify mapped from crates/ethos-verify; dependency manifest activation remains pending +- ethos-pdf mapped from crates/ethos-pdf; dependency manifest activation and PDFium boundary confirmation must remain current +- wheels +- npm packages +- binaries +- hosted surfaces +- production positioning +- public benchmark reports +- public benchmark claims +- release artifacts +- project-maintained PDFium builds + +## Gap Rows + +- version map gap: no package publication version is selected; requires exact SemVer package version or per-crate version map +- tag name gap: no package tag is created; requires exact package tag name +- tag binding gap: no package_tag_source_commit or source tree is selected; requires exact source commit and tree binding +- manifest activation gap: current Cargo manifests remain unchanged; requires exact package-name migration and dependency activation diff +- registry assembly gap: no registry-backed dependent package assembly is activated; requires exact non-public assembly evidence +- public installation wording gap: no public installation wording is approved; requires exact wording and exclusions +- posture and claims gate gap: gates must rerun after exact public installation wording changes + +## Blocked Actions + +- selecting a package publication version remains blocked +- creating a package tag remains blocked +- changing Cargo manifests remains blocked +- activating package dependency manifests remains blocked +- creating a registry remains blocked +- activating registry-backed dependent package assembly remains blocked +- inviting public installation remains blocked +- approving package publication remains blocked + +## Required Resolution Inputs + +- exact package publication approval decision record +- exact candidate crate list +- exact SemVer package version or per-crate version map +- exact package tag name +- exact package_tag_source_commit and package source tree +- exact package-name migration diff for ethos-doc-core +- exact dependency manifest activation diff for ethos-verify and ethos-pdf +- exact registry-backed dependent package assembly evidence +- exact public installation wording and explicit exclusions +- posture and claims gates after exact public installation wording changes + +## Non-Approvals + +- this ledger does not select a package publication version +- this ledger does not create a package tag +- this ledger does not change Cargo manifests +- this ledger does not activate package dependency manifests +- this ledger does not create a registry +- this ledger does not activate registry-backed dependent package assembly +- this ledger does not invite public installation +- this ledger does not approve package publication + +## Retained Blockers + +- no package publication version is selected +- no package tag is created +- no package dependency manifest activation is approved +- no registry-backed dependent package assembly activation is approved +- public installation remains blocked +- package publication remains blocked +- real-version cargo publish remains blocked +- Public reports remain blocked +- Public result wording remains blocked + +## Public Installation Wording + +No public installation wording is approved; public installation remains blocked. + +## Commands + +```sh +python3 .github/scripts/test_milestone_e_package_publication_approval_prep.py +python3 .github/scripts/test_milestone_e_package_publication_pre_approval_gap_ledger.py +python3 .github/scripts/test_milestone_e_package_publication_approval_resolution_plan.py +python3 .github/scripts/test_public_surface_posture.py +python3 .github/scripts/claims_gate.py +make milestone-e-prep PYTHON=/bin/python +git diff --check +``` + +## Result + +```text +Package publication approval resolution-plan validation passed +Current source state was recorded for future exact decision review +Manifest publish=false boundaries remained unchanged +Package publication and public installation remained blocked +Public-surface posture and claims gates passed +Milestone E prep target passed +git diff --check passed +```