From c1d5d06f6d72541d9f8a20f3b24085bcc3c30751 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 26 Jul 2026 17:18:38 +0300 Subject: [PATCH] Accept optional saved-state smoke skips --- scripts/check_1c_verify_reports.py | 67 ++++++++++++++++++-- scripts/check_powershell_scripts.py | 4 ++ scripts/smoke_1c_saved_state_module_write.py | 3 + scripts/verify_1c_adapter_deployment.ps1 | 5 +- 4 files changed, 71 insertions(+), 8 deletions(-) diff --git a/scripts/check_1c_verify_reports.py b/scripts/check_1c_verify_reports.py index 9888a9a..9c4f81f 100644 --- a/scripts/check_1c_verify_reports.py +++ b/scripts/check_1c_verify_reports.py @@ -686,7 +686,14 @@ def validate_saved_state_form( if status not in {"skipped_no_saved_state", "verified_and_rolled_back"}: failures.append({"code": "saved_state_form_status_unexpected", "path": str(path), "status": status}) if status in {"skipped_no_saved_state", "verified_and_rolled_back"}: - validate_saved_state_preflight(preflight, failures, "saved_state_form", path, expected_count_keys=("forms", "scanned", "limit")) + expected_count_keys = ("forms", "limit") if status == "skipped_no_saved_state" else ("forms", "scanned", "limit") + validate_saved_state_preflight( + preflight, + failures, + "saved_state_form", + path, + expected_count_keys=expected_count_keys, + ) if status == "skipped_no_saved_state": if report.get("skipped") is not True: failures.append({"code": "saved_state_form_skip_flag_missing", "path": str(path), "skipped": report.get("skipped")}) @@ -745,7 +752,8 @@ def validate_saved_state_module( write_plan = report.get("write_plan") if isinstance(report.get("write_plan"), dict) else {} preflight = report.get("saved_state_preflight") if isinstance(report.get("saved_state_preflight"), dict) else {} preflight_counts = preflight.get("counts") if isinstance(preflight.get("counts"), dict) else {} - table = table_from_module_ref(report.get("module_ref")) + table = report.get("table") or report.get("saved_state_table") or table_from_module_ref(report.get("module_ref")) + skip_statuses = {"skipped_no_saved_state", "skipped_no_saved_state_candidate"} summary = { "path": str(path), "status": report.get("status"), @@ -763,15 +771,26 @@ def validate_saved_state_module( expect_report_identity(report, failures, label, path, expected_base_id=base_id) if table not in SAVED_STATE_TABLES: failures.append({"code": "saved_state_module_table_unexpected", "path": str(path), "module_ref": report.get("module_ref")}) - if require_write and report.get("status") == "skipped_no_saved_state": + if require_write and report.get("status") in skip_statuses: failures.append({"code": "saved_state_module_write_required", "path": str(path)}) - if report.get("status") not in {"skipped_no_saved_state", "verified_and_rolled_back"}: + if report.get("status") not in skip_statuses | {"verified_and_rolled_back"}: failures.append({"code": "saved_state_module_status_unexpected", "path": str(path), "status": report.get("status")}) if report.get("status") in {"skipped_no_saved_state", "verified_and_rolled_back"}: - validate_saved_state_preflight(preflight, failures, "saved_state_module", path, expected_count_keys=("modules", "scanned", "limit")) - if report.get("status") == "skipped_no_saved_state": + expected_count_keys = ("modules", "limit") if report.get("status") == "skipped_no_saved_state" else ("modules", "scanned", "limit") + validate_saved_state_preflight( + preflight, + failures, + "saved_state_module", + path, + expected_count_keys=expected_count_keys, + ) + if report.get("status") in skip_statuses: if report.get("skipped") is not True: failures.append({"code": "saved_state_module_skip_flag_missing", "path": str(path), "skipped": report.get("skipped")}) + if report.get("status") == "skipped_no_saved_state_candidate": + diagnostics = report.get("diagnostics") if isinstance(report.get("diagnostics"), dict) else {} + if not str(diagnostics.get("message") or "").strip(): + failures.append({"code": "saved_state_module_skip_diagnostics_missing", "path": str(path)}) if report.get("status") == "verified_and_rolled_back": if write_plan.get("allowed") is not True: failures.append({"code": "saved_state_module_write_plan_not_allowed", "path": str(path), "write_plan": write_plan}) @@ -1906,6 +1925,40 @@ def run_self_test() -> dict[str, Any]: if soft["failures"]: failures.append({"code": "self_test_soft_unexpected_failures", "failures": soft["failures"]}) + public_skip_dir = reports_root / "public_skip" + write_self_test_reports(public_skip_dir, base_id="public_skip", composed=False, saved_state_written=False) + public_form_path = public_skip_dir / "saved-state-write-routes-smoke.json" + public_form_report = json.loads(public_form_path.read_text(encoding="utf-8")) + public_form_report["saved_state_preflight"]["counts"].pop("scanned", None) + write_json(public_form_path, public_form_report) + public_module_path = public_skip_dir / "module-stream-write-smoke-script.json" + public_module_report = json.loads(public_module_path.read_text(encoding="utf-8")) + public_module_report.update({ + "status": "skipped_no_saved_state_candidate", + "table": "ConfigCASSave", + "diagnostics": {"message": "no safe saved-state BSL module stream candidates found"}, + }) + public_module_report.pop("module_ref", None) + public_module_report.pop("saved_state_preflight", None) + public_module_report.pop("write_plan", None) + public_module_report.pop("metadata_write", None) + write_json(public_module_path, public_module_report) + public_skip = validate_base("public_skip", public_skip_dir, validator_args()) + if public_skip["failures"]: + failures.append({"code": "self_test_public_skip_unexpected_failures", "failures": public_skip["failures"]}) + public_skip_strict = validate_base( + "public_skip", + public_skip_dir, + validator_args(require_saved_state_write_smoke=True), + ) + public_skip_strict_codes = {str(failure.get("code")) for failure in public_skip_strict["failures"]} + if "saved_state_module_write_required" not in public_skip_strict_codes: + failures.append({ + "code": "self_test_public_skip_strict_expected_failure_missing", + "expected": "saved_state_module_write_required", + "actual": sorted(public_skip_strict_codes), + }) + strict_skip = validate_base( base_id, report_dir, @@ -2339,6 +2392,8 @@ def run_self_test() -> dict[str, Any]: "schema": "onec_verify_reports_self_test.v1", "passed": not failures, "soft": soft, + "public_skip": public_skip, + "public_skip_strict_failure_codes": sorted(public_skip_strict_codes), "strict_skip_failure_codes": sorted(strict_codes), "coverage_failure_codes": sorted(coverage_codes), "consistency_failure_codes": sorted(consistency_codes), diff --git a/scripts/check_powershell_scripts.py b/scripts/check_powershell_scripts.py index 2050721..64c6bb0 100644 --- a/scripts/check_powershell_scripts.py +++ b/scripts/check_powershell_scripts.py @@ -171,6 +171,10 @@ def check_adapter_verify_wiring(scripts: list[Path], executable: str) -> list[st failures.append("verify_1c_adapter_deployment.ps1 must pass --require-write-plan-composition to both REST and MCP selector-chain smoke commands.") if "--allow-empty-saved-state" not in verify_text or "if (-not $RequireSavedStateWriteSmoke)" not in verify_text: failures.append("verify_1c_adapter_deployment.ps1 must allow empty saved-state only when -RequireSavedStateWriteSmoke is not set.") + if '"skipped_no_saved_state_candidate"' not in verify_text: + failures.append("verify_1c_adapter_deployment.ps1 must accept a missing safe module candidate in optional saved-state smoke mode.") + if "$RequireWrite -and $report.status -in $skipStatuses" not in verify_text: + failures.append("verify_1c_adapter_deployment.ps1 must reject all saved-state module skip statuses in strict mode.") if "function Get-DuplicateValues" not in verify_text or "Duplicate BaseId value(s)" not in verify_text: failures.append("verify_1c_adapter_deployment.ps1 must reject duplicate -BaseId values before writing reports.") if "function Normalize-BaseIds" not in verify_text or '-split ","' not in verify_text: diff --git a/scripts/smoke_1c_saved_state_module_write.py b/scripts/smoke_1c_saved_state_module_write.py index b4ac17c..3f17c0b 100644 --- a/scripts/smoke_1c_saved_state_module_write.py +++ b/scripts/smoke_1c_saved_state_module_write.py @@ -99,6 +99,7 @@ def main() -> int: "status": "skipped_no_saved_state_candidate", "skipped": True, "base_id": args.base_id, + "table": args.table, "saved_state_table": args.table, "diagnostics": {"message": str(exc)}, } @@ -127,6 +128,7 @@ def main() -> int: "status": "skipped_no_saved_state", "skipped": True, "base_id": args.base_id, + "table": args.table, "module_ref": module_ref, "saved_state_preflight": {"status": saved_state.get("status"), "counts": saved_state.get("counts")}, } @@ -181,6 +183,7 @@ def main() -> int: "schema": "onec_module_stream_write_smoke.v1", "status": "verified_and_rolled_back", "base_id": args.base_id, + "table": args.table, "module_ref": module_ref, **({"saved_state_preflight": auto_target.get("discovery")} if auto_target else {}), "write_plan": { diff --git a/scripts/verify_1c_adapter_deployment.ps1 b/scripts/verify_1c_adapter_deployment.ps1 index 439e1f1..edf3a34 100644 --- a/scripts/verify_1c_adapter_deployment.ps1 +++ b/scripts/verify_1c_adapter_deployment.ps1 @@ -336,10 +336,11 @@ function Assert-SavedStateModuleWriteReport { [switch]$RequireWrite ) $report = Read-JsonReport -Label $Label -Path $Path - if ($RequireWrite -and $report.status -eq "skipped_no_saved_state") { + $skipStatuses = @("skipped_no_saved_state", "skipped_no_saved_state_candidate") + if ($RequireWrite -and $report.status -in $skipStatuses) { throw "$Label report skipped saved-state module write in strict mode: $Path" } - if ($report.status -notin @("skipped_no_saved_state", "verified_and_rolled_back")) { + if ($report.status -notin ($skipStatuses + @("verified_and_rolled_back"))) { throw "$Label report has unexpected status '$($report.status)': $Path" } if ($report.status -eq "verified_and_rolled_back" -and $report.write_plan.allowed -ne $true) {