diff --git a/README.md b/README.md index 5bd698c..cc2db74 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,21 @@ Set `MIGRATIONS_OUTPUT_JSON=1` when running `run_migrations.py` for a machine-re Training Case Engine is the external-facing product training module. The public milestone state is M1-M40, with current product maturity through M40. +Accepted milestone range: M1-M40, with current product maturity through M40. + +Offline validation commands: + +- `.venv/bin/python -m unittest discover -s tests/unit -p "test_*.py"` +- `.venv/bin/python scripts/run_offline_checks.py` + +Accepted user-facing surfaces: + +- Dashboard Training panel +- public API routes +- offline public package import/export +- public error catalog +- public privacy contract coverage + - Acceptance and offline validation: M35 acceptance posture, Training Case acceptance manifest, focused milestone test suites, offline checks, and public validation. - Public API and privacy contracts: API contract coverage, error contract coverage, and privacy contract coverage keep public routes audited while public responses scrub private solution material and internal solution details. - Package smoke and offline registry: offline package smoke covers local import/export with public package, public export, and public output flows; broader offline checks register `training_case_package`. diff --git a/docs/training_case_engine_m1_m6_product_readme.md b/docs/training_case_engine_m1_m6_product_readme.md index 85a1359..8720a58 100644 --- a/docs/training_case_engine_m1_m6_product_readme.md +++ b/docs/training_case_engine_m1_m6_product_readme.md @@ -2,6 +2,23 @@ Training Case Engine is the product-facing training module in AI Exchange. M1-M40 is the current public milestone range, with current product maturity through M40 across public API, package, dashboard, validation, and local deployment guard surfaces. +## Training Case Engine acceptance index + +Accepted milestone range: M1-M40, with current product maturity through M40. + +Offline validation commands: + +- `.venv/bin/python -m unittest discover -s tests/unit -p "test_*.py"` +- `.venv/bin/python scripts/run_offline_checks.py` + +Accepted user-facing surfaces: + +- Dashboard Training panel +- public API routes +- offline public package import/export +- public error catalog +- public privacy contract coverage + ## Milestone Release Index - M1-M28 established persisted training cases, a lightweight HTTP API, a dashboard entry, validation hardening, public package import/export, offline package smoke coverage, product documentation checks, public response plus package smoke privacy hardening, and dashboard/public docs privacy alignment. The M1-M28 product maturity through M28 included API contract coverage, error contract coverage, the fixture/schema contract, the offline checks registry smoke, recursive public payload sanitization, public response privacy contract coverage, package smoke docs/fixture public privacy guards, and dashboard and public docs privacy smoke coverage. diff --git a/tests/unit/test_documentation_consistency.py b/tests/unit/test_documentation_consistency.py index 0418f6b..5ea31aa 100644 --- a/tests/unit/test_documentation_consistency.py +++ b/tests/unit/test_documentation_consistency.py @@ -107,6 +107,19 @@ TRAINING_ACCEPTANCE_VALIDATION_DOC_SNIPPETS = ( "offline checks", "public validation", ) +TRAINING_ACCEPTANCE_INDEX_DOCS = (PROJECT_README, TRAINING_PRODUCT_DOC) +TRAINING_ACCEPTANCE_INDEX_REQUIRED_SNIPPETS = ( + "Accepted milestone range: M1-M40, with current product maturity through M40.", + "Offline validation commands:", + "`.venv/bin/python -m unittest discover -s tests/unit -p \"test_*.py\"`", + "`.venv/bin/python scripts/run_offline_checks.py`", + "Accepted user-facing surfaces:", + "Dashboard Training panel", + "public API routes", + "offline public package import/export", + "public error catalog", + "public privacy contract coverage", +) TRAINING_M41_RELEASE_INDEX_DOCS = (PROJECT_README, TRAINING_PRODUCT_DOC) TRAINING_M41_RELEASE_INDEX_GUARD_TEST_INVENTORY = ( "test_training_readmes_expose_m1_m40_release_index_without_raw_test_modules", @@ -4427,6 +4440,21 @@ TRAINING_M41_RELEASE_INDEX_REQUIRED_SNIPPET_INVENTORY = ( for snippet in TRAINING_ACCEPTANCE_VALIDATION_DOC_SNIPPETS: self.assertIn(snippet, text) + def test_training_readmes_expose_operator_acceptance_index(self) -> None: + for path in TRAINING_ACCEPTANCE_INDEX_DOCS: + text = path.read_text(encoding="utf-8") + with self.subTest(path=path.name): + for snippet in TRAINING_ACCEPTANCE_INDEX_REQUIRED_SNIPPETS: + self.assertIn(snippet, text) + self.assertLess( + text.index("Accepted milestone range:"), + text.index("Offline validation commands:"), + ) + self.assertLess( + text.index("Offline validation commands:"), + text.index("Accepted user-facing surfaces:"), + ) + for path in TRAINING_PUBLIC_PRIVACY_DOCS: text = path.read_text(encoding="utf-8") with self.subTest(path=path.name, surface="manifest_modules"):