diff --git a/README.md b/README.md index 6036801..eee0bfe 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Set `MIGRATIONS_OUTPUT_JSON=1` when running `run_migrations.py` for a machine-re - `python3 scripts/run_backtest.py` - run backtest and write results - `python3 scripts/run_autonomous_cycle.py` - run the unattended cycle: offline checks, database probe, readiness checks, then guarded pipeline when the database is available; prints `Next actions` for the next unattended step - `python3 scripts/run_database_readiness.py` - run read-only database readiness checks for connection, schema, seed data, and candle availability; prints `next_actions` and `action_plan` in JSON mode -- `.venv/bin/python scripts/run_offline_checks.py` - run the broader offline check suite, including the Training Case package smoke registered as `training_case_package`, dashboard syntax validation as `dashboard_js_syntax`, and dashboard and public docs privacy smoke coverage +- `.venv/bin/python scripts/run_offline_checks.py` - run the broader offline check suite, including the M35 acceptance posture through the Training Case acceptance manifest for focused milestone test suites, the Training Case package smoke registered as `training_case_package`, dashboard syntax validation as `dashboard_js_syntax`, and dashboard and public docs privacy smoke coverage; this public validation runs as offline checks without external services - `.venv/bin/python scripts/run_training_case_package.py --input tests/fixtures/training_case_package_m6.json --output /tmp/training_case_public_export.json` - run the Training Case offline package smoke, an import/export smoke with local files, and write public output as the public export in the public package shape; exported public JSON omits internal solution details - `python3 scripts/run_migration_static_checks.py` - check migration order and required core schema without connecting to the database - `python3 scripts/run_script_static_checks.py` - check automation scripts for unsafe ambient environment fallback patterns diff --git a/docs/training_case_engine_m1_m6_product_readme.md b/docs/training_case_engine_m1_m6_product_readme.md index 5642046..3badedf 100644 --- a/docs/training_case_engine_m1_m6_product_readme.md +++ b/docs/training_case_engine_m1_m6_product_readme.md @@ -4,6 +4,8 @@ Training Case Engine is the product-facing training module in AI Exchange. M1-M2 Current product maturity through M28 includes 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. +The M35 acceptance posture adds public validation through the Training Case acceptance manifest, focused milestone test suites, and offline checks. + ## Dashboard Entry Run the local API server with the project script and open the root dashboard. The dashboard includes a Training panel with: @@ -49,6 +51,10 @@ The broader offline check suite also includes this package smoke as `training_ca .venv/bin/python scripts/run_offline_checks.py ``` +## Acceptance And Offline Validation + +The M35 acceptance posture uses the Training Case acceptance manifest to keep focused milestone test suites discoverable and aligned with the offline checks. The broader offline checks include the public package smoke, dashboard syntax validation, and dashboard and public docs privacy smoke coverage without external services. + ## Validation And Errors - Malformed or non-object request bodies return `400` with `invalid_json_body`. diff --git a/tests/unit/test_documentation_consistency.py b/tests/unit/test_documentation_consistency.py index 34086bf..8a189d3 100644 --- a/tests/unit/test_documentation_consistency.py +++ b/tests/unit/test_documentation_consistency.py @@ -96,6 +96,13 @@ TRAINING_DASHBOARD_PUBLIC_WORDING = ( "attempt submit", "public case fields only", ) +TRAINING_ACCEPTANCE_VALIDATION_DOC_SNIPPETS = ( + "M35 acceptance posture", + "Training Case acceptance manifest", + "focused milestone test suites", + "offline checks", + "public validation", +) TRAINING_PUBLIC_PRIVACY_DOCS = (PROJECT_README, TRAINING_PRODUCT_DOC, TRAINING_PACKAGE_SMOKE_DOC) TRAINING_PUBLIC_PRIVACY_FORBIDDEN_TERMS = ( "answer" + "_key", @@ -368,6 +375,15 @@ class DocumentationConsistencyTests(unittest.TestCase): with self.subTest(check_name=check_name): self.assertEqual(registry_text.count(f'"{check_name}"'), 1) + def test_training_readmes_describe_acceptance_manifest_offline_validation_posture(self) -> None: + for path in (PROJECT_README, TRAINING_PRODUCT_DOC): + text = path.read_text(encoding="utf-8") + with self.subTest(path=path.name): + for snippet in TRAINING_ACCEPTANCE_VALIDATION_DOC_SNIPPETS: + self.assertIn(snippet, text) + for module in TRAINING_CASE_ACCEPTANCE_TEST_MANIFEST: + self.assertNotIn(module, text) + def test_training_case_product_doc_names_public_response_privacy_contracts(self) -> None: text = TRAINING_PRODUCT_DOC.read_text(encoding="utf-8")