diff --git a/README.md b/README.md index 293cbca..3c7fa6b 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,16 @@ Set `MIGRATIONS_OUTPUT_JSON=1` when running `run_migrations.py` for a machine-re `OKX -> candles -> market_sessions -> swings -> dealing_ranges -> liquidity_pools -> sweep_events -> displacement_events -> MSS -> FVG -> bias_snapshots -> trade_signals -> trade_executions -> backtest_runs -> backtest_results -> reports` +## Training Case Engine milestone index + +Training Case Engine is the external-facing product training module. The public milestone state is M1-M40, with current product maturity through M40. + +- 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`. +- Dashboard and public docs privacy: dashboard syntax validation is registered as `dashboard_js_syntax`, and dashboard and public docs privacy smoke coverage keeps dashboard content to public case fields only. +- Local Docker guard: single-set local Docker deployment uses the documented rebuild order and Docker smoke guard coverage for one active deployment set, one `ai-ict` container, and `healthy` status. + ## Local Docker deployment Use the single-set local Docker deployment policy for local server deployment: diff --git a/docs/training_case_engine_m1_m6_product_readme.md b/docs/training_case_engine_m1_m6_product_readme.md index 6eebebb..cd54afb 100644 --- a/docs/training_case_engine_m1_m6_product_readme.md +++ b/docs/training_case_engine_m1_m6_product_readme.md @@ -1,10 +1,13 @@ -# Training Case Engine M1-M28 Product README +# Training Case Engine M1-M40 Product README -Training Case Engine is the product-facing training module in AI Exchange. M1-M28 provide 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. +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. -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. +## Milestone Release Index -The M35 acceptance posture adds public validation through the Training Case acceptance manifest, focused milestone test suites, and offline checks. +- 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. +- M29-M34 kept package smoke docs, fixture/public output, offline registry references, dashboard privacy, and public route documentation audited for public package, public export, and public output workflows. +- M35 acceptance posture added public validation through the Training Case acceptance manifest, focused milestone test suites, and offline checks. +- M36-M40 locks API contract coverage, error contract coverage, privacy contract coverage, package smoke and offline registry coverage, dashboard and public docs privacy smoke coverage, and single-set local Docker deployment plus Docker smoke guard coverage. ## Dashboard Entry diff --git a/tests/unit/test_documentation_consistency.py b/tests/unit/test_documentation_consistency.py index 4dec0f2..4b75ad5 100644 --- a/tests/unit/test_documentation_consistency.py +++ b/tests/unit/test_documentation_consistency.py @@ -13,12 +13,12 @@ TRAINING_DASHBOARD_HTML = ROOT / "src" / "web" / "index.html" TRAINING_DASHBOARD_APP = ROOT / "src" / "web" / "app.js" API_SERVER = ROOT / "src" / "api" / "server.py" OFFLINE_CHECKS_SCRIPT = ROOT / "scripts" / "run_offline_checks.py" -CURRENT_TRAINING_DOC_MATURITY_END = 28 +CURRENT_TRAINING_DOC_MATURITY_END = 40 CURRENT_TRAINING_DOC_MATURITY_MARKER = f"M1-M{CURRENT_TRAINING_DOC_MATURITY_END}" CURRENT_TRAINING_DOC_MATURITY_SPAN = f"through M{CURRENT_TRAINING_DOC_MATURITY_END}" TRAINING_M24_M29_DOCUMENTATION_TEST_INVENTORY = { - "m1_m28_maturity_wording": ( - "test_training_case_product_doc_reflects_current_m28_maturity", + "m1_m40_maturity_wording": ( + "test_training_case_product_doc_reflects_current_m40_maturity", ), "route_surface": ( "test_training_case_product_doc_api_routes_match_server_route_request", @@ -103,6 +103,28 @@ TRAINING_ACCEPTANCE_VALIDATION_DOC_SNIPPETS = ( "offline checks", "public validation", ) +TRAINING_M41_RELEASE_INDEX_DOC_SNIPPETS = ( + CURRENT_TRAINING_DOC_MATURITY_MARKER, + CURRENT_TRAINING_DOC_MATURITY_SPAN, + "M35 acceptance posture", + "Training Case acceptance manifest", + "focused milestone test suites", + "offline checks", + "API contract coverage", + "privacy contract coverage", + "package smoke", + "training_case_package", + "dashboard_js_syntax", + "dashboard and public docs privacy smoke coverage", + "single-set local Docker deployment", + "Docker smoke guard coverage", +) +TRAINING_M41_STALE_RELEASE_WORDING = ( + "M1-M39", + "through M39", + "through-M39", +) +TRAINING_RAW_TEST_MODULE_PATTERN = r"\btest_training_[a-z0-9_]+" TRAINING_PUBLIC_PRIVACY_DOCS = (PROJECT_README, TRAINING_PRODUCT_DOC, TRAINING_PACKAGE_SMOKE_DOC) TRAINING_PUBLIC_PRIVACY_FORBIDDEN_TERMS = ( "answer" + "_key", @@ -350,7 +372,7 @@ class DocumentationConsistencyTests(unittest.TestCase): with self.subTest(snippet=snippet): self.assertIn(snippet, text) - def test_training_case_product_doc_reflects_current_m28_maturity(self) -> None: + def test_training_case_product_doc_reflects_current_m40_maturity(self) -> None: text = TRAINING_PRODUCT_DOC.read_text(encoding="utf-8") for snippet in ( @@ -365,10 +387,21 @@ class DocumentationConsistencyTests(unittest.TestCase): with self.subTest(snippet=snippet): self.assertIn(snippet, text) - for stale_snippet in ("M1-M25", "through M25"): + for stale_snippet in ("M1-M25", "through M25", *TRAINING_M41_STALE_RELEASE_WORDING): with self.subTest(stale_snippet=stale_snippet): self.assertNotIn(stale_snippet, text) + def test_training_readmes_expose_m1_m40_release_index_without_raw_test_modules(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_M41_RELEASE_INDEX_DOC_SNIPPETS: + self.assertIn(snippet, text) + for stale_snippet in TRAINING_M41_STALE_RELEASE_WORDING: + self.assertNotIn(stale_snippet, text) + self.assertIsNone(re.search(TRAINING_RAW_TEST_MODULE_PATTERN, text)) + def test_training_case_m24_m29_documentation_test_inventory_is_current(self) -> None: test_names = set( _test_method_names_from_file(Path(__file__), "DocumentationConsistencyTests") @@ -388,7 +421,7 @@ class DocumentationConsistencyTests(unittest.TestCase): self.assertEqual(len(unique_inventory_names), 7) self.assertEqual(sorted(TRAINING_M24_M29_DOCUMENTATION_TEST_INVENTORY), [ "dashboard_public_docs_privacy", - "m1_m28_maturity_wording", + "m1_m40_maturity_wording", "offline_registry_coverage", "route_surface", ])