From 957287d6005c5d505f578e9e2d644e992298234b Mon Sep 17 00:00:00 2001 From: docushell-admin Date: Sun, 21 Jun 2026 14:23:12 +0530 Subject: [PATCH] Record package publication decision input packet Signed-off-by: docushell-admin --- ...one_e_package_publication_approval_prep.py | 11 + ...ckage_publication_decision_input_packet.py | 207 ++++++++++++++++++ ...t_milestone_e_prep_guard_sequence_index.py | 1 + .../scripts/test_milestone_e_prep_scope.py | 1 + ...est_milestone_e_validation_record_index.py | 4 + .github/workflows/ci.yml | 2 + Makefile | 1 + docs/execution-status.md | 2 + ...e-e-package-publication-approval-prep.json | 73 +++++- docs/milestone-e-prep-scope.md | 5 + docs/roadmap.md | 5 + docs/validation/README.md | 6 + ...sion-input-packet-validation-2026-06-21.md | 135 ++++++++++++ ...kage-publication-approval-prep.schema.json | 166 +++++++++++++- 14 files changed, 617 insertions(+), 2 deletions(-) create mode 100644 .github/scripts/test_milestone_e_package_publication_decision_input_packet.py create mode 100644 docs/validation/milestone-e-package-publication-decision-input-packet-validation-2026-06-21.md diff --git a/.github/scripts/test_milestone_e_package_publication_approval_prep.py b/.github/scripts/test_milestone_e_package_publication_approval_prep.py index 546f708..c5034a5 100644 --- a/.github/scripts/test_milestone_e_package_publication_approval_prep.py +++ b/.github/scripts/test_milestone_e_package_publication_approval_prep.py @@ -92,6 +92,7 @@ "package_tag_creation_prep": "docs/validation/milestone-e-package-publication-tag-creation-prep-validation-2026-06-21.md", "package_decision_bundle_validation": "docs/validation/milestone-e-package-publication-decision-bundle-validation-2026-06-21.md", "package_pre_approval_gap_ledger": "docs/validation/milestone-e-package-publication-pre-approval-gap-ledger-validation-2026-06-21.md", + "package_decision_input_packet": "docs/validation/milestone-e-package-publication-decision-input-packet-validation-2026-06-21.md", } EXPECTED_PUBLICATION_DECISION_INPUTS = { "decision_status": "not_approved_pending_exact_decision", @@ -794,6 +795,10 @@ def test_schema_validation_covers_package_publication_prep(self) -> None: False, schema["$defs"]["package_publication_approval_request_packet"]["additionalProperties"], ) + self.assertEqual( + False, + schema["$defs"]["package_publication_decision_input_packet"]["additionalProperties"], + ) self.assertEqual( False, schema["$defs"]["package_publication_pre_approval_gap_ledger"]["additionalProperties"], @@ -836,6 +841,12 @@ def test_schema_validation_covers_package_publication_prep(self) -> None: "explicit_exclusions" ]["minItems"], ) + self.assertEqual( + 8, + schema["$defs"]["package_publication_decision_input_packet"]["properties"][ + "required_before_approval" + ]["minItems"], + ) self.assertEqual( 7, schema["$defs"]["package_publication_pre_approval_gap_ledger"]["properties"][ diff --git a/.github/scripts/test_milestone_e_package_publication_decision_input_packet.py b/.github/scripts/test_milestone_e_package_publication_decision_input_packet.py new file mode 100644 index 0000000..5034396 --- /dev/null +++ b/.github/scripts/test_milestone_e_package_publication_decision_input_packet.py @@ -0,0 +1,207 @@ +#!/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-decision-input-packet-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" + +SOURCE_COMMIT = "54bf70f57b8c357ec76059e31d203b80ade7c0e4" +SOURCE_SHORT = "54bf70f" +SOURCE_TREE = "5a197bee718e3b31399563340169e9efd4f1317c" +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 MilestoneEPackagePublicationDecisionInputPacketTests(unittest.TestCase): + def test_packet_is_schema_bound_indexed_and_source_bound(self) -> None: + prep = load_json(PREP) + readme = read(VALIDATION_README) + record = normalized(RECORD) + packet = prep["package_publication_decision_input_packet"] + + self.assertIn(RECORD.name, readme) + self.assertIn("package publication decision-input packet validation", re.sub(r"\s+", " ", readme)) + self.assertEqual( + "docs/validation/milestone-e-package-publication-decision-input-packet-validation-2026-06-21.md", + prep["follow_up_records"]["package_decision_input_packet"], + ) + self.assertEqual("decision_input_packet_recorded_publication_blocked", packet["packet_state"]) + self.assertEqual(SOURCE_COMMIT, packet["source_binding"]["candidate_source_commit"]) + self.assertEqual(SOURCE_TREE, packet["source_binding"]["candidate_source_tree"]) + self.assertIn(f"Validated source HEAD before this record: `{SOURCE_SHORT}`", read(RECORD)) + self.assertIn(f"Candidate source commit: `{SOURCE_COMMIT}`", record) + self.assertIn(f"Candidate 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_packet_records_exact_inputs_without_approval(self) -> None: + packet = load_json(PREP)["package_publication_decision_input_packet"] + record = normalized(RECORD) + + self.assertEqual(3, len(packet["candidate_crates"])) + self.assertIn("ethos-doc-core mapped from crates/ethos-core", " ".join(packet["candidate_crates"])) + self.assertIn("ethos-verify mapped from crates/ethos-verify", " ".join(packet["candidate_crates"])) + self.assertIn("ethos-pdf mapped from crates/ethos-pdf", " ".join(packet["candidate_crates"])) + self.assertEqual(3, len(packet["candidate_version_map"])) + self.assertEqual(3, len(packet["candidate_package_tag_names"])) + self.assertEqual(4, len(packet["candidate_manifest_activation_diff"])) + self.assertIn("0.1.0; not selected or approved", " ".join(packet["candidate_version_map"])) + self.assertIn("tag is not created", " ".join(packet["candidate_package_tag_names"])) + self.assertIn("current manifest remains unchanged", " ".join(packet["candidate_manifest_activation_diff"])) + self.assertIn("no registry is created and no assembly is activated", packet["registry_backed_assembly_input"]) + self.assertIn("public installation remains blocked", packet["candidate_public_installation_wording"]) + self.assertIn("this exact decision input packet does not approve package publication", packet["non_approvals"]) + self.assertIn("this exact decision input packet does not invite public installation", packet["non_approvals"]) + self.assertIn("package publication remains blocked", packet["retained_blockers"]) + self.assertIn("public installation remains blocked", packet["retained_blockers"]) + for values in ( + packet["candidate_crates"], + packet["candidate_version_map"], + packet["candidate_package_tag_names"], + packet["candidate_manifest_activation_diff"], + packet["required_before_approval"], + packet["non_approvals"], + packet["retained_blockers"], + ): + for value in values: + self.assertIn(value, record) + + def test_candidate_tags_do_not_exist_and_manifests_remain_inactive(self) -> None: + packet = load_json(PREP)["package_publication_decision_input_packet"] + core_manifest = read(ROOT / "crates/ethos-core/Cargo.toml") + verify_manifest = read(ROOT / "crates/ethos-verify/Cargo.toml") + pdf_manifest = read(ROOT / "crates/ethos-pdf/Cargo.toml") + + for value in packet["candidate_package_tag_names"]: + tag = value.split(": ", maxsplit=1)[1].split(";", maxsplit=1)[0] + self.assertEqual("", git("tag", "--list", tag)) + self.assertIn('name = "ethos-core"', core_manifest) + self.assertIn("publish = false", core_manifest) + self.assertIn('reserved_crates_io_name = "ethos-doc-core"', core_manifest) + self.assertIn('name = "ethos-verify"', verify_manifest) + self.assertIn("publish = false", verify_manifest) + self.assertIn('name = "ethos-pdf"', pdf_manifest) + self.assertIn("publish = false", pdf_manifest) + self.assertNotIn('package = "ethos-doc-core"', verify_manifest) + self.assertNotIn('package = "ethos-doc-core"', pdf_manifest) + + def test_docs_reference_decision_input_packet_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 decision input packet", 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_packet_after_resolution_plan(self) -> None: + make_block = target_block("milestone-e-prep") + ci = read(CI_WORKFLOW) + resolution_guard = "test_milestone_e_package_publication_approval_resolution_plan.py" + packet_guard = "test_milestone_e_package_publication_decision_input_packet.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 + packet_guard, text) + self.assertEqual(1, text.count(prefix + packet_guard)) + self.assertLess(text.index(prefix + resolution_guard), text.index(prefix + packet_guard)) + self.assertLess(text.index(prefix + packet_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 d259475..c522a8b 100644 --- a/.github/scripts/test_milestone_e_prep_guard_sequence_index.py +++ b/.github/scripts/test_milestone_e_prep_guard_sequence_index.py @@ -107,6 +107,7 @@ "$(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_package_publication_decision_input_packet.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 ebd3e83..eb8d454 100644 --- a/.github/scripts/test_milestone_e_prep_scope.py +++ b/.github/scripts/test_milestone_e_prep_scope.py @@ -406,6 +406,7 @@ def test_make_target_is_narrow_and_guarded(self) -> None: "$(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_package_publication_decision_input_packet.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 288cc51..a0e4adb 100644 --- a/.github/scripts/test_milestone_e_validation_record_index.py +++ b/.github/scripts/test_milestone_e_validation_record_index.py @@ -262,6 +262,10 @@ class 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-package-publication-decision-input-packet-validation-2026-06-21.md", + "test_milestone_e_package_publication_decision_input_packet.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 24f2cc8..5eb08c0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -228,6 +228,8 @@ jobs: 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 package publication decision-input packet tests + run: python3 .github/scripts/test_milestone_e_package_publication_decision_input_packet.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 6452995..2b9d5d4 100644 --- a/Makefile +++ b/Makefile @@ -221,6 +221,7 @@ milestone-e-prep: $(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_package_publication_decision_input_packet.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 145db78..5a6f10c 100644 --- a/docs/execution-status.md +++ b/docs/execution-status.md @@ -197,6 +197,8 @@ The current-main source-only public beta approval in `docs/validation/milestone- 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. +The package publication decision input packet in `docs/validation/milestone-e-package-publication-decision-input-packet-validation-2026-06-21.md` records candidate version, tag, source binding, manifest activation, registry-backed assembly, and public installation wording inputs for later review against source commit `54bf70f` / tree `5a197bee718e3b31399563340169e9efd4f1317c`. 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-package-publication-approval-prep.json b/docs/milestone-e-package-publication-approval-prep.json index 306762c..bc6d8fb 100644 --- a/docs/milestone-e-package-publication-approval-prep.json +++ b/docs/milestone-e-package-publication-approval-prep.json @@ -79,7 +79,8 @@ "package_real_version_selection_prep": "docs/validation/milestone-e-package-publication-real-version-selection-prep-validation-2026-06-21.md", "package_tag_creation_prep": "docs/validation/milestone-e-package-publication-tag-creation-prep-validation-2026-06-21.md", "package_decision_bundle_validation": "docs/validation/milestone-e-package-publication-decision-bundle-validation-2026-06-21.md", - "package_pre_approval_gap_ledger": "docs/validation/milestone-e-package-publication-pre-approval-gap-ledger-validation-2026-06-21.md" + "package_pre_approval_gap_ledger": "docs/validation/milestone-e-package-publication-pre-approval-gap-ledger-validation-2026-06-21.md", + "package_decision_input_packet": "docs/validation/milestone-e-package-publication-decision-input-packet-validation-2026-06-21.md" }, "publication_approval_decision_inputs": { "decision_status": "not_approved_pending_exact_decision", @@ -261,6 +262,76 @@ "real-version cargo publish remains blocked" ] }, + "package_publication_decision_input_packet": { + "packet_state": "decision_input_packet_recorded_publication_blocked", + "source_binding": { + "candidate_source_commit": "54bf70f57b8c357ec76059e31d203b80ade7c0e4", + "candidate_source_tree": "5a197bee718e3b31399563340169e9efd4f1317c" + }, + "candidate_crates": [ + "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" + ], + "candidate_version_map": [ + "ethos-doc-core candidate package version for later approval: 0.1.0; not selected or approved", + "ethos-verify candidate package version for later approval: 0.1.0; not selected or approved", + "ethos-pdf candidate package version for later approval: 0.1.0; not selected or approved" + ], + "candidate_package_tag_names": [ + "ethos-doc-core candidate package tag for later approval: ethos-package-ethos-doc-core-0.1.0; tag is not created", + "ethos-verify candidate package tag for later approval: ethos-package-ethos-verify-0.1.0; tag is not created", + "ethos-pdf candidate package tag for later approval: ethos-package-ethos-pdf-0.1.0; tag is not created" + ], + "candidate_manifest_activation_diff": [ + "crates/ethos-core/Cargo.toml candidate package-name migration: package.name ethos-core -> ethos-doc-core; current manifest remains unchanged", + "crates/ethos-verify/Cargo.toml candidate dependency activation: ethos_core package alias points at ethos-doc-core; current manifest remains unchanged", + "crates/ethos-pdf/Cargo.toml candidate dependency activation: ethos_core package alias points at ethos-doc-core; current manifest remains unchanged", + "included candidate crates require later publish-flag activation only after dedicated approval; current manifests remain publish=false" + ], + "registry_backed_assembly_input": "registry-backed dependent package assembly evidence remains required after manifest activation; no registry is created and no assembly is activated", + "candidate_public_installation_wording": "Candidate public installation wording for later review only: Ethos Rust crates are proposed for crates.io installation after dedicated package-publication approval; public installation remains blocked.", + "explicit_exclusions": [ + "wheels", + "npm packages", + "binaries", + "hosted surfaces", + "production positioning", + "public benchmark reports", + "public benchmark claims", + "release artifacts", + "project-maintained PDFium builds" + ], + "required_before_approval": [ + "exact package publication approval decision record", + "decider signoff on the exact candidate version map", + "decider signoff on the exact package tag name set and source binding", + "dedicated manifest activation diff review for ethos-doc-core, ethos-verify, and ethos-pdf", + "registry-backed dependent package assembly evidence after manifest activation", + "public-surface posture check after exact public installation wording changes", + "claims gate after exact public installation wording changes", + "make milestone-e-prep after exact decision record" + ], + "non_approvals": [ + "this exact decision input packet does not select a package publication version", + "this exact decision input packet does not create a package tag", + "this exact decision input packet does not change Cargo manifests", + "this exact decision input packet does not activate package dependency manifests", + "this exact decision input packet does not create a registry", + "this exact decision input packet does not activate registry-backed dependent package assembly", + "this exact decision input packet does not invite public installation", + "this exact decision input packet does not approve package publication" + ], + "retained_blockers": [ + "candidate package version map is recorded but no package publication version is selected", + "candidate package tag names are recorded but no package tag is created", + "candidate manifest activation diff is recorded but no Cargo manifest is changed", + "registry-backed dependent package assembly evidence remains required", + "public installation remains blocked", + "package publication remains blocked", + "real-version cargo publish remains blocked" + ] + }, "package_publication_pre_approval_gap_ledger": { "ledger_state": "pre_approval_gaps_recorded_publication_blocked", "gap_rows": [ diff --git a/docs/milestone-e-prep-scope.md b/docs/milestone-e-prep-scope.md index 1314dcc..6ec9337 100644 --- a/docs/milestone-e-prep-scope.md +++ b/docs/milestone-e-prep-scope.md @@ -112,6 +112,11 @@ The package publication approval resolution plan is recorded in 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 package publication decision input packet is recorded in +`docs/validation/milestone-e-package-publication-decision-input-packet-validation-2026-06-21.md`. +It binds candidate review inputs to source commit `54bf70f` / tree +`5a197bee718e3b31399563340169e9efd4f1317c` 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 4bbc026..daa54aa 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -164,6 +164,11 @@ 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. +The package publication decision input packet is recorded in +[`docs/validation/milestone-e-package-publication-decision-input-packet-validation-2026-06-21.md`](validation/milestone-e-package-publication-decision-input-packet-validation-2026-06-21.md) +for source commit `54bf70f` / tree `5a197bee718e3b31399563340169e9efd4f1317c`. Candidate version, +tag, manifest, assembly, and wording inputs are recorded while 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 diff --git a/docs/validation/README.md b/docs/validation/README.md index f9f87e8..6622945 100644 --- a/docs/validation/README.md +++ b/docs/validation/README.md @@ -335,6 +335,12 @@ recording the exact current-main source candidate and required follow-up evidenc `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-package-publication-decision-input-packet-validation-2026-06-21.md` - package + publication decision-input packet validation for the package publication decision input packet; + the record binds candidate + version, tag, source, manifest, assembly, and wording inputs to source commit `54bf70f` / tree + `5a197bee718e3b31399563340169e9efd4f1317c` while 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-decision-input-packet-validation-2026-06-21.md b/docs/validation/milestone-e-package-publication-decision-input-packet-validation-2026-06-21.md new file mode 100644 index 0000000..0a8a177 --- /dev/null +++ b/docs/validation/milestone-e-package-publication-decision-input-packet-validation-2026-06-21.md @@ -0,0 +1,135 @@ +# Milestone E Package Publication Decision Input Packet Validation - 2026-06-21 + +## Purpose + +Record the package publication decision input packet for later review without selecting a package +publication version, creating package tags, changing Cargo 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 decision-input packet validation with publication blocked**. + +Decision: record exact candidate inputs for later review 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: `54bf70f` +- Candidate source commit: `54bf70f57b8c357ec76059e31d203b80ade7c0e4` +- Candidate source tree: `5a197bee718e3b31399563340169e9efd4f1317c` +- Lane: package publication +- Packet state: `decision_input_packet_recorded_publication_blocked` + +## Candidate Crates + +- 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 + +## Candidate Version Map + +- ethos-doc-core candidate package version for later approval: 0.1.0; not selected or approved +- ethos-verify candidate package version for later approval: 0.1.0; not selected or approved +- ethos-pdf candidate package version for later approval: 0.1.0; not selected or approved + +## Candidate Package Tags + +- ethos-doc-core candidate package tag for later approval: ethos-package-ethos-doc-core-0.1.0; tag is not created +- ethos-verify candidate package tag for later approval: ethos-package-ethos-verify-0.1.0; tag is not created +- ethos-pdf candidate package tag for later approval: ethos-package-ethos-pdf-0.1.0; tag is not created + +## Candidate Manifest Activation Diff + +- crates/ethos-core/Cargo.toml candidate package-name migration: package.name ethos-core -> ethos-doc-core; current manifest remains unchanged +- crates/ethos-verify/Cargo.toml candidate dependency activation: ethos_core package alias points at ethos-doc-core; current manifest remains unchanged +- crates/ethos-pdf/Cargo.toml candidate dependency activation: ethos_core package alias points at ethos-doc-core; current manifest remains unchanged +- included candidate crates require later publish-flag activation only after dedicated approval; current manifests remain publish=false + +## Registry-Backed Assembly Input + +registry-backed dependent package assembly evidence remains required after manifest activation; no +registry is created and no assembly is activated + +## Candidate Public Installation Wording + +Candidate public installation wording for later review only: Ethos Rust crates are proposed for +crates.io installation after dedicated package-publication approval; public installation remains +blocked. + +## Explicit Exclusions + +- wheels +- npm packages +- binaries +- hosted surfaces +- production positioning +- public benchmark reports +- public benchmark claims +- release artifacts +- project-maintained PDFium builds + +## Required Before Approval + +- exact package publication approval decision record +- decider signoff on the exact candidate version map +- decider signoff on the exact package tag name set and source binding +- dedicated manifest activation diff review for ethos-doc-core, ethos-verify, and ethos-pdf +- registry-backed dependent package assembly evidence after manifest activation +- public-surface posture check after exact public installation wording changes +- claims gate after exact public installation wording changes +- make milestone-e-prep after exact decision record + +## Non-Approvals + +- this exact decision input packet does not select a package publication version +- this exact decision input packet does not create a package tag +- this exact decision input packet does not change Cargo manifests +- this exact decision input packet does not activate package dependency manifests +- this exact decision input packet does not create a registry +- this exact decision input packet does not activate registry-backed dependent package assembly +- this exact decision input packet does not invite public installation +- this exact decision input packet does not approve package publication + +## Retained Blockers + +- candidate package version map is recorded but no package publication version is selected +- candidate package tag names are recorded but no package tag is created +- candidate manifest activation diff is recorded but no Cargo manifest is changed +- registry-backed dependent package assembly evidence remains required +- public installation remains blocked +- package publication remains blocked +- real-version cargo publish remains blocked +- Public reports remain blocked +- Public result wording remains blocked + +## Commands + +```sh +python3 .github/scripts/test_milestone_e_package_publication_approval_prep.py +python3 .github/scripts/test_milestone_e_package_publication_approval_resolution_plan.py +python3 .github/scripts/test_milestone_e_package_publication_decision_input_packet.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 decision-input packet validation passed +Candidate version, tag, source, manifest, assembly, and wording inputs were recorded for later review +No package version was selected +No package tag was created +No Cargo manifest was changed +No registry-backed assembly was activated +Package publication and public installation remained blocked +Public-surface posture and claims gates passed +Milestone E prep target passed +git diff --check passed +``` diff --git a/schemas/ethos-milestone-e-package-publication-approval-prep.schema.json b/schemas/ethos-milestone-e-package-publication-approval-prep.schema.json index 536e568..a69df38 100644 --- a/schemas/ethos-milestone-e-package-publication-approval-prep.schema.json +++ b/schemas/ethos-milestone-e-package-publication-approval-prep.schema.json @@ -25,6 +25,7 @@ "semver_package_version_decision_prep", "package_publication_decision_prep_bundle", "package_publication_approval_request_packet", + "package_publication_decision_input_packet", "package_publication_pre_approval_gap_ledger", "public_boundary", "approval_scope", @@ -73,6 +74,9 @@ "package_publication_approval_request_packet": { "$ref": "#/$defs/package_publication_approval_request_packet" }, + "package_publication_decision_input_packet": { + "$ref": "#/$defs/package_publication_decision_input_packet" + }, "package_publication_pre_approval_gap_ledger": { "$ref": "#/$defs/package_publication_pre_approval_gap_ledger" }, @@ -283,7 +287,8 @@ "package_real_version_selection_prep", "package_tag_creation_prep", "package_decision_bundle_validation", - "package_pre_approval_gap_ledger" + "package_pre_approval_gap_ledger", + "package_decision_input_packet" ], "additionalProperties": false, "properties": { @@ -325,6 +330,9 @@ }, "package_pre_approval_gap_ledger": { "const": "docs/validation/milestone-e-package-publication-pre-approval-gap-ledger-validation-2026-06-21.md" + }, + "package_decision_input_packet": { + "const": "docs/validation/milestone-e-package-publication-decision-input-packet-validation-2026-06-21.md" } } }, @@ -568,6 +576,105 @@ } } }, + "package_publication_decision_input_packet": { + "type": "object", + "required": [ + "packet_state", + "source_binding", + "candidate_crates", + "candidate_version_map", + "candidate_package_tag_names", + "candidate_manifest_activation_diff", + "registry_backed_assembly_input", + "candidate_public_installation_wording", + "explicit_exclusions", + "required_before_approval", + "non_approvals", + "retained_blockers" + ], + "additionalProperties": false, + "properties": { + "packet_state": { "const": "decision_input_packet_recorded_publication_blocked" }, + "source_binding": { + "type": "object", + "required": [ + "candidate_source_commit", + "candidate_source_tree" + ], + "additionalProperties": false, + "properties": { + "candidate_source_commit": { + "const": "54bf70f57b8c357ec76059e31d203b80ade7c0e4" + }, + "candidate_source_tree": { + "const": "5a197bee718e3b31399563340169e9efd4f1317c" + } + } + }, + "candidate_crates": { + "type": "array", + "minItems": 3, + "maxItems": 3, + "items": { "$ref": "#/$defs/packet_candidate_crate" }, + "uniqueItems": true + }, + "candidate_version_map": { + "type": "array", + "minItems": 3, + "maxItems": 3, + "items": { "$ref": "#/$defs/exact_packet_candidate_version" }, + "uniqueItems": true + }, + "candidate_package_tag_names": { + "type": "array", + "minItems": 3, + "maxItems": 3, + "items": { "$ref": "#/$defs/exact_packet_candidate_tag" }, + "uniqueItems": true + }, + "candidate_manifest_activation_diff": { + "type": "array", + "minItems": 4, + "maxItems": 4, + "items": { "$ref": "#/$defs/exact_packet_manifest_activation_diff" }, + "uniqueItems": true + }, + "registry_backed_assembly_input": { + "const": "registry-backed dependent package assembly evidence remains required after manifest activation; no registry is created and no assembly is activated" + }, + "candidate_public_installation_wording": { + "const": "Candidate public installation wording for later review only: Ethos Rust crates are proposed for crates.io installation after dedicated package-publication approval; public installation remains blocked." + }, + "explicit_exclusions": { + "type": "array", + "minItems": 9, + "maxItems": 9, + "items": { "$ref": "#/$defs/packet_explicit_exclusion" }, + "uniqueItems": true + }, + "required_before_approval": { + "type": "array", + "minItems": 8, + "maxItems": 8, + "items": { "$ref": "#/$defs/exact_packet_required_before_approval" }, + "uniqueItems": true + }, + "non_approvals": { + "type": "array", + "minItems": 8, + "maxItems": 8, + "items": { "$ref": "#/$defs/exact_packet_non_approval" }, + "uniqueItems": true + }, + "retained_blockers": { + "type": "array", + "minItems": 7, + "maxItems": 7, + "items": { "$ref": "#/$defs/exact_packet_retained_blocker" }, + "uniqueItems": true + } + } + }, "package_publication_pre_approval_gap_ledger": { "type": "object", "required": [ @@ -828,6 +935,63 @@ "real-version cargo publish remains blocked" ] }, + "exact_packet_candidate_version": { + "enum": [ + "ethos-doc-core candidate package version for later approval: 0.1.0; not selected or approved", + "ethos-verify candidate package version for later approval: 0.1.0; not selected or approved", + "ethos-pdf candidate package version for later approval: 0.1.0; not selected or approved" + ] + }, + "exact_packet_candidate_tag": { + "enum": [ + "ethos-doc-core candidate package tag for later approval: ethos-package-ethos-doc-core-0.1.0; tag is not created", + "ethos-verify candidate package tag for later approval: ethos-package-ethos-verify-0.1.0; tag is not created", + "ethos-pdf candidate package tag for later approval: ethos-package-ethos-pdf-0.1.0; tag is not created" + ] + }, + "exact_packet_manifest_activation_diff": { + "enum": [ + "crates/ethos-core/Cargo.toml candidate package-name migration: package.name ethos-core -> ethos-doc-core; current manifest remains unchanged", + "crates/ethos-verify/Cargo.toml candidate dependency activation: ethos_core package alias points at ethos-doc-core; current manifest remains unchanged", + "crates/ethos-pdf/Cargo.toml candidate dependency activation: ethos_core package alias points at ethos-doc-core; current manifest remains unchanged", + "included candidate crates require later publish-flag activation only after dedicated approval; current manifests remain publish=false" + ] + }, + "exact_packet_required_before_approval": { + "enum": [ + "exact package publication approval decision record", + "decider signoff on the exact candidate version map", + "decider signoff on the exact package tag name set and source binding", + "dedicated manifest activation diff review for ethos-doc-core, ethos-verify, and ethos-pdf", + "registry-backed dependent package assembly evidence after manifest activation", + "public-surface posture check after exact public installation wording changes", + "claims gate after exact public installation wording changes", + "make milestone-e-prep after exact decision record" + ] + }, + "exact_packet_non_approval": { + "enum": [ + "this exact decision input packet does not select a package publication version", + "this exact decision input packet does not create a package tag", + "this exact decision input packet does not change Cargo manifests", + "this exact decision input packet does not activate package dependency manifests", + "this exact decision input packet does not create a registry", + "this exact decision input packet does not activate registry-backed dependent package assembly", + "this exact decision input packet does not invite public installation", + "this exact decision input packet does not approve package publication" + ] + }, + "exact_packet_retained_blocker": { + "enum": [ + "candidate package version map is recorded but no package publication version is selected", + "candidate package tag names are recorded but no package tag is created", + "candidate manifest activation diff is recorded but no Cargo manifest is changed", + "registry-backed dependent package assembly evidence remains required", + "public installation remains blocked", + "package publication remains blocked", + "real-version cargo publish remains blocked" + ] + }, "pre_approval_gap_row": { "enum": [ "version map gap: no package publication version is selected; requires exact SemVer package version or per-crate version map",