diff --git a/.github/scripts/test_ci_workflow.py b/.github/scripts/test_ci_workflow.py index 2bd08a68..4f1971ef 100644 --- a/.github/scripts/test_ci_workflow.py +++ b/.github/scripts/test_ci_workflow.py @@ -50,6 +50,7 @@ def test_ci_workflow_guard_is_run_by_ci(self) -> None: self.assertIn("python3 .github/scripts/test_milestone_b_internal_checks.py", text) self.assertIn("python3 .github/scripts/test_execution_status.py", text) self.assertIn("python3 .github/scripts/test_roadmap_status.py", text) + self.assertIn("python3 .github/scripts/test_milestone_b_closeout_record.py", text) if __name__ == "__main__": diff --git a/.github/scripts/test_milestone_b_closeout_record.py b/.github/scripts/test_milestone_b_closeout_record.py new file mode 100644 index 00000000..580ede29 --- /dev/null +++ b/.github/scripts/test_milestone_b_closeout_record.py @@ -0,0 +1,73 @@ +#!/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 re +import unittest +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[2] +RECORD = ROOT / "docs/validation/milestone-b-closeout-validation-2026-06-17.md" +VALIDATION_README = ROOT / "docs/validation/README.md" + + +def record_text() -> str: + return RECORD.read_text(encoding="utf-8") + + +def normalized_record_text() -> str: + return re.sub(r"\s+", " ", record_text()) + + +class MilestoneBCloseoutRecordTests(unittest.TestCase): + def test_record_is_indexed(self) -> None: + text = VALIDATION_README.read_text(encoding="utf-8") + + self.assertIn("milestone-b-closeout-validation-2026-06-17.md", text) + + def test_record_names_internal_validation_command(self) -> None: + text = record_text() + + self.assertIn("make milestone-b-internal-checks PYTHON=/bin/python", text) + self.assertIn("fixtures/validate_fixtures.py", text) + self.assertIn("make verify-alpha", text) + self.assertIn("make layout-evaluator-alpha", text) + self.assertIn("make python-surface-test", text) + self.assertIn(".github/scripts/claims_gate.py", text) + self.assertIn(".github/scripts/readiness_gate.py public", text) + + def test_record_keeps_public_boundaries_explicit(self) -> None: + text = normalized_record_text() + + self.assertIn("does not approve public benchmark reports", text) + self.assertIn("release artifacts", text) + self.assertIn("package publication", text) + self.assertIn("production positioning", text) + self.assertIn("Performance, quality, footprint, table-quality, and parser-quality claims remain blocked", text) + + def test_record_avoids_local_private_paths(self) -> None: + text = record_text() + + self.assertNotIn("/Users/", text) + self.assertNotIn("/private/tmp", text) + self.assertNotIn("/private/var", text) + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/scripts/test_milestone_b_internal_checks.py b/.github/scripts/test_milestone_b_internal_checks.py index d18d7a53..c91a6cd1 100644 --- a/.github/scripts/test_milestone_b_internal_checks.py +++ b/.github/scripts/test_milestone_b_internal_checks.py @@ -62,6 +62,7 @@ def test_target_composes_current_internal_gates(self) -> None: "$(PYTHON) schemas/test_font_policy_validation.py", "$(PYTHON) .github/scripts/test_execution_status.py", "$(PYTHON) .github/scripts/test_roadmap_status.py", + "$(PYTHON) .github/scripts/test_milestone_b_closeout_record.py", "$(MAKE) verify-alpha PYTHON=$(PYTHON)", "$(MAKE) layout-evaluator-alpha PYTHON=$(PYTHON)", "$(MAKE) python-surface-test PYTHON=$(PYTHON)", diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e7850539..ba22e3b2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,6 +62,8 @@ jobs: run: python3 .github/scripts/test_execution_status.py - name: roadmap status tests run: python3 .github/scripts/test_roadmap_status.py + - name: Milestone B closeout validation record tests + run: python3 .github/scripts/test_milestone_b_closeout_record.py - name: Gate Zero harness tests run: python3 benchmarks/harness/test_run_gate_zero.py - name: same-platform double-parse byte-diff diff --git a/Makefile b/Makefile index abf4a9d8..6c1b324b 100644 --- a/Makefile +++ b/Makefile @@ -53,6 +53,7 @@ milestone-b-internal-checks: $(PYTHON) schemas/test_font_policy_validation.py $(PYTHON) .github/scripts/test_execution_status.py $(PYTHON) .github/scripts/test_roadmap_status.py + $(PYTHON) .github/scripts/test_milestone_b_closeout_record.py $(MAKE) verify-alpha PYTHON=$(PYTHON) $(MAKE) layout-evaluator-alpha PYTHON=$(PYTHON) $(MAKE) python-surface-test PYTHON=$(PYTHON) diff --git a/docs/validation/README.md b/docs/validation/README.md index b75eb654..daba668f 100644 --- a/docs/validation/README.md +++ b/docs/validation/README.md @@ -22,6 +22,9 @@ Records: non-advisory `cargo-deny` policy checks pass; the follow-up advisory scan is recorded in `advisory-scan-2026-06-16.md`, and release artifacts still need artifact-specific license/NOTICE bundles. +- `milestone-b-closeout-validation-2026-06-17.md` - internal Milestone B closeout validation + passed through `make milestone-b-internal-checks`; public benchmark reports, release artifacts, + package publication, production positioning, and claim wording remain blocked. - `public-evidence-scan-2026-06-15.md` - tracked evidence and benchmark-result locations were scanned for private paths, hostnames, and generated Gate Zero output that belongs in `ethos-bench`. diff --git a/docs/validation/milestone-b-closeout-validation-2026-06-17.md b/docs/validation/milestone-b-closeout-validation-2026-06-17.md new file mode 100644 index 00000000..a5221ddb --- /dev/null +++ b/docs/validation/milestone-b-closeout-validation-2026-06-17.md @@ -0,0 +1,74 @@ +# Milestone B Closeout Validation - 2026-06-17 + +## Purpose + +Record the current internal Milestone B validation run after the status and roadmap closeout +guards landed on `main`. + +This record covers the source tree's internal pre-alpha validation path only. It does not approve +public benchmark reports, release artifacts, package publication, production positioning, or +performance, quality, or footprint claims. + +## Status + +Status: **pass for current internal Milestone B validation, with public blockers unchanged**. + +## Subject + +- Repository: `docushell/ethos` +- Starting HEAD before this record: `cc1fda28d68c549dbf9a478aa89cbc99df7960ca` +- Scope: tracked source tree, committed fixtures, committed examples, CI/static guard wiring, and + public-boundary gates +- Excluded: benchmark-result publication, release artifacts, package publication, production + positioning, and external claim wording + +## Commands + +```sh +git switch main +git pull --ff-only +make milestone-b-internal-checks PYTHON=/bin/python +``` + +The aggregate target currently composes: + +- `fixtures/validate_fixtures.py` +- `schemas/test_font_policy_validation.py` +- `.github/scripts/test_execution_status.py` +- `.github/scripts/test_roadmap_status.py` +- `make verify-alpha` +- `make layout-evaluator-alpha` +- `make python-surface-test` +- `.github/scripts/claims_gate.py` +- `.github/scripts/readiness_gate.py public` +- `git diff --check` + +## Result + +```text +fixture checks green +font policy validation tests green +execution status tests green +roadmap status tests green +verify-alpha green +layout-evaluator-alpha green +python surface tests green +claims gate green +public readiness: green +git diff --check green +``` + +## Remaining Boundaries + +- Public benchmark reports remain blocked. +- Release artifacts and package publication remain blocked. +- Production positioning remains blocked. +- Performance, quality, footprint, table-quality, and parser-quality claims remain blocked. +- Cross-platform rendered image byte equality remains unclaimed. +- Broader parser/layout/table/OCR semantics remain future work outside this closeout record. + +## Follow-up + +Use `make milestone-b-internal-checks` as the internal closeout validation command until the next +milestone changes the validation contract. Contract changes should update the Make target, its +static guard, and any dated validation record that cites the target.