import json import os import subprocess import sys from pathlib import Path from flask import Flask from sqlalchemy import create_engine, text from database.manager import Base from services.market_intel import MarketIntelService from services.market_intel.service import MARKET_INTEL_TABLES from services.market_intel.adapters import get_adapter, get_adapter_summaries from services.market_intel.candidate_preview import build_candidate_preview_from_discovery from services.market_intel.discovery_runner import ManualDiscoveryRunner from services.market_intel.html_diagnostics import parse_html_diagnostics from services.market_intel.mcp_activation_evidence import build_mcp_activation_evidence_preview from services.market_intel.mcp_activation_runbook import build_mcp_activation_runbook_preview from services.market_intel.mcp_completion_audit import build_mcp_completion_audit_preview from services.market_intel.mcp_contract import build_mcp_tool_contract_preview from services.market_intel.mcp_deploy_preflight import build_mcp_deploy_preflight_plan from services.market_intel.mcp_fetch_gate import build_mcp_fetch_gate_preview from services.market_intel.mcp_fetch_run_package import ( build_mcp_fetch_run_package_preview, ) from services.market_intel.mcp_fetch_run_readiness import ( build_mcp_fetch_run_readiness_preview, ) from services.market_intel.mcp_fetch_run_receipt import ( build_mcp_fetch_run_receipt_preview, ) from services.market_intel.mcp_fetch_result_parser_review import ( build_mcp_fetch_result_parser_review_preview, ) from services.market_intel.mcp_fetch_candidate_handoff_review import ( build_mcp_fetch_candidate_handoff_review_preview, ) from services.market_intel.mcp_fetch_candidate_queue_review import ( build_mcp_fetch_candidate_queue_review_preview, ) from services.market_intel.mcp_fetch_candidate_queue_writer_preflight import ( build_mcp_fetch_candidate_queue_writer_preflight_preview, ) from services.market_intel.mcp_fetch_candidate_queue_writer_cli_review import ( build_mcp_fetch_candidate_queue_writer_cli_review_preview, ) from services.market_intel.mcp_fetch_candidate_queue_writer_run_package_review import ( build_mcp_fetch_candidate_queue_writer_run_package_review_preview, ) from services.market_intel.mcp_fetch_candidate_queue_writer_run_readiness import ( build_mcp_fetch_candidate_queue_writer_run_readiness_preview, ) from services.market_intel.mcp_fetch_candidate_queue_writer_run_receipt_review import ( build_mcp_fetch_candidate_queue_writer_run_receipt_review_preview, ) from services.market_intel.mcp_fetch_candidate_queue_writer_run_closeout_review import ( build_mcp_fetch_candidate_queue_writer_run_closeout_review_preview, ) from services.market_intel.mcp_fetch_candidate_queue_writer_post_closeout_inventory_review import ( build_mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_preview, ) from services.market_intel.mcp_fetch_candidate_queue_writer_review_handoff import ( build_mcp_fetch_candidate_queue_writer_review_handoff_preview, ) from services.market_intel.mcp_fetch_candidate_queue_writer_review_inventory import ( build_mcp_fetch_candidate_queue_writer_review_inventory_preview, ) from services.market_intel.mcp_fetch_candidate_queue_writer_review_decision import ( build_mcp_fetch_candidate_queue_writer_review_decision_preview, ) from services.market_intel.mcp_fetch_candidate_queue_writer_review_decision_approval import ( build_mcp_fetch_candidate_queue_writer_review_decision_approval_preview, ) from services.market_intel.mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight import ( build_mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_preview, ) from services.market_intel.mcp_professional_source_governance import ( build_mcp_professional_source_governance_preview, ) from services.market_intel.mcp_fetch_target_source_governance_review import ( build_mcp_fetch_target_source_governance_review_preview, ) from services.market_intel.mcp_fetch_target_review import ( build_mcp_fetch_target_review_preview, ) from services.market_intel.mcp_manual_fetch_handoff import ( build_mcp_manual_fetch_handoff_preview, ) from services.market_intel.mcp_readiness import build_mcp_readiness_plan from services.market_intel.mcp_runtime_promotion import build_mcp_runtime_promotion_preview from services.market_intel.mcp_runtime_smoke_receipt import build_mcp_runtime_smoke_receipt_preview from services.market_intel.live_db_inventory import build_live_db_inventory_preview from services.market_intel.manual_sample_review import evaluate_manual_sample_result from services.market_intel.platform_seed_db_diff import build_platform_seed_db_diff_plan from services.market_intel.schema_db_probe import build_schema_db_probe_plan TEST_APPROVAL_TOKEN = "test-market-intel-approval-token" def _market_intel_sample_result(batch_id="sample-batch-receipt"): return { "batch_id": batch_id, "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "b" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } def _build_candidate_queue_writer_receipt_fixture(batch_id="sample-batch-receipt"): from services.market_intel.candidate_queue_writer_cli import ( build_candidate_queue_writer_cli_plan, ) from services.market_intel.candidate_queue_writer_operator_drill import ( build_candidate_queue_writer_operator_drill, ) from services.market_intel.candidate_queue_writer_postwrite_smoke import ( build_candidate_queue_writer_postwrite_smoke, ) from services.market_intel.candidate_queue_writer_preflight import ( build_candidate_queue_writer_preflight, ) from services.market_intel.candidate_queue_writer_run_package import ( build_candidate_queue_writer_run_package, ) from services.market_intel.candidate_queue_writer_run_readiness import ( build_candidate_queue_writer_run_readiness, ) service = MarketIntelService() sample_result = _market_intel_sample_result(batch_id=batch_id) transaction = service.build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) preflight = build_candidate_queue_writer_preflight( transaction_preview=transaction, execute_requested=False, ) writer_status = build_candidate_queue_writer_cli_plan( transaction_preview=transaction, writer_preflight=preflight, ) postwrite_smoke = build_candidate_queue_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=False, ) operator_drill = build_candidate_queue_writer_operator_drill( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, ) run_package = build_candidate_queue_writer_run_package( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, operator_drill=operator_drill, ) operator_evidence = { "reviewed_sample_json_path": "artifacts/market_intel/reviewed.json", "backup_artifact_path": "scripts/tools/backups/backup.zip", "preflight_artifact_path": "artifacts/market_intel/preflight.json", "migration_live_smoke_passed": True, "operator_acknowledged_shell_only_token": True, "writer_output_json_path": "artifacts/market_intel/writer-output.json", "postwrite_smoke_json_path": "artifacts/market_intel/postwrite-smoke.json", "operator_confirmed_no_token_in_artifacts": True, "receipt_notes": "small-batch queue writer receipt reviewed", } run_readiness = build_candidate_queue_writer_run_readiness( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, operator_drill=operator_drill, run_package=run_package, operator_evidence=operator_evidence, ) expected_keys = sorted( str(statement["lookup"]["dedupe_key"]) for statement in transaction["statements"] ) writer_output = { "mode": "candidate_queue_writer_cli_executed", "exit_code": 0, "approval_token_present": True, "approval_token_valid": True, "approval_token_secret_configured": True, "approval_env_var": "MARKET_INTEL_QUEUE_WRITE_APPROVAL", "writes_executed": True, "would_write_database": True, "database_connection_opened": True, "explicit_transaction_opened": True, "database_write_executed": True, "database_commit_executed": True, "database_rollback_executed": False, "external_network_executed": False, "scheduler_attached": False, "inserted_count": len(expected_keys), "skipped_count": 0, "affected_dedupe_keys": expected_keys, "skipped_dedupe_keys": [], } postwrite_smoke_result = { "mode": "candidate_queue_writer_postwrite_smoke_read_only", "postwrite_smoke_passed": True, "ready_for_operator_review": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "external_network_executed": False, "scheduler_attached": False, "expected_dedupe_key_count": len(expected_keys), "found_count": len(expected_keys), "missing_count": 0, "found_dedupe_keys": expected_keys, "missing_dedupe_keys": [], "row_summaries": [ { "dedupe_key": key, "review_state": "needs_review", "priority_lane": "watch", "total_score": 82.5, "source_batch_id": batch_id, "created_at": "2026-05-19T12:00:00", "updated_at": "2026-05-19T12:00:00", } for key in expected_keys ], } return { "sample_result": sample_result, "transaction": transaction, "run_readiness": run_readiness, "operator_evidence": operator_evidence, "writer_output": writer_output, "postwrite_smoke_result": postwrite_smoke_result, "expected_keys": expected_keys, } def _build_ready_review_decision_transaction( batch_id="sample-batch-review-decision-writer" ): from services.market_intel.candidate_queue_review_decision import ( build_candidate_queue_review_decision, ) from services.market_intel.candidate_queue_review_decision_approval import ( build_candidate_queue_review_decision_approval, ) from services.market_intel.candidate_queue_review_decision_transaction import ( build_candidate_queue_review_decision_transaction, ) fixture = _build_candidate_queue_writer_receipt_fixture(batch_id) inventory = { "mode": "candidate_queue_review_inventory_preview", "review_inventory_ready": True, "expected_dedupe_keys": fixture["expected_keys"], "row_summaries": [ { "dedupe_key": fixture["expected_keys"][0], "review_state": "needs_review", "priority_lane": "watch", "total_score": 82.5, } ], } decision_evidence = { "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "evidence reviewed manually", "operator_confirmed_manual_decision_only": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_scheduler_attach": True, } approval_evidence = { **decision_evidence, "decision_approval_notes": "approved for cli-only transaction preview", "operator_confirmed_decision_payload_reviewed": True, "operator_confirmed_decision_apply_requires_cli": True, "operator_confirmed_review_state_update_is_not_api": True, } transaction_evidence = { **approval_evidence, "decision_transaction_notes": "payload reviewed for shell transaction", "operator_confirmed_transaction_payload_reviewed": True, "operator_confirmed_cli_only_transaction": True, } decision = build_candidate_queue_review_decision( review_inventory=inventory, operator_evidence=decision_evidence, ) approval = build_candidate_queue_review_decision_approval( review_decision=decision, operator_evidence=approval_evidence, ) transaction = build_candidate_queue_review_decision_transaction( decision_approval=approval, operator_evidence=transaction_evidence, ) return transaction, transaction_evidence def _build_review_decision_writer_receipt_fixture( batch_id="sample-batch-review-decision-writer-closeout" ): from services.market_intel.candidate_queue_review_decision_writer_cli import ( build_candidate_queue_review_decision_writer_cli_plan, ) from services.market_intel.candidate_queue_review_decision_writer_preflight import ( build_candidate_queue_review_decision_writer_preflight, ) from services.market_intel.candidate_queue_review_decision_writer_postwrite_smoke import ( build_candidate_queue_review_decision_writer_postwrite_smoke, ) from services.market_intel.candidate_queue_review_decision_writer_operator_drill import ( build_candidate_queue_review_decision_writer_operator_drill, ) from services.market_intel.candidate_queue_review_decision_writer_run_package import ( build_candidate_queue_review_decision_writer_run_package, ) from services.market_intel.candidate_queue_review_decision_writer_run_readiness import ( build_candidate_queue_review_decision_writer_run_readiness, ) from services.market_intel.candidate_queue_review_decision_writer_run_receipt import ( build_candidate_queue_review_decision_writer_run_receipt, ) transaction, operator_evidence = _build_ready_review_decision_transaction( batch_id ) expected_key = transaction["statements"][0]["lookup"]["dedupe_key"] operator_evidence = { **operator_evidence, "operator_confirmed_manual_shell_window": True, "operator_confirmed_post_update_inventory_planned": True, "operator_drill_notes": "review_state shell drill reviewed", } writer_status = build_candidate_queue_review_decision_writer_cli_plan( transaction_preview=transaction, operator_evidence=operator_evidence, ) preflight = build_candidate_queue_review_decision_writer_preflight( writer_status=writer_status, transaction_preview=transaction, operator_evidence=operator_evidence, ) smoke = build_candidate_queue_review_decision_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=False, ) drill = build_candidate_queue_review_decision_writer_operator_drill( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_evidence=operator_evidence, ) package = build_candidate_queue_review_decision_writer_run_package( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_drill=drill, ) receipt_evidence = { **operator_evidence, "review_state_transaction_json_path": ( "artifacts/market_intel/review-state-transaction.json" ), "backup_artifact_path": "scripts/tools/backups/backup.zip", "preflight_artifact_path": ( "artifacts/market_intel/review-state-preflight.json" ), "operator_confirmed_review_state_preflight_only": True, "operator_acknowledged_shell_only_token": True, "review_state_writer_output_json_path": ( "artifacts/market_intel/review-state-writer-output.json" ), "review_state_postwrite_smoke_json_path": ( "artifacts/market_intel/review-state-postwrite-smoke.json" ), "operator_confirmed_no_token_in_artifacts": True, "receipt_notes": "review_state receipt reviewed", } readiness = build_candidate_queue_review_decision_writer_run_readiness( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_drill=drill, run_package=package, operator_evidence=receipt_evidence, ) writer_output = { "mode": "candidate_queue_review_decision_writer_cli_executed", "exit_code": 0, "approval_token_present": True, "approval_token_valid": True, "approval_token_secret_configured": True, "approval_env_var": "MARKET_INTEL_QUEUE_WRITE_APPROVAL", "writes_executed": True, "would_write_database": True, "database_connection_opened": True, "explicit_transaction_opened": True, "database_write_executed": True, "database_commit_executed": True, "database_rollback_executed": False, "external_network_executed": False, "scheduler_attached": False, "api_updates_review_state": False, "review_state_update_executed": True, "updated_count": 1, "skipped_count": 0, "affected_dedupe_keys": [expected_key], "skipped_dedupe_keys": [], } postwrite_smoke_result = { "mode": "candidate_queue_review_decision_writer_postwrite_smoke_read_only", "postwrite_smoke_passed": True, "review_state_update_verified": True, "ready_for_operator_review": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "external_network_executed": False, "scheduler_attached": False, "expected_dedupe_key_count": 1, "found_count": 1, "missing_count": 0, "state_mismatch_count": 0, "found_dedupe_keys": [expected_key], "missing_dedupe_keys": [], "state_mismatches": [], "row_summaries": [ { "dedupe_key": expected_key, "review_state": "confirmed", "priority_lane": "watch", "threshold_level": "medium", "total_score": 82.5, "evidence_bundle_id": "evidence-1", "source_batch_id": batch_id, "reviewed_at": "2026-05-19T12:30:00", "created_at": "2026-05-19T12:00:00", "updated_at": "2026-05-19T12:30:00", } ], } receipt = build_candidate_queue_review_decision_writer_run_receipt( transaction_preview=transaction, run_readiness=readiness, writer_output=writer_output, postwrite_smoke_result=postwrite_smoke_result, operator_evidence=receipt_evidence, ) return { "transaction": transaction, "operator_evidence": receipt_evidence, "writer_output": writer_output, "postwrite_smoke_result": postwrite_smoke_result, "receipt": receipt, } def test_market_intel_defaults_are_safe(): service = MarketIntelService() status = service.get_runtime_status().to_dict() plan = service.build_dry_run_plan("momo") assert status["enabled"] is False assert status["crawler_enabled"] is False assert status["write_enabled"] is False assert status["database_write_allowed"] is False assert plan["would_discover_campaigns"] is False assert plan["would_write_database"] is False def test_market_intel_adapter_registry_is_read_only(): summaries = get_adapter_summaries() codes = {item["platform_code"] for item in summaries} assert {"momo", "pchome", "coupang", "shopee"} <= codes for summary in summaries: policy = summary["safety_policy"] assert policy["allow_login"] is False assert policy["allow_database_write"] is False assert policy["allow_scheduler_attach"] is False def test_market_intel_discovery_plan_does_not_allow_network_or_write(): service = MarketIntelService() plan = service.build_discovery_plan("momo") assert plan["found"] is True assert len(plan["plans"]) == 1 momo_plan = plan["plans"][0] assert momo_plan["network_request_allowed"] is False assert momo_plan["database_write_allowed"] is False assert momo_plan["scheduler_attach_allowed"] is False assert momo_plan["sources"] def test_unknown_adapter_returns_diagnostic_error(): assert get_adapter("unknown") is None plan = MarketIntelService().build_discovery_plan("unknown") assert plan["found"] is False assert plan["error"] == "未知平台 adapter" def test_manual_discovery_default_does_not_call_network(): called = {"count": 0} def fake_get(*args, **kwargs): called["count"] += 1 raise AssertionError("預設 dry-run 不應發 HTTP request") result = MarketIntelService().run_manual_discovery("momo", fetch=False, http_get=fake_get) assert called["count"] == 0 assert result["found"] is True assert result["runs"][0]["status"] == "planned" assert result["runs"][0]["sources_fetched"] == 0 assert all(item["network_executed"] is False for item in result["runs"][0]["results"]) def test_manual_discovery_fetch_is_blocked_when_flags_are_off(): called = {"count": 0} def fake_get(*args, **kwargs): called["count"] += 1 raise AssertionError("flags 關閉時不應發 HTTP request") result = MarketIntelService().run_manual_discovery("momo", fetch=True, http_get=fake_get) assert called["count"] == 0 assert result["runs"][0]["status"] == "blocked" assert result["runs"][0]["network_allowed"] is False assert result["runs"][0]["database_write_allowed"] is False assert result["mcp_fetch_gate"]["network_request_allowed"] is False assert result["runs"][0]["network_gate"]["manual_fetch_gate_open"] is False def test_manual_runner_fetch_can_be_blocked_by_mcp_gate_even_when_flags_allow(): class RuntimeStatus: enabled = True crawler_enabled = True called = {"count": 0} def fake_get(*args, **kwargs): called["count"] += 1 raise AssertionError("MCP gate 關閉時不應發 HTTP request") gate = { "manual_fetch_gate_open": False, "network_request_allowed": False, "blocked_reasons": ["mcp_router_enabled"], "operator_message": "人工 fetch 仍被 MCP gate 阻擋", } adapter = get_adapter("momo") runner = ManualDiscoveryRunner( runtime_status=RuntimeStatus(), http_get=fake_get, network_allowed_override=False, network_gate=gate, ) result = runner.run(adapter, fetch=True).to_dict() assert called["count"] == 0 assert result["status"] == "blocked" assert result["network_allowed"] is False assert result["network_gate"]["blocked_reasons"] == ["mcp_router_enabled"] assert "MCP gate" in result["error_message"] def test_manual_runner_fetch_uses_injected_http_get_when_allowed(): class RuntimeStatus: enabled = True crawler_enabled = True class Response: status_code = 200 text = "活動頁OK" called = {"count": 0} def fake_get(url, **kwargs): called["count"] += 1 return Response() adapter = get_adapter("momo") runner = ManualDiscoveryRunner(runtime_status=RuntimeStatus(), http_get=fake_get) result = runner.run(adapter, fetch=True).to_dict() assert called["count"] == len(adapter.campaign_sources()) assert result["status"] == "success" assert result["database_write_allowed"] is False assert result["scheduler_attached"] is False assert result["sources_fetched"] == len(adapter.campaign_sources()) assert result["results"][0]["title"] == "活動頁" assert result["results"][0]["diagnostics"]["title"] == "活動頁" def test_html_diagnostics_extracts_campaign_link_candidates(): html = """ 五月品牌日 品牌日活動 客服中心 外部 promo """ diagnostics = parse_html_diagnostics(html, base_url="https://shop.example").to_dict() assert diagnostics["title"] == "五月品牌日" assert diagnostics["link_count"] == 3 assert diagnostics["same_host_link_count"] == 1 assert diagnostics["campaign_link_candidates"][0]["href"] == "https://shop.example/event/brand-day" assert diagnostics["campaign_link_candidates"][0]["score"] > 0 assert "generic_score" in diagnostics["campaign_link_candidates"][0] assert "platform_score" in diagnostics["campaign_link_candidates"][0] assert "confidence_band" in diagnostics["campaign_link_candidates"][0] assert "confidence_reason" in diagnostics["campaign_link_candidates"][0] def test_manual_runner_returns_parser_diagnostics_when_fetch_succeeds(): class RuntimeStatus: enabled = True crawler_enabled = True class Response: status_code = 200 text = """ PChome 優惠活動 限時優惠 """ adapter = get_adapter("pchome") runner = ManualDiscoveryRunner(runtime_status=RuntimeStatus(), http_get=lambda *args, **kwargs: Response()) result = runner.run(adapter, fetch=True).to_dict() diagnostics = result["results"][0]["diagnostics"] assert diagnostics["title"] == "PChome 優惠活動" assert diagnostics["campaign_link_candidates"] assert diagnostics["campaign_link_candidates"][0]["is_same_host"] is True def test_momo_platform_scorer_prioritizes_momo_campaign_links(): adapter = get_adapter("momo") html = """ MOMO 活動 外部 promo MOMO 品牌日活動 """ diagnostics = parse_html_diagnostics( html, base_url=adapter.base_url, score_link=adapter.score_campaign_link, ).to_dict() first = diagnostics["campaign_link_candidates"][0] assert first["href"] == "https://www.momoshop.com.tw/edm/cmmedm.jsp" assert first["platform_score"] > 0 assert first["confidence_band"] == "high" def test_pchome_platform_scorer_prioritizes_region_campaign_links(): adapter = get_adapter("pchome") html = """ PChome 活動 外部 event PChome 24h 美妝優惠 """ diagnostics = parse_html_diagnostics( html, base_url=adapter.base_url, score_link=adapter.score_campaign_link, ).to_dict() first = diagnostics["campaign_link_candidates"][0] assert first["href"] == "https://24h.pchome.com.tw/region/DDAB" assert first["platform_score"] > 0 assert first["confidence_band"] == "high" def test_coupang_platform_scorer_prioritizes_official_campaign_links(): adapter = get_adapter("coupang") html = """ Coupang 活動 外部 event 酷澎 火箭跨境優惠 """ diagnostics = parse_html_diagnostics( html, base_url=adapter.base_url, score_link=adapter.score_campaign_link, ).to_dict() first = diagnostics["campaign_link_candidates"][0] assert first["href"] == "https://www.tw.coupang.com/np/coupangglobal" assert first["platform_score"] > 0 assert first["confidence_band"] == "high" def test_shopee_platform_scorer_prioritizes_mall_campaign_links(): adapter = get_adapter("shopee") html = """ Shopee 活動 外部 event 蝦皮商城 品牌限時優惠 """ diagnostics = parse_html_diagnostics( html, base_url=adapter.base_url, score_link=adapter.score_campaign_link, ).to_dict() first = diagnostics["campaign_link_candidates"][0] assert first["href"] == "https://shopee.tw/mall" assert first["platform_score"] > 0 assert first["confidence_band"] == "high" def test_confidence_bands_cover_high_medium_low(): adapter = get_adapter("momo") html = """ 信心帶測試 MOMO 限時品牌日活動優惠 活動 清單 """ diagnostics = parse_html_diagnostics( html, base_url=adapter.base_url, score_link=adapter.score_campaign_link, ).to_dict() bands = {item["href"]: item["confidence_band"] for item in diagnostics["campaign_link_candidates"]} assert bands["https://www.momoshop.com.tw/edm/cmmedm.jsp"] == "high" assert bands["https://neutral.example/event-light"] == "medium" assert bands["https://other.example/sale"] == "low" for item in diagnostics["campaign_link_candidates"]: assert item["confidence_reason"] def test_candidate_preview_default_is_empty_and_does_not_call_network(): called = {"count": 0} def fake_get(*args, **kwargs): called["count"] += 1 raise AssertionError("candidate preview 預設不應發 HTTP request") preview = MarketIntelService().build_candidate_preview("momo", fetch=False, http_get=fake_get) assert called["count"] == 0 assert preview["candidate_count"] == 0 assert preview["database_write_allowed"] is False assert preview["scheduler_attached"] is False assert preview["mcp_fetch_gate_open"] is False assert preview["mcp_fetch_gate"]["network_request_allowed"] is False assert preview["run_statuses"][0]["status"] == "planned" def test_candidate_preview_fetch_is_blocked_when_flags_are_off(): called = {"count": 0} def fake_get(*args, **kwargs): called["count"] += 1 raise AssertionError("flags 關閉時 candidate preview 不應發 HTTP request") preview = MarketIntelService().build_candidate_preview("momo", fetch=True, http_get=fake_get) assert called["count"] == 0 assert preview["candidate_count"] == 0 assert preview["run_statuses"][0]["status"] == "blocked" assert preview["mcp_fetch_gate_open"] is False assert "market_intel_enabled" in preview["mcp_fetch_gate"]["blocked_reasons"] def test_candidate_preview_aggregates_and_filters_by_band(): discovery = { "platform_code": "all", "fetch_requested": True, "manual_fetch_allowed": True, "runs": [ { "platform_code": "momo", "status": "success", "sources_planned": 1, "sources_fetched": 1, "errors": 0, "results": [ { "source_key": "momo_edm", "name": "MOMO EDM", "url": "https://www.momoshop.com.tw/edm/cmmedm.jsp", "status": "fetched", "diagnostics": { "title": "MOMO 活動", "page_hash": "hash-a", "campaign_link_candidates": [ { "href": "https://www.momoshop.com.tw/edm/a", "text": "品牌日", "is_same_host": True, "score": 20, "generic_score": 6, "platform_score": 14, "confidence_band": "high", "confidence_reason": "same_host", }, { "href": "https://other.example/sale", "text": "清單", "is_same_host": False, "score": 2, "generic_score": 2, "platform_score": 0, "confidence_band": "low", "confidence_reason": "external_host", }, ], }, } ], } ], } preview = build_candidate_preview_from_discovery(discovery, min_band="medium", limit=10) assert preview["candidate_count"] == 1 assert preview["candidates"][0]["confidence_band"] == "high" assert preview["candidates"][0]["platform_code"] == "momo" assert preview["candidates"][0]["source_key"] == "momo_edm" def test_market_intel_preview_template_uses_safe_fetch_false_endpoint(): template = Path("templates/market_intel/disabled.html").read_text(encoding="utf-8") assert "市場情報入口" in template assert "比價覆核" in template assert "PChome 商品監控" in template assert "AI 觀測台" in template assert "市場情報尚未進入正式決策" in template assert "資料狀態" in template assert "來源規格" in template assert "手動整理" in template assert "data-market-intel-preview" not in template assert "data-market-intel-writer" not in template assert "/api/market_intel/" not in template assert "API 不執行推版" not in template return assert "data-market-intel-preview" in template assert "data-market-intel-writer" in template assert "data-market-intel-cli" in template assert "data-market-intel-cli-body" in template assert "data-market-intel-db-probe" in template assert "data-market-intel-db-probe-body" in template assert "data-market-intel-seed-diff" in template assert "data-market-intel-seed-diff-body" in template assert "data-market-intel-mcp-readiness" in template assert "data-market-intel-mcp-servers" in template assert "data-market-intel-mcp-checks" in template assert "data-market-intel-mcp-tools" in template assert "market_intel_contract" in template assert "data-market-intel-mcp-preflight" in template assert "data-market-intel-mcp-preflight-env" in template assert "data-market-intel-mcp-preflight-services" in template assert "data-market-intel-mcp-preflight-ports" in template assert "data-market-intel-mcp-preflight-fallback" in template assert "data-market-intel-mcp-activation" in template assert "data-market-intel-mcp-activation-stages" in template assert "data-market-intel-mcp-activation-safety" in template assert "data-market-intel-mcp-activation-fallback" in template assert "data-market-intel-mcp-fetch-gate" in template assert "data-market-intel-mcp-fetch-gate-checks" in template assert "data-market-intel-mcp-fetch-gate-sequence" in template assert "data-market-intel-mcp-fetch-gate-readiness" in template assert "data-market-intel-scheduler" in template assert "data-market-intel-scheduler-checks" in template assert "data-market-intel-scheduler-jobs" in template assert "data-market-intel-scheduler-sequence" in template assert "data-market-intel-scheduler-fallback" in template assert "data-market-intel-match-review" in template assert "data-market-intel-match-review-checks" in template assert "data-market-intel-match-review-signals" in template assert "data-market-intel-match-review-actions" in template assert "data-market-intel-match-review-sequence" in template assert "data-market-intel-opportunity" in template assert "data-market-intel-opportunity-checks" in template assert "data-market-intel-opportunity-rules" in template assert "data-market-intel-opportunity-severity" in template assert "data-market-intel-opportunity-sequence" in template assert "data-market-intel-opportunity-scoring" in template assert "data-market-intel-opportunity-scoring-checks" in template assert "data-market-intel-opportunity-scoring-dimensions" in template assert "data-market-intel-opportunity-scoring-thresholds" in template assert "data-market-intel-opportunity-scoring-evidence" in template assert "data-market-intel-opportunity-scoring-sequence" in template assert "data-market-intel-opportunity-evidence" in template assert "data-market-intel-opportunity-evidence-checks" in template assert "data-market-intel-opportunity-evidence-sections" in template assert "data-market-intel-opportunity-evidence-escalation" in template assert "data-market-intel-opportunity-evidence-tables" in template assert "data-market-intel-opportunity-evidence-sequence" in template assert "data-market-intel-opportunity-alert" in template assert "data-market-intel-opportunity-alert-checks" in template assert "data-market-intel-opportunity-alert-channels" in template assert "data-market-intel-opportunity-alert-escalation" in template assert "data-market-intel-opportunity-alert-payload" in template assert "data-market-intel-opportunity-alert-review" in template assert "data-market-intel-opportunity-alert-actions" in template assert "data-market-intel-opportunity-alert-queue-contract" in template assert "data-market-intel-opportunity-alert-priority-lanes" in template assert "data-market-intel-opportunity-alert-queue-indexes" in template assert "data-market-intel-opportunity-alert-approval" in template assert "data-market-intel-opportunity-alert-sequence" in template assert "data-market-intel-migration" in template assert "data-market-intel-migration-tables" in template assert "data-market-intel-migration-drill" in template assert "data-market-intel-migration-drill-checks" in template assert "data-market-intel-migration-drill-preapply" in template assert "data-market-intel-migration-drill-rollback" in template assert "data-market-intel-catalog-review" in template assert "data-market-intel-catalog-review-checks" in template assert "data-market-intel-catalog-review-findings" in template assert "data-market-intel-catalog-review-tables" in template assert "data-market-intel-live-smoke" in template assert "data-market-intel-live-smoke-checks" in template assert "data-market-intel-live-smoke-findings" in template assert "data-market-intel-live-smoke-targets" in template assert "data-market-intel-live-inventory" in template assert "data-market-intel-live-inventory-checks" in template assert "data-market-intel-live-inventory-tables" in template assert "data-market-intel-live-inventory-platforms" in template assert "data-market-intel-live-inventory-alerts" in template assert "data-market-intel-manual-sample" in template assert "data-market-intel-manual-sample-checks" in template assert "data-market-intel-manual-sample-platforms" in template assert "data-market-intel-manual-sample-sequence" in template assert "data-market-intel-sample-acceptance" in template assert "data-market-intel-sample-acceptance-checks" in template assert "data-market-intel-sample-acceptance-fields" in template assert "data-market-intel-sample-acceptance-rules" in template assert "data-market-intel-sample-review" in template assert "data-market-intel-sample-review-checks" in template assert "data-market-intel-sample-review-findings" in template assert "data-market-intel-sample-review-actions" in template assert "data-market-intel-sample-review-boundaries" in template assert "data-market-intel-sample-review-input" in template assert "data-market-intel-sample-review-evaluate" in template assert "data-market-intel-sample-candidate-handoff" in template assert "data-market-intel-sample-review-actions-rail" in template assert ".market-intel-control-actions" in template assert "grid-template-columns: minmax(0, 1fr) auto auto auto" not in template assert "data-market-intel-sample-candidate-queue-draft" in template assert "data-market-intel-sample-candidate-queue-approval" in template assert "data-market-intel-sample-candidate-queue-transaction" in template assert "data-market-intel-sample-candidate-queue-writer" in template assert "data-market-intel-sample-candidate-queue-preflight" in template assert "data-market-intel-sample-candidate-queue-run-receipt" in template assert "data-market-intel-sample-candidate-queue-run-closeout" in template assert "data-market-intel-sample-candidate-queue-review-handoff" in template assert "data-market-intel-sample-candidate-queue-review-inventory" in template assert "data-market-intel-sample-candidate-queue-review-decision" in template assert ( "data-market-intel-sample-candidate-queue-review-decision-approval" in template ) assert "data-market-intel-approval" in template assert "data-market-intel-approval-gates" in template assert "data-market-intel-deploy" in template assert "data-market-intel-deploy-steps" in template assert "data-market-intel-deploy-fallback" in template assert "market_intel.market_intel_candidate_preview" in template assert "market_intel.market_intel_platform_seed_writer_plan" in template assert "market_intel.market_intel_seed_writer_cli_status" in template assert "market_intel.market_intel_schema_db_probe" in template assert "market_intel.market_intel_platform_seed_db_diff" in template assert "market_intel.market_intel_legacy_source_bridge" in template assert "market_intel.market_intel_mcp_readiness" in template assert "market_intel.market_intel_mcp_deploy_preflight" in template assert "market_intel.market_intel_mcp_activation_runbook" in template assert "market_intel.market_intel_mcp_fetch_gate" in template assert "market_intel.market_intel_mcp_completion_audit" in template assert "data-market-intel-mcp-completion" in template assert "market_intel.market_intel_mcp_activation_evidence" in template assert "data-market-intel-mcp-activation-evidence" in template assert "market_intel.market_intel_mcp_runtime_smoke_receipt" in template assert "data-market-intel-mcp-runtime-smoke" in template assert "market_intel.market_intel_mcp_runtime_promotion" in template assert "data-market-intel-mcp-runtime-promotion" in template assert "market_intel.market_intel_mcp_manual_fetch_handoff" in template assert "data-market-intel-mcp-manual-fetch-handoff" in template assert "data-market-intel-mcp-manual-fetch-handoff-gates" in template assert "data-market-intel-mcp-manual-fetch-handoff-summary" in template assert "data-market-intel-mcp-manual-fetch-handoff-next" in template assert "market_intel.market_intel_mcp_fetch_target_review" in template assert "data-market-intel-mcp-fetch-target-review" in template assert "data-market-intel-mcp-fetch-target-review-gates" in template assert "data-market-intel-mcp-fetch-target-review-targets" in template assert "data-market-intel-mcp-fetch-target-review-next" in template assert "market_intel.market_intel_mcp_fetch_run_package" in template assert "data-market-intel-mcp-fetch-run-package" in template assert "data-market-intel-mcp-fetch-run-package-gates" in template assert "data-market-intel-mcp-fetch-run-package-commands" in template assert "data-market-intel-mcp-fetch-run-package-next" in template assert "market_intel.market_intel_mcp_fetch_run_readiness" in template assert "data-market-intel-mcp-fetch-run-readiness" in template assert "data-market-intel-mcp-fetch-run-readiness-gates" in template assert "data-market-intel-mcp-fetch-run-readiness-operator" in template assert "data-market-intel-mcp-fetch-run-readiness-commands" in template assert "data-market-intel-mcp-fetch-run-readiness-next" in template assert "market_intel.market_intel_mcp_fetch_run_receipt" in template assert "data-market-intel-mcp-fetch-run-receipt" in template assert "data-market-intel-mcp-fetch-run-receipt-gates" in template assert "data-market-intel-mcp-fetch-run-receipt-receipt" in template assert "data-market-intel-mcp-fetch-run-receipt-sources" in template assert "data-market-intel-mcp-fetch-run-receipt-next" in template assert "market_intel.market_intel_mcp_fetch_result_parser_review" in template assert "data-market-intel-mcp-fetch-result-parser-review" in template assert "data-market-intel-mcp-fetch-result-parser-review-gates" in template assert "data-market-intel-mcp-fetch-result-parser-review-parser" in template assert "data-market-intel-mcp-fetch-result-parser-review-sources" in template assert "data-market-intel-mcp-fetch-result-parser-review-candidates" in template assert "data-market-intel-mcp-fetch-result-parser-review-next" in template assert "market_intel.market_intel_mcp_fetch_candidate_handoff_review" in template assert "data-market-intel-mcp-fetch-candidate-handoff-review" in template assert "data-market-intel-mcp-fetch-candidate-handoff-review-gates" in template assert "data-market-intel-mcp-fetch-candidate-handoff-review-parser" in template assert "data-market-intel-mcp-fetch-candidate-handoff-review-groups" in template assert "data-market-intel-mcp-fetch-candidate-handoff-review-queue" in template assert "data-market-intel-mcp-fetch-candidate-handoff-review-next" in template assert "market_intel.market_intel_mcp_fetch_candidate_queue_review" in template assert "data-market-intel-mcp-fetch-candidate-queue-review" in template assert "data-market-intel-mcp-fetch-candidate-queue-review-gates" in template assert "data-market-intel-mcp-fetch-candidate-queue-review-handoff" in template assert "data-market-intel-mcp-fetch-candidate-queue-review-items" in template assert "data-market-intel-mcp-fetch-candidate-queue-review-policy" in template assert "data-market-intel-mcp-fetch-candidate-queue-review-next" in template assert ( "market_intel.market_intel_mcp_fetch_candidate_queue_writer_preflight" in template ) assert "data-market-intel-mcp-fetch-candidate-queue-writer-preflight" in template assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-preflight-gates" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-preflight-queue" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-preflight-payload" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-preflight-columns" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-preflight-next" in template ) assert ( "market_intel.market_intel_mcp_fetch_candidate_queue_writer_cli_review" in template ) assert "data-market-intel-mcp-fetch-candidate-queue-writer-cli-review" in template assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-cli-review-gates" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-cli-review-preflight" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-cli-review-command" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-cli-review-payload" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-cli-review-next" in template ) assert ( "market_intel.market_intel_mcp_fetch_candidate_queue_writer_run_package_review" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-package-review" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-package-review-gates" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-package-review-cli-review" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-package-review-artifacts" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-package-review-commands" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-package-review-next" in template ) assert ( "market_intel.market_intel_mcp_fetch_candidate_queue_writer_run_readiness" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-readiness" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-readiness-gates" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-readiness-package" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-readiness-operator" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-readiness-artifacts" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-readiness-next" in template ) assert ( "market_intel.market_intel_mcp_fetch_candidate_queue_writer_run_receipt_review" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-receipt-review" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-receipt-review-gates" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-receipt-review-readiness" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-receipt-review-receipt" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-receipt-review-artifacts" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-receipt-review-next" in template ) assert ( "market_intel.market_intel_mcp_fetch_candidate_queue_writer_run_closeout_review" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-closeout-review" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-closeout-review-gates" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-closeout-review-receipt" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-closeout-review-closeout" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-closeout-review-artifacts" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-run-closeout-review-next" in template ) assert ( "market_intel.market_intel_mcp_fetch_candidate_queue_writer_post_closeout_inventory_review" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-post-closeout-inventory-review" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-post-closeout-inventory-review-gates" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-post-closeout-inventory-review-closeout" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-post-closeout-inventory-review-inventory" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-post-closeout-inventory-review-artifacts" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-post-closeout-inventory-review-next" in template ) assert ( "market_intel.market_intel_mcp_fetch_candidate_queue_writer_review_handoff" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-handoff" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-handoff-gates" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-handoff-inventory" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-handoff-handoff" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-handoff-contract" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-handoff-next" in template ) assert ( "market_intel.market_intel_mcp_fetch_candidate_queue_writer_review_inventory" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-inventory" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-inventory-gates" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-inventory-handoff" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-inventory-inventory" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-inventory-rows" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-inventory-next" in template ) assert ( "market_intel.market_intel_mcp_fetch_candidate_queue_writer_review_decision" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-gates" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-inventory" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-decision" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-rows" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-next" in template ) assert ( "market_intel.market_intel_mcp_fetch_candidate_queue_writer_review_decision_approval" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-approval" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-approval-gates" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-approval-decision" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-approval-approval" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-approval-rows" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-approval-next" in template ) assert ( "market_intel.market_intel_mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-approval-writer-preflight" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-approval-writer-preflight-gates" in template ) assert ( "data-market-intel-mcp-fetch-candidate-queue-writer-review-decision-approval-writer-preflight-next" in template ) assert ( "market_intel.market_intel_mcp_professional_source_governance" in template ) assert "data-market-intel-mcp-professional-source-governance" in template assert ( "data-market-intel-mcp-professional-source-governance-gates" in template ) assert ( "data-market-intel-mcp-professional-source-governance-sources" in template ) assert ( "data-market-intel-mcp-professional-source-governance-next" in template ) assert ( "market_intel.market_intel_mcp_fetch_target_source_governance_review" in template ) assert "data-market-intel-mcp-fetch-target-source-governance-review" in template assert ( "data-market-intel-mcp-fetch-target-source-governance-review-gates" in template ) assert ( "data-market-intel-mcp-fetch-target-source-governance-review-alignment" in template ) assert ( "data-market-intel-mcp-fetch-target-source-governance-review-next" in template ) assert "market_intel.market_intel_manual_sample_plan" in template assert "market_intel.market_intel_manual_sample_acceptance" in template assert "market_intel.market_intel_manual_sample_review" in template assert "market_intel.market_intel_manual_sample_review_evaluate" in template assert "market_intel.market_intel_manual_sample_candidate_handoff" in template assert "market_intel.market_intel_manual_sample_candidate_queue_draft" in template assert "market_intel.market_intel_manual_sample_candidate_queue_approval" in template assert "market_intel.market_intel_manual_sample_candidate_queue_transaction" in template assert "market_intel.market_intel_manual_sample_candidate_queue_writer_status" in template assert "market_intel.market_intel_manual_sample_candidate_queue_writer_preflight" in template assert ( "market_intel.market_intel_manual_sample_candidate_queue_writer_postwrite_smoke" in template ) assert ( "market_intel.market_intel_manual_sample_candidate_queue_writer_operator_drill" in template ) assert ( "market_intel.market_intel_manual_sample_candidate_queue_writer_run_package" in template ) assert ( "market_intel.market_intel_manual_sample_candidate_queue_writer_run_readiness" in template ) assert ( "market_intel.market_intel_manual_sample_candidate_queue_writer_run_receipt" in template ) assert ( "market_intel.market_intel_manual_sample_candidate_queue_writer_run_closeout" in template ) assert ( "market_intel.market_intel_manual_sample_candidate_queue_review_handoff" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_inventory" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_decision" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_decision_approval" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_decision_transaction" in template ) assert ( "data-market-intel-sample-candidate-queue-review-decision-transaction" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_decision_writer_status" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_decision_writer_preflight" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_decision_writer_postwrite_smoke" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_decision_writer_operator_drill" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_decision_writer_run_package" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_decision_writer_run_readiness" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_decision_writer_run_receipt" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_decision_writer_run_closeout" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_decision_post_closeout_inventory" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_completion_archive" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_archive_summary" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_preflight" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_run_package" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_output_receipt" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_preflight" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_transaction" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_writer_preflight" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_run_package" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_run_readiness" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_run_receipt" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_run_closeout" in template ) assert ( "data-market-intel-sample-candidate-queue-review-decision-writer" in template ) assert ( "data-market-intel-sample-candidate-queue-review-decision-preflight" in template ) assert ( "data-market-intel-sample-candidate-queue-review-decision-postwrite-smoke" in template ) assert ( "data-market-intel-sample-candidate-queue-review-decision-operator-drill" in template ) assert ( "data-market-intel-sample-candidate-queue-review-decision-run-package" in template ) assert ( "data-market-intel-sample-candidate-queue-review-decision-run-readiness" in template ) assert ( "data-market-intel-sample-candidate-queue-review-decision-run-receipt" in template ) assert ( "data-market-intel-sample-candidate-queue-review-decision-run-closeout" in template ) assert ( "data-market-intel-sample-candidate-queue-review-decision-post-closeout-inventory" in template ) assert ( "data-market-intel-sample-candidate-queue-review-completion-archive" in template ) assert ( "data-market-intel-sample-candidate-queue-review-archive-summary" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-preflight" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-run-package" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-output-receipt" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-preflight" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-transaction" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-writer-preflight" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-run-package" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-run-readiness" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-run-receipt" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-run-closeout" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-gate" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-run-package" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-run-readiness" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-run-receipt" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-closeout" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-archive" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-archive-summary" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-input" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-run-package" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-run-readiness" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-run-receipt" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-closeout" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-archive" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-archive-summary" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-catalog-handoff" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-catalog-index" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-catalog-write-preflight" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-catalog-record-write" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-catalog-record-run-package" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-catalog-record-run-readiness" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-catalog-record-run-receipt" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-catalog-record-commit" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-catalog-record-closeout" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-catalog-record-archive" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-catalog-record-archive-summary" in template ) assert ( "market_intel_review.market_intel_manual_sample_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout" in template ) assert ( "data-market-intel-sample-candidate-queue-review-ai-summary-persistence-telegram-dispatch-report-catalog-record-final-closeout" in template ) assert "X-CSRFToken" in template assert "market_intel.market_intel_scheduler_plan" in template assert "market_intel.market_intel_match_review_plan" in template assert "market_intel.market_intel_opportunity_plan" in template assert "market_intel.market_intel_opportunity_scoring_plan" in template assert "market_intel.market_intel_opportunity_evidence_plan" in template assert "market_intel.market_intel_opportunity_alert_plan" in template assert "market_intel.market_intel_migration_blueprint" in template assert "market_intel.market_intel_migration_apply_drill" in template assert "market_intel.market_intel_migration_catalog_review" in template assert "market_intel.market_intel_migration_live_smoke" in template assert "market_intel.market_intel_live_db_inventory" in template assert "market_intel.market_intel_write_approval_runbook" in template assert "market_intel.market_intel_deployment_readiness" in template assert "required_manual_steps" in template assert "fallback_plan" in template assert "approval_gates" in template assert "備援方案" in template assert "fetch=false" in template assert "fetch=true" not in template assert "execute=false" in template assert "execute=true" not in template assert "writes=executed" not in template assert "正式頁面不執行更新" in template assert "API 不執行推版" not in template def test_market_intel_schema_metadata_contains_all_market_tables(): metadata_tables = set(Base.metadata.tables) assert set(MARKET_INTEL_TABLES) <= metadata_tables def test_legacy_source_bridge_default_is_planned_only(): bridge = MarketIntelService().build_legacy_source_bridge() assert bridge["mode"] == "legacy_source_bridge_planned" assert bridge["phase"] == "phase_140_market_intel_professional_source_governance" assert bridge["execute_requested"] is False assert bridge["read_only_query_executed"] is False assert bridge["database_connection_opened"] is False assert bridge["database_session_created"] is False assert bridge["database_write_executed"] is False assert bridge["database_commit_executed"] is False assert bridge["external_network_executed"] is False assert bridge["scheduler_attached"] is False assert bridge["writes_executed"] is False assert bridge["would_write_database"] is False assert bridge["source_count"] == 3 assert bridge["existing_source_count"] == 0 assert "execute_false_planned_only" in bridge["blocked_reasons"] assert {item["table"] for item in bridge["source_summaries"]} == { "promo_products", "competitor_prices", "competitor_price_history", } def test_legacy_source_bridge_read_only_sqlite_counts_sources(): engine = create_engine("sqlite:///:memory:") with engine.begin() as conn: conn.execute( text( """ CREATE TABLE promo_products ( id INTEGER PRIMARY KEY, batch_id TEXT, crawled_at TEXT, time_slot TEXT, activity_time_text TEXT, session_time_text TEXT, i_code TEXT, name TEXT, price INTEGER, discount_text TEXT, url TEXT, image_url TEXT, previous_price INTEGER, remain_qty INTEGER, status_change TEXT, page_type TEXT ) """ ) ) conn.execute( text( """ CREATE TABLE competitor_prices ( id INTEGER PRIMARY KEY, sku TEXT, source TEXT, price NUMERIC, original_price NUMERIC, discount_pct INTEGER, competitor_product_id TEXT, competitor_product_name TEXT, match_score NUMERIC, crawled_at TEXT ) """ ) ) conn.execute( text( """ CREATE TABLE competitor_price_history ( id INTEGER PRIMARY KEY, sku TEXT, source TEXT, momo_product_id INTEGER, momo_price NUMERIC, price NUMERIC, original_price NUMERIC, discount_pct INTEGER, competitor_product_id TEXT, competitor_product_name TEXT, match_score NUMERIC, crawled_at TEXT ) """ ) ) conn.execute( text( """ INSERT INTO promo_products (batch_id, crawled_at, time_slot, i_code, name, price, discount_text, url, page_type) VALUES ('batch-1', '2026-05-18 10:00:00', '10:00', 'A001', 'MOMO 商品 A', 399, '8折', 'https://momo/A001', 'edm'), ('batch-1', '2026-05-18 10:01:00', '10:00', 'A002', 'MOMO 商品 B', 499, '9折', 'https://momo/A002', 'edm') """ ) ) conn.execute( text( """ INSERT INTO competitor_prices (sku, source, price, original_price, competitor_product_id, competitor_product_name, match_score, crawled_at) VALUES ('A001', 'pchome', 379, 459, 'PC-A001', 'PChome 商品 A', 0.82, '2026-05-18 11:00:00') """ ) ) conn.execute( text( """ INSERT INTO competitor_price_history (sku, source, momo_product_id, momo_price, price, original_price, competitor_product_id, competitor_product_name, match_score, crawled_at) VALUES ('A001', 'pchome', 1, 399, 379, 459, 'PC-A001', 'PChome 商品 A', 0.82, '2026-05-18 11:00:00') """ ) ) bridge = MarketIntelService().build_legacy_source_bridge( execute_requested=True, engine=engine, database_type="sqlite", ) assert bridge["mode"] == "legacy_source_bridge_read_only" assert bridge["execute_requested"] is True assert bridge["read_only_query_executed"] is True assert bridge["database_connection_opened"] is True assert bridge["database_session_created"] is False assert bridge["database_write_executed"] is False assert bridge["database_commit_executed"] is False assert bridge["external_network_executed"] is False assert bridge["scheduler_attached"] is False assert bridge["writes_executed"] is False assert bridge["would_write_database"] is False assert bridge["source_tables_ready"] is True assert bridge["existing_source_count"] == 3 assert bridge["total_existing_rows"] == 4 assert [item["table"] for item in bridge["source_summaries"]] == [ "promo_products", "competitor_prices", "competitor_price_history", ] assert bridge["source_summaries"][0]["row_count"] == 2 assert bridge["source_summaries"][0]["distinct_entity_count"] == 2 assert bridge["source_summaries"][1]["row_count"] == 1 assert bridge["source_summaries"][2]["row_count"] == 1 assert len(bridge["bridge_operations"]) == 4 assert all( item["write_status"] != "executed" for item in bridge["bridge_operations"] ) def test_mcp_tool_contract_preview_is_read_only_and_whitelisted(): contract = MarketIntelService().build_mcp_tool_contract() assert contract["mode"] == "mcp_tool_contract_preview" assert contract["phase"] == "phase_140_market_intel_professional_source_governance" assert contract["caller"] == "market_intel" assert contract["contract_ready"] is True assert contract["blocked_reasons"] == [] assert contract["tool_count"] == 3 assert contract["database_session_created"] is False assert contract["database_write_executed"] is False assert contract["database_commit_executed"] is False assert contract["external_network_executed"] is False assert contract["scheduler_attached"] is False assert contract["writes_executed"] is False assert contract["would_write_database"] is False assert contract["checks"]["market_intel_caller_registered"] is True assert contract["checks"]["all_router_tools_whitelisted"] is True assert contract["checks"]["all_tools_read_only"] is True assert contract["checks"]["no_database_write_allowed"] is True assert contract["checks"]["no_scheduler_attach_allowed"] is True assert {item["name"] for item in contract["tools"]} == { "market_campaign_search", "market_campaign_scrape", "market_product_match_lookup", } assert all(item["router_tools_whitelisted"] is True for item in contract["tools"]) assert all(item["write_risk"] is False for item in contract["tools"]) def test_mcp_tool_contract_detects_missing_router_whitelist(): contract = build_mcp_tool_contract_preview(tool_registry={}) assert contract["contract_ready"] is False assert "market_intel_caller_registered" in contract["blocked_reasons"] assert "all_router_tools_whitelisted" in contract["blocked_reasons"] def test_mcp_tool_contract_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/mcp_tool_contract") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "mcp_tool_contract_preview" assert data["contract_ready"] is True assert data["database_session_created"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["external_network_executed"] is False assert data["scheduler_attached"] is False def test_mcp_activation_runbook_blocks_until_env_and_health_pass(): preflight = build_mcp_deploy_preflight_plan(env={}) runbook = build_mcp_activation_runbook_preview(preflight=preflight) assert runbook["mode"] == "mcp_activation_runbook_preview" assert runbook["ready_for_operator_activation"] is False assert "required_env_ready" in runbook["blocked_reasons"] assert "external_health_smoke_not_executed" in runbook["blocked_reasons"] assert runbook["deployment_actions_executed"] is False assert runbook["docker_command_executed"] is False assert runbook["ssh_command_executed"] is False assert runbook["database_session_created"] is False assert runbook["database_write_executed"] is False assert runbook["database_commit_executed"] is False assert runbook["external_network_executed"] is False assert runbook["scheduler_attached"] is False assert runbook["would_write_database"] is False assert runbook["safety_contract"]["does_not_execute_docker"] is True assert runbook["safety_contract"]["does_not_enable_router"] is True assert {item["key"] for item in runbook["stages"]} == { "configure_required_env", "create_mcp_readonly_role", "start_external_mcp_stack", "run_mcp_health_smoke", "enable_mcp_router_flag", "run_market_intel_mcp_smoke", } def test_mcp_activation_runbook_can_be_ready_with_mocked_gates(): preflight = build_mcp_deploy_preflight_plan( env={ "MCP_POSTGRES_PASSWORD": "secret", "TAVILY_API_KEY": "tavily", "EXA_API_KEY": "exa", "MCP_ROUTER_ENABLED": "false", } ) readiness = { "readiness_checks": { "external_server_health_checked": True, "external_servers_all_healthy": True, "market_intel_tool_contract_ready": True, } } runbook = build_mcp_activation_runbook_preview( preflight=preflight, readiness=readiness, ) assert runbook["ready_for_operator_activation"] is True assert runbook["blocked_reasons"] == [] assert runbook["checks"]["required_env_ready"] is True assert runbook["checks"]["all_health_passed"] is True assert { item["key"]: item["status"] for item in runbook["stages"] }["enable_mcp_router_flag"] == "ready" def test_mcp_activation_runbook_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/mcp_activation_runbook") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "mcp_activation_runbook_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["deployment_actions_executed"] is False assert data["docker_command_executed"] is False assert data["ssh_command_executed"] is False assert data["database_write_executed"] is False assert data["external_network_executed"] is False assert data["scheduler_attached"] is False def test_mcp_fetch_gate_default_blocks_external_fetch(): gate = MarketIntelService().build_mcp_fetch_gate(fetch_requested=True) assert gate["mode"] == "mcp_fetch_gate_planned" assert gate["phase"] == "phase_140_market_intel_professional_source_governance" assert gate["fetch_requested"] is True assert gate["manual_fetch_gate_open"] is False assert gate["network_request_allowed"] is False assert gate["would_use_external_network"] is False assert gate["database_session_created"] is False assert gate["database_write_executed"] is False assert gate["database_commit_executed"] is False assert gate["external_network_executed"] is False assert gate["scheduler_attached"] is False assert gate["writes_executed"] is False assert gate["would_write_database"] is False assert "market_intel_enabled" in gate["blocked_reasons"] assert "market_intel_crawler_enabled" in gate["blocked_reasons"] assert "mcp_readiness_executed" in gate["blocked_reasons"] assert "mcp_router_enabled" in gate["blocked_reasons"] def test_mcp_fetch_gate_can_open_with_mocked_ready_state(): class RuntimeStatus: enabled = True crawler_enabled = True database_write_allowed = False scheduler_attached = False readiness = { "mode": "mcp_readiness_read_only", "execute_requested": True, "router_enabled": True, "external_mcp_complete": True, "internal_mcp_complete": True, "market_intel_mcp_integrated": True, "blocked_reasons": [], "readiness_checks": { "market_intel_tool_contract_ready": True, "external_servers_all_healthy": True, }, } gate = build_mcp_fetch_gate_preview( RuntimeStatus(), fetch_requested=True, execute_readiness=True, readiness=readiness, ) assert gate["mode"] == "mcp_fetch_gate_read_only" assert gate["manual_fetch_prerequisites_met"] is True assert gate["manual_fetch_gate_open"] is True assert gate["network_request_allowed"] is True assert gate["blocked_reasons"] == [] assert gate["database_write_executed"] is False assert gate["scheduler_attached"] is False def test_mcp_fetch_gate_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/mcp_fetch_gate") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "mcp_fetch_gate_planned" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["fetch_requested"] is False assert data["network_request_allowed"] is False assert data["external_network_executed"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False def test_mcp_completion_audit_summarizes_external_and_internal_state(monkeypatch): monkeypatch.delenv("MCP_ROUTER_ENABLED", raising=False) audit = MarketIntelService().build_mcp_completion_audit() assert audit["mode"] == "mcp_completion_audit_preview" assert audit["phase"] == "phase_140_market_intel_professional_source_governance" assert audit["audit_ready_for_operator_review"] is True assert audit["audit_preview_safe"] is True assert audit["external_mcp_runtime_complete"] is False assert audit["internal_mcp_contract_complete"] is True assert audit["internal_mcp_runtime_complete"] is False assert audit["market_intel_mcp_integrated"] is True assert audit["ready_for_internal_mcp_use"] is True assert audit["ready_for_external_mcp_activation"] is False assert audit["ready_for_manual_fetch"] is False assert audit["api_executes_health_check"] is False assert audit["api_executes_docker"] is False assert audit["api_opens_database_connection"] is False assert audit["api_writes_database"] is False assert audit["api_uses_external_network"] is False assert audit["database_session_created"] is False assert audit["database_write_executed"] is False assert audit["database_commit_executed"] is False assert audit["external_network_executed"] is False assert audit["scheduler_attached"] is False assert audit["writes_executed"] is False assert audit["would_write_database"] is False assert audit["external_mcp_summary"]["expected_servers"] == [ "postgres", "omnisearch", "firecrawl", "filesystem", ] assert audit["external_mcp_summary"]["health_checked"] is False assert audit["internal_mcp_summary"]["tool_count"] == 3 assert audit["internal_mcp_summary"]["contract_ready"] is True assert "external_mcp_runtime_complete" in audit["blocked_reasons"] assert "internal_mcp_runtime_complete" in audit["blocked_reasons"] assert "preview_side_effect_free" not in audit["blocked_reasons"] def test_mcp_completion_audit_detects_missing_internal_contract(): class RuntimeStatus: enabled = False crawler_enabled = False database_write_allowed = False scheduler_attached = False readiness = build_mcp_readiness_plan() contract = build_mcp_tool_contract_preview(tool_registry={}) audit = build_mcp_completion_audit_preview( runtime_status=RuntimeStatus(), readiness=readiness, tool_contract=contract, ) assert audit["mode"] == "mcp_completion_audit_preview" assert audit["internal_mcp_contract_complete"] is False assert audit["ready_for_internal_mcp_use"] is False assert "internal_mcp_contract_complete" in audit["blocked_reasons"] assert audit["audit_preview_safe"] is True assert audit["api_writes_database"] is False def test_mcp_completion_audit_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/mcp_completion_audit") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "mcp_completion_audit_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["audit_preview_safe"] is True assert data["external_mcp_runtime_complete"] is False assert data["internal_mcp_contract_complete"] is True assert data["ready_for_manual_fetch"] is False assert data["api_executes_health_check"] is False assert data["api_executes_docker"] is False assert data["api_opens_database_connection"] is False assert data["api_writes_database"] is False assert data["api_uses_external_network"] is False assert data["external_network_executed"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False def test_mcp_activation_evidence_preview_is_safe_without_payload(): evidence = build_mcp_activation_evidence_preview( phase="phase_140_market_intel_professional_source_governance" ) assert evidence["mode"] == "mcp_activation_evidence_preview" assert evidence["phase"] == "phase_140_market_intel_professional_source_governance" assert evidence["evidence_payload_received"] is False assert evidence["activation_evidence_accepted"] is False assert evidence["ready_for_runtime_promotion"] is False assert evidence["payload_persisted"] is False assert evidence["evidence_persisted"] is False assert evidence["api_executes_health_check"] is False assert evidence["api_opens_database_connection"] is False assert evidence["api_writes_database"] is False assert evidence["api_uses_external_network"] is False assert evidence["database_write_executed"] is False assert evidence["external_network_executed"] is False assert evidence["scheduler_attached"] is False assert "evidence_payload_received" in evidence["blocked_reasons"] assert evidence["sample_evidence_template"]["required_env_vars"][ "MCP_POSTGRES_PASSWORD" ] == "redacted" def test_mcp_activation_evidence_accepts_redacted_runtime_evidence(): sample = build_mcp_activation_evidence_preview()[ "sample_evidence_template" ] evidence = build_mcp_activation_evidence_preview( evidence=sample, phase="phase_140_market_intel_professional_source_governance", ) assert evidence["mode"] == "mcp_activation_evidence_review" assert evidence["activation_evidence_accepted"] is True assert evidence["ready_for_runtime_promotion"] is True assert evidence["external_mcp_runtime_evidence_complete"] is True assert evidence["internal_mcp_runtime_evidence_complete"] is True assert evidence["blocked_reasons"] == [] assert evidence["passed_gate_count"] == evidence["gate_count"] assert all(item["passed"] for item in evidence["health_statuses"]) assert all(item["present"] for item in evidence["env_statuses"]) assert evidence["secret_literal_keys"] == [] assert evidence["prohibited_flags"] == [] assert evidence["payload_persisted"] is False assert evidence["api_writes_database"] is False assert evidence["external_network_executed"] is False def test_mcp_activation_evidence_blocks_secret_literals_and_write_flags(): sample = build_mcp_activation_evidence_preview()[ "sample_evidence_template" ] sample["required_env_vars"]["TAVILY_API_KEY"] = "real-secret-token" sample["database_write_executed"] = True evidence = build_mcp_activation_evidence_preview(evidence=sample) assert evidence["activation_evidence_accepted"] is False assert "no_secret_literals_in_payload" in evidence["blocked_reasons"] assert "no_write_or_scheduler_evidence" in evidence["blocked_reasons"] assert evidence["secret_literal_keys"] == ["TAVILY_API_KEY"] assert evidence["prohibited_flags"] == ["database_write_executed"] assert evidence["database_write_executed"] is False assert evidence["payload_persisted"] is False def test_mcp_activation_evidence_route_get_and_post_are_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get("/api/market_intel/mcp_activation_evidence") get_data = get_response.get_json() sample = get_data["sample_evidence_template"] post_response = client.post( "/api/market_intel/mcp_activation_evidence", json={"evidence": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_activation_evidence_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_executes_health_check"] is False assert get_data["api_writes_database"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_activation_evidence_review" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["activation_evidence_accepted"] is True assert post_data["payload_persisted"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_uses_external_network"] is False def test_mcp_runtime_smoke_receipt_preview_is_safe_without_payload(): receipt = build_mcp_runtime_smoke_receipt_preview( phase="phase_140_market_intel_professional_source_governance" ) assert receipt["mode"] == "mcp_runtime_smoke_receipt_preview" assert receipt["phase"] == "phase_140_market_intel_professional_source_governance" assert receipt["receipt_payload_received"] is False assert receipt["runtime_smoke_receipt_accepted"] is False assert receipt["ready_for_completion_runtime_promotion"] is False assert receipt["payload_persisted"] is False assert receipt["receipt_persisted"] is False assert receipt["api_executes_health_check"] is False assert receipt["api_opens_database_connection"] is False assert receipt["api_writes_database"] is False assert receipt["api_uses_external_network"] is False assert receipt["database_write_executed"] is False assert receipt["external_network_executed"] is False assert receipt["scheduler_attached"] is False assert "receipt_payload_received" in receipt["blocked_reasons"] assert {item["server"] for item in receipt["sample_receipt_template"]["server_statuses"]} == { "postgres", "omnisearch", "firecrawl", "filesystem", } def test_mcp_runtime_smoke_receipt_accepts_complete_readiness_receipt(): sample = build_mcp_runtime_smoke_receipt_preview()[ "sample_receipt_template" ] receipt = build_mcp_runtime_smoke_receipt_preview( receipt=sample, phase="phase_140_market_intel_professional_source_governance", ) assert receipt["mode"] == "mcp_runtime_smoke_receipt_review" assert receipt["runtime_smoke_receipt_accepted"] is True assert receipt["ready_for_completion_runtime_promotion"] is True assert receipt["ready_for_manual_fetch_gate_review"] is True assert receipt["external_mcp_runtime_receipt_complete"] is True assert receipt["internal_mcp_runtime_receipt_complete"] is True assert receipt["blocked_reasons"] == [] assert receipt["passed_gate_count"] == receipt["gate_count"] assert receipt["server_summary"]["all_expected_servers_present"] is True assert receipt["server_summary"]["all_servers_health_checked"] is True assert receipt["server_summary"]["all_servers_healthy"] is True assert receipt["telemetry_summary"]["read_only_query_executed"] is True assert receipt["prohibited_flags"] == [] assert receipt["payload_persisted"] is False assert receipt["api_executes_health_check"] is False assert receipt["api_writes_database"] is False assert receipt["external_network_executed"] is False def test_mcp_runtime_smoke_receipt_blocks_incomplete_or_write_receipt(): sample = build_mcp_runtime_smoke_receipt_preview()[ "sample_receipt_template" ] sample["server_statuses"][2]["healthy"] = False sample["telemetry"]["database_write_executed"] = True sample["database_write_executed"] = True sample["blocked_reasons"] = ["mcp_calls_table_missing"] receipt = build_mcp_runtime_smoke_receipt_preview(receipt=sample) assert receipt["runtime_smoke_receipt_accepted"] is False assert "all_servers_healthy" in receipt["blocked_reasons"] assert "telemetry_read_only_confirmed" in receipt["blocked_reasons"] assert "no_database_write_or_scheduler_flags" in receipt["blocked_reasons"] assert "receipt_has_no_blocked_reasons" in receipt["blocked_reasons"] assert receipt["prohibited_flags"] == ["database_write_executed"] assert receipt["receipt_blocked_reasons"] == ["mcp_calls_table_missing"] assert receipt["database_write_executed"] is False assert receipt["payload_persisted"] is False def test_mcp_runtime_smoke_receipt_route_get_and_post_are_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get("/api/market_intel/mcp_runtime_smoke_receipt") get_data = get_response.get_json() sample = get_data["sample_receipt_template"] post_response = client.post( "/api/market_intel/mcp_runtime_smoke_receipt", json={"receipt": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_runtime_smoke_receipt_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_executes_health_check"] is False assert get_data["api_writes_database"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_runtime_smoke_receipt_review" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["runtime_smoke_receipt_accepted"] is True assert post_data["receipt_persisted"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_uses_external_network"] is False def test_mcp_runtime_promotion_preview_is_safe_without_payload(): promotion = build_mcp_runtime_promotion_preview( phase="phase_140_market_intel_professional_source_governance" ) assert promotion["mode"] == "mcp_runtime_promotion_preview" assert promotion["phase"] == "phase_140_market_intel_professional_source_governance" assert promotion["promotion_payload_received"] is False assert promotion["runtime_promotion_accepted"] is False assert promotion["ready_for_completion_runtime_promotion"] is False assert promotion["ready_for_manual_fetch_gate_review"] is False assert promotion["fetch_gate_still_requires_separate_review"] is True assert promotion["payload_persisted"] is False assert promotion["promotion_persisted"] is False assert promotion["api_executes_health_check"] is False assert promotion["api_opens_database_connection"] is False assert promotion["api_writes_database"] is False assert promotion["api_uses_external_network"] is False assert promotion["database_write_executed"] is False assert promotion["external_network_executed"] is False assert promotion["scheduler_attached"] is False assert "activation_evidence_payload_received" in promotion["blocked_reasons"] assert "runtime_receipt_payload_received" in promotion["blocked_reasons"] assert "activation_evidence" in promotion["sample_promotion_package"] assert "runtime_receipt" in promotion["sample_promotion_package"] def test_mcp_runtime_promotion_accepts_evidence_and_receipt_package(): sample = build_mcp_runtime_promotion_preview()[ "sample_promotion_package" ] promotion = build_mcp_runtime_promotion_preview( activation_evidence=sample["activation_evidence"], runtime_receipt=sample["runtime_receipt"], phase="phase_140_market_intel_professional_source_governance", ) assert promotion["mode"] == "mcp_runtime_promotion_review" assert promotion["runtime_promotion_accepted"] is True assert promotion["ready_for_completion_runtime_promotion"] is True assert promotion["ready_for_manual_fetch_gate_review"] is True assert promotion["external_mcp_runtime_promoted_by_receipts"] is True assert promotion["internal_mcp_runtime_promoted_by_receipts"] is True assert promotion["blocked_reasons"] == [] assert promotion["passed_gate_count"] == promotion["gate_count"] assert promotion["activation_summary"]["accepted"] is True assert promotion["runtime_receipt_summary"]["accepted"] is True assert promotion["payload_persisted"] is False assert promotion["promotion_persisted"] is False assert promotion["api_executes_health_check"] is False assert promotion["api_writes_database"] is False assert promotion["external_network_executed"] is False def test_mcp_runtime_promotion_blocks_partial_or_unsafe_package(): sample = build_mcp_runtime_promotion_preview()[ "sample_promotion_package" ] sample["runtime_receipt"]["database_write_executed"] = True promotion = build_mcp_runtime_promotion_preview( activation_evidence=sample["activation_evidence"], runtime_receipt=sample["runtime_receipt"], ) assert promotion["runtime_promotion_accepted"] is False assert "runtime_smoke_receipt_accepted" in promotion["blocked_reasons"] assert "promotion_payload_not_persisted" not in promotion["blocked_reasons"] assert promotion["runtime_receipt_summary"]["accepted"] is False assert promotion["database_write_executed"] is False assert promotion["payload_persisted"] is False def test_mcp_runtime_promotion_route_get_and_post_are_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get("/api/market_intel/mcp_runtime_promotion") get_data = get_response.get_json() sample = get_data["sample_promotion_package"] post_response = client.post( "/api/market_intel/mcp_runtime_promotion", json={"promotion_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_runtime_promotion_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_executes_health_check"] is False assert get_data["api_writes_database"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_runtime_promotion_review" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["runtime_promotion_accepted"] is True assert post_data["promotion_persisted"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_uses_external_network"] is False def test_mcp_manual_fetch_handoff_preview_is_safe_without_payload(): handoff = build_mcp_manual_fetch_handoff_preview( phase="phase_140_market_intel_professional_source_governance", ) assert handoff["mode"] == "mcp_manual_fetch_handoff_preview" assert handoff["phase"] == "phase_140_market_intel_professional_source_governance" assert handoff["handoff_payload_received"] is False assert handoff["manual_fetch_handoff_accepted"] is False assert handoff["ready_for_manual_fetch_gate_operator_review"] is False assert handoff["manual_fetch_gate_opened_by_api"] is False assert handoff["network_request_allowed"] is False assert handoff["fetch_executed"] is False assert handoff["payload_persisted"] is False assert handoff["handoff_persisted"] is False assert handoff["api_executes_health_check"] is False assert handoff["api_opens_database_connection"] is False assert handoff["api_writes_database"] is False assert handoff["api_uses_external_network"] is False assert handoff["database_write_executed"] is False assert handoff["external_network_executed"] is False assert handoff["scheduler_attached"] is False assert "runtime_promotion_payload_or_review_received" in handoff["blocked_reasons"] assert "operator_acknowledgements_complete" in handoff["blocked_reasons"] assert "promotion_package" in handoff["sample_handoff_package"] assert "operator_acknowledgements" in handoff["sample_handoff_package"] def test_mcp_manual_fetch_handoff_accepts_promotion_and_acknowledgements(): preview = build_mcp_manual_fetch_handoff_preview() sample = preview["sample_handoff_package"] handoff = build_mcp_manual_fetch_handoff_preview( promotion_package=sample["promotion_package"], operator_acknowledgements=sample["operator_acknowledgements"], phase="phase_140_market_intel_professional_source_governance", ) assert handoff["mode"] == "mcp_manual_fetch_handoff_review" assert handoff["manual_fetch_handoff_accepted"] is True assert handoff["ready_for_manual_fetch_gate_operator_review"] is True assert handoff["runtime_promotion_accepted"] is True assert handoff["operator_acknowledgements_complete"] is True assert handoff["blocked_reasons"] == [] assert handoff["passed_gate_count"] == handoff["gate_count"] assert handoff["promotion_summary"]["accepted"] is True assert handoff["fetch_gate_summary"]["network_request_allowed"] is False assert handoff["manual_fetch_gate_opened_by_api"] is False assert handoff["network_request_allowed"] is False assert handoff["fetch_executed"] is False assert handoff["payload_persisted"] is False assert handoff["handoff_persisted"] is False assert handoff["api_executes_health_check"] is False assert handoff["api_writes_database"] is False assert handoff["external_network_executed"] is False assert handoff["scheduler_attached"] is False def test_mcp_manual_fetch_handoff_blocks_missing_acknowledgement(): sample = build_mcp_manual_fetch_handoff_preview()["sample_handoff_package"] sample["operator_acknowledgements"]["no_scheduler_attach"] = False handoff = build_mcp_manual_fetch_handoff_preview( promotion_package=sample["promotion_package"], operator_acknowledgements=sample["operator_acknowledgements"], ) assert handoff["manual_fetch_handoff_accepted"] is False assert handoff["runtime_promotion_accepted"] is True assert handoff["operator_acknowledgements_complete"] is False assert "operator_acknowledgements_complete" in handoff["blocked_reasons"] assert "ack_no_scheduler_attach" in handoff["blocked_reasons"] assert handoff["network_request_allowed"] is False assert handoff["database_write_executed"] is False def test_mcp_manual_fetch_handoff_route_get_and_post_are_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get("/api/market_intel/mcp_manual_fetch_handoff") get_data = get_response.get_json() sample = get_data["sample_handoff_package"] post_response = client.post( "/api/market_intel/mcp_manual_fetch_handoff", json={"handoff_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_manual_fetch_handoff_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_executes_health_check"] is False assert get_data["api_writes_database"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_manual_fetch_handoff_review" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["manual_fetch_handoff_accepted"] is True assert post_data["manual_fetch_gate_opened_by_api"] is False assert post_data["network_request_allowed"] is False assert post_data["handoff_persisted"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_uses_external_network"] is False def test_mcp_fetch_target_review_preview_is_safe_without_payload(): review = build_mcp_fetch_target_review_preview( phase="phase_140_market_intel_professional_source_governance", ) assert review["mode"] == "mcp_fetch_target_review_preview" assert review["phase"] == "phase_140_market_intel_professional_source_governance" assert review["target_payload_received"] is False assert review["mcp_fetch_target_review_accepted"] is False assert review["ready_for_manual_fetch_run_package_review"] is False assert review["adapter_target_count"] >= 4 assert review["manual_fetch_gate_opened_by_api"] is False assert review["network_request_allowed"] is False assert review["fetch_executed"] is False assert review["payload_persisted"] is False assert review["target_review_persisted"] is False assert review["api_executes_health_check"] is False assert review["api_opens_database_connection"] is False assert review["api_writes_database"] is False assert review["api_uses_external_network"] is False assert review["database_write_executed"] is False assert review["external_network_executed"] is False assert review["scheduler_attached"] is False assert "manual_fetch_handoff_payload_or_review_received" in review["blocked_reasons"] assert "target_payload_received" in review["blocked_reasons"] assert "handoff_package" in review["sample_target_review_package"] assert "target_review" in review["sample_target_review_package"] def test_mcp_fetch_target_review_accepts_sample_targets(): sample = build_mcp_fetch_target_review_preview()[ "sample_target_review_package" ] review = build_mcp_fetch_target_review_preview( handoff_package=sample["handoff_package"], target_review=sample["target_review"], phase="phase_140_market_intel_professional_source_governance", ) assert review["mode"] == "mcp_fetch_target_review" assert review["mcp_fetch_target_review_accepted"] is True assert review["ready_for_manual_fetch_run_package_review"] is True assert review["manual_fetch_handoff_accepted"] is True assert review["operator_acknowledgements_complete"] is True assert review["blocked_reasons"] == [] assert review["passed_gate_count"] == review["gate_count"] assert review["platform_target_count"] >= 4 assert review["source_target_count"] >= 8 assert {item["platform_code"] for item in review["target_summaries"]} >= { "momo", "pchome", "coupang", "shopee", } assert all(item["ready"] for item in review["target_summaries"]) assert review["manual_fetch_gate_opened_by_api"] is False assert review["network_request_allowed"] is False assert review["fetch_executed"] is False assert review["database_write_executed"] is False assert review["target_review_persisted"] is False assert review["api_opens_database_connection"] is False assert review["api_uses_external_network"] is False assert review["scheduler_attached"] is False def test_mcp_fetch_target_review_blocks_unknown_or_unsafe_target(): sample = build_mcp_fetch_target_review_preview()[ "sample_target_review_package" ] target_review = sample["target_review"] target_review["platform_targets"][0]["source_keys"] = ["unknown_source"] target_review["platform_targets"][0]["delay_seconds"] = 0.1 target_review["platform_targets"][0]["allow_external_network_in_api"] = True target_review["operator_acknowledgements"]["no_api_fetch_execution"] = False review = build_mcp_fetch_target_review_preview( handoff_package=sample["handoff_package"], target_review=target_review, ) assert review["mcp_fetch_target_review_accepted"] is False assert review["manual_fetch_handoff_accepted"] is True assert review["unknown_source_keys"][0]["source_key"] == "unknown_source" assert "all_source_keys_known" in review["blocked_reasons"] assert "rate_limits_within_policy" in review["blocked_reasons"] assert "public_pages_only_confirmed" in review["blocked_reasons"] assert "target_review_side_effect_free" in review["blocked_reasons"] assert "ack_no_api_fetch_execution" in review["blocked_reasons"] assert review["network_request_allowed"] is False assert review["api_writes_database"] is False assert review["scheduler_attached"] is False def test_mcp_fetch_target_review_route_get_and_post_are_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get("/api/market_intel/mcp_fetch_target_review") get_data = get_response.get_json() sample = get_data["sample_target_review_package"] post_response = client.post( "/api/market_intel/mcp_fetch_target_review", json={"target_review_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_fetch_target_review_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_executes_health_check"] is False assert get_data["api_writes_database"] is False assert get_data["api_uses_external_network"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_target_review" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["mcp_fetch_target_review_accepted"] is True assert post_data["manual_fetch_gate_opened_by_api"] is False assert post_data["network_request_allowed"] is False assert post_data["fetch_executed"] is False assert post_data["target_review_persisted"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_uses_external_network"] is False def test_mcp_fetch_run_package_preview_is_safe_without_payload(): package = build_mcp_fetch_run_package_preview( phase="phase_140_market_intel_professional_source_governance", ) assert package["mode"] == "mcp_fetch_run_package_preview" assert package["phase"] == "phase_140_market_intel_professional_source_governance" assert package["run_payload_received"] is False assert package["mcp_fetch_run_package_accepted"] is False assert package["ready_for_manual_fetch_run_readiness_review"] is False assert package["ready_for_manual_fetch_operator_run"] is False assert package["manual_fetch_gate_opened_by_api"] is False assert package["network_request_allowed"] is False assert package["fetch_executed"] is False assert package["cli_executed"] is False assert package["payload_persisted"] is False assert package["run_package_persisted"] is False assert package["command_preview_persisted"] is False assert package["package_artifact_created"] is False assert package["api_executes_cli"] is False assert package["api_opens_database_connection"] is False assert package["api_writes_database"] is False assert package["api_uses_external_network"] is False assert package["database_write_executed"] is False assert package["external_network_executed"] is False assert package["file_written"] is False assert package["scheduler_attached"] is False assert "target_review_payload_or_result_received" in package["blocked_reasons"] assert "operator_run_controls_received" in package["blocked_reasons"] assert "target_review_package" in package["sample_run_package"] assert "operator_run_controls" in package["sample_run_package"] def test_mcp_fetch_run_package_accepts_sample_package(): sample = build_mcp_fetch_run_package_preview()["sample_run_package"] package = build_mcp_fetch_run_package_preview( target_review_package=sample["target_review_package"], operator_run_controls=sample["operator_run_controls"], phase="phase_140_market_intel_professional_source_governance", ) assert package["mode"] == "mcp_fetch_run_package_review" assert package["mcp_fetch_run_package_accepted"] is True assert package["ready_for_manual_fetch_run_readiness_review"] is True assert package["ready_for_manual_fetch_operator_run"] is False assert package["target_review_accepted"] is True assert package["operator_acknowledgements_complete"] is True assert package["blocked_reasons"] == [] assert package["passed_gate_count"] == package["gate_count"] assert package["command_preview_count"] >= 8 assert all( item["command_executed"] is False and item["external_network_executed_by_api"] is False and item["receipt_written_by_api"] is False for item in package["command_previews"] ) assert package["manual_fetch_gate_opened_by_api"] is False assert package["network_request_allowed"] is False assert package["fetch_executed"] is False assert package["cli_executed"] is False assert package["package_artifact_created"] is False assert package["file_written"] is False assert package["database_write_executed"] is False assert package["api_uses_external_network"] is False assert package["scheduler_attached"] is False def test_mcp_fetch_run_package_blocks_unsafe_controls(): sample = build_mcp_fetch_run_package_preview()["sample_run_package"] controls = sample["operator_run_controls"] controls["artifact_dir"] = "../unsafe" controls["max_total_requests"] = 99 controls["allow_api_execution"] = True controls["operator_acknowledgements"]["no_api_execution"] = False package = build_mcp_fetch_run_package_preview( target_review_package=sample["target_review_package"], operator_run_controls=controls, ) assert package["mcp_fetch_run_package_accepted"] is False assert package["target_review_accepted"] is True assert "artifact_dir_safe" in package["blocked_reasons"] assert "request_budget_within_target_limit" in package["blocked_reasons"] assert "no_api_fetch_execution" in package["blocked_reasons"] assert "run_package_side_effect_free" in package["blocked_reasons"] assert "ack_no_api_execution" in package["blocked_reasons"] assert package["network_request_allowed"] is False assert package["api_writes_database"] is False assert package["scheduler_attached"] is False def test_mcp_fetch_run_package_route_get_and_post_are_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get("/api/market_intel/mcp_fetch_run_package") get_data = get_response.get_json() sample = get_data["sample_run_package"] post_response = client.post( "/api/market_intel/mcp_fetch_run_package", json={"run_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_fetch_run_package_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_executes_cli"] is False assert get_data["api_writes_database"] is False assert get_data["api_uses_external_network"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_run_package_review" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["mcp_fetch_run_package_accepted"] is True assert post_data["ready_for_manual_fetch_operator_run"] is False assert post_data["manual_fetch_gate_opened_by_api"] is False assert post_data["network_request_allowed"] is False assert post_data["fetch_executed"] is False assert post_data["cli_executed"] is False assert post_data["run_package_persisted"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_uses_external_network"] is False def test_mcp_fetch_run_readiness_preview_is_safe_without_payload(): readiness = build_mcp_fetch_run_readiness_preview( phase="phase_140_market_intel_professional_source_governance", ) assert readiness["mode"] == "mcp_fetch_run_readiness_preview" assert readiness["phase"] == "phase_140_market_intel_professional_source_governance" assert readiness["run_readiness_payload_received"] is False assert readiness["mcp_fetch_run_readiness_accepted"] is False assert readiness["run_readiness_ready"] is False assert readiness["ready_for_manual_fetch_operator_run"] is False assert readiness["ready_for_manual_fetch_run_receipt_gate"] is False assert readiness["manual_fetch_gate_opened_by_api"] is False assert readiness["network_request_allowed"] is False assert readiness["fetch_executed"] is False assert readiness["cli_executed"] is False assert readiness["payload_persisted"] is False assert readiness["run_readiness_persisted"] is False assert readiness["run_readiness_artifact_created"] is False assert readiness["run_readiness_file_written"] is False assert readiness["receipt_file_written"] is False assert readiness["api_executes_cli"] is False assert readiness["api_opens_database_connection"] is False assert readiness["api_writes_database"] is False assert readiness["api_uses_external_network"] is False assert readiness["database_write_executed"] is False assert readiness["external_network_executed"] is False assert readiness["file_written"] is False assert readiness["scheduler_attached"] is False assert "run_package_payload_or_result_received" in readiness["blocked_reasons"] assert "operator_readiness_received" in readiness["blocked_reasons"] assert "run_package" in readiness["sample_run_readiness_package"] assert "operator_readiness" in readiness["sample_run_readiness_package"] def test_mcp_fetch_run_readiness_accepts_sample_package(): sample = build_mcp_fetch_run_readiness_preview()["sample_run_readiness_package"] readiness = build_mcp_fetch_run_readiness_preview( run_package=sample["run_package"], run_package_result=sample["run_package_result"], operator_readiness=sample["operator_readiness"], phase="phase_140_market_intel_professional_source_governance", ) assert readiness["mode"] == "mcp_fetch_run_readiness_review" assert readiness["phase"] == "phase_140_market_intel_professional_source_governance" assert readiness["mcp_fetch_run_readiness_accepted"] is True assert readiness["run_readiness_ready"] is True assert readiness["ready_for_manual_fetch_operator_run"] is True assert readiness["ready_for_manual_fetch_run_receipt_gate"] is True assert readiness["operator_shell_external_network_required"] is True assert readiness["blocked_reasons"] == [] assert readiness["passed_gate_count"] == readiness["gate_count"] assert readiness["run_package_summary"]["accepted"] is True assert readiness["run_package_summary"]["command_count"] >= 8 assert readiness["operator_readiness_summary"]["run_readiness_artifact_path_safe"] is True assert readiness["operator_readiness_summary"]["dry_run_receipt_path_safe"] is True assert all( item["ready_for_operator_shell"] is True and item["command_executed"] is False and item["external_network_executed_by_api"] is False and item["receipt_written_by_api"] is False for item in readiness["command_readiness"] ) assert readiness["manual_fetch_gate_opened_by_api"] is False assert readiness["network_request_allowed"] is False assert readiness["fetch_executed"] is False assert readiness["cli_executed"] is False assert readiness["run_readiness_artifact_created"] is False assert readiness["file_written"] is False assert readiness["database_write_executed"] is False assert readiness["api_uses_external_network"] is False assert readiness["scheduler_attached"] is False def test_mcp_fetch_run_readiness_blocks_unsafe_operator_payload(): sample = build_mcp_fetch_run_readiness_preview()["sample_run_readiness_package"] operator_readiness = sample["operator_readiness"] operator_readiness["run_readiness_artifact_path"] = "../unsafe.json" operator_readiness["api_executes_cli"] = True operator_readiness["approval_token"] = "do-not-submit" operator_readiness["operator_confirmed_no_api_execution"] = False readiness = build_mcp_fetch_run_readiness_preview( run_package=sample["run_package"], run_package_result=sample["run_package_result"], operator_readiness=operator_readiness, ) assert readiness["mcp_fetch_run_readiness_accepted"] is False assert readiness["run_package_accepted"] is True assert "run_readiness_artifact_path_safe" in readiness["blocked_reasons"] assert "operator_confirmed_shell_only_boundaries" in readiness["blocked_reasons"] assert "secret_or_token_not_submitted_to_api" in readiness["blocked_reasons"] assert "operator_readiness_side_effect_free" in readiness["blocked_reasons"] assert readiness["network_request_allowed"] is False assert readiness["api_writes_database"] is False assert readiness["scheduler_attached"] is False def test_mcp_fetch_run_readiness_route_get_and_post_are_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get("/api/market_intel/mcp_fetch_run_readiness") get_data = get_response.get_json() sample = get_data["sample_run_readiness_package"] post_response = client.post( "/api/market_intel/mcp_fetch_run_readiness", json={"run_readiness": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_fetch_run_readiness_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_executes_cli"] is False assert get_data["api_writes_database"] is False assert get_data["api_uses_external_network"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_run_readiness_review" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["mcp_fetch_run_readiness_accepted"] is True assert post_data["ready_for_manual_fetch_operator_run"] is True assert post_data["manual_fetch_gate_opened_by_api"] is False assert post_data["network_request_allowed"] is False assert post_data["fetch_executed"] is False assert post_data["cli_executed"] is False assert post_data["run_readiness_persisted"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_uses_external_network"] is False def test_mcp_fetch_run_receipt_preview_is_safe_without_payload(): receipt = build_mcp_fetch_run_receipt_preview( phase="phase_140_market_intel_professional_source_governance", ) assert receipt["mode"] == "mcp_fetch_run_receipt_preview" assert receipt["phase"] == "phase_140_market_intel_professional_source_governance" assert receipt["run_receipt_payload_received"] is False assert receipt["mcp_fetch_run_receipt_accepted"] is False assert receipt["run_receipt_ready"] is False assert receipt["ready_for_manual_fetch_result_parser_review"] is False assert receipt["ready_for_api_database_write"] is False assert receipt["ready_for_scheduler_attach"] is False assert receipt["manual_fetch_gate_opened_by_api"] is False assert receipt["network_request_allowed"] is False assert receipt["fetch_executed"] is False assert receipt["fetch_executed_by_api"] is False assert receipt["cli_executed"] is False assert receipt["payload_persisted"] is False assert receipt["run_receipt_persisted"] is False assert receipt["receipt_persisted"] is False assert receipt["run_receipt_file_written"] is False assert receipt["receipt_file_written"] is False assert receipt["api_executes_cli"] is False assert receipt["api_opens_database_connection"] is False assert receipt["api_writes_database"] is False assert receipt["api_uses_external_network"] is False assert receipt["database_write_executed"] is False assert receipt["external_network_executed"] is False assert receipt["file_written"] is False assert receipt["scheduler_attached"] is False assert "run_readiness_payload_or_result_received" in receipt["blocked_reasons"] assert "manual_fetch_receipt_received" in receipt["blocked_reasons"] assert "run_readiness_package" in receipt["sample_run_receipt_package"] assert "manual_fetch_receipt" in receipt["sample_run_receipt_package"] def test_mcp_fetch_run_receipt_accepts_sample_receipt(): sample = build_mcp_fetch_run_receipt_preview()["sample_run_receipt_package"] receipt = build_mcp_fetch_run_receipt_preview( run_readiness_package=sample["run_readiness_package"], run_readiness_result=sample["run_readiness_result"], manual_fetch_receipt=sample["manual_fetch_receipt"], phase="phase_140_market_intel_professional_source_governance", ) assert receipt["mode"] == "mcp_fetch_run_receipt_review" assert receipt["phase"] == "phase_140_market_intel_professional_source_governance" assert receipt["mcp_fetch_run_receipt_accepted"] is True assert receipt["run_receipt_ready"] is True assert receipt["operator_shell_fetch_receipt_received"] is True assert receipt["ready_for_manual_fetch_result_parser_review"] is True assert receipt["ready_for_api_database_write"] is False assert receipt["blocked_reasons"] == [] assert receipt["passed_gate_count"] == receipt["gate_count"] assert receipt["run_readiness_accepted"] is True assert receipt["expected_command_count"] >= 8 assert receipt["receipt_source_count"] == receipt["expected_command_count"] assert receipt["manual_fetch_receipt_summary"]["all_urls_public"] is True assert receipt["manual_fetch_receipt_summary"]["all_receipt_paths_safe"] is True assert receipt["manual_fetch_receipt_summary"]["blocked_side_effects"] == [] assert receipt["manual_fetch_gate_opened_by_api"] is False assert receipt["network_request_allowed"] is False assert receipt["fetch_executed"] is False assert receipt["fetch_executed_by_api"] is False assert receipt["cli_executed"] is False assert receipt["run_receipt_file_written"] is False assert receipt["file_written"] is False assert receipt["database_write_executed"] is False assert receipt["api_uses_external_network"] is False assert receipt["scheduler_attached"] is False def test_mcp_fetch_run_receipt_blocks_unsafe_receipt_payload(): sample = json.loads( json.dumps(build_mcp_fetch_run_receipt_preview()["sample_run_receipt_package"]) ) manual_fetch_receipt = sample["manual_fetch_receipt"] manual_fetch_receipt["approval_token"] = "do-not-submit" manual_fetch_receipt["api_writes_database"] = True manual_fetch_receipt["summary"]["request_count"] = 99 manual_fetch_receipt["operator_confirmed_no_api_execution"] = False first_source = manual_fetch_receipt["sources"][0] first_source["source_url"] = "http://127.0.0.1/private" first_source["receipt_path"] = "../unsafe.json" receipt = build_mcp_fetch_run_receipt_preview( run_readiness_package=sample["run_readiness_package"], run_readiness_result=sample["run_readiness_result"], manual_fetch_receipt=manual_fetch_receipt, ) assert receipt["mcp_fetch_run_receipt_accepted"] is False assert receipt["run_readiness_accepted"] is True assert "receipt_paths_match_expected" in receipt["blocked_reasons"] assert "receipt_request_budget_within_limit" in receipt["blocked_reasons"] assert "receipt_urls_public_http" in receipt["blocked_reasons"] assert "receipt_operator_boundaries_confirmed" in receipt["blocked_reasons"] assert "receipt_no_secret_or_token_key" in receipt["blocked_reasons"] assert "receipt_side_effect_free" in receipt["blocked_reasons"] assert receipt["network_request_allowed"] is False assert receipt["api_writes_database"] is False assert receipt["scheduler_attached"] is False def test_mcp_fetch_run_receipt_route_get_and_post_are_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get("/api/market_intel/mcp_fetch_run_receipt") get_data = get_response.get_json() sample = get_data["sample_run_receipt_package"] post_response = client.post( "/api/market_intel/mcp_fetch_run_receipt", json={"run_receipt": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_fetch_run_receipt_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_executes_cli"] is False assert get_data["api_writes_database"] is False assert get_data["api_uses_external_network"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_run_receipt_review" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["mcp_fetch_run_receipt_accepted"] is True assert post_data["ready_for_manual_fetch_result_parser_review"] is True assert post_data["ready_for_api_database_write"] is False assert post_data["manual_fetch_gate_opened_by_api"] is False assert post_data["network_request_allowed"] is False assert post_data["fetch_executed"] is False assert post_data["fetch_executed_by_api"] is False assert post_data["cli_executed"] is False assert post_data["run_receipt_persisted"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_uses_external_network"] is False def test_mcp_fetch_result_parser_review_preview_is_safe_without_payload(): parser = build_mcp_fetch_result_parser_review_preview( phase="phase_140_market_intel_professional_source_governance", ) assert parser["mode"] == "mcp_fetch_result_parser_review_preview" assert parser["phase"] == "phase_140_market_intel_professional_source_governance" assert parser["parser_payload_received"] is False assert parser["mcp_fetch_result_parser_review_accepted"] is False assert parser["result_parser_review_ready"] is False assert parser["ready_for_manual_fetch_candidate_handoff_review"] is False assert parser["ready_for_api_database_write"] is False assert parser["ready_for_scheduler_attach"] is False assert parser["manual_fetch_gate_opened_by_api"] is False assert parser["network_request_allowed"] is False assert parser["parser_executed_by_api"] is False assert parser["fetch_executed"] is False assert parser["cli_executed"] is False assert parser["payload_persisted"] is False assert parser["result_parser_persisted"] is False assert parser["result_parser_file_written"] is False assert parser["candidate_handoff_persisted"] is False assert parser["api_executes_cli"] is False assert parser["api_opens_database_connection"] is False assert parser["api_writes_database"] is False assert parser["api_uses_external_network"] is False assert parser["database_write_executed"] is False assert parser["external_network_executed"] is False assert parser["file_written"] is False assert parser["scheduler_attached"] is False assert "run_receipt_payload_or_result_received" in parser["blocked_reasons"] assert "parser_result_received" in parser["blocked_reasons"] assert "run_receipt_package" in parser["sample_parser_result_package"] assert "parser_result" in parser["sample_parser_result_package"] def test_mcp_fetch_result_parser_review_accepts_sample_result(): sample = ( build_mcp_fetch_result_parser_review_preview() ["sample_parser_result_package"] ) parser = build_mcp_fetch_result_parser_review_preview( run_receipt_package=sample["run_receipt_package"], run_receipt_result=sample["run_receipt_result"], parser_result=sample["parser_result"], phase="phase_140_market_intel_professional_source_governance", ) assert parser["mode"] == "mcp_fetch_result_parser_review" assert parser["phase"] == "phase_140_market_intel_professional_source_governance" assert parser["mcp_fetch_result_parser_review_accepted"] is True assert parser["result_parser_review_ready"] is True assert parser["ready_for_manual_fetch_candidate_handoff_review"] is True assert parser["ready_for_api_database_write"] is False assert parser["blocked_reasons"] == [] assert parser["passed_gate_count"] == parser["gate_count"] assert parser["run_receipt_accepted"] is True assert parser["parser_source_count"] >= 8 assert parser["candidate_count"] == ( parser["campaign_candidate_count"] + parser["product_candidate_count"] ) assert parser["parser_result_summary"]["all_candidate_urls_public"] is True assert parser["parser_result_summary"]["all_candidate_required_fields_present"] is True assert parser["parser_result_summary"]["raw_payload_submitted_to_api"] is False assert parser["manual_fetch_gate_opened_by_api"] is False assert parser["network_request_allowed"] is False assert parser["parser_executed_by_api"] is False assert parser["fetch_executed"] is False assert parser["cli_executed"] is False assert parser["result_parser_file_written"] is False assert parser["file_written"] is False assert parser["database_write_executed"] is False assert parser["api_uses_external_network"] is False assert parser["scheduler_attached"] is False def test_mcp_fetch_result_parser_review_blocks_unsafe_parser_payload(): sample = json.loads( json.dumps( build_mcp_fetch_result_parser_review_preview() ["sample_parser_result_package"] ) ) parser_result = sample["parser_result"] parser_result["approval_token"] = "do-not-submit" parser_result["raw_html"] = "raw" parser_result["api_writes_database"] = True parser_result["operator_confirmed_no_api_execution"] = False first_source = parser_result["parsed_sources"][0] first_source["parser_artifact_path"] = "../unsafe.json" first_source["campaign_candidates"][0]["campaign_url"] = "http://127.0.0.1/private" first_source["product_candidates"][0].pop("platform_product_id") parser = build_mcp_fetch_result_parser_review_preview( run_receipt_package=sample["run_receipt_package"], run_receipt_result=sample["run_receipt_result"], parser_result=parser_result, ) assert parser["mcp_fetch_result_parser_review_accepted"] is False assert parser["run_receipt_accepted"] is True assert "parser_artifact_paths_safe" in parser["blocked_reasons"] assert "parser_candidate_required_fields_present" in parser["blocked_reasons"] assert "parser_candidate_urls_public_http" in parser["blocked_reasons"] assert "parser_operator_boundaries_confirmed" in parser["blocked_reasons"] assert "parser_no_raw_payload" in parser["blocked_reasons"] assert "parser_no_secret_or_token_key" in parser["blocked_reasons"] assert "parser_side_effect_free" in parser["blocked_reasons"] assert parser["network_request_allowed"] is False assert parser["api_writes_database"] is False assert parser["scheduler_attached"] is False def test_mcp_fetch_result_parser_review_route_get_and_post_are_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get("/api/market_intel/mcp_fetch_result_parser_review") get_data = get_response.get_json() sample = get_data["sample_parser_result_package"] post_response = client.post( "/api/market_intel/mcp_fetch_result_parser_review", json={"parser_review": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_fetch_result_parser_review_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_executes_cli"] is False assert get_data["api_writes_database"] is False assert get_data["api_uses_external_network"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_result_parser_review" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["mcp_fetch_result_parser_review_accepted"] is True assert post_data["ready_for_manual_fetch_candidate_handoff_review"] is True assert post_data["ready_for_api_database_write"] is False assert post_data["manual_fetch_gate_opened_by_api"] is False assert post_data["network_request_allowed"] is False assert post_data["parser_executed_by_api"] is False assert post_data["fetch_executed"] is False assert post_data["cli_executed"] is False assert post_data["result_parser_persisted"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_uses_external_network"] is False def test_mcp_fetch_candidate_handoff_review_preview_is_safe_without_payload(): handoff = build_mcp_fetch_candidate_handoff_review_preview( phase="phase_140_market_intel_professional_source_governance", ) assert handoff["mode"] == "mcp_fetch_candidate_handoff_review_preview" assert handoff["phase"] == "phase_140_market_intel_professional_source_governance" assert handoff["candidate_handoff_payload_received"] is False assert handoff["mcp_fetch_candidate_handoff_review_accepted"] is False assert handoff["candidate_handoff_review_ready"] is False assert handoff["ready_for_manual_candidate_queue_review"] is False assert handoff["ready_for_candidate_queue_writer_preflight"] is False assert handoff["ready_for_api_database_write"] is False assert handoff["ready_for_scheduler_attach"] is False assert handoff["manual_fetch_gate_opened_by_api"] is False assert handoff["network_request_allowed"] is False assert handoff["fetch_executed"] is False assert handoff["cli_executed"] is False assert handoff["payload_persisted"] is False assert handoff["candidate_handoff_persisted"] is False assert handoff["candidate_queue_created"] is False assert handoff["candidate_queue_persisted"] is False assert handoff["api_executes_cli"] is False assert handoff["api_opens_database_connection"] is False assert handoff["api_writes_database"] is False assert handoff["api_uses_external_network"] is False assert handoff["database_write_executed"] is False assert handoff["external_network_executed"] is False assert handoff["file_written"] is False assert handoff["scheduler_attached"] is False assert "parser_review_payload_or_result_received" in handoff["blocked_reasons"] assert "handoff_payload_received" in handoff["blocked_reasons"] assert "parser_review_package" in handoff["sample_candidate_handoff_package"] assert "candidate_handoff" in handoff["sample_candidate_handoff_package"] def test_mcp_fetch_candidate_handoff_review_accepts_sample_handoff(): sample = ( build_mcp_fetch_candidate_handoff_review_preview() ["sample_candidate_handoff_package"] ) handoff = build_mcp_fetch_candidate_handoff_review_preview( parser_review_package=sample["parser_review_package"], parser_review_result=sample["parser_review_result"], candidate_handoff=sample["candidate_handoff"], phase="phase_140_market_intel_professional_source_governance", ) assert handoff["mode"] == "mcp_fetch_candidate_handoff_review" assert handoff["phase"] == "phase_140_market_intel_professional_source_governance" assert handoff["mcp_fetch_candidate_handoff_review_accepted"] is True assert handoff["candidate_handoff_review_ready"] is True assert handoff["ready_for_manual_candidate_queue_review"] is True assert handoff["ready_for_candidate_queue_writer_preflight"] is False assert handoff["ready_for_api_database_write"] is False assert handoff["blocked_reasons"] == [] assert handoff["passed_gate_count"] == handoff["gate_count"] assert handoff["parser_review_accepted"] is True assert handoff["handoff_source_count"] >= 8 assert handoff["candidate_count"] == ( handoff["campaign_candidate_count"] + handoff["product_candidate_count"] ) assert handoff["candidate_handoff_summary"]["all_group_paths_safe"] is True assert handoff["candidate_handoff_summary"]["all_handoff_statuses_safe"] is True assert handoff["candidate_handoff_summary"]["group_counts_match_candidates"] is True assert handoff["candidate_handoff_summary"]["raw_payload_submitted_to_api"] is False assert handoff["candidate_handoff_summary"]["secret_or_token_submitted_to_api"] is False assert handoff["manual_fetch_gate_opened_by_api"] is False assert handoff["network_request_allowed"] is False assert handoff["fetch_executed"] is False assert handoff["cli_executed"] is False assert handoff["candidate_queue_created"] is False assert handoff["candidate_queue_persisted"] is False assert handoff["file_written"] is False assert handoff["database_write_executed"] is False assert handoff["api_uses_external_network"] is False assert handoff["scheduler_attached"] is False def test_mcp_fetch_candidate_handoff_review_blocks_unsafe_handoff(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_handoff_review_preview() ["sample_candidate_handoff_package"] ) ) candidate_handoff = sample["candidate_handoff"] candidate_handoff["approval_token"] = "do-not-submit" candidate_handoff["raw_html"] = "raw" candidate_handoff["api_writes_database"] = True candidate_handoff["operator_confirmed_no_database_write"] = False candidate_handoff["queue_policy"]["write_mode"] = "write_database" first_group = candidate_handoff["candidate_groups"][0] first_group["parser_artifact_path"] = "../unsafe.json" first_group["handoff_status"] = "persisted" first_group["product_candidate_keys"].pop() handoff = build_mcp_fetch_candidate_handoff_review_preview( parser_review_package=sample["parser_review_package"], parser_review_result=sample["parser_review_result"], candidate_handoff=candidate_handoff, ) assert handoff["mcp_fetch_candidate_handoff_review_accepted"] is False assert handoff["parser_review_accepted"] is True assert "handoff_group_paths_safe" in handoff["blocked_reasons"] assert "handoff_status_operator_review_only" in handoff["blocked_reasons"] assert "handoff_candidate_counts_match_summary" in handoff["blocked_reasons"] assert "handoff_queue_policy_safe" in handoff["blocked_reasons"] assert "handoff_operator_boundaries_confirmed" in handoff["blocked_reasons"] assert "handoff_no_raw_payload" in handoff["blocked_reasons"] assert "handoff_no_secret_or_token_key" in handoff["blocked_reasons"] assert "handoff_side_effect_free" in handoff["blocked_reasons"] assert handoff["network_request_allowed"] is False assert handoff["api_writes_database"] is False assert handoff["scheduler_attached"] is False def test_mcp_fetch_candidate_handoff_review_route_get_and_post_are_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get("/api/market_intel/mcp_fetch_candidate_handoff_review") get_data = get_response.get_json() sample = get_data["sample_candidate_handoff_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_handoff_review", json={"candidate_handoff_review": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_fetch_candidate_handoff_review_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_executes_cli"] is False assert get_data["api_writes_database"] is False assert get_data["api_uses_external_network"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_candidate_handoff_review" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["mcp_fetch_candidate_handoff_review_accepted"] is True assert post_data["ready_for_manual_candidate_queue_review"] is True assert post_data["ready_for_candidate_queue_writer_preflight"] is False assert post_data["manual_fetch_gate_opened_by_api"] is False assert post_data["network_request_allowed"] is False assert post_data["fetch_executed"] is False assert post_data["cli_executed"] is False assert post_data["candidate_handoff_persisted"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_uses_external_network"] is False def test_mcp_fetch_candidate_queue_review_preview_is_safe_without_payload(): review = build_mcp_fetch_candidate_queue_review_preview( phase="phase_140_market_intel_professional_source_governance", ) assert review["mode"] == "mcp_fetch_candidate_queue_review_preview" assert review["phase"] == "phase_140_market_intel_professional_source_governance" assert review["candidate_queue_review_payload_received"] is False assert review["mcp_fetch_candidate_queue_review_accepted"] is False assert review["candidate_queue_review_ready"] is False assert review["ready_for_candidate_queue_writer_preflight"] is False assert review["ready_for_api_database_write"] is False assert review["ready_for_scheduler_attach"] is False assert review["network_request_allowed"] is False assert review["fetch_executed"] is False assert review["cli_executed"] is False assert review["payload_persisted"] is False assert review["candidate_queue_created"] is False assert review["candidate_queue_persisted"] is False assert review["candidate_review_state_updated"] is False assert review["api_executes_cli"] is False assert review["api_opens_database_connection"] is False assert review["api_writes_database"] is False assert review["api_uses_external_network"] is False assert review["database_write_executed"] is False assert review["external_network_executed"] is False assert review["file_written"] is False assert review["scheduler_attached"] is False assert "handoff_review_payload_or_result_received" in review["blocked_reasons"] assert "queue_review_payload_received" in review["blocked_reasons"] assert "handoff_review_package" in review["sample_candidate_queue_review_package"] assert "candidate_queue_review" in review["sample_candidate_queue_review_package"] def test_mcp_fetch_candidate_queue_review_accepts_sample_review(): sample = ( build_mcp_fetch_candidate_queue_review_preview() ["sample_candidate_queue_review_package"] ) review = build_mcp_fetch_candidate_queue_review_preview( handoff_review_package=sample["handoff_review_package"], handoff_review_result=sample["handoff_review_result"], candidate_queue_review=sample["candidate_queue_review"], phase="phase_140_market_intel_professional_source_governance", ) assert review["mode"] == "mcp_fetch_candidate_queue_review" assert review["phase"] == "phase_140_market_intel_professional_source_governance" assert review["mcp_fetch_candidate_queue_review_accepted"] is True assert review["candidate_queue_review_ready"] is True assert review["ready_for_candidate_queue_writer_preflight"] is True assert review["ready_for_api_database_write"] is False assert review["blocked_reasons"] == [] assert review["passed_gate_count"] == review["gate_count"] assert review["handoff_review_accepted"] is True assert review["review_item_count"] == ( review["campaign_candidate_count"] + review["product_candidate_count"] ) summary = review["candidate_queue_review_summary"] assert summary["all_review_states_safe"] is True assert summary["all_required_fields_present"] is True assert summary["all_allowed_actions_safe"] is True assert summary["all_queue_write_status_preview"] is True assert summary["raw_payload_submitted_to_api"] is False assert summary["secret_or_token_submitted_to_api"] is False assert review["network_request_allowed"] is False assert review["fetch_executed"] is False assert review["cli_executed"] is False assert review["candidate_queue_created"] is False assert review["candidate_queue_persisted"] is False assert review["candidate_review_state_updated"] is False assert review["file_written"] is False assert review["database_write_executed"] is False assert review["api_uses_external_network"] is False assert review["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_review_blocks_unsafe_review(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_review_preview() ["sample_candidate_queue_review_package"] ) ) queue_review = sample["candidate_queue_review"] queue_review["approval_token"] = "do-not-submit" queue_review["raw_html"] = "raw" queue_review["api_writes_database"] = True queue_review["operator_confirmed_no_database_write"] = False first_item = queue_review["review_items"][0] first_item["review_state"] = "approved" first_item["queue_write_status"] = "persisted" first_item["allowed_actions"] = ["auto_write"] first_item.pop("candidate_key") review = build_mcp_fetch_candidate_queue_review_preview( handoff_review_package=sample["handoff_review_package"], handoff_review_result=sample["handoff_review_result"], candidate_queue_review=queue_review, ) assert review["mcp_fetch_candidate_queue_review_accepted"] is False assert review["handoff_review_accepted"] is True assert "queue_review_candidates_match_handoff" in review["blocked_reasons"] assert "queue_review_required_fields_present" in review["blocked_reasons"] assert "queue_review_state_needs_review_only" in review["blocked_reasons"] assert "queue_review_allowed_actions_safe" in review["blocked_reasons"] assert "queue_review_not_persisted" in review["blocked_reasons"] assert "queue_review_operator_boundaries_confirmed" in review["blocked_reasons"] assert "queue_review_no_raw_payload" in review["blocked_reasons"] assert "queue_review_no_secret_or_token_key" in review["blocked_reasons"] assert "queue_review_side_effect_free" in review["blocked_reasons"] assert review["api_writes_database"] is False assert review["candidate_queue_persisted"] is False assert review["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_review_route_get_and_post_are_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get("/api/market_intel/mcp_fetch_candidate_queue_review") get_data = get_response.get_json() sample = get_data["sample_candidate_queue_review_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_review", json={"candidate_queue_review": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_fetch_candidate_queue_review_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_executes_cli"] is False assert get_data["api_writes_database"] is False assert get_data["api_uses_external_network"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_candidate_queue_review" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["mcp_fetch_candidate_queue_review_accepted"] is True assert post_data["ready_for_candidate_queue_writer_preflight"] is True assert post_data["ready_for_api_database_write"] is False assert post_data["network_request_allowed"] is False assert post_data["fetch_executed"] is False assert post_data["cli_executed"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["candidate_review_state_updated"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_uses_external_network"] is False def test_mcp_fetch_candidate_queue_writer_preflight_preview_is_safe_without_payload(): preflight = build_mcp_fetch_candidate_queue_writer_preflight_preview( phase="phase_140_market_intel_professional_source_governance", ) assert preflight["mode"] == "mcp_fetch_candidate_queue_writer_preflight_preview" assert ( preflight["phase"] == "phase_140_market_intel_professional_source_governance" ) assert preflight["writer_preflight_payload_received"] is False assert preflight["mcp_fetch_candidate_queue_writer_preflight_accepted"] is False assert preflight["candidate_queue_writer_preflight_ready"] is False assert preflight["ready_for_candidate_queue_writer_cli_review"] is False assert preflight["ready_for_api_database_write"] is False assert preflight["ready_for_scheduler_attach"] is False assert preflight["network_request_allowed"] is False assert preflight["cli_executed"] is False assert preflight["payload_persisted"] is False assert preflight["preflight_persisted"] is False assert preflight["candidate_queue_created"] is False assert preflight["candidate_queue_persisted"] is False assert preflight["candidate_review_state_updated"] is False assert preflight["api_executes_cli"] is False assert preflight["api_opens_database_connection"] is False assert preflight["api_writes_database"] is False assert preflight["api_uses_external_network"] is False assert preflight["database_write_executed"] is False assert preflight["external_network_executed"] is False assert preflight["file_written"] is False assert preflight["scheduler_attached"] is False assert "queue_review_payload_or_result_received" in preflight["blocked_reasons"] assert "writer_preflight_payload_received" in preflight["blocked_reasons"] assert "queue_review_package" in preflight["sample_writer_preflight_package"] assert "writer_preflight" in preflight["sample_writer_preflight_package"] def test_mcp_fetch_candidate_queue_writer_preflight_accepts_sample_preflight(): sample = ( build_mcp_fetch_candidate_queue_writer_preflight_preview() ["sample_writer_preflight_package"] ) preflight = build_mcp_fetch_candidate_queue_writer_preflight_preview( queue_review_package=sample["queue_review_package"], queue_review_result=sample["queue_review_result"], writer_preflight=sample["writer_preflight"], phase="phase_140_market_intel_professional_source_governance", ) assert preflight["mode"] == "mcp_fetch_candidate_queue_writer_preflight" assert ( preflight["phase"] == "phase_140_market_intel_professional_source_governance" ) assert preflight["mcp_fetch_candidate_queue_writer_preflight_accepted"] is True assert preflight["candidate_queue_writer_preflight_ready"] is True assert preflight["ready_for_candidate_queue_writer_cli_review"] is True assert preflight["ready_for_api_database_write"] is False assert preflight["blocked_reasons"] == [] assert preflight["passed_gate_count"] == preflight["gate_count"] assert preflight["queue_review_accepted"] is True assert preflight["payload_row_count"] == ( preflight["campaign_candidate_count"] + preflight["product_candidate_count"] ) summary = preflight["writer_preflight_summary"] assert summary["target_table"] == "market_alert_review_queue" assert summary["write_mode"] == "cli_only_later" assert summary["dedupe_strategy"] == "candidate_type_platform_source_key" assert summary["insert_columns_cover_required"] is True assert summary["all_rows_required_fields_present"] is True assert summary["dedupe_keys_unique"] is True assert summary["summary_counts_match_rows"] is True assert summary["raw_payload_submitted_to_api"] is False assert summary["secret_or_token_submitted_to_api"] is False assert summary["blocked_side_effects"] == [] assert preflight["network_request_allowed"] is False assert preflight["cli_executed"] is False assert preflight["candidate_queue_created"] is False assert preflight["candidate_queue_persisted"] is False assert preflight["candidate_review_state_updated"] is False assert preflight["file_written"] is False assert preflight["database_write_executed"] is False assert preflight["api_uses_external_network"] is False assert preflight["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_preflight_blocks_unsafe_preflight(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_writer_preflight_preview() ["sample_writer_preflight_package"] ) ) writer_preflight = sample["writer_preflight"] writer_preflight["target_table"] = "market_campaign_products" writer_preflight["write_mode"] = "api_write_now" writer_preflight["approval_token"] = "do-not-submit" writer_preflight["raw_html"] = "raw" writer_preflight["api_writes_database"] = True writer_preflight["operator_confirmed_no_database_write"] = False first_row = writer_preflight["payload_rows"][0] first_row["review_state"] = "approved" first_row.pop("candidate_key") preflight = build_mcp_fetch_candidate_queue_writer_preflight_preview( queue_review_package=sample["queue_review_package"], queue_review_result=sample["queue_review_result"], writer_preflight=writer_preflight, ) assert preflight["mcp_fetch_candidate_queue_writer_preflight_accepted"] is False assert preflight["queue_review_accepted"] is True assert "writer_preflight_target_table_safe" in preflight["blocked_reasons"] assert "writer_preflight_write_mode_cli_later" in preflight["blocked_reasons"] assert ( "writer_preflight_candidates_match_queue_review" in preflight["blocked_reasons"] ) assert "writer_preflight_required_fields_present" in preflight["blocked_reasons"] assert ( "writer_preflight_operator_boundaries_confirmed" in preflight["blocked_reasons"] ) assert "writer_preflight_no_raw_payload" in preflight["blocked_reasons"] assert "writer_preflight_no_secret_or_token_key" in preflight["blocked_reasons"] assert "writer_preflight_side_effect_free" in preflight["blocked_reasons"] assert preflight["api_writes_database"] is False assert preflight["candidate_queue_persisted"] is False assert preflight["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_preflight_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_preflight" ) get_data = get_response.get_json() sample = get_data["sample_writer_preflight_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_preflight", json={"writer_preflight_review": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_fetch_candidate_queue_writer_preflight_preview" assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_writes_database"] is False assert get_data["api_uses_external_network"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_candidate_queue_writer_preflight" assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert post_data["mcp_fetch_candidate_queue_writer_preflight_accepted"] is True assert post_data["ready_for_candidate_queue_writer_cli_review"] is True assert post_data["ready_for_api_database_write"] is False assert post_data["network_request_allowed"] is False assert post_data["cli_executed"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["candidate_review_state_updated"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_uses_external_network"] is False def test_mcp_fetch_candidate_queue_writer_cli_review_preview_is_safe_without_payload(): review = build_mcp_fetch_candidate_queue_writer_cli_review_preview( phase="phase_140_market_intel_professional_source_governance", ) assert review["mode"] == "mcp_fetch_candidate_queue_writer_cli_review_preview" assert ( review["phase"] == "phase_140_market_intel_professional_source_governance" ) assert review["writer_cli_review_payload_received"] is False assert review["mcp_fetch_candidate_queue_writer_cli_review_accepted"] is False assert review["candidate_queue_writer_cli_review_ready"] is False assert review["ready_for_candidate_queue_writer_run_package_review"] is False assert review["ready_for_api_database_write"] is False assert review["ready_for_real_write"] is False assert review["ready_for_scheduler_attach"] is False assert review["network_request_allowed"] is False assert review["api_executes_cli"] is False assert review["api_reads_approval_token"] is False assert review["api_opens_database_connection"] is False assert review["api_writes_database"] is False assert review["cli_executed"] is False assert review["payload_persisted"] is False assert review["cli_review_persisted"] is False assert review["package_artifact_created"] is False assert review["file_written"] is False assert review["database_write_executed"] is False assert review["scheduler_attached"] is False assert "writer_preflight_payload_or_result_received" in review["blocked_reasons"] assert "writer_cli_review_payload_received" in review["blocked_reasons"] assert "writer_preflight_package" in review["sample_writer_cli_review_package"] assert "writer_cli_review" in review["sample_writer_cli_review_package"] def test_mcp_fetch_candidate_queue_writer_cli_review_accepts_sample_review(): sample = ( build_mcp_fetch_candidate_queue_writer_cli_review_preview() ["sample_writer_cli_review_package"] ) review = build_mcp_fetch_candidate_queue_writer_cli_review_preview( writer_preflight_package=sample["writer_preflight_package"], writer_preflight_result=sample["writer_preflight_result"], writer_cli_review=sample["writer_cli_review"], phase="phase_140_market_intel_professional_source_governance", ) assert review["mode"] == "mcp_fetch_candidate_queue_writer_cli_review" assert ( review["phase"] == "phase_140_market_intel_professional_source_governance" ) assert review["mcp_fetch_candidate_queue_writer_cli_review_accepted"] is True assert review["candidate_queue_writer_cli_review_ready"] is True assert review["ready_for_candidate_queue_writer_run_package_review"] is True assert review["ready_for_api_database_write"] is False assert review["ready_for_real_write"] is False assert review["blocked_reasons"] == [] assert review["passed_gate_count"] == review["gate_count"] assert review["writer_preflight_accepted"] is True summary = review["writer_cli_review_summary"] assert summary["script_path"] == "scripts/market_intel_candidate_queue_writer.py" assert summary["target_table"] == "market_alert_review_queue" assert summary["command_mode"] == "manual_shell_review_only" assert summary["required_safe_flags_present"] is True assert summary["forbidden_command_flags_absent"] is True assert summary["candidate_keys_unique"] is True assert summary["dedupe_keys_unique"] is True assert summary["raw_payload_submitted_to_api"] is False assert summary["secret_or_token_submitted_to_api"] is False assert summary["blocked_side_effects"] == [] assert review["network_request_allowed"] is False assert review["api_executes_cli"] is False assert review["api_reads_approval_token"] is False assert review["cli_executed"] is False assert review["api_writes_file"] is False assert review["candidate_queue_persisted"] is False assert review["database_write_executed"] is False assert review["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_cli_review_blocks_unsafe_review(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_writer_cli_review_preview() ["sample_writer_cli_review_package"] ) ) cli_review = sample["writer_cli_review"] cli_review["script_path"] = "scripts/unsafe.py" cli_review["target_table"] = "market_campaign_products" cli_review["approval_token"] = "do-not-submit" cli_review["raw_html"] = "raw" cli_review["api_executes_cli"] = True cli_review["api_execution_allowed"] = True cli_review["real_write_allowed"] = True cli_review["operator_confirmed_no_api_cli_execution"] = False cli_review["command_argv_preview"].extend( ["--execute", "--apply-real-write", "--approval-token", "secret"] ) cli_review["expected_candidate_keys"].pop() review = build_mcp_fetch_candidate_queue_writer_cli_review_preview( writer_preflight_package=sample["writer_preflight_package"], writer_preflight_result=sample["writer_preflight_result"], writer_cli_review=cli_review, ) assert review["mcp_fetch_candidate_queue_writer_cli_review_accepted"] is False assert review["writer_preflight_accepted"] is True assert "writer_cli_script_path_safe" in review["blocked_reasons"] assert "writer_cli_target_table_safe" in review["blocked_reasons"] assert "writer_cli_candidate_keys_match_preflight" in review["blocked_reasons"] assert "writer_cli_forbidden_write_flags_absent" in review["blocked_reasons"] assert "writer_cli_operator_boundaries_confirmed" in review["blocked_reasons"] assert "writer_cli_no_api_execution_or_real_write" in review["blocked_reasons"] assert "writer_cli_no_raw_payload" in review["blocked_reasons"] assert "writer_cli_no_secret_or_token_key" in review["blocked_reasons"] assert "writer_cli_side_effect_free" in review["blocked_reasons"] assert review["api_executes_cli"] is False assert review["api_reads_approval_token"] is False assert review["api_writes_database"] is False assert review["candidate_queue_persisted"] is False assert review["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_cli_review_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_cli_review" ) get_data = get_response.get_json() sample = get_data["sample_writer_cli_review_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_cli_review", json={"writer_cli_review_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_fetch_candidate_queue_writer_cli_review_preview" assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_reads_approval_token"] is False assert get_data["api_writes_database"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_candidate_queue_writer_cli_review" assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert post_data["mcp_fetch_candidate_queue_writer_cli_review_accepted"] is True assert post_data["ready_for_candidate_queue_writer_run_package_review"] is True assert post_data["ready_for_api_database_write"] is False assert post_data["ready_for_real_write"] is False assert post_data["network_request_allowed"] is False assert post_data["api_executes_cli"] is False assert post_data["api_reads_approval_token"] is False assert post_data["cli_executed"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["api_opens_database_connection"] is False def test_mcp_fetch_candidate_queue_writer_run_package_review_preview_is_safe_without_payload(): review = build_mcp_fetch_candidate_queue_writer_run_package_review_preview( phase="phase_140_market_intel_professional_source_governance", ) assert review["mode"] == ( "mcp_fetch_candidate_queue_writer_run_package_review_preview" ) assert ( review["phase"] == "phase_140_market_intel_professional_source_governance" ) assert review["writer_run_package_review_payload_received"] is False assert ( review["mcp_fetch_candidate_queue_writer_run_package_review_accepted"] is False ) assert review["candidate_queue_writer_run_package_review_ready"] is False assert review["ready_for_candidate_queue_writer_run_readiness_review"] is False assert review["ready_for_api_database_write"] is False assert review["ready_for_real_write"] is False assert review["ready_for_scheduler_attach"] is False assert review["network_request_allowed"] is False assert review["api_executes_cli"] is False assert review["api_reads_approval_token"] is False assert review["api_writes_database"] is False assert review["payload_persisted"] is False assert review["run_package_review_persisted"] is False assert review["run_package_persisted"] is False assert review["package_artifact_created"] is False assert review["file_written"] is False assert review["database_write_executed"] is False assert review["scheduler_attached"] is False assert ( "writer_cli_review_payload_or_result_received" in review["blocked_reasons"] ) assert ( "writer_run_package_review_payload_received" in review["blocked_reasons"] ) assert ( "writer_cli_review_package" in review["sample_writer_run_package_review_package"] ) assert ( "writer_run_package_review" in review["sample_writer_run_package_review_package"] ) def test_mcp_fetch_candidate_queue_writer_run_package_review_accepts_sample_review(): sample = ( build_mcp_fetch_candidate_queue_writer_run_package_review_preview() ["sample_writer_run_package_review_package"] ) review = build_mcp_fetch_candidate_queue_writer_run_package_review_preview( writer_cli_review_package=sample["writer_cli_review_package"], writer_cli_review_result=sample["writer_cli_review_result"], writer_run_package_review=sample["writer_run_package_review"], phase="phase_140_market_intel_professional_source_governance", ) assert review["mode"] == "mcp_fetch_candidate_queue_writer_run_package_review" assert ( review["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( review["mcp_fetch_candidate_queue_writer_run_package_review_accepted"] is True ) assert review["candidate_queue_writer_run_package_review_ready"] is True assert review["ready_for_candidate_queue_writer_run_readiness_review"] is True assert review["ready_for_api_database_write"] is False assert review["ready_for_real_write"] is False assert review["blocked_reasons"] == [] assert review["passed_gate_count"] == review["gate_count"] assert review["writer_cli_review_accepted"] is True summary = review["writer_run_package_review_summary"] assert summary["package_mode"] == ( "candidate_queue_writer_run_package_review_preview" ) assert summary["package_stage"] == "operator_review_only" assert summary["target_table"] == "market_alert_review_queue" assert summary["artifacts_operator_created"] is True assert summary["command_bundle_api_safe"] is True assert summary["operator_boundaries_confirmed"] is True assert summary["candidate_keys_unique"] is True assert summary["dedupe_keys_unique"] is True assert summary["raw_payload_submitted_to_api"] is False assert summary["secret_or_token_submitted_to_api"] is False assert summary["blocked_side_effects"] == [] assert review["network_request_allowed"] is False assert review["api_executes_cli"] is False assert review["api_reads_approval_token"] is False assert review["api_writes_file"] is False assert review["candidate_queue_persisted"] is False assert review["database_write_executed"] is False assert review["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_run_package_review_blocks_unsafe_review(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_writer_run_package_review_preview() ["sample_writer_run_package_review_package"] ) ) run_package = sample["writer_run_package_review"] run_package["target_table"] = "market_campaign_products" run_package["approval_token"] = "do-not-submit" run_package["raw_html"] = "raw" run_package["api_writes_file"] = True run_package["api_execution_allowed"] = True run_package["real_write_allowed"] = True run_package["operator_confirmations"]["no_api_cli_execution"] = False run_package["required_artifacts"][0]["created_by_api"] = True run_package["command_bundle"][0]["api_executes"] = True run_package["expected_candidate_keys"].pop() review = build_mcp_fetch_candidate_queue_writer_run_package_review_preview( writer_cli_review_package=sample["writer_cli_review_package"], writer_cli_review_result=sample["writer_cli_review_result"], writer_run_package_review=run_package, ) assert ( review["mcp_fetch_candidate_queue_writer_run_package_review_accepted"] is False ) assert review["writer_cli_review_accepted"] is True assert "writer_run_package_target_table_safe" in review["blocked_reasons"] assert ( "writer_run_package_candidate_keys_match_cli_review" in review["blocked_reasons"] ) assert ( "writer_run_package_artifacts_operator_created" in review["blocked_reasons"] ) assert ( "writer_run_package_command_bundle_api_safe" in review["blocked_reasons"] ) assert ( "writer_run_package_operator_boundaries_confirmed" in review["blocked_reasons"] ) assert ( "writer_run_package_no_api_execution_or_real_write" in review["blocked_reasons"] ) assert "writer_run_package_no_raw_payload" in review["blocked_reasons"] assert "writer_run_package_no_secret_or_token_key" in review["blocked_reasons"] assert "writer_run_package_side_effect_free" in review["blocked_reasons"] assert review["api_executes_cli"] is False assert review["api_reads_approval_token"] is False assert review["api_writes_database"] is False assert review["candidate_queue_persisted"] is False assert review["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_run_package_review_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_run_package_review" ) get_data = get_response.get_json() sample = get_data["sample_writer_run_package_review_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_run_package_review", json={"writer_run_package_review_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == ( "mcp_fetch_candidate_queue_writer_run_package_review_preview" ) assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_reads_approval_token"] is False assert get_data["api_writes_database"] is False assert post_response.status_code == 200 assert ( post_data["mode"] == "mcp_fetch_candidate_queue_writer_run_package_review" ) assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( post_data["mcp_fetch_candidate_queue_writer_run_package_review_accepted"] is True ) assert post_data["ready_for_candidate_queue_writer_run_readiness_review"] is True assert post_data["ready_for_api_database_write"] is False assert post_data["ready_for_real_write"] is False assert post_data["network_request_allowed"] is False assert post_data["api_executes_cli"] is False assert post_data["api_reads_approval_token"] is False assert post_data["cli_executed"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["api_opens_database_connection"] is False def test_mcp_fetch_candidate_queue_writer_run_readiness_preview_is_safe_without_payload(): readiness = build_mcp_fetch_candidate_queue_writer_run_readiness_preview( phase="phase_140_market_intel_professional_source_governance", ) assert readiness["mode"] == ( "mcp_fetch_candidate_queue_writer_run_readiness_preview" ) assert ( readiness["phase"] == "phase_140_market_intel_professional_source_governance" ) assert readiness["writer_run_readiness_payload_received"] is False assert ( readiness["mcp_fetch_candidate_queue_writer_run_readiness_accepted"] is False ) assert readiness["candidate_queue_writer_run_readiness_ready"] is False assert readiness["ready_for_candidate_queue_writer_operator_run"] is False assert readiness["ready_for_api_database_write"] is False assert readiness["ready_for_real_write"] is False assert readiness["ready_for_scheduler_attach"] is False assert readiness["network_request_allowed"] is False assert readiness["api_executes_cli"] is False assert readiness["api_reads_approval_token"] is False assert readiness["api_writes_database"] is False assert readiness["payload_persisted"] is False assert readiness["run_readiness_persisted"] is False assert readiness["run_readiness_artifact_created"] is False assert readiness["run_readiness_file_written"] is False assert readiness["package_artifact_created"] is False assert readiness["database_write_executed"] is False assert readiness["scheduler_attached"] is False assert ( "writer_run_package_review_payload_or_result_received" in readiness["blocked_reasons"] ) assert "operator_readiness_received" in readiness["blocked_reasons"] assert ( "writer_run_package_review_package" in readiness["sample_writer_run_readiness_package"] ) assert "operator_readiness" in readiness["sample_writer_run_readiness_package"] def test_mcp_fetch_candidate_queue_writer_run_readiness_accepts_sample_review(): sample = ( build_mcp_fetch_candidate_queue_writer_run_readiness_preview() ["sample_writer_run_readiness_package"] ) readiness = build_mcp_fetch_candidate_queue_writer_run_readiness_preview( writer_run_package_review_package=sample[ "writer_run_package_review_package" ], writer_run_package_review_result=sample["writer_run_package_review_result"], operator_readiness=sample["operator_readiness"], phase="phase_140_market_intel_professional_source_governance", ) assert readiness["mode"] == "mcp_fetch_candidate_queue_writer_run_readiness_review" assert ( readiness["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( readiness["mcp_fetch_candidate_queue_writer_run_readiness_accepted"] is True ) assert readiness["candidate_queue_writer_run_readiness_ready"] is True assert readiness["ready_for_candidate_queue_writer_operator_run"] is True assert readiness["ready_for_candidate_queue_writer_run_receipt_review"] is True assert readiness["ready_for_api_database_write"] is False assert readiness["ready_for_real_write"] is False assert readiness["blocked_reasons"] == [] assert readiness["passed_gate_count"] == readiness["gate_count"] assert readiness["writer_run_package_review_accepted"] is True package = readiness["writer_run_package_review_summary"] assert package["target_table"] == "market_alert_review_queue" assert package["payload_row_count"] > 0 assert package["side_effects_clear"] is True operator = readiness["operator_readiness_summary"] assert operator["run_readiness_artifact_path_safe"] is True assert operator["reviewed_sample_json_path_safe"] is True assert operator["backup_artifact_path_safe"] is True assert operator["read_only_preflight_output_path_safe"] is True assert operator["postwrite_smoke_plan_path_safe"] is True assert operator["one_time_token_shell_only_confirmed"] is True assert operator["secret_or_token_submitted_to_api"] is False assert readiness["network_request_allowed"] is False assert readiness["api_executes_cli"] is False assert readiness["api_reads_approval_token"] is False assert readiness["api_writes_file"] is False assert readiness["candidate_queue_persisted"] is False assert readiness["database_write_executed"] is False assert readiness["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_run_readiness_blocks_unsafe_review(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_writer_run_readiness_preview() ["sample_writer_run_readiness_package"] ) ) operator = sample["operator_readiness"] operator["run_readiness_artifact_path"] = "/tmp/unsafe.json" operator["backup_artifact_path"] = "../unsafe.zip" operator["approval_token"] = "do-not-submit" operator["api_executes_cli"] = True operator["api_execution_allowed"] = True operator["real_write_allowed"] = True operator["operator_confirmed_no_api_cli_execution"] = False operator["operator_confirmed_no_api_database_write"] = False sample["writer_run_package_review_result"]["api_executes_cli"] = True readiness = build_mcp_fetch_candidate_queue_writer_run_readiness_preview( writer_run_package_review_package=sample[ "writer_run_package_review_package" ], writer_run_package_review_result=sample["writer_run_package_review_result"], operator_readiness=operator, ) assert ( readiness["mcp_fetch_candidate_queue_writer_run_readiness_accepted"] is False ) assert readiness["writer_run_package_review_accepted"] is True assert ( "writer_run_package_review_side_effect_free" in readiness["blocked_reasons"] ) assert "run_readiness_artifact_path_safe" in readiness["blocked_reasons"] assert "backup_artifact_path_safe" in readiness["blocked_reasons"] assert ( "operator_confirmed_shell_only_boundaries" in readiness["blocked_reasons"] ) assert ( "operator_readiness_no_api_execution_or_real_write" in readiness["blocked_reasons"] ) assert "secret_or_token_not_submitted_to_api" in readiness["blocked_reasons"] assert "operator_readiness_side_effect_free" in readiness["blocked_reasons"] assert readiness["api_executes_cli"] is False assert readiness["api_reads_approval_token"] is False assert readiness["api_writes_database"] is False assert readiness["candidate_queue_persisted"] is False assert readiness["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_run_readiness_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_run_readiness" ) get_data = get_response.get_json() sample = get_data["sample_writer_run_readiness_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_run_readiness", json={"writer_run_readiness_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == ( "mcp_fetch_candidate_queue_writer_run_readiness_preview" ) assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_reads_approval_token"] is False assert get_data["api_writes_database"] is False assert post_response.status_code == 200 assert ( post_data["mode"] == "mcp_fetch_candidate_queue_writer_run_readiness_review" ) assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( post_data["mcp_fetch_candidate_queue_writer_run_readiness_accepted"] is True ) assert post_data["ready_for_candidate_queue_writer_operator_run"] is True assert post_data["ready_for_api_database_write"] is False assert post_data["ready_for_real_write"] is False assert post_data["network_request_allowed"] is False assert post_data["api_executes_cli"] is False assert post_data["api_reads_approval_token"] is False assert post_data["cli_executed"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["api_opens_database_connection"] is False def test_mcp_fetch_candidate_queue_writer_run_receipt_review_preview_is_safe_without_payload(): receipt = build_mcp_fetch_candidate_queue_writer_run_receipt_review_preview( phase="phase_140_market_intel_professional_source_governance", ) assert receipt["mode"] == ( "mcp_fetch_candidate_queue_writer_run_receipt_review_preview" ) assert ( receipt["phase"] == "phase_140_market_intel_professional_source_governance" ) assert receipt["writer_run_receipt_review_payload_received"] is False assert ( receipt["mcp_fetch_candidate_queue_writer_run_receipt_review_accepted"] is False ) assert receipt["candidate_queue_writer_run_receipt_review_ready"] is False assert receipt["ready_for_candidate_queue_writer_run_closeout_review"] is False assert receipt["ready_for_api_database_write"] is False assert receipt["ready_for_real_write"] is False assert receipt["ready_for_scheduler_attach"] is False assert receipt["network_request_allowed"] is False assert receipt["api_executes_cli"] is False assert receipt["api_reads_approval_token"] is False assert receipt["api_writes_database"] is False assert receipt["postwrite_query_executed_by_api"] is False assert receipt["payload_persisted"] is False assert receipt["run_receipt_review_persisted"] is False assert receipt["run_receipt_persisted"] is False assert receipt["run_receipt_file_written"] is False assert receipt["receipt_file_written"] is False assert receipt["database_write_executed"] is False assert receipt["scheduler_attached"] is False assert ( "writer_run_readiness_payload_or_result_received" in receipt["blocked_reasons"] ) assert "writer_run_receipt_payload_received" in receipt["blocked_reasons"] assert ( "writer_run_readiness_package" in receipt["sample_writer_run_receipt_review_package"] ) assert "writer_run_receipt" in receipt["sample_writer_run_receipt_review_package"] def test_mcp_fetch_candidate_queue_writer_run_receipt_review_accepts_sample_review(): sample = ( build_mcp_fetch_candidate_queue_writer_run_receipt_review_preview() ["sample_writer_run_receipt_review_package"] ) receipt = build_mcp_fetch_candidate_queue_writer_run_receipt_review_preview( writer_run_readiness_package=sample["writer_run_readiness_package"], writer_run_readiness_result=sample["writer_run_readiness_result"], writer_run_receipt=sample["writer_run_receipt"], phase="phase_140_market_intel_professional_source_governance", ) assert receipt["mode"] == "mcp_fetch_candidate_queue_writer_run_receipt_review" assert ( receipt["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( receipt["mcp_fetch_candidate_queue_writer_run_receipt_review_accepted"] is True ) assert receipt["candidate_queue_writer_run_receipt_review_ready"] is True assert receipt["ready_for_candidate_queue_writer_run_closeout_review"] is True assert receipt["ready_for_api_database_write"] is False assert receipt["ready_for_real_write"] is False assert receipt["blocked_reasons"] == [] assert receipt["passed_gate_count"] == receipt["gate_count"] assert receipt["writer_run_readiness_accepted"] is True readiness = receipt["writer_run_readiness_summary"] summary = receipt["writer_run_receipt_summary"] assert readiness["target_table"] == "market_alert_review_queue" assert summary["target_table"] == "market_alert_review_queue" assert summary["run_package_id"] == readiness["run_package_id"] assert summary["payload_row_count"] == readiness["payload_row_count"] assert summary["writer_output_path_safe"] is True assert summary["postwrite_smoke_result_path_safe"] is True assert summary["backup_artifact_path_safe"] is True assert summary["operator_shell_cli_executed"] is True assert summary["api_executed_cli"] is False assert summary["database_write_executed_by_api"] is False assert summary["postwrite_query_executed_by_api"] is False assert summary["secret_or_token_submitted_to_api"] is False assert receipt["network_request_allowed"] is False assert receipt["api_executes_cli"] is False assert receipt["api_reads_approval_token"] is False assert receipt["api_writes_file"] is False assert receipt["candidate_queue_persisted"] is False assert receipt["database_write_executed"] is False assert receipt["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_run_receipt_review_blocks_unsafe_review(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_writer_run_receipt_review_preview() ["sample_writer_run_receipt_review_package"] ) ) run_receipt = sample["writer_run_receipt"] run_receipt["run_package_id"] = "wrong-package" run_receipt["target_table"] = "market_campaign_products" run_receipt["writer_output_path"] = "/tmp/unsafe.json" run_receipt["postwrite_smoke_result_path"] = "../unsafe.json" run_receipt["approval_token"] = "do-not-submit" run_receipt["api_executed_cli"] = True run_receipt["database_write_executed_by_api"] = True run_receipt["postwrite_query_executed_by_api"] = True run_receipt["api_execution_allowed"] = True run_receipt["real_write_allowed_by_api"] = True run_receipt["writer_exit_code"] = 1 run_receipt["error_count"] = 1 run_receipt["inserted_row_count"] = 0 run_receipt["postwrite_smoke"]["row_count_matches_payload"] = False run_receipt["operator_confirmations"]["no_api_cli_execution"] = False run_receipt["candidate_keys"].pop() receipt = build_mcp_fetch_candidate_queue_writer_run_receipt_review_preview( writer_run_readiness_package=sample["writer_run_readiness_package"], writer_run_readiness_result=sample["writer_run_readiness_result"], writer_run_receipt=run_receipt, ) assert ( receipt["mcp_fetch_candidate_queue_writer_run_receipt_review_accepted"] is False ) assert receipt["writer_run_readiness_accepted"] is True assert "writer_run_receipt_run_package_matches" in receipt["blocked_reasons"] assert "writer_run_receipt_target_table_safe" in receipt["blocked_reasons"] assert ( "writer_run_receipt_candidate_keys_match_readiness" in receipt["blocked_reasons"] ) assert "writer_run_receipt_artifact_paths_safe" in receipt["blocked_reasons"] assert "writer_run_receipt_cli_success" in receipt["blocked_reasons"] assert ( "writer_run_receipt_insert_count_matches_payload" in receipt["blocked_reasons"] ) assert ( "writer_run_receipt_postwrite_smoke_passed" in receipt["blocked_reasons"] ) assert ( "writer_run_receipt_operator_boundaries_confirmed" in receipt["blocked_reasons"] ) assert ( "writer_run_receipt_no_api_execution_or_real_write" in receipt["blocked_reasons"] ) assert "writer_run_receipt_no_secret_or_token_key" in receipt["blocked_reasons"] assert "writer_run_receipt_side_effect_free" in receipt["blocked_reasons"] assert receipt["api_executes_cli"] is False assert receipt["api_reads_approval_token"] is False assert receipt["api_writes_database"] is False assert receipt["candidate_queue_persisted"] is False assert receipt["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_run_receipt_review_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_run_receipt_review" ) get_data = get_response.get_json() sample = get_data["sample_writer_run_receipt_review_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_run_receipt_review", json={"writer_run_receipt_review_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == ( "mcp_fetch_candidate_queue_writer_run_receipt_review_preview" ) assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_reads_approval_token"] is False assert get_data["api_writes_database"] is False assert post_response.status_code == 200 assert ( post_data["mode"] == "mcp_fetch_candidate_queue_writer_run_receipt_review" ) assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( post_data["mcp_fetch_candidate_queue_writer_run_receipt_review_accepted"] is True ) assert post_data["ready_for_candidate_queue_writer_run_closeout_review"] is True assert post_data["ready_for_api_database_write"] is False assert post_data["ready_for_real_write"] is False assert post_data["network_request_allowed"] is False assert post_data["api_executes_cli"] is False assert post_data["api_reads_approval_token"] is False assert post_data["cli_executed"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["api_opens_database_connection"] is False def test_mcp_fetch_candidate_queue_writer_run_closeout_review_preview_is_safe_without_payload(): closeout = build_mcp_fetch_candidate_queue_writer_run_closeout_review_preview( phase="phase_140_market_intel_professional_source_governance", ) assert closeout["mode"] == ( "mcp_fetch_candidate_queue_writer_run_closeout_review_preview" ) assert ( closeout["phase"] == "phase_140_market_intel_professional_source_governance" ) assert closeout["writer_run_closeout_review_payload_received"] is False assert ( closeout["mcp_fetch_candidate_queue_writer_run_closeout_review_accepted"] is False ) assert closeout["candidate_queue_writer_run_closeout_review_ready"] is False assert ( closeout["ready_for_candidate_queue_post_closeout_inventory_review"] is False ) assert closeout["ready_for_api_database_write"] is False assert closeout["ready_for_real_write"] is False assert closeout["ready_for_scheduler_attach"] is False assert closeout["network_request_allowed"] is False assert closeout["api_executes_cli"] is False assert closeout["api_reads_approval_token"] is False assert closeout["api_writes_database"] is False assert closeout["post_closeout_query_executed_by_api"] is False assert closeout["payload_persisted"] is False assert closeout["run_closeout_review_persisted"] is False assert closeout["run_closeout_persisted"] is False assert closeout["run_closeout_file_written"] is False assert closeout["closeout_file_written"] is False assert closeout["database_write_executed"] is False assert closeout["scheduler_attached"] is False assert ( "writer_run_receipt_review_payload_or_result_received" in closeout["blocked_reasons"] ) assert "writer_run_closeout_payload_received" in closeout["blocked_reasons"] assert ( "writer_run_receipt_review_package" in closeout["sample_writer_run_closeout_review_package"] ) assert ( "operator_closeout" in closeout["sample_writer_run_closeout_review_package"] ) def test_mcp_fetch_candidate_queue_writer_run_closeout_review_accepts_sample_review(): sample = ( build_mcp_fetch_candidate_queue_writer_run_closeout_review_preview() ["sample_writer_run_closeout_review_package"] ) closeout = build_mcp_fetch_candidate_queue_writer_run_closeout_review_preview( writer_run_receipt_review_package=sample[ "writer_run_receipt_review_package" ], writer_run_receipt_review_result=sample["writer_run_receipt_review_result"], operator_closeout=sample["operator_closeout"], phase="phase_140_market_intel_professional_source_governance", ) assert closeout["mode"] == "mcp_fetch_candidate_queue_writer_run_closeout_review" assert ( closeout["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( closeout["mcp_fetch_candidate_queue_writer_run_closeout_review_accepted"] is True ) assert closeout["candidate_queue_writer_run_closeout_review_ready"] is True assert ( closeout["ready_for_candidate_queue_post_closeout_inventory_review"] is True ) assert closeout["ready_for_api_database_write"] is False assert closeout["ready_for_real_write"] is False assert closeout["blocked_reasons"] == [] assert closeout["passed_gate_count"] == closeout["gate_count"] assert closeout["writer_run_receipt_review_accepted"] is True receipt = closeout["writer_run_receipt_review_summary"] summary = closeout["operator_closeout_summary"] assert receipt["target_table"] == "market_alert_review_queue" assert summary["target_table"] == "market_alert_review_queue" assert summary["run_package_id"] == receipt["run_package_id"] assert summary["receipt_id"] == receipt["receipt_id"] assert summary["payload_row_count"] == receipt["payload_row_count"] assert summary["closeout_artifact_path_safe"] is True assert summary["receipt_review_artifact_path_safe"] is True assert summary["post_closeout_inventory_plan_path_safe"] is True assert summary["manifest_writer_output_path"] == receipt["writer_output_path"] assert summary["manifest_postwrite_smoke_result_path"] == ( receipt["postwrite_smoke_result_path"] ) assert summary["manifest_backup_artifact_path"] == receipt["backup_artifact_path"] assert summary["secret_or_token_submitted_to_api"] is False assert closeout["network_request_allowed"] is False assert closeout["api_executes_cli"] is False assert closeout["api_reads_approval_token"] is False assert closeout["api_writes_file"] is False assert closeout["candidate_queue_persisted"] is False assert closeout["database_write_executed"] is False assert closeout["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_run_closeout_review_blocks_unsafe_review(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_writer_run_closeout_review_preview() ["sample_writer_run_closeout_review_package"] ) ) closeout_payload = sample["operator_closeout"] closeout_payload["run_package_id"] = "wrong-package" closeout_payload["receipt_id"] = "wrong-receipt" closeout_payload["target_table"] = "market_campaign_products" closeout_payload["closeout_artifact_path"] = "/tmp/unsafe.json" closeout_payload["receipt_review_artifact_path"] = "../unsafe.json" closeout_payload["post_closeout_inventory_plan_path"] = "../inventory.json" closeout_payload["approval_token"] = "do-not-submit" closeout_payload["api_execution_allowed"] = True closeout_payload["real_write_allowed_by_api"] = True closeout_payload["api_executes_cli"] = True closeout_payload["database_write_executed_by_api"] = True closeout_payload["post_closeout_query_executed_by_api"] = True closeout_payload["artifact_manifest"]["writer_output_path"] = "../writer.json" closeout_payload["artifact_manifest"]["postwrite_smoke_result_path"] = ( "../smoke.json" ) closeout_payload["operator_confirmations"]["receipt_reviewed"] = False closeout_payload["operator_confirmations"]["no_api_cli_execution"] = False closeout_payload["rollback_note"] = "" closeout_payload["closeout_notes"] = "" closeout = build_mcp_fetch_candidate_queue_writer_run_closeout_review_preview( writer_run_receipt_review_package=sample[ "writer_run_receipt_review_package" ], writer_run_receipt_review_result=sample["writer_run_receipt_review_result"], operator_closeout=closeout_payload, ) assert ( closeout["mcp_fetch_candidate_queue_writer_run_closeout_review_accepted"] is False ) assert closeout["writer_run_receipt_review_accepted"] is True assert ( "writer_run_closeout_identity_matches_receipt" in closeout["blocked_reasons"] ) assert "writer_run_closeout_target_table_safe" in closeout["blocked_reasons"] assert ( "writer_run_closeout_artifact_paths_safe" in closeout["blocked_reasons"] ) assert ( "writer_run_closeout_artifact_manifest_preserved" in closeout["blocked_reasons"] ) assert "writer_run_closeout_notes_recorded" in closeout["blocked_reasons"] assert ( "writer_run_closeout_operator_boundaries_confirmed" in closeout["blocked_reasons"] ) assert ( "writer_run_closeout_no_api_execution_or_real_write" in closeout["blocked_reasons"] ) assert "writer_run_closeout_no_secret_or_token_key" in closeout["blocked_reasons"] assert "writer_run_closeout_side_effect_free" in closeout["blocked_reasons"] assert closeout["api_executes_cli"] is False assert closeout["api_reads_approval_token"] is False assert closeout["api_writes_database"] is False assert closeout["candidate_queue_persisted"] is False assert closeout["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_run_closeout_review_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_run_closeout_review" ) get_data = get_response.get_json() sample = get_data["sample_writer_run_closeout_review_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_run_closeout_review", json={"writer_run_closeout_review_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == ( "mcp_fetch_candidate_queue_writer_run_closeout_review_preview" ) assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_reads_approval_token"] is False assert get_data["api_writes_database"] is False assert post_response.status_code == 200 assert ( post_data["mode"] == "mcp_fetch_candidate_queue_writer_run_closeout_review" ) assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( post_data["mcp_fetch_candidate_queue_writer_run_closeout_review_accepted"] is True ) assert ( post_data["ready_for_candidate_queue_post_closeout_inventory_review"] is True ) assert post_data["ready_for_api_database_write"] is False assert post_data["ready_for_real_write"] is False assert post_data["network_request_allowed"] is False assert post_data["api_executes_cli"] is False assert post_data["api_reads_approval_token"] is False assert post_data["cli_executed"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["api_opens_database_connection"] is False def test_mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_preview_is_safe_without_payload(): inventory = ( build_mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_preview( phase="phase_140_market_intel_professional_source_governance", ) ) assert inventory["mode"] == ( "mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_preview" ) assert ( inventory["phase"] == "phase_140_market_intel_professional_source_governance" ) assert inventory["post_closeout_inventory_review_payload_received"] is False assert ( inventory[ "mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_accepted" ] is False ) assert inventory["candidate_queue_writer_post_closeout_inventory_review_ready"] is False assert inventory["ready_for_candidate_queue_review_handoff"] is False assert inventory["ready_for_api_database_write"] is False assert inventory["ready_for_real_write"] is False assert inventory["ready_for_scheduler_attach"] is False assert inventory["network_request_allowed"] is False assert inventory["api_executes_cli"] is False assert inventory["api_reads_approval_token"] is False assert inventory["api_writes_database"] is False assert inventory["api_inventory_query_executed"] is False assert inventory["post_closeout_query_executed_by_api"] is False assert inventory["payload_persisted"] is False assert inventory["post_closeout_inventory_review_persisted"] is False assert inventory["post_closeout_inventory_persisted"] is False assert inventory["post_closeout_inventory_file_written"] is False assert inventory["inventory_file_written"] is False assert inventory["database_write_executed"] is False assert inventory["scheduler_attached"] is False assert ( "writer_run_closeout_review_payload_or_result_received" in inventory["blocked_reasons"] ) assert "post_closeout_inventory_payload_received" in inventory["blocked_reasons"] assert ( "writer_run_closeout_review_package" in inventory["sample_writer_post_closeout_inventory_review_package"] ) assert ( "operator_inventory" in inventory["sample_writer_post_closeout_inventory_review_package"] ) def test_mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_accepts_sample_review(): sample = ( build_mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_preview() ["sample_writer_post_closeout_inventory_review_package"] ) inventory = ( build_mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_preview( writer_run_closeout_review_package=sample[ "writer_run_closeout_review_package" ], writer_run_closeout_review_result=sample[ "writer_run_closeout_review_result" ], operator_inventory=sample["operator_inventory"], phase="phase_140_market_intel_professional_source_governance", ) ) assert ( inventory["mode"] == "mcp_fetch_candidate_queue_writer_post_closeout_inventory_review" ) assert ( inventory["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( inventory[ "mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_accepted" ] is True ) assert inventory["candidate_queue_writer_post_closeout_inventory_review_ready"] is True assert inventory["ready_for_candidate_queue_review_handoff"] is True assert inventory["ready_for_api_database_write"] is False assert inventory["ready_for_real_write"] is False assert inventory["blocked_reasons"] == [] assert inventory["passed_gate_count"] == inventory["gate_count"] assert inventory["writer_run_closeout_review_accepted"] is True closeout = inventory["writer_run_closeout_review_summary"] summary = inventory["operator_inventory_summary"] assert closeout["target_table"] == "market_alert_review_queue" assert summary["target_table"] == "market_alert_review_queue" assert summary["run_package_id"] == closeout["run_package_id"] assert summary["receipt_id"] == closeout["receipt_id"] assert summary["closeout_id"] == closeout["closeout_id"] assert summary["payload_row_count"] == closeout["payload_row_count"] assert summary["found_row_count"] == closeout["payload_row_count"] assert summary["missing_row_count"] == 0 assert summary["unexpected_duplicate_count"] == 0 assert summary["inventory_artifact_path_safe"] is True assert summary["closeout_review_artifact_path_safe"] is True assert summary["read_only_query_result_path_safe"] is True assert summary["query_type"] == "read_only_select" assert summary["read_only_query_executed_by_operator"] is True assert summary["secret_or_token_submitted_to_api"] is False assert inventory["network_request_allowed"] is False assert inventory["api_executes_cli"] is False assert inventory["api_reads_approval_token"] is False assert inventory["api_writes_file"] is False assert inventory["api_inventory_query_executed"] is False assert inventory["candidate_queue_persisted"] is False assert inventory["database_write_executed"] is False assert inventory["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_blocks_unsafe_review(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_preview() ["sample_writer_post_closeout_inventory_review_package"] ) ) inventory_payload = sample["operator_inventory"] inventory_payload["closeout_id"] = "wrong-closeout" inventory_payload["run_package_id"] = "wrong-package" inventory_payload["receipt_id"] = "wrong-receipt" inventory_payload["target_table"] = "market_campaign_products" inventory_payload["found_row_count"] = 0 inventory_payload["missing_row_count"] = 1 inventory_payload["unexpected_duplicate_count"] = 1 inventory_payload["inventory_artifact_path"] = "/tmp/unsafe.json" inventory_payload["closeout_review_artifact_path"] = "../closeout.json" inventory_payload["read_only_query_result_path"] = "../query.json" inventory_payload["approval_token"] = "do-not-submit" inventory_payload["api_execution_allowed"] = True inventory_payload["real_write_allowed_by_api"] = True inventory_payload["api_inventory_query_executed"] = True inventory_payload["database_write_executed_by_api"] = True inventory_payload["query_summary"]["query_type"] = "update" inventory_payload["query_summary"]["row_count_matches_payload"] = False inventory_payload["operator_confirmations"]["inventory_read_only"] = False inventory_payload["operator_confirmations"]["no_api_inventory_query"] = False inventory = ( build_mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_preview( writer_run_closeout_review_package=sample[ "writer_run_closeout_review_package" ], writer_run_closeout_review_result=sample[ "writer_run_closeout_review_result" ], operator_inventory=inventory_payload, ) ) assert ( inventory[ "mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_accepted" ] is False ) assert inventory["writer_run_closeout_review_accepted"] is True assert ( "post_closeout_inventory_identity_matches_closeout" in inventory["blocked_reasons"] ) assert "post_closeout_inventory_target_table_safe" in inventory["blocked_reasons"] assert ( "post_closeout_inventory_row_count_matches_closeout" in inventory["blocked_reasons"] ) assert ( "post_closeout_inventory_artifact_paths_safe" in inventory["blocked_reasons"] ) assert "post_closeout_inventory_query_read_only" in inventory["blocked_reasons"] assert ( "post_closeout_inventory_operator_boundaries_confirmed" in inventory["blocked_reasons"] ) assert ( "post_closeout_inventory_no_api_execution_or_real_write" in inventory["blocked_reasons"] ) assert ( "post_closeout_inventory_no_secret_or_token_key" in inventory["blocked_reasons"] ) assert "post_closeout_inventory_side_effect_free" in inventory["blocked_reasons"] assert inventory["api_executes_cli"] is False assert inventory["api_reads_approval_token"] is False assert inventory["api_writes_database"] is False assert inventory["candidate_queue_persisted"] is False assert inventory["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_post_closeout_inventory_review" ) get_data = get_response.get_json() sample = get_data["sample_writer_post_closeout_inventory_review_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_post_closeout_inventory_review", json={"writer_post_closeout_inventory_review_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == ( "mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_preview" ) assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_reads_approval_token"] is False assert get_data["api_writes_database"] is False assert get_data["api_inventory_query_executed"] is False assert post_response.status_code == 200 assert ( post_data["mode"] == "mcp_fetch_candidate_queue_writer_post_closeout_inventory_review" ) assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( post_data[ "mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_accepted" ] is True ) assert post_data["ready_for_candidate_queue_review_handoff"] is True assert post_data["ready_for_api_database_write"] is False assert post_data["ready_for_real_write"] is False assert post_data["network_request_allowed"] is False assert post_data["api_executes_cli"] is False assert post_data["api_reads_approval_token"] is False assert post_data["api_inventory_query_executed"] is False assert post_data["cli_executed"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["api_opens_database_connection"] is False def test_mcp_fetch_candidate_queue_writer_review_handoff_preview_is_safe_without_payload(): handoff = build_mcp_fetch_candidate_queue_writer_review_handoff_preview( phase="phase_140_market_intel_professional_source_governance", ) assert handoff["mode"] == ( "mcp_fetch_candidate_queue_writer_review_handoff_preview" ) assert ( handoff["phase"] == "phase_140_market_intel_professional_source_governance" ) assert handoff["review_handoff_payload_received"] is False assert ( handoff["mcp_fetch_candidate_queue_writer_review_handoff_accepted"] is False ) assert handoff["candidate_queue_writer_review_handoff_ready"] is False assert handoff["ready_for_candidate_queue_human_review"] is False assert handoff["ready_for_candidate_queue_review_decision"] is False assert handoff["ready_for_api_review_state_update"] is False assert handoff["ready_for_api_database_write"] is False assert handoff["ready_for_real_write"] is False assert handoff["ready_for_scheduler_attach"] is False assert handoff["network_request_allowed"] is False assert handoff["api_executes_cli"] is False assert handoff["api_reads_approval_token"] is False assert handoff["api_writes_database"] is False assert handoff["api_updates_review_state"] is False assert handoff["payload_persisted"] is False assert handoff["review_handoff_persisted"] is False assert handoff["handoff_file_written"] is False assert handoff["database_write_executed"] is False assert handoff["database_commit_executed"] is False assert handoff["candidate_review_state_updated"] is False assert handoff["scheduler_attached"] is False assert ( "post_closeout_inventory_review_payload_or_result_received" in handoff["blocked_reasons"] ) assert "candidate_queue_review_handoff_payload_received" in handoff[ "blocked_reasons" ] assert "operator_handoff" in handoff["sample_writer_review_handoff_package"] def test_mcp_fetch_candidate_queue_writer_review_handoff_accepts_sample_review(): sample = build_mcp_fetch_candidate_queue_writer_review_handoff_preview()[ "sample_writer_review_handoff_package" ] handoff = build_mcp_fetch_candidate_queue_writer_review_handoff_preview( writer_post_closeout_inventory_review_package=sample[ "writer_post_closeout_inventory_review_package" ], writer_post_closeout_inventory_review_result=sample[ "writer_post_closeout_inventory_review_result" ], operator_handoff=sample["operator_handoff"], phase="phase_140_market_intel_professional_source_governance", ) assert handoff["mode"] == "mcp_fetch_candidate_queue_writer_review_handoff" assert ( handoff["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( handoff["mcp_fetch_candidate_queue_writer_review_handoff_accepted"] is True ) assert handoff["candidate_queue_writer_review_handoff_ready"] is True assert handoff["ready_for_candidate_queue_human_review"] is True assert handoff["ready_for_candidate_queue_review_decision"] is False assert handoff["ready_for_api_review_state_update"] is False assert handoff["ready_for_api_database_write"] is False assert handoff["ready_for_real_write"] is False assert handoff["blocked_reasons"] == [] assert handoff["passed_gate_count"] == handoff["gate_count"] assert handoff["writer_post_closeout_inventory_review_accepted"] is True inventory = handoff["writer_post_closeout_inventory_review_summary"] summary = handoff["operator_handoff_summary"] assert inventory["target_table"] == "market_alert_review_queue" assert summary["target_table"] == "market_alert_review_queue" assert summary["inventory_review_id"] == inventory["inventory_review_id"] assert summary["run_package_id"] == inventory["run_package_id"] assert summary["receipt_id"] == inventory["receipt_id"] assert summary["closeout_id"] == inventory["closeout_id"] assert summary["expected_payload_row_count"] == inventory["payload_row_count"] assert summary["expected_review_state"] == "needs_review" assert summary["contract_expected_review_state"] == "needs_review" assert summary["handoff_artifact_path_safe"] is True assert "update_review_state" in summary["forbidden_api_actions"] assert "insert_missing_queue_row" in summary["forbidden_api_actions"] assert "review_state" in summary["required_columns"] assert summary["secret_or_token_submitted_to_api"] is False assert handoff["network_request_allowed"] is False assert handoff["api_executes_cli"] is False assert handoff["api_reads_approval_token"] is False assert handoff["api_writes_file"] is False assert handoff["api_writes_database"] is False assert handoff["api_updates_review_state"] is False assert handoff["candidate_queue_persisted"] is False assert handoff["candidate_review_state_updated"] is False assert handoff["database_write_executed"] is False assert handoff["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_review_handoff_blocks_unsafe_review(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_writer_review_handoff_preview()[ "sample_writer_review_handoff_package" ] ) ) handoff_payload = sample["operator_handoff"] handoff_payload["inventory_review_id"] = "wrong-inventory" handoff_payload["closeout_id"] = "wrong-closeout" handoff_payload["run_package_id"] = "wrong-package" handoff_payload["receipt_id"] = "wrong-receipt" handoff_payload["target_table"] = "market_campaign_products" handoff_payload["expected_payload_row_count"] = 999 handoff_payload["expected_review_state"] = "confirmed" handoff_payload["handoff_artifact_path"] = "/tmp/unsafe.json" handoff_payload["approval_token"] = TEST_APPROVAL_TOKEN handoff_payload["api_execution_allowed"] = True handoff_payload["real_write_allowed_by_api"] = True handoff_payload["api_updates_review_state"] = True handoff_payload["database_write_executed_by_api"] = True handoff_payload["review_contract"]["expected_review_state"] = "confirmed" handoff_payload["review_contract"]["forbidden_api_actions"] = ["dispatch_alert"] handoff_payload["review_contract"]["required_columns"] = ["dedupe_key"] handoff_payload["operator_confirmations"]["manual_review_only"] = False handoff_payload["operator_confirmations"]["no_api_review_state_update"] = False handoff = build_mcp_fetch_candidate_queue_writer_review_handoff_preview( writer_post_closeout_inventory_review_package=sample[ "writer_post_closeout_inventory_review_package" ], writer_post_closeout_inventory_review_result=sample[ "writer_post_closeout_inventory_review_result" ], operator_handoff=handoff_payload, ) assert ( handoff["mcp_fetch_candidate_queue_writer_review_handoff_accepted"] is False ) assert handoff["writer_post_closeout_inventory_review_accepted"] is True assert ( "candidate_queue_review_handoff_identity_matches_inventory" in handoff["blocked_reasons"] ) assert "candidate_queue_review_handoff_target_table_safe" in handoff[ "blocked_reasons" ] assert "candidate_queue_review_handoff_row_count_matches_inventory" in handoff[ "blocked_reasons" ] assert "candidate_queue_review_handoff_artifact_paths_safe" in handoff[ "blocked_reasons" ] assert "candidate_queue_review_handoff_contract_valid" in handoff[ "blocked_reasons" ] assert "candidate_queue_review_handoff_forbids_api_mutations" in handoff[ "blocked_reasons" ] assert ( "candidate_queue_review_handoff_operator_boundaries_confirmed" in handoff["blocked_reasons"] ) assert "candidate_queue_review_handoff_no_api_execution_or_real_write" in handoff[ "blocked_reasons" ] assert "candidate_queue_review_handoff_no_secret_or_token_key" in handoff[ "blocked_reasons" ] assert "candidate_queue_review_handoff_side_effect_free" in handoff[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( handoff, ensure_ascii=False, sort_keys=True, ) assert handoff["api_executes_cli"] is False assert handoff["api_reads_approval_token"] is False assert handoff["api_writes_database"] is False assert handoff["api_updates_review_state"] is False assert handoff["candidate_review_state_updated"] is False assert handoff["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_review_handoff_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_handoff" ) get_data = get_response.get_json() sample = get_data["sample_writer_review_handoff_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_handoff", json={"writer_review_handoff_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == ( "mcp_fetch_candidate_queue_writer_review_handoff_preview" ) assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_reads_approval_token"] is False assert get_data["api_writes_database"] is False assert get_data["api_updates_review_state"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_candidate_queue_writer_review_handoff" assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( post_data["mcp_fetch_candidate_queue_writer_review_handoff_accepted"] is True ) assert post_data["ready_for_candidate_queue_human_review"] is True assert post_data["ready_for_api_review_state_update"] is False assert post_data["ready_for_api_database_write"] is False assert post_data["ready_for_real_write"] is False assert post_data["network_request_allowed"] is False assert post_data["api_executes_cli"] is False assert post_data["api_reads_approval_token"] is False assert post_data["api_updates_review_state"] is False assert post_data["cli_executed"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["candidate_review_state_updated"] is False assert post_data["api_opens_database_connection"] is False def test_mcp_fetch_candidate_queue_writer_review_inventory_preview_is_safe_without_payload(): inventory = build_mcp_fetch_candidate_queue_writer_review_inventory_preview( phase="phase_140_market_intel_professional_source_governance", ) assert inventory["mode"] == ( "mcp_fetch_candidate_queue_writer_review_inventory_preview" ) assert ( inventory["phase"] == "phase_140_market_intel_professional_source_governance" ) assert inventory["review_inventory_payload_received"] is False assert ( inventory["mcp_fetch_candidate_queue_writer_review_inventory_accepted"] is False ) assert inventory["candidate_queue_writer_review_inventory_ready"] is False assert inventory["ready_for_candidate_queue_review_decision"] is False assert inventory["ready_for_api_review_state_update"] is False assert inventory["ready_for_api_database_write"] is False assert inventory["ready_for_real_write"] is False assert inventory["ready_for_scheduler_attach"] is False assert inventory["network_request_allowed"] is False assert inventory["api_executes_cli"] is False assert inventory["api_reads_approval_token"] is False assert inventory["api_writes_database"] is False assert inventory["api_updates_review_state"] is False assert inventory["payload_persisted"] is False assert inventory["review_inventory_persisted"] is False assert inventory["inventory_file_written"] is False assert inventory["database_connection_opened"] is False assert inventory["database_write_executed"] is False assert inventory["database_commit_executed"] is False assert inventory["candidate_review_state_updated"] is False assert inventory["scheduler_attached"] is False assert "candidate_queue_review_handoff_payload_or_result_received" in inventory[ "blocked_reasons" ] assert "candidate_queue_review_inventory_payload_received" in inventory["blocked_reasons"] assert ( "operator_review_inventory" in inventory["sample_writer_review_inventory_package"] ) def test_mcp_fetch_candidate_queue_writer_review_inventory_accepts_sample_inventory(): sample = build_mcp_fetch_candidate_queue_writer_review_inventory_preview()[ "sample_writer_review_inventory_package" ] inventory = build_mcp_fetch_candidate_queue_writer_review_inventory_preview( writer_review_handoff_package=sample["writer_review_handoff_package"], writer_review_handoff_result=sample["writer_review_handoff_result"], operator_review_inventory=sample["operator_review_inventory"], phase="phase_140_market_intel_professional_source_governance", ) assert inventory["mode"] == "mcp_fetch_candidate_queue_writer_review_inventory" assert ( inventory["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( inventory["mcp_fetch_candidate_queue_writer_review_inventory_accepted"] is True ) assert inventory["candidate_queue_writer_review_inventory_ready"] is True assert inventory["ready_for_candidate_queue_review_decision"] is True assert inventory["ready_for_api_review_state_update"] is False assert inventory["ready_for_api_database_write"] is False assert inventory["ready_for_real_write"] is False assert inventory["blocked_reasons"] == [] assert inventory["passed_gate_count"] == inventory["gate_count"] assert inventory["writer_review_handoff_accepted"] is True handoff = inventory["writer_review_handoff_summary"] summary = inventory["operator_review_inventory_summary"] assert summary["target_table"] == "market_alert_review_queue" assert summary["handoff_id"] == handoff["handoff_id"] assert summary["inventory_review_id"] == handoff["inventory_review_id"] assert summary["run_package_id"] == handoff["run_package_id"] assert summary["receipt_id"] == handoff["receipt_id"] assert summary["found_row_count"] == handoff["payload_row_count"] assert summary["review_state_breakdown"]["needs_review"] == handoff["payload_row_count"] assert summary["dedupe_key_count"] == handoff["payload_row_count"] assert summary["missing_row_count"] == 0 assert summary["unexpected_duplicate_count"] == 0 assert summary["review_state"] == "needs_review" assert summary["sample_dedupe_keys"] assert summary["secret_or_token_submitted_to_api"] is False assert inventory["network_request_allowed"] is False assert inventory["api_executes_cli"] is False assert inventory["api_reads_approval_token"] is False assert inventory["api_writes_file"] is False assert inventory["api_writes_database"] is False assert inventory["api_updates_review_state"] is False assert inventory["candidate_queue_persisted"] is False assert inventory["candidate_review_state_updated"] is False assert inventory["database_write_executed"] is False assert inventory["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_review_inventory_blocks_unsafe_inventory(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_writer_review_inventory_preview()[ "sample_writer_review_inventory_package" ] ) ) inventory_payload = sample["operator_review_inventory"] inventory_payload["handoff_id"] = "wrong-handoff" inventory_payload["inventory_review_id"] = "wrong-inventory" inventory_payload["target_table"] = "market_campaign_products" inventory_payload["found_row_count"] = 999 inventory_payload["missing_row_count"] = 1 inventory_payload["unexpected_duplicate_count"] = 1 inventory_payload["review_inventory_artifact_path"] = "/tmp/unsafe.json" inventory_payload["approval_token"] = TEST_APPROVAL_TOKEN inventory_payload["api_execution_allowed"] = True inventory_payload["real_write_allowed_by_api"] = True inventory_payload["api_updates_review_state"] = True inventory_payload["review_state_update_executed"] = True inventory_payload["review_state"] = "confirmed" inventory_payload["operator_confirmations"]["candidate_queue_review_only"] = False inventory_payload["operator_confirmations"]["no_api_review_state_update"] = False inventory = build_mcp_fetch_candidate_queue_writer_review_inventory_preview( writer_review_handoff_package=sample["writer_review_handoff_package"], writer_review_handoff_result=sample["writer_review_handoff_result"], operator_review_inventory=inventory_payload, ) assert ( inventory["mcp_fetch_candidate_queue_writer_review_inventory_accepted"] is False ) assert inventory["writer_review_handoff_accepted"] is True assert "candidate_queue_review_inventory_identity_matches_handoff" in inventory[ "blocked_reasons" ] assert "candidate_queue_review_inventory_target_table_safe" in inventory["blocked_reasons"] assert "candidate_queue_review_inventory_row_count_matches_handoff" in inventory[ "blocked_reasons" ] assert "candidate_queue_review_inventory_review_state_safe" in inventory["blocked_reasons"] assert "candidate_queue_review_inventory_artifact_paths_safe" in inventory["blocked_reasons"] assert "candidate_queue_review_inventory_operator_boundaries_confirmed" in inventory[ "blocked_reasons" ] assert "candidate_queue_review_inventory_no_api_execution_or_real_write" in inventory[ "blocked_reasons" ] assert "candidate_queue_review_inventory_no_secret_or_token_key" in inventory[ "blocked_reasons" ] assert "candidate_queue_review_inventory_side_effect_free" in inventory["blocked_reasons"] assert TEST_APPROVAL_TOKEN not in json.dumps( inventory, ensure_ascii=False, sort_keys=True, ) assert inventory["api_executes_cli"] is False assert inventory["api_reads_approval_token"] is False assert inventory["api_writes_database"] is False assert inventory["api_updates_review_state"] is False assert inventory["candidate_review_state_updated"] is False assert inventory["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_review_inventory_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_inventory" ) get_data = get_response.get_json() sample = get_data["sample_writer_review_inventory_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_inventory", json={"writer_review_inventory_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == ( "mcp_fetch_candidate_queue_writer_review_inventory_preview" ) assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_reads_approval_token"] is False assert get_data["api_writes_database"] is False assert get_data["api_updates_review_state"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_candidate_queue_writer_review_inventory" assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( post_data["mcp_fetch_candidate_queue_writer_review_inventory_accepted"] is True ) assert post_data["ready_for_candidate_queue_review_decision"] is True assert post_data["ready_for_api_review_state_update"] is False assert post_data["ready_for_api_database_write"] is False assert post_data["ready_for_real_write"] is False assert post_data["network_request_allowed"] is False assert post_data["api_executes_cli"] is False assert post_data["api_reads_approval_token"] is False assert post_data["api_updates_review_state"] is False assert post_data["cli_executed"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["candidate_review_state_updated"] is False assert post_data["api_opens_database_connection"] is False def test_mcp_fetch_candidate_queue_writer_review_inventory_accepts_operator_read_only_inventory(): preview = build_mcp_fetch_candidate_queue_writer_review_inventory_preview() sample = preview["sample_writer_review_inventory_package"] inventory = build_mcp_fetch_candidate_queue_writer_review_inventory_preview( writer_review_handoff_package=sample["writer_review_handoff_package"], writer_review_handoff_result=sample["writer_review_handoff_result"], operator_review_inventory=sample["operator_review_inventory"], phase="phase-test", ) assert inventory["mode"] == "mcp_fetch_candidate_queue_writer_review_inventory" assert inventory["phase"] == "phase-test" assert ( inventory["mcp_fetch_candidate_queue_writer_review_inventory_accepted"] is True ) assert inventory["writer_review_handoff_accepted"] is True assert inventory["candidate_queue_writer_review_inventory_ready"] is True assert inventory["ready_for_candidate_queue_review_decision"] is True assert inventory["ready_for_api_review_state_update"] is False assert inventory["api_inventory_query_executed"] is False assert inventory["review_inventory_query_executed_by_api"] is False assert inventory["api_opens_database_connection"] is False assert inventory["api_writes_database"] is False assert inventory["api_updates_review_state"] is False assert inventory["candidate_queue_persisted"] is False assert inventory["candidate_review_state_updated"] is False assert inventory["scheduler_attached"] is False assert inventory["blocked_reasons"] == [] assert ( inventory["operator_review_inventory_summary"]["review_state_breakdown"][ "needs_review" ] == inventory["writer_review_handoff_summary"]["expected_payload_row_count"] ) assert ( "candidate_queue_review_inventory_read_only_query_by_operator" not in inventory["blocked_reasons"] ) def test_mcp_fetch_candidate_queue_writer_review_inventory_blocks_bad_inventory_payload(): preview = build_mcp_fetch_candidate_queue_writer_review_inventory_preview() sample = preview["sample_writer_review_inventory_package"] review_inventory = dict(sample["operator_review_inventory"]) review_inventory["handoff_id"] = "wrong-handoff" review_inventory["target_table"] = "market_campaign_products" review_inventory["found_row_count"] = 0 review_inventory["missing_row_count"] = 1 review_inventory["review_state"] = "matched" review_inventory["review_state_breakdown"] = {"matched": 1} review_inventory["review_inventory_artifact_path"] = "/tmp/unsafe.json" review_inventory["approval_token"] = TEST_APPROVAL_TOKEN review_inventory["api_execution_allowed"] = True review_inventory["real_write_allowed_by_api"] = True review_inventory["api_updates_review_state"] = True review_inventory["review_state_update_executed"] = True review_inventory["query_summary"] = { "query_type": "write_update", "read_only_query_executed_by_operator": False, "target_table": "market_campaign_products", "expected_rows_found": False, "row_count_matches_handoff": False, "review_state_only_needs_review": False, "no_missing_dedupe_keys": False, "no_unexpected_duplicates": False, } review_inventory["operator_confirmations"] = { **review_inventory["operator_confirmations"], "review_inventory_read_only": False, "no_api_review_state_update": False, } inventory = build_mcp_fetch_candidate_queue_writer_review_inventory_preview( writer_review_handoff_package=sample["writer_review_handoff_package"], writer_review_handoff_result=sample["writer_review_handoff_result"], operator_review_inventory=review_inventory, ) assert ( inventory["mcp_fetch_candidate_queue_writer_review_inventory_accepted"] is False ) assert "candidate_queue_review_inventory_identity_matches_handoff" in inventory[ "blocked_reasons" ] assert "candidate_queue_review_inventory_target_table_safe" in inventory[ "blocked_reasons" ] assert "candidate_queue_review_inventory_row_count_matches_handoff" in inventory[ "blocked_reasons" ] assert "candidate_queue_review_inventory_review_state_safe" in inventory[ "blocked_reasons" ] assert "candidate_queue_review_inventory_artifact_paths_safe" in inventory[ "blocked_reasons" ] assert "candidate_queue_review_inventory_read_only_query_by_operator" in inventory[ "blocked_reasons" ] assert ( "candidate_queue_review_inventory_operator_boundaries_confirmed" in inventory["blocked_reasons"] ) assert ( "candidate_queue_review_inventory_no_api_execution_or_real_write" in inventory["blocked_reasons"] ) assert "candidate_queue_review_inventory_no_secret_or_token_key" in inventory[ "blocked_reasons" ] assert "candidate_queue_review_inventory_side_effect_free" in inventory[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( inventory, ensure_ascii=False, sort_keys=True, ) assert inventory["api_executes_cli"] is False assert inventory["api_reads_approval_token"] is False assert inventory["api_writes_database"] is False assert inventory["api_updates_review_state"] is False assert inventory["candidate_review_state_updated"] is False assert inventory["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_review_inventory_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_inventory" ) get_data = get_response.get_json() sample = get_data["sample_writer_review_inventory_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_inventory", json={"writer_review_inventory_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == ( "mcp_fetch_candidate_queue_writer_review_inventory_preview" ) assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_reads_approval_token"] is False assert get_data["api_writes_database"] is False assert get_data["api_updates_review_state"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_candidate_queue_writer_review_inventory" assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( post_data["mcp_fetch_candidate_queue_writer_review_inventory_accepted"] is True ) assert post_data["ready_for_candidate_queue_review_decision"] is True assert post_data["ready_for_api_review_state_update"] is False assert post_data["ready_for_api_database_write"] is False assert post_data["ready_for_real_write"] is False assert post_data["network_request_allowed"] is False assert post_data["api_executes_cli"] is False assert post_data["api_reads_approval_token"] is False assert post_data["api_updates_review_state"] is False assert post_data["cli_executed"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["candidate_review_state_updated"] is False assert post_data["api_opens_database_connection"] is False def test_mcp_fetch_candidate_queue_writer_review_decision_preview_is_safe_without_payload(): decision = build_mcp_fetch_candidate_queue_writer_review_decision_preview( phase="phase-test" ) assert decision["mode"] == ( "mcp_fetch_candidate_queue_writer_review_decision_preview" ) assert decision["phase"] == "phase-test" assert ( decision["mcp_fetch_candidate_queue_writer_review_decision_accepted"] is False ) assert decision["candidate_queue_writer_review_decision_ready"] is False assert decision["ready_for_candidate_queue_review_decision_approval"] is False assert decision["ready_for_api_review_state_update"] is False assert decision["ready_for_api_database_write"] is False assert decision["api_executes_cli"] is False assert decision["api_reads_approval_token"] is False assert decision["api_opens_database_connection"] is False assert decision["api_writes_database"] is False assert decision["api_updates_review_state"] is False assert decision["api_writes_decision_record"] is False assert decision["decision_record_written"] is False assert decision["candidate_review_state_updated"] is False assert decision["scheduler_attached"] is False assert ( "candidate_queue_review_inventory_payload_or_result_received" in decision["blocked_reasons"] ) assert "candidate_queue_review_decision_payload_received" in decision[ "blocked_reasons" ] assert ( "operator_review_decision" in decision["sample_writer_review_decision_package"] ) def test_mcp_fetch_candidate_queue_writer_review_decision_accepts_sample_decision(): sample = build_mcp_fetch_candidate_queue_writer_review_decision_preview()[ "sample_writer_review_decision_package" ] decision = build_mcp_fetch_candidate_queue_writer_review_decision_preview( writer_review_inventory_package=sample["writer_review_inventory_package"], writer_review_inventory_result=sample["writer_review_inventory_result"], operator_review_decision=sample["operator_review_decision"], phase="phase-test", ) assert decision["mode"] == "mcp_fetch_candidate_queue_writer_review_decision" assert decision["phase"] == "phase-test" assert ( decision["mcp_fetch_candidate_queue_writer_review_decision_accepted"] is True ) assert decision["writer_review_inventory_accepted"] is True assert decision["candidate_queue_writer_review_decision_ready"] is True assert decision["ready_for_candidate_queue_review_decision_approval"] is True assert decision["ready_for_candidate_queue_review_state_writer"] is False assert decision["ready_for_api_review_state_update"] is False assert decision["ready_for_api_database_write"] is False assert decision["blocked_reasons"] == [] assert decision["passed_gate_count"] == decision["gate_count"] inventory = decision["writer_review_inventory_summary"] summary = decision["operator_review_decision_summary"] assert summary["target_table"] == "market_alert_review_queue" assert summary["review_inventory_id"] == inventory["review_inventory_id"] assert summary["handoff_id"] == inventory["handoff_id"] assert summary["inventory_review_id"] == inventory["inventory_review_id"] assert summary["run_package_id"] == inventory["run_package_id"] assert summary["receipt_id"] == inventory["receipt_id"] assert summary["expected_decision_row_count"] == inventory["found_row_count"] assert summary["decision_row_count"] == inventory["found_row_count"] assert len(summary["expected_dedupe_keys"]) == inventory["dedupe_key_count"] assert summary["decision_scope"] == "candidate_queue_review_decision" assert summary["decision_mode"] == "human_review_only" assert all( row["current_review_state"] == "needs_review" for row in decision["decision_rows"] ) assert all( row["proposed_review_decision"] in { "matched", "low_score", "identity_veto", "unit_comparable", "fresh_search_required", "deferred", } for row in decision["decision_rows"] ) assert summary["secret_or_token_submitted_to_api"] is False assert decision["network_request_allowed"] is False assert decision["api_executes_cli"] is False assert decision["api_reads_approval_token"] is False assert decision["api_writes_file"] is False assert decision["api_writes_database"] is False assert decision["api_updates_review_state"] is False assert decision["api_writes_decision_record"] is False assert decision["candidate_queue_persisted"] is False assert decision["candidate_review_state_updated"] is False assert decision["database_write_executed"] is False assert decision["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_review_decision_blocks_unsafe_decision(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_writer_review_decision_preview()[ "sample_writer_review_decision_package" ] ) ) decision_payload = sample["operator_review_decision"] decision_payload["review_inventory_id"] = "wrong-inventory" decision_payload["handoff_id"] = "wrong-handoff" decision_payload["target_table"] = "market_campaign_products" decision_payload["expected_decision_row_count"] = 999 decision_payload["decision_row_count"] = 999 decision_payload["decision_scope"] = "auto_review_state_update" decision_payload["approval_token"] = TEST_APPROVAL_TOKEN decision_payload["api_execution_allowed"] = True decision_payload["real_write_allowed_by_api"] = True decision_payload["api_candidate_review_allowed"] = True decision_payload["api_updates_review_state"] = True decision_payload["api_writes_match_result"] = True decision_payload["review_state_update_executed"] = True decision_payload["decision_rows"][0]["current_review_state"] = "confirmed" decision_payload["decision_rows"][0]["proposed_review_decision"] = "auto_confirmed" decision_payload["decision_rows"][0]["decision_notes"] = "" decision_payload["decision_rows"][0]["evidence_ref"] = "/tmp/unsafe.json" decision_payload["decision_rows"][0]["false_positive_guard_passed"] = False decision_payload["operator_confirmations"]["human_decision_only"] = False decision_payload["operator_confirmations"][ "no_api_review_state_update" ] = False decision = build_mcp_fetch_candidate_queue_writer_review_decision_preview( writer_review_inventory_package=sample["writer_review_inventory_package"], writer_review_inventory_result=sample["writer_review_inventory_result"], operator_review_decision=decision_payload, ) assert ( decision["mcp_fetch_candidate_queue_writer_review_decision_accepted"] is False ) assert decision["writer_review_inventory_accepted"] is True assert "candidate_queue_review_decision_identity_matches_inventory" in decision[ "blocked_reasons" ] assert "candidate_queue_review_decision_target_table_safe" in decision[ "blocked_reasons" ] assert "candidate_queue_review_decision_scope_safe" in decision["blocked_reasons"] assert "candidate_queue_review_decision_row_count_matches_inventory" in decision[ "blocked_reasons" ] assert "candidate_queue_review_decision_rows_still_needs_review" in decision[ "blocked_reasons" ] assert "candidate_queue_review_decision_values_allowed" in decision[ "blocked_reasons" ] assert "candidate_queue_review_decision_row_evidence_complete" in decision[ "blocked_reasons" ] assert "candidate_queue_review_decision_operator_boundaries_confirmed" in decision[ "blocked_reasons" ] assert "candidate_queue_review_decision_no_api_execution_or_real_write" in decision[ "blocked_reasons" ] assert "candidate_queue_review_decision_no_secret_or_token_key" in decision[ "blocked_reasons" ] assert "candidate_queue_review_decision_side_effect_free" in decision[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( decision, ensure_ascii=False, sort_keys=True, ) assert decision["api_executes_cli"] is False assert decision["api_reads_approval_token"] is False assert decision["api_writes_database"] is False assert decision["api_updates_review_state"] is False assert decision["api_writes_decision_record"] is False assert decision["candidate_review_state_updated"] is False assert decision["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_review_decision_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_decision" ) get_data = get_response.get_json() sample = get_data["sample_writer_review_decision_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_decision", json={"writer_review_decision_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == ( "mcp_fetch_candidate_queue_writer_review_decision_preview" ) assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_reads_approval_token"] is False assert get_data["api_writes_database"] is False assert get_data["api_updates_review_state"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_candidate_queue_writer_review_decision" assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( post_data["mcp_fetch_candidate_queue_writer_review_decision_accepted"] is True ) assert post_data["ready_for_candidate_queue_review_decision_approval"] is True assert post_data["ready_for_api_review_state_update"] is False assert post_data["ready_for_api_database_write"] is False assert post_data["ready_for_real_write"] is False assert post_data["network_request_allowed"] is False assert post_data["api_executes_cli"] is False assert post_data["api_reads_approval_token"] is False assert post_data["api_updates_review_state"] is False assert post_data["api_writes_decision_record"] is False assert post_data["decision_record_written"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["candidate_review_state_updated"] is False assert post_data["api_opens_database_connection"] is False def test_mcp_fetch_candidate_queue_writer_review_decision_approval_preview_is_safe_without_payload(): approval = ( build_mcp_fetch_candidate_queue_writer_review_decision_approval_preview( phase="phase-test" ) ) assert approval["mode"] == ( "mcp_fetch_candidate_queue_writer_review_decision_approval_preview" ) assert approval["phase"] == "phase-test" assert ( approval[ "mcp_fetch_candidate_queue_writer_review_decision_approval_accepted" ] is False ) assert approval["candidate_queue_writer_review_decision_approval_ready"] is False assert approval["ready_for_candidate_queue_review_decision_writer_preflight"] is False assert approval["ready_for_candidate_queue_review_state_writer"] is False assert approval["ready_for_api_review_state_update"] is False assert approval["ready_for_api_database_write"] is False assert approval["api_executes_cli"] is False assert approval["api_reads_approval_token"] is False assert approval["api_opens_database_connection"] is False assert approval["api_writes_database"] is False assert approval["api_updates_review_state"] is False assert approval["approval_record_written"] is False assert approval["candidate_review_state_updated"] is False assert approval["scheduler_attached"] is False assert ( "candidate_queue_review_decision_payload_or_result_received" in approval["blocked_reasons"] ) assert "candidate_queue_review_decision_approval_payload_received" in approval[ "blocked_reasons" ] assert ( "operator_review_decision_approval" in approval["sample_writer_review_decision_approval_package"] ) def test_mcp_fetch_candidate_queue_writer_review_decision_approval_accepts_sample_approval(): sample = build_mcp_fetch_candidate_queue_writer_review_decision_approval_preview()[ "sample_writer_review_decision_approval_package" ] approval = build_mcp_fetch_candidate_queue_writer_review_decision_approval_preview( writer_review_decision_package=sample["writer_review_decision_package"], writer_review_decision_result=sample["writer_review_decision_result"], operator_review_decision_approval=sample[ "operator_review_decision_approval" ], phase="phase-test", ) assert ( approval["mode"] == "mcp_fetch_candidate_queue_writer_review_decision_approval" ) assert approval["phase"] == "phase-test" assert ( approval[ "mcp_fetch_candidate_queue_writer_review_decision_approval_accepted" ] is True ) assert approval["writer_review_decision_accepted"] is True assert approval["candidate_queue_writer_review_decision_approval_ready"] is True assert approval["ready_for_candidate_queue_review_decision_writer_preflight"] is True assert approval["ready_for_candidate_queue_review_state_writer"] is False assert approval["ready_for_api_review_state_update"] is False assert approval["ready_for_api_database_write"] is False assert approval["blocked_reasons"] == [] assert approval["passed_gate_count"] == approval["gate_count"] decision = approval["writer_review_decision_summary"] summary = approval["operator_review_decision_approval_summary"] assert summary["approval_id"] assert summary["target_table"] == "market_alert_review_queue" assert summary["review_decision_id"] == decision["review_decision_id"] assert summary["review_inventory_id"] == decision["review_inventory_id"] assert summary["handoff_id"] == decision["handoff_id"] assert summary["inventory_review_id"] == decision["inventory_review_id"] assert summary["run_package_id"] == decision["run_package_id"] assert summary["receipt_id"] == decision["receipt_id"] assert summary["approved_row_count"] == decision["decision_row_count"] assert len(summary["expected_dedupe_keys"]) == decision["decision_row_count"] assert summary["approval_scope"] == "candidate_queue_review_decision_approval" assert summary["approval_mode"] == "human_approval_only" assert all( row["approved_review_decision"] in { "matched", "low_score", "identity_veto", "unit_comparable", "fresh_search_required", "deferred", } for row in approval["approved_rows"] ) assert summary["secret_or_token_submitted_to_api"] is False assert approval["network_request_allowed"] is False assert approval["api_executes_cli"] is False assert approval["api_reads_approval_token"] is False assert approval["api_writes_file"] is False assert approval["api_writes_database"] is False assert approval["api_updates_review_state"] is False assert approval["api_writes_decision_record"] is False assert approval["api_writes_match_result"] is False assert approval["candidate_queue_persisted"] is False assert approval["candidate_review_state_updated"] is False assert approval["database_write_executed"] is False assert approval["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_review_decision_approval_blocks_unsafe_approval(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_writer_review_decision_approval_preview()[ "sample_writer_review_decision_approval_package" ] ) ) approval_payload = sample["operator_review_decision_approval"] approval_payload["review_decision_id"] = "wrong-decision" approval_payload["target_table"] = "market_product_matches" approval_payload["approval_scope"] = "auto_review_state_update" approval_payload["approved_row_count"] = 999 approval_payload["expected_approved_row_count"] = 999 approval_payload["approval_token"] = TEST_APPROVAL_TOKEN approval_payload["api_execution_allowed"] = True approval_payload["real_write_allowed_by_api"] = True approval_payload["api_candidate_review_allowed"] = True approval_payload["api_updates_review_state"] = True approval_payload["api_writes_match_result"] = True approval_payload["decision_approval_persisted"] = True approval_payload["approved_rows"][0][ "approved_review_decision" ] = "approved_for_api_write" approval_payload["approved_rows"][0]["approval_notes"] = "" approval_payload["approved_rows"][0]["evidence_ref"] = "/tmp/unsafe.json" approval_payload["approved_rows"][0]["false_positive_guard_passed"] = False approval_payload["operator_confirmations"]["approval_is_human_only"] = False approval_payload["operator_confirmations"]["no_api_review_state_update"] = False approval = build_mcp_fetch_candidate_queue_writer_review_decision_approval_preview( writer_review_decision_package=sample["writer_review_decision_package"], writer_review_decision_result=sample["writer_review_decision_result"], operator_review_decision_approval=approval_payload, ) assert ( approval[ "mcp_fetch_candidate_queue_writer_review_decision_approval_accepted" ] is False ) assert approval["writer_review_decision_accepted"] is True assert "candidate_queue_review_decision_approval_identity_matches_decision" in approval[ "blocked_reasons" ] assert "candidate_queue_review_decision_approval_target_table_safe" in approval[ "blocked_reasons" ] assert "candidate_queue_review_decision_approval_scope_safe" in approval[ "blocked_reasons" ] assert "candidate_queue_review_decision_approval_row_count_matches_decision" in approval[ "blocked_reasons" ] assert "candidate_queue_review_decision_approval_values_allowed" in approval[ "blocked_reasons" ] assert "candidate_queue_review_decision_approval_row_evidence_complete" in approval[ "blocked_reasons" ] assert "candidate_queue_review_decision_approval_operator_boundaries_confirmed" in approval[ "blocked_reasons" ] assert "candidate_queue_review_decision_approval_no_api_execution_or_real_write" in approval[ "blocked_reasons" ] assert "candidate_queue_review_decision_approval_no_secret_or_token_key" in approval[ "blocked_reasons" ] assert "candidate_queue_review_decision_approval_side_effect_free" in approval[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( approval, ensure_ascii=False, sort_keys=True, ) assert approval["api_executes_cli"] is False assert approval["api_reads_approval_token"] is False assert approval["api_writes_database"] is False assert approval["api_updates_review_state"] is False assert approval["candidate_review_state_updated"] is False assert approval["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_review_decision_approval_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_decision_approval" ) get_data = get_response.get_json() sample = get_data["sample_writer_review_decision_approval_package"] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_decision_approval", json={"writer_review_decision_approval_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == ( "mcp_fetch_candidate_queue_writer_review_decision_approval_preview" ) assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_reads_approval_token"] is False assert get_data["api_writes_database"] is False assert get_data["api_updates_review_state"] is False assert post_response.status_code == 200 assert ( post_data["mode"] == "mcp_fetch_candidate_queue_writer_review_decision_approval" ) assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( post_data[ "mcp_fetch_candidate_queue_writer_review_decision_approval_accepted" ] is True ) assert post_data["ready_for_candidate_queue_review_decision_writer_preflight"] is True assert post_data["ready_for_api_review_state_update"] is False assert post_data["ready_for_api_database_write"] is False assert post_data["ready_for_real_write"] is False assert post_data["network_request_allowed"] is False assert post_data["api_executes_cli"] is False assert post_data["api_reads_approval_token"] is False assert post_data["api_updates_review_state"] is False assert post_data["approval_record_written"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["candidate_review_state_updated"] is False assert post_data["api_opens_database_connection"] is False def test_mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_preview_is_safe_without_payload(): preflight = ( build_mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_preview( phase="phase-test" ) ) assert preflight["mode"] == ( "mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_preview" ) assert preflight["phase"] == "phase-test" assert ( preflight[ "mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_accepted" ] is False ) assert ( preflight[ "candidate_queue_writer_review_decision_approval_writer_preflight_ready" ] is False ) assert preflight["ready_for_candidate_queue_review_decision_writer_cli_review"] is False assert preflight["ready_for_api_review_state_update"] is False assert preflight["ready_for_api_database_write"] is False assert preflight["api_executes_cli"] is False assert preflight["api_reads_approval_token"] is False assert preflight["api_opens_database_connection"] is False assert preflight["api_writes_database"] is False assert preflight["api_updates_review_state"] is False assert preflight["preflight_record_written"] is False assert preflight["candidate_review_state_updated"] is False assert preflight["scheduler_attached"] is False assert ( "candidate_queue_review_decision_approval_payload_or_result_received" in preflight["blocked_reasons"] ) assert ( "candidate_queue_review_decision_approval_writer_preflight_payload_received" in preflight["blocked_reasons"] ) assert ( "operator_writer_preflight" in preflight[ "sample_writer_review_decision_approval_writer_preflight_package" ] ) def test_mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_accepts_sample(): sample = ( build_mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_preview() ["sample_writer_review_decision_approval_writer_preflight_package"] ) preflight = ( build_mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_preview( writer_review_decision_approval_package=sample[ "writer_review_decision_approval_package" ], writer_review_decision_approval_result=sample[ "writer_review_decision_approval_result" ], operator_review_decision_approval_writer_preflight=sample[ "operator_review_decision_approval_writer_preflight" ], phase="phase-test", ) ) assert preflight["mode"] == ( "mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight" ) assert preflight["phase"] == "phase-test" assert ( preflight[ "mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_accepted" ] is True ) assert preflight["writer_review_decision_approval_accepted"] is True assert ( preflight[ "candidate_queue_writer_review_decision_approval_writer_preflight_ready" ] is True ) assert preflight["ready_for_candidate_queue_review_decision_writer_cli_review"] is True assert preflight["ready_for_candidate_queue_review_state_writer"] is False assert preflight["ready_for_api_review_state_update"] is False assert preflight["ready_for_api_database_write"] is False assert preflight["blocked_reasons"] == [] assert preflight["passed_gate_count"] == preflight["gate_count"] approval = preflight["writer_review_decision_approval_summary"] summary = preflight["operator_writer_preflight_summary"] assert summary["writer_preflight_id"] assert summary["target_table"] == "market_alert_review_queue" assert summary["approval_id"] == approval["approval_id"] assert summary["review_decision_id"] == approval["review_decision_id"] assert summary["review_inventory_id"] == approval["review_inventory_id"] assert summary["handoff_id"] == approval["handoff_id"] assert summary["inventory_review_id"] == approval["inventory_review_id"] assert summary["run_package_id"] == approval["run_package_id"] assert summary["receipt_id"] == approval["receipt_id"] assert summary["preflight_row_count"] == approval["approved_row_count"] assert summary["preflight_scope"] == ( "candidate_queue_review_decision_approval_writer_preflight" ) assert summary["preflight_mode"] == "cli_only_writer_preflight_preview" assert all( row["target_review_state"] in { "matched", "low_score", "identity_veto", "unit_comparable", "fresh_search_required", "deferred", } for row in preflight["preflight_rows"] ) assert summary["secret_or_token_submitted_to_api"] is False assert preflight["network_request_allowed"] is False assert preflight["api_executes_cli"] is False assert preflight["api_reads_approval_token"] is False assert preflight["api_writes_file"] is False assert preflight["api_writes_database"] is False assert preflight["api_updates_review_state"] is False assert preflight["api_writes_preflight_record"] is False assert preflight["api_writes_approval_record"] is False assert preflight["api_writes_decision_record"] is False assert preflight["api_writes_match_result"] is False assert preflight["candidate_queue_persisted"] is False assert preflight["candidate_review_state_updated"] is False assert preflight["database_write_executed"] is False assert preflight["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_blocks_unsafe_payload(): sample = json.loads( json.dumps( build_mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_preview() ["sample_writer_review_decision_approval_writer_preflight_package"] ) ) preflight_payload = sample["operator_review_decision_approval_writer_preflight"] preflight_payload["approval_id"] = "wrong-approval" preflight_payload["target_table"] = "market_product_matches" preflight_payload["preflight_scope"] = "auto_review_state_update" preflight_payload["preflight_row_count"] = 999 preflight_payload["expected_preflight_row_count"] = 999 preflight_payload["approval_token"] = TEST_APPROVAL_TOKEN preflight_payload["api_execution_allowed"] = True preflight_payload["real_write_allowed_by_api"] = True preflight_payload["api_candidate_review_allowed"] = True preflight_payload["api_updates_review_state"] = True preflight_payload["api_writes_preflight_record"] = True preflight_payload["api_writes_match_result"] = True preflight_payload["writer_preflight_persisted"] = True preflight_payload["preflight_rows"][0]["target_review_state"] = "auto_confirmed" preflight_payload["preflight_rows"][0]["preflight_notes"] = "" preflight_payload["preflight_rows"][0]["preflight_evidence_ref"] = ( "/tmp/unsafe.json" ) preflight_payload["preflight_rows"][0]["false_positive_guard_passed"] = False preflight_payload["operator_confirmations"][ "writer_preflight_is_cli_only" ] = False preflight_payload["operator_confirmations"][ "no_api_review_state_update" ] = False preflight = ( build_mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_preview( writer_review_decision_approval_package=sample[ "writer_review_decision_approval_package" ], writer_review_decision_approval_result=sample[ "writer_review_decision_approval_result" ], operator_review_decision_approval_writer_preflight=preflight_payload, ) ) assert ( preflight[ "mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_accepted" ] is False ) assert preflight["writer_review_decision_approval_accepted"] is True assert ( "candidate_queue_review_decision_approval_writer_preflight_identity_matches_approval" in preflight["blocked_reasons"] ) assert ( "candidate_queue_review_decision_approval_writer_preflight_target_table_safe" in preflight["blocked_reasons"] ) assert ( "candidate_queue_review_decision_approval_writer_preflight_scope_safe" in preflight["blocked_reasons"] ) assert ( "candidate_queue_review_decision_approval_writer_preflight_row_count_matches_approval" in preflight["blocked_reasons"] ) assert ( "candidate_queue_review_decision_approval_writer_preflight_transitions_allowed" in preflight["blocked_reasons"] ) assert ( "candidate_queue_review_decision_approval_writer_preflight_row_evidence_complete" in preflight["blocked_reasons"] ) assert ( "candidate_queue_review_decision_approval_writer_preflight_operator_boundaries_confirmed" in preflight["blocked_reasons"] ) assert ( "candidate_queue_review_decision_approval_writer_preflight_no_api_execution_or_real_write" in preflight["blocked_reasons"] ) assert ( "candidate_queue_review_decision_approval_writer_preflight_no_secret_or_token_key" in preflight["blocked_reasons"] ) assert ( "candidate_queue_review_decision_approval_writer_preflight_side_effect_free" in preflight["blocked_reasons"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( preflight, ensure_ascii=False, sort_keys=True, ) assert preflight["api_executes_cli"] is False assert preflight["api_reads_approval_token"] is False assert preflight["api_writes_database"] is False assert preflight["api_updates_review_state"] is False assert preflight["candidate_review_state_updated"] is False assert preflight["scheduler_attached"] is False def test_mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight" ) get_data = get_response.get_json() sample = get_data[ "sample_writer_review_decision_approval_writer_preflight_package" ] post_response = client.post( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight", json={"writer_review_decision_approval_writer_preflight_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == ( "mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_preview" ) assert ( get_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert get_data["api_executes_cli"] is False assert get_data["api_reads_approval_token"] is False assert get_data["api_writes_database"] is False assert get_data["api_updates_review_state"] is False assert post_response.status_code == 200 assert post_data["mode"] == ( "mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight" ) assert ( post_data["phase"] == "phase_140_market_intel_professional_source_governance" ) assert ( post_data[ "mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_accepted" ] is True ) assert post_data["ready_for_candidate_queue_review_decision_writer_cli_review"] is True assert post_data["ready_for_api_review_state_update"] is False assert post_data["ready_for_api_database_write"] is False assert post_data["ready_for_real_write"] is False assert post_data["network_request_allowed"] is False assert post_data["api_executes_cli"] is False assert post_data["api_reads_approval_token"] is False assert post_data["api_updates_review_state"] is False assert post_data["preflight_record_written"] is False assert post_data["candidate_queue_created"] is False assert post_data["candidate_queue_persisted"] is False assert post_data["candidate_review_state_updated"] is False assert post_data["api_opens_database_connection"] is False def test_manual_sample_plan_preview_blocks_fetch_and_write(): plan = MarketIntelService().build_manual_sample_plan() assert plan["mode"] == "manual_sample_fetch_plan_preview" assert plan["phase"] == "phase_140_market_intel_professional_source_governance" assert plan["ready_for_manual_sample_fetch"] is False assert plan["sample_fetch_executed"] is False assert plan["external_network_executed"] is False assert plan["database_session_created"] is False assert plan["database_write_executed"] is False assert plan["database_commit_executed"] is False assert plan["scheduler_attached"] is False assert plan["writes_executed"] is False assert plan["would_write_database"] is False assert plan["platform_count"] == 4 assert plan["sample_source_total"] == 4 assert plan["sample_policy"]["max_platforms_per_manual_batch"] == 1 assert plan["sample_policy"]["first_batch_platform"] == "pchome" assert [item["platform_code"] for item in plan["sample_platforms"]] == [ "pchome", "momo", "coupang", "shopee", ] assert all( item["sample_source_count"] == 1 and item["network_status"] == "not_executed" and item["write_status"] == "blocked_preview_only" for item in plan["sample_platforms"] ) assert "market_intel_enabled" in plan["blocked_reasons"] assert "mcp_fetch_gate_open" in plan["blocked_reasons"] assert "sample_fetch_not_executed_by_api" in plan["blocked_reasons"] assert "do_not_fetch_from_api_preview" in plan["safe_boundaries"] assert "do_not_bypass_anti_bot" in plan["safe_boundaries"] def test_manual_sample_plan_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/manual_sample_plan") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "manual_sample_fetch_plan_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["sample_fetch_executed"] is False assert data["external_network_executed"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False def test_manual_sample_acceptance_preview_blocks_candidate_import(): acceptance = MarketIntelService().build_manual_sample_acceptance() assert acceptance["mode"] == "manual_sample_acceptance_preview" assert acceptance["phase"] == "phase_140_market_intel_professional_source_governance" assert acceptance["contract_ready"] is True assert acceptance["sample_result_loaded"] is False assert acceptance["sample_result_accepted"] is False assert acceptance["candidate_import_allowed"] is False assert acceptance["external_network_executed"] is False assert acceptance["database_connection_opened"] is False assert acceptance["database_session_created"] is False assert acceptance["database_write_executed"] is False assert acceptance["database_commit_executed"] is False assert acceptance["scheduler_attached"] is False assert acceptance["writes_executed"] is False assert acceptance["would_write_database"] is False assert "sample_result_not_loaded" in acceptance["blocked_reasons"] assert "manual_review_required_before_import" in acceptance["blocked_reasons"] assert "status_code" in acceptance["required_result_fields"] assert "campaign_link_candidates" in acceptance["required_diagnostic_fields"] assert acceptance["acceptance_thresholds"]["minimum_campaign_candidates"] == 1 assert acceptance["acceptance_thresholds"]["accepted_candidate_bands"] == ["high", "medium"] assert {item["key"] for item in acceptance["reject_conditions"]} >= { "anti_bot_or_login_wall", "no_campaign_candidates", } assert "do_not_import_candidates_without_human_review" in acceptance["safe_boundaries"] assert "do_not_write_market_tables_from_acceptance_preview" in acceptance["safe_boundaries"] def test_manual_sample_acceptance_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/manual_sample_acceptance") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "manual_sample_acceptance_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["sample_result_loaded"] is False assert data["candidate_import_allowed"] is False assert data["external_network_executed"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False def test_manual_sample_review_preview_is_planned_until_result_loaded(): review = MarketIntelService().build_manual_sample_review() assert review["mode"] == "manual_sample_review_preview" assert review["phase"] == "phase_140_market_intel_professional_source_governance" assert review["contract_ready"] is True assert review["sample_result_loaded"] is False assert review["sample_result_reviewed"] is False assert review["sample_result_accepted"] is False assert review["ready_for_candidate_preview"] is False assert review["candidate_import_allowed"] is False assert review["external_network_executed"] is False assert review["database_connection_opened"] is False assert review["database_session_created"] is False assert review["database_write_executed"] is False assert review["database_commit_executed"] is False assert review["scheduler_attached"] is False assert review["writes_executed"] is False assert review["would_write_database"] is False assert review["review_result"] == "planned_no_sample_result" assert "sample_result_not_loaded" in review["blocked_reasons"] assert "candidate_import_still_blocked_until_operator_approval" in review["blocked_reasons"] assert "do_not_fetch_external_pages_from_review_api" in review["safe_boundaries"] assert "do_not_write_market_tables_from_review_preview" in review["safe_boundaries"] def test_manual_sample_review_evaluator_accepts_good_result_without_import(): acceptance = MarketIntelService().build_manual_sample_acceptance() sample_result = { "batch_id": "sample-batch-1", "platform_code": "pchome", "source_key": "homepage", "source_url": "https://24h.pchome.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1200, "page_hash": "a" * 64, "title": "PChome 活動", "diagnostics": { "link_count": 3, "same_host_link_count": 2, "campaign_link_candidates": [ { "confidence_band": "high", "score": 82, "url": "https://24h.pchome.com.tw/activity/sample", "text": "品牌活動", }, ], }, } result = evaluate_manual_sample_result(sample_result, acceptance) assert result["sample_result_loaded"] is True assert result["sample_result_reviewed"] is True assert result["sample_result_accepted"] is True assert result["ready_for_candidate_preview"] is True assert result["candidate_import_allowed"] is False assert result["review_result"] == "accepted_for_candidate_preview" assert all(check["passed"] for check in result["review_checks"]) assert result["review_findings"] == [] assert result["candidate_summary"]["candidate_count"] == 1 assert result["candidate_summary"]["accepted_candidate_count"] == 1 def test_manual_sample_review_evaluator_rejects_bad_result(): acceptance = MarketIntelService().build_manual_sample_acceptance() sample_result = { "batch_id": "sample-batch-2", "platform_code": "shopee", "source_key": "mall", "source_url": "https://shopee.tw/mall", "status": "blocked", "status_code": 403, "content_length": 120, "page_hash": "short", "title": "", "diagnostics": { "link_count": 0, "same_host_link_count": 0, "campaign_link_candidates": [], }, } result = evaluate_manual_sample_result(sample_result, acceptance) assert result["sample_result_loaded"] is True assert result["sample_result_reviewed"] is True assert result["sample_result_accepted"] is False assert result["ready_for_candidate_preview"] is False assert result["candidate_import_allowed"] is False assert result["review_result"] == "rejected_sample_result" assert {item["key"] for item in result["review_findings"]} >= { "http_status_ok", "content_has_body", "candidate_quality_reviewed", } def test_manual_sample_review_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/manual_sample_review") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "manual_sample_review_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["sample_result_loaded"] is False assert data["sample_result_reviewed"] is False assert data["candidate_import_allowed"] is False assert data["external_network_executed"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False def test_manual_sample_review_evaluation_preview_accepts_payload_without_persisting(): sample_result = { "batch_id": "sample-batch-3", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1800, "page_hash": "b" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 4, "same_host_link_count": 4, "campaign_link_candidates": [ { "confidence_band": "medium", "score": 74, "url": "https://www.momoshop.com.tw/activity/sample", "text": "活動頁", }, ], }, } review = MarketIntelService().build_manual_sample_review_evaluation( sample_result=sample_result ) assert review["mode"] == "manual_sample_review_evaluation_preview" assert review["phase"] == "phase_140_market_intel_professional_source_governance" assert review["review_request_type"] == "operator_posted_json" assert review["payload_received"] is True assert review["payload_valid_json_object"] is True assert review["payload_persisted"] is False assert review["sample_result_persisted"] is False assert review["sample_result_loaded"] is True assert review["sample_result_reviewed"] is True assert review["sample_result_accepted"] is True assert review["ready_for_candidate_preview"] is True assert review["candidate_preview_payload_created"] is True assert review["candidate_preview_persisted"] is False assert review["candidate_import_allowed"] is False assert review["external_network_executed"] is False assert review["database_write_executed"] is False assert review["database_commit_executed"] is False assert review["scheduler_attached"] is False assert "do_not_persist_posted_review_payload" in review["safe_boundaries"] def test_manual_sample_review_evaluate_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/evaluate", json={ "sample_result": { "batch_id": "sample-batch-4", "platform_code": "pchome", "source_key": "homepage", "source_url": "https://24h.pchome.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1400, "page_hash": "c" * 64, "title": "PChome 活動", "diagnostics": { "link_count": 2, "same_host_link_count": 2, "campaign_link_candidates": [ { "confidence_band": "high", "score": 88, "url": "https://24h.pchome.com.tw/activity/sample", "text": "品牌活動", }, ], }, } }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "manual_sample_review_evaluation_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["payload_received"] is True assert data["payload_valid_json_object"] is True assert data["payload_persisted"] is False assert data["sample_result_persisted"] is False assert data["sample_result_accepted"] is True assert data["ready_for_candidate_preview"] is True assert data["candidate_import_allowed"] is False assert data["external_network_executed"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False def test_manual_sample_review_evaluate_rejects_invalid_json_without_write(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/evaluate", data="not-json", content_type="text/plain", ) data = response.get_json() assert response.status_code == 400 assert data["mode"] == "manual_sample_review_evaluation_preview" assert data["payload_received"] is False assert data["payload_valid_json_object"] is False assert data["payload_error"] == "invalid_json_object" assert data["payload_persisted"] is False assert data["sample_result_persisted"] is False assert data["candidate_import_allowed"] is False assert data["external_network_executed"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False assert "sample_result_payload_invalid" in data["blocked_reasons"] def test_manual_sample_candidate_handoff_preview_creates_candidates_without_persisting(): sample_result = { "batch_id": "sample-batch-5", "platform_code": "pchome", "source_key": "homepage", "source_url": "https://24h.pchome.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1500, "page_hash": "e" * 64, "title": "PChome 活動", "diagnostics": { "link_count": 3, "same_host_link_count": 2, "campaign_link_candidates": [ { "confidence_band": "high", "score": 91, "url": "https://24h.pchome.com.tw/activity/sample", "text": "品牌活動", }, { "confidence_band": "low", "score": 22, "url": "https://24h.pchome.com.tw/search/noise", "text": "低信心連結", }, ], }, } handoff = MarketIntelService().build_manual_sample_candidate_handoff( sample_result=sample_result ) assert handoff["mode"] == "manual_sample_candidate_handoff_preview" assert handoff["phase"] == "phase_140_market_intel_professional_source_governance" assert handoff["payload_received"] is True assert handoff["payload_valid_json_object"] is True assert handoff["payload_persisted"] is False assert handoff["sample_result_persisted"] is False assert handoff["handoff_ready"] is True assert handoff["candidate_handoff_created"] is True assert handoff["candidate_handoff_persisted"] is False assert handoff["candidate_import_allowed"] is False assert handoff["external_network_executed"] is False assert handoff["database_connection_opened"] is False assert handoff["database_session_created"] is False assert handoff["database_write_executed"] is False assert handoff["database_commit_executed"] is False assert handoff["scheduler_attached"] is False assert handoff["handoff_summary"]["candidate_count"] == 1 assert handoff["candidates"][0]["review_status"] == "needs_operator_review" assert handoff["candidates"][0]["write_status"] == "blocked_preview_only" assert handoff["candidates"][0]["import_allowed"] is False assert "do_not_persist_candidate_handoff_payload" in handoff["safe_boundaries"] def test_manual_sample_candidate_handoff_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/candidate_handoff", json={ "sample_result": { "batch_id": "sample-batch-6", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1600, "page_hash": "f" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 2, "same_host_link_count": 2, "campaign_link_candidates": [ { "confidence_band": "medium", "score": 76, "url": "https://www.momoshop.com.tw/activity/sample", "text": "活動頁", }, ], }, } }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "manual_sample_candidate_handoff_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["payload_received"] is True assert data["handoff_ready"] is True assert data["candidate_handoff_created"] is True assert data["candidate_handoff_persisted"] is False assert data["candidate_import_allowed"] is False assert data["external_network_executed"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False assert data["handoff_summary"]["candidate_count"] == 1 def test_manual_sample_candidate_handoff_blocks_invalid_payload(): handoff = MarketIntelService().build_manual_sample_candidate_handoff( sample_result=None, payload_error="invalid_json_object", ) assert handoff["mode"] == "manual_sample_candidate_handoff_preview" assert handoff["payload_received"] is False assert handoff["payload_valid_json_object"] is False assert handoff["handoff_ready"] is False assert handoff["candidate_handoff_created"] is False assert handoff["candidate_handoff_persisted"] is False assert handoff["candidate_import_allowed"] is False assert handoff["database_write_executed"] is False assert "candidate_handoff_not_ready" in handoff["blocked_reasons"] def test_manual_sample_candidate_queue_draft_preview_builds_review_items_without_persisting(): sample_result = { "batch_id": "sample-batch-7", "platform_code": "coupang", "source_key": "homepage", "source_url": "https://www.tw.coupang.com/", "status": "fetched", "status_code": 200, "content_length": 1800, "page_hash": "a" * 64, "title": "酷澎活動", "diagnostics": { "link_count": 3, "same_host_link_count": 2, "campaign_link_candidates": [ { "confidence_band": "high", "score": 95, "url": "https://www.tw.coupang.com/promotion/sample", "text": "限時活動", } ], }, } queue_draft = MarketIntelService().build_manual_sample_candidate_queue_draft( sample_result=sample_result ) assert queue_draft["mode"] == "manual_sample_candidate_queue_draft_preview" assert queue_draft["phase"] == "phase_140_market_intel_professional_source_governance" assert queue_draft["payload_received"] is True assert queue_draft["payload_valid_json_object"] is True assert queue_draft["payload_persisted"] is False assert queue_draft["sample_result_persisted"] is False assert queue_draft["handoff_ready"] is True assert queue_draft["queue_draft_ready"] is True assert queue_draft["review_queue_draft_created"] is True assert queue_draft["review_queue_created"] is False assert queue_draft["review_queue_persisted"] is False assert queue_draft["candidate_import_allowed"] is False assert queue_draft["external_network_executed"] is False assert queue_draft["database_connection_opened"] is False assert queue_draft["database_session_created"] is False assert queue_draft["database_write_executed"] is False assert queue_draft["database_commit_executed"] is False assert queue_draft["scheduler_attached"] is False assert queue_draft["queue_summary"]["queue_item_count"] == 1 assert queue_draft["queue_contract"]["table_name"] == "market_alert_review_queue" assert queue_draft["queue_items"][0]["review_state"] == "needs_review" assert queue_draft["queue_items"][0]["priority_lane"] == "urgent" assert queue_draft["queue_items"][0]["threshold_level"] == "high" assert queue_draft["queue_items"][0]["source_batch_id"] == "sample-batch-7" assert queue_draft["queue_items"][0]["review_priority"] == 80 assert queue_draft["queue_items"][0]["write_status"] == "blocked_preview_only" assert queue_draft["queue_items"][0]["approval_required"] is True assert ( "do_not_persist_candidate_review_queue_draft" in queue_draft["safe_boundaries"] ) def test_manual_sample_candidate_queue_draft_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/candidate_queue_draft", json={ "sample_result": { "batch_id": "sample-batch-8", "platform_code": "shopee", "source_key": "homepage", "source_url": "https://shopee.tw/", "status": "fetched", "status_code": 200, "content_length": 1900, "page_hash": "b" * 64, "title": "蝦皮活動", "diagnostics": { "link_count": 2, "same_host_link_count": 2, "campaign_link_candidates": [ { "confidence_band": "medium", "score": 72, "url": "https://shopee.tw/m/sample-campaign", "text": "商城活動", }, ], }, } }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "manual_sample_candidate_queue_draft_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["payload_received"] is True assert data["handoff_ready"] is True assert data["queue_draft_ready"] is True assert data["review_queue_draft_created"] is True assert data["review_queue_created"] is False assert data["review_queue_persisted"] is False assert data["candidate_import_allowed"] is False assert data["external_network_executed"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False assert data["queue_summary"]["queue_item_count"] == 1 def test_manual_sample_candidate_queue_draft_blocks_invalid_payload(): queue_draft = MarketIntelService().build_manual_sample_candidate_queue_draft( sample_result=None, payload_error="invalid_json_object", ) assert queue_draft["mode"] == "manual_sample_candidate_queue_draft_preview" assert queue_draft["payload_received"] is False assert queue_draft["payload_valid_json_object"] is False assert queue_draft["handoff_ready"] is False assert queue_draft["queue_draft_ready"] is False assert queue_draft["review_queue_draft_created"] is False assert queue_draft["review_queue_created"] is False assert queue_draft["review_queue_persisted"] is False assert queue_draft["candidate_import_allowed"] is False assert queue_draft["database_write_executed"] is False assert "review_queue_draft_not_ready" in queue_draft["blocked_reasons"] def test_manual_sample_candidate_queue_approval_preview_blocks_write_and_maps_rows(): sample_result = { "batch_id": "sample-batch-9", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "c" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 2, "same_host_link_count": 2, "campaign_link_candidates": [ { "confidence_band": "high", "score": 92, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } approval = MarketIntelService().build_manual_sample_candidate_queue_approval( sample_result=sample_result ) assert approval["mode"] == "manual_sample_candidate_queue_approval_preview" assert approval["phase"] == "phase_140_market_intel_professional_source_governance" assert approval["payload_received"] is True assert approval["payload_valid_json_object"] is True assert approval["payload_persisted"] is False assert approval["approval_preview_created"] is True assert approval["approval_request_created"] is False assert approval["approval_record_written"] is False assert approval["review_queue_write_allowed"] is False assert approval["review_queue_created"] is False assert approval["review_queue_persisted"] is False assert approval["candidate_import_allowed"] is False assert approval["external_network_executed"] is False assert approval["database_connection_opened"] is False assert approval["database_session_created"] is False assert approval["database_write_executed"] is False assert approval["database_commit_executed"] is False assert approval["scheduler_attached"] is False assert approval["approval_summary"]["target_table"] == "market_alert_review_queue" assert approval["approval_summary"]["row_preview_count"] == 1 assert approval["approval_summary"]["gates_passed"] == 3 assert approval["approval_summary"]["manual_approval_required"] is True row = approval["queue_write_preview"]["rows"][0] assert row["review_state"] == "needs_review" assert row["priority_lane"] == "urgent" assert row["threshold_level"] == "high" assert row["source_batch_id"] == "sample-batch-9" assert row["write_status"] == "blocked_approval_preview_only" assert "runtime_write_flags_enabled" in approval["blocked_reasons"] assert "manual_operator_approval" in approval["blocked_reasons"] assert "review_queue_write_still_blocked" in approval["blocked_reasons"] assert ( "do_not_insert_market_alert_review_queue_from_preview" in approval["safe_boundaries"] ) def test_manual_sample_candidate_queue_approval_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/candidate_queue_approval", json={ "sample_result": { "batch_id": "sample-batch-10", "platform_code": "pchome", "source_key": "homepage", "source_url": "https://24h.pchome.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1800, "page_hash": "d" * 64, "title": "PChome 活動", "diagnostics": { "link_count": 2, "same_host_link_count": 2, "campaign_link_candidates": [ { "confidence_band": "medium", "score": 73, "url": "https://24h.pchome.com.tw/activity/sample", "text": "活動頁", }, ], }, } }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "manual_sample_candidate_queue_approval_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["payload_received"] is True assert data["approval_preview_created"] is True assert data["approval_request_created"] is False assert data["approval_record_written"] is False assert data["review_queue_write_allowed"] is False assert data["review_queue_created"] is False assert data["review_queue_persisted"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False assert data["queue_write_preview"]["target_table"] == "market_alert_review_queue" assert data["queue_write_preview"]["row_count"] == 1 def test_manual_sample_candidate_queue_approval_blocks_invalid_payload(): approval = MarketIntelService().build_manual_sample_candidate_queue_approval( sample_result=None, payload_error="invalid_json_object", ) assert approval["mode"] == "manual_sample_candidate_queue_approval_preview" assert approval["payload_received"] is False assert approval["payload_valid_json_object"] is False assert approval["approval_preview_created"] is False assert approval["approval_request_created"] is False assert approval["approval_record_written"] is False assert approval["review_queue_write_allowed"] is False assert approval["review_queue_created"] is False assert approval["review_queue_persisted"] is False assert approval["database_write_executed"] is False assert "review_queue_draft_not_ready" in approval["blocked_reasons"] def test_manual_sample_candidate_queue_transaction_preview_blocks_execution(): sample_result = { "batch_id": "sample-batch-11", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "e" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 2, "same_host_link_count": 2, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) assert transaction["mode"] == "manual_sample_candidate_queue_transaction_preview" assert transaction["phase"] == "phase_140_market_intel_professional_source_governance" assert transaction["payload_received"] is True assert transaction["payload_valid_json_object"] is True assert transaction["payload_persisted"] is False assert transaction["transaction_preview_created"] is True assert transaction["transaction_ready"] is False assert transaction["transaction_opened"] is False assert transaction["transaction_committed"] is False assert transaction["approval_request_created"] is False assert transaction["approval_record_written"] is False assert transaction["review_queue_write_allowed"] is False assert transaction["review_queue_created"] is False assert transaction["review_queue_persisted"] is False assert transaction["candidate_import_allowed"] is False assert transaction["external_network_executed"] is False assert transaction["database_connection_opened"] is False assert transaction["database_session_created"] is False assert transaction["database_write_executed"] is False assert transaction["database_commit_executed"] is False assert transaction["scheduler_attached"] is False assert transaction["transaction_summary"]["target_table"] == "market_alert_review_queue" assert transaction["transaction_summary"]["statement_count"] == 1 assert transaction["transaction_summary"]["conflict_policy"] == "dedupe_key_do_nothing" statement = transaction["statements"][0] assert statement["operation"] == "insert" assert statement["table"] == "market_alert_review_queue" assert statement["write_status"] == "blocked_transaction_preview_only" assert statement["idempotency_key"].startswith("market_alert_review_queue:") assert statement["parameter_preview"]["dedupe_key"].startswith("sample-candidate:") assert statement["parameter_preview"]["metadata_json_preview"]["platform_code"] == "momo" assert "queue_approval_gates_not_all_passed" in transaction["blocked_reasons"] assert "queue_transaction_execution_still_blocked" in transaction["blocked_reasons"] assert ( "do_not_execute_queue_transaction_from_preview" in transaction["safe_boundaries"] ) def test_manual_sample_candidate_queue_transaction_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/candidate_queue_transaction", json={ "sample_result": { "batch_id": "sample-batch-12", "platform_code": "pchome", "source_key": "homepage", "source_url": "https://24h.pchome.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1800, "page_hash": "f" * 64, "title": "PChome 活動", "diagnostics": { "link_count": 2, "same_host_link_count": 2, "campaign_link_candidates": [ { "confidence_band": "medium", "score": 74, "url": "https://24h.pchome.com.tw/activity/sample", "text": "活動頁", }, ], }, } }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "manual_sample_candidate_queue_transaction_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["payload_received"] is True assert data["transaction_preview_created"] is True assert data["transaction_ready"] is False assert data["transaction_opened"] is False assert data["transaction_committed"] is False assert data["approval_record_written"] is False assert data["review_queue_created"] is False assert data["review_queue_persisted"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False assert data["transaction_summary"]["statement_count"] == 1 def test_manual_sample_candidate_queue_transaction_blocks_invalid_payload(): transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=None, payload_error="invalid_json_object", ) assert transaction["mode"] == "manual_sample_candidate_queue_transaction_preview" assert transaction["payload_received"] is False assert transaction["payload_valid_json_object"] is False assert transaction["transaction_preview_created"] is False assert transaction["transaction_ready"] is False assert transaction["transaction_opened"] is False assert transaction["transaction_committed"] is False assert transaction["approval_record_written"] is False assert transaction["review_queue_created"] is False assert transaction["database_write_executed"] is False assert "queue_transaction_preview_not_ready" in transaction["blocked_reasons"] def test_candidate_queue_writer_cli_gate_blocks_until_preflight_backup_and_smoke_pass(): from services.market_intel.candidate_queue_writer_cli import ( build_candidate_queue_writer_cli_plan, ) sample_result = { "batch_id": "sample-batch-13", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "a" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) status = build_candidate_queue_writer_cli_plan( transaction_preview=transaction, execute_requested=True, apply_real_write=True, approval_token=TEST_APPROVAL_TOKEN, approval_token_secret=TEST_APPROVAL_TOKEN, ) assert status["mode"] == "candidate_queue_writer_cli_blocked" assert status["execute_requested"] is True assert status["apply_real_write_requested"] is True assert status["approval_token_present"] is True assert status["approval_token_valid"] is True assert status["queue_writer_implementation_enabled"] is True assert status["ready_for_real_write"] is False assert status["writes_executed"] is False assert status["would_write_database"] is False assert status["database_connection_opened"] is False assert status["database_session_created"] is False assert status["explicit_transaction_opened"] is False assert status["database_write_executed"] is False assert status["database_commit_executed"] is False assert status["scheduler_attached"] is False assert status["exit_code"] == 2 assert status["transaction_preview_summary"]["statement_count"] == 1 assert "approval_token_valid" not in status["blocked_reasons"] assert "queue_writer_preflight_ready" in status["blocked_reasons"] assert "backup_verified" in status["blocked_reasons"] assert "migration_live_smoke_passed" in status["blocked_reasons"] assert "queue_writer_implementation_enabled" not in status["blocked_reasons"] assert status["safety_contract"]["refuses_api_execution"] is True assert ( "do_not_execute_candidate_queue_writer_from_api" in status["safe_boundaries"] ) def test_candidate_queue_writer_preflight_planned_maps_payload_without_db(): from services.market_intel.candidate_queue_writer_preflight import ( build_candidate_queue_writer_preflight, ) sample_result = { "batch_id": "sample-batch-16", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "d" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) preflight = build_candidate_queue_writer_preflight( transaction_preview=transaction, execute_requested=False, ) assert preflight["mode"] == "candidate_queue_writer_preflight_planned" assert preflight["execute_requested"] is False assert preflight["read_only_query_executed"] is False assert preflight["database_connection_opened"] is False assert preflight["database_write_executed"] is False assert preflight["database_commit_executed"] is False assert preflight["scheduler_attached"] is False assert preflight["ready_for_writer_review"] is False assert preflight["ready_for_real_write"] is False assert preflight["statement_count"] == 1 assert preflight["payload_column_map"]["metadata_json_preview"] == "metadata_json" assert preflight["unmapped_payload_keys"] == [] assert "metadata_json" in preflight["mapped_insert_columns"] assert "queue_writer_preflight_not_loaded" in preflight["blocked_reasons"] def test_candidate_queue_writer_preflight_sqlite_read_only_validates_columns(): from services.market_intel.candidate_queue_writer_preflight import ( build_candidate_queue_writer_preflight, ) sample_result = { "batch_id": "sample-batch-17", "platform_code": "pchome", "source_key": "homepage", "source_url": "https://24h.pchome.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1800, "page_hash": "e" * 64, "title": "PChome 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "medium", "score": 74, "url": "https://24h.pchome.com.tw/activity/sample", "text": "活動頁", }, ], }, } transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) engine = create_engine("sqlite:///:memory:") with engine.begin() as conn: conn.execute( text( """ CREATE TABLE market_alert_review_queue ( id INTEGER PRIMARY KEY AUTOINCREMENT, alert_candidate_id TEXT NOT NULL UNIQUE, review_state TEXT NOT NULL DEFAULT 'draft', priority_lane TEXT NOT NULL DEFAULT 'watch', threshold_level TEXT NOT NULL, total_score FLOAT NOT NULL DEFAULT 0, evidence_bundle_id TEXT NOT NULL, dedupe_key TEXT NOT NULL, source_batch_id TEXT NOT NULL, metadata_json TEXT, created_at TEXT, updated_at TEXT ) """ ) ) conn.execute( text( "CREATE UNIQUE INDEX ux_market_alert_review_queue_dedupe " "ON market_alert_review_queue (dedupe_key)" ) ) preflight = build_candidate_queue_writer_preflight( transaction_preview=transaction, execute_requested=True, engine=engine, database_type="sqlite", ) assert preflight["mode"] == "candidate_queue_writer_preflight_read_only" assert preflight["execute_requested"] is True assert preflight["read_only_query_executed"] is True assert preflight["database_connection_opened"] is True assert preflight["database_session_created"] is False assert preflight["explicit_transaction_opened"] is False assert preflight["database_write_executed"] is False assert preflight["database_commit_executed"] is False assert preflight["scheduler_attached"] is False assert preflight["table_exists"] is True assert preflight["schema_ready"] is True assert preflight["ready_for_writer_review"] is True assert preflight["ready_for_real_write"] is False assert preflight["missing_insert_columns"] == [] assert preflight["dedupe_unique_index_present"] is True assert preflight["unmapped_payload_keys"] == [] assert preflight["blocked_reasons"] == [] def test_candidate_queue_writer_cli_sqlite_transaction_is_idempotent(): from services.market_intel.candidate_queue_writer_cli import ( build_candidate_queue_writer_cli_plan, ) from services.market_intel.candidate_queue_writer_preflight import ( build_candidate_queue_writer_preflight, ) sample_result = { "batch_id": "sample-batch-19", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "1" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) engine = create_engine("sqlite:///:memory:") with engine.begin() as conn: conn.execute( text( """ CREATE TABLE market_alert_review_queue ( id INTEGER PRIMARY KEY AUTOINCREMENT, alert_candidate_id TEXT NOT NULL UNIQUE, review_state TEXT NOT NULL DEFAULT 'draft', priority_lane TEXT NOT NULL DEFAULT 'watch', threshold_level TEXT NOT NULL, total_score FLOAT NOT NULL DEFAULT 0, evidence_bundle_id TEXT NOT NULL, dedupe_key TEXT NOT NULL, source_batch_id TEXT NOT NULL, metadata_json TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ) """ ) ) conn.execute( text( "CREATE UNIQUE INDEX ux_market_alert_review_queue_dedupe " "ON market_alert_review_queue (dedupe_key)" ) ) preflight = build_candidate_queue_writer_preflight( transaction_preview=transaction, execute_requested=True, engine=engine, database_type="sqlite", ) first_run = build_candidate_queue_writer_cli_plan( transaction_preview=transaction, writer_preflight=preflight, execute_requested=True, apply_real_write=True, approval_token=TEST_APPROVAL_TOKEN, approval_token_secret=TEST_APPROVAL_TOKEN, backup_verified=True, migration_live_smoke_passed=True, engine=engine, database_type="sqlite", ) second_run = build_candidate_queue_writer_cli_plan( transaction_preview=transaction, writer_preflight=preflight, execute_requested=True, apply_real_write=True, approval_token=TEST_APPROVAL_TOKEN, approval_token_secret=TEST_APPROVAL_TOKEN, backup_verified=True, migration_live_smoke_passed=True, engine=engine, database_type="sqlite", ) with engine.connect() as conn: rows = conn.execute( text( """ SELECT alert_candidate_id, review_state, dedupe_key, metadata_json FROM market_alert_review_queue """ ) ).fetchall() assert first_run["mode"] == "candidate_queue_writer_cli_executed" assert first_run["ready_for_real_write"] is True assert first_run["writes_executed"] is True assert first_run["would_write_database"] is True assert first_run["database_connection_opened"] is True assert first_run["database_session_created"] is False assert first_run["explicit_transaction_opened"] is True assert first_run["database_write_executed"] is True assert first_run["database_commit_executed"] is True assert first_run["database_rollback_executed"] is False assert first_run["scheduler_attached"] is False assert first_run["inserted_count"] == 1 assert first_run["skipped_count"] == 0 assert first_run["blocked_reasons"] == [] assert first_run["exit_code"] == 0 assert len(rows) == 1 assert rows[0]._mapping["review_state"] == "needs_review" assert "platform_code" in rows[0]._mapping["metadata_json"] assert second_run["mode"] == "candidate_queue_writer_cli_executed" assert second_run["inserted_count"] == 0 assert second_run["skipped_count"] == 1 assert second_run["database_commit_executed"] is True def test_candidate_queue_writer_postwrite_smoke_planned_without_db(): from services.market_intel.candidate_queue_writer_postwrite_smoke import ( build_candidate_queue_writer_postwrite_smoke, ) sample_result = { "batch_id": "sample-batch-20", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "2" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) smoke = build_candidate_queue_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=False, ) assert smoke["mode"] == "candidate_queue_writer_postwrite_smoke_planned" assert smoke["execute_requested"] is False assert smoke["read_only_query_executed"] is False assert smoke["database_connection_opened"] is False assert smoke["database_session_created"] is False assert smoke["explicit_transaction_opened"] is False assert smoke["database_write_executed"] is False assert smoke["database_commit_executed"] is False assert smoke["scheduler_attached"] is False assert smoke["expected_dedupe_key_count"] == 1 assert smoke["found_count"] == 0 assert smoke["missing_count"] == 1 assert smoke["postwrite_smoke_passed"] is False assert "candidate_queue_writer_postwrite_smoke_not_loaded" in smoke["blocked_reasons"] def test_candidate_queue_writer_postwrite_smoke_sqlite_read_only_finds_rows(): from services.market_intel.candidate_queue_writer_cli import ( build_candidate_queue_writer_cli_plan, ) from services.market_intel.candidate_queue_writer_postwrite_smoke import ( build_candidate_queue_writer_postwrite_smoke, ) from services.market_intel.candidate_queue_writer_preflight import ( build_candidate_queue_writer_preflight, ) sample_result = { "batch_id": "sample-batch-21", "platform_code": "pchome", "source_key": "homepage", "source_url": "https://24h.pchome.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1800, "page_hash": "3" * 64, "title": "PChome 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "medium", "score": 74, "url": "https://24h.pchome.com.tw/activity/sample", "text": "活動頁", }, ], }, } transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) engine = create_engine("sqlite:///:memory:") with engine.begin() as conn: conn.execute( text( """ CREATE TABLE market_alert_review_queue ( id INTEGER PRIMARY KEY AUTOINCREMENT, alert_candidate_id TEXT NOT NULL UNIQUE, review_state TEXT NOT NULL DEFAULT 'draft', priority_lane TEXT NOT NULL DEFAULT 'watch', threshold_level TEXT NOT NULL, total_score FLOAT NOT NULL DEFAULT 0, evidence_bundle_id TEXT NOT NULL, dedupe_key TEXT NOT NULL, source_batch_id TEXT NOT NULL, metadata_json TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP, updated_at TEXT DEFAULT CURRENT_TIMESTAMP ) """ ) ) conn.execute( text( "CREATE UNIQUE INDEX ux_market_alert_review_queue_dedupe " "ON market_alert_review_queue (dedupe_key)" ) ) preflight = build_candidate_queue_writer_preflight( transaction_preview=transaction, execute_requested=True, engine=engine, database_type="sqlite", ) writer = build_candidate_queue_writer_cli_plan( transaction_preview=transaction, writer_preflight=preflight, execute_requested=True, apply_real_write=True, approval_token=TEST_APPROVAL_TOKEN, approval_token_secret=TEST_APPROVAL_TOKEN, backup_verified=True, migration_live_smoke_passed=True, engine=engine, database_type="sqlite", ) smoke = build_candidate_queue_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=True, engine=engine, database_type="sqlite", ) assert writer["inserted_count"] == 1 assert smoke["mode"] == "candidate_queue_writer_postwrite_smoke_read_only" assert smoke["execute_requested"] is True assert smoke["read_only_query_executed"] is True assert smoke["database_connection_opened"] is True assert smoke["database_session_created"] is False assert smoke["explicit_transaction_opened"] is False assert smoke["database_write_executed"] is False assert smoke["database_commit_executed"] is False assert smoke["scheduler_attached"] is False assert smoke["expected_dedupe_key_count"] == 1 assert smoke["found_count"] == 1 assert smoke["missing_count"] == 0 assert smoke["missing_dedupe_keys"] == [] assert smoke["postwrite_smoke_passed"] is True assert smoke["ready_for_operator_review"] is True assert smoke["blocked_reasons"] == [] assert smoke["row_summaries"][0]["review_state"] == "needs_review" def test_candidate_queue_writer_operator_drill_preview_is_safe(): from services.market_intel.candidate_queue_writer_cli import ( build_candidate_queue_writer_cli_plan, ) from services.market_intel.candidate_queue_writer_operator_drill import ( build_candidate_queue_writer_operator_drill, ) from services.market_intel.candidate_queue_writer_postwrite_smoke import ( build_candidate_queue_writer_postwrite_smoke, ) from services.market_intel.candidate_queue_writer_preflight import ( build_candidate_queue_writer_preflight, ) sample_result = { "batch_id": "sample-batch-23", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "5" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) preflight = build_candidate_queue_writer_preflight( transaction_preview=transaction, execute_requested=False, ) writer_status = build_candidate_queue_writer_cli_plan( transaction_preview=transaction, writer_preflight=preflight, ) postwrite_smoke = build_candidate_queue_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=False, ) drill = build_candidate_queue_writer_operator_drill( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, ) assert drill["mode"] == "candidate_queue_writer_operator_drill_preview" assert drill["operator_drill_ready"] is True assert drill["api_executes_cli"] is False assert drill["api_reads_approval_token"] is False assert drill["api_writes_database"] is False assert drill["database_connection_opened"] is False assert drill["database_session_created"] is False assert drill["explicit_transaction_opened"] is False assert drill["database_write_executed"] is False assert drill["database_commit_executed"] is False assert drill["scheduler_attached"] is False assert drill["writes_executed"] is False assert drill["statement_summary"]["statement_count"] == 1 assert len(drill["command_sequence"]) == 5 assert any(item["executes_database"] for item in drill["command_sequence"]) assert "backup_verified_by_operator" in drill["blocked_reasons"] assert "one_time_token_supplied_in_shell_only" in drill["blocked_reasons"] assert "do_not_execute_cli_from_api" in drill["safe_boundaries"] def test_candidate_queue_writer_run_package_preview_is_safe(): from services.market_intel.candidate_queue_writer_cli import ( build_candidate_queue_writer_cli_plan, ) from services.market_intel.candidate_queue_writer_operator_drill import ( build_candidate_queue_writer_operator_drill, ) from services.market_intel.candidate_queue_writer_postwrite_smoke import ( build_candidate_queue_writer_postwrite_smoke, ) from services.market_intel.candidate_queue_writer_preflight import ( build_candidate_queue_writer_preflight, ) from services.market_intel.candidate_queue_writer_run_package import ( build_candidate_queue_writer_run_package, ) sample_result = { "batch_id": "sample-batch-25", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "7" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) preflight = build_candidate_queue_writer_preflight( transaction_preview=transaction, execute_requested=False, ) writer_status = build_candidate_queue_writer_cli_plan( transaction_preview=transaction, writer_preflight=preflight, ) postwrite_smoke = build_candidate_queue_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=False, ) operator_drill = build_candidate_queue_writer_operator_drill( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, ) run_package = build_candidate_queue_writer_run_package( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, operator_drill=operator_drill, ) assert run_package["mode"] == "candidate_queue_writer_run_package_preview" assert run_package["package_ready"] is True assert run_package["package_artifact_created"] is False assert run_package["api_writes_file"] is False assert run_package["api_executes_cli"] is False assert run_package["api_reads_approval_token"] is False assert run_package["api_writes_database"] is False assert run_package["database_connection_opened"] is False assert run_package["database_session_created"] is False assert run_package["explicit_transaction_opened"] is False assert run_package["database_write_executed"] is False assert run_package["database_commit_executed"] is False assert run_package["scheduler_attached"] is False assert run_package["writes_executed"] is False assert run_package["would_write_database"] is False assert run_package["payload_manifest"]["payload_count"] == 1 assert len(run_package["payload_manifest"]["manifest_hash"]) == 64 assert len(run_package["required_artifacts"]) == 5 assert all( item["created_by_api"] is False for item in run_package["required_artifacts"] ) assert len(run_package["command_bundle"]) == 5 assert any(item["executes_database"] for item in run_package["command_bundle"]) assert "real_sample_payload_saved_by_operator" in run_package["blocked_reasons"] assert "one_time_token_supplied_in_shell_only" in run_package["blocked_reasons"] assert "do_not_create_run_artifacts_from_api" in run_package["safe_boundaries"] def test_candidate_queue_writer_run_readiness_preview_checks_operator_evidence(): from services.market_intel.candidate_queue_writer_cli import ( build_candidate_queue_writer_cli_plan, ) from services.market_intel.candidate_queue_writer_operator_drill import ( build_candidate_queue_writer_operator_drill, ) from services.market_intel.candidate_queue_writer_postwrite_smoke import ( build_candidate_queue_writer_postwrite_smoke, ) from services.market_intel.candidate_queue_writer_preflight import ( build_candidate_queue_writer_preflight, ) from services.market_intel.candidate_queue_writer_run_package import ( build_candidate_queue_writer_run_package, ) from services.market_intel.candidate_queue_writer_run_readiness import ( build_candidate_queue_writer_run_readiness, ) sample_result = { "batch_id": "sample-batch-27", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "9" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) preflight = build_candidate_queue_writer_preflight( transaction_preview=transaction, execute_requested=False, ) writer_status = build_candidate_queue_writer_cli_plan( transaction_preview=transaction, writer_preflight=preflight, ) postwrite_smoke = build_candidate_queue_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=False, ) operator_drill = build_candidate_queue_writer_operator_drill( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, ) run_package = build_candidate_queue_writer_run_package( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, operator_drill=operator_drill, ) missing = build_candidate_queue_writer_run_readiness( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, operator_drill=operator_drill, run_package=run_package, ) ready = build_candidate_queue_writer_run_readiness( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, operator_drill=operator_drill, run_package=run_package, operator_evidence={ "reviewed_sample_json_path": "artifacts/market_intel/reviewed.json", "backup_artifact_path": "scripts/tools/backups/backup.zip", "preflight_artifact_path": "artifacts/market_intel/preflight.json", "migration_live_smoke_passed": True, "operator_acknowledged_shell_only_token": True, }, ) token_leak = build_candidate_queue_writer_run_readiness( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, operator_drill=operator_drill, run_package=run_package, operator_evidence={ "reviewed_sample_json_path": "artifacts/market_intel/reviewed.json", "backup_artifact_path": "scripts/tools/backups/backup.zip", "preflight_artifact_path": "artifacts/market_intel/preflight.json", "migration_live_smoke_passed": True, "operator_acknowledged_shell_only_token": True, "approval_token": TEST_APPROVAL_TOKEN, }, ) assert missing["mode"] == "candidate_queue_writer_run_readiness_preview" assert missing["ready_for_cli_operator_run"] is False assert missing["ready_for_api_database_write"] is False assert missing["api_executes_cli"] is False assert missing["api_reads_approval_token"] is False assert missing["api_writes_file"] is False assert missing["database_connection_opened"] is False assert missing["database_write_executed"] is False assert missing["database_commit_executed"] is False assert missing["scheduler_attached"] is False assert "reviewed_sample_json_path_recorded" in missing["blocked_reasons"] assert "backup_artifact_path_recorded" in missing["blocked_reasons"] assert "operator_acknowledged_shell_only_token" in missing["blocked_reasons"] assert ready["ready_for_cli_operator_run"] is True assert ready["ready_for_api_database_write"] is False assert ready["database_write_executed"] is False assert ready["operator_evidence_summary"]["artifact_path_count"] == 3 assert token_leak["ready_for_cli_operator_run"] is False assert token_leak["operator_evidence_summary"]["approval_token_submitted_to_api"] is True assert "approval_token_not_submitted_to_api" in token_leak["blocked_reasons"] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) assert "do_not_read_approval_token_from_api" in ready["safe_boundaries"] def test_candidate_queue_writer_run_receipt_preview_checks_writer_and_smoke_artifacts(): from services.market_intel.candidate_queue_writer_run_receipt import ( build_candidate_queue_writer_run_receipt, ) fixture = _build_candidate_queue_writer_receipt_fixture() receipt = build_candidate_queue_writer_run_receipt( transaction_preview=fixture["transaction"], run_readiness=fixture["run_readiness"], writer_output=fixture["writer_output"], postwrite_smoke_result=fixture["postwrite_smoke_result"], operator_evidence=fixture["operator_evidence"], ) token_leak = build_candidate_queue_writer_run_receipt( transaction_preview=fixture["transaction"], run_readiness=fixture["run_readiness"], writer_output={ **fixture["writer_output"], "approval_token": TEST_APPROVAL_TOKEN, }, postwrite_smoke_result=fixture["postwrite_smoke_result"], operator_evidence={ **fixture["operator_evidence"], "market_intel_queue_write_approval": TEST_APPROVAL_TOKEN, }, ) malformed_receipt = build_candidate_queue_writer_run_receipt( transaction_preview=fixture["transaction"], run_readiness=fixture["run_readiness"], writer_output={ "inserted_count": "not-a-number", "affected_dedupe_keys": fixture["expected_keys"][0], }, postwrite_smoke_result={ "found_count": "not-a-number", "found_dedupe_keys": fixture["expected_keys"][0], }, operator_evidence=fixture["operator_evidence"], ) assert receipt["mode"] == "candidate_queue_writer_run_receipt_preview" assert receipt["receipt_passed"] is True assert receipt["ready_for_next_manual_review"] is True assert receipt["ready_for_api_database_write"] is False assert receipt["ready_for_scheduler_attach"] is False assert receipt["api_executes_cli"] is False assert receipt["api_reads_approval_token"] is False assert receipt["api_writes_file"] is False assert receipt["api_writes_database"] is False assert receipt["database_connection_opened"] is False assert receipt["database_write_executed"] is False assert receipt["database_commit_executed"] is False assert receipt["scheduler_attached"] is False assert receipt["expected_dedupe_keys"] == fixture["expected_keys"] assert receipt["writer_output_summary"]["database_commit_executed"] is True assert receipt["writer_output_summary"]["dedupe_keys_match_expected"] is True assert receipt["postwrite_smoke_summary"]["read_only_query_executed"] is True assert receipt["postwrite_smoke_summary"]["dedupe_keys_match_expected"] is True assert receipt["operator_evidence_summary"][ "writer_output_json_path_recorded" ] is True assert receipt["operator_evidence_summary"][ "postwrite_smoke_json_path_recorded" ] is True assert receipt["operator_evidence_summary"][ "operator_confirmed_no_token_in_artifacts" ] is True assert receipt["blocked_reasons"] == [] assert "do_not_execute_cli_from_receipt_preview" in receipt["safe_boundaries"] assert "do_not_read_approval_token_from_api" in receipt["safe_boundaries"] assert token_leak["receipt_passed"] is False assert token_leak["writer_output_summary"]["approval_token_key_detected"] is True assert token_leak["operator_evidence_summary"][ "approval_token_submitted_to_api" ] is True assert "writer_output_no_approval_token_key" in token_leak["blocked_reasons"] assert "operator_confirmed_no_token_in_artifacts" in token_leak["blocked_reasons"] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) assert malformed_receipt["receipt_passed"] is False assert malformed_receipt["writer_output_summary"]["inserted_count"] == 0 assert malformed_receipt["postwrite_smoke_summary"]["found_count"] == 0 assert "writer_output_executed_and_committed" in malformed_receipt[ "blocked_reasons" ] def test_candidate_queue_writer_run_closeout_preview_promotes_only_manual_phase(): from services.market_intel.candidate_queue_writer_run_closeout import ( build_candidate_queue_writer_run_closeout, ) from services.market_intel.candidate_queue_writer_run_receipt import ( build_candidate_queue_writer_run_receipt, ) fixture = _build_candidate_queue_writer_receipt_fixture() closeout_evidence = { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "closeout_notes": "ready for read-only inventory", } receipt = build_candidate_queue_writer_run_receipt( transaction_preview=fixture["transaction"], run_readiness=fixture["run_readiness"], writer_output=fixture["writer_output"], postwrite_smoke_result=fixture["postwrite_smoke_result"], operator_evidence=fixture["operator_evidence"], ) closeout = build_candidate_queue_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=receipt, operator_evidence=closeout_evidence, ) missing = build_candidate_queue_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=receipt, operator_evidence=fixture["operator_evidence"], ) token_leak = build_candidate_queue_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=receipt, operator_evidence={ **closeout_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, ) assert closeout["mode"] == "candidate_queue_writer_run_closeout_preview" assert closeout["closeout_passed"] is True assert closeout["ready_for_next_manual_phase"] is True assert closeout["ready_for_api_database_write"] is False assert closeout["ready_for_scheduler_attach"] is False assert closeout["api_executes_cli"] is False assert closeout["api_reads_approval_token"] is False assert closeout["api_writes_file"] is False assert closeout["api_writes_database"] is False assert closeout["database_connection_opened"] is False assert closeout["database_write_executed"] is False assert closeout["database_commit_executed"] is False assert closeout["scheduler_attached"] is False assert closeout["receipt_summary"]["receipt_passed"] is True assert closeout["receipt_summary"]["safe_boundaries_complete"] is True assert closeout["operator_closeout_summary"][ "closeout_artifact_path_recorded" ] is True assert closeout["promotion_gate"]["allowed"] is True assert closeout["promotion_gate"]["requires_real_db_write"] is False assert closeout["blocked_reasons"] == [] assert "do_not_write_queue_from_closeout_preview" in closeout["safe_boundaries"] assert missing["closeout_passed"] is False assert "closeout_artifact_path_recorded" in missing["blocked_reasons"] assert "operator_confirmed_queue_review_next" in missing["blocked_reasons"] assert token_leak["closeout_passed"] is False assert token_leak["operator_closeout_summary"][ "approval_token_submitted_to_api" ] is True assert "closeout_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_handoff_preview_is_manual_only(): from services.market_intel.candidate_queue_review_handoff import ( build_candidate_queue_review_handoff, ) from services.market_intel.candidate_queue_writer_run_closeout import ( build_candidate_queue_writer_run_closeout, ) from services.market_intel.candidate_queue_writer_run_receipt import ( build_candidate_queue_writer_run_receipt, ) fixture = _build_candidate_queue_writer_receipt_fixture() operator_evidence = { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, } receipt = build_candidate_queue_writer_run_receipt( transaction_preview=fixture["transaction"], run_readiness=fixture["run_readiness"], writer_output=fixture["writer_output"], postwrite_smoke_result=fixture["postwrite_smoke_result"], operator_evidence=fixture["operator_evidence"], ) closeout = build_candidate_queue_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=receipt, operator_evidence=operator_evidence, ) handoff = build_candidate_queue_review_handoff( transaction_preview=fixture["transaction"], run_closeout=closeout, operator_evidence=operator_evidence, ) token_leak = build_candidate_queue_review_handoff( transaction_preview=fixture["transaction"], run_closeout=closeout, operator_evidence={**operator_evidence, "approval_token": TEST_APPROVAL_TOKEN}, ) assert handoff["mode"] == "candidate_queue_review_handoff_preview" assert handoff["handoff_ready"] is True assert handoff["ready_for_manual_queue_review"] is True assert handoff["ready_for_live_inventory_read_only"] is True assert handoff["ready_for_api_database_write"] is False assert handoff["ready_for_scheduler_attach"] is False assert handoff["api_executes_cli"] is False assert handoff["api_reads_approval_token"] is False assert handoff["api_writes_database"] is False assert handoff["api_updates_review_state"] is False assert handoff["read_only_query_executed"] is False assert handoff["database_connection_opened"] is False assert handoff["database_write_executed"] is False assert handoff["database_commit_executed"] is False assert handoff["scheduler_attached"] is False assert handoff["expected_dedupe_keys"] == fixture["expected_keys"] assert handoff["review_contract"]["expected_review_state"] == "needs_review" assert "update_review_state" in handoff["review_contract"]["forbidden_api_actions"] assert "do_not_update_review_state_from_api" in handoff["safe_boundaries"] assert handoff["blocked_reasons"] == [] assert token_leak["handoff_ready"] is False assert token_leak["operator_handoff_summary"][ "approval_token_submitted_to_api" ] is True assert "handoff_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_inventory_preview_is_read_only(): from services.market_intel.candidate_queue_review_handoff import ( build_candidate_queue_review_handoff, ) from services.market_intel.candidate_queue_review_inventory import ( build_candidate_queue_review_inventory, ) from services.market_intel.candidate_queue_writer_run_closeout import ( build_candidate_queue_writer_run_closeout, ) from services.market_intel.candidate_queue_writer_run_receipt import ( build_candidate_queue_writer_run_receipt, ) fixture = _build_candidate_queue_writer_receipt_fixture() operator_evidence = { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, } receipt = build_candidate_queue_writer_run_receipt( transaction_preview=fixture["transaction"], run_readiness=fixture["run_readiness"], writer_output=fixture["writer_output"], postwrite_smoke_result=fixture["postwrite_smoke_result"], operator_evidence=fixture["operator_evidence"], ) closeout = build_candidate_queue_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=receipt, operator_evidence=operator_evidence, ) handoff = build_candidate_queue_review_handoff( transaction_preview=fixture["transaction"], run_closeout=closeout, operator_evidence=operator_evidence, ) postwrite_smoke = { **fixture["postwrite_smoke_result"], "database_commit_executed": False, "row_summaries": [ { "dedupe_key": fixture["expected_keys"][0], "review_state": "needs_review", "priority_lane": "review", "total_score": 94, "source_batch_id": fixture["sample_result"]["batch_id"], } ], } live_db_inventory = { "mode": "live_db_inventory_read_only", "summary_ready": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "migration_executed": False, "external_network_executed": False, "scheduler_attached": False, "table_statuses": [ { "table": "market_alert_review_queue", "exists": True, "row_count": 1, "status": "loaded", } ], "total_rows": 1, "alert_review_state_breakdown": [ { "review_state": "needs_review", "priority_lane": "review", "alert_count": 1, } ], } inventory = build_candidate_queue_review_inventory( review_handoff=handoff, postwrite_smoke=postwrite_smoke, live_db_inventory=live_db_inventory, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_inventory( review_handoff=handoff, postwrite_smoke=postwrite_smoke, live_db_inventory=live_db_inventory, operator_evidence={**operator_evidence, "approval_token": TEST_APPROVAL_TOKEN}, execute_requested=True, ) assert inventory["mode"] == "candidate_queue_review_inventory_preview" assert inventory["review_inventory_ready"] is True assert inventory["ready_for_human_decision_review"] is True assert inventory["ready_for_api_review_state_update"] is False assert inventory["ready_for_api_database_write"] is False assert inventory["ready_for_scheduler_attach"] is False assert inventory["api_executes_cli"] is False assert inventory["api_reads_approval_token"] is False assert inventory["api_writes_database"] is False assert inventory["api_updates_review_state"] is False assert inventory["read_only_query_executed"] is True assert inventory["database_connection_opened"] is True assert inventory["database_write_executed"] is False assert inventory["database_commit_executed"] is False assert inventory["scheduler_attached"] is False assert inventory["expected_dedupe_keys"] == fixture["expected_keys"] assert inventory["found_dedupe_keys"] == fixture["expected_keys"] assert inventory["missing_dedupe_keys"] == [] assert inventory["row_summaries"][0]["review_state"] == "needs_review" assert inventory["alert_review_queue_table"]["exists"] is True assert inventory["blocked_reasons"] == [] assert "do_not_update_review_state_from_api" in inventory["safe_boundaries"] assert token_leak["review_inventory_ready"] is False assert token_leak["operator_inventory_summary"][ "approval_token_submitted_to_api" ] is True assert "review_inventory_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_inventory_preview_is_read_only_manual_gate(): from services.market_intel.candidate_queue_review_handoff import ( build_candidate_queue_review_handoff, ) from services.market_intel.candidate_queue_review_inventory import ( build_candidate_queue_review_inventory, ) from services.market_intel.candidate_queue_writer_run_closeout import ( build_candidate_queue_writer_run_closeout, ) from services.market_intel.candidate_queue_writer_run_receipt import ( build_candidate_queue_writer_run_receipt, ) fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-inventory" ) operator_evidence = { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, } receipt = build_candidate_queue_writer_run_receipt( transaction_preview=fixture["transaction"], run_readiness=fixture["run_readiness"], writer_output=fixture["writer_output"], postwrite_smoke_result=fixture["postwrite_smoke_result"], operator_evidence=fixture["operator_evidence"], ) closeout = build_candidate_queue_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=receipt, operator_evidence=operator_evidence, ) handoff = build_candidate_queue_review_handoff( transaction_preview=fixture["transaction"], run_closeout=closeout, operator_evidence=operator_evidence, ) live_inventory = { "mode": "live_db_inventory_read_only", "summary_ready": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "migration_executed": False, "external_network_executed": False, "scheduler_attached": False, "total_rows": len(fixture["expected_keys"]), "table_statuses": [ { "table": "market_alert_review_queue", "exists": True, "row_count": len(fixture["expected_keys"]), "status": "loaded", } ], "alert_review_state_breakdown": [ { "review_state": "needs_review", "priority_lane": "watch", "alert_count": len(fixture["expected_keys"]), } ], } inventory = build_candidate_queue_review_inventory( review_handoff=handoff, postwrite_smoke=fixture["postwrite_smoke_result"], live_db_inventory=live_inventory, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_inventory( review_handoff=handoff, postwrite_smoke=fixture["postwrite_smoke_result"], live_db_inventory=live_inventory, operator_evidence={**operator_evidence, "approval_token": TEST_APPROVAL_TOKEN}, execute_requested=True, ) assert inventory["mode"] == "candidate_queue_review_inventory_preview" assert inventory["review_inventory_ready"] is True assert inventory["ready_for_human_decision_review"] is True assert inventory["ready_for_api_review_state_update"] is False assert inventory["ready_for_api_database_write"] is False assert inventory["ready_for_scheduler_attach"] is False assert inventory["api_executes_cli"] is False assert inventory["api_reads_approval_token"] is False assert inventory["api_writes_database"] is False assert inventory["api_updates_review_state"] is False assert inventory["read_only_query_executed"] is True assert inventory["database_write_executed"] is False assert inventory["database_commit_executed"] is False assert inventory["scheduler_attached"] is False assert inventory["expected_dedupe_keys"] == fixture["expected_keys"] assert inventory["found_dedupe_keys"] == fixture["expected_keys"] assert inventory["missing_dedupe_keys"] == [] assert inventory["row_summaries"][0]["review_state"] == "needs_review" assert inventory["alert_review_queue_table"]["exists"] is True assert "do_not_update_review_state_from_api" in inventory["safe_boundaries"] assert inventory["blocked_reasons"] == [] assert token_leak["review_inventory_ready"] is False assert "review_inventory_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_decision_preview_is_manual_only(): from services.market_intel.candidate_queue_review_decision import ( build_candidate_queue_review_decision, ) fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision" ) inventory = { "mode": "candidate_queue_review_inventory_preview", "review_inventory_ready": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "scheduler_attached": False, "expected_dedupe_keys": fixture["expected_keys"], "row_summaries": [ { "dedupe_key": fixture["expected_keys"][0], "review_state": "needs_review", "priority_lane": "watch", "total_score": 82.5, } ], } operator_evidence = { "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "evidence reviewed manually", "operator_confirmed_manual_decision_only": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_scheduler_attach": True, } decision = build_candidate_queue_review_decision( review_inventory=inventory, operator_evidence=operator_evidence, ) token_leak = build_candidate_queue_review_decision( review_inventory=inventory, operator_evidence={**operator_evidence, "approval_token": TEST_APPROVAL_TOKEN}, ) assert decision["mode"] == "candidate_queue_review_decision_preview" assert decision["decision_ready"] is True assert decision["ready_for_human_decision_record"] is True assert decision["ready_for_api_review_state_update"] is False assert decision["ready_for_api_database_write"] is False assert decision["ready_for_scheduler_attach"] is False assert decision["api_executes_cli"] is False assert decision["api_reads_approval_token"] is False assert decision["api_writes_database"] is False assert decision["api_updates_review_state"] is False assert decision["decision_record_written"] is False assert decision["review_state_update_executed"] is False assert decision["database_write_executed"] is False assert decision["database_commit_executed"] is False assert decision["scheduler_attached"] is False assert decision["decision_rows"][0]["current_review_state"] == "needs_review" assert decision["decision_rows"][0]["proposed_review_state"] == "confirmed" assert decision["decision_contract"]["allowed_next_states"] == [ "confirmed", "rejected", "deferred", ] assert "update_review_state" in decision["decision_contract"]["forbidden_api_actions"] assert "do_not_write_decision_record_from_api" in decision["safe_boundaries"] assert decision["blocked_reasons"] == [] assert token_leak["decision_ready"] is False assert token_leak["operator_decision_summary"][ "approval_token_submitted_to_api" ] is True assert "decision_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_decision_approval_preview_is_cli_only(): from services.market_intel.candidate_queue_review_decision import ( build_candidate_queue_review_decision, ) from services.market_intel.candidate_queue_review_decision_approval import ( build_candidate_queue_review_decision_approval, ) fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-approval" ) inventory = { "mode": "candidate_queue_review_inventory_preview", "review_inventory_ready": True, "expected_dedupe_keys": fixture["expected_keys"], "row_summaries": [ { "dedupe_key": fixture["expected_keys"][0], "review_state": "needs_review", "priority_lane": "watch", "total_score": 82.5, } ], } decision_operator_evidence = { "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "evidence reviewed manually", "operator_confirmed_manual_decision_only": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_scheduler_attach": True, } approval_operator_evidence = { **decision_operator_evidence, "decision_approval_notes": "approved for cli-only transaction preview", "operator_confirmed_decision_payload_reviewed": True, "operator_confirmed_decision_apply_requires_cli": True, "operator_confirmed_review_state_update_is_not_api": True, } decision = build_candidate_queue_review_decision( review_inventory=inventory, operator_evidence=decision_operator_evidence, ) approval = build_candidate_queue_review_decision_approval( review_decision=decision, operator_evidence=approval_operator_evidence, ) token_leak = build_candidate_queue_review_decision_approval( review_decision=decision, operator_evidence={ **approval_operator_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, ) assert approval["mode"] == "candidate_queue_review_decision_approval_preview" assert approval["approval_ready"] is True assert approval["ready_for_review_state_transaction_preview"] is True assert approval["ready_for_cli_decision_writer"] is True assert approval["ready_for_api_review_state_update"] is False assert approval["ready_for_api_database_write"] is False assert approval["review_state_update_allowed_from_api"] is False assert approval["decision_apply_allowed_from_api"] is False assert approval["api_executes_cli"] is False assert approval["api_reads_approval_token"] is False assert approval["api_writes_database"] is False assert approval["api_updates_review_state"] is False assert approval["approval_record_written"] is False assert approval["decision_record_written"] is False assert approval["review_state_update_executed"] is False assert approval["database_write_executed"] is False assert approval["database_commit_executed"] is False assert approval["scheduler_attached"] is False assert approval["decision_update_preview"][0][ "expected_current_review_state" ] == "needs_review" assert approval["decision_update_preview"][0][ "approved_next_review_state" ] == "confirmed" assert approval["approval_contract"]["next_stage"] == ( "candidate_queue_review_decision_transaction_preview" ) assert "update_review_state" in approval["approval_contract"][ "forbidden_api_actions" ] assert "do_not_update_review_state_from_approval_api" in approval[ "safe_boundaries" ] assert approval["blocked_reasons"] == [] assert token_leak["approval_ready"] is False assert token_leak["operator_approval_summary"][ "approval_token_submitted_to_api" ] is True assert "approval_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_decision_transaction_preview_is_shell_only(): from services.market_intel.candidate_queue_review_decision import ( build_candidate_queue_review_decision, ) from services.market_intel.candidate_queue_review_decision_approval import ( build_candidate_queue_review_decision_approval, ) from services.market_intel.candidate_queue_review_decision_transaction import ( build_candidate_queue_review_decision_transaction, ) fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-transaction" ) inventory = { "mode": "candidate_queue_review_inventory_preview", "review_inventory_ready": True, "expected_dedupe_keys": fixture["expected_keys"], "row_summaries": [ { "dedupe_key": fixture["expected_keys"][0], "review_state": "needs_review", "priority_lane": "watch", "total_score": 82.5, } ], } decision_operator_evidence = { "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "evidence reviewed manually", "operator_confirmed_manual_decision_only": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_scheduler_attach": True, } approval_operator_evidence = { **decision_operator_evidence, "decision_approval_notes": "approved for cli-only transaction preview", "operator_confirmed_decision_payload_reviewed": True, "operator_confirmed_decision_apply_requires_cli": True, "operator_confirmed_review_state_update_is_not_api": True, } transaction_operator_evidence = { **approval_operator_evidence, "decision_transaction_notes": "payload reviewed for shell transaction", "operator_confirmed_transaction_payload_reviewed": True, "operator_confirmed_cli_only_transaction": True, } decision = build_candidate_queue_review_decision( review_inventory=inventory, operator_evidence=decision_operator_evidence, ) approval = build_candidate_queue_review_decision_approval( review_decision=decision, operator_evidence=approval_operator_evidence, ) transaction = build_candidate_queue_review_decision_transaction( decision_approval=approval, operator_evidence=transaction_operator_evidence, ) token_leak = build_candidate_queue_review_decision_transaction( decision_approval=approval, operator_evidence={ **transaction_operator_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, ) assert transaction["mode"] == "candidate_queue_review_decision_transaction_preview" assert transaction["transaction_preview_created"] is True assert transaction["transaction_ready"] is True assert transaction["ready_for_manual_shell_update_window"] is True assert transaction["ready_for_cli_decision_writer"] is True assert transaction["ready_for_api_review_state_update"] is False assert transaction["ready_for_api_database_write"] is False assert transaction["ready_for_scheduler_attach"] is False assert transaction["api_executes_cli"] is False assert transaction["api_reads_approval_token"] is False assert transaction["api_writes_database"] is False assert transaction["api_updates_review_state"] is False assert transaction["approval_record_written"] is False assert transaction["decision_record_written"] is False assert transaction["review_state_update_executed"] is False assert transaction["database_connection_opened"] is False assert transaction["database_session_created"] is False assert transaction["explicit_transaction_opened"] is False assert transaction["transaction_opened"] is False assert transaction["transaction_committed"] is False assert transaction["database_write_executed"] is False assert transaction["database_commit_executed"] is False assert transaction["database_rollback_executed"] is False assert transaction["scheduler_attached"] is False assert transaction["statements"][0]["table"] == "market_alert_review_queue" assert transaction["statements"][0]["operation"] == "update" assert transaction["statements"][0]["statement_type"] == "update_review_state" assert transaction["statements"][0]["expected_current_review_state"] == ( "needs_review" ) assert transaction["statements"][0]["next_review_state"] == "confirmed" assert transaction["statements"][0]["parameter_keys"] == [ "dedupe_key", "expected_current_review_state", "next_review_state", ] assert "UPDATE market_alert_review_queue" in transaction["statements"][0][ "sql_template" ] assert transaction["transaction_preview_summary"]["api_write_allowed"] is False assert transaction["transaction_preview_summary"]["manual_cli_required"] is True assert transaction["transaction_contract"]["next_stage"] == ( "manual_shell_review_state_update_window" ) assert "update_review_state" in transaction["transaction_contract"][ "forbidden_api_actions" ] assert "do_not_update_review_state_from_transaction_api" in transaction[ "safe_boundaries" ] assert transaction["blocked_reasons"] == [] assert token_leak["transaction_ready"] is False assert token_leak["operator_transaction_summary"][ "approval_token_submitted_to_api" ] is True assert "transaction_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_decision_writer_cli_gate_is_non_writing(): from services.market_intel.candidate_queue_review_decision_writer_cli import ( APPROVAL_ENV_VAR, build_candidate_queue_review_decision_writer_cli_plan, ) transaction, _ = _build_ready_review_decision_transaction() plan = build_candidate_queue_review_decision_writer_cli_plan( transaction_preview=transaction, execute_requested=True, apply_real_write=True, approval_token=TEST_APPROVAL_TOKEN, approval_token_secret=TEST_APPROVAL_TOKEN, backup_verified=True, review_inventory_smoke_passed=True, ) payload = json.dumps(plan, ensure_ascii=False, sort_keys=True) assert plan["mode"] == "candidate_queue_review_decision_writer_cli_blocked" assert plan["target_table"] == "market_alert_review_queue" assert plan["target_operation"] == "update_review_state" assert plan["script_path"] == "scripts/market_intel_review_decision_writer.py" assert plan["approval_env_var"] == APPROVAL_ENV_VAR assert plan["execute_requested"] is True assert plan["apply_real_write_requested"] is True assert plan["approval_token_present"] is True assert plan["approval_token_valid"] is True assert plan["writer_implementation_enabled"] is False assert plan["ready_for_real_write"] is False assert plan["ready_for_api_review_state_update"] is False assert plan["ready_for_api_database_write"] is False assert plan["api_executes_cli"] is False assert plan["api_reads_approval_token"] is False assert plan["api_writes_database"] is False assert plan["api_updates_review_state"] is False assert plan["review_state_update_executed"] is False assert plan["database_connection_opened"] is False assert plan["database_session_created"] is False assert plan["explicit_transaction_opened"] is False assert plan["transaction_opened"] is False assert plan["transaction_committed"] is False assert plan["database_write_executed"] is False assert plan["database_commit_executed"] is False assert plan["scheduler_attached"] is False assert plan["writes_executed"] is False assert plan["would_write_database"] is False assert plan["statement_summary"]["statement_count"] == 1 assert plan["statement_summary"]["review_state_updates"][0][ "next_review_state" ] == "confirmed" assert "review_decision_writer_implementation_enabled" in plan[ "blocked_reasons" ] assert "do_not_update_review_state_from_api_writer_status" in plan[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_decision_writer_preflight_is_payload_only(): from services.market_intel.candidate_queue_review_decision_writer_cli import ( build_candidate_queue_review_decision_writer_cli_plan, ) from services.market_intel.candidate_queue_review_decision_writer_preflight import ( build_candidate_queue_review_decision_writer_preflight, ) transaction, operator_evidence = _build_ready_review_decision_transaction() writer_status = build_candidate_queue_review_decision_writer_cli_plan( transaction_preview=transaction, execute_requested=False, apply_real_write=False, ) preflight = build_candidate_queue_review_decision_writer_preflight( writer_status=writer_status, transaction_preview=transaction, operator_evidence={ **operator_evidence, "operator_confirmed_review_state_preflight_only": True, }, ) token_leak = build_candidate_queue_review_decision_writer_preflight( writer_status=writer_status, transaction_preview=transaction, operator_evidence={**operator_evidence, "approval_token": TEST_APPROVAL_TOKEN}, ) payload = json.dumps(preflight, ensure_ascii=False, sort_keys=True) assert preflight["mode"] == ( "candidate_queue_review_decision_writer_preflight_preview" ) assert preflight["target_table"] == "market_alert_review_queue" assert preflight["target_operation"] == "update_review_state" assert preflight["execute_requested"] is False assert preflight["apply_real_write_requested"] is False assert preflight["preflight_payload_ready"] is True assert preflight["writer_status_safe"] is True assert preflight["writer_implementation_enabled"] is False assert preflight["preflight_ready"] is False assert preflight["ready_for_real_write"] is False assert preflight["ready_for_api_review_state_update"] is False assert preflight["ready_for_api_database_write"] is False assert preflight["api_executes_cli"] is False assert preflight["api_reads_approval_token"] is False assert preflight["api_writes_database"] is False assert preflight["api_updates_review_state"] is False assert preflight["review_state_update_executed"] is False assert preflight["read_only_query_executed"] is False assert preflight["database_connection_opened"] is False assert preflight["database_session_created"] is False assert preflight["transaction_opened"] is False assert preflight["transaction_committed"] is False assert preflight["database_write_executed"] is False assert preflight["database_commit_executed"] is False assert preflight["scheduler_attached"] is False assert preflight["writes_executed"] is False assert preflight["would_write_database"] is False assert preflight["statement_summary"]["statement_count"] == 1 assert preflight["statement_summary"]["invalid_statement_count"] == 0 assert preflight["statement_summary"]["review_state_updates"][0][ "next_review_state" ] == "confirmed" assert preflight["update_contract"]["expected_current_review_state"] == ( "needs_review" ) assert preflight["catalog_probe_plan"]["read_only_query_executed"] is False assert "review_decision_writer_implementation_enabled" in preflight[ "blocked_reasons" ] assert "do_not_update_review_state_from_review_state_preflight" in preflight[ "safe_boundaries" ] assert "preflight_no_token_submitted_to_api" in token_leak["blocked_reasons"] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_decision_writer_postwrite_smoke_is_read_only(): from services.market_intel.candidate_queue_review_decision_writer_postwrite_smoke import ( build_candidate_queue_review_decision_writer_postwrite_smoke, ) transaction, _operator_evidence = _build_ready_review_decision_transaction() statement = transaction["statements"][0] dedupe_key = statement["lookup"]["dedupe_key"] expected_state = statement["next_review_state"] plan = build_candidate_queue_review_decision_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=False, ) engine = create_engine("sqlite:///:memory:") with engine.begin() as conn: conn.execute( text( """ CREATE TABLE market_alert_review_queue ( id INTEGER PRIMARY KEY, alert_candidate_id INTEGER, review_state TEXT, priority_lane TEXT, threshold_level TEXT, total_score REAL, evidence_bundle_id TEXT, dedupe_key TEXT UNIQUE, source_batch_id TEXT, reviewed_at TEXT, created_at TEXT, updated_at TEXT ) """ ) ) conn.execute( text( """ INSERT INTO market_alert_review_queue ( alert_candidate_id, review_state, priority_lane, threshold_level, total_score, evidence_bundle_id, dedupe_key, source_batch_id, reviewed_at, created_at, updated_at ) VALUES ( 101, :review_state, 'urgent', 'high', 91.5, 'evidence-1', :dedupe_key, 'sample-batch', '2026-05-19T12:00:00', '2026-05-19T11:00:00', '2026-05-19T12:00:00' ) """ ), {"review_state": expected_state, "dedupe_key": dedupe_key}, ) smoke = build_candidate_queue_review_decision_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=True, engine=engine, database_type="sqlite", ) payload = json.dumps(smoke, ensure_ascii=False, sort_keys=True) assert plan["mode"] == ( "candidate_queue_review_decision_writer_postwrite_smoke_planned" ) assert plan["read_only_query_executed"] is False assert plan["database_connection_opened"] is False assert plan["review_state_update_executed"] is False assert plan["api_updates_review_state"] is False assert plan["database_write_executed"] is False assert plan["database_commit_executed"] is False assert "review_decision_writer_postwrite_smoke_not_loaded" in plan[ "blocked_reasons" ] assert smoke["mode"] == ( "candidate_queue_review_decision_writer_postwrite_smoke_read_only" ) assert smoke["read_only_query_executed"] is True assert smoke["database_connection_opened"] is True assert smoke["database_session_created"] is False assert smoke["explicit_transaction_opened"] is False assert smoke["transaction_committed"] is False assert smoke["database_write_executed"] is False assert smoke["database_commit_executed"] is False assert smoke["review_state_update_executed"] is False assert smoke["api_updates_review_state"] is False assert smoke["scheduler_attached"] is False assert smoke["postwrite_smoke_passed"] is True assert smoke["review_state_update_verified"] is True assert smoke["missing_count"] == 0 assert smoke["state_mismatch_count"] == 0 assert smoke["found_dedupe_keys"] == [dedupe_key] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_decision_writer_operator_drill_preview_is_safe(): from services.market_intel.candidate_queue_review_decision_writer_cli import ( build_candidate_queue_review_decision_writer_cli_plan, ) from services.market_intel.candidate_queue_review_decision_writer_preflight import ( build_candidate_queue_review_decision_writer_preflight, ) from services.market_intel.candidate_queue_review_decision_writer_postwrite_smoke import ( build_candidate_queue_review_decision_writer_postwrite_smoke, ) from services.market_intel.candidate_queue_review_decision_writer_operator_drill import ( build_candidate_queue_review_decision_writer_operator_drill, ) transaction, operator_evidence = _build_ready_review_decision_transaction() operator_evidence = { **operator_evidence, "operator_confirmed_manual_shell_window": True, "operator_confirmed_post_update_inventory_planned": True, "operator_drill_notes": "review_state shell drill reviewed", } writer_status = build_candidate_queue_review_decision_writer_cli_plan( transaction_preview=transaction, operator_evidence=operator_evidence, ) preflight = build_candidate_queue_review_decision_writer_preflight( writer_status=writer_status, transaction_preview=transaction, operator_evidence=operator_evidence, ) smoke = build_candidate_queue_review_decision_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=False, ) drill = build_candidate_queue_review_decision_writer_operator_drill( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_evidence=operator_evidence, ) token_leak = build_candidate_queue_review_decision_writer_operator_drill( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_evidence={**operator_evidence, "approval_token": TEST_APPROVAL_TOKEN}, ) payload = json.dumps(drill, ensure_ascii=False, sort_keys=True) assert drill["mode"] == ( "candidate_queue_review_decision_writer_operator_drill_preview" ) assert drill["target_table"] == "market_alert_review_queue" assert drill["target_operation"] == "update_review_state" assert drill["operator_drill_ready"] is True assert drill["ready_for_api_review_state_update"] is False assert drill["ready_for_api_database_write"] is False assert drill["ready_for_scheduler_attach"] is False assert drill["api_executes_cli"] is False assert drill["api_reads_approval_token"] is False assert drill["api_writes_file"] is False assert drill["api_writes_database"] is False assert drill["api_updates_review_state"] is False assert drill["review_state_update_executed"] is False assert drill["database_connection_opened"] is False assert drill["database_session_created"] is False assert drill["transaction_opened"] is False assert drill["transaction_committed"] is False assert drill["database_write_executed"] is False assert drill["database_commit_executed"] is False assert drill["scheduler_attached"] is False assert drill["statement_summary"]["statement_count"] == 1 assert drill["statement_summary"]["invalid_statement_count"] == 0 assert drill["input_summaries"]["writer_preflight_mode"] == ( "candidate_queue_review_decision_writer_preflight_preview" ) assert drill["input_summaries"]["postwrite_smoke_mode"] == ( "candidate_queue_review_decision_writer_postwrite_smoke_planned" ) assert len(drill["command_sequence"]) == 5 assert any(item["key"] == "run_cli_review_state_writer" for item in drill["command_sequence"]) assert "backup_verified_by_operator" in drill["blocked_reasons"] assert "do_not_update_review_state_from_review_state_operator_drill" in drill[ "safe_boundaries" ] assert token_leak["operator_drill_ready"] is False assert "operator_drill_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_decision_writer_run_package_preview_is_safe(): from services.market_intel.candidate_queue_review_decision_writer_cli import ( build_candidate_queue_review_decision_writer_cli_plan, ) from services.market_intel.candidate_queue_review_decision_writer_preflight import ( build_candidate_queue_review_decision_writer_preflight, ) from services.market_intel.candidate_queue_review_decision_writer_postwrite_smoke import ( build_candidate_queue_review_decision_writer_postwrite_smoke, ) from services.market_intel.candidate_queue_review_decision_writer_operator_drill import ( build_candidate_queue_review_decision_writer_operator_drill, ) from services.market_intel.candidate_queue_review_decision_writer_run_package import ( build_candidate_queue_review_decision_writer_run_package, ) transaction, operator_evidence = _build_ready_review_decision_transaction() operator_evidence = { **operator_evidence, "operator_confirmed_manual_shell_window": True, "operator_confirmed_post_update_inventory_planned": True, "operator_drill_notes": "review_state shell drill reviewed", } writer_status = build_candidate_queue_review_decision_writer_cli_plan( transaction_preview=transaction, operator_evidence=operator_evidence, ) preflight = build_candidate_queue_review_decision_writer_preflight( writer_status=writer_status, transaction_preview=transaction, operator_evidence=operator_evidence, ) smoke = build_candidate_queue_review_decision_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=False, ) drill = build_candidate_queue_review_decision_writer_operator_drill( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_evidence=operator_evidence, ) package = build_candidate_queue_review_decision_writer_run_package( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_drill=drill, ) payload = json.dumps(package, ensure_ascii=False, sort_keys=True) assert package["mode"] == ( "candidate_queue_review_decision_writer_run_package_preview" ) assert package["target_table"] == "market_alert_review_queue" assert package["target_operation"] == "update_review_state" assert package["package_ready"] is False assert package["package_artifact_created"] is False assert package["ready_for_api_review_state_update"] is False assert package["ready_for_api_database_write"] is False assert package["ready_for_scheduler_attach"] is False assert package["api_writes_file"] is False assert package["api_executes_cli"] is False assert package["api_reads_approval_token"] is False assert package["api_writes_database"] is False assert package["api_updates_review_state"] is False assert package["review_state_update_executed"] is False assert package["database_connection_opened"] is False assert package["database_session_created"] is False assert package["transaction_opened"] is False assert package["transaction_committed"] is False assert package["database_write_executed"] is False assert package["database_commit_executed"] is False assert package["scheduler_attached"] is False assert package["payload_manifest"]["payload_count"] == 1 assert package["payload_manifest"]["payloads"][0]["next_review_state"] == "confirmed" assert len(package["required_artifacts"]) == 5 assert len(package["command_bundle"]) == 5 assert "backup_artifact_path_recorded" in package["blocked_reasons"] assert "one_time_token_supplied_in_shell_only" in package["blocked_reasons"] assert "do_not_update_review_state_from_review_state_run_package" in package[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_decision_writer_run_readiness_preview_checks_operator_evidence(): from services.market_intel.candidate_queue_review_decision_writer_cli import ( build_candidate_queue_review_decision_writer_cli_plan, ) from services.market_intel.candidate_queue_review_decision_writer_preflight import ( build_candidate_queue_review_decision_writer_preflight, ) from services.market_intel.candidate_queue_review_decision_writer_postwrite_smoke import ( build_candidate_queue_review_decision_writer_postwrite_smoke, ) from services.market_intel.candidate_queue_review_decision_writer_operator_drill import ( build_candidate_queue_review_decision_writer_operator_drill, ) from services.market_intel.candidate_queue_review_decision_writer_run_package import ( build_candidate_queue_review_decision_writer_run_package, ) from services.market_intel.candidate_queue_review_decision_writer_run_readiness import ( build_candidate_queue_review_decision_writer_run_readiness, ) transaction, operator_evidence = _build_ready_review_decision_transaction() operator_evidence = { **operator_evidence, "operator_confirmed_manual_shell_window": True, "operator_confirmed_post_update_inventory_planned": True, "operator_drill_notes": "review_state shell drill reviewed", } writer_status = build_candidate_queue_review_decision_writer_cli_plan( transaction_preview=transaction, operator_evidence=operator_evidence, ) preflight = build_candidate_queue_review_decision_writer_preflight( writer_status=writer_status, transaction_preview=transaction, operator_evidence=operator_evidence, ) smoke = build_candidate_queue_review_decision_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=False, ) drill = build_candidate_queue_review_decision_writer_operator_drill( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_evidence=operator_evidence, ) package = build_candidate_queue_review_decision_writer_run_package( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_drill=drill, ) missing = build_candidate_queue_review_decision_writer_run_readiness( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_drill=drill, run_package=package, ) ready = build_candidate_queue_review_decision_writer_run_readiness( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_drill=drill, run_package=package, operator_evidence={ "review_state_transaction_json_path": ( "artifacts/market_intel/review-state-transaction.json" ), "backup_artifact_path": "scripts/tools/backups/backup.zip", "preflight_artifact_path": ( "artifacts/market_intel/review-state-preflight.json" ), "operator_confirmed_review_state_preflight_only": True, "operator_acknowledged_shell_only_token": True, }, ) token_leak = build_candidate_queue_review_decision_writer_run_readiness( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_drill=drill, run_package=package, operator_evidence={ "review_state_transaction_json_path": ( "artifacts/market_intel/review-state-transaction.json" ), "backup_artifact_path": "scripts/tools/backups/backup.zip", "preflight_artifact_path": ( "artifacts/market_intel/review-state-preflight.json" ), "operator_confirmed_review_state_preflight_only": True, "operator_acknowledged_shell_only_token": True, "approval_token": TEST_APPROVAL_TOKEN, }, ) assert missing["mode"] == ( "candidate_queue_review_decision_writer_run_readiness_preview" ) assert missing["target_table"] == "market_alert_review_queue" assert missing["target_operation"] == "update_review_state" assert missing["ready_for_cli_operator_run"] is False assert missing["ready_for_api_review_state_update"] is False assert missing["ready_for_api_database_write"] is False assert missing["ready_for_scheduler_attach"] is False assert missing["api_executes_cli"] is False assert missing["api_reads_approval_token"] is False assert missing["api_writes_file"] is False assert missing["api_updates_review_state"] is False assert missing["review_state_update_executed"] is False assert missing["database_connection_opened"] is False assert missing["database_write_executed"] is False assert missing["database_commit_executed"] is False assert missing["scheduler_attached"] is False assert "review_state_transaction_json_path_recorded" in missing[ "blocked_reasons" ] assert "operator_acknowledged_shell_only_token" in missing["blocked_reasons"] assert ready["ready_for_cli_operator_run"] is True assert ready["ready_for_api_review_state_update"] is False assert ready["database_write_executed"] is False assert ready["run_package_summary"]["package_ready"] is False assert ready["run_package_summary"]["payload_count"] == 1 assert ready["operator_evidence_summary"]["artifact_path_count"] == 3 assert token_leak["ready_for_cli_operator_run"] is False assert token_leak["operator_evidence_summary"][ "approval_token_submitted_to_api" ] is True assert "approval_token_not_submitted_to_api" in token_leak["blocked_reasons"] assert "do_not_update_review_state_from_review_state_run_readiness" in ready[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_decision_writer_run_receipt_preview_reviews_operator_artifacts(): from services.market_intel.candidate_queue_review_decision_writer_cli import ( build_candidate_queue_review_decision_writer_cli_plan, ) from services.market_intel.candidate_queue_review_decision_writer_preflight import ( build_candidate_queue_review_decision_writer_preflight, ) from services.market_intel.candidate_queue_review_decision_writer_postwrite_smoke import ( build_candidate_queue_review_decision_writer_postwrite_smoke, ) from services.market_intel.candidate_queue_review_decision_writer_operator_drill import ( build_candidate_queue_review_decision_writer_operator_drill, ) from services.market_intel.candidate_queue_review_decision_writer_run_package import ( build_candidate_queue_review_decision_writer_run_package, ) from services.market_intel.candidate_queue_review_decision_writer_run_readiness import ( build_candidate_queue_review_decision_writer_run_readiness, ) from services.market_intel.candidate_queue_review_decision_writer_run_receipt import ( build_candidate_queue_review_decision_writer_run_receipt, ) transaction, operator_evidence = _build_ready_review_decision_transaction() expected_key = transaction["statements"][0]["lookup"]["dedupe_key"] operator_evidence = { **operator_evidence, "operator_confirmed_manual_shell_window": True, "operator_confirmed_post_update_inventory_planned": True, "operator_drill_notes": "review_state shell drill reviewed", } writer_status = build_candidate_queue_review_decision_writer_cli_plan( transaction_preview=transaction, operator_evidence=operator_evidence, ) preflight = build_candidate_queue_review_decision_writer_preflight( writer_status=writer_status, transaction_preview=transaction, operator_evidence=operator_evidence, ) smoke = build_candidate_queue_review_decision_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=False, ) drill = build_candidate_queue_review_decision_writer_operator_drill( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_evidence=operator_evidence, ) package = build_candidate_queue_review_decision_writer_run_package( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_drill=drill, ) receipt_evidence = { **operator_evidence, "review_state_transaction_json_path": ( "artifacts/market_intel/review-state-transaction.json" ), "backup_artifact_path": "scripts/tools/backups/backup.zip", "preflight_artifact_path": ( "artifacts/market_intel/review-state-preflight.json" ), "operator_confirmed_review_state_preflight_only": True, "operator_acknowledged_shell_only_token": True, "review_state_writer_output_json_path": ( "artifacts/market_intel/review-state-writer-output.json" ), "review_state_postwrite_smoke_json_path": ( "artifacts/market_intel/review-state-postwrite-smoke.json" ), "operator_confirmed_no_token_in_artifacts": True, "receipt_notes": "review_state receipt reviewed", } readiness = build_candidate_queue_review_decision_writer_run_readiness( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=smoke, operator_drill=drill, run_package=package, operator_evidence=receipt_evidence, ) writer_output = { "mode": "candidate_queue_review_decision_writer_cli_executed", "exit_code": 0, "approval_token_present": True, "approval_token_valid": True, "approval_token_secret_configured": True, "approval_env_var": "MARKET_INTEL_QUEUE_WRITE_APPROVAL", "writes_executed": True, "would_write_database": True, "database_connection_opened": True, "explicit_transaction_opened": True, "database_write_executed": True, "database_commit_executed": True, "database_rollback_executed": False, "external_network_executed": False, "scheduler_attached": False, "api_updates_review_state": False, "review_state_update_executed": True, "updated_count": 1, "skipped_count": 0, "affected_dedupe_keys": [expected_key], "skipped_dedupe_keys": [], } postwrite_smoke_result = { "mode": "candidate_queue_review_decision_writer_postwrite_smoke_read_only", "postwrite_smoke_passed": True, "review_state_update_verified": True, "ready_for_operator_review": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "external_network_executed": False, "scheduler_attached": False, "expected_dedupe_key_count": 1, "found_count": 1, "missing_count": 0, "state_mismatch_count": 0, "found_dedupe_keys": [expected_key], "missing_dedupe_keys": [], "state_mismatches": [], } receipt = build_candidate_queue_review_decision_writer_run_receipt( transaction_preview=transaction, run_readiness=readiness, writer_output=writer_output, postwrite_smoke_result=postwrite_smoke_result, operator_evidence=receipt_evidence, ) token_leak = build_candidate_queue_review_decision_writer_run_receipt( transaction_preview=transaction, run_readiness=readiness, writer_output={**writer_output, "approval_token": TEST_APPROVAL_TOKEN}, postwrite_smoke_result=postwrite_smoke_result, operator_evidence=receipt_evidence, ) assert receipt["mode"] == ( "candidate_queue_review_decision_writer_run_receipt_preview" ) assert receipt["target_operation"] == "update_review_state" assert receipt["receipt_passed"] is True assert receipt["ready_for_next_manual_phase"] is True assert receipt["ready_for_api_review_state_update"] is False assert receipt["ready_for_api_database_write"] is False assert receipt["ready_for_scheduler_attach"] is False assert receipt["api_executes_cli"] is False assert receipt["api_reads_approval_token"] is False assert receipt["api_writes_file"] is False assert receipt["api_updates_review_state"] is False assert receipt["review_state_update_executed"] is False assert receipt["database_connection_opened"] is False assert receipt["database_write_executed"] is False assert receipt["database_commit_executed"] is False assert receipt["scheduler_attached"] is False assert receipt["writer_output_summary"]["review_state_update_executed"] is True assert receipt["writer_output_summary"]["dedupe_keys_match_expected"] is True assert receipt["postwrite_smoke_summary"]["dedupe_keys_match_expected"] is True assert receipt["postwrite_smoke_summary"]["review_state_update_verified"] is True assert receipt["operator_evidence_summary"][ "writer_output_json_path_recorded" ] is True assert receipt["blocked_reasons"] == [] assert token_leak["receipt_passed"] is False assert token_leak["writer_output_summary"]["approval_token_key_detected"] is True assert "writer_output_no_approval_token_key" in token_leak["blocked_reasons"] assert "do_not_update_review_state_from_review_state_receipt" in receipt[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_decision_writer_run_closeout_preview_blocks_api_write_and_tokens(): from services.market_intel.candidate_queue_review_decision_writer_run_closeout import ( build_candidate_queue_review_decision_writer_run_closeout, ) fixture = _build_review_decision_writer_receipt_fixture( "sample-batch-review-state-closeout" ) closeout_evidence = { **fixture["operator_evidence"], "review_state_closeout_artifact_path": ( "artifacts/market_intel/review-state-closeout.json" ), "operator_confirmed_review_state_closeout_next": True, "operator_confirmed_post_closeout_inventory_read_only": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "closeout_notes": "review_state closeout reviewed", } closeout = build_candidate_queue_review_decision_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], operator_evidence=closeout_evidence, ) token_leak = build_candidate_queue_review_decision_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], operator_evidence={ **closeout_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, ) assert closeout["mode"] == ( "candidate_queue_review_decision_writer_run_closeout_preview" ) assert closeout["target_operation"] == "update_review_state" assert closeout["closeout_passed"] is True assert closeout["ready_for_next_manual_phase"] is True assert closeout["ready_for_review_inventory"] is True assert closeout["ready_for_api_review_state_update"] is False assert closeout["ready_for_api_database_write"] is False assert closeout["ready_for_scheduler_attach"] is False assert closeout["api_executes_cli"] is False assert closeout["api_reads_approval_token"] is False assert closeout["api_writes_file"] is False assert closeout["api_writes_database"] is False assert closeout["api_updates_review_state"] is False assert closeout["review_state_update_executed"] is False assert closeout["database_connection_opened"] is False assert closeout["database_write_executed"] is False assert closeout["database_commit_executed"] is False assert closeout["scheduler_attached"] is False assert closeout["blocked_reasons"] == [] assert closeout["receipt_summary"]["target_operation"] == "update_review_state" assert closeout["receipt_summary"]["receipt_passed"] is True assert closeout["receipt_summary"]["safe_boundaries_complete"] is True assert closeout["operator_closeout_summary"][ "closeout_artifact_path_recorded" ] is True assert closeout["promotion_gate"]["requires_real_db_write"] is False assert "do_not_update_review_state_from_review_state_closeout" in closeout[ "safe_boundaries" ] assert token_leak["closeout_passed"] is False assert token_leak["operator_closeout_summary"][ "approval_token_submitted_to_api" ] is True assert "closeout_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_decision_post_closeout_inventory_is_read_only(): from services.market_intel.candidate_queue_review_decision_post_closeout_inventory import ( build_candidate_queue_review_decision_post_closeout_inventory, ) from services.market_intel.candidate_queue_review_decision_writer_run_closeout import ( build_candidate_queue_review_decision_writer_run_closeout, ) fixture = _build_review_decision_writer_receipt_fixture( "sample-batch-review-state-post-closeout" ) closeout_evidence = { **fixture["operator_evidence"], "review_state_closeout_artifact_path": ( "artifacts/market_intel/review-state-closeout.json" ), "operator_confirmed_review_state_closeout_next": True, "operator_confirmed_post_closeout_inventory_read_only": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "closeout_notes": "review_state closeout reviewed", } closeout = build_candidate_queue_review_decision_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], operator_evidence=closeout_evidence, ) live_inventory = { "mode": "live_db_inventory_loaded", "summary_ready": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "migration_executed": False, "external_network_executed": False, "scheduler_attached": False, "total_rows": 1, "table_statuses": [ { "table": "market_alert_review_queue", "exists": True, "row_count": 1, "status": "loaded", } ], "alert_review_state_breakdown": [ { "review_state": "confirmed", "priority_lane": "watch", "alert_count": 1, } ], } inventory = build_candidate_queue_review_decision_post_closeout_inventory( transaction_preview=fixture["transaction"], run_closeout=closeout, postwrite_smoke=fixture["postwrite_smoke_result"], live_db_inventory=live_inventory, operator_evidence=closeout_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_decision_post_closeout_inventory( transaction_preview=fixture["transaction"], run_closeout=closeout, postwrite_smoke=fixture["postwrite_smoke_result"], live_db_inventory=live_inventory, operator_evidence={ **closeout_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, execute_requested=True, ) assert inventory["mode"] == ( "candidate_queue_review_decision_post_closeout_inventory_preview" ) assert inventory["target_operation"] == "verify_review_state_after_closeout" assert inventory["post_closeout_inventory_ready"] is True assert inventory["ready_for_review_completion_archive"] is True assert inventory["ready_for_api_review_state_update"] is False assert inventory["ready_for_api_database_write"] is False assert inventory["ready_for_scheduler_attach"] is False assert inventory["api_executes_cli"] is False assert inventory["api_reads_approval_token"] is False assert inventory["api_writes_database"] is False assert inventory["api_updates_review_state"] is False assert inventory["review_state_update_executed"] is False assert inventory["database_write_executed"] is False assert inventory["database_commit_executed"] is False assert inventory["scheduler_attached"] is False assert inventory["read_only_query_executed"] is True assert inventory["expected_dedupe_keys"] == fixture["receipt"][ "expected_dedupe_keys" ] assert inventory["found_dedupe_keys"] == fixture["receipt"][ "expected_dedupe_keys" ] assert inventory["state_mismatches"] == [] assert inventory["alert_review_queue_table"]["exists"] is True assert inventory["blocked_reasons"] == [] assert "post_closeout_inventory_read_only" in inventory["safe_boundaries"] assert token_leak["post_closeout_inventory_ready"] is False assert token_leak["operator_inventory_summary"][ "approval_token_submitted_to_api" ] is True assert "post_closeout_inventory_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_completion_archive_is_preview_only(): from services.market_intel.candidate_queue_review_completion_archive import ( build_candidate_queue_review_completion_archive, ) from services.market_intel.candidate_queue_review_decision_post_closeout_inventory import ( build_candidate_queue_review_decision_post_closeout_inventory, ) from services.market_intel.candidate_queue_review_decision_writer_run_closeout import ( build_candidate_queue_review_decision_writer_run_closeout, ) fixture = _build_review_decision_writer_receipt_fixture( "sample-batch-review-completion-archive" ) archive_evidence = { **fixture["operator_evidence"], "review_state_receipt_artifact_path": ( "artifacts/market_intel/review-state-receipt.json" ), "review_state_closeout_artifact_path": ( "artifacts/market_intel/review-state-closeout.json" ), "post_closeout_inventory_artifact_path": ( "artifacts/market_intel/post-closeout-inventory.json" ), "review_completion_archive_path": ( "artifacts/market_intel/review-completion-archive.json" ), "operator_confirmed_review_state_closeout_next": True, "operator_confirmed_post_closeout_inventory_read_only": True, "operator_confirmed_review_completion_archive": True, "operator_confirmed_archive_is_read_only": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, } closeout = build_candidate_queue_review_decision_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], operator_evidence=archive_evidence, ) live_inventory = { "mode": "live_db_inventory_loaded", "summary_ready": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "migration_executed": False, "external_network_executed": False, "scheduler_attached": False, "total_rows": 1, "table_statuses": [ { "table": "market_alert_review_queue", "exists": True, "row_count": 1, "status": "loaded", } ], } inventory = build_candidate_queue_review_decision_post_closeout_inventory( transaction_preview=fixture["transaction"], run_closeout=closeout, postwrite_smoke=fixture["postwrite_smoke_result"], live_db_inventory=live_inventory, operator_evidence=archive_evidence, execute_requested=True, ) archive = build_candidate_queue_review_completion_archive( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], run_closeout=closeout, post_closeout_inventory=inventory, operator_evidence=archive_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_completion_archive( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], run_closeout=closeout, post_closeout_inventory=inventory, operator_evidence={ **archive_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, execute_requested=True, ) assert archive["mode"] == "candidate_queue_review_completion_archive_preview" assert archive["target_operation"] == "archive_review_completion_evidence" assert archive["review_completion_archive_ready"] is True assert archive["archive_manifest_ready"] is True assert archive["ready_for_api_review_state_update"] is False assert archive["ready_for_api_database_write"] is False assert archive["ready_for_scheduler_attach"] is False assert archive["api_writes_file"] is False assert archive["api_executes_cli"] is False assert archive["api_reads_approval_token"] is False assert archive["api_writes_database"] is False assert archive["api_updates_review_state"] is False assert archive["archive_file_written"] is False assert archive["archive_record_written"] is False assert archive["archive_manifest_written"] is False assert archive["review_state_update_executed"] is False assert archive["database_write_executed"] is False assert archive["database_commit_executed"] is False assert archive["scheduler_attached"] is False assert archive["expected_dedupe_keys"] == fixture["receipt"][ "expected_dedupe_keys" ] assert archive["found_dedupe_keys"] == fixture["receipt"][ "expected_dedupe_keys" ] assert archive["row_summary_count"] == 1 assert archive["blocked_reasons"] == [] assert "review_completion_archive_preview_only" in archive["safe_boundaries"] assert token_leak["review_completion_archive_ready"] is False assert token_leak["operator_archive_summary"][ "approval_token_submitted_to_api" ] is True assert "archive_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_archive_summary_blocks_llm_and_writes(): from services.market_intel.candidate_queue_review_archive_summary import ( build_candidate_queue_review_archive_summary, ) from services.market_intel.candidate_queue_review_completion_archive import ( build_candidate_queue_review_completion_archive, ) from services.market_intel.candidate_queue_review_decision_post_closeout_inventory import ( build_candidate_queue_review_decision_post_closeout_inventory, ) from services.market_intel.candidate_queue_review_decision_writer_run_closeout import ( build_candidate_queue_review_decision_writer_run_closeout, ) fixture = _build_review_decision_writer_receipt_fixture( "sample-batch-review-archive-summary" ) summary_evidence = { **fixture["operator_evidence"], "review_state_receipt_artifact_path": ( "artifacts/market_intel/review-state-receipt.json" ), "review_state_closeout_artifact_path": ( "artifacts/market_intel/review-state-closeout.json" ), "post_closeout_inventory_artifact_path": ( "artifacts/market_intel/post-closeout-inventory.json" ), "review_completion_archive_path": ( "artifacts/market_intel/review-completion-archive.json" ), "archive_summary_artifact_path": ( "artifacts/market_intel/review-archive-summary.json" ), "operator_confirmed_review_state_closeout_next": True, "operator_confirmed_post_closeout_inventory_read_only": True, "operator_confirmed_review_completion_archive": True, "operator_confirmed_archive_is_read_only": True, "operator_confirmed_ai_summary_review": True, "operator_confirmed_summary_is_read_only": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_telegram_dispatch": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, } closeout = build_candidate_queue_review_decision_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], operator_evidence=summary_evidence, ) inventory = build_candidate_queue_review_decision_post_closeout_inventory( transaction_preview=fixture["transaction"], run_closeout=closeout, postwrite_smoke=fixture["postwrite_smoke_result"], live_db_inventory={ "mode": "live_db_inventory_loaded", "summary_ready": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "migration_executed": False, "external_network_executed": False, "scheduler_attached": False, "table_statuses": [ { "table": "market_alert_review_queue", "exists": True, "row_count": 1, "status": "loaded", } ], }, operator_evidence=summary_evidence, execute_requested=True, ) archive = build_candidate_queue_review_completion_archive( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], run_closeout=closeout, post_closeout_inventory=inventory, operator_evidence=summary_evidence, execute_requested=True, ) summary = build_candidate_queue_review_archive_summary( review_completion_archive=archive, operator_evidence=summary_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_archive_summary( review_completion_archive=archive, operator_evidence={ **summary_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, execute_requested=True, ) assert summary["mode"] == "candidate_queue_review_archive_summary_preview" assert summary["target_operation"] == "prepare_archive_summary_input" assert summary["archive_summary_ready"] is True assert summary["summary_input_ready"] is True assert summary["ready_for_ai_summary_review"] is True assert summary["ready_for_ai_summary_generation"] is False assert summary["ready_for_llm_call"] is False assert summary["ready_for_telegram_dispatch"] is False assert summary["ai_summary_generated"] is False assert summary["llm_call_executed"] is False assert summary["ollama_call_executed"] is False assert summary["gemini_call_executed"] is False assert summary["telegram_dispatched"] is False assert summary["summary_file_written"] is False assert summary["summary_record_written"] is False assert summary["summary_manifest_written"] is False assert summary["database_write_executed"] is False assert summary["database_commit_executed"] is False assert summary["review_state_update_executed"] is False assert summary["scheduler_attached"] is False assert summary["expected_dedupe_keys"] == fixture["receipt"][ "expected_dedupe_keys" ] assert summary["summary_sections"] assert summary["blocked_reasons"] == [] assert "do_not_call_llm_from_archive_summary_gate" in summary[ "safe_boundaries" ] assert "ollama_first_only_for_future_llm_summary" in summary[ "safe_boundaries" ] assert token_leak["archive_summary_ready"] is False assert token_leak["operator_summary_review"][ "approval_token_submitted_to_api" ] is True assert "archive_summary_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_preflight_is_ollama_first_preview(): from services.market_intel.candidate_queue_review_ai_summary_preflight import ( build_candidate_queue_review_ai_summary_preflight, ) from services.market_intel.candidate_queue_review_archive_summary import ( build_candidate_queue_review_archive_summary, ) from services.market_intel.candidate_queue_review_completion_archive import ( build_candidate_queue_review_completion_archive, ) from services.market_intel.candidate_queue_review_decision_post_closeout_inventory import ( build_candidate_queue_review_decision_post_closeout_inventory, ) from services.market_intel.candidate_queue_review_decision_writer_run_closeout import ( build_candidate_queue_review_decision_writer_run_closeout, ) fixture = _build_review_decision_writer_receipt_fixture( "sample-batch-review-ai-summary-preflight" ) preflight_evidence = { **fixture["operator_evidence"], "review_state_receipt_artifact_path": ( "artifacts/market_intel/review-state-receipt.json" ), "review_state_closeout_artifact_path": ( "artifacts/market_intel/review-state-closeout.json" ), "post_closeout_inventory_artifact_path": ( "artifacts/market_intel/post-closeout-inventory.json" ), "review_completion_archive_path": ( "artifacts/market_intel/review-completion-archive.json" ), "archive_summary_artifact_path": ( "artifacts/market_intel/review-archive-summary.json" ), "ai_summary_preflight_artifact_path": ( "artifacts/market_intel/ai-summary-preflight.json" ), "operator_confirmed_review_state_closeout_next": True, "operator_confirmed_post_closeout_inventory_read_only": True, "operator_confirmed_review_completion_archive": True, "operator_confirmed_archive_is_read_only": True, "operator_confirmed_ai_summary_review": True, "operator_confirmed_summary_is_read_only": True, "operator_confirmed_ai_summary_preflight": True, "operator_confirmed_ollama_first": True, "operator_confirmed_gemini_backup_only": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_telegram_dispatch": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, } closeout = build_candidate_queue_review_decision_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], operator_evidence=preflight_evidence, ) inventory = build_candidate_queue_review_decision_post_closeout_inventory( transaction_preview=fixture["transaction"], run_closeout=closeout, postwrite_smoke=fixture["postwrite_smoke_result"], live_db_inventory={ "mode": "live_db_inventory_loaded", "summary_ready": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "migration_executed": False, "external_network_executed": False, "scheduler_attached": False, "table_statuses": [ { "table": "market_alert_review_queue", "exists": True, "row_count": 1, "status": "loaded", } ], }, operator_evidence=preflight_evidence, execute_requested=True, ) archive = build_candidate_queue_review_completion_archive( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], run_closeout=closeout, post_closeout_inventory=inventory, operator_evidence=preflight_evidence, execute_requested=True, ) archive_summary = build_candidate_queue_review_archive_summary( review_completion_archive=archive, operator_evidence=preflight_evidence, execute_requested=True, ) preflight = build_candidate_queue_review_ai_summary_preflight( archive_summary=archive_summary, operator_evidence=preflight_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_preflight( archive_summary=archive_summary, operator_evidence={ **preflight_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, execute_requested=True, ) assert preflight["mode"] == "candidate_queue_review_ai_summary_preflight_preview" assert preflight["target_operation"] == "preflight_ollama_first_ai_summary" assert preflight["ai_summary_preflight_ready"] is True assert preflight["ready_for_manual_ollama_summary_run"] is True assert preflight["ready_for_ai_summary_generation"] is False assert preflight["ready_for_llm_call"] is False assert preflight["ready_for_telegram_dispatch"] is False assert preflight["api_reads_approval_token"] is False assert preflight["api_writes_file"] is False assert preflight["api_writes_database"] is False assert preflight["api_updates_review_state"] is False assert preflight["summary_file_written"] is False assert preflight["summary_record_written"] is False assert preflight["summary_manifest_written"] is False assert preflight["ai_summary_generated"] is False assert preflight["llm_call_executed"] is False assert preflight["ollama_call_executed"] is False assert preflight["gemini_call_executed"] is False assert preflight["telegram_dispatched"] is False assert preflight["database_write_executed"] is False assert preflight["database_commit_executed"] is False assert preflight["scheduler_attached"] is False assert preflight["blocked_reasons"] == [] assert preflight["model_route_policy"]["primary_policy"] == "ollama_first" assert len(preflight["model_route_policy"]["primary_cascade"]) == 3 assert ( preflight["model_route_policy"]["fallback_policy"] == "gemini_backup_only_after_ollama_cascade_failure" ) assert ( preflight["model_route_policy"]["app_host_forbidden_as_ollama_node"] == "192.168.0.188" ) assert "ollama_cascade_must_use_gcp_a_then_gcp_b_then_111" in preflight[ "safe_boundaries" ] assert "host_188_forbidden_as_ollama_node" in preflight["safe_boundaries"] assert "do_not_call_llm_from_ai_summary_preflight" in preflight[ "safe_boundaries" ] assert token_leak["ai_summary_preflight_ready"] is False assert token_leak["operator_ai_summary_preflight"][ "approval_token_submitted_to_api" ] is True assert "ai_summary_preflight_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_run_package_is_manual_only(): from services.market_intel.candidate_queue_review_ai_summary_preflight import ( build_candidate_queue_review_ai_summary_preflight, ) from services.market_intel.candidate_queue_review_ai_summary_run_package import ( build_candidate_queue_review_ai_summary_run_package, ) from services.market_intel.candidate_queue_review_archive_summary import ( build_candidate_queue_review_archive_summary, ) from services.market_intel.candidate_queue_review_completion_archive import ( build_candidate_queue_review_completion_archive, ) from services.market_intel.candidate_queue_review_decision_post_closeout_inventory import ( build_candidate_queue_review_decision_post_closeout_inventory, ) from services.market_intel.candidate_queue_review_decision_writer_run_closeout import ( build_candidate_queue_review_decision_writer_run_closeout, ) fixture = _build_review_decision_writer_receipt_fixture( "sample-batch-review-ai-summary-run-package" ) run_package_evidence = { **fixture["operator_evidence"], "review_state_receipt_artifact_path": ( "artifacts/market_intel/review-state-receipt.json" ), "review_state_closeout_artifact_path": ( "artifacts/market_intel/review-state-closeout.json" ), "post_closeout_inventory_artifact_path": ( "artifacts/market_intel/post-closeout-inventory.json" ), "review_completion_archive_path": ( "artifacts/market_intel/review-completion-archive.json" ), "archive_summary_artifact_path": ( "artifacts/market_intel/review-archive-summary.json" ), "ai_summary_preflight_artifact_path": ( "artifacts/market_intel/ai-summary-preflight.json" ), "ai_summary_run_package_artifact_path": ( "artifacts/market_intel/ai-summary-run-package.json" ), "ai_summary_output_artifact_path": ( "artifacts/market_intel/ai-summary-output.json" ), "operator_confirmed_review_state_closeout_next": True, "operator_confirmed_post_closeout_inventory_read_only": True, "operator_confirmed_review_completion_archive": True, "operator_confirmed_archive_is_read_only": True, "operator_confirmed_ai_summary_review": True, "operator_confirmed_summary_is_read_only": True, "operator_confirmed_ai_summary_preflight": True, "operator_confirmed_ai_summary_run_package": True, "operator_confirmed_ollama_first": True, "operator_confirmed_gemini_backup_only": True, "operator_confirmed_manual_llm_only": True, "operator_confirmed_no_api_llm_call": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_telegram_dispatch": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, } closeout = build_candidate_queue_review_decision_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], operator_evidence=run_package_evidence, ) inventory = build_candidate_queue_review_decision_post_closeout_inventory( transaction_preview=fixture["transaction"], run_closeout=closeout, postwrite_smoke=fixture["postwrite_smoke_result"], live_db_inventory={ "mode": "live_db_inventory_loaded", "summary_ready": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "migration_executed": False, "external_network_executed": False, "scheduler_attached": False, "table_statuses": [ { "table": "market_alert_review_queue", "exists": True, "row_count": 1, "status": "loaded", } ], }, operator_evidence=run_package_evidence, execute_requested=True, ) archive = build_candidate_queue_review_completion_archive( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], run_closeout=closeout, post_closeout_inventory=inventory, operator_evidence=run_package_evidence, execute_requested=True, ) archive_summary = build_candidate_queue_review_archive_summary( review_completion_archive=archive, operator_evidence=run_package_evidence, execute_requested=True, ) preflight = build_candidate_queue_review_ai_summary_preflight( archive_summary=archive_summary, operator_evidence=run_package_evidence, execute_requested=True, ) run_package = build_candidate_queue_review_ai_summary_run_package( archive_summary=archive_summary, ai_summary_preflight=preflight, operator_evidence=run_package_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_run_package( archive_summary=archive_summary, ai_summary_preflight=preflight, operator_evidence={ **run_package_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, execute_requested=True, ) assert run_package["mode"] == "candidate_queue_review_ai_summary_run_package_preview" assert ( run_package["target_operation"] == "package_ollama_first_ai_summary_manual_run" ) assert run_package["ai_summary_run_package_ready"] is True assert run_package["ready_for_manual_ollama_summary_run"] is True assert run_package["ready_for_ai_summary_generation"] is False assert run_package["ready_for_llm_call"] is False assert run_package["ready_for_telegram_dispatch"] is False assert run_package["api_executes_llm"] is False assert run_package["api_reads_approval_token"] is False assert run_package["api_writes_file"] is False assert run_package["api_writes_database"] is False assert run_package["api_updates_review_state"] is False assert run_package["run_package_file_written"] is False assert run_package["summary_file_written"] is False assert run_package["summary_record_written"] is False assert run_package["summary_manifest_written"] is False assert run_package["ai_summary_generated"] is False assert run_package["llm_call_executed"] is False assert run_package["ollama_call_executed"] is False assert run_package["gemini_call_executed"] is False assert run_package["telegram_dispatched"] is False assert run_package["database_write_executed"] is False assert run_package["database_commit_executed"] is False assert run_package["scheduler_attached"] is False assert run_package["blocked_reasons"] == [] assert run_package["prompt_contract"]["contract_version"] == ( "market_intel_ai_summary_prompt_v1" ) assert run_package["summary_output_schema"]["schema_version"] == ( "market_intel_ai_summary_v1" ) assert "evidence_refs" in run_package["summary_output_schema"][ "required_fields" ] assert run_package["model_route_policy"]["primary_policy"] == "ollama_first" assert "manual_ollama_summary_run_only" in run_package["safe_boundaries"] assert "do_not_call_llm_from_ai_summary_run_package" in run_package[ "safe_boundaries" ] assert token_leak["ai_summary_run_package_ready"] is False assert token_leak["operator_ai_summary_run_package"][ "approval_token_submitted_to_api" ] is True assert "ai_summary_run_package_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_output_receipt_validates_manual_output(): from services.market_intel.candidate_queue_review_ai_summary_output_receipt import ( build_candidate_queue_review_ai_summary_output_receipt, ) from services.market_intel.candidate_queue_review_ai_summary_preflight import ( build_candidate_queue_review_ai_summary_preflight, ) from services.market_intel.candidate_queue_review_ai_summary_run_package import ( build_candidate_queue_review_ai_summary_run_package, ) from services.market_intel.candidate_queue_review_archive_summary import ( build_candidate_queue_review_archive_summary, ) from services.market_intel.candidate_queue_review_completion_archive import ( build_candidate_queue_review_completion_archive, ) from services.market_intel.candidate_queue_review_decision_post_closeout_inventory import ( build_candidate_queue_review_decision_post_closeout_inventory, ) from services.market_intel.candidate_queue_review_decision_writer_run_closeout import ( build_candidate_queue_review_decision_writer_run_closeout, ) fixture = _build_review_decision_writer_receipt_fixture( "sample-batch-review-ai-summary-output-receipt" ) expected_key = fixture["receipt"]["expected_dedupe_keys"][0] receipt_evidence = { **fixture["operator_evidence"], "review_state_receipt_artifact_path": ( "artifacts/market_intel/review-state-receipt.json" ), "review_state_closeout_artifact_path": ( "artifacts/market_intel/review-state-closeout.json" ), "post_closeout_inventory_artifact_path": ( "artifacts/market_intel/post-closeout-inventory.json" ), "review_completion_archive_path": ( "artifacts/market_intel/review-completion-archive.json" ), "archive_summary_artifact_path": ( "artifacts/market_intel/review-archive-summary.json" ), "ai_summary_preflight_artifact_path": ( "artifacts/market_intel/ai-summary-preflight.json" ), "ai_summary_run_package_artifact_path": ( "artifacts/market_intel/ai-summary-run-package.json" ), "ai_summary_output_artifact_path": ( "artifacts/market_intel/ai-summary-output.json" ), "ai_summary_receipt_artifact_path": ( "artifacts/market_intel/ai-summary-output-receipt.json" ), "operator_confirmed_review_state_closeout_next": True, "operator_confirmed_post_closeout_inventory_read_only": True, "operator_confirmed_review_completion_archive": True, "operator_confirmed_archive_is_read_only": True, "operator_confirmed_ai_summary_review": True, "operator_confirmed_summary_is_read_only": True, "operator_confirmed_ai_summary_preflight": True, "operator_confirmed_ai_summary_run_package": True, "operator_confirmed_ai_summary_output_receipt": True, "operator_confirmed_ollama_first": True, "operator_confirmed_gemini_backup_only": True, "operator_confirmed_manual_llm_only": True, "operator_confirmed_manual_output_only": True, "operator_confirmed_no_api_llm_call": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_telegram_dispatch": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "ai_summary_output": { "headline": "市場情報人工摘要驗收", "executive_summary": "此摘要僅根據 archive summary facts。", "key_findings": [ { "text": "review_state 已完成人工驗收", "evidence_refs": [expected_key], } ], "risk_flags": [], "recommended_actions": [ { "text": "進入 summary persistence preflight", "evidence_refs": [expected_key, "review_scope"], } ], "evidence_refs": [expected_key, "review_scope"], "model_route": { "provider": "ollama", "host": "34.87.90.216:11434", "model": "qwen2.5-coder:7b", }, }, } closeout = build_candidate_queue_review_decision_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], operator_evidence=receipt_evidence, ) inventory = build_candidate_queue_review_decision_post_closeout_inventory( transaction_preview=fixture["transaction"], run_closeout=closeout, postwrite_smoke=fixture["postwrite_smoke_result"], live_db_inventory={ "mode": "live_db_inventory_loaded", "summary_ready": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "migration_executed": False, "external_network_executed": False, "scheduler_attached": False, "table_statuses": [ { "table": "market_alert_review_queue", "exists": True, "row_count": 1, "status": "loaded", } ], }, operator_evidence=receipt_evidence, execute_requested=True, ) archive = build_candidate_queue_review_completion_archive( transaction_preview=fixture["transaction"], run_receipt=fixture["receipt"], run_closeout=closeout, post_closeout_inventory=inventory, operator_evidence=receipt_evidence, execute_requested=True, ) archive_summary = build_candidate_queue_review_archive_summary( review_completion_archive=archive, operator_evidence=receipt_evidence, execute_requested=True, ) preflight = build_candidate_queue_review_ai_summary_preflight( archive_summary=archive_summary, operator_evidence=receipt_evidence, execute_requested=True, ) run_package = build_candidate_queue_review_ai_summary_run_package( archive_summary=archive_summary, ai_summary_preflight=preflight, operator_evidence=receipt_evidence, execute_requested=True, ) receipt = build_candidate_queue_review_ai_summary_output_receipt( ai_summary_run_package=run_package, operator_evidence=receipt_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_output_receipt( ai_summary_run_package=run_package, operator_evidence={ **receipt_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, execute_requested=True, ) assert receipt["mode"] == "candidate_queue_review_ai_summary_output_receipt_preview" assert receipt["target_operation"] == "review_manual_ollama_ai_summary_output" assert receipt["ai_summary_output_receipt_ready"] is True assert receipt["ready_for_summary_persistence_review"] is True assert receipt["manual_ai_summary_output_provided"] is True assert receipt["summary_output_schema_valid"] is True assert receipt["summary_output_evidence_refs_grounded"] is True assert receipt["summary_output_model_route_accepted"] is True assert receipt["ready_for_ai_summary_generation"] is False assert receipt["ready_for_llm_call"] is False assert receipt["ready_for_telegram_dispatch"] is False assert receipt["api_executes_llm"] is False assert receipt["api_reads_approval_token"] is False assert receipt["api_writes_file"] is False assert receipt["summary_receipt_file_written"] is False assert receipt["summary_file_written"] is False assert receipt["summary_record_written"] is False assert receipt["ai_summary_generated"] is False assert receipt["llm_call_executed"] is False assert receipt["ollama_call_executed"] is False assert receipt["gemini_call_executed"] is False assert receipt["telegram_dispatched"] is False assert receipt["database_write_executed"] is False assert receipt["database_commit_executed"] is False assert receipt["scheduler_attached"] is False assert receipt["blocked_reasons"] == [] assert receipt["summary_output_validation"]["evidence_refs"] == [ expected_key, "review_scope", ] assert "manual_ai_summary_output_only" in receipt["safe_boundaries"] assert "do_not_call_llm_from_ai_summary_output_receipt" in receipt[ "safe_boundaries" ] assert token_leak["ai_summary_output_receipt_ready"] is False assert token_leak["operator_ai_summary_output_receipt"][ "approval_token_submitted_to_api" ] is True assert "ai_summary_output_receipt_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_preflight_prepares_metadata_contract(): from services.market_intel.candidate_queue_review_ai_summary_persistence_preflight import ( build_candidate_queue_review_ai_summary_persistence_preflight, ) expected_key = "market-alert-review:sample-batch:sku-001" receipt = { "mode": "candidate_queue_review_ai_summary_output_receipt_preview", "ai_summary_output_receipt_ready": True, "ready_for_summary_persistence_review": True, "manual_ai_summary_output_provided": True, "summary_output_schema_valid": True, "summary_output_evidence_refs_grounded": True, "summary_output_model_route_accepted": True, "expected_dedupe_keys": [expected_key], "summary_section_keys": ["review_scope"], "summary_output_validation": { "evidence_refs": [expected_key, "review_scope"], }, "model_route_policy": {"primary_policy": "ollama_first"}, "llm_call_executed": False, "ollama_call_executed": False, "gemini_call_executed": False, "telegram_dispatched": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, } operator_evidence = { "ai_summary_output_artifact_path": ( "artifacts/market_intel/ai-summary-output.json" ), "ai_summary_receipt_artifact_path": ( "artifacts/market_intel/ai-summary-output-receipt.json" ), "ai_summary_persistence_preflight_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-preflight.json" ), "operator_confirmed_ai_summary_persistence_preflight": True, "operator_confirmed_summary_persistence_is_cli_only": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_telegram_dispatch": True, "operator_confirmed_no_scheduler_attach": True, "ai_summary_output": { "headline": "市場情報人工摘要驗收", "executive_summary": "此摘要僅根據 archive summary facts。", "key_findings": [ { "text": "review_state 已完成人工驗收", "evidence_refs": [expected_key], } ], "risk_flags": [], "recommended_actions": [ { "text": "進入 summary persistence transaction preview", "evidence_refs": [expected_key, "review_scope"], } ], "evidence_refs": [expected_key, "review_scope"], "model_route": { "provider": "ollama", "host": "34.87.90.216:11434", "model": "qwen2.5-coder:7b", }, }, } preflight = build_candidate_queue_review_ai_summary_persistence_preflight( ai_summary_output_receipt=receipt, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_preflight( ai_summary_output_receipt=receipt, operator_evidence={ **operator_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, execute_requested=True, ) assert preflight["mode"] == ( "candidate_queue_review_ai_summary_persistence_preflight_preview" ) assert preflight["target_table"] == "market_alert_review_queue" assert preflight["target_operation"] == "preflight_ai_summary_metadata_persistence" assert preflight["summary_persistence_preflight_ready"] is True assert preflight["ready_for_summary_transaction_preview"] is True assert preflight["ready_for_summary_persistence_cli_run"] is False assert preflight["ready_for_telegram_dispatch"] is False assert preflight["ready_for_api_database_write"] is False assert preflight["api_executes_llm"] is False assert preflight["api_reads_approval_token"] is False assert preflight["api_writes_file"] is False assert preflight["api_writes_database"] is False assert preflight["api_updates_review_state"] is False assert preflight["summary_persistence_preflight_file_written"] is False assert preflight["summary_record_written"] is False assert preflight["summary_persistence_record_written"] is False assert preflight["metadata_patch_written"] is False assert preflight["llm_call_executed"] is False assert preflight["ollama_call_executed"] is False assert preflight["gemini_call_executed"] is False assert preflight["telegram_dispatched"] is False assert preflight["database_connection_opened"] is False assert preflight["database_write_executed"] is False assert preflight["database_commit_executed"] is False assert preflight["review_state_update_executed"] is False assert preflight["scheduler_attached"] is False assert preflight["writes_executed"] is False assert preflight["would_write_database"] is False assert preflight["blocked_reasons"] == [] assert len(preflight["summary_payload_hash"]) == 64 assert preflight["summary_persistence_contract"]["target_column"] == "metadata_json" assert preflight["summary_persistence_contract"]["target_json_path"] == [ "ai_summary_review" ] assert preflight["summary_persistence_contract"]["planned_update_count"] == 1 assert preflight["summary_persistence_contract"]["api_write_allowed"] is False assert preflight["summary_record_preview"]["headline"] == "市場情報人工摘要驗收" assert preflight["summary_record_preview"]["key_finding_count"] == 1 assert preflight["summary_record_preview"]["risk_flag_count"] == 0 assert preflight["metadata_patch_preview"]["statement_preview_created"] is False assert preflight["metadata_patch_preview"]["metadata_patch_preview_created"] is True assert "future_summary_persistence_must_use_cli_only_gate" in preflight[ "safe_boundaries" ] assert token_leak["summary_persistence_preflight_ready"] is False assert token_leak["operator_ai_summary_persistence_preflight"][ "approval_token_submitted_to_api" ] is True assert ( "summary_persistence_preflight_no_approval_token_submitted_to_api" in token_leak["blocked_reasons"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_transaction_previews_update_statements(): from services.market_intel.candidate_queue_review_ai_summary_persistence_transaction import ( build_candidate_queue_review_ai_summary_persistence_transaction, ) expected_key = "market-alert-review:sample-batch:sku-001" preflight = { "mode": "candidate_queue_review_ai_summary_persistence_preflight_preview", "summary_persistence_preflight_ready": True, "ready_for_summary_transaction_preview": True, "expected_dedupe_keys": [expected_key], "summary_payload_hash": "f" * 64, "summary_persistence_contract": { "target_table": "market_alert_review_queue", "target_column": "metadata_json", "target_json_path": ["ai_summary_review"], "api_write_allowed": False, }, "summary_record_preview": { "headline": "市場情報人工摘要驗收", "payload_hash": "f" * 64, }, "metadata_patch_preview": { "target_table": "market_alert_review_queue", "target_column": "metadata_json", "target_json_path": ["ai_summary_review"], "statement_preview_created": False, "metadata_patch_preview_created": True, "api_write_allowed": False, }, "llm_call_executed": False, "telegram_dispatched": False, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, } operator_evidence = { "ai_summary_output_artifact_path": ( "artifacts/market_intel/ai-summary-output.json" ), "ai_summary_persistence_preflight_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-preflight.json" ), "ai_summary_persistence_transaction_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-transaction.json" ), "operator_confirmed_ai_summary_persistence_transaction": True, "operator_confirmed_metadata_merge_reviewed": True, "operator_confirmed_summary_persistence_is_cli_only": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_telegram_dispatch": True, "operator_confirmed_no_scheduler_attach": True, } transaction = build_candidate_queue_review_ai_summary_persistence_transaction( ai_summary_persistence_preflight=preflight, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_transaction( ai_summary_persistence_preflight=preflight, operator_evidence={ **operator_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, execute_requested=True, ) assert transaction["mode"] == ( "candidate_queue_review_ai_summary_persistence_transaction_preview" ) assert transaction["target_operation"] == "update_ai_summary_metadata_json" assert transaction["summary_persistence_transaction_ready"] is True assert transaction["ready_for_summary_persistence_writer_gate"] is True assert transaction["ready_for_summary_persistence_cli_run"] is False assert transaction["ready_for_api_database_write"] is False assert transaction["ready_for_telegram_dispatch"] is False assert transaction["api_executes_cli"] is False assert transaction["api_reads_approval_token"] is False assert transaction["api_writes_file"] is False assert transaction["api_writes_database"] is False assert transaction["api_updates_review_state"] is False assert transaction["summary_persistence_transaction_file_written"] is False assert transaction["summary_persistence_record_written"] is False assert transaction["metadata_patch_written"] is False assert transaction["transaction_file_written"] is False assert transaction["llm_call_executed"] is False assert transaction["telegram_dispatched"] is False assert transaction["database_connection_opened"] is False assert transaction["database_write_executed"] is False assert transaction["database_commit_executed"] is False assert transaction["review_state_update_executed"] is False assert transaction["scheduler_attached"] is False assert transaction["writes_executed"] is False assert transaction["would_write_database"] is False assert transaction["blocked_reasons"] == [] assert transaction["statement_count"] == 1 statement = transaction["statements"][0] assert statement["table"] == "market_alert_review_queue" assert statement["target_column"] == "metadata_json" assert statement["where"]["dedupe_key"] == expected_key assert statement["parameter_preview"]["payload_hash"] == "f" * 64 assert statement["execute_in_api"] is False assert transaction["transaction_summary"]["api_write_allowed"] is False assert transaction["transaction_summary"]["manual_cli_required"] is True assert len(transaction["rollback_plan"]) == 3 assert "future_summary_persistence_write_must_use_cli_only_gate" in transaction[ "safe_boundaries" ] assert token_leak["summary_persistence_transaction_ready"] is False assert token_leak["operator_ai_summary_persistence_transaction"][ "approval_token_submitted_to_api" ] is True assert ( "summary_persistence_transaction_no_approval_token_submitted_to_api" in token_leak["blocked_reasons"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_writer_preflight_gates_cli_only_write(): from services.market_intel.candidate_queue_review_ai_summary_persistence_writer_preflight import ( build_candidate_queue_review_ai_summary_persistence_writer_preflight, ) expected_key = "market-alert-review:sample-batch:sku-001" transaction = { "mode": "candidate_queue_review_ai_summary_persistence_transaction_preview", "summary_persistence_transaction_ready": True, "ready_for_summary_persistence_writer_gate": True, "statement_count": 1, "expected_dedupe_keys": [expected_key], "summary_payload_hash": "f" * 64, "transaction_summary": { "target_table": "market_alert_review_queue", "target_column": "metadata_json", "statement_count": 1, "metadata_key": "ai_summary_review", "payload_hash": "f" * 64, "manual_cli_required": True, "api_write_allowed": False, }, "statements": [ { "statement_type": "UPDATE", "table": "market_alert_review_queue", "target_column": "metadata_json", "where": {"dedupe_key": expected_key}, "parameter_preview": { "dedupe_key": expected_key, "metadata_key": "ai_summary_review", "payload_hash": "f" * 64, }, "requires_existing_metadata_merge": True, "execute_in_api": False, } ], "rollback_plan": [ {"key": "backup_metadata_json_before_update"}, {"key": "restore_metadata_json_by_dedupe_key"}, {"key": "do_not_change_review_state"}, ], "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "llm_call_executed": False, "telegram_dispatched": False, "scheduler_attached": False, "writes_executed": False, "would_write_database": False, } operator_evidence = { "ai_summary_persistence_transaction_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-transaction.json" ), "metadata_json_backup_artifact_path": ( "artifacts/market_intel/metadata-json-backup.json" ), "postwrite_smoke_plan_path": ( "artifacts/market_intel/summary-persistence-postwrite-smoke.json" ), "operator_confirmed_ai_summary_persistence_writer_preflight": True, "operator_confirmed_summary_persistence_is_cli_only": True, "operator_confirmed_metadata_json_backup_required": True, "operator_confirmed_postwrite_smoke_required": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_telegram_dispatch": True, "operator_confirmed_no_scheduler_attach": True, } preflight = build_candidate_queue_review_ai_summary_persistence_writer_preflight( ai_summary_persistence_transaction=transaction, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_writer_preflight( ai_summary_persistence_transaction=transaction, operator_evidence={ **operator_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, execute_requested=True, ) apply_write = build_candidate_queue_review_ai_summary_persistence_writer_preflight( ai_summary_persistence_transaction=transaction, operator_evidence=operator_evidence, execute_requested=True, apply_real_write=True, ) assert preflight["mode"] == ( "candidate_queue_review_ai_summary_persistence_writer_preflight_preview" ) assert preflight["target_operation"] == "persist_ai_summary_metadata_json" assert preflight["summary_persistence_writer_preflight_ready"] is True assert preflight["ready_for_summary_persistence_run_package"] is True assert preflight["ready_for_summary_persistence_cli_run"] is False assert preflight["ready_for_real_write"] is False assert preflight["ready_for_api_database_write"] is False assert preflight["ready_for_telegram_dispatch"] is False assert preflight["api_executes_cli"] is False assert preflight["api_reads_approval_token"] is False assert preflight["api_writes_file"] is False assert preflight["api_writes_database"] is False assert preflight["summary_persistence_writer_preflight_file_written"] is False assert preflight["writer_preflight_file_written"] is False assert preflight["metadata_patch_written"] is False assert preflight["database_connection_opened"] is False assert preflight["database_write_executed"] is False assert preflight["database_commit_executed"] is False assert preflight["llm_call_executed"] is False assert preflight["telegram_dispatched"] is False assert preflight["scheduler_attached"] is False assert preflight["writes_executed"] is False assert preflight["would_write_database"] is False assert preflight["blocked_reasons"] == [] assert preflight["statement_count"] == 1 assert preflight["invalid_statement_count"] == 0 assert preflight["statement_payloads"][0]["dedupe_key"] == expected_key assert preflight["writer_preflight_contract"]["api_write_allowed"] is False assert preflight["writer_preflight_contract"]["manual_cli_required"] is True assert preflight["writer_preflight_contract"]["requires_metadata_json_backup"] is True assert preflight["writer_preflight_contract"]["requires_postwrite_smoke"] is True assert "future_summary_persistence_write_must_use_cli_only_gate" in preflight[ "safe_boundaries" ] assert token_leak["summary_persistence_writer_preflight_ready"] is False assert token_leak["operator_ai_summary_persistence_writer_preflight"][ "approval_token_submitted_to_api" ] is True assert ( "summary_persistence_writer_preflight_no_approval_token_submitted_to_api" in token_leak["blocked_reasons"] ) assert ( "summary_persistence_writer_preflight_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_run_package_previews_cli_bundle(): from services.market_intel.candidate_queue_review_ai_summary_persistence_run_package import ( build_candidate_queue_review_ai_summary_persistence_run_package, ) expected_key = "market-alert-review:sample-batch:sku-001" writer_preflight = { "mode": "candidate_queue_review_ai_summary_persistence_writer_preflight_preview", "summary_persistence_writer_preflight_ready": True, "ready_for_summary_persistence_run_package": True, "statement_count": 1, "invalid_statement_count": 0, "expected_dedupe_keys": [expected_key], "summary_payload_hash": "f" * 64, "statement_payloads": [ { "statement_type": "UPDATE", "table": "market_alert_review_queue", "target_column": "metadata_json", "dedupe_key": expected_key, "metadata_key": "ai_summary_review", "payload_hash": "f" * 64, "execute_in_api": False, } ], "writer_preflight_contract": { "target_table": "market_alert_review_queue", "target_column": "metadata_json", "target_json_path": ["ai_summary_review"], "manual_cli_required": True, "api_write_allowed": False, "requires_metadata_json_backup": True, "requires_postwrite_smoke": True, }, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "llm_call_executed": False, "telegram_dispatched": False, "scheduler_attached": False, "writes_executed": False, "would_write_database": False, } operator_evidence = { "ai_summary_persistence_transaction_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-transaction.json" ), "ai_summary_persistence_writer_preflight_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-writer-preflight.json" ), "ai_summary_persistence_run_package_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-run-package.json" ), "metadata_json_backup_artifact_path": ( "artifacts/market_intel/metadata-json-backup.json" ), "operator_confirmed_ai_summary_persistence_run_package": True, "operator_confirmed_payload_manifest_reviewed": True, "operator_confirmed_cli_command_reviewed": True, "operator_confirmed_summary_persistence_is_cli_only": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_telegram_dispatch": True, "operator_confirmed_no_scheduler_attach": True, } package = build_candidate_queue_review_ai_summary_persistence_run_package( ai_summary_persistence_writer_preflight=writer_preflight, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_run_package( ai_summary_persistence_writer_preflight=writer_preflight, operator_evidence={ **operator_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, execute_requested=True, ) apply_write = build_candidate_queue_review_ai_summary_persistence_run_package( ai_summary_persistence_writer_preflight=writer_preflight, operator_evidence=operator_evidence, execute_requested=True, apply_real_write=True, ) assert package["mode"] == ( "candidate_queue_review_ai_summary_persistence_run_package_preview" ) assert package["target_operation"] == "persist_ai_summary_metadata_json" assert package["package_ready"] is True assert package["ready_for_summary_persistence_run_readiness"] is True assert package["ready_for_summary_persistence_cli_run"] is False assert package["ready_for_real_write"] is False assert package["ready_for_api_database_write"] is False assert package["ready_for_telegram_dispatch"] is False assert package["package_artifact_created"] is False assert package["summary_persistence_run_package_file_written"] is False assert package["run_package_file_written"] is False assert package["api_executes_cli"] is False assert package["api_reads_approval_token"] is False assert package["api_writes_file"] is False assert package["api_writes_database"] is False assert package["database_connection_opened"] is False assert package["database_write_executed"] is False assert package["database_commit_executed"] is False assert package["llm_call_executed"] is False assert package["telegram_dispatched"] is False assert package["scheduler_attached"] is False assert package["writes_executed"] is False assert package["would_write_database"] is False assert package["blocked_reasons"] == [] assert package["statement_count"] == 1 assert package["payload_manifest"]["payload_count"] == 1 assert package["payload_manifest"]["dedupe_keys"] == [expected_key] assert package["payload_manifest"]["payloads"][0]["execute_in_api"] is False assert len(package["required_artifacts"]) == 5 assert len(package["command_bundle"]) == 5 assert package["command_bundle"][3]["executes_database"] is True assert package["command_bundle"][3]["executed"] is False assert "future_summary_persistence_write_must_use_cli_only_gate" in package[ "safe_boundaries" ] assert token_leak["package_ready"] is False assert token_leak["operator_ai_summary_persistence_run_package"][ "approval_token_submitted_to_api" ] is True assert ( "summary_persistence_run_package_no_approval_token_submitted_to_api" in token_leak["blocked_reasons"] ) assert ( "summary_persistence_run_package_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_run_readiness_checks_operator_artifacts(): from services.market_intel.candidate_queue_review_ai_summary_persistence_run_package import ( build_candidate_queue_review_ai_summary_persistence_run_package, ) from services.market_intel.candidate_queue_review_ai_summary_persistence_run_readiness import ( build_candidate_queue_review_ai_summary_persistence_run_readiness, ) expected_key = "market-alert-review:sample-batch:sku-001" writer_preflight = { "mode": "candidate_queue_review_ai_summary_persistence_writer_preflight_preview", "summary_persistence_writer_preflight_ready": True, "ready_for_summary_persistence_run_package": True, "statement_count": 1, "invalid_statement_count": 0, "expected_dedupe_keys": [expected_key], "summary_payload_hash": "f" * 64, "statement_payloads": [ { "statement_type": "UPDATE", "table": "market_alert_review_queue", "target_column": "metadata_json", "dedupe_key": expected_key, "metadata_key": "ai_summary_review", "payload_hash": "f" * 64, "execute_in_api": False, } ], "writer_preflight_contract": { "target_table": "market_alert_review_queue", "target_column": "metadata_json", "target_json_path": ["ai_summary_review"], "manual_cli_required": True, "api_write_allowed": False, "requires_metadata_json_backup": True, "requires_postwrite_smoke": True, }, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "llm_call_executed": False, "telegram_dispatched": False, "scheduler_attached": False, "writes_executed": False, "would_write_database": False, } operator_evidence = { "ai_summary_persistence_transaction_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-transaction.json" ), "ai_summary_persistence_writer_preflight_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-writer-preflight.json" ), "ai_summary_persistence_run_package_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-run-package.json" ), "metadata_json_backup_artifact_path": ( "artifacts/market_intel/metadata-json-backup.json" ), "ai_summary_persistence_postwrite_smoke_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-postwrite-smoke.json" ), "operator_confirmed_ai_summary_persistence_run_package": True, "operator_confirmed_payload_manifest_reviewed": True, "operator_confirmed_summary_persistence_is_cli_only": True, "operator_confirmed_ai_summary_persistence_run_readiness": True, "operator_confirmed_run_package_artifact_reviewed": True, "operator_confirmed_backup_artifact_reviewed": True, "operator_confirmed_writer_preflight_reviewed": True, "operator_confirmed_cli_command_reviewed": True, "operator_confirmed_one_time_token_shell_only": True, "operator_confirmed_postwrite_smoke_required": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_telegram_dispatch": True, "operator_confirmed_no_scheduler_attach": True, } run_package = build_candidate_queue_review_ai_summary_persistence_run_package( ai_summary_persistence_writer_preflight=writer_preflight, operator_evidence=operator_evidence, execute_requested=True, ) readiness = build_candidate_queue_review_ai_summary_persistence_run_readiness( ai_summary_persistence_run_package=run_package, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_run_readiness( ai_summary_persistence_run_package=run_package, operator_evidence={**operator_evidence, "approval_token": TEST_APPROVAL_TOKEN}, execute_requested=True, ) apply_write = build_candidate_queue_review_ai_summary_persistence_run_readiness( ai_summary_persistence_run_package=run_package, operator_evidence=operator_evidence, execute_requested=True, apply_real_write=True, ) assert run_package["package_ready"] is True assert readiness["mode"] == ( "candidate_queue_review_ai_summary_persistence_run_readiness_preview" ) assert readiness["run_readiness_ready"] is True assert readiness["summary_persistence_run_readiness_ready"] is True assert readiness["ready_for_cli_operator_run"] is True assert readiness["ready_for_summary_persistence_cli_run"] is False assert readiness["ready_for_real_write"] is False assert readiness["ready_for_api_database_write"] is False assert readiness["ready_for_telegram_dispatch"] is False assert readiness["summary_persistence_run_readiness_file_written"] is False assert readiness["run_readiness_file_written"] is False assert readiness["api_executes_cli"] is False assert readiness["api_reads_approval_token"] is False assert readiness["api_writes_file"] is False assert readiness["api_writes_database"] is False assert readiness["database_connection_opened"] is False assert readiness["database_write_executed"] is False assert readiness["database_commit_executed"] is False assert readiness["llm_call_executed"] is False assert readiness["telegram_dispatched"] is False assert readiness["scheduler_attached"] is False assert readiness["writes_executed"] is False assert readiness["would_write_database"] is False assert readiness["statement_count"] == 1 assert readiness["run_package_summary"]["payload_count"] == 1 assert readiness["run_package_summary"]["writer_command_present"] is True assert readiness["operator_ai_summary_persistence_run_readiness"][ "artifact_path_count" ] == 5 assert readiness["blocked_reasons"] == [] assert token_leak["run_readiness_ready"] is False assert token_leak["operator_ai_summary_persistence_run_readiness"][ "approval_token_submitted_to_api" ] is True assert ( "summary_persistence_run_readiness_no_approval_token_submitted_to_api" in token_leak["blocked_reasons"] ) assert ( "summary_persistence_run_readiness_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_run_receipt_reviews_cli_output(): from services.market_intel.candidate_queue_review_ai_summary_persistence_run_package import ( build_candidate_queue_review_ai_summary_persistence_run_package, ) from services.market_intel.candidate_queue_review_ai_summary_persistence_run_readiness import ( build_candidate_queue_review_ai_summary_persistence_run_readiness, ) from services.market_intel.candidate_queue_review_ai_summary_persistence_run_receipt import ( build_candidate_queue_review_ai_summary_persistence_run_receipt, ) expected_key = "market-alert-review:sample-batch:sku-001" expected_hash = "f" * 64 writer_preflight = { "mode": "candidate_queue_review_ai_summary_persistence_writer_preflight_preview", "summary_persistence_writer_preflight_ready": True, "ready_for_summary_persistence_run_package": True, "statement_count": 1, "invalid_statement_count": 0, "expected_dedupe_keys": [expected_key], "summary_payload_hash": expected_hash, "statement_payloads": [ { "statement_type": "UPDATE", "table": "market_alert_review_queue", "target_column": "metadata_json", "dedupe_key": expected_key, "metadata_key": "ai_summary_review", "payload_hash": expected_hash, "execute_in_api": False, } ], "writer_preflight_contract": { "target_table": "market_alert_review_queue", "target_column": "metadata_json", "target_json_path": ["ai_summary_review"], "manual_cli_required": True, "api_write_allowed": False, "requires_metadata_json_backup": True, "requires_postwrite_smoke": True, }, } operator_evidence = { "ai_summary_persistence_transaction_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-transaction.json" ), "ai_summary_persistence_writer_preflight_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-writer-preflight.json" ), "ai_summary_persistence_run_package_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-run-package.json" ), "metadata_json_backup_artifact_path": ( "artifacts/market_intel/metadata-json-backup.json" ), "ai_summary_persistence_postwrite_smoke_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-postwrite-smoke.json" ), "ai_summary_persistence_writer_output_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-writer-output.json" ), "operator_confirmed_ai_summary_persistence_run_package": True, "operator_confirmed_payload_manifest_reviewed": True, "operator_confirmed_summary_persistence_is_cli_only": True, "operator_confirmed_ai_summary_persistence_run_readiness": True, "operator_confirmed_run_package_artifact_reviewed": True, "operator_confirmed_backup_artifact_reviewed": True, "operator_confirmed_writer_preflight_reviewed": True, "operator_confirmed_cli_command_reviewed": True, "operator_confirmed_one_time_token_shell_only": True, "operator_confirmed_postwrite_smoke_required": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_telegram_dispatch": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_token_in_artifacts": True, "receipt_notes": "CLI output and smoke artifacts reviewed.", } run_package = build_candidate_queue_review_ai_summary_persistence_run_package( ai_summary_persistence_writer_preflight=writer_preflight, operator_evidence=operator_evidence, execute_requested=True, ) readiness = build_candidate_queue_review_ai_summary_persistence_run_readiness( ai_summary_persistence_run_package=run_package, operator_evidence=operator_evidence, execute_requested=True, ) writer_output = { "mode": "candidate_queue_review_ai_summary_persistence_writer_cli_executed", "exit_code": 0, "writes_executed": True, "would_write_database": True, "database_connection_opened": True, "explicit_transaction_opened": True, "database_write_executed": True, "database_commit_executed": True, "database_rollback_executed": False, "metadata_json_update_executed": True, "updated_count": 1, "affected_dedupe_keys": [expected_key], "summary_payload_hash": expected_hash, "external_network_executed": False, "scheduler_attached": False, } postwrite_smoke_result = { "mode": "candidate_queue_review_ai_summary_persistence_postwrite_smoke_read_only", "postwrite_smoke_passed": True, "metadata_json_update_verified": True, "ready_for_operator_review": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "found_dedupe_keys": [expected_key], "missing_dedupe_keys": [], "expected_dedupe_key_count": 1, "found_count": 1, "missing_count": 0, "summary_payload_hash": expected_hash, "external_network_executed": False, "scheduler_attached": False, } receipt = build_candidate_queue_review_ai_summary_persistence_run_receipt( ai_summary_persistence_run_readiness=readiness, writer_output=writer_output, postwrite_smoke_result=postwrite_smoke_result, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_run_receipt( ai_summary_persistence_run_readiness=readiness, writer_output={**writer_output, "approval_token": TEST_APPROVAL_TOKEN}, postwrite_smoke_result=postwrite_smoke_result, operator_evidence=operator_evidence, ) apply_write = build_candidate_queue_review_ai_summary_persistence_run_receipt( ai_summary_persistence_run_readiness=readiness, writer_output=writer_output, postwrite_smoke_result=postwrite_smoke_result, operator_evidence=operator_evidence, apply_real_write=True, ) assert readiness["run_readiness_ready"] is True assert receipt["mode"] == ( "candidate_queue_review_ai_summary_persistence_run_receipt_preview" ) assert receipt["run_receipt_passed"] is True assert receipt["summary_persistence_run_receipt_passed"] is True assert receipt["ready_for_summary_persistence_closeout"] is True assert receipt["ready_for_summary_persistence_cli_run"] is False assert receipt["ready_for_real_write"] is False assert receipt["ready_for_api_database_write"] is False assert receipt["ready_for_telegram_dispatch"] is False assert receipt["summary_persistence_run_receipt_file_written"] is False assert receipt["run_receipt_file_written"] is False assert receipt["receipt_file_written"] is False assert receipt["api_executes_cli"] is False assert receipt["api_reads_approval_token"] is False assert receipt["api_writes_file"] is False assert receipt["api_writes_database"] is False assert receipt["database_connection_opened"] is False assert receipt["database_write_executed"] is False assert receipt["database_commit_executed"] is False assert receipt["llm_call_executed"] is False assert receipt["telegram_dispatched"] is False assert receipt["scheduler_attached"] is False assert receipt["writes_executed"] is False assert receipt["would_write_database"] is False assert receipt["statement_count"] == 1 assert receipt["expected_dedupe_keys"] == [expected_key] assert receipt["writer_output_summary"]["database_write_executed"] is True assert receipt["writer_output_summary"]["metadata_json_update_executed"] is True assert receipt["writer_output_summary"]["dedupe_keys_match_expected"] is True assert ( receipt["writer_output_summary"]["summary_payload_hash_matches_expected"] is True ) assert receipt["postwrite_smoke_summary"]["database_write_executed"] is False assert receipt["postwrite_smoke_summary"]["dedupe_keys_match_expected"] is True assert receipt["operator_evidence_summary"][ "writer_output_json_path_recorded" ] is True assert receipt["blocked_reasons"] == [] assert token_leak["run_receipt_passed"] is False assert "writer_output_no_approval_token_key" in token_leak["blocked_reasons"] assert "run_receipt_apply_real_write_not_requested_from_api" in apply_write[ "blocked_reasons" ] assert "do_not_write_metadata_json_from_summary_persistence_receipt" in receipt[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_run_closeout_promotes_telegram_gate_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_run_closeout import ( build_candidate_queue_review_ai_summary_persistence_run_closeout, ) expected_key = "market-alert-review:sample-batch:sku-001" expected_hash = "f" * 64 run_receipt = { "mode": "candidate_queue_review_ai_summary_persistence_run_receipt_preview", "target_operation": "persist_ai_summary_metadata_json", "run_receipt_passed": True, "summary_persistence_run_receipt_passed": True, "ready_for_summary_persistence_closeout": True, "ready_for_next_manual_phase": True, "expected_dedupe_keys": [expected_key], "expected_summary_payload_hash": expected_hash, "blocked_reasons": [], "writer_output_summary": { "mode": "candidate_queue_review_ai_summary_persistence_writer_cli_executed", "metadata_json_update_executed": True, "dedupe_keys_match_expected": True, "summary_payload_hash_matches_expected": True, }, "postwrite_smoke_summary": { "mode": "candidate_queue_review_ai_summary_persistence_postwrite_smoke_read_only", "postwrite_smoke_passed": True, "read_only_query_executed": True, "metadata_json_update_verified": True, "dedupe_keys_match_expected": True, "summary_payload_hash_matches_expected": True, }, "ready_for_api_database_write": False, "ready_for_telegram_dispatch": False, "ready_for_scheduler_attach": False, "api_executes_cli": False, "api_executes_llm": False, "api_reads_approval_token": False, "api_writes_file": False, "api_writes_database": False, "api_updates_review_state": False, "summary_persistence_record_written": False, "metadata_patch_written": False, "llm_call_executed": False, "telegram_dispatched": False, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, "safe_boundaries": [ "do_not_execute_summary_persistence_writer_from_receipt_api", "do_not_read_approval_token_from_summary_persistence_receipt_api", "do_not_echo_operator_receipt_payload", "do_not_create_summary_persistence_receipt_artifact_from_api", "do_not_open_database_connection_from_summary_persistence_receipt", "do_not_write_metadata_json_from_summary_persistence_receipt", "do_not_update_review_state_from_summary_persistence_receipt", "do_not_commit_summary_persistence_receipt", "do_not_dispatch_telegram_from_summary_persistence_receipt", "do_not_attach_scheduler_from_summary_persistence_receipt", ], } operator_evidence = { "ai_summary_persistence_closeout_artifact_path": ( "artifacts/market_intel/ai-summary-persistence-closeout.json" ), "operator_confirmed_summary_persistence_closeout": True, "operator_confirmed_telegram_dispatch_requires_separate_gate": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_telegram_dispatch": True, "closeout_notes": "Receipt reviewed; next gate is Telegram dispatch.", } closeout = build_candidate_queue_review_ai_summary_persistence_run_closeout( run_receipt=run_receipt, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_run_closeout( run_receipt=run_receipt, operator_evidence={**operator_evidence, "approval_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_run_closeout( run_receipt=run_receipt, operator_evidence=operator_evidence, apply_real_write=True, ) assert closeout["mode"] == ( "candidate_queue_review_ai_summary_persistence_run_closeout_preview" ) assert closeout["closeout_passed"] is True assert closeout["summary_persistence_closeout_passed"] is True assert closeout["ready_for_summary_persistence_telegram_dispatch_gate"] is True assert closeout["ready_for_telegram_dispatch"] is False assert closeout["ready_for_api_database_write"] is False assert closeout["ready_for_scheduler_attach"] is False assert closeout["summary_persistence_closeout_file_written"] is False assert closeout["closeout_file_written"] is False assert closeout["api_executes_cli"] is False assert closeout["api_executes_llm"] is False assert closeout["api_reads_approval_token"] is False assert closeout["api_writes_file"] is False assert closeout["api_writes_database"] is False assert closeout["database_connection_opened"] is False assert closeout["database_write_executed"] is False assert closeout["database_commit_executed"] is False assert closeout["llm_call_executed"] is False assert closeout["telegram_dispatched"] is False assert closeout["scheduler_attached"] is False assert closeout["writes_executed"] is False assert closeout["would_write_database"] is False assert closeout["statement_count"] == 1 assert closeout["receipt_summary"]["safe_boundaries_complete"] is True assert closeout["operator_closeout_summary"][ "closeout_artifact_path_recorded" ] is True assert closeout["promotion_gate"]["next_manual_phase"] == ( "summary_persistence_telegram_dispatch_gate" ) assert closeout["promotion_gate"][ "telegram_dispatch_requires_separate_gate" ] is True assert closeout["blocked_reasons"] == [] assert token_leak["closeout_passed"] is False assert "closeout_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert "closeout_apply_real_write_not_requested_from_api" in apply_write[ "blocked_reasons" ] assert "do_not_dispatch_telegram_from_summary_persistence_closeout" in closeout[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate_promotes_run_package_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate, ) closeout = { "mode": "candidate_queue_review_ai_summary_persistence_run_closeout_preview", "target_operation": "persist_ai_summary_metadata_json", "target_json_path": ["ai_summary_review"], "closeout_passed": True, "summary_persistence_closeout_passed": True, "ready_for_summary_persistence_telegram_dispatch_gate": True, "ready_for_next_manual_phase": True, "promotion_gate": { "allowed": True, "next_manual_phase": "summary_persistence_telegram_dispatch_gate", "telegram_dispatch_requires_separate_gate": True, }, "receipt_summary": { "expected_dedupe_key_count": 1, "expected_summary_payload_hash": "f" * 64, "writer_metadata_json_update_executed": True, "postwrite_smoke_metadata_json_verified": True, }, "safe_boundaries": [ "do_not_execute_summary_persistence_writer_from_closeout_api", "do_not_read_approval_token_from_summary_persistence_closeout_api", "do_not_write_closeout_artifact_from_summary_persistence_closeout_api", "do_not_open_database_connection_from_summary_persistence_closeout", "do_not_write_metadata_json_from_summary_persistence_closeout", "do_not_update_review_state_from_summary_persistence_closeout", "do_not_dispatch_telegram_from_summary_persistence_closeout", "do_not_attach_scheduler_from_summary_persistence_closeout", "future_telegram_dispatch_must_use_separate_gate", ], } operator_evidence = { "ai_summary_telegram_dispatch_gate_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-gate.json" ), "operator_confirmed_summary_persistence_telegram_dispatch_gate": True, "operator_confirmed_telegram_message_reviewed": True, "operator_confirmed_dispatch_requires_manual_run_package": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "telegram_channel_label": "market-intel-alerts", "dispatch_notes": "Message contract reviewed; next step is run package.", } gate = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate( summary_persistence_closeout=closeout, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate( summary_persistence_closeout=closeout, operator_evidence={ **operator_evidence, "telegram_bot_token": TEST_APPROVAL_TOKEN, }, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate( summary_persistence_closeout=closeout, operator_evidence=operator_evidence, apply_real_write=True, ) assert gate["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate_preview" ) assert gate["telegram_dispatch_gate_passed"] is True assert gate["summary_persistence_telegram_dispatch_gate_passed"] is True assert gate["ready_for_summary_persistence_telegram_dispatch_run_package"] is True assert gate["ready_for_manual_telegram_dispatch_run_package"] is True assert gate["ready_for_telegram_dispatch"] is False assert gate["ready_for_api_database_write"] is False assert gate["ready_for_scheduler_attach"] is False assert gate["api_dispatches_telegram"] is False assert gate["api_executes_llm"] is False assert gate["api_reads_approval_token"] is False assert gate["api_writes_database"] is False assert gate["telegram_dispatch_gate_file_written"] is False assert gate["telegram_message_file_written"] is False assert gate["telegram_dispatched"] is False assert gate["database_connection_opened"] is False assert gate["database_write_executed"] is False assert gate["scheduler_attached"] is False assert gate["statement_count"] == 1 assert gate["telegram_message_contract"]["api_dispatches_telegram"] is False assert gate["telegram_message_contract"]["approval_tokens_allowed_in_message"] is False assert gate["promotion_gate"]["next_manual_phase"] == ( "summary_persistence_telegram_dispatch_run_package" ) assert gate["blocked_reasons"] == [] assert token_leak["telegram_dispatch_gate_passed"] is False assert "telegram_dispatch_gate_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert "telegram_dispatch_gate_apply_real_write_not_requested_from_api" in apply_write[ "blocked_reasons" ] assert "do_not_dispatch_telegram_from_summary_persistence_telegram_dispatch_gate_api" in gate[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package_promotes_readiness_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package, ) dispatch_gate = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate_preview", "target_operation": "prepare_ai_summary_telegram_dispatch_gate", "target_json_path": ["ai_summary_review"], "telegram_dispatch_gate_passed": True, "summary_persistence_telegram_dispatch_gate_passed": True, "ready_for_summary_persistence_telegram_dispatch_run_package": True, "ready_for_manual_telegram_dispatch_run_package": True, "promotion_gate": { "allowed": True, "next_manual_phase": "summary_persistence_telegram_dispatch_run_package", }, "telegram_message_contract": { "target_channel": "market-intel-alerts", "message_format": "market_intel_ai_summary_brief", "max_message_chars": 3500, "requires_evidence_refs": True, "requires_summary_payload_hash": True, "expected_dedupe_key_count": 1, "expected_summary_payload_hash": "f" * 64, "api_dispatches_telegram": False, "scheduler_dispatches_telegram": False, "approval_tokens_allowed_in_message": False, }, } operator_evidence = { "operator_confirmed_ai_summary_telegram_dispatch_run_package": True, "operator_confirmed_message_contract_reviewed": True, "operator_confirmed_command_bundle_reviewed": True, "operator_confirmed_dispatch_is_manual_only": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "ai_summary_telegram_dispatch_gate_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-gate.json" ), "ai_summary_telegram_dispatch_run_package_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-run-package.json" ), "telegram_message_preview_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-message-preview.json" ), "telegram_channel_label": "market-intel-alerts", } package = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package( telegram_dispatch_gate=dispatch_gate, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package( telegram_dispatch_gate=dispatch_gate, operator_evidence={ **operator_evidence, "telegram_bot_token": TEST_APPROVAL_TOKEN, }, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package( telegram_dispatch_gate=dispatch_gate, operator_evidence=operator_evidence, apply_real_write=True, ) assert package["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package_preview" ) assert package["telegram_dispatch_run_package_ready"] is True assert package["summary_persistence_telegram_dispatch_run_package_ready"] is True assert package["ready_for_summary_persistence_telegram_dispatch_run_readiness"] is True assert package["ready_for_telegram_dispatch"] is False assert package["ready_for_api_database_write"] is False assert package["ready_for_scheduler_attach"] is False assert package["api_dispatches_telegram"] is False assert package["api_executes_llm"] is False assert package["api_reads_approval_token"] is False assert package["telegram_dispatch_run_package_file_written"] is False assert package["telegram_message_file_written"] is False assert package["telegram_dispatched"] is False assert package["database_connection_opened"] is False assert package["database_write_executed"] is False assert package["scheduler_attached"] is False assert package["statement_count"] == 1 assert len(package["command_bundle"]) == 5 assert package["command_bundle"][3]["executes_telegram"] is True assert package["command_bundle"][3]["executed"] is False assert package["message_package_manifest"]["api_dispatches_telegram"] is False assert package["message_package_manifest"][ "approval_tokens_allowed_in_message" ] is False assert package["promotion_gate"]["next_manual_phase"] == ( "summary_persistence_telegram_dispatch_run_readiness" ) assert package["blocked_reasons"] == [] assert token_leak["telegram_dispatch_run_package_ready"] is False assert "telegram_dispatch_run_package_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert "telegram_dispatch_run_package_apply_real_write_not_requested_from_api" in apply_write[ "blocked_reasons" ] assert "do_not_dispatch_telegram_from_telegram_dispatch_run_package_api" in package[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness_promotes_receipt_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness, ) run_package = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package_preview", "target_operation": "prepare_ai_summary_telegram_dispatch_run_package", "telegram_dispatch_run_package_ready": True, "package_ready": True, "ready_for_next_manual_phase": True, "ready_for_summary_persistence_telegram_dispatch_run_readiness": True, "message_package_manifest": { "target_channel": "market-intel-alerts", "message_format": "market_intel_ai_summary_brief", "expected_dedupe_key_count": 1, "expected_summary_payload_hash": "a" * 64, "requires_evidence_refs": True, "requires_summary_payload_hash": True, "api_dispatches_telegram": False, "scheduler_dispatches_telegram": False, "approval_tokens_allowed_in_message": False, "manifest_hash": "b" * 64, }, "command_bundle": [ {"key": "persist_run_package_json", "executed": False}, {"key": "render_message_preview", "executed": False}, {"key": "operator_message_review", "executed": False}, { "key": "manual_telegram_dispatch", "executes_telegram": True, "executed": False, }, {"key": "dispatch_receipt", "executed": False}, ], "required_artifacts": [ {"key": "telegram_dispatch_gate_json"}, {"key": "telegram_dispatch_run_package_json"}, {"key": "telegram_message_preview_json"}, {"key": "telegram_dispatch_receipt_json"}, ], } operator_evidence = { "operator_confirmed_ai_summary_telegram_dispatch_run_readiness": True, "operator_confirmed_run_package_artifact_reviewed": True, "operator_confirmed_message_preview_reviewed": True, "operator_confirmed_manual_dispatch_command_reviewed": True, "operator_confirmed_telegram_token_shell_only": True, "operator_confirmed_no_token_in_artifacts": True, "operator_confirmed_dispatch_receipt_required": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_scheduler_attach": True, "ai_summary_telegram_dispatch_gate_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-gate.json" ), "ai_summary_telegram_dispatch_run_package_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-run-package.json" ), "telegram_message_preview_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-message-preview.json" ), "telegram_dispatch_receipt_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-receipt.json" ), "telegram_channel_label": "market-intel-alerts", } readiness = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness( telegram_dispatch_run_package=run_package, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness( telegram_dispatch_run_package=run_package, operator_evidence={ **operator_evidence, "telegram_bot_token": TEST_APPROVAL_TOKEN, }, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness( telegram_dispatch_run_package=run_package, operator_evidence=operator_evidence, apply_real_write=True, ) assert readiness["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness_preview" ) assert readiness["telegram_dispatch_run_readiness_ready"] is True assert ( readiness["summary_persistence_telegram_dispatch_run_readiness_ready"] is True ) assert readiness["ready_for_manual_telegram_dispatch"] is True assert ( readiness["ready_for_summary_persistence_telegram_dispatch_run_receipt"] is True ) assert readiness["ready_for_telegram_dispatch"] is False assert readiness["ready_for_api_database_write"] is False assert readiness["ready_for_scheduler_attach"] is False assert readiness["api_dispatches_telegram"] is False assert readiness["api_executes_llm"] is False assert readiness["api_reads_approval_token"] is False assert readiness["telegram_dispatch_run_readiness_file_written"] is False assert readiness["telegram_message_file_written"] is False assert readiness["telegram_dispatched"] is False assert readiness["telegram_dispatch_attempted"] is False assert readiness["database_connection_opened"] is False assert readiness["database_write_executed"] is False assert readiness["scheduler_attached"] is False assert readiness["statement_count"] == 1 assert readiness["promotion_gate"]["next_manual_phase"] == ( "summary_persistence_telegram_dispatch_run_receipt" ) assert readiness["manual_dispatch_boundary"]["api_may_dispatch_telegram"] is False assert readiness["manual_dispatch_boundary"]["telegram_token_shell_only"] is True assert readiness["blocked_reasons"] == [] assert token_leak["telegram_dispatch_run_readiness_ready"] is False assert "telegram_dispatch_run_readiness_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert "telegram_dispatch_run_readiness_apply_real_write_not_requested_from_api" in apply_write[ "blocked_reasons" ] assert "do_not_dispatch_telegram_from_telegram_dispatch_run_readiness_api" in readiness[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt_promotes_closeout_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt, ) run_readiness = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness_preview", "telegram_dispatch_run_readiness_ready": True, "run_readiness_ready": True, "ready_for_manual_telegram_dispatch": True, "ready_for_summary_persistence_telegram_dispatch_run_receipt": True, "statement_count": 1, "telegram_dispatch_run_package_summary": { "target_channel": "market-intel-alerts", "message_format": "market_intel_ai_summary_brief", "expected_dedupe_key_count": 1, "expected_summary_payload_hash": "c" * 64, "manifest_hash": "d" * 64, "manual_dispatch_command_present": True, "commands_executed": False, "side_effects_clear": True, }, } telegram_dispatch_receipt = { "mode": "candidate_queue_review_ai_summary_telegram_dispatch_manual_receipt", "ok": True, "telegram_dispatch_attempted": True, "telegram_dispatched": True, "message_id": "9988", "chat_id": "-100123", "telegram_channel_label": "market-intel-alerts", "summary_payload_hash": "c" * 64, "database_write_executed": False, "database_commit_executed": False, "api_updates_review_state": False, "review_state_update_executed": False, "llm_call_executed": False, "scheduler_attached": False, "api_dispatches_telegram": False, } operator_evidence = { "telegram_dispatch_receipt_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-receipt.json" ), "telegram_message_preview_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-message-preview.json" ), "operator_confirmed_ai_summary_telegram_dispatch_run_receipt": True, "operator_confirmed_message_id_recorded": True, "operator_confirmed_summary_hash_matched": True, "operator_confirmed_no_token_in_receipt": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "receipt_notes": "manual Telegram dispatch receipt reviewed", } receipt = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt( telegram_dispatch_run_readiness=run_readiness, telegram_dispatch_receipt=telegram_dispatch_receipt, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt( telegram_dispatch_run_readiness=run_readiness, telegram_dispatch_receipt={ **telegram_dispatch_receipt, "telegram_bot_token": TEST_APPROVAL_TOKEN, }, operator_evidence=operator_evidence, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt( telegram_dispatch_run_readiness=run_readiness, telegram_dispatch_receipt=telegram_dispatch_receipt, operator_evidence=operator_evidence, apply_real_write=True, ) assert receipt["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt_preview" ) assert receipt["telegram_dispatch_run_receipt_passed"] is True assert receipt["summary_persistence_telegram_dispatch_run_receipt_passed"] is True assert receipt["ready_for_summary_persistence_telegram_dispatch_closeout"] is True assert receipt["ready_for_telegram_dispatch"] is False assert receipt["ready_for_api_database_write"] is False assert receipt["ready_for_scheduler_attach"] is False assert receipt["api_dispatches_telegram"] is False assert receipt["api_executes_llm"] is False assert receipt["api_reads_approval_token"] is False assert receipt["telegram_dispatch_run_receipt_file_written"] is False assert receipt["telegram_dispatch_receipt_file_written"] is False assert receipt["telegram_dispatched"] is False assert receipt["telegram_dispatch_attempted"] is False assert receipt["database_connection_opened"] is False assert receipt["database_write_executed"] is False assert receipt["scheduler_attached"] is False assert receipt["statement_count"] == 1 assert receipt["telegram_dispatch_receipt_summary"]["telegram_dispatched"] is True assert ( receipt["telegram_dispatch_receipt_summary"][ "summary_payload_hash_matches_expected" ] is True ) assert receipt["promotion_gate"]["next_manual_phase"] == ( "summary_persistence_telegram_dispatch_closeout" ) assert receipt["blocked_reasons"] == [] assert token_leak["telegram_dispatch_run_receipt_passed"] is False assert "telegram_dispatch_receipt_no_token_key" in token_leak["blocked_reasons"] assert "telegram_dispatch_run_receipt_apply_real_write_not_requested_from_api" in apply_write[ "blocked_reasons" ] assert "do_not_dispatch_telegram_from_telegram_dispatch_run_receipt_api" in receipt[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout_archives_receipt_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout, ) run_receipt = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt_preview", "target_operation": "review_manual_ai_summary_telegram_dispatch_receipt", "telegram_dispatch_run_receipt_passed": True, "summary_persistence_telegram_dispatch_run_receipt_passed": True, "ready_for_next_manual_phase": True, "ready_for_summary_persistence_telegram_dispatch_closeout": True, "statement_count": 1, "expected_summary_payload_hash": "c" * 64, "ready_for_telegram_dispatch": False, "ready_for_manual_telegram_dispatch": False, "ready_for_api_database_write": False, "ready_for_scheduler_attach": False, "api_executes_cli": False, "api_executes_llm": False, "api_dispatches_telegram": False, "api_reads_approval_token": False, "api_writes_file": False, "api_writes_database": False, "api_updates_review_state": False, "telegram_dispatch_run_receipt_file_written": False, "telegram_dispatch_receipt_file_written": False, "telegram_message_file_written": False, "llm_call_executed": False, "telegram_dispatched": False, "telegram_dispatch_attempted": False, "external_network_executed": False, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, "telegram_dispatch_receipt_summary": { "provided": True, "mode": "candidate_queue_review_ai_summary_telegram_dispatch_manual_receipt", "ok": True, "telegram_dispatch_attempted": True, "telegram_dispatched": True, "message_id": "9988", "chat_id": "-100123", "telegram_channel_label": "market-intel-alerts", "summary_payload_hash": "c" * 64, "expected_summary_payload_hash": "c" * 64, "summary_payload_hash_matches_expected": True, "approval_or_telegram_token_key_detected": False, }, "telegram_dispatch_run_readiness_summary": { "expected_dedupe_key_count": 1, "expected_summary_payload_hash": "c" * 64, }, "safe_boundaries": [ "do_not_read_approval_token_from_telegram_dispatch_run_receipt_api", "do_not_read_telegram_token_from_telegram_dispatch_run_receipt_api", "do_not_call_llm_from_telegram_dispatch_run_receipt", "do_not_dispatch_telegram_from_telegram_dispatch_run_receipt_api", "do_not_retry_telegram_dispatch_from_receipt_api", "do_not_echo_operator_telegram_receipt_payload", "do_not_open_database_connection_from_telegram_dispatch_run_receipt", "do_not_write_dispatch_receipt_artifact_from_api", "do_not_update_review_state_from_telegram_dispatch_run_receipt", "do_not_attach_scheduler_from_telegram_dispatch_run_receipt", ], } operator_evidence = { "telegram_dispatch_closeout_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-closeout.json" ), "telegram_dispatch_receipt_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-receipt.json" ), "operator_confirmed_telegram_dispatch_closeout": True, "operator_confirmed_receipt_archived": True, "operator_confirmed_message_visible": True, "operator_confirmed_summary_hash_matched": True, "operator_confirmed_no_duplicate_dispatch": True, "operator_confirmed_no_retry_needed": True, "operator_confirmed_no_token_in_artifacts": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_post_closeout_monitoring": True, "closeout_notes": "manual Telegram dispatch closeout archived", } closeout = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout( telegram_dispatch_run_receipt=run_receipt, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout( telegram_dispatch_run_receipt=run_receipt, operator_evidence={ **operator_evidence, "telegram_bot_token": TEST_APPROVAL_TOKEN, }, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout( telegram_dispatch_run_receipt=run_receipt, operator_evidence=operator_evidence, apply_real_write=True, ) assert closeout["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout_preview" ) assert closeout["telegram_dispatch_closeout_passed"] is True assert ( closeout["summary_persistence_telegram_dispatch_closeout_passed"] is True ) assert closeout["ready_for_next_manual_phase"] is True assert closeout["ready_for_summary_persistence_telegram_dispatch_archive"] is True assert closeout["ready_for_telegram_dispatch"] is False assert closeout["ready_for_api_database_write"] is False assert closeout["ready_for_scheduler_attach"] is False assert closeout["api_dispatches_telegram"] is False assert closeout["api_executes_llm"] is False assert closeout["api_reads_approval_token"] is False assert closeout["telegram_dispatch_closeout_file_written"] is False assert closeout["telegram_dispatch_run_receipt_file_written"] is False assert closeout["telegram_dispatch_receipt_file_written"] is False assert closeout["telegram_dispatched"] is False assert closeout["telegram_dispatch_attempted"] is False assert closeout["database_connection_opened"] is False assert closeout["database_write_executed"] is False assert closeout["scheduler_attached"] is False assert closeout["statement_count"] == 1 assert closeout["dispatch_audit_summary"]["manual_dispatch_proven"] is True assert closeout["dispatch_audit_summary"]["api_dispatch_blocked"] is True assert closeout["dispatch_audit_summary"]["message_id"] == "9988" assert closeout["promotion_gate"]["next_manual_phase"] == ( "summary_persistence_telegram_dispatch_archive" ) assert closeout["blocked_reasons"] == [] assert token_leak["telegram_dispatch_closeout_passed"] is False assert "telegram_dispatch_closeout_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "telegram_dispatch_closeout_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_dispatch_telegram_from_telegram_dispatch_closeout_api" in closeout[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_manifest_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive, ) closeout = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout_preview", "target_operation": "closeout_manual_ai_summary_telegram_dispatch", "telegram_dispatch_closeout_passed": True, "summary_persistence_telegram_dispatch_closeout_passed": True, "closeout_passed": True, "ready_for_next_manual_phase": True, "ready_for_summary_persistence_telegram_dispatch_archive": True, "statement_count": 1, "expected_summary_payload_hash": "c" * 64, "ready_for_telegram_dispatch": False, "ready_for_manual_telegram_dispatch": False, "ready_for_api_database_write": False, "ready_for_scheduler_attach": False, "api_executes_cli": False, "api_executes_llm": False, "api_dispatches_telegram": False, "api_reads_approval_token": False, "api_writes_file": False, "api_writes_database": False, "api_updates_review_state": False, "telegram_dispatch_closeout_file_written": False, "telegram_dispatch_receipt_file_written": False, "telegram_dispatch_run_receipt_file_written": False, "telegram_message_file_written": False, "llm_call_executed": False, "telegram_dispatched": False, "telegram_dispatch_attempted": False, "external_network_executed": False, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, "telegram_dispatch_run_receipt_summary": { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt_preview", "receipt_passed": True, "message_id": "9988", "chat_id": "-100123", "telegram_channel_label": "market-intel-alerts", "summary_payload_hash": "c" * 64, "summary_payload_hash_matches_expected": True, }, "dispatch_audit_summary": { "manual_dispatch_proven": True, "api_dispatch_blocked": True, "duplicate_dispatch_ruled_out": True, "receipt_archived": True, "post_closeout_monitoring_confirmed": True, "message_id": "9988", "chat_id": "-100123", "telegram_channel_label": "market-intel-alerts", "summary_payload_hash": "c" * 64, "summary_payload_hash_matches_expected": True, }, "operator_telegram_dispatch_closeout": { "telegram_dispatch_closeout_artifact_path_recorded": True, "telegram_dispatch_receipt_artifact_path_recorded": True, "operator_confirmed_telegram_dispatch_closeout": True, "operator_confirmed_receipt_archived": True, "operator_confirmed_no_duplicate_dispatch": True, "operator_confirmed_post_closeout_monitoring": True, }, "safe_boundaries": [ "do_not_dispatch_telegram_from_telegram_dispatch_closeout_api", "telegram_dispatch_closeout_preview_only", ], } operator_evidence = { "telegram_dispatch_archive_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-archive.json" ), "telegram_dispatch_closeout_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-closeout.json" ), "telegram_dispatch_receipt_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-receipt.json" ), "telegram_message_preview_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-message-preview.json" ), "operator_confirmed_telegram_dispatch_archive": True, "operator_confirmed_archive_is_read_only": True, "operator_confirmed_receipt_archived": True, "operator_confirmed_message_id_archived": True, "operator_confirmed_dispatch_audit_archived": True, "operator_confirmed_post_closeout_monitoring": True, "operator_confirmed_no_duplicate_dispatch": True, "operator_confirmed_no_token_in_artifacts": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "archive_notes": "manual Telegram dispatch evidence archived", } archive = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive( telegram_dispatch_closeout=closeout, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive( telegram_dispatch_closeout=closeout, operator_evidence={ **operator_evidence, "telegram_bot_token": TEST_APPROVAL_TOKEN, }, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive( telegram_dispatch_closeout=closeout, operator_evidence=operator_evidence, apply_real_write=True, ) assert archive["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_preview" ) assert archive["target_operation"] == ( "archive_manual_ai_summary_telegram_dispatch_evidence" ) assert archive["telegram_dispatch_archive_ready"] is True assert archive["summary_persistence_telegram_dispatch_archive_ready"] is True assert archive["archive_manifest_ready"] is True assert archive["ready_for_summary_persistence_telegram_dispatch_archive_summary"] is True assert archive["ready_for_telegram_dispatch"] is False assert archive["ready_for_api_database_write"] is False assert archive["ready_for_scheduler_attach"] is False assert archive["api_dispatches_telegram"] is False assert archive["api_executes_llm"] is False assert archive["api_reads_approval_token"] is False assert archive["telegram_dispatch_archive_file_written"] is False assert archive["archive_file_written"] is False assert archive["archive_record_written"] is False assert archive["archive_manifest_written"] is False assert archive["telegram_dispatched"] is False assert archive["telegram_dispatch_attempted"] is False assert archive["database_connection_opened"] is False assert archive["database_write_executed"] is False assert archive["scheduler_attached"] is False assert archive["statement_count"] == 1 assert archive["telegram_dispatch_archive_manifest"]["telegram_message"][ "message_id" ] == "9988" assert archive["telegram_dispatch_archive_manifest"]["dispatch_audit"][ "manual_dispatch_proven" ] is True assert archive["promotion_gate"]["next_manual_phase"] == ( "summary_persistence_telegram_dispatch_archive_summary" ) assert archive["blocked_reasons"] == [] assert token_leak["telegram_dispatch_archive_ready"] is False assert "telegram_dispatch_archive_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "telegram_dispatch_archive_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_dispatch_telegram_from_telegram_dispatch_archive_api" in archive[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary_report_input_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary, ) archive = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_preview", "target_operation": "archive_manual_ai_summary_telegram_dispatch_evidence", "telegram_dispatch_archive_ready": True, "summary_persistence_telegram_dispatch_archive_ready": True, "archive_manifest_ready": True, "ready_for_next_manual_phase": True, "ready_for_summary_persistence_telegram_dispatch_archive_summary": True, "statement_count": 1, "expected_summary_payload_hash": "c" * 64, "ready_for_telegram_dispatch": False, "ready_for_manual_telegram_dispatch": False, "ready_for_api_database_write": False, "ready_for_scheduler_attach": False, "ready_for_llm_call": False, "api_executes_cli": False, "api_executes_llm": False, "api_dispatches_telegram": False, "api_reads_approval_token": False, "api_writes_file": False, "api_writes_database": False, "api_updates_review_state": False, "telegram_dispatch_archive_file_written": False, "telegram_dispatch_archive_summary_file_written": False, "telegram_dispatch_closeout_file_written": False, "telegram_dispatch_receipt_file_written": False, "telegram_message_file_written": False, "archive_file_written": False, "archive_record_written": False, "archive_manifest_written": False, "archive_summary_file_written": False, "summary_file_written": False, "summary_record_written": False, "summary_manifest_written": False, "ai_summary_generated": False, "llm_call_executed": False, "telegram_dispatched": False, "telegram_dispatch_attempted": False, "external_network_executed": False, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, "telegram_dispatch_archive_manifest": { "telegram_message": { "message_id": "9988", "chat_id": "-100123", "telegram_channel_label": "market-intel-alerts", "summary_payload_hash": "c" * 64, "summary_payload_hash_matches_expected": True, }, "dispatch_audit": { "manual_dispatch_proven": True, "api_dispatch_blocked": True, "duplicate_dispatch_ruled_out": True, "receipt_archived": True, "post_closeout_monitoring_confirmed": True, }, "artifact_paths": { "telegram_dispatch_receipt_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-receipt.json" ), "telegram_dispatch_closeout_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-closeout.json" ), "telegram_message_preview_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-message-preview.json" ), "telegram_dispatch_archive_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-archive.json" ), }, }, "telegram_dispatch_closeout_summary": { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout_preview", "closeout_passed": True, }, "safe_boundaries": [ "do_not_dispatch_telegram_from_telegram_dispatch_archive_api", "telegram_dispatch_archive_preview_only", ], } operator_evidence = { "telegram_dispatch_archive_summary_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-archive-summary.json" ), "operator_confirmed_telegram_dispatch_archive_summary": True, "operator_confirmed_summary_is_read_only": True, "operator_confirmed_message_and_artifacts_reviewed": True, "operator_confirmed_dispatch_audit_reviewed": True, "operator_confirmed_report_input_requires_separate_gate": True, "operator_confirmed_no_token_in_artifacts": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "archive_summary_notes": "manual Telegram dispatch archive summary reviewed", } summary = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary( telegram_dispatch_archive=archive, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary( telegram_dispatch_archive=archive, operator_evidence={ **operator_evidence, "telegram_bot_token": TEST_APPROVAL_TOKEN, }, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary( telegram_dispatch_archive=archive, operator_evidence=operator_evidence, apply_real_write=True, ) assert summary["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary_preview" ) assert summary["target_operation"] == ( "prepare_manual_ai_summary_telegram_dispatch_archive_summary_input" ) assert summary["telegram_dispatch_archive_summary_ready"] is True assert ( summary["summary_persistence_telegram_dispatch_archive_summary_ready"] is True ) assert summary["summary_input_ready"] is True assert summary["ready_for_summary_persistence_telegram_dispatch_report_input"] is True assert summary["ready_for_telegram_dispatch"] is False assert summary["ready_for_api_database_write"] is False assert summary["ready_for_scheduler_attach"] is False assert summary["api_dispatches_telegram"] is False assert summary["api_executes_llm"] is False assert summary["api_reads_approval_token"] is False assert summary["api_writes_file"] is False assert summary["api_writes_database"] is False assert summary["telegram_dispatch_archive_summary_file_written"] is False assert summary["archive_summary_file_written"] is False assert summary["telegram_dispatch_archive_file_written"] is False assert summary["archive_manifest_written"] is False assert summary["summary_file_written"] is False assert summary["summary_record_written"] is False assert summary["summary_manifest_written"] is False assert summary["ai_summary_generated"] is False assert summary["llm_call_executed"] is False assert summary["telegram_dispatched"] is False assert summary["telegram_dispatch_attempted"] is False assert summary["database_connection_opened"] is False assert summary["database_write_executed"] is False assert summary["database_commit_executed"] is False assert summary["review_state_update_executed"] is False assert summary["scheduler_attached"] is False assert summary["statement_count"] == 1 assert summary["blocked_reasons"] == [] assert summary["telegram_dispatch_archive_summary"]["message"][ "message_id" ] == "9988" assert summary["telegram_dispatch_archive_summary"]["dispatch_audit"][ "manual_dispatch_proven" ] is True assert summary["telegram_dispatch_archive_summary_sections"] assert summary["promotion_gate"]["next_manual_phase"] == ( "summary_persistence_telegram_dispatch_report_input" ) assert token_leak["telegram_dispatch_archive_summary_ready"] is False assert ( "telegram_dispatch_archive_summary_no_token_submitted_to_api" in token_leak["blocked_reasons"] ) assert ( "telegram_dispatch_archive_summary_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_dispatch_telegram_from_telegram_dispatch_archive_summary_api" in summary[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input, ) archive_summary = { "mode": ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary_preview" ), "target_operation": ( "prepare_manual_ai_summary_telegram_dispatch_archive_summary_input" ), "telegram_dispatch_archive_summary_ready": True, "summary_persistence_telegram_dispatch_archive_summary_ready": True, "summary_input_ready": True, "ready_for_summary_persistence_telegram_dispatch_report_input": True, "ready_for_next_manual_phase": True, "statement_count": 1, "expected_summary_payload_hash": "d" * 64, "ready_for_telegram_dispatch": False, "ready_for_manual_telegram_dispatch": False, "ready_for_api_database_write": False, "ready_for_scheduler_attach": False, "ready_for_llm_call": False, "api_executes_cli": False, "api_executes_llm": False, "api_dispatches_telegram": False, "api_reads_approval_token": False, "api_writes_file": False, "api_writes_database": False, "api_updates_review_state": False, "telegram_dispatch_archive_summary_file_written": False, "telegram_dispatch_archive_file_written": False, "archive_summary_file_written": False, "archive_file_written": False, "archive_record_written": False, "archive_manifest_written": False, "telegram_message_file_written": False, "summary_file_written": False, "summary_record_written": False, "summary_manifest_written": False, "ai_summary_generated": False, "llm_call_executed": False, "telegram_dispatched": False, "telegram_dispatch_attempted": False, "external_network_executed": False, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, "blocked_reasons": [], "telegram_dispatch_archive_summary": { "message": { "message_id": "9988", "chat_id": "-100123", "telegram_channel_label": "market-intel-alerts", "summary_payload_hash": "d" * 64, "summary_payload_hash_matches_expected": True, }, "dispatch_audit": { "manual_dispatch_proven": True, "api_dispatch_blocked": True, "duplicate_dispatch_ruled_out": True, "receipt_archived": True, "post_closeout_monitoring_confirmed": True, }, "artifact_paths": { "telegram_dispatch_receipt_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-receipt.json" ), "telegram_dispatch_closeout_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-closeout.json" ), "telegram_message_preview_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-message-preview.json" ), "telegram_dispatch_archive_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-archive.json" ), }, }, "telegram_dispatch_archive_summary_sections": [ {"key": "telegram_message_identity", "facts": ["message_id=9988"]}, {"key": "dispatch_audit", "facts": ["manual_dispatch_proven=true"]}, {"key": "artifact_manifest", "facts": ["archive_path=ok"]}, {"key": "runtime_safety", "facts": ["telegram_dispatched=false"]}, ], "safe_boundaries": [ "do_not_dispatch_telegram_from_telegram_dispatch_archive_summary_api", "telegram_dispatch_archive_summary_preview_only", ], } operator_evidence = { "telegram_dispatch_report_input_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-report-input.json" ), "operator_confirmed_telegram_dispatch_report_input": True, "operator_confirmed_report_input_is_read_only": True, "operator_confirmed_archive_summary_reviewed": True, "operator_confirmed_report_sections_reviewed": True, "operator_confirmed_report_generation_requires_separate_gate": True, "operator_confirmed_no_token_in_report_input": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "report_input_notes": "manual report input reviewed", } report = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input( telegram_dispatch_archive_summary=archive_summary, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input( telegram_dispatch_archive_summary=archive_summary, operator_evidence={ **operator_evidence, "telegram_bot_token": TEST_APPROVAL_TOKEN, }, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input( telegram_dispatch_archive_summary=archive_summary, operator_evidence=operator_evidence, apply_real_write=True, ) assert report["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_preview" ) assert report["target_operation"] == ( "prepare_manual_ai_summary_telegram_dispatch_report_input" ) assert report["telegram_dispatch_report_input_ready"] is True assert report["summary_persistence_telegram_dispatch_report_input_ready"] is True assert report["ready_for_market_intel_report_run_package"] is True assert report["ready_for_report_generation"] is False assert report["ready_for_telegram_dispatch"] is False assert report["ready_for_api_database_write"] is False assert report["ready_for_scheduler_attach"] is False assert report["api_dispatches_telegram"] is False assert report["api_executes_llm"] is False assert report["api_reads_approval_token"] is False assert report["api_writes_file"] is False assert report["api_writes_database"] is False assert report["telegram_dispatch_report_input_file_written"] is False assert report["report_input_file_written"] is False assert report["report_file_written"] is False assert report["report_record_written"] is False assert report["report_manifest_written"] is False assert report["ai_summary_generated"] is False assert report["llm_call_executed"] is False assert report["telegram_dispatched"] is False assert report["telegram_dispatch_attempted"] is False assert report["database_connection_opened"] is False assert report["database_write_executed"] is False assert report["database_commit_executed"] is False assert report["review_state_update_executed"] is False assert report["scheduler_attached"] is False assert report["statement_count"] == 1 assert report["blocked_reasons"] == [] assert report["telegram_dispatch_report_input_contract"][ "contract_version" ] == "market_intel_telegram_dispatch_report_input_v1" assert report["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_run_package" ) assert token_leak["telegram_dispatch_report_input_ready"] is False assert "telegram_dispatch_report_input_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "telegram_dispatch_report_input_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_dispatch_telegram_from_telegram_dispatch_report_input_api" in report[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_input_ready"] is False assert data["summary_persistence_telegram_dispatch_report_input_ready"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_report_input_file_written"] is False assert data["report_input_file_written"] is False assert data["report_file_written"] is False assert data["report_record_written"] is False assert data["report_manifest_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["telegram_dispatch_attempted"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert "telegram_dispatch_archive_summary_ready" in data["blocked_reasons"] assert "operator_confirmed_telegram_dispatch_report_input" in data[ "blocked_reasons" ] assert ( "telegram_dispatch_report_input_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_dispatch_telegram_from_telegram_dispatch_report_input_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_archive_summary_ready"] is False assert ( data["summary_persistence_telegram_dispatch_archive_summary_ready"] is False ) assert data["summary_input_ready"] is False assert data["ready_for_summary_persistence_telegram_dispatch_report_input"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_archive_summary_file_written"] is False assert data["archive_summary_file_written"] is False assert data["telegram_dispatch_archive_file_written"] is False assert data["archive_file_written"] is False assert data["archive_record_written"] is False assert data["archive_manifest_written"] is False assert data["summary_file_written"] is False assert data["summary_record_written"] is False assert data["summary_manifest_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["telegram_dispatch_attempted"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["telegram_dispatch_archive_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_preview" ) assert "telegram_dispatch_archive_ready" in data["blocked_reasons"] assert "telegram_dispatch_archive_summary_artifact_path_recorded" in data[ "blocked_reasons" ] assert "operator_confirmed_telegram_dispatch_archive_summary" in data[ "blocked_reasons" ] assert ( "telegram_dispatch_archive_summary_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_dispatch_telegram_from_telegram_dispatch_archive_summary_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input, ) archive_summary = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary_preview", "target_operation": "prepare_manual_ai_summary_telegram_dispatch_archive_summary_input", "telegram_dispatch_archive_summary_ready": True, "summary_persistence_telegram_dispatch_archive_summary_ready": True, "summary_input_ready": True, "ready_for_next_manual_phase": True, "ready_for_summary_persistence_telegram_dispatch_report_input": True, "statement_count": 1, "expected_summary_payload_hash": "c" * 64, "ready_for_telegram_dispatch": False, "ready_for_manual_telegram_dispatch": False, "ready_for_api_database_write": False, "ready_for_scheduler_attach": False, "ready_for_llm_call": False, "api_executes_cli": False, "api_executes_llm": False, "api_dispatches_telegram": False, "api_reads_approval_token": False, "api_writes_file": False, "api_writes_database": False, "api_updates_review_state": False, "telegram_dispatch_archive_summary_file_written": False, "archive_summary_file_written": False, "telegram_dispatch_archive_file_written": False, "telegram_message_file_written": False, "summary_file_written": False, "summary_record_written": False, "summary_manifest_written": False, "ai_summary_generated": False, "llm_call_executed": False, "telegram_dispatched": False, "telegram_dispatch_attempted": False, "external_network_executed": False, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, "telegram_dispatch_archive_summary": { "message": { "message_id": "9988", "chat_id": "-100123", "telegram_channel_label": "market-intel-alerts", "summary_payload_hash": "c" * 64, "summary_payload_hash_matches_expected": True, }, "dispatch_audit": { "manual_dispatch_proven": True, "api_dispatch_blocked": True, "duplicate_dispatch_ruled_out": True, "receipt_archived": True, "post_closeout_monitoring_confirmed": True, }, "artifact_paths": { "telegram_dispatch_receipt_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-receipt.json" ), "telegram_dispatch_closeout_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-closeout.json" ), "telegram_message_preview_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-message-preview.json" ), "telegram_dispatch_archive_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-archive.json" ), }, }, "telegram_dispatch_archive_summary_sections": [ {"key": "telegram_message_identity", "facts": ["message_id=9988"]}, {"key": "dispatch_audit", "facts": ["manual_dispatch_proven=True"]}, {"key": "artifact_manifest", "facts": ["artifact_path_count=4"]}, {"key": "runtime_safety", "facts": ["llm_call_executed=false"]}, ], "safe_boundaries": [ "do_not_dispatch_telegram_from_telegram_dispatch_archive_summary_api", "telegram_dispatch_archive_summary_preview_only", ], } operator_evidence = { "telegram_dispatch_report_input_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-report-input.json" ), "operator_confirmed_telegram_dispatch_report_input": True, "operator_confirmed_report_input_is_read_only": True, "operator_confirmed_archive_summary_reviewed": True, "operator_confirmed_report_sections_reviewed": True, "operator_confirmed_report_generation_requires_separate_gate": True, "operator_confirmed_no_token_in_report_input": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "report_input_notes": "manual Telegram dispatch report input reviewed", } report_input = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input( telegram_dispatch_archive_summary=archive_summary, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input( telegram_dispatch_archive_summary=archive_summary, operator_evidence={ **operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN, }, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input( telegram_dispatch_archive_summary=archive_summary, operator_evidence=operator_evidence, apply_real_write=True, ) assert report_input["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_preview" ) assert report_input["target_operation"] == ( "prepare_manual_ai_summary_telegram_dispatch_report_input" ) assert report_input["telegram_dispatch_report_input_ready"] is True assert report_input["summary_persistence_telegram_dispatch_report_input_ready"] is True assert report_input["report_input_ready"] is True assert report_input["ready_for_market_intel_report_run_package"] is True assert report_input["ready_for_report_generation"] is False assert report_input["ready_for_telegram_dispatch"] is False assert report_input["ready_for_api_database_write"] is False assert report_input["ready_for_scheduler_attach"] is False assert report_input["api_dispatches_telegram"] is False assert report_input["api_executes_llm"] is False assert report_input["api_reads_approval_token"] is False assert report_input["api_writes_file"] is False assert report_input["api_writes_database"] is False assert report_input["telegram_dispatch_report_input_file_written"] is False assert report_input["report_input_file_written"] is False assert report_input["report_file_written"] is False assert report_input["report_record_written"] is False assert report_input["report_manifest_written"] is False assert report_input["ai_summary_generated"] is False assert report_input["llm_call_executed"] is False assert report_input["telegram_dispatched"] is False assert report_input["telegram_dispatch_attempted"] is False assert report_input["database_connection_opened"] is False assert report_input["database_write_executed"] is False assert report_input["database_commit_executed"] is False assert report_input["review_state_update_executed"] is False assert report_input["scheduler_attached"] is False assert report_input["statement_count"] == 1 assert report_input["blocked_reasons"] == [] assert report_input["telegram_dispatch_archive_summary_input"]["message"][ "message_id" ] == "9988" assert report_input["telegram_dispatch_report_input_contract"][ "contract_version" ] == "market_intel_telegram_dispatch_report_input_v1" assert report_input["telegram_dispatch_report_input_sections"] assert report_input["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_run_package" ) assert token_leak["telegram_dispatch_report_input_ready"] is False assert ( "telegram_dispatch_report_input_no_token_submitted_to_api" in token_leak["blocked_reasons"] ) assert ( "telegram_dispatch_report_input_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_generate_report_from_telegram_dispatch_report_input_api" in report_input[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_input_ready"] is False assert data["summary_persistence_telegram_dispatch_report_input_ready"] is False assert data["report_input_ready"] is False assert data["ready_for_market_intel_report_run_package"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_report_input_file_written"] is False assert data["report_input_file_written"] is False assert data["report_file_written"] is False assert data["report_record_written"] is False assert data["report_manifest_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["telegram_dispatch_attempted"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["telegram_dispatch_archive_summary_input"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary_preview" ) assert "telegram_dispatch_archive_summary_ready" in data["blocked_reasons"] assert "telegram_dispatch_report_input_artifact_path_recorded" in data[ "blocked_reasons" ] assert "operator_confirmed_telegram_dispatch_report_input" in data[ "blocked_reasons" ] assert ( "telegram_dispatch_report_input_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_generate_report_from_telegram_dispatch_report_input_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package, ) report_input = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_preview", "target_operation": "prepare_manual_ai_summary_telegram_dispatch_report_input", "telegram_dispatch_report_input_ready": True, "summary_persistence_telegram_dispatch_report_input_ready": True, "report_input_ready": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_run_package": True, "ready_for_report_generation": False, "statement_count": 1, "expected_summary_payload_hash": "c" * 64, "ready_for_telegram_dispatch": False, "ready_for_manual_telegram_dispatch": False, "ready_for_api_database_write": False, "ready_for_scheduler_attach": False, "ready_for_llm_call": False, "api_executes_cli": False, "api_executes_llm": False, "api_dispatches_telegram": False, "api_reads_approval_token": False, "api_writes_file": False, "api_writes_database": False, "api_updates_review_state": False, "telegram_dispatch_report_input_file_written": False, "report_input_file_written": False, "report_file_written": False, "report_record_written": False, "report_manifest_written": False, "ai_summary_generated": False, "llm_call_executed": False, "telegram_dispatched": False, "telegram_dispatch_attempted": False, "external_network_executed": False, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, "blocked_reasons": [], "telegram_dispatch_archive_summary_input": { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary_preview", "statement_count": 1, "telegram_dispatch_archive_summary_ready": True, "side_effects_clear": True, }, "telegram_dispatch_report_input_sections": [ {"key": "executive_context", "facts": ["statement_count=1"]}, {"key": "telegram_message_evidence", "facts": ["message_id=9988"]}, { "key": "dispatch_audit_evidence", "facts": ["manual_dispatch_proven=True"], }, {"key": "artifact_traceability", "facts": ["receipt_path=ok"]}, {"key": "runtime_safety", "facts": ["llm_call_executed=false"]}, ], "telegram_dispatch_report_input_contract": { "contract_version": "market_intel_telegram_dispatch_report_input_v1", "language": "zh-TW", "source_mode": ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary_preview" ), "target_report_family": "market_intel_telegram_dispatch_audit_report", "required_sections": [ "executive_context", "telegram_message_evidence", "dispatch_audit_evidence", "artifact_traceability", "runtime_safety", ], "evidence_refs": { "message_id": "9988", "chat_id": "-100123", "telegram_channel_label": "market-intel-alerts", "summary_payload_hash": "c" * 64, "artifact_paths": { "telegram_dispatch_receipt_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-receipt.json" ), "telegram_dispatch_closeout_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-closeout.json" ), "telegram_message_preview_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-message-preview.json" ), "telegram_dispatch_archive_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-archive.json" ), }, }, }, "safe_boundaries": [ "do_not_generate_report_from_telegram_dispatch_report_input_api", "telegram_dispatch_report_input_preview_only", ], } operator_evidence = { "telegram_dispatch_report_run_package_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-report-run-package.json" ), "operator_confirmed_telegram_dispatch_report_run_package": True, "operator_confirmed_report_run_package_is_read_only": True, "operator_confirmed_report_input_reviewed": True, "operator_confirmed_report_package_reviewed": True, "operator_confirmed_report_generation_requires_readiness_gate": True, "operator_confirmed_no_token_in_report_run_package": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "report_run_package_notes": "manual report run package reviewed", } run_package = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package( telegram_dispatch_report_input=report_input, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package( telegram_dispatch_report_input=report_input, operator_evidence={ **operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN, }, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package( telegram_dispatch_report_input=report_input, operator_evidence=operator_evidence, apply_real_write=True, ) assert run_package["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package_preview" ) assert run_package["target_operation"] == ( "prepare_manual_market_intel_report_run_package" ) assert run_package["telegram_dispatch_report_run_package_ready"] is True assert ( run_package[ "summary_persistence_telegram_dispatch_report_run_package_ready" ] is True ) assert run_package["report_run_package_ready"] is True assert run_package["ready_for_market_intel_report_run_readiness"] is True assert run_package["ready_for_report_generation"] is False assert run_package["ready_for_telegram_dispatch"] is False assert run_package["ready_for_api_database_write"] is False assert run_package["ready_for_scheduler_attach"] is False assert run_package["api_dispatches_telegram"] is False assert run_package["api_executes_llm"] is False assert run_package["api_reads_approval_token"] is False assert run_package["api_writes_file"] is False assert run_package["api_writes_database"] is False assert run_package["telegram_dispatch_report_run_package_file_written"] is False assert run_package["report_run_package_file_written"] is False assert run_package["telegram_dispatch_report_input_file_written"] is False assert run_package["report_input_file_written"] is False assert run_package["report_file_written"] is False assert run_package["report_record_written"] is False assert run_package["report_manifest_written"] is False assert run_package["ai_summary_generated"] is False assert run_package["llm_call_executed"] is False assert run_package["telegram_dispatched"] is False assert run_package["telegram_dispatch_attempted"] is False assert run_package["database_connection_opened"] is False assert run_package["database_write_executed"] is False assert run_package["database_commit_executed"] is False assert run_package["review_state_update_executed"] is False assert run_package["scheduler_attached"] is False assert run_package["statement_count"] == 1 assert run_package["blocked_reasons"] == [] assert run_package["telegram_dispatch_report_input_summary"][ "report_contract_version" ] == "market_intel_telegram_dispatch_report_input_v1" assert run_package["telegram_dispatch_report_run_package"][ "contract_version" ] == "market_intel_telegram_dispatch_report_run_package_v1" assert run_package["telegram_dispatch_report_run_package_sections"] assert run_package["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_run_readiness" ) assert token_leak["telegram_dispatch_report_run_package_ready"] is False assert ( "telegram_dispatch_report_run_package_no_token_submitted_to_api" in token_leak["blocked_reasons"] ) assert ( "telegram_dispatch_report_run_package_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_generate_report_from_telegram_dispatch_report_run_package_api" in run_package[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_run_package_ready"] is False assert ( data["summary_persistence_telegram_dispatch_report_run_package_ready"] is False ) assert data["report_run_package_ready"] is False assert data["ready_for_market_intel_report_run_readiness"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_report_run_package_file_written"] is False assert data["report_run_package_file_written"] is False assert data["report_file_written"] is False assert data["report_record_written"] is False assert data["report_manifest_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["telegram_dispatch_attempted"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["telegram_dispatch_report_input_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_preview" ) assert "telegram_dispatch_report_input_ready" in data["blocked_reasons"] assert "telegram_dispatch_report_run_package_artifact_path_recorded" in data[ "blocked_reasons" ] assert "operator_confirmed_telegram_dispatch_report_run_package" in data[ "blocked_reasons" ] assert ( "telegram_dispatch_report_run_package_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_generate_report_from_telegram_dispatch_report_run_package_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness, ) report_run_package = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package_preview", "target_operation": "prepare_manual_market_intel_report_run_package", "telegram_dispatch_report_run_package_ready": True, "summary_persistence_telegram_dispatch_report_run_package_ready": True, "report_run_package_ready": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_run_readiness": True, "ready_for_report_generation": False, "statement_count": 1, "expected_summary_payload_hash": "c" * 64, "ready_for_telegram_dispatch": False, "ready_for_manual_telegram_dispatch": False, "ready_for_api_database_write": False, "ready_for_scheduler_attach": False, "ready_for_llm_call": False, "api_executes_cli": False, "api_executes_llm": False, "api_dispatches_telegram": False, "api_reads_approval_token": False, "api_writes_file": False, "api_writes_database": False, "api_updates_review_state": False, "telegram_dispatch_report_run_package_file_written": False, "report_run_package_file_written": False, "telegram_dispatch_report_input_file_written": False, "report_input_file_written": False, "report_file_written": False, "report_record_written": False, "report_manifest_written": False, "ai_summary_generated": False, "llm_call_executed": False, "telegram_dispatched": False, "telegram_dispatch_attempted": False, "external_network_executed": False, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, "blocked_reasons": [], "telegram_dispatch_report_run_package_sections": [ {"key": "source_report_input", "facts": ["source_mode=ok"]}, {"key": "report_contract", "facts": ["contract=ok"]}, {"key": "evidence_manifest", "facts": ["message_id=9988"]}, {"key": "execution_boundaries", "facts": ["api_generates_report=false"]}, {"key": "future_readiness_gate", "facts": ["next=readiness"]}, ], "telegram_dispatch_report_run_package": { "contract_version": "market_intel_telegram_dispatch_report_run_package_v1", "language": "zh-TW", "source_mode": ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_preview" ), "source_contract_version": ( "market_intel_telegram_dispatch_report_input_v1" ), "target_report_family": "market_intel_telegram_dispatch_audit_report", "required_package_sections": [ "source_report_input", "report_contract", "evidence_manifest", "execution_boundaries", "future_readiness_gate", ], "source_required_sections": [ "executive_context", "telegram_message_evidence", "dispatch_audit_evidence", "artifact_traceability", "runtime_safety", ], "intended_report_artifacts": [ "telegram_dispatch_audit_report_payload", "report_generation_readiness_packet", ], "evidence_refs": { "message_id": "9988", "chat_id": "-100123", "telegram_channel_label": "market-intel-alerts", "summary_payload_hash": "c" * 64, "artifact_paths": { "telegram_dispatch_receipt_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-receipt.json" ), "telegram_dispatch_closeout_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-closeout.json" ), "telegram_message_preview_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-message-preview.json" ), "telegram_dispatch_archive_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-archive.json" ), }, }, "execution_boundaries": { "api_generates_report": False, "api_writes_report_file": False, "api_calls_llm": False, "api_dispatches_telegram": False, "api_writes_database": False, "api_attaches_scheduler": False, }, }, "safe_boundaries": [ "do_not_generate_report_from_telegram_dispatch_report_run_package_api", "telegram_dispatch_report_run_package_preview_only", ], } operator_evidence = { "telegram_dispatch_report_run_package_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-report-run-package.json" ), "telegram_dispatch_report_run_readiness_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-report-run-readiness.json" ), "report_output_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report.json" ), "operator_confirmed_telegram_dispatch_report_run_readiness": True, "operator_confirmed_report_run_package_reviewed": True, "operator_confirmed_report_contract_reviewed": True, "operator_confirmed_report_generation_is_manual_only": True, "operator_confirmed_report_output_requires_receipt": True, "operator_confirmed_no_token_in_report_readiness": True, "operator_confirmed_no_api_report_generation": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "report_run_readiness_notes": "manual report run readiness reviewed", } readiness = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness( telegram_dispatch_report_run_package=report_run_package, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness( telegram_dispatch_report_run_package=report_run_package, operator_evidence={ **operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN, }, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness( telegram_dispatch_report_run_package=report_run_package, operator_evidence=operator_evidence, apply_real_write=True, ) assert readiness["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness_preview" ) assert readiness["target_operation"] == ( "manual_market_intel_report_run_readiness" ) assert readiness["telegram_dispatch_report_run_readiness_ready"] is True assert ( readiness[ "summary_persistence_telegram_dispatch_report_run_readiness_ready" ] is True ) assert readiness["report_run_readiness_ready"] is True assert readiness["ready_for_market_intel_report_run_receipt"] is True assert readiness["ready_for_manual_report_generation"] is True assert readiness["ready_for_report_generation"] is False assert readiness["ready_for_telegram_dispatch"] is False assert readiness["ready_for_api_database_write"] is False assert readiness["ready_for_scheduler_attach"] is False assert readiness["api_dispatches_telegram"] is False assert readiness["api_executes_llm"] is False assert readiness["api_reads_approval_token"] is False assert readiness["api_writes_file"] is False assert readiness["api_writes_database"] is False assert readiness["telegram_dispatch_report_run_readiness_file_written"] is False assert readiness["report_run_readiness_file_written"] is False assert readiness["report_file_written"] is False assert readiness["report_record_written"] is False assert readiness["report_manifest_written"] is False assert readiness["ai_summary_generated"] is False assert readiness["llm_call_executed"] is False assert readiness["telegram_dispatched"] is False assert readiness["database_connection_opened"] is False assert readiness["database_write_executed"] is False assert readiness["database_commit_executed"] is False assert readiness["review_state_update_executed"] is False assert readiness["scheduler_attached"] is False assert readiness["statement_count"] == 1 assert readiness["blocked_reasons"] == [] assert readiness["report_generation_readiness_manifest"][ "manifest_version" ] == "market_intel_report_run_readiness_v1" assert readiness["report_generation_readiness_manifest"][ "manual_generation_command" ]["executed_by_api"] is False assert readiness["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_run_receipt" ) assert token_leak["telegram_dispatch_report_run_readiness_ready"] is False assert ( "telegram_dispatch_report_run_readiness_no_token_submitted_to_api" in token_leak["blocked_reasons"] ) assert ( "telegram_dispatch_report_run_readiness_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_generate_report_from_telegram_dispatch_report_run_readiness_api" in readiness[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_run_readiness_ready"] is False assert ( data["summary_persistence_telegram_dispatch_report_run_readiness_ready"] is False ) assert data["report_run_readiness_ready"] is False assert data["ready_for_market_intel_report_run_receipt"] is False assert data["ready_for_manual_report_generation"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_report_run_readiness_file_written"] is False assert data["report_run_readiness_file_written"] is False assert data["report_file_written"] is False assert data["report_record_written"] is False assert data["report_manifest_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["telegram_dispatch_report_run_package_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package_preview" ) assert "telegram_dispatch_report_run_package_ready" in data[ "blocked_reasons" ] assert "report_run_readiness_artifacts_recorded" in data["blocked_reasons"] assert "operator_confirmed_telegram_dispatch_report_run_readiness" in data[ "blocked_reasons" ] assert ( "telegram_dispatch_report_run_readiness_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_generate_report_from_telegram_dispatch_report_run_readiness_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt, ) readiness = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness_preview", "telegram_dispatch_report_run_readiness_ready": True, "report_run_readiness_ready": True, "ready_for_market_intel_report_run_receipt": True, "ready_for_manual_report_generation": True, "ready_for_report_generation": False, "statement_count": 1, "expected_summary_payload_hash": "c" * 64, "ready_for_telegram_dispatch": False, "ready_for_api_database_write": False, "ready_for_scheduler_attach": False, "ready_for_llm_call": False, "api_executes_cli": False, "api_executes_llm": False, "api_dispatches_telegram": False, "api_reads_approval_token": False, "api_writes_file": False, "api_writes_database": False, "api_updates_review_state": False, "telegram_dispatch_report_run_readiness_file_written": False, "report_run_readiness_file_written": False, "report_file_written": False, "report_record_written": False, "report_manifest_written": False, "ai_summary_generated": False, "llm_call_executed": False, "telegram_dispatched": False, "telegram_dispatch_attempted": False, "external_network_executed": False, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, "blocked_reasons": [], "report_generation_readiness_manifest": { "manifest_version": "market_intel_report_run_readiness_v1", "source_contract_version": "market_intel_telegram_dispatch_report_input_v1", "target_report_family": "market_intel_telegram_dispatch_audit_report", "language": "zh-TW", "expected_summary_payload_hash": "c" * 64, "intended_report_artifacts": [ "telegram_dispatch_audit_report_payload", "report_generation_readiness_packet", ], "required_package_sections": [ "source_report_input", "report_contract", "evidence_manifest", "execution_boundaries", "future_readiness_gate", ], "evidence_refs": { "message_id": "9988", "chat_id": "-100123", "telegram_channel_label": "market-intel-alerts", "summary_payload_hash": "c" * 64, }, "manual_generation_command": { "key": "manual_market_intel_report_generation", "executes_report_generation": True, "executes_database": False, "executes_telegram": False, "executed_by_api": False, }, "execution_boundaries": { "api_generates_report": False, "api_writes_report_file": False, "api_calls_llm": False, "api_dispatches_telegram": False, "api_writes_database": False, "api_attaches_scheduler": False, }, }, } report_receipt = { "mode": "market_intel_report_generation_manual_receipt", "report_generated": True, "target_report_family": "market_intel_telegram_dispatch_audit_report", "language": "zh-TW", "report_output_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report.json" ), "report_output_hash": "d" * 64, "report_format": "json", "summary_payload_hash": "c" * 64, "source_readiness_manifest_version": "market_intel_report_run_readiness_v1", "section_keys": [ "executive_context", "telegram_message_evidence", "dispatch_audit_evidence", "artifact_traceability", "runtime_safety", ], "execution_boundaries": { "api_generates_report": False, "api_writes_file": False, "api_calls_llm": False, "api_dispatches_telegram": False, "api_writes_database": False, }, } operator_evidence = { "telegram_dispatch_report_run_package_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-report-run-package.json" ), "telegram_dispatch_report_run_readiness_artifact_path": ( "artifacts/market_intel/ai-summary-telegram-dispatch-report-run-readiness.json" ), "report_output_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report.json" ), "report_run_receipt_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report-receipt.json" ), "operator_confirmed_report_run_receipt": True, "operator_confirmed_report_output_hash_matched": True, "operator_confirmed_report_sections_reviewed": True, "operator_confirmed_no_token_in_report_receipt": True, "operator_confirmed_no_api_report_generation": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "report_run_receipt_notes": "manual report receipt reviewed", } receipt = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt( telegram_dispatch_report_run_readiness=readiness, report_run_receipt=report_receipt, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt( telegram_dispatch_report_run_readiness=readiness, report_run_receipt={**report_receipt, "telegram_token": TEST_APPROVAL_TOKEN}, operator_evidence=operator_evidence, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt( telegram_dispatch_report_run_readiness=readiness, report_run_receipt=report_receipt, operator_evidence=operator_evidence, apply_real_write=True, ) assert receipt["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt_preview" ) assert receipt["target_operation"] == ( "review_manual_market_intel_report_run_receipt" ) assert receipt["telegram_dispatch_report_run_receipt_passed"] is True assert ( receipt[ "summary_persistence_telegram_dispatch_report_run_receipt_passed" ] is True ) assert receipt["report_run_receipt_passed"] is True assert receipt["ready_for_market_intel_report_closeout"] is True assert receipt["ready_for_report_generation"] is False assert receipt["ready_for_telegram_dispatch"] is False assert receipt["ready_for_api_database_write"] is False assert receipt["ready_for_scheduler_attach"] is False assert receipt["api_dispatches_telegram"] is False assert receipt["api_executes_llm"] is False assert receipt["api_reads_approval_token"] is False assert receipt["api_writes_file"] is False assert receipt["api_writes_database"] is False assert receipt["telegram_dispatch_report_run_receipt_file_written"] is False assert receipt["report_run_receipt_file_written"] is False assert receipt["report_receipt_file_written"] is False assert receipt["report_output_file_written"] is False assert receipt["report_file_written"] is False assert receipt["report_record_written"] is False assert receipt["report_manifest_written"] is False assert receipt["ai_summary_generated"] is False assert receipt["llm_call_executed"] is False assert receipt["telegram_dispatched"] is False assert receipt["database_connection_opened"] is False assert receipt["database_write_executed"] is False assert receipt["database_commit_executed"] is False assert receipt["review_state_update_executed"] is False assert receipt["scheduler_attached"] is False assert receipt["statement_count"] == 1 assert receipt["blocked_reasons"] == [] assert receipt["telegram_dispatch_report_run_receipt_summary"][ "summary_payload_hash_matches_expected" ] is True assert receipt["telegram_dispatch_report_run_receipt_summary"][ "required_report_sections_present" ] is True assert receipt["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_closeout" ) assert token_leak["telegram_dispatch_report_run_receipt_passed"] is False assert "report_run_receipt_no_token_key" in token_leak["blocked_reasons"] assert ( "report_run_receipt_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_generate_report_from_report_run_receipt_api" in receipt[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_run_receipt_passed"] is False assert ( data["summary_persistence_telegram_dispatch_report_run_receipt_passed"] is False ) assert data["report_run_receipt_passed"] is False assert data["ready_for_market_intel_report_closeout"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_report_run_receipt_file_written"] is False assert data["report_run_receipt_file_written"] is False assert data["report_receipt_file_written"] is False assert data["report_output_file_written"] is False assert data["report_file_written"] is False assert data["report_record_written"] is False assert data["report_manifest_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["telegram_dispatch_report_run_readiness_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness_preview" ) assert "report_run_readiness_passed_before_manual_report_generation" in data[ "blocked_reasons" ] assert "report_run_receipt_provided" in data["blocked_reasons"] assert "operator_confirmed_report_run_receipt" in data["blocked_reasons"] assert ( "report_run_receipt_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_generate_report_from_report_run_receipt_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout, ) report_run_receipt = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt_preview", "target_operation": "review_manual_market_intel_report_run_receipt", "telegram_dispatch_report_run_receipt_passed": True, "summary_persistence_telegram_dispatch_report_run_receipt_passed": True, "report_run_receipt_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_closeout": True, "ready_for_report_generation": False, "ready_for_api_database_write": False, "ready_for_telegram_dispatch": False, "ready_for_scheduler_attach": False, "api_executes_cli": False, "api_executes_llm": False, "api_dispatches_telegram": False, "api_reads_approval_token": False, "api_writes_file": False, "api_writes_database": False, "api_updates_review_state": False, "telegram_dispatch_report_run_receipt_file_written": False, "report_run_receipt_file_written": False, "report_file_written": False, "report_record_written": False, "report_manifest_written": False, "ai_summary_generated": False, "llm_call_executed": False, "telegram_dispatched": False, "telegram_dispatch_attempted": False, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, "blocked_reasons": [], "statement_count": 1, "expected_summary_payload_hash": "c" * 64, "telegram_dispatch_report_run_readiness_summary": { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness_preview", "telegram_dispatch_report_run_readiness_ready": True, "ready_for_market_intel_report_run_receipt": True, "manifest_version": "market_intel_report_run_readiness_v1", }, "telegram_dispatch_report_run_receipt_summary": { "provided": True, "mode": "market_intel_report_generation_manual_receipt", "report_generated": True, "target_report_family": "market_intel_telegram_dispatch_audit_report", "language": "zh-TW", "report_output_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report.json" ), "report_output_hash": "d" * 64, "summary_payload_hash": "c" * 64, "expected_summary_payload_hash": "c" * 64, "summary_payload_hash_matches_expected": True, "required_report_sections_present": True, "section_keys": [ "executive_context", "telegram_message_evidence", "dispatch_audit_evidence", "artifact_traceability", "runtime_safety", ], "approval_or_telegram_token_key_detected": False, }, "safe_boundaries": [ "do_not_read_approval_token_from_report_run_receipt_api", "do_not_read_telegram_token_from_report_run_receipt_api", "do_not_call_llm_from_report_run_receipt", "do_not_generate_report_from_report_run_receipt_api", "do_not_write_report_artifact_from_report_run_receipt_api", "do_not_dispatch_telegram_from_report_run_receipt_api", "do_not_open_database_connection_from_report_run_receipt", "do_not_update_review_state_from_report_run_receipt", "do_not_attach_scheduler_from_report_run_receipt", ], } operator_evidence = { "report_closeout_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report-closeout.json" ), "report_run_receipt_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report-receipt.json" ), "report_output_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report.json" ), "operator_confirmed_report_closeout": True, "operator_confirmed_report_receipt_archived": True, "operator_confirmed_report_output_hash_matched": True, "operator_confirmed_report_sections_reviewed": True, "operator_confirmed_report_archive_requires_separate_gate": True, "operator_confirmed_no_token_in_report_closeout": True, "operator_confirmed_no_api_report_generation": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "report_closeout_notes": "manual report closeout reviewed", } closeout = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout( telegram_dispatch_report_run_receipt=report_run_receipt, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout( telegram_dispatch_report_run_receipt=report_run_receipt, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout( telegram_dispatch_report_run_receipt=report_run_receipt, operator_evidence=operator_evidence, apply_real_write=True, ) assert closeout["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout_preview" ) assert closeout["target_operation"] == "closeout_manual_market_intel_report" assert closeout["telegram_dispatch_report_closeout_passed"] is True assert ( closeout[ "summary_persistence_telegram_dispatch_report_closeout_passed" ] is True ) assert closeout["report_closeout_passed"] is True assert closeout["ready_for_market_intel_report_archive"] is True assert closeout["ready_for_report_generation"] is False assert closeout["ready_for_telegram_dispatch"] is False assert closeout["ready_for_api_database_write"] is False assert closeout["ready_for_scheduler_attach"] is False assert closeout["api_dispatches_telegram"] is False assert closeout["api_executes_llm"] is False assert closeout["api_reads_approval_token"] is False assert closeout["api_writes_file"] is False assert closeout["api_writes_database"] is False assert closeout["telegram_dispatch_report_closeout_file_written"] is False assert closeout["report_closeout_file_written"] is False assert closeout["report_file_written"] is False assert closeout["telegram_dispatched"] is False assert closeout["database_connection_opened"] is False assert closeout["database_write_executed"] is False assert closeout["database_commit_executed"] is False assert closeout["review_state_update_executed"] is False assert closeout["scheduler_attached"] is False assert closeout["blocked_reasons"] == [] assert closeout["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_archive" ) assert token_leak["telegram_dispatch_report_closeout_passed"] is False assert "report_closeout_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_closeout_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_generate_report_from_report_closeout_api" in closeout[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_closeout_passed"] is False assert ( data["summary_persistence_telegram_dispatch_report_closeout_passed"] is False ) assert data["report_closeout_passed"] is False assert data["ready_for_market_intel_report_archive"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_report_closeout_file_written"] is False assert data["report_closeout_file_written"] is False assert data["report_file_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_run_receipt_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt_preview" ) assert "report_run_receipt_passed" in data["blocked_reasons"] assert "report_closeout_artifacts_recorded" in data["blocked_reasons"] assert "operator_confirmed_report_closeout" in data["blocked_reasons"] assert ( "report_closeout_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_generate_report_from_report_closeout_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive, ) report_closeout = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout_preview", "target_operation": "closeout_manual_market_intel_report", "telegram_dispatch_report_closeout_passed": True, "summary_persistence_telegram_dispatch_report_closeout_passed": True, "report_closeout_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_archive": True, "ready_for_report_generation": False, "ready_for_api_database_write": False, "ready_for_telegram_dispatch": False, "ready_for_scheduler_attach": False, "api_executes_cli": False, "api_executes_llm": False, "api_dispatches_telegram": False, "api_reads_approval_token": False, "api_writes_file": False, "api_writes_database": False, "api_updates_review_state": False, "telegram_dispatch_report_closeout_file_written": False, "report_closeout_file_written": False, "report_file_written": False, "report_record_written": False, "report_manifest_written": False, "archive_file_written": False, "archive_record_written": False, "archive_manifest_written": False, "ai_summary_generated": False, "llm_call_executed": False, "telegram_dispatched": False, "telegram_dispatch_attempted": False, "database_connection_opened": False, "database_write_executed": False, "database_commit_executed": False, "review_state_update_executed": False, "scheduler_attached": False, "blocked_reasons": [], "statement_count": 1, "expected_summary_payload_hash": "c" * 64, "telegram_dispatch_report_run_receipt_summary": { "provided": True, "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt_preview", "report_receipt_mode": "market_intel_report_generation_manual_receipt", "target_report_family": "market_intel_telegram_dispatch_audit_report", "language": "zh-TW", "report_output_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report.json" ), "report_output_hash": "d" * 64, "summary_payload_hash": "c" * 64, "expected_summary_payload_hash": "c" * 64, "summary_payload_hash_matches_expected": True, "required_report_sections_present": True, "section_keys": [ "executive_context", "telegram_message_evidence", "dispatch_audit_evidence", "artifact_traceability", "runtime_safety", ], }, "operator_telegram_dispatch_report_closeout": { "report_closeout_artifact_path_recorded": True, "report_run_receipt_artifact_path_recorded": True, "report_output_artifact_path_recorded": True, "operator_confirmed_report_closeout": True, "operator_confirmed_report_receipt_archived": True, "operator_confirmed_report_output_hash_matched": True, "operator_confirmed_report_sections_reviewed": True, "operator_confirmed_report_archive_requires_separate_gate": True, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_archive", "report_archive_requires_separate_gate": True, }, "safe_boundaries": [ "do_not_read_approval_token_from_report_closeout_api", "do_not_read_telegram_token_from_report_closeout_api", "do_not_call_llm_from_report_closeout", "do_not_generate_report_from_report_closeout_api", "do_not_write_report_artifact_from_report_closeout_api", "do_not_dispatch_telegram_from_report_closeout_api", "do_not_open_database_connection_from_report_closeout", "do_not_update_review_state_from_report_closeout", "do_not_attach_scheduler_from_report_closeout", "future_market_intel_report_archive_must_use_separate_gate", ], } operator_evidence = { "report_archive_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report-archive.json" ), "report_closeout_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report-closeout.json" ), "report_run_receipt_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report-receipt.json" ), "report_output_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report.json" ), "operator_confirmed_report_archive": True, "operator_confirmed_report_closeout_archived": True, "operator_confirmed_report_receipt_archived": True, "operator_confirmed_report_output_archived": True, "operator_confirmed_report_output_hash_matched": True, "operator_confirmed_report_sections_reviewed": True, "operator_confirmed_archive_manifest_reviewed": True, "operator_confirmed_archive_retention_policy_recorded": True, "operator_confirmed_report_archive_summary_requires_separate_gate": True, "operator_confirmed_no_token_in_report_archive": True, "operator_confirmed_no_api_report_generation": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "report_archive_notes": "manual report archive reviewed", } archive = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive( telegram_dispatch_report_closeout=report_closeout, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive( telegram_dispatch_report_closeout=report_closeout, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive( telegram_dispatch_report_closeout=report_closeout, operator_evidence=operator_evidence, apply_real_write=True, ) assert archive["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_preview" ) assert archive["target_operation"] == "archive_manual_market_intel_report" assert archive["telegram_dispatch_report_archive_passed"] is True assert ( archive[ "summary_persistence_telegram_dispatch_report_archive_passed" ] is True ) assert archive["report_archive_passed"] is True assert archive["ready_for_market_intel_report_archive_summary"] is True assert archive["ready_for_report_generation"] is False assert archive["ready_for_telegram_dispatch"] is False assert archive["ready_for_api_database_write"] is False assert archive["ready_for_scheduler_attach"] is False assert archive["api_dispatches_telegram"] is False assert archive["api_executes_llm"] is False assert archive["api_reads_approval_token"] is False assert archive["api_writes_file"] is False assert archive["api_writes_database"] is False assert archive["telegram_dispatch_report_archive_file_written"] is False assert archive["report_archive_file_written"] is False assert archive["archive_file_written"] is False assert archive["report_file_written"] is False assert archive["telegram_dispatched"] is False assert archive["database_connection_opened"] is False assert archive["database_write_executed"] is False assert archive["database_commit_executed"] is False assert archive["review_state_update_executed"] is False assert archive["scheduler_attached"] is False assert archive["blocked_reasons"] == [] assert archive["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_archive_summary" ) assert token_leak["telegram_dispatch_report_archive_passed"] is False assert "report_archive_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_archive_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_generate_report_from_report_archive_api" in archive[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_archive_passed"] is False assert ( data["summary_persistence_telegram_dispatch_report_archive_passed"] is False ) assert data["report_archive_passed"] is False assert data["ready_for_market_intel_report_archive_summary"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_report_archive_file_written"] is False assert data["report_archive_file_written"] is False assert data["archive_file_written"] is False assert data["report_file_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_closeout_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout_preview" ) assert "report_closeout_passed" in data["blocked_reasons"] assert "report_archive_artifacts_recorded" in data["blocked_reasons"] assert "operator_confirmed_report_archive" in data["blocked_reasons"] assert ( "report_archive_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_generate_report_from_report_archive_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary, ) report_archive = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_preview", "target_operation": "archive_manual_market_intel_report", "telegram_dispatch_report_archive_passed": True, "summary_persistence_telegram_dispatch_report_archive_passed": True, "report_archive_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_archive_summary": True, "statement_count": 1, "expected_summary_payload_hash": "c" * 64, "telegram_dispatch_report_closeout_summary": { "target_report_family": "market_intel_telegram_dispatch_audit_report", "language": "zh-TW", "report_output_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report.json" ), "report_output_hash": "d" * 64, "summary_payload_hash": "c" * 64, "summary_payload_hash_matches_expected": True, "required_report_sections_present": True, "section_keys": [ "executive_context", "telegram_message_evidence", "dispatch_audit_evidence", "artifact_traceability", "runtime_safety", ], }, "operator_telegram_dispatch_report_archive": { "report_archive_artifact_path_recorded": True, "report_closeout_artifact_path_recorded": True, "report_run_receipt_artifact_path_recorded": True, "report_output_artifact_path_recorded": True, "operator_confirmed_report_archive": True, "operator_confirmed_report_closeout_archived": True, "operator_confirmed_report_receipt_archived": True, "operator_confirmed_report_output_archived": True, "operator_confirmed_report_output_hash_matched": True, "operator_confirmed_report_sections_reviewed": True, "operator_confirmed_archive_manifest_reviewed": True, "operator_confirmed_archive_retention_policy_recorded": True, "operator_confirmed_report_archive_summary_requires_separate_gate": True, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_archive_summary", "report_archive_summary_requires_separate_gate": True, }, "safe_boundaries": [ "do_not_read_approval_token_from_report_archive_api", "do_not_read_telegram_token_from_report_archive_api", "do_not_call_llm_from_report_archive", "do_not_generate_report_from_report_archive_api", "do_not_write_archive_artifact_from_report_archive_api", "do_not_dispatch_telegram_from_report_archive_api", "do_not_open_database_connection_from_report_archive", "do_not_update_review_state_from_report_archive", "do_not_attach_scheduler_from_report_archive", "future_market_intel_report_archive_summary_must_use_separate_gate", ], } operator_evidence = { "report_archive_summary_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report-archive-summary.json" ), "report_archive_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report-archive.json" ), "report_closeout_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report-closeout.json" ), "report_run_receipt_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report-receipt.json" ), "report_output_artifact_path": ( "artifacts/market_intel/telegram-dispatch-audit-report.json" ), "operator_confirmed_report_archive_summary": True, "operator_confirmed_report_archive_summary_read_only": True, "operator_confirmed_report_archive_reviewed": True, "operator_confirmed_report_traceability_reviewed": True, "operator_confirmed_report_catalog_handoff_requires_separate_gate": True, "operator_confirmed_no_token_in_report_archive_summary": True, "operator_confirmed_no_api_report_generation": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "report_archive_summary_notes": "manual report archive summary reviewed", } summary = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary( telegram_dispatch_report_archive=report_archive, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary( telegram_dispatch_report_archive=report_archive, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary( telegram_dispatch_report_archive=report_archive, operator_evidence=operator_evidence, apply_real_write=True, ) assert summary["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary_preview" ) assert summary["target_operation"] == "summarize_archived_market_intel_report" assert summary["telegram_dispatch_report_archive_summary_passed"] is True assert ( summary[ "summary_persistence_telegram_dispatch_report_archive_summary_passed" ] is True ) assert summary["report_archive_summary_passed"] is True assert summary["ready_for_market_intel_report_catalog_handoff"] is True assert summary["ready_for_report_generation"] is False assert summary["ready_for_telegram_dispatch"] is False assert summary["ready_for_api_database_write"] is False assert summary["ready_for_scheduler_attach"] is False assert summary["api_dispatches_telegram"] is False assert summary["api_executes_llm"] is False assert summary["api_reads_approval_token"] is False assert summary["api_writes_file"] is False assert summary["api_writes_database"] is False assert summary["telegram_dispatch_report_archive_summary_file_written"] is False assert summary["report_archive_summary_file_written"] is False assert summary["archive_summary_file_written"] is False assert summary["report_file_written"] is False assert summary["telegram_dispatched"] is False assert summary["database_connection_opened"] is False assert summary["database_write_executed"] is False assert summary["database_commit_executed"] is False assert summary["review_state_update_executed"] is False assert summary["scheduler_attached"] is False assert summary["telegram_dispatch_report_archive_summary_sections"][0][ "key" ] == "report_identity" assert summary["blocked_reasons"] == [] assert summary["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_handoff" ) assert token_leak["telegram_dispatch_report_archive_summary_passed"] is False assert "report_archive_summary_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_archive_summary_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_generate_report_from_report_archive_summary_api" in summary[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_archive_summary_passed"] is False assert ( data["summary_persistence_telegram_dispatch_report_archive_summary_passed"] is False ) assert data["report_archive_summary_passed"] is False assert data["ready_for_market_intel_report_catalog_handoff"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_report_archive_summary_file_written"] is False assert data["report_archive_summary_file_written"] is False assert data["archive_summary_file_written"] is False assert data["report_file_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_archive_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_preview" ) assert "report_archive_passed" in data["blocked_reasons"] assert "report_archive_summary_artifacts_recorded" in data["blocked_reasons"] assert "operator_confirmed_report_archive_summary" in data["blocked_reasons"] assert ( "report_archive_summary_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_generate_report_from_report_archive_summary_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff, ) archive_summary = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary_preview", "target_operation": "summarize_archived_market_intel_report", "telegram_dispatch_report_archive_summary_passed": True, "summary_persistence_telegram_dispatch_report_archive_summary_passed": True, "report_archive_summary_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_catalog_handoff": True, "statement_count": 1, "expected_summary_payload_hash": "e" * 64, "telegram_dispatch_report_archive_summary": { "target_report_family": "market_intel_telegram_dispatch_audit_report", "language": "zh-TW", "report_output_artifact_path": "artifacts/market_intel/report.json", "report_output_hash": "f" * 64, "summary_payload_hash": "e" * 64, "summary_payload_hash_matches_expected": True, "required_report_sections_present": True, }, "telegram_dispatch_report_archive_summary_sections": [ {"key": "report_identity"}, {"key": "archive_traceability"}, {"key": "integrity_review"}, {"key": "runtime_safety"}, ], "operator_telegram_dispatch_report_archive_summary": { "report_archive_summary_artifact_path": "artifacts/market_intel/archive-summary.json", "report_archive_artifact_path_recorded": True, "report_closeout_artifact_path_recorded": True, "report_run_receipt_artifact_path_recorded": True, "report_output_artifact_path_recorded": True, "operator_confirmed_report_archive_summary": True, "operator_confirmed_summary_is_read_only": True, "operator_confirmed_report_archive_reviewed": True, "operator_confirmed_report_traceability_reviewed": True, "operator_confirmed_report_catalog_handoff_requires_separate_gate": True, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_catalog_handoff", "report_catalog_handoff_requires_separate_gate": True, }, "safe_boundaries": [ "do_not_read_approval_token_from_report_archive_summary_api", "do_not_read_telegram_token_from_report_archive_summary_api", "do_not_call_llm_from_report_archive_summary", "do_not_generate_report_from_report_archive_summary_api", "do_not_write_report_archive_summary_artifact_from_api", "do_not_dispatch_telegram_from_report_archive_summary_api", "do_not_open_database_connection_from_report_archive_summary", "do_not_update_review_state_from_report_archive_summary", "do_not_attach_scheduler_from_report_archive_summary", "future_market_intel_report_catalog_handoff_must_use_separate_gate", ], } operator_evidence = { "report_catalog_handoff_artifact_path": "artifacts/market_intel/catalog-handoff.json", "report_archive_summary_artifact_path": "artifacts/market_intel/archive-summary.json", "report_archive_artifact_path": "artifacts/market_intel/archive.json", "report_output_artifact_path": "artifacts/market_intel/report.json", "catalog_record_key": "market_intel_telegram_dispatch_audit_report:2026-05-20", "catalog_family": "market_intel_telegram_dispatch_audit_report", "operator_confirmed_report_catalog_handoff": True, "operator_confirmed_catalog_handoff_is_read_only": True, "operator_confirmed_report_archive_summary_reviewed": True, "operator_confirmed_catalog_identity_reviewed": True, "operator_confirmed_report_catalog_index_requires_separate_gate": True, "operator_confirmed_no_token_in_report_catalog_handoff": True, "operator_confirmed_no_api_report_generation": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "catalog_handoff_notes": "manual report catalog handoff reviewed", } handoff = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff( telegram_dispatch_report_archive_summary=archive_summary, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff( telegram_dispatch_report_archive_summary=archive_summary, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff( telegram_dispatch_report_archive_summary=archive_summary, operator_evidence=operator_evidence, apply_real_write=True, ) assert handoff["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff_preview" ) assert handoff["target_operation"] == "handoff_archived_market_intel_report_to_catalog" assert handoff["telegram_dispatch_report_catalog_handoff_passed"] is True assert handoff["summary_persistence_telegram_dispatch_report_catalog_handoff_passed"] is True assert handoff["report_catalog_handoff_passed"] is True assert handoff["ready_for_market_intel_report_catalog_index"] is True assert handoff["ready_for_market_intel_report_catalog_write_preflight"] is False assert handoff["ready_for_report_generation"] is False assert handoff["ready_for_telegram_dispatch"] is False assert handoff["ready_for_api_database_write"] is False assert handoff["api_dispatches_telegram"] is False assert handoff["api_executes_llm"] is False assert handoff["api_reads_approval_token"] is False assert handoff["api_writes_file"] is False assert handoff["api_writes_database"] is False assert handoff["telegram_dispatch_report_catalog_handoff_file_written"] is False assert handoff["report_catalog_handoff_file_written"] is False assert handoff["catalog_record_written"] is False assert handoff["catalog_index_written"] is False assert handoff["report_file_written"] is False assert handoff["telegram_dispatched"] is False assert handoff["database_connection_opened"] is False assert handoff["database_write_executed"] is False assert handoff["database_commit_executed"] is False assert handoff["review_state_update_executed"] is False assert handoff["scheduler_attached"] is False assert handoff["telegram_dispatch_report_catalog_handoff_sections"][0][ "key" ] == "catalog_identity" assert handoff["blocked_reasons"] == [] assert handoff["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_index" ) assert handoff["promotion_gate"]["report_catalog_index_requires_separate_gate"] is True assert token_leak["telegram_dispatch_report_catalog_handoff_passed"] is False assert "report_catalog_handoff_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_catalog_handoff_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_generate_report_from_report_catalog_handoff_api" in handoff[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_catalog_handoff_passed"] is False assert data["summary_persistence_telegram_dispatch_report_catalog_handoff_passed"] is False assert data["report_catalog_handoff_passed"] is False assert data["ready_for_market_intel_report_catalog_index"] is False assert data["ready_for_market_intel_report_catalog_write_preflight"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_report_catalog_handoff_file_written"] is False assert data["report_catalog_handoff_file_written"] is False assert data["catalog_handoff_file_written"] is False assert data["catalog_record_written"] is False assert data["catalog_index_written"] is False assert data["report_file_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_archive_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary_preview" ) assert "report_archive_summary_passed" in data["blocked_reasons"] assert "operator_confirmed_report_catalog_handoff" in data["blocked_reasons"] assert ( "report_catalog_handoff_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_generate_report_from_report_catalog_handoff_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index, ) catalog_handoff = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff_preview", "target_operation": "handoff_archived_market_intel_report_to_catalog", "telegram_dispatch_report_catalog_handoff_passed": True, "summary_persistence_telegram_dispatch_report_catalog_handoff_passed": True, "report_catalog_handoff_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_catalog_index": True, "statement_count": 1, "expected_summary_payload_hash": "e" * 64, "telegram_dispatch_report_archive_summary": { "target_report_family": "market_intel_telegram_dispatch_audit_report", "language": "zh-TW", "report_output_artifact_path": "artifacts/market_intel/report.json", "report_output_hash": "f" * 64, "summary_payload_hash": "e" * 64, "summary_payload_hash_matches_expected": True, "required_report_sections_present": True, }, "telegram_dispatch_report_catalog_handoff_sections": [ {"key": "catalog_identity"}, {"key": "archive_summary_trace"}, {"key": "artifact_manifest"}, {"key": "runtime_safety"}, ], "operator_telegram_dispatch_report_catalog_handoff": { "report_catalog_handoff_artifact_path": "artifacts/market_intel/catalog-handoff.json", "report_archive_summary_artifact_path_recorded": True, "report_archive_artifact_path_recorded": True, "report_output_artifact_path_recorded": True, "catalog_record_key_recorded": True, "catalog_family_recorded": True, "operator_confirmed_report_catalog_handoff": True, "operator_confirmed_catalog_handoff_is_read_only": True, "operator_confirmed_report_archive_summary_reviewed": True, "operator_confirmed_catalog_identity_reviewed": True, "operator_confirmed_report_catalog_index_requires_separate_gate": True, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_catalog_index", "report_catalog_index_requires_separate_gate": True, "report_catalog_write_preflight_requires_separate_gate": True, }, "safe_boundaries": [ "do_not_read_approval_token_from_report_catalog_handoff_api", "do_not_read_telegram_token_from_report_catalog_handoff_api", "do_not_call_llm_from_report_catalog_handoff", "do_not_generate_report_from_report_catalog_handoff_api", "do_not_write_report_catalog_handoff_artifact_from_api", "do_not_write_report_catalog_record_from_api", "do_not_dispatch_telegram_from_report_catalog_handoff_api", "do_not_open_database_connection_from_report_catalog_handoff", "do_not_update_review_state_from_report_catalog_handoff", "do_not_attach_scheduler_from_report_catalog_handoff", "future_market_intel_report_catalog_index_must_use_separate_gate", ], } operator_evidence = { "report_catalog_index_artifact_path": "artifacts/market_intel/catalog-index.json", "report_catalog_handoff_artifact_path": "artifacts/market_intel/catalog-handoff.json", "report_archive_summary_artifact_path": "artifacts/market_intel/archive-summary.json", "report_output_artifact_path": "artifacts/market_intel/report.json", "catalog_record_key": "market_intel_telegram_dispatch_audit_report:2026-05-20", "catalog_family": "market_intel_telegram_dispatch_audit_report", "catalog_index_key": "market_intel_telegram_dispatch_audit_report:index:2026-05-20", "operator_confirmed_report_catalog_index": True, "operator_confirmed_catalog_index_is_read_only": True, "operator_confirmed_report_catalog_handoff_reviewed": True, "operator_confirmed_catalog_manifest_reviewed": True, "operator_confirmed_report_catalog_write_preflight_requires_separate_gate": True, "operator_confirmed_no_token_in_report_catalog_index": True, "operator_confirmed_no_api_report_generation": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_catalog_record_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "catalog_index_notes": "manual report catalog index reviewed", } index = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index( telegram_dispatch_report_catalog_handoff=catalog_handoff, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index( telegram_dispatch_report_catalog_handoff=catalog_handoff, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index( telegram_dispatch_report_catalog_handoff=catalog_handoff, operator_evidence=operator_evidence, apply_real_write=True, ) assert index["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index_preview" ) assert index["target_operation"] == "index_archived_market_intel_report_catalog_handoff" assert index["telegram_dispatch_report_catalog_index_passed"] is True assert index["summary_persistence_telegram_dispatch_report_catalog_index_passed"] is True assert index["report_catalog_index_passed"] is True assert index["ready_for_market_intel_report_catalog_write_preflight"] is True assert index["ready_for_market_intel_report_catalog_record_write"] is False assert index["ready_for_report_generation"] is False assert index["ready_for_telegram_dispatch"] is False assert index["ready_for_api_database_write"] is False assert index["api_dispatches_telegram"] is False assert index["api_executes_llm"] is False assert index["api_reads_approval_token"] is False assert index["api_writes_file"] is False assert index["api_writes_database"] is False assert index["telegram_dispatch_report_catalog_index_file_written"] is False assert index["report_catalog_index_file_written"] is False assert index["catalog_index_file_written"] is False assert index["catalog_record_written"] is False assert index["catalog_index_written"] is False assert index["report_file_written"] is False assert index["telegram_dispatched"] is False assert index["database_connection_opened"] is False assert index["database_write_executed"] is False assert index["database_commit_executed"] is False assert index["review_state_update_executed"] is False assert index["scheduler_attached"] is False assert index["telegram_dispatch_report_catalog_index_sections"][0][ "key" ] == "catalog_index_identity" assert index["blocked_reasons"] == [] assert index["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_write_preflight" ) assert ( index["promotion_gate"]["report_catalog_write_preflight_requires_separate_gate"] is True ) assert token_leak["telegram_dispatch_report_catalog_index_passed"] is False assert "report_catalog_index_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_catalog_index_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_generate_report_from_report_catalog_index_api" in index[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_catalog_index_passed"] is False assert data["summary_persistence_telegram_dispatch_report_catalog_index_passed"] is False assert data["report_catalog_index_passed"] is False assert data["ready_for_market_intel_report_catalog_write_preflight"] is False assert data["ready_for_market_intel_report_catalog_record_write"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_report_catalog_index_file_written"] is False assert data["report_catalog_index_file_written"] is False assert data["catalog_index_file_written"] is False assert data["catalog_record_written"] is False assert data["catalog_index_written"] is False assert data["report_file_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_catalog_handoff"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff_preview" ) assert "report_catalog_handoff_passed" in data["blocked_reasons"] assert "operator_confirmed_report_catalog_index" in data["blocked_reasons"] assert ( "report_catalog_index_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_generate_report_from_report_catalog_index_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight, ) catalog_index = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index_preview", "target_operation": "index_archived_market_intel_report_catalog_handoff", "telegram_dispatch_report_catalog_index_passed": True, "summary_persistence_telegram_dispatch_report_catalog_index_passed": True, "report_catalog_index_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_catalog_write_preflight": True, "statement_count": 1, "expected_summary_payload_hash": "e" * 64, "telegram_dispatch_report_catalog_handoff": { "target_report_family": "market_intel_telegram_dispatch_audit_report", "language": "zh-TW", "report_output_artifact_path": "artifacts/market_intel/report.json", "report_output_hash": "f" * 64, "summary_payload_hash_matches_expected": True, "required_report_sections_present": True, }, "telegram_dispatch_report_catalog_index_sections": [ {"key": "catalog_index_identity"}, {"key": "catalog_source_trace"}, {"key": "index_manifest"}, {"key": "runtime_safety"}, ], "operator_telegram_dispatch_report_catalog_index": { "report_catalog_index_artifact_path": "artifacts/market_intel/catalog-index.json", "report_catalog_handoff_artifact_path_recorded": True, "report_archive_summary_artifact_path_recorded": True, "report_output_artifact_path_recorded": True, "catalog_record_key_recorded": True, "catalog_family_recorded": True, "catalog_index_key_recorded": True, "operator_confirmed_report_catalog_index": True, "operator_confirmed_catalog_index_is_read_only": True, "operator_confirmed_report_catalog_handoff_reviewed": True, "operator_confirmed_catalog_manifest_reviewed": True, "operator_confirmed_report_catalog_write_preflight_requires_separate_gate": True, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_catalog_write_preflight", "report_catalog_write_preflight_requires_separate_gate": True, "report_catalog_record_write_requires_separate_gate": True, }, "safe_boundaries": [ "do_not_read_approval_token_from_report_catalog_index_api", "do_not_read_telegram_token_from_report_catalog_index_api", "do_not_call_llm_from_report_catalog_index", "do_not_generate_report_from_report_catalog_index_api", "do_not_write_report_catalog_index_artifact_from_api", "do_not_write_report_catalog_record_from_api", "do_not_dispatch_telegram_from_report_catalog_index_api", "do_not_open_database_connection_from_report_catalog_index", "do_not_update_review_state_from_report_catalog_index", "do_not_attach_scheduler_from_report_catalog_index", "future_market_intel_report_catalog_write_preflight_must_use_separate_gate", ], } operator_evidence = { "report_catalog_write_preflight_artifact_path": ( "artifacts/market_intel/catalog-write-preflight.json" ), "report_catalog_index_artifact_path": "artifacts/market_intel/catalog-index.json", "report_catalog_handoff_artifact_path": "artifacts/market_intel/catalog-handoff.json", "report_output_artifact_path": "artifacts/market_intel/report.json", "catalog_record_key": "market_intel_telegram_dispatch_audit_report:2026-05-20", "catalog_family": "market_intel_telegram_dispatch_audit_report", "catalog_index_key": "market_intel_telegram_dispatch_audit_report:index:2026-05-20", "catalog_record_schema": "market_intel_report_catalog_v1", "operator_confirmed_report_catalog_write_preflight": True, "operator_confirmed_catalog_write_preflight_is_read_only": True, "operator_confirmed_report_catalog_index_reviewed": True, "operator_confirmed_catalog_record_schema_reviewed": True, "operator_confirmed_report_catalog_record_write_requires_separate_gate": True, "operator_confirmed_no_token_in_report_catalog_write_preflight": True, "operator_confirmed_no_api_report_generation": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_catalog_record_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "catalog_write_preflight_notes": "manual report catalog write preflight reviewed", } preflight = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight( telegram_dispatch_report_catalog_index=catalog_index, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight( telegram_dispatch_report_catalog_index=catalog_index, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight( telegram_dispatch_report_catalog_index=catalog_index, operator_evidence=operator_evidence, apply_real_write=True, ) assert preflight["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight_preview" ) assert preflight["target_operation"] == ( "preflight_market_intel_report_catalog_record_write" ) assert preflight["telegram_dispatch_report_catalog_write_preflight_passed"] is True assert ( preflight[ "summary_persistence_telegram_dispatch_report_catalog_write_preflight_passed" ] is True ) assert preflight["report_catalog_write_preflight_passed"] is True assert preflight["ready_for_market_intel_report_catalog_record_write"] is True assert preflight["ready_for_market_intel_report_catalog_record_commit"] is False assert preflight["ready_for_report_generation"] is False assert preflight["ready_for_telegram_dispatch"] is False assert preflight["ready_for_api_database_write"] is False assert preflight["api_dispatches_telegram"] is False assert preflight["api_executes_llm"] is False assert preflight["api_reads_approval_token"] is False assert preflight["api_writes_file"] is False assert preflight["api_writes_database"] is False assert preflight["telegram_dispatch_report_catalog_write_preflight_file_written"] is False assert preflight["report_catalog_write_preflight_file_written"] is False assert preflight["catalog_write_preflight_file_written"] is False assert preflight["catalog_record_written"] is False assert preflight["catalog_record_write_executed"] is False assert preflight["database_connection_opened"] is False assert preflight["database_write_executed"] is False assert preflight["database_commit_executed"] is False assert preflight["review_state_update_executed"] is False assert preflight["scheduler_attached"] is False assert preflight["telegram_dispatch_report_catalog_write_preflight_sections"][0][ "key" ] == "catalog_record_identity" assert preflight["blocked_reasons"] == [] assert preflight["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_record_write" ) assert preflight["promotion_gate"]["requires_real_db_write"] is True assert token_leak["telegram_dispatch_report_catalog_write_preflight_passed"] is False assert "report_catalog_write_preflight_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_catalog_write_preflight_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_generate_report_from_report_catalog_write_preflight_api" in preflight[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_catalog_write_preflight_passed"] is False assert ( data[ "summary_persistence_telegram_dispatch_report_catalog_write_preflight_passed" ] is False ) assert data["report_catalog_write_preflight_passed"] is False assert data["ready_for_market_intel_report_catalog_record_write"] is False assert data["ready_for_market_intel_report_catalog_record_commit"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_report_catalog_write_preflight_file_written"] is False assert data["report_catalog_write_preflight_file_written"] is False assert data["catalog_write_preflight_file_written"] is False assert data["catalog_record_written"] is False assert data["catalog_record_write_executed"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_catalog_index"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index_preview" ) assert "report_catalog_index_passed" in data["blocked_reasons"] assert ( "operator_confirmed_report_catalog_write_preflight" in data["blocked_reasons"] ) assert ( "report_catalog_write_preflight_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_generate_report_from_report_catalog_write_preflight_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write, ) from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight, ) catalog_index = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index_preview", "target_operation": "index_archived_market_intel_report_catalog_handoff", "telegram_dispatch_report_catalog_index_passed": True, "summary_persistence_telegram_dispatch_report_catalog_index_passed": True, "report_catalog_index_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_catalog_write_preflight": True, "statement_count": 1, "expected_summary_payload_hash": "e" * 64, "telegram_dispatch_report_catalog_handoff": { "target_report_family": "market_intel_telegram_dispatch_audit_report", "language": "zh-TW", "report_output_artifact_path": "artifacts/market_intel/report.json", "report_output_hash": "f" * 64, "summary_payload_hash_matches_expected": True, "required_report_sections_present": True, }, "telegram_dispatch_report_catalog_index_sections": [ {"key": "catalog_index_identity"}, {"key": "catalog_source_trace"}, {"key": "index_manifest"}, {"key": "runtime_safety"}, ], "operator_telegram_dispatch_report_catalog_index": { "report_catalog_index_artifact_path": "artifacts/market_intel/catalog-index.json", "report_catalog_handoff_artifact_path_recorded": True, "report_archive_summary_artifact_path_recorded": True, "report_output_artifact_path_recorded": True, "catalog_record_key_recorded": True, "catalog_family_recorded": True, "catalog_index_key_recorded": True, "operator_confirmed_report_catalog_index": True, "operator_confirmed_catalog_index_is_read_only": True, "operator_confirmed_report_catalog_handoff_reviewed": True, "operator_confirmed_catalog_manifest_reviewed": True, "operator_confirmed_report_catalog_write_preflight_requires_separate_gate": True, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_catalog_write_preflight", "report_catalog_write_preflight_requires_separate_gate": True, "report_catalog_record_write_requires_separate_gate": True, }, "safe_boundaries": [ "do_not_read_approval_token_from_report_catalog_index_api", "do_not_read_telegram_token_from_report_catalog_index_api", "do_not_call_llm_from_report_catalog_index", "do_not_generate_report_from_report_catalog_index_api", "do_not_write_report_catalog_index_artifact_from_api", "do_not_write_report_catalog_record_from_api", "do_not_dispatch_telegram_from_report_catalog_index_api", "do_not_open_database_connection_from_report_catalog_index", "do_not_update_review_state_from_report_catalog_index", "do_not_attach_scheduler_from_report_catalog_index", "future_market_intel_report_catalog_write_preflight_must_use_separate_gate", ], } write_preflight_operator = { "report_catalog_write_preflight_artifact_path": ( "artifacts/market_intel/catalog-write-preflight.json" ), "report_catalog_index_artifact_path": "artifacts/market_intel/catalog-index.json", "report_catalog_handoff_artifact_path": "artifacts/market_intel/catalog-handoff.json", "report_output_artifact_path": "artifacts/market_intel/report.json", "catalog_record_key": "market_intel_telegram_dispatch_audit_report:2026-05-20", "catalog_family": "market_intel_telegram_dispatch_audit_report", "catalog_index_key": "market_intel_telegram_dispatch_audit_report:index:2026-05-20", "catalog_record_schema": "market_intel_report_catalog_v1", "operator_confirmed_report_catalog_write_preflight": True, "operator_confirmed_catalog_write_preflight_is_read_only": True, "operator_confirmed_report_catalog_index_reviewed": True, "operator_confirmed_catalog_record_schema_reviewed": True, "operator_confirmed_report_catalog_record_write_requires_separate_gate": True, "operator_confirmed_no_token_in_report_catalog_write_preflight": True, "operator_confirmed_no_api_report_generation": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_catalog_record_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, } write_preflight = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight( telegram_dispatch_report_catalog_index=catalog_index, operator_evidence=write_preflight_operator, ) operator_evidence = { **write_preflight_operator, "report_catalog_record_write_artifact_path": ( "artifacts/market_intel/catalog-record-write.json" ), "catalog_record_backup_artifact_path": ( "artifacts/market_intel/catalog-record-backup.json" ), "catalog_record_write_dry_run_artifact_path": ( "artifacts/market_intel/catalog-record-dry-run.json" ), "operator_confirmed_report_catalog_record_write": True, "operator_confirmed_catalog_record_write_is_cli_only": True, "operator_confirmed_catalog_record_write_dry_run_reviewed": True, "operator_confirmed_catalog_record_backup_required": True, "operator_confirmed_report_catalog_record_commit_requires_separate_gate": True, "operator_confirmed_postwrite_smoke_required": True, "operator_confirmed_no_token_in_report_catalog_record_write": True, "catalog_record_write_notes": "manual report catalog record write gate reviewed", } record_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write( telegram_dispatch_report_catalog_write_preflight=write_preflight, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write( telegram_dispatch_report_catalog_write_preflight=write_preflight, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write( telegram_dispatch_report_catalog_write_preflight=write_preflight, operator_evidence=operator_evidence, apply_real_write=True, ) assert record_write["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write_preview" ) assert record_write["target_operation"] == ( "gate_market_intel_report_catalog_record_write" ) assert record_write["telegram_dispatch_report_catalog_record_write_passed"] is True assert ( record_write[ "summary_persistence_telegram_dispatch_report_catalog_record_write_passed" ] is True ) assert record_write["report_catalog_record_write_passed"] is True assert record_write["ready_for_market_intel_report_catalog_record_write"] is True assert record_write["ready_for_market_intel_report_catalog_record_cli_run"] is True assert record_write["ready_for_market_intel_report_catalog_record_commit"] is False assert record_write["ready_for_report_generation"] is False assert record_write["ready_for_telegram_dispatch"] is False assert record_write["ready_for_api_database_write"] is False assert record_write["api_dispatches_telegram"] is False assert record_write["api_executes_llm"] is False assert record_write["api_reads_approval_token"] is False assert record_write["api_writes_file"] is False assert record_write["api_writes_database"] is False assert record_write["catalog_record_write_gate_file_written"] is False assert record_write["catalog_record_written"] is False assert record_write["catalog_record_write_executed"] is False assert record_write["catalog_record_commit_executed"] is False assert record_write["database_connection_opened"] is False assert record_write["database_write_executed"] is False assert record_write["database_commit_executed"] is False assert record_write["review_state_update_executed"] is False assert record_write["scheduler_attached"] is False assert record_write["telegram_dispatch_report_catalog_record_write_sections"][0][ "key" ] == "catalog_record_write_identity" assert record_write["blocked_reasons"] == [] assert record_write["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_record_run_package" ) assert record_write["promotion_gate"]["requires_cli_run"] is True assert record_write["promotion_gate"]["requires_real_db_write"] is True assert token_leak["telegram_dispatch_report_catalog_record_write_passed"] is False assert "report_catalog_record_write_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_catalog_record_write_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_write_report_catalog_record_from_api" in record_write[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_catalog_record_write_passed"] is False assert ( data[ "summary_persistence_telegram_dispatch_report_catalog_record_write_passed" ] is False ) assert data["report_catalog_record_write_passed"] is False assert data["ready_for_market_intel_report_catalog_record_write"] is False assert data["ready_for_market_intel_report_catalog_record_cli_run"] is False assert data["ready_for_market_intel_report_catalog_record_commit"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["catalog_record_write_gate_file_written"] is False assert data["catalog_record_written"] is False assert data["catalog_record_write_executed"] is False assert data["catalog_record_commit_executed"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_catalog_write_preflight"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight_preview" ) assert "report_catalog_write_preflight_passed" in data["blocked_reasons"] assert ( "operator_confirmed_report_catalog_record_write" in data["blocked_reasons"] ) assert ( "report_catalog_record_write_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_write_report_catalog_record_from_api" in data["safe_boundaries"] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package, ) record_write = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write_preview", "target_operation": "gate_market_intel_report_catalog_record_write", "telegram_dispatch_report_catalog_record_write_passed": True, "summary_persistence_telegram_dispatch_report_catalog_record_write_passed": True, "report_catalog_record_write_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_catalog_record_write": True, "ready_for_market_intel_report_catalog_record_cli_run": True, "ready_for_market_intel_report_catalog_record_commit": False, "statement_count": 1, "expected_summary_payload_hash": "e" * 64, "telegram_dispatch_report_catalog_write_preflight": { "target_report_family": "market_intel_telegram_dispatch_audit_report", "language": "zh-TW", "report_output_artifact_path": "artifacts/market_intel/report.json", "report_output_hash": "f" * 64, "report_catalog_index_artifact_path": "artifacts/market_intel/catalog-index.json", "report_catalog_write_preflight_artifact_path": ( "artifacts/market_intel/catalog-write-preflight.json" ), "catalog_record_key_recorded": True, "catalog_family_recorded": True, "catalog_index_key_recorded": True, "catalog_record_schema_recorded": True, }, "telegram_dispatch_report_catalog_record_write_sections": [ {"key": "catalog_record_write_identity"}, {"key": "catalog_record_write_trace"}, {"key": "catalog_record_write_runtime_plan"}, {"key": "catalog_record_write_safety"}, ], "operator_telegram_dispatch_report_catalog_record_write": { "report_catalog_record_write_artifact_path": ( "artifacts/market_intel/catalog-record-write.json" ), "report_catalog_write_preflight_artifact_path_recorded": True, "report_catalog_index_artifact_path_recorded": True, "report_output_artifact_path_recorded": True, "catalog_record_key_recorded": True, "catalog_family_recorded": True, "catalog_index_key_recorded": True, "catalog_record_schema_recorded": True, "catalog_record_backup_artifact_path_recorded": True, "catalog_record_write_dry_run_artifact_path_recorded": True, "operator_confirmed_report_catalog_record_write": True, "operator_confirmed_catalog_record_write_is_cli_only": True, "operator_confirmed_catalog_record_write_dry_run_reviewed": True, "operator_confirmed_catalog_record_backup_required": True, "operator_confirmed_report_catalog_record_commit_requires_separate_gate": True, "operator_confirmed_postwrite_smoke_required": True, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_catalog_record_run_package", "requires_real_db_write": True, "requires_cli_run": True, "requires_postwrite_smoke": True, "report_catalog_record_run_package_requires_separate_gate": True, "report_catalog_record_commit_requires_separate_gate": True, }, "safe_boundaries": [ "do_not_read_approval_token_from_report_catalog_record_write_api", "do_not_read_telegram_token_from_report_catalog_record_write_api", "do_not_call_llm_from_report_catalog_record_write", "do_not_generate_report_from_report_catalog_record_write_api", "do_not_write_report_catalog_record_write_artifact_from_api", "do_not_write_report_catalog_record_from_api", "do_not_dispatch_telegram_from_report_catalog_record_write_api", "do_not_open_database_connection_from_report_catalog_record_write", "do_not_update_review_state_from_report_catalog_record_write", "do_not_attach_scheduler_from_report_catalog_record_write", "future_market_intel_report_catalog_record_run_package_must_use_separate_gate", ], } operator_evidence = { "report_catalog_record_run_package_artifact_path": ( "artifacts/market_intel/catalog-record-run-package.json" ), "report_catalog_record_write_artifact_path": ( "artifacts/market_intel/catalog-record-write.json" ), "report_catalog_write_preflight_artifact_path": ( "artifacts/market_intel/catalog-write-preflight.json" ), "report_output_artifact_path": "artifacts/market_intel/report.json", "catalog_record_key": "market_intel_telegram_dispatch_audit_report:2026-05-20", "catalog_record_schema": "market_intel_report_catalog_v1", "catalog_record_payload_manifest_path": ( "artifacts/market_intel/catalog-record-payload.json" ), "catalog_record_backup_artifact_path": ( "artifacts/market_intel/catalog-record-backup.json" ), "catalog_record_write_dry_run_artifact_path": ( "artifacts/market_intel/catalog-record-dry-run.json" ), "catalog_record_cli_command": ( "python scripts/market_intel/write_report_catalog_record.py --input payload --dry-run" ), "operator_confirmed_report_catalog_record_run_package": True, "operator_confirmed_catalog_record_payload_manifest_reviewed": True, "operator_confirmed_catalog_record_cli_command_reviewed": True, "operator_confirmed_catalog_record_run_is_cli_only": True, "operator_confirmed_catalog_record_backup_available": True, "operator_confirmed_report_catalog_record_run_readiness_requires_separate_gate": True, "operator_confirmed_report_catalog_record_commit_requires_separate_gate": True, "operator_confirmed_postwrite_smoke_required": True, "operator_confirmed_no_token_in_report_catalog_record_run_package": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_catalog_record_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "catalog_record_run_package_notes": "manual report catalog record run package reviewed", } run_package = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package( telegram_dispatch_report_catalog_record_write=record_write, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package( telegram_dispatch_report_catalog_record_write=record_write, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package( telegram_dispatch_report_catalog_record_write=record_write, operator_evidence=operator_evidence, apply_real_write=True, ) assert run_package["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package_preview" ) assert run_package["target_operation"] == ( "package_market_intel_report_catalog_record_run" ) assert run_package["telegram_dispatch_report_catalog_record_run_package_passed"] is True assert ( run_package[ "summary_persistence_telegram_dispatch_report_catalog_record_run_package_passed" ] is True ) assert run_package["report_catalog_record_run_package_passed"] is True assert run_package["ready_for_market_intel_report_catalog_record_run_package"] is True assert run_package["ready_for_market_intel_report_catalog_record_run_readiness"] is True assert run_package["ready_for_market_intel_report_catalog_record_cli_run"] is False assert run_package["ready_for_market_intel_report_catalog_record_commit"] is False assert run_package["ready_for_report_generation"] is False assert run_package["ready_for_telegram_dispatch"] is False assert run_package["ready_for_api_database_write"] is False assert run_package["api_dispatches_telegram"] is False assert run_package["api_executes_llm"] is False assert run_package["api_writes_file"] is False assert run_package["api_writes_database"] is False assert run_package["catalog_record_run_package_file_written"] is False assert run_package["catalog_record_cli_executed"] is False assert run_package["catalog_record_written"] is False assert run_package["catalog_record_write_executed"] is False assert run_package["database_connection_opened"] is False assert run_package["database_write_executed"] is False assert run_package["database_commit_executed"] is False assert run_package["scheduler_attached"] is False assert run_package["command_bundle"]["api_must_not_execute_command"] is True assert run_package["payload_manifest"]["execute_in_api"] is False assert run_package["blocked_reasons"] == [] assert run_package["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_record_run_readiness" ) assert token_leak["telegram_dispatch_report_catalog_record_run_package_passed"] is False assert "report_catalog_record_run_package_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_catalog_record_run_package_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert "do_not_execute_catalog_record_cli_from_api" in run_package[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_catalog_record_run_package_passed"] is False assert ( data[ "summary_persistence_telegram_dispatch_report_catalog_record_run_package_passed" ] is False ) assert data["report_catalog_record_run_package_passed"] is False assert data["ready_for_market_intel_report_catalog_record_run_package"] is False assert data["ready_for_market_intel_report_catalog_record_run_readiness"] is False assert data["ready_for_market_intel_report_catalog_record_cli_run"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["api_executes_cli"] is False assert data["api_executes_llm"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["catalog_record_run_package_file_written"] is False assert data["catalog_record_cli_executed"] is False assert data["catalog_record_written"] is False assert data["catalog_record_write_executed"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_catalog_record_write"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write_preview" ) assert "report_catalog_record_write_passed" in data["blocked_reasons"] assert ( "operator_confirmed_report_catalog_record_run_package" in data["blocked_reasons"] ) assert ( "report_catalog_record_run_package_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_execute_catalog_record_cli_from_api" in data["safe_boundaries"] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness, ) run_package = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package_preview", "target_operation": "package_market_intel_report_catalog_record_run", "telegram_dispatch_report_catalog_record_run_package_passed": True, "summary_persistence_telegram_dispatch_report_catalog_record_run_package_passed": True, "report_catalog_record_run_package_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_catalog_record_run_package": True, "ready_for_market_intel_report_catalog_record_run_readiness": True, "ready_for_market_intel_report_catalog_record_cli_run": False, "ready_for_market_intel_report_catalog_record_commit": False, "statement_count": 1, "expected_summary_payload_hash": "e" * 64, "payload_manifest": { "target_table": "market_alert_review_queue", "target_column": "metadata_json", "record_family": "market_intel_telegram_dispatch_audit_report", "record_key_recorded": True, "record_schema_recorded": True, "report_output_hash": "f" * 64, "expected_summary_payload_hash": "e" * 64, "statement_count": 1, "source_artifacts": { "record_write_gate": True, "write_preflight": True, "report_output": True, "backup": True, "dry_run": True, }, "execute_in_api": False, }, "command_bundle": { "script_path": "scripts/market_intel/write_report_catalog_record.py", "approval_env_var": "MARKET_INTEL_QUEUE_WRITE_APPROVAL", "dry_run_command": ( "python scripts/market_intel/write_report_catalog_record.py --input payload --dry-run" ), "real_run_command_requires_separate_gate": True, "api_must_not_execute_command": True, "cli_command_recorded_by_operator": True, "expected_statement_count": 1, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_catalog_record_run_readiness", "requires_real_db_write": True, "requires_cli_run": True, "requires_postwrite_smoke": True, "report_catalog_record_run_readiness_requires_separate_gate": True, "report_catalog_record_commit_requires_separate_gate": True, }, "telegram_dispatch_report_catalog_record_run_package_sections": [ {"key": "catalog_record_run_package_identity"}, {"key": "catalog_record_payload_manifest"}, {"key": "catalog_record_command_bundle"}, {"key": "catalog_record_run_package_safety"}, ], "safe_boundaries": [ "do_not_read_approval_token_from_report_catalog_record_run_package_api", "do_not_read_telegram_token_from_report_catalog_record_run_package_api", "do_not_call_llm_from_report_catalog_record_run_package", "do_not_generate_report_from_report_catalog_record_run_package_api", "do_not_write_report_catalog_record_run_package_artifact_from_api", "do_not_execute_catalog_record_cli_from_api", "do_not_write_report_catalog_record_from_api", "do_not_dispatch_telegram_from_report_catalog_record_run_package_api", "do_not_open_database_connection_from_report_catalog_record_run_package", "do_not_update_review_state_from_report_catalog_record_run_package", "do_not_attach_scheduler_from_report_catalog_record_run_package", "future_market_intel_report_catalog_record_run_readiness_must_use_separate_gate", ], } operator_evidence = { "report_catalog_record_run_readiness_artifact_path": ( "artifacts/market_intel/catalog-record-run-readiness.json" ), "report_catalog_record_run_package_artifact_path": ( "artifacts/market_intel/catalog-record-run-package.json" ), "catalog_record_payload_manifest_path": ( "artifacts/market_intel/catalog-record-payload.json" ), "catalog_record_backup_artifact_path": ( "artifacts/market_intel/catalog-record-backup.json" ), "catalog_record_write_dry_run_artifact_path": ( "artifacts/market_intel/catalog-record-dry-run.json" ), "catalog_record_cli_command": ( "python scripts/market_intel/write_report_catalog_record.py --input payload" ), "catalog_record_run_receipt_artifact_path": ( "artifacts/market_intel/catalog-record-run-receipt.json" ), "catalog_record_postwrite_smoke_artifact_path": ( "artifacts/market_intel/catalog-record-postwrite-smoke.json" ), "operator_confirmed_report_catalog_record_run_readiness": True, "operator_confirmed_report_catalog_record_run_package_reviewed": True, "operator_confirmed_catalog_record_payload_manifest_reviewed": True, "operator_confirmed_catalog_record_cli_command_reviewed": True, "operator_confirmed_catalog_record_dry_run_reviewed": True, "operator_confirmed_catalog_record_backup_available": True, "operator_confirmed_catalog_record_run_is_cli_only": True, "operator_confirmed_one_time_token_shell_only": True, "operator_confirmed_report_catalog_record_run_receipt_required": True, "operator_confirmed_report_catalog_record_commit_requires_separate_gate": True, "operator_confirmed_postwrite_smoke_required": True, "operator_confirmed_no_token_in_report_catalog_record_run_readiness": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_catalog_record_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "catalog_record_run_readiness_notes": "manual run readiness reviewed", } readiness = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness( telegram_dispatch_report_catalog_record_run_package=run_package, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness( telegram_dispatch_report_catalog_record_run_package=run_package, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness( telegram_dispatch_report_catalog_record_run_package=run_package, operator_evidence=operator_evidence, apply_real_write=True, ) assert readiness["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness_preview" ) assert readiness["target_operation"] == ( "manual_market_intel_report_catalog_record_run_readiness" ) assert readiness["telegram_dispatch_report_catalog_record_run_readiness_passed"] is True assert ( readiness[ "summary_persistence_telegram_dispatch_report_catalog_record_run_readiness_passed" ] is True ) assert readiness["report_catalog_record_run_readiness_passed"] is True assert readiness["ready_for_cli_operator_run"] is True assert readiness["ready_for_market_intel_report_catalog_record_cli_operator_run"] is True assert readiness["ready_for_market_intel_report_catalog_record_run_receipt"] is True assert readiness["ready_for_market_intel_report_catalog_record_cli_run"] is False assert readiness["ready_for_market_intel_report_catalog_record_commit"] is False assert readiness["ready_for_real_write"] is False assert readiness["ready_for_api_database_write"] is False assert readiness["api_executes_cli"] is False assert readiness["api_reads_approval_token"] is False assert readiness["api_writes_file"] is False assert readiness["api_writes_database"] is False assert readiness["catalog_record_run_readiness_gate_file_written"] is False assert readiness["catalog_record_run_readiness_executed"] is False assert readiness["catalog_record_run_readiness_file_written"] is False assert readiness["catalog_record_cli_executed"] is False assert readiness["catalog_record_written"] is False assert readiness["database_connection_opened"] is False assert readiness["database_write_executed"] is False assert readiness["scheduler_attached"] is False assert readiness["blocked_reasons"] == [] assert readiness["catalog_record_run_readiness_manifest"]["manifest_version"] == ( "market_intel_report_catalog_record_run_readiness_v1" ) assert ( readiness["catalog_record_run_readiness_manifest"]["manual_cli_run_command"][ "executed_by_api" ] is False ) assert readiness["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_record_run_receipt" ) assert token_leak["telegram_dispatch_report_catalog_record_run_readiness_passed"] is False assert "report_catalog_record_run_readiness_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_catalog_record_run_readiness_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert ( "do_not_execute_catalog_record_cli_from_report_catalog_record_run_readiness_api" in readiness["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_catalog_record_run_readiness_passed"] is False assert ( data[ "summary_persistence_telegram_dispatch_report_catalog_record_run_readiness_passed" ] is False ) assert data["report_catalog_record_run_readiness_passed"] is False assert data["ready_for_cli_operator_run"] is False assert data["ready_for_market_intel_report_catalog_record_cli_operator_run"] is False assert data["ready_for_market_intel_report_catalog_record_run_receipt"] is False assert data["ready_for_market_intel_report_catalog_record_cli_run"] is False assert data["ready_for_real_write"] is False assert data["ready_for_api_database_write"] is False assert data["api_executes_cli"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["catalog_record_run_readiness_gate_file_written"] is False assert data["catalog_record_run_readiness_executed"] is False assert data["catalog_record_run_readiness_file_written"] is False assert data["catalog_record_cli_executed"] is False assert data["catalog_record_written"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_catalog_record_run_package"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package_preview" ) assert "report_catalog_record_run_package_passed" in data["blocked_reasons"] assert ( "operator_confirmed_report_catalog_record_run_readiness" in data["blocked_reasons"] ) assert ( "report_catalog_record_run_readiness_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert ( "do_not_execute_catalog_record_cli_from_report_catalog_record_run_readiness_api" in data["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt, ) readiness = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness_preview", "target_operation": "manual_market_intel_report_catalog_record_run_readiness", "telegram_dispatch_report_catalog_record_run_readiness_passed": True, "summary_persistence_telegram_dispatch_report_catalog_record_run_readiness_passed": True, "report_catalog_record_run_readiness_passed": True, "ready_for_next_manual_phase": True, "ready_for_cli_operator_run": True, "ready_for_market_intel_report_catalog_record_cli_operator_run": True, "ready_for_market_intel_report_catalog_record_run_receipt": True, "ready_for_market_intel_report_catalog_record_cli_run": False, "ready_for_market_intel_report_catalog_record_commit": False, "statement_count": 1, "expected_summary_payload_hash": "e" * 64, "catalog_record_run_readiness_manifest": { "manifest_version": "market_intel_report_catalog_record_run_readiness_v1", "source_mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package_preview", "source_operation": "package_market_intel_report_catalog_record_run", "target_table": "market_alert_review_queue", "target_column": "metadata_json", "record_family": "market_intel_telegram_dispatch_audit_report", "report_output_hash": "f" * 64, "expected_summary_payload_hash": "e" * 64, "statement_count": 1, "source_artifacts": { "record_write_gate": True, "write_preflight": True, "report_output": True, "backup": True, "dry_run": True, }, "manual_cli_run_command": { "script_path": "scripts/market_intel/write_report_catalog_record.py", "dry_run_command": ( "python scripts/market_intel/write_report_catalog_record.py --input payload --dry-run" ), "executed_by_api": False, "writes_catalog_record": True, "requires_approval_env_var": "MARKET_INTEL_QUEUE_WRITE_APPROVAL", }, "execution_boundaries": { "api_writes_file": False, "api_executes_cli": False, "api_writes_catalog_record": False, "api_writes_database": False, "api_dispatches_telegram": False, "api_calls_llm": False, "api_attaches_scheduler": False, }, }, "telegram_dispatch_report_catalog_record_run_package": { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package_preview", "catalog_record_run_package_passed": True, "record_family": "market_intel_telegram_dispatch_audit_report", "report_output_hash": "f" * 64, "expected_summary_payload_hash": "e" * 64, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_catalog_record_run_receipt", "requires_real_db_write": True, "requires_cli_run": True, "requires_postwrite_smoke": True, "report_catalog_record_run_receipt_requires_separate_gate": True, "report_catalog_record_commit_requires_separate_gate": True, }, "telegram_dispatch_report_catalog_record_run_readiness_sections": [ {"key": "catalog_record_run_readiness_identity"}, {"key": "catalog_record_run_readiness_artifacts"}, {"key": "catalog_record_run_readiness_command"}, {"key": "catalog_record_run_readiness_safety"}, ], "safe_boundaries": [ "do_not_read_approval_token_from_report_catalog_record_run_readiness_api", "do_not_read_telegram_token_from_report_catalog_record_run_readiness_api", "do_not_call_llm_from_report_catalog_record_run_readiness", "do_not_generate_report_from_report_catalog_record_run_readiness_api", "do_not_write_report_catalog_record_run_readiness_artifact_from_api", "do_not_execute_catalog_record_cli_from_report_catalog_record_run_readiness_api", "do_not_write_report_catalog_record_from_report_catalog_record_run_readiness_api", "do_not_dispatch_telegram_from_report_catalog_record_run_readiness_api", "do_not_open_database_connection_from_report_catalog_record_run_readiness", "do_not_update_review_state_from_report_catalog_record_run_readiness", "do_not_attach_scheduler_from_report_catalog_record_run_readiness", "future_market_intel_report_catalog_record_run_receipt_must_use_separate_gate", ], } receipt_payload = { "mode": "manual_market_intel_report_catalog_record_run_receipt", "writer_output": { "mode": "market_intel_report_catalog_record_run_receipt", "catalog_record_cli_executed": True, "catalog_record_written": True, "target_table": "market_alert_review_queue", "target_column": "metadata_json", "record_family": "market_intel_telegram_dispatch_audit_report", "catalog_record_key": "market-intel-report-20260520", "statement_count": 1, "affected_count": 1, "database_connection_opened": True, "explicit_transaction_opened": True, "database_write_executed": True, "database_commit_executed": True, "expected_summary_payload_hash": "e" * 64, "report_output_hash": "f" * 64, }, "postwrite_smoke_result": { "mode": "market_intel_report_catalog_record_postwrite_smoke_read_only", "postwrite_smoke_passed": True, "read_only_query_executed": True, "catalog_record_found": True, "target_table": "market_alert_review_queue", "target_column": "metadata_json", "record_family": "market_intel_telegram_dispatch_audit_report", "catalog_record_key": "market-intel-report-20260520", "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "expected_summary_payload_hash": "e" * 64, }, } operator_evidence = { "report_catalog_record_run_receipt_artifact_path": ( "artifacts/market_intel/catalog-record-run-receipt.json" ), "report_catalog_record_run_readiness_artifact_path": ( "artifacts/market_intel/catalog-record-run-readiness.json" ), "report_catalog_record_run_package_artifact_path": ( "artifacts/market_intel/catalog-record-run-package.json" ), "catalog_record_payload_manifest_path": ( "artifacts/market_intel/catalog-record-payload.json" ), "catalog_record_backup_artifact_path": ( "artifacts/market_intel/catalog-record-backup.json" ), "catalog_record_write_dry_run_artifact_path": ( "artifacts/market_intel/catalog-record-dry-run.json" ), "catalog_record_writer_output_artifact_path": ( "artifacts/market_intel/catalog-record-writer-output.json" ), "catalog_record_postwrite_smoke_artifact_path": ( "artifacts/market_intel/catalog-record-postwrite-smoke.json" ), "catalog_record_cli_command": ( "python scripts/market_intel/write_report_catalog_record.py --input payload" ), "operator_confirmed_report_catalog_record_run_receipt": True, "operator_confirmed_catalog_record_run_readiness_reviewed": True, "operator_confirmed_catalog_record_cli_output_reviewed": True, "operator_confirmed_catalog_record_postwrite_smoke_passed": True, "operator_confirmed_catalog_record_backup_available": True, "operator_confirmed_catalog_record_commit_requires_separate_gate": True, "operator_confirmed_no_token_in_report_catalog_record_run_receipt": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_cli_execution": True, "operator_confirmed_no_api_catalog_record_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "catalog_record_run_receipt_notes": "manual run receipt reviewed", } receipt = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt( telegram_dispatch_report_catalog_record_run_readiness=readiness, catalog_record_run_receipt=receipt_payload, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt( telegram_dispatch_report_catalog_record_run_readiness=readiness, catalog_record_run_receipt=receipt_payload, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt( telegram_dispatch_report_catalog_record_run_readiness=readiness, catalog_record_run_receipt=receipt_payload, operator_evidence=operator_evidence, apply_real_write=True, ) assert receipt["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt_preview" ) assert receipt["target_operation"] == ( "review_manual_market_intel_report_catalog_record_run_receipt" ) assert receipt["telegram_dispatch_report_catalog_record_run_receipt_passed"] is True assert ( receipt[ "summary_persistence_telegram_dispatch_report_catalog_record_run_receipt_passed" ] is True ) assert receipt["report_catalog_record_run_receipt_passed"] is True assert receipt["ready_for_market_intel_report_catalog_record_commit"] is True assert receipt["ready_for_market_intel_report_catalog_record_cli_run"] is False assert receipt["ready_for_real_write"] is False assert receipt["ready_for_api_database_write"] is False assert receipt["api_executes_cli"] is False assert receipt["api_writes_file"] is False assert receipt["api_writes_database"] is False assert receipt["catalog_record_written"] is False assert receipt["catalog_record_run_receipt_gate_file_written"] is False assert receipt["catalog_record_run_receipt_executed"] is False assert receipt["catalog_record_commit_executed"] is False assert receipt["database_connection_opened"] is False assert receipt["database_write_executed"] is False assert receipt["scheduler_attached"] is False assert receipt["blocked_reasons"] == [] assert ( receipt["telegram_dispatch_report_catalog_record_run_receipt_writer"][ "catalog_record_written" ] is True ) assert ( receipt["telegram_dispatch_report_catalog_record_run_receipt_postwrite_smoke"][ "postwrite_smoke_passed" ] is True ) assert receipt["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_record_commit" ) assert token_leak["telegram_dispatch_report_catalog_record_run_receipt_passed"] is False assert "report_catalog_record_run_receipt_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_catalog_record_run_receipt_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert ( "do_not_execute_catalog_record_cli_from_report_catalog_record_run_receipt_api" in receipt["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_catalog_record_run_receipt_passed"] is False assert ( data[ "summary_persistence_telegram_dispatch_report_catalog_record_run_receipt_passed" ] is False ) assert data["report_catalog_record_run_receipt_passed"] is False assert data["ready_for_market_intel_report_catalog_record_commit"] is False assert data["ready_for_market_intel_report_catalog_record_cli_run"] is False assert data["ready_for_real_write"] is False assert data["ready_for_api_database_write"] is False assert data["api_executes_cli"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["catalog_record_written"] is False assert data["catalog_record_run_receipt_gate_file_written"] is False assert data["catalog_record_run_receipt_executed"] is False assert data["catalog_record_commit_executed"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_catalog_record_run_readiness"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness_preview" ) assert "report_catalog_record_run_readiness_passed" in data["blocked_reasons"] assert ( "catalog_record_run_receipt_writer_output_provided" in data["blocked_reasons"] ) assert ( "report_catalog_record_run_receipt_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert ( "do_not_execute_catalog_record_cli_from_report_catalog_record_run_receipt_api" in data["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit, ) run_receipt = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt_preview", "target_operation": "review_manual_market_intel_report_catalog_record_run_receipt", "telegram_dispatch_report_catalog_record_run_receipt_passed": True, "summary_persistence_telegram_dispatch_report_catalog_record_run_receipt_passed": True, "report_catalog_record_run_receipt_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_catalog_record_commit": True, "ready_for_market_intel_report_catalog_record_commit_gate": True, "ready_for_market_intel_report_catalog_record_cli_run": False, "statement_count": 1, "expected_summary_payload_hash": "e" * 64, "api_executes_cli": False, "api_writes_file": False, "api_writes_database": False, "catalog_record_written": False, "catalog_record_commit_executed": False, "database_write_executed": False, "scheduler_attached": False, "telegram_dispatch_report_catalog_record_run_receipt_writer": { "mode": "market_intel_report_catalog_record_run_receipt", "catalog_record_written": True, "target_table": "market_alert_review_queue", "target_column": "metadata_json", "record_family": "market_intel_telegram_dispatch_audit_report", "catalog_record_key": "market-intel-report-20260520", "statement_count": 1, "database_write_executed": True, "database_commit_executed": True, "database_rollback_executed": False, "summary_payload_hash_matches_expected": True, "approval_or_telegram_token_key_detected": False, }, "telegram_dispatch_report_catalog_record_run_receipt_postwrite_smoke": { "mode": "market_intel_report_catalog_record_postwrite_smoke_read_only", "postwrite_smoke_passed": True, "read_only_query_executed": True, "catalog_record_found": True, "target_table": "market_alert_review_queue", "target_column": "metadata_json", "record_family": "market_intel_telegram_dispatch_audit_report", "catalog_record_key": "market-intel-report-20260520", "database_write_executed": False, "database_commit_executed": False, "summary_payload_hash_matches_expected": True, "approval_or_telegram_token_key_detected": False, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_catalog_record_commit", "report_catalog_record_commit_requires_separate_gate": True, "api_must_not_write_database": True, "api_must_not_execute_cli": True, "api_must_not_write_catalog_record": True, }, "telegram_dispatch_report_catalog_record_run_receipt_sections": [ {"key": "catalog_record_run_receipt_identity"}, {"key": "catalog_record_run_receipt_cli_result"}, {"key": "catalog_record_run_receipt_postwrite_smoke"}, {"key": "catalog_record_run_receipt_safety"}, ], "safe_boundaries": [ "do_not_read_approval_token_from_report_catalog_record_run_receipt_api", "do_not_read_telegram_token_from_report_catalog_record_run_receipt_api", "do_not_call_llm_from_report_catalog_record_run_receipt", "do_not_generate_report_from_report_catalog_record_run_receipt_api", "do_not_write_report_catalog_record_run_receipt_artifact_from_api", "do_not_execute_catalog_record_cli_from_report_catalog_record_run_receipt_api", "do_not_write_report_catalog_record_from_report_catalog_record_run_receipt_api", "do_not_dispatch_telegram_from_report_catalog_record_run_receipt_api", "do_not_open_database_connection_from_report_catalog_record_run_receipt", "do_not_update_review_state_from_report_catalog_record_run_receipt", "do_not_attach_scheduler_from_report_catalog_record_run_receipt", "future_market_intel_report_catalog_record_commit_must_use_separate_gate", ], } operator_evidence = { "report_catalog_record_commit_artifact_path": ( "artifacts/market_intel/catalog-record-commit-gate.json" ), "report_catalog_record_run_receipt_artifact_path": ( "artifacts/market_intel/catalog-record-run-receipt.json" ), "catalog_record_writer_output_artifact_path": ( "artifacts/market_intel/catalog-record-writer-output.json" ), "catalog_record_postwrite_smoke_artifact_path": ( "artifacts/market_intel/catalog-record-postwrite-smoke.json" ), "catalog_record_backup_artifact_path": ( "artifacts/market_intel/catalog-record-backup.json" ), "operator_confirmed_report_catalog_record_commit_gate": True, "operator_confirmed_catalog_record_run_receipt_reviewed": True, "operator_confirmed_catalog_record_db_commit_observed": True, "operator_confirmed_catalog_record_postwrite_smoke_passed": True, "operator_confirmed_catalog_record_no_followup_db_write_required": True, "operator_confirmed_catalog_record_closeout_requires_separate_gate": True, "operator_confirmed_no_token_in_report_catalog_record_commit": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_cli_execution": True, "operator_confirmed_no_api_catalog_record_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "catalog_record_commit_notes": "manual commit gate reviewed", } commit = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit( telegram_dispatch_report_catalog_record_run_receipt=run_receipt, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit( telegram_dispatch_report_catalog_record_run_receipt=run_receipt, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit( telegram_dispatch_report_catalog_record_run_receipt=run_receipt, operator_evidence=operator_evidence, apply_real_write=True, ) assert commit["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit_preview" ) assert commit["target_operation"] == ( "review_manual_market_intel_report_catalog_record_commit" ) assert commit["telegram_dispatch_report_catalog_record_commit_passed"] is True assert ( commit[ "summary_persistence_telegram_dispatch_report_catalog_record_commit_passed" ] is True ) assert commit["report_catalog_record_commit_passed"] is True assert commit["ready_for_market_intel_report_catalog_record_closeout"] is True assert commit["ready_for_market_intel_report_catalog_record_commit"] is False assert commit["ready_for_market_intel_report_catalog_record_cli_run"] is False assert commit["ready_for_real_write"] is False assert commit["ready_for_api_database_write"] is False assert commit["api_executes_cli"] is False assert commit["api_writes_file"] is False assert commit["api_writes_database"] is False assert commit["catalog_record_written"] is False assert commit["catalog_record_commit_gate_file_written"] is False assert commit["catalog_record_commit_executed"] is False assert commit["catalog_record_closeout_gate_file_written"] is False assert commit["database_connection_opened"] is False assert commit["database_write_executed"] is False assert commit["scheduler_attached"] is False assert commit["blocked_reasons"] == [] assert commit["telegram_dispatch_report_catalog_record_run_receipt"][ "writer_database_commit_executed" ] is True assert commit["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_record_closeout" ) assert ( commit["promotion_gate"]["report_catalog_record_closeout_requires_separate_gate"] is True ) assert token_leak["telegram_dispatch_report_catalog_record_commit_passed"] is False assert "report_catalog_record_commit_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_catalog_record_commit_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert ( "do_not_commit_catalog_record_from_report_catalog_record_commit_api" in commit["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_catalog_record_commit_passed"] is False assert ( data[ "summary_persistence_telegram_dispatch_report_catalog_record_commit_passed" ] is False ) assert data["report_catalog_record_commit_passed"] is False assert data["ready_for_market_intel_report_catalog_record_closeout"] is False assert data["ready_for_market_intel_report_catalog_record_commit"] is False assert data["ready_for_market_intel_report_catalog_record_cli_run"] is False assert data["ready_for_real_write"] is False assert data["ready_for_api_database_write"] is False assert data["api_executes_cli"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["catalog_record_written"] is False assert data["catalog_record_commit_gate_file_written"] is False assert data["catalog_record_commit_executed"] is False assert data["catalog_record_closeout_gate_file_written"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_catalog_record_run_receipt"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt_preview" ) assert "report_catalog_record_run_receipt_passed" in data["blocked_reasons"] assert "report_catalog_record_commit_operator_confirmed" in data[ "blocked_reasons" ] assert ( "report_catalog_record_commit_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert ( "do_not_commit_catalog_record_from_report_catalog_record_commit_api" in data["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout, ) commit = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit_preview", "target_operation": "review_manual_market_intel_report_catalog_record_commit", "telegram_dispatch_report_catalog_record_commit_passed": True, "summary_persistence_telegram_dispatch_report_catalog_record_commit_passed": True, "report_catalog_record_commit_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_catalog_record_closeout": True, "ready_for_market_intel_report_catalog_record_commit": False, "ready_for_market_intel_report_catalog_record_cli_run": False, "statement_count": 1, "expected_summary_payload_hash": "e" * 64, "api_executes_cli": False, "api_writes_file": False, "api_writes_database": False, "api_dispatches_telegram": False, "catalog_record_written": False, "catalog_record_commit_executed": False, "database_write_executed": False, "scheduler_attached": False, "telegram_dispatch_report_catalog_record_run_receipt": { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt_preview", "run_receipt_passed": True, "writer_catalog_record_key": "market-intel-report-20260520", "writer_target_table": "market_alert_review_queue", "writer_target_column": "metadata_json", "writer_record_family": "market_intel_telegram_dispatch_audit_report", "writer_statement_count": 1, "writer_database_commit_executed": True, "writer_hash_match": True, "smoke_read_only_query_executed": True, "smoke_postwrite_smoke_passed": True, "smoke_hash_match": True, }, "operator_telegram_dispatch_report_catalog_record_commit": { "operator_confirmed_report_catalog_record_commit_gate": True, "operator_confirmed_catalog_record_run_receipt_reviewed": True, "operator_confirmed_catalog_record_db_commit_observed": True, "operator_confirmed_catalog_record_postwrite_smoke_passed": True, "operator_confirmed_catalog_record_no_followup_db_write_required": True, "operator_confirmed_catalog_record_closeout_requires_separate_gate": True, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_catalog_record_closeout", "report_catalog_record_closeout_requires_separate_gate": True, "api_must_not_write_database": True, "api_must_not_execute_cli": True, "api_must_not_write_catalog_record": True, "api_must_not_commit_catalog_record": True, "api_must_not_dispatch_telegram": True, }, "telegram_dispatch_report_catalog_record_commit_sections": [ {"key": "catalog_record_commit_identity"}, {"key": "catalog_record_commit_receipt"}, {"key": "catalog_record_commit_operator"}, {"key": "catalog_record_commit_safety"}, ], "safe_boundaries": [ "do_not_read_approval_token_from_report_catalog_record_commit_api", "do_not_read_telegram_token_from_report_catalog_record_commit_api", "do_not_call_llm_from_report_catalog_record_commit", "do_not_generate_report_from_report_catalog_record_commit_api", "do_not_write_report_catalog_record_commit_artifact_from_api", "do_not_execute_catalog_record_cli_from_report_catalog_record_commit_api", "do_not_write_report_catalog_record_from_report_catalog_record_commit_api", "do_not_commit_catalog_record_from_report_catalog_record_commit_api", "do_not_dispatch_telegram_from_report_catalog_record_commit_api", "do_not_open_database_connection_from_report_catalog_record_commit", "do_not_update_review_state_from_report_catalog_record_commit", "do_not_attach_scheduler_from_report_catalog_record_commit", "future_market_intel_report_catalog_record_closeout_must_use_separate_gate", ], } operator_evidence = { "report_catalog_record_closeout_artifact_path": ( "artifacts/market_intel/catalog-record-closeout-gate.json" ), "report_catalog_record_commit_artifact_path": ( "artifacts/market_intel/catalog-record-commit-gate.json" ), "report_catalog_record_run_receipt_artifact_path": ( "artifacts/market_intel/catalog-record-run-receipt.json" ), "catalog_record_writer_output_artifact_path": ( "artifacts/market_intel/catalog-record-writer-output.json" ), "catalog_record_postwrite_smoke_artifact_path": ( "artifacts/market_intel/catalog-record-postwrite-smoke.json" ), "catalog_record_backup_artifact_path": ( "artifacts/market_intel/catalog-record-backup.json" ), "operator_confirmed_report_catalog_record_closeout_gate": True, "operator_confirmed_report_catalog_record_commit_reviewed": True, "operator_confirmed_catalog_record_db_commit_observed": True, "operator_confirmed_catalog_record_no_followup_db_write_required": True, "operator_confirmed_catalog_record_closeout_summary_ready": True, "operator_confirmed_catalog_record_archive_requires_separate_gate": True, "operator_confirmed_no_token_in_report_catalog_record_closeout": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_cli_execution": True, "operator_confirmed_no_api_catalog_record_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "catalog_record_closeout_notes": "manual closeout gate reviewed", } closeout = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout( telegram_dispatch_report_catalog_record_commit=commit, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout( telegram_dispatch_report_catalog_record_commit=commit, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout( telegram_dispatch_report_catalog_record_commit=commit, operator_evidence=operator_evidence, apply_real_write=True, ) assert closeout["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout_preview" ) assert closeout["target_operation"] == ( "review_manual_market_intel_report_catalog_record_closeout" ) assert closeout["telegram_dispatch_report_catalog_record_closeout_passed"] is True assert ( closeout[ "summary_persistence_telegram_dispatch_report_catalog_record_closeout_passed" ] is True ) assert closeout["report_catalog_record_closeout_passed"] is True assert closeout["ready_for_market_intel_report_catalog_record_archive"] is True assert closeout["ready_for_market_intel_report_catalog_record_closeout"] is False assert closeout["ready_for_market_intel_report_catalog_record_commit"] is False assert closeout["ready_for_market_intel_report_catalog_record_cli_run"] is False assert closeout["ready_for_real_write"] is False assert closeout["ready_for_api_database_write"] is False assert closeout["api_executes_cli"] is False assert closeout["api_writes_file"] is False assert closeout["api_writes_database"] is False assert closeout["catalog_record_written"] is False assert closeout["catalog_record_closeout_gate_file_written"] is False assert closeout["catalog_record_closeout_executed"] is False assert closeout["catalog_record_archive_gate_file_written"] is False assert closeout["database_connection_opened"] is False assert closeout["database_write_executed"] is False assert closeout["scheduler_attached"] is False assert closeout["blocked_reasons"] == [] assert closeout["telegram_dispatch_report_catalog_record_commit"][ "writer_database_commit_executed" ] is True assert closeout["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_record_archive" ) assert ( closeout["promotion_gate"]["report_catalog_record_archive_requires_separate_gate"] is True ) assert token_leak["telegram_dispatch_report_catalog_record_closeout_passed"] is False assert "report_catalog_record_closeout_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_catalog_record_closeout_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert ( "do_not_commit_catalog_record_from_report_catalog_record_closeout_api" in closeout["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_catalog_record_closeout_passed"] is False assert ( data[ "summary_persistence_telegram_dispatch_report_catalog_record_closeout_passed" ] is False ) assert data["report_catalog_record_closeout_passed"] is False assert data["ready_for_market_intel_report_catalog_record_archive"] is False assert data["ready_for_market_intel_report_catalog_record_closeout"] is False assert data["ready_for_market_intel_report_catalog_record_commit"] is False assert data["ready_for_market_intel_report_catalog_record_cli_run"] is False assert data["ready_for_real_write"] is False assert data["ready_for_api_database_write"] is False assert data["api_executes_cli"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["catalog_record_written"] is False assert data["catalog_record_closeout_gate_file_written"] is False assert data["catalog_record_closeout_executed"] is False assert data["catalog_record_archive_gate_file_written"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_catalog_record_commit"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit_preview" ) assert "report_catalog_record_commit_passed" in data["blocked_reasons"] assert "report_catalog_record_closeout_operator_confirmed" in data[ "blocked_reasons" ] assert ( "report_catalog_record_closeout_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert ( "do_not_commit_catalog_record_from_report_catalog_record_closeout_api" in data["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive, ) closeout = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout_preview", "target_operation": "review_manual_market_intel_report_catalog_record_closeout", "telegram_dispatch_report_catalog_record_closeout_passed": True, "summary_persistence_telegram_dispatch_report_catalog_record_closeout_passed": True, "report_catalog_record_closeout_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_catalog_record_archive": True, "ready_for_market_intel_report_catalog_record_closeout": False, "statement_count": 1, "expected_summary_payload_hash": "e" * 64, "api_executes_cli": False, "api_writes_file": False, "api_writes_database": False, "api_dispatches_telegram": False, "database_write_executed": False, "catalog_record_closeout_executed": False, "scheduler_attached": False, "telegram_dispatch_report_catalog_record_commit": { "writer_catalog_record_key": "market-intel-report-20260520", "writer_target_table": "market_alert_review_queue", "writer_target_column": "metadata_json", "writer_record_family": "market_intel_telegram_dispatch_audit_report", "writer_statement_count": 1, "writer_database_commit_executed": True, "writer_hash_match": True, "smoke_read_only_query_executed": True, "smoke_postwrite_smoke_passed": True, "smoke_hash_match": True, }, "operator_telegram_dispatch_report_catalog_record_closeout": { "report_catalog_record_closeout_artifact_path": ( "artifacts/market_intel/catalog-record-closeout-gate.json" ), "report_catalog_record_commit_artifact_path_recorded": True, "report_catalog_record_run_receipt_artifact_path_recorded": True, "catalog_record_writer_output_artifact_path_recorded": True, "catalog_record_postwrite_smoke_artifact_path_recorded": True, "catalog_record_backup_artifact_path_recorded": True, "operator_confirmed_report_catalog_record_closeout_gate": True, "operator_confirmed_report_catalog_record_commit_reviewed": True, "operator_confirmed_catalog_record_db_commit_observed": True, "operator_confirmed_catalog_record_no_followup_db_write_required": True, "operator_confirmed_catalog_record_closeout_summary_ready": True, "operator_confirmed_catalog_record_archive_requires_separate_gate": True, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_catalog_record_archive", "report_catalog_record_archive_requires_separate_gate": True, "api_must_not_generate_report": True, "api_must_not_write_file": True, "api_must_not_execute_cli": True, "api_must_not_write_catalog_record": True, "api_must_not_write_database": True, "api_must_not_commit_catalog_record": True, "api_must_not_dispatch_telegram": True, }, "safe_boundaries": [ "do_not_read_approval_token_from_report_catalog_record_closeout_api", "do_not_read_telegram_token_from_report_catalog_record_closeout_api", "do_not_call_llm_from_report_catalog_record_closeout", "do_not_generate_report_from_report_catalog_record_closeout_api", "do_not_write_report_catalog_record_closeout_artifact_from_api", "do_not_execute_catalog_record_cli_from_report_catalog_record_closeout_api", "do_not_write_report_catalog_record_from_report_catalog_record_closeout_api", "do_not_commit_catalog_record_from_report_catalog_record_closeout_api", "do_not_dispatch_telegram_from_report_catalog_record_closeout_api", "do_not_open_database_connection_from_report_catalog_record_closeout", "do_not_update_review_state_from_report_catalog_record_closeout", "do_not_attach_scheduler_from_report_catalog_record_closeout", "future_market_intel_report_catalog_record_archive_must_use_separate_gate", ], } operator_evidence = { "report_catalog_record_archive_artifact_path": ( "artifacts/market_intel/catalog-record-archive-gate.json" ), "report_catalog_record_closeout_artifact_path": ( "artifacts/market_intel/catalog-record-closeout-gate.json" ), "report_catalog_record_commit_artifact_path": ( "artifacts/market_intel/catalog-record-commit-gate.json" ), "report_catalog_record_run_receipt_artifact_path": ( "artifacts/market_intel/catalog-record-run-receipt.json" ), "catalog_record_writer_output_artifact_path": ( "artifacts/market_intel/catalog-record-writer-output.json" ), "catalog_record_postwrite_smoke_artifact_path": ( "artifacts/market_intel/catalog-record-postwrite-smoke.json" ), "catalog_record_backup_artifact_path": ( "artifacts/market_intel/catalog-record-backup.json" ), "operator_confirmed_report_catalog_record_archive_gate": True, "operator_confirmed_report_catalog_record_closeout_reviewed": True, "operator_confirmed_catalog_record_db_commit_observed": True, "operator_confirmed_catalog_record_no_followup_db_write_required": True, "operator_confirmed_catalog_record_archive_manifest_reviewed": True, "operator_confirmed_catalog_record_archive_retention_policy_recorded": True, "operator_confirmed_catalog_record_archive_summary_requires_separate_gate": True, "operator_confirmed_no_token_in_report_catalog_record_archive": True, "operator_confirmed_no_api_report_generation": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_cli_execution": True, "operator_confirmed_no_api_catalog_record_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "catalog_record_archive_notes": "manual archive gate reviewed", } archive = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive( telegram_dispatch_report_catalog_record_closeout=closeout, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive( telegram_dispatch_report_catalog_record_closeout=closeout, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive( telegram_dispatch_report_catalog_record_closeout=closeout, operator_evidence=operator_evidence, apply_real_write=True, ) assert archive["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_preview" ) assert archive["target_operation"] == ( "review_manual_market_intel_report_catalog_record_archive" ) assert archive["telegram_dispatch_report_catalog_record_archive_passed"] is True assert ( archive[ "summary_persistence_telegram_dispatch_report_catalog_record_archive_passed" ] is True ) assert archive["report_catalog_record_archive_passed"] is True assert archive["ready_for_market_intel_report_catalog_record_archive_summary"] is True assert archive["ready_for_market_intel_report_catalog_record_archive"] is False assert archive["ready_for_real_write"] is False assert archive["ready_for_report_generation"] is False assert archive["ready_for_api_database_write"] is False assert archive["api_executes_cli"] is False assert archive["api_writes_file"] is False assert archive["api_writes_database"] is False assert archive["catalog_record_written"] is False assert archive["catalog_record_archive_gate_file_written"] is False assert archive["catalog_record_archive_executed"] is False assert archive["database_connection_opened"] is False assert archive["database_write_executed"] is False assert archive["scheduler_attached"] is False assert archive["blocked_reasons"] == [] assert archive["telegram_dispatch_report_catalog_record_closeout"][ "writer_database_commit_executed" ] is True assert archive["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_record_archive_summary" ) assert ( archive["promotion_gate"][ "report_catalog_record_archive_summary_requires_separate_gate" ] is True ) assert token_leak["telegram_dispatch_report_catalog_record_archive_passed"] is False assert "report_catalog_record_archive_no_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert ( "report_catalog_record_archive_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert ( "do_not_commit_catalog_record_from_report_catalog_record_archive_api" in archive["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_catalog_record_archive_passed"] is False assert ( data[ "summary_persistence_telegram_dispatch_report_catalog_record_archive_passed" ] is False ) assert data["report_catalog_record_archive_passed"] is False assert data["ready_for_market_intel_report_catalog_record_archive_summary"] is False assert data["ready_for_market_intel_report_catalog_record_archive"] is False assert data["ready_for_real_write"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_api_database_write"] is False assert data["api_executes_cli"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["catalog_record_written"] is False assert data["catalog_record_archive_gate_file_written"] is False assert data["catalog_record_archive_executed"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_catalog_record_closeout"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout_preview" ) assert "report_catalog_record_closeout_passed" in data["blocked_reasons"] assert "report_catalog_record_archive_operator_confirmed" in data[ "blocked_reasons" ] assert ( "report_catalog_record_archive_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert ( "do_not_commit_catalog_record_from_report_catalog_record_archive_api" in data["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary, ) archive = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_preview", "target_operation": "review_manual_market_intel_report_catalog_record_archive", "telegram_dispatch_report_catalog_record_archive_passed": True, "summary_persistence_telegram_dispatch_report_catalog_record_archive_passed": True, "report_catalog_record_archive_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_catalog_record_archive_summary": True, "ready_for_market_intel_report_catalog_record_archive": False, "statement_count": 1, "expected_summary_payload_hash": "f" * 64, "api_executes_cli": False, "api_writes_file": False, "api_writes_database": False, "api_dispatches_telegram": False, "database_write_executed": False, "catalog_record_archive_executed": False, "scheduler_attached": False, "telegram_dispatch_report_catalog_record_closeout": { "writer_record_family": "market_intel_telegram_dispatch_audit_report", "writer_catalog_record_key": "market-intel-report-20260520", "writer_target_table": "market_alert_review_queue", "writer_target_column": "metadata_json", "writer_statement_count": 1, "writer_database_commit_executed": True, "writer_hash_match": True, "smoke_read_only_query_executed": True, "smoke_postwrite_smoke_passed": True, "smoke_hash_match": True, "closeout_passed": True, "operator_closeout_artifact_path": ( "artifacts/market_intel/catalog-record-closeout-gate.json" ), "operator_commit_artifact_path_recorded": True, "operator_run_receipt_artifact_path_recorded": True, "operator_writer_output_artifact_path_recorded": True, "operator_postwrite_smoke_artifact_path_recorded": True, "operator_backup_artifact_path_recorded": True, }, "operator_telegram_dispatch_report_catalog_record_archive": { "report_catalog_record_archive_artifact_path": ( "artifacts/market_intel/catalog-record-archive-gate.json" ), "report_catalog_record_closeout_artifact_path_recorded": True, "report_catalog_record_commit_artifact_path_recorded": True, "report_catalog_record_run_receipt_artifact_path_recorded": True, "catalog_record_writer_output_artifact_path_recorded": True, "catalog_record_postwrite_smoke_artifact_path_recorded": True, "catalog_record_backup_artifact_path_recorded": True, "operator_confirmed_report_catalog_record_archive_gate": True, "operator_confirmed_report_catalog_record_closeout_reviewed": True, "operator_confirmed_catalog_record_db_commit_observed": True, "operator_confirmed_catalog_record_no_followup_db_write_required": True, "operator_confirmed_catalog_record_archive_manifest_reviewed": True, "operator_confirmed_catalog_record_archive_retention_policy_recorded": True, "operator_confirmed_catalog_record_archive_summary_requires_separate_gate": True, }, "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_catalog_record_archive_summary", "report_catalog_record_archive_summary_requires_separate_gate": True, "api_must_not_generate_report": True, "api_must_not_write_file": True, "api_must_not_execute_cli": True, "api_must_not_write_catalog_record": True, "api_must_not_write_database": True, "api_must_not_commit_catalog_record": True, "api_must_not_dispatch_telegram": True, }, "safe_boundaries": [ "do_not_read_approval_token_from_report_catalog_record_archive_api", "do_not_read_telegram_token_from_report_catalog_record_archive_api", "do_not_call_llm_from_report_catalog_record_archive", "do_not_generate_report_from_report_catalog_record_archive_api", "do_not_write_report_catalog_record_archive_artifact_from_api", "do_not_execute_catalog_record_cli_from_report_catalog_record_archive_api", "do_not_write_report_catalog_record_from_report_catalog_record_archive_api", "do_not_commit_catalog_record_from_report_catalog_record_archive_api", "do_not_dispatch_telegram_from_report_catalog_record_archive_api", "do_not_open_database_connection_from_report_catalog_record_archive", "do_not_update_review_state_from_report_catalog_record_archive", "do_not_attach_scheduler_from_report_catalog_record_archive", "future_market_intel_report_catalog_record_archive_summary_must_use_separate_gate", ], } operator_evidence = { "report_catalog_record_archive_summary_artifact_path": ( "artifacts/market_intel/catalog-record-archive-summary-gate.json" ), "report_catalog_record_archive_artifact_path": ( "artifacts/market_intel/catalog-record-archive-gate.json" ), "report_catalog_record_closeout_artifact_path": ( "artifacts/market_intel/catalog-record-closeout-gate.json" ), "report_catalog_record_commit_artifact_path": ( "artifacts/market_intel/catalog-record-commit-gate.json" ), "report_catalog_record_run_receipt_artifact_path": ( "artifacts/market_intel/catalog-record-run-receipt.json" ), "catalog_record_writer_output_artifact_path": ( "artifacts/market_intel/catalog-record-writer-output.json" ), "catalog_record_postwrite_smoke_artifact_path": ( "artifacts/market_intel/catalog-record-postwrite-smoke.json" ), "catalog_record_backup_artifact_path": ( "artifacts/market_intel/catalog-record-backup.json" ), "operator_confirmed_report_catalog_record_archive_summary_gate": True, "operator_confirmed_report_catalog_record_archive_reviewed": True, "operator_confirmed_catalog_record_traceability_reviewed": True, "operator_confirmed_catalog_record_archive_summary_read_only": True, "operator_confirmed_catalog_record_final_closeout_requires_separate_gate": True, "operator_confirmed_no_token_in_report_catalog_record_archive_summary": True, "operator_confirmed_no_api_report_generation": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_cli_execution": True, "operator_confirmed_no_api_catalog_record_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "catalog_record_archive_summary_notes": "manual archive summary reviewed", } summary = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary( telegram_dispatch_report_catalog_record_archive=archive, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary( telegram_dispatch_report_catalog_record_archive=archive, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary( telegram_dispatch_report_catalog_record_archive=archive, operator_evidence=operator_evidence, apply_real_write=True, ) assert summary["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary_preview" ) assert summary["target_operation"] == ( "summarize_manual_market_intel_report_catalog_record_archive" ) assert summary["telegram_dispatch_report_catalog_record_archive_summary_passed"] is True assert ( summary[ "summary_persistence_telegram_dispatch_report_catalog_record_archive_summary_passed" ] is True ) assert summary["report_catalog_record_archive_summary_passed"] is True assert summary["ready_for_market_intel_report_catalog_record_final_closeout"] is True assert summary["ready_for_market_intel_report_catalog_record_archive_summary"] is False assert summary["ready_for_market_intel_report_catalog_record_archive"] is False assert summary["ready_for_real_write"] is False assert summary["ready_for_report_generation"] is False assert summary["ready_for_api_database_write"] is False assert summary["api_executes_cli"] is False assert summary["api_writes_file"] is False assert summary["api_writes_database"] is False assert summary["catalog_record_written"] is False assert summary["catalog_record_archive_summary_gate_file_written"] is False assert summary["catalog_record_archive_summary_executed"] is False assert summary["catalog_record_final_closeout_gate_file_written"] is False assert summary["database_connection_opened"] is False assert summary["database_write_executed"] is False assert summary["scheduler_attached"] is False assert summary["blocked_reasons"] == [] assert summary["telegram_dispatch_report_catalog_record_archive"][ "writer_database_commit_executed" ] is True assert summary["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_record_final_closeout" ) assert ( summary["promotion_gate"][ "report_catalog_record_final_closeout_requires_separate_gate" ] is True ) assert ( token_leak[ "telegram_dispatch_report_catalog_record_archive_summary_passed" ] is False ) assert ( "report_catalog_record_archive_summary_no_token_submitted_to_api" in token_leak["blocked_reasons"] ) assert ( "report_catalog_record_archive_summary_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert ( "do_not_commit_catalog_record_from_report_catalog_record_archive_summary_api" in summary["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_catalog_record_archive_summary_passed"] is False assert ( data[ "summary_persistence_telegram_dispatch_report_catalog_record_archive_summary_passed" ] is False ) assert data["report_catalog_record_archive_summary_passed"] is False assert data["ready_for_market_intel_report_catalog_record_final_closeout"] is False assert data["ready_for_market_intel_report_catalog_record_archive_summary"] is False assert data["ready_for_real_write"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_api_database_write"] is False assert data["api_executes_cli"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["catalog_record_written"] is False assert data["catalog_record_archive_summary_gate_file_written"] is False assert data["catalog_record_archive_summary_executed"] is False assert data["catalog_record_final_closeout_gate_file_written"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_catalog_record_archive"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_preview" ) assert "report_catalog_record_archive_passed" in data["blocked_reasons"] assert "report_catalog_record_archive_summary_operator_confirmed" in data[ "blocked_reasons" ] assert ( "report_catalog_record_archive_summary_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert ( "do_not_commit_catalog_record_from_report_catalog_record_archive_summary_api" in data["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout_contract_only(): from services.market_intel.candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout import ( build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout, ) archive_summary = { "mode": "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary_preview", "target_operation": "summarize_manual_market_intel_report_catalog_record_archive", "telegram_dispatch_report_catalog_record_archive_summary_passed": True, "summary_persistence_telegram_dispatch_report_catalog_record_archive_summary_passed": True, "report_catalog_record_archive_summary_passed": True, "ready_for_next_manual_phase": True, "ready_for_market_intel_report_catalog_record_final_closeout": True, "ready_for_market_intel_report_catalog_record_archive_summary": False, "statement_count": 1, "expected_summary_payload_hash": "a" * 64, "api_executes_cli": False, "api_writes_file": False, "api_writes_database": False, "api_dispatches_telegram": False, "database_write_executed": False, "catalog_record_archive_summary_executed": False, "scheduler_attached": False, "telegram_dispatch_report_catalog_record_archive": { "writer_record_family": "market_intel_telegram_dispatch_audit_report", "writer_catalog_record_key": "market-intel-report-20260520", "writer_target_table": "market_alert_review_queue", "writer_target_column": "metadata_json", "writer_statement_count": 1, "writer_database_commit_executed": True, "writer_hash_match": True, "smoke_read_only_query_executed": True, "smoke_postwrite_smoke_passed": True, "smoke_hash_match": True, "archive_passed": True, "archive_artifact_path": ( "artifacts/market_intel/catalog-record-archive-gate.json" ), "archive_closeout_artifact_path_recorded": True, "archive_commit_artifact_path_recorded": True, "archive_run_receipt_artifact_path_recorded": True, "archive_writer_output_artifact_path_recorded": True, "archive_postwrite_smoke_artifact_path_recorded": True, "archive_backup_artifact_path_recorded": True, }, "operator_telegram_dispatch_report_catalog_record_archive_summary": { "report_catalog_record_archive_summary_artifact_path": ( "artifacts/market_intel/catalog-record-archive-summary-gate.json" ), "report_catalog_record_archive_artifact_path_recorded": True, "operator_confirmed_report_catalog_record_archive_summary_gate": True, "operator_confirmed_report_catalog_record_archive_reviewed": True, "operator_confirmed_catalog_record_traceability_reviewed": True, "operator_confirmed_catalog_record_archive_summary_read_only": True, "operator_confirmed_catalog_record_final_closeout_requires_separate_gate": True, }, "telegram_dispatch_report_catalog_record_archive_summary_sections": [ {"key": "catalog_record_archive_summary_identity", "facts": []}, {"key": "catalog_record_archive_summary_traceability", "facts": []}, {"key": "catalog_record_archive_summary_integrity", "facts": []}, {"key": "catalog_record_archive_summary_safety", "facts": []}, ], "promotion_gate": { "allowed": True, "next_manual_phase": "market_intel_report_catalog_record_final_closeout", "report_catalog_record_final_closeout_requires_separate_gate": True, "api_must_not_generate_report": True, "api_must_not_write_file": True, "api_must_not_execute_cli": True, "api_must_not_write_catalog_record": True, "api_must_not_write_database": True, "api_must_not_commit_catalog_record": True, "api_must_not_dispatch_telegram": True, }, "safe_boundaries": [ "do_not_read_approval_token_from_report_catalog_record_archive_summary_api", "do_not_read_telegram_token_from_report_catalog_record_archive_summary_api", "do_not_call_llm_from_report_catalog_record_archive_summary", "do_not_generate_report_from_report_catalog_record_archive_summary_api", "do_not_write_report_catalog_record_archive_summary_artifact_from_api", "do_not_execute_catalog_record_cli_from_report_catalog_record_archive_summary_api", "do_not_write_report_catalog_record_from_report_catalog_record_archive_summary_api", "do_not_commit_catalog_record_from_report_catalog_record_archive_summary_api", "do_not_dispatch_telegram_from_report_catalog_record_archive_summary_api", "do_not_open_database_connection_from_report_catalog_record_archive_summary", "do_not_update_review_state_from_report_catalog_record_archive_summary", "do_not_attach_scheduler_from_report_catalog_record_archive_summary", "future_market_intel_report_catalog_record_final_closeout_must_use_separate_gate", ], } operator_evidence = { "report_catalog_record_final_closeout_artifact_path": ( "artifacts/market_intel/catalog-record-final-closeout-gate.json" ), "report_catalog_record_archive_summary_artifact_path": ( "artifacts/market_intel/catalog-record-archive-summary-gate.json" ), "report_catalog_record_archive_artifact_path": ( "artifacts/market_intel/catalog-record-archive-gate.json" ), "report_catalog_record_closeout_artifact_path": ( "artifacts/market_intel/catalog-record-closeout-gate.json" ), "report_catalog_record_commit_artifact_path": ( "artifacts/market_intel/catalog-record-commit-gate.json" ), "report_catalog_record_run_receipt_artifact_path": ( "artifacts/market_intel/catalog-record-run-receipt.json" ), "catalog_record_writer_output_artifact_path": ( "artifacts/market_intel/catalog-record-writer-output.json" ), "catalog_record_postwrite_smoke_artifact_path": ( "artifacts/market_intel/catalog-record-postwrite-smoke.json" ), "catalog_record_backup_artifact_path": ( "artifacts/market_intel/catalog-record-backup.json" ), "operator_confirmed_report_catalog_record_final_closeout_gate": True, "operator_confirmed_report_catalog_record_archive_summary_reviewed": True, "operator_confirmed_catalog_record_traceability_reviewed": True, "operator_confirmed_catalog_record_pipeline_complete": True, "operator_confirmed_no_pending_catalog_record_followup": True, "operator_confirmed_catalog_record_final_closeout_read_only": True, "operator_confirmed_no_token_in_report_catalog_record_final_closeout": True, "operator_confirmed_no_api_report_generation": True, "operator_confirmed_no_api_file_write": True, "operator_confirmed_no_api_cli_execution": True, "operator_confirmed_no_api_catalog_record_write": True, "operator_confirmed_no_api_telegram_dispatch": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_no_llm_call": True, "operator_confirmed_no_scheduler_attach": True, "catalog_record_final_closeout_notes": "manual final closeout reviewed", } closeout = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout( telegram_dispatch_report_catalog_record_archive_summary=archive_summary, operator_evidence=operator_evidence, execute_requested=True, ) token_leak = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout( telegram_dispatch_report_catalog_record_archive_summary=archive_summary, operator_evidence={**operator_evidence, "telegram_token": TEST_APPROVAL_TOKEN}, ) apply_write = build_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout( telegram_dispatch_report_catalog_record_archive_summary=archive_summary, operator_evidence=operator_evidence, apply_real_write=True, ) assert closeout["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout_preview" ) assert closeout["target_operation"] == ( "close_manual_market_intel_report_catalog_record_pipeline" ) assert closeout["telegram_dispatch_report_catalog_record_final_closeout_passed"] is True assert ( closeout[ "summary_persistence_telegram_dispatch_report_catalog_record_final_closeout_passed" ] is True ) assert closeout["report_catalog_record_final_closeout_passed"] is True assert closeout["market_intel_report_catalog_record_pipeline_complete"] is True assert closeout["ready_for_next_manual_phase"] is False assert closeout["ready_for_market_intel_report_catalog_record_final_closeout"] is False assert closeout["ready_for_real_write"] is False assert closeout["ready_for_report_generation"] is False assert closeout["ready_for_api_database_write"] is False assert closeout["api_executes_cli"] is False assert closeout["api_writes_file"] is False assert closeout["api_writes_database"] is False assert closeout["catalog_record_written"] is False assert closeout["catalog_record_final_closeout_gate_file_written"] is False assert closeout["catalog_record_final_closeout_executed"] is False assert closeout["catalog_record_pipeline_completion_record_written"] is False assert closeout["market_intel_catalog_record_pipeline_completed_by_api"] is False assert closeout["database_connection_opened"] is False assert closeout["database_write_executed"] is False assert closeout["scheduler_attached"] is False assert closeout["blocked_reasons"] == [] assert closeout["telegram_dispatch_report_catalog_record_archive_summary"][ "writer_database_commit_executed" ] is True assert closeout["promotion_gate"]["next_manual_phase"] == ( "market_intel_report_catalog_record_pipeline_complete" ) assert closeout["promotion_gate"]["terminal_gate"] is True assert ( token_leak["telegram_dispatch_report_catalog_record_final_closeout_passed"] is False ) assert ( "report_catalog_record_final_closeout_no_token_submitted_to_api" in token_leak["blocked_reasons"] ) assert ( "report_catalog_record_final_closeout_apply_real_write_not_requested_from_api" in apply_write["blocked_reasons"] ) assert ( "do_not_commit_catalog_record_from_report_catalog_record_final_closeout_api" in closeout["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_report_catalog_record_final_closeout_passed"] is False assert ( data[ "summary_persistence_telegram_dispatch_report_catalog_record_final_closeout_passed" ] is False ) assert data["report_catalog_record_final_closeout_passed"] is False assert data["market_intel_report_catalog_record_pipeline_complete"] is False assert data["ready_for_market_intel_report_catalog_record_final_closeout"] is False assert data["ready_for_real_write"] is False assert data["ready_for_report_generation"] is False assert data["ready_for_api_database_write"] is False assert data["api_executes_cli"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["catalog_record_written"] is False assert data["catalog_record_final_closeout_gate_file_written"] is False assert data["catalog_record_final_closeout_executed"] is False assert data["catalog_record_pipeline_completion_record_written"] is False assert data["market_intel_catalog_record_pipeline_completed_by_api"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["scheduler_attached"] is False assert data["telegram_dispatch_report_catalog_record_archive_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary_preview" ) assert "report_catalog_record_archive_summary_passed" in data["blocked_reasons"] assert "report_catalog_record_final_closeout_operator_confirmed" in data[ "blocked_reasons" ] assert ( "report_catalog_record_final_closeout_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert ( "do_not_commit_catalog_record_from_report_catalog_record_final_closeout_api" in data["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_writer_preflight_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/candidate_queue_writer_preflight", json={ "sample_result": { "batch_id": "sample-batch-18", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "f" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "candidate_queue_writer_preflight_planned" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is False assert data["read_only_query_executed"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 1 assert data["payload_column_map"]["metadata_json_preview"] == "metadata_json" def test_candidate_queue_writer_status_route_never_leaks_approval_token(monkeypatch): from routes.market_intel_routes import market_intel_bp monkeypatch.setenv("MARKET_INTEL_QUEUE_WRITE_APPROVAL", TEST_APPROVAL_TOKEN) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/candidate_queue_writer_status" "?execute=true&apply_real_write=true", json={ "sample_result": { "batch_id": "sample-batch-14", "platform_code": "pchome", "source_key": "homepage", "source_url": "https://24h.pchome.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1800, "page_hash": "b" * 64, "title": "PChome 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "medium", "score": 74, "url": "https://24h.pchome.com.tw/activity/sample", "text": "活動頁", }, ], }, } }, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert response.status_code == 200 assert data["mode"] == "candidate_queue_writer_cli_blocked" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is True assert data["apply_real_write_requested"] is True assert data["approval_token_present"] is False assert data["approval_token_valid"] is False assert data["approval_token_secret_configured"] is True assert data["ready_for_real_write"] is False assert data["writes_executed"] is False assert data["would_write_database"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["transaction_preview_summary"]["statement_count"] == 1 assert "approval_token_present" in data["blocked_reasons"] assert "approval_token_valid" in data["blocked_reasons"] assert "approval_token_hint" not in payload assert TEST_APPROVAL_TOKEN not in payload assert "APPROVED_MARKET_INTEL_QUEUE_WRITE" not in payload def test_candidate_queue_writer_status_blocks_invalid_payload(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/candidate_queue_writer_status", data="not-json", content_type="application/json", ) data = response.get_json() assert response.status_code == 400 assert data["mode"] == "candidate_queue_writer_cli_blocked" assert data["ready_for_real_write"] is False assert data["writes_executed"] is False assert data["transaction_preview_summary"]["statement_count"] == 0 assert "transaction_preview_created" in data["blocked_reasons"] def test_candidate_queue_writer_postwrite_smoke_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_writer_postwrite_smoke", json={ "sample_result": { "batch_id": "sample-batch-22", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "4" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "candidate_queue_writer_postwrite_smoke_planned" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is False assert data["read_only_query_executed"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["expected_dedupe_key_count"] == 1 assert data["postwrite_smoke_passed"] is False def test_candidate_queue_writer_operator_drill_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_writer_operator_drill", json={ "sample_result": { "batch_id": "sample-batch-24", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "6" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "candidate_queue_writer_operator_drill_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["operator_drill_ready"] is True assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["statement_summary"]["statement_count"] == 1 assert "backup_verified_by_operator" in data["blocked_reasons"] def test_candidate_queue_writer_run_package_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_writer_run_package", json={ "sample_result": { "batch_id": "sample-batch-26", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "8" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, } }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "candidate_queue_writer_run_package_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["package_ready"] is True assert data["package_artifact_created"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["payload_manifest"]["payload_count"] == 1 assert len(data["command_bundle"]) == 5 assert "real_sample_payload_saved_by_operator" in data["blocked_reasons"] def test_candidate_queue_writer_run_readiness_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_writer_run_readiness", json={ "sample_result": { "batch_id": "sample-batch-28", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "a" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, }, "operator_evidence": { "reviewed_sample_json_path": "artifacts/market_intel/reviewed.json", "backup_artifact_path": "scripts/tools/backups/backup.zip", "preflight_artifact_path": "artifacts/market_intel/preflight.json", "migration_live_smoke_passed": True, "operator_acknowledged_shell_only_token": True, }, }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "candidate_queue_writer_run_readiness_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["ready_for_cli_operator_run"] is True assert data["ready_for_api_database_write"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["run_package_summary"]["payload_count"] == 1 assert data["operator_evidence_summary"]["artifact_path_count"] == 3 assert data["blocked_reasons"] == [] def test_candidate_queue_writer_run_receipt_preview_reviews_operator_artifacts(): from services.market_intel.candidate_queue_writer_cli import ( build_candidate_queue_writer_cli_plan, ) from services.market_intel.candidate_queue_writer_operator_drill import ( build_candidate_queue_writer_operator_drill, ) from services.market_intel.candidate_queue_writer_postwrite_smoke import ( build_candidate_queue_writer_postwrite_smoke, ) from services.market_intel.candidate_queue_writer_preflight import ( build_candidate_queue_writer_preflight, ) from services.market_intel.candidate_queue_writer_run_package import ( build_candidate_queue_writer_run_package, ) from services.market_intel.candidate_queue_writer_run_readiness import ( build_candidate_queue_writer_run_readiness, ) from services.market_intel.candidate_queue_writer_run_receipt import ( build_candidate_queue_writer_run_receipt, ) sample_result = _market_intel_sample_result("sample-batch-29") transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) expected_key = transaction["statements"][0]["lookup"]["dedupe_key"] preflight = build_candidate_queue_writer_preflight( transaction_preview=transaction, execute_requested=False, ) writer_status = build_candidate_queue_writer_cli_plan( transaction_preview=transaction, writer_preflight=preflight, ) postwrite_smoke = build_candidate_queue_writer_postwrite_smoke( transaction_preview=transaction, execute_requested=False, ) operator_drill = build_candidate_queue_writer_operator_drill( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, ) run_package = build_candidate_queue_writer_run_package( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, operator_drill=operator_drill, ) operator_evidence = { "reviewed_sample_json_path": "artifacts/market_intel/reviewed.json", "backup_artifact_path": "scripts/tools/backups/backup.zip", "preflight_artifact_path": "artifacts/market_intel/preflight.json", "migration_live_smoke_passed": True, "operator_acknowledged_shell_only_token": True, "writer_output_json_path": "artifacts/market_intel/writer-output.json", "postwrite_smoke_json_path": "artifacts/market_intel/postwrite-smoke.json", "operator_confirmed_no_token_in_artifacts": True, } run_readiness = build_candidate_queue_writer_run_readiness( transaction_preview=transaction, writer_preflight=preflight, writer_status=writer_status, postwrite_smoke=postwrite_smoke, operator_drill=operator_drill, run_package=run_package, operator_evidence=operator_evidence, ) writer_output = { "mode": "candidate_queue_writer_cli_executed", "exit_code": 0, "writes_executed": True, "would_write_database": True, "database_connection_opened": True, "explicit_transaction_opened": True, "database_write_executed": True, "database_commit_executed": True, "database_rollback_executed": False, "external_network_executed": False, "scheduler_attached": False, "inserted_count": 1, "skipped_count": 0, "affected_dedupe_keys": [expected_key], "skipped_dedupe_keys": [], } postwrite_smoke_result = { "mode": "candidate_queue_writer_postwrite_smoke_read_only", "postwrite_smoke_passed": True, "ready_for_operator_review": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "external_network_executed": False, "scheduler_attached": False, "expected_dedupe_key_count": 1, "found_count": 1, "missing_count": 0, "found_dedupe_keys": [expected_key], "missing_dedupe_keys": [], } receipt = build_candidate_queue_writer_run_receipt( transaction_preview=transaction, run_readiness=run_readiness, writer_output=writer_output, postwrite_smoke_result=postwrite_smoke_result, operator_evidence=operator_evidence, ) token_leak = build_candidate_queue_writer_run_receipt( transaction_preview=transaction, run_readiness=run_readiness, writer_output={**writer_output, "approval_token": TEST_APPROVAL_TOKEN}, postwrite_smoke_result=postwrite_smoke_result, operator_evidence=operator_evidence, ) assert receipt["mode"] == "candidate_queue_writer_run_receipt_preview" assert receipt["receipt_passed"] is True assert receipt["ready_for_next_manual_review"] is True assert receipt["ready_for_api_database_write"] is False assert receipt["ready_for_scheduler_attach"] is False assert receipt["api_executes_cli"] is False assert receipt["api_reads_approval_token"] is False assert receipt["api_writes_file"] is False assert receipt["database_connection_opened"] is False assert receipt["database_write_executed"] is False assert receipt["database_commit_executed"] is False assert receipt["scheduler_attached"] is False assert receipt["writer_output_summary"]["dedupe_keys_match_expected"] is True assert receipt["postwrite_smoke_summary"]["dedupe_keys_match_expected"] is True assert receipt["operator_evidence_summary"]["writer_output_json_path_recorded"] is True assert receipt["blocked_reasons"] == [] assert token_leak["receipt_passed"] is False assert token_leak["writer_output_summary"]["approval_token_key_detected"] is True assert "writer_output_no_approval_token_key" in token_leak["blocked_reasons"] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) assert "do_not_echo_operator_receipt_payload" in receipt["safe_boundaries"] def test_candidate_queue_writer_run_closeout_preview_blocks_api_write_and_tokens(): from services.market_intel.candidate_queue_writer_run_closeout import ( build_candidate_queue_writer_run_closeout, ) from services.market_intel.candidate_queue_writer_run_receipt import ( build_candidate_queue_writer_run_receipt, ) fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-closeout" ) closeout_evidence = { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "closeout_notes": "manual closeout reviewed", } receipt = build_candidate_queue_writer_run_receipt( transaction_preview=fixture["transaction"], run_readiness=fixture["run_readiness"], writer_output=fixture["writer_output"], postwrite_smoke_result=fixture["postwrite_smoke_result"], operator_evidence=fixture["operator_evidence"], ) closeout = build_candidate_queue_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=receipt, operator_evidence=closeout_evidence, ) token_leak = build_candidate_queue_writer_run_closeout( transaction_preview=fixture["transaction"], run_receipt=receipt, operator_evidence={ **closeout_evidence, "approval_token": TEST_APPROVAL_TOKEN, }, ) assert closeout["mode"] == "candidate_queue_writer_run_closeout_preview" assert closeout["closeout_passed"] is True assert closeout["ready_for_next_manual_phase"] is True assert closeout["ready_for_api_database_write"] is False assert closeout["ready_for_scheduler_attach"] is False assert closeout["api_executes_cli"] is False assert closeout["api_reads_approval_token"] is False assert closeout["api_writes_file"] is False assert closeout["api_writes_database"] is False assert closeout["database_connection_opened"] is False assert closeout["database_write_executed"] is False assert closeout["database_commit_executed"] is False assert closeout["scheduler_attached"] is False assert closeout["blocked_reasons"] == [] assert closeout["promotion_gate"]["requires_operator_approval"] is True assert "no_momo_db_lifecycle_change" in closeout["safe_boundaries"] assert token_leak["closeout_passed"] is False assert token_leak["operator_closeout_summary"][ "approval_token_submitted_to_api" ] is True assert "closeout_no_approval_token_submitted_to_api" in token_leak[ "blocked_reasons" ] assert TEST_APPROVAL_TOKEN not in json.dumps( token_leak, ensure_ascii=False, sort_keys=True, ) def test_candidate_queue_writer_run_receipt_route_accepts_inline_payload_no_write(): from routes.market_intel_routes import market_intel_bp sample_result = _market_intel_sample_result("sample-batch-30") transaction = MarketIntelService().build_manual_sample_candidate_queue_transaction( sample_result=sample_result ) expected_key = transaction["statements"][0]["lookup"]["dedupe_key"] app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_writer_run_receipt", json={ "sample_result": sample_result, "operator_evidence": { "reviewed_sample_json_path": "artifacts/market_intel/reviewed.json", "backup_artifact_path": "scripts/tools/backups/backup.zip", "preflight_artifact_path": "artifacts/market_intel/preflight.json", "migration_live_smoke_passed": True, "operator_acknowledged_shell_only_token": True, "writer_output_json_path": "artifacts/market_intel/writer-output.json", "postwrite_smoke_json_path": "artifacts/market_intel/smoke.json", "operator_confirmed_no_token_in_artifacts": True, }, "writer_output": { "mode": "candidate_queue_writer_cli_executed", "exit_code": 0, "writes_executed": True, "would_write_database": True, "database_connection_opened": True, "explicit_transaction_opened": True, "database_write_executed": True, "database_commit_executed": True, "database_rollback_executed": False, "external_network_executed": False, "scheduler_attached": False, "inserted_count": 1, "skipped_count": 0, "affected_dedupe_keys": [expected_key], }, "postwrite_smoke_result": { "mode": "candidate_queue_writer_postwrite_smoke_read_only", "postwrite_smoke_passed": True, "ready_for_operator_review": True, "read_only_query_executed": True, "database_connection_opened": True, "database_write_executed": False, "database_commit_executed": False, "external_network_executed": False, "scheduler_attached": False, "expected_dedupe_key_count": 1, "found_count": 1, "missing_count": 0, "found_dedupe_keys": [expected_key], "missing_dedupe_keys": [], }, }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "candidate_queue_writer_run_receipt_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["receipt_passed"] is True assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["blocked_reasons"] == [] def test_candidate_queue_writer_run_closeout_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-closeout-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_writer_run_closeout", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "closeout_notes": "manual closeout reviewed", }, "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "candidate_queue_writer_run_closeout_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["closeout_passed"] is True assert data["ready_for_next_manual_phase"] is True assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["blocked_reasons"] == [] def test_candidate_queue_review_handoff_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-handoff-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_handoff", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, }, "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() assert response.status_code == 200 assert data["mode"] == "candidate_queue_review_handoff_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["handoff_ready"] is True assert data["ready_for_manual_queue_review"] is True assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["review_contract"]["expected_review_state"] == "needs_review" assert data["blocked_reasons"] == [] def test_candidate_queue_review_inventory_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-inventory-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_inventory" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_inventory?execute=false", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, }, "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == "candidate_queue_review_inventory_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is False assert data["review_inventory_ready"] is False assert data["ready_for_human_decision_review"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["read_only_query_executed"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["expected_dedupe_keys"] == fixture["expected_keys"] assert "read_only_inventory_executed" in data["blocked_reasons"] assert "do_not_insert_missing_queue_row_from_api" in data["safe_boundaries"] def test_candidate_queue_review_decision_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision?execute=false", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "manual review only", "operator_confirmed_manual_decision_only": True, }, "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == "candidate_queue_review_decision_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["decision_ready"] is False assert data["ready_for_human_decision_record"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["decision_record_written"] is False assert data["review_state_update_executed"] is False assert data["read_only_query_executed"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["expected_dedupe_keys"] == fixture["expected_keys"] assert "review_inventory_ready" in data["blocked_reasons"] assert "do_not_update_review_state_from_api" in data["safe_boundaries"] def test_candidate_queue_review_decision_approval_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-approval-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_approval" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_approval?execute=false", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "manual review only", "operator_confirmed_manual_decision_only": True, "decision_approval_notes": "cli-only approval gate", "operator_confirmed_decision_payload_reviewed": True, "operator_confirmed_decision_apply_requires_cli": True, "operator_confirmed_review_state_update_is_not_api": True, }, "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == "candidate_queue_review_decision_approval_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["approval_ready"] is False assert data["ready_for_review_state_transaction_preview"] is False assert data["ready_for_cli_decision_writer"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["approval_record_written"] is False assert data["decision_record_written"] is False assert data["review_state_update_executed"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["decision_update_preview"] == [] assert "decision_preview_ready" in data["blocked_reasons"] assert "do_not_update_review_state_from_approval_api" in data[ "safe_boundaries" ] def test_candidate_queue_review_decision_transaction_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-transaction-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_transaction" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_transaction?execute=false", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "manual review only", "operator_confirmed_manual_decision_only": True, "decision_approval_notes": "cli-only approval gate", "operator_confirmed_decision_payload_reviewed": True, "operator_confirmed_decision_apply_requires_cli": True, "operator_confirmed_review_state_update_is_not_api": True, "decision_transaction_notes": "shell-only transaction preview", "operator_confirmed_transaction_payload_reviewed": True, "operator_confirmed_cli_only_transaction": True, }, "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == "candidate_queue_review_decision_transaction_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["transaction_preview_created"] is False assert data["transaction_ready"] is False assert data["ready_for_manual_shell_update_window"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["approval_record_written"] is False assert data["decision_record_written"] is False assert data["review_state_update_executed"] is False assert data["database_connection_opened"] is False assert data["explicit_transaction_opened"] is False assert data["transaction_opened"] is False assert data["transaction_committed"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["statements"] == [] assert "decision_approval_ready" in data["blocked_reasons"] assert "transaction_statements_present" in data["blocked_reasons"] assert "do_not_update_review_state_from_transaction_api" in data[ "safe_boundaries" ] def test_candidate_queue_review_decision_writer_status_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-writer-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_status" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_status?execute=true" "&apply_real_write=true", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "manual review only", "operator_confirmed_manual_decision_only": True, "decision_approval_notes": "cli-only approval gate", "operator_confirmed_decision_payload_reviewed": True, "operator_confirmed_decision_apply_requires_cli": True, "operator_confirmed_review_state_update_is_not_api": True, "decision_transaction_notes": "shell-only transaction preview", "operator_confirmed_transaction_payload_reviewed": True, "operator_confirmed_cli_only_transaction": True, }, "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == "candidate_queue_review_decision_writer_cli_blocked" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is True assert data["apply_real_write_requested"] is True assert data["approval_token_present"] is False assert data["approval_token_valid"] is False assert data["writer_implementation_enabled"] is False assert data["ready_for_real_write"] is False assert data["ready_for_api_review_state_update"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["review_state_update_executed"] is False assert data["database_connection_opened"] is False assert data["database_session_created"] is False assert data["transaction_opened"] is False assert data["transaction_committed"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["writes_executed"] is False assert data["would_write_database"] is False assert "approval_token_present" in data["blocked_reasons"] assert "review_decision_writer_implementation_enabled" in data[ "blocked_reasons" ] assert "do_not_execute_review_decision_writer_from_api" in data[ "safe_boundaries" ] def test_candidate_queue_review_decision_writer_preflight_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-preflight-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_preflight" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_preflight?execute=true" "&apply_real_write=true", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "manual review only", "operator_confirmed_manual_decision_only": True, "decision_approval_notes": "cli-only approval gate", "operator_confirmed_decision_payload_reviewed": True, "operator_confirmed_decision_apply_requires_cli": True, "operator_confirmed_review_state_update_is_not_api": True, "decision_transaction_notes": "shell-only transaction preview", "operator_confirmed_transaction_payload_reviewed": True, "operator_confirmed_cli_only_transaction": True, }, "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_decision_writer_preflight_preview" ) assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is True assert data["apply_real_write_requested"] is True assert data["read_only_query_executed"] is False assert data["database_connection_opened"] is False assert data["database_session_created"] is False assert data["explicit_transaction_opened"] is False assert data["transaction_opened"] is False assert data["transaction_committed"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["api_updates_review_state"] is False assert data["scheduler_attached"] is False assert data["writes_executed"] is False assert data["would_write_database"] is False assert data["preflight_payload_ready"] is False assert data["statement_summary"]["statement_count"] == 0 assert "statement_payloads_present" in data["blocked_reasons"] assert "preflight_execute_not_requested_from_api" in data["blocked_reasons"] assert "preflight_apply_real_write_not_requested_from_api" in data[ "blocked_reasons" ] assert "review_decision_writer_implementation_enabled" in data["blocked_reasons"] assert "do_not_update_review_state_from_review_state_preflight" in data[ "safe_boundaries" ] def test_candidate_queue_review_decision_writer_postwrite_smoke_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-postwrite-smoke-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_postwrite_smoke" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_postwrite_smoke", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "manual review only", "operator_confirmed_manual_decision_only": True, "decision_approval_notes": "cli-only approval gate", "operator_confirmed_decision_payload_reviewed": True, "operator_confirmed_decision_apply_requires_cli": True, "operator_confirmed_review_state_update_is_not_api": True, "decision_transaction_notes": "shell-only transaction preview", "operator_confirmed_transaction_payload_reviewed": True, "operator_confirmed_cli_only_transaction": True, }, "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_decision_writer_postwrite_smoke_planned" ) assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is False assert data["read_only_query_executed"] is False assert data["database_connection_opened"] is False assert data["database_session_created"] is False assert data["explicit_transaction_opened"] is False assert data["transaction_opened"] is False assert data["transaction_committed"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["api_updates_review_state"] is False assert data["scheduler_attached"] is False assert data["writes_executed"] is False assert data["would_write_database"] is False assert data["postwrite_smoke_passed"] is False assert data["review_state_update_verified"] is False assert "review_decision_writer_postwrite_smoke_not_loaded" in data[ "blocked_reasons" ] assert "do_not_update_review_state_from_postwrite_smoke" in data[ "safe_boundaries" ] def test_candidate_queue_review_decision_writer_operator_drill_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-operator-drill-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_operator_drill" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_operator_drill", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "manual review only", "operator_confirmed_manual_decision_only": True, "decision_approval_notes": "cli-only approval gate", "operator_confirmed_decision_payload_reviewed": True, "operator_confirmed_decision_apply_requires_cli": True, "operator_confirmed_review_state_update_is_not_api": True, "decision_transaction_notes": "shell-only transaction preview", "operator_confirmed_transaction_payload_reviewed": True, "operator_confirmed_cli_only_transaction": True, "operator_confirmed_manual_shell_window": True, "operator_confirmed_post_update_inventory_planned": True, "operator_drill_notes": "manual shell drill reviewed", }, "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_decision_writer_operator_drill_preview" ) assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["operator_drill_ready"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_summary"]["statement_count"] == 0 assert data["input_summaries"]["writer_status_mode"] == ( "candidate_queue_review_decision_writer_cli_blocked" ) assert "transaction_preview_created" in data["blocked_reasons"] assert "transaction_has_update_statements" in data["blocked_reasons"] assert "backup_verified_by_operator" in data["blocked_reasons"] assert "do_not_execute_review_state_writer_from_operator_drill_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_decision_writer_run_package_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-run-package-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_run_package" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_run_package", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "manual review only", "operator_confirmed_manual_decision_only": True, "decision_approval_notes": "cli-only approval gate", "operator_confirmed_decision_payload_reviewed": True, "operator_confirmed_decision_apply_requires_cli": True, "operator_confirmed_review_state_update_is_not_api": True, "decision_transaction_notes": "shell-only transaction preview", "operator_confirmed_transaction_payload_reviewed": True, "operator_confirmed_cli_only_transaction": True, "operator_confirmed_manual_shell_window": True, "operator_confirmed_post_update_inventory_planned": True, "operator_drill_notes": "manual shell drill reviewed", }, "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_decision_writer_run_package_preview" ) assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["package_ready"] is False assert data["package_artifact_created"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["payload_manifest"]["payload_count"] == 0 assert "transaction_preview_created" in data["blocked_reasons"] assert "transaction_has_update_statements" in data["blocked_reasons"] assert "backup_artifact_path_recorded" in data["blocked_reasons"] assert "do_not_execute_review_state_writer_from_run_package_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_decision_writer_run_readiness_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-run-readiness-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_run_readiness" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_run_readiness" "?execute=true&apply_real_write=true", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "review_state_transaction_json_path": ( "artifacts/market_intel/review-state-transaction.json" ), "operator_confirmed_review_state_preflight_only": True, "operator_acknowledged_shell_only_token": True, "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "manual review only", "operator_confirmed_manual_decision_only": True, "decision_approval_notes": "cli-only approval gate", "operator_confirmed_decision_payload_reviewed": True, "operator_confirmed_decision_apply_requires_cli": True, "operator_confirmed_review_state_update_is_not_api": True, "decision_transaction_notes": "shell-only transaction preview", "operator_confirmed_transaction_payload_reviewed": True, "operator_confirmed_cli_only_transaction": True, "operator_confirmed_manual_shell_window": True, "operator_confirmed_post_update_inventory_planned": True, "operator_drill_notes": "manual shell drill reviewed", }, "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_decision_writer_run_readiness_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["ready_for_cli_operator_run"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["run_package_summary"]["payload_count"] == 0 assert "payload_count_within_small_batch_limit" in data["blocked_reasons"] assert "do_not_execute_review_state_writer_from_run_readiness_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_decision_writer_run_receipt_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-run-receipt-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_run_receipt" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_run_receipt" "?execute=true&apply_real_write=true", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "review_state_transaction_json_path": ( "artifacts/market_intel/review-state-transaction.json" ), "operator_confirmed_review_state_preflight_only": True, "operator_acknowledged_shell_only_token": True, "review_state_writer_output_json_path": ( "artifacts/market_intel/review-state-writer-output.json" ), "review_state_postwrite_smoke_json_path": ( "artifacts/market_intel/review-state-postwrite-smoke.json" ), "operator_confirmed_no_token_in_artifacts": True, "receipt_notes": "review_state receipt reviewed", "closeout_artifact_path": "artifacts/market_intel/closeout.json", "operator_confirmed_queue_review_next": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "operator_confirmed_inventory_read_only": True, "reviewer_id": "operator-a", "proposed_review_decision": "confirmed", "decision_notes": "manual review only", "operator_confirmed_manual_decision_only": True, "decision_approval_notes": "cli-only approval gate", "operator_confirmed_decision_payload_reviewed": True, "operator_confirmed_decision_apply_requires_cli": True, "operator_confirmed_review_state_update_is_not_api": True, "decision_transaction_notes": "shell-only transaction preview", "operator_confirmed_transaction_payload_reviewed": True, "operator_confirmed_cli_only_transaction": True, "operator_confirmed_manual_shell_window": True, "operator_confirmed_post_update_inventory_planned": True, "operator_drill_notes": "manual shell drill reviewed", }, "writer_output": { **fixture["writer_output"], "mode": "candidate_queue_review_decision_writer_cli_executed", "review_state_update_executed": True, "api_updates_review_state": False, }, "postwrite_smoke_result": { **fixture["postwrite_smoke_result"], "mode": ( "candidate_queue_review_decision_writer_postwrite_smoke_read_only" ), "review_state_update_verified": True, "state_mismatch_count": 0, "state_mismatches": [], }, }, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_decision_writer_run_receipt_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["receipt_passed"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["expected_dedupe_keys"] == [] assert "expected_dedupe_keys_present" in data["blocked_reasons"] assert "do_not_execute_review_state_writer_from_receipt_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_decision_writer_run_closeout_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp fixture = _build_candidate_queue_writer_receipt_fixture( "sample-batch-review-decision-run-closeout-route" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_run_closeout" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_run_closeout" "?execute=true&apply_real_write=true", json={ "sample_result": fixture["sample_result"], "operator_evidence": { **fixture["operator_evidence"], "review_state_closeout_artifact_path": ( "artifacts/market_intel/review-state-closeout.json" ), "operator_confirmed_review_state_closeout_next": True, "operator_confirmed_post_closeout_inventory_read_only": True, "operator_confirmed_no_scheduler_attach": True, "operator_confirmed_no_api_db_write": True, "closeout_notes": "review_state closeout reviewed", }, "writer_output": { **fixture["writer_output"], "mode": "candidate_queue_review_decision_writer_cli_executed", "review_state_update_executed": True, "api_updates_review_state": False, }, "postwrite_smoke_result": { **fixture["postwrite_smoke_result"], "mode": ( "candidate_queue_review_decision_writer_postwrite_smoke_read_only" ), "review_state_update_verified": True, "state_mismatch_count": 0, "state_mismatches": [], }, }, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_decision_writer_run_closeout_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["closeout_passed"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["receipt_summary"]["expected_dedupe_key_count"] == 0 assert "receipt_expected_review_state_updates_present" in data[ "blocked_reasons" ] assert "do_not_update_review_state_from_review_state_closeout" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_decision_post_closeout_inventory_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_post_closeout_inventory" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_post_closeout_inventory" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_decision_post_closeout_inventory_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["post_closeout_inventory_ready"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["read_only_query_executed"] is False assert data["scheduler_attached"] is False assert data["expected_dedupe_keys"] == [] assert "expected_review_state_updates_present" in data["blocked_reasons"] assert "do_not_update_review_state_from_post_closeout_inventory" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_completion_archive_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_completion_archive" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_completion_archive" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == "candidate_queue_review_completion_archive_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["review_completion_archive_ready"] is False assert data["archive_manifest_ready"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["archive_file_written"] is False assert data["archive_record_written"] is False assert data["archive_manifest_written"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["read_only_query_executed"] is False assert data["scheduler_attached"] is False assert data["expected_dedupe_keys"] == [] assert "post_closeout_inventory_ready" in data["blocked_reasons"] assert "do_not_write_archive_file_from_api" in data["safe_boundaries"] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_archive_summary_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_archive_summary" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_archive_summary" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == "candidate_queue_review_archive_summary_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["archive_summary_ready"] is False assert data["summary_input_ready"] is False assert data["ready_for_ai_summary_generation"] is False assert data["ready_for_llm_call"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["summary_file_written"] is False assert data["summary_record_written"] is False assert data["summary_manifest_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["ollama_call_executed"] is False assert data["gemini_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["read_only_query_executed"] is False assert data["scheduler_attached"] is False assert data["expected_dedupe_keys"] == [] assert "review_completion_archive_ready" in data["blocked_reasons"] assert "do_not_call_llm_from_archive_summary_gate" in data["safe_boundaries"] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_preflight_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_preflight" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_preflight" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == "candidate_queue_review_ai_summary_preflight_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["ai_summary_preflight_ready"] is False assert data["ready_for_manual_ollama_summary_run"] is False assert data["ready_for_ai_summary_generation"] is False assert data["ready_for_llm_call"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["summary_file_written"] is False assert data["summary_record_written"] is False assert data["summary_manifest_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["ollama_call_executed"] is False assert data["gemini_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["read_only_query_executed"] is False assert data["scheduler_attached"] is False assert data["expected_dedupe_keys"] == [] assert "archive_summary_ready" in data["blocked_reasons"] assert "do_not_call_llm_from_ai_summary_preflight" in data["safe_boundaries"] assert ( data["model_route_policy"]["primary_policy"] == "ollama_first" ) assert ( data["model_route_policy"]["fallback_policy"] == "gemini_backup_only_after_ollama_cascade_failure" ) assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_run_package_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_run_package" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_run_package" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == "candidate_queue_review_ai_summary_run_package_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["ai_summary_run_package_ready"] is False assert data["ready_for_manual_ollama_summary_run"] is False assert data["ready_for_ai_summary_generation"] is False assert data["ready_for_llm_call"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_executes_llm"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["run_package_file_written"] is False assert data["summary_file_written"] is False assert data["summary_record_written"] is False assert data["summary_manifest_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["ollama_call_executed"] is False assert data["gemini_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["read_only_query_executed"] is False assert data["scheduler_attached"] is False assert data["expected_dedupe_keys"] == [] assert "archive_summary_ready" in data["blocked_reasons"] assert "ai_summary_preflight_ready" in data["blocked_reasons"] assert "do_not_call_llm_from_ai_summary_run_package" in data[ "safe_boundaries" ] assert data["prompt_contract"]["contract_version"] == ( "market_intel_ai_summary_prompt_v1" ) assert data["summary_output_schema"]["schema_version"] == ( "market_intel_ai_summary_v1" ) assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_output_receipt_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_output_receipt" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_output_receipt" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == "candidate_queue_review_ai_summary_output_receipt_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["ai_summary_output_receipt_ready"] is False assert data["ready_for_summary_persistence_review"] is False assert data["manual_ai_summary_output_provided"] is False assert data["summary_output_schema_valid"] is False assert data["summary_output_evidence_refs_grounded"] is False assert data["summary_output_model_route_accepted"] is False assert data["ready_for_ai_summary_generation"] is False assert data["ready_for_llm_call"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_executes_llm"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["summary_receipt_file_written"] is False assert data["summary_file_written"] is False assert data["summary_record_written"] is False assert data["summary_manifest_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["ollama_call_executed"] is False assert data["gemini_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["read_only_query_executed"] is False assert data["scheduler_attached"] is False assert data["expected_dedupe_keys"] == [] assert "ai_summary_run_package_ready" in data["blocked_reasons"] assert "manual_ai_summary_output_provided" in data["blocked_reasons"] assert "do_not_call_llm_from_ai_summary_output_receipt" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_preflight_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_preflight" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_preflight" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_preflight_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["summary_persistence_preflight_ready"] is False assert data["ready_for_summary_transaction_preview"] is False assert data["ready_for_summary_persistence_cli_run"] is False assert data["ready_for_ai_summary_generation"] is False assert data["ready_for_llm_call"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_review_state_update"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_executes_llm"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["summary_persistence_preflight_file_written"] is False assert data["summary_record_written"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["ollama_call_executed"] is False assert data["gemini_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["expected_dedupe_keys"] == [] assert "ai_summary_output_receipt_ready" in data["blocked_reasons"] assert "manual_ai_summary_output_still_provided" in data["blocked_reasons"] assert "do_not_call_llm_from_ai_summary_persistence_preflight" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_transaction_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_transaction" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_transaction" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_transaction_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["summary_persistence_transaction_ready"] is False assert data["ready_for_summary_persistence_writer_gate"] is False assert data["ready_for_summary_persistence_cli_run"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_telegram_dispatch"] is False assert data["api_executes_llm"] is False assert data["api_writes_file"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["summary_persistence_transaction_file_written"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["transaction_file_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert "summary_persistence_preflight_ready" in data["blocked_reasons"] assert "summary_persistence_update_statements_planned" in data["blocked_reasons"] assert "do_not_open_database_from_ai_summary_persistence_transaction" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_writer_preflight_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_writer_preflight" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_writer_preflight" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_writer_preflight_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["summary_persistence_writer_preflight_ready"] is False assert data["ready_for_summary_persistence_run_package"] is False assert data["ready_for_summary_persistence_cli_run"] is False assert data["ready_for_real_write"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_telegram_dispatch"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["summary_persistence_writer_preflight_file_written"] is False assert data["writer_preflight_file_written"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["transaction_file_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert "summary_persistence_transaction_ready" in data["blocked_reasons"] assert "summary_persistence_update_statements_valid" in data["blocked_reasons"] assert ( "summary_persistence_writer_preflight_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_open_database_from_ai_summary_persistence_writer_preflight" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_run_package_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_run_package" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_run_package" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_run_package_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["package_ready"] is False assert data["ready_for_summary_persistence_run_readiness"] is False assert data["ready_for_summary_persistence_cli_run"] is False assert data["ready_for_real_write"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_telegram_dispatch"] is False assert data["package_artifact_created"] is False assert data["summary_persistence_run_package_file_written"] is False assert data["run_package_file_written"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["transaction_file_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["payload_manifest"]["payload_count"] == 0 assert "summary_persistence_writer_preflight_ready" in data["blocked_reasons"] assert "summary_persistence_payload_manifest_ready" in data["blocked_reasons"] assert ( "summary_persistence_run_package_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_open_database_connection_from_summary_persistence_run_package" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_run_readiness_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_run_readiness" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_run_readiness" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_run_readiness_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["run_readiness_ready"] is False assert data["summary_persistence_run_readiness_ready"] is False assert data["ready_for_cli_operator_run"] is False assert data["ready_for_summary_persistence_cli_run"] is False assert data["ready_for_real_write"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_telegram_dispatch"] is False assert data["package_artifact_created"] is False assert data["summary_persistence_run_readiness_file_written"] is False assert data["run_readiness_file_written"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["transaction_file_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["run_package_summary"]["payload_count"] == 0 assert "summary_persistence_run_package_ready" in data["blocked_reasons"] assert "summary_persistence_payload_manifest_small_batch" in data[ "blocked_reasons" ] assert ( "summary_persistence_run_readiness_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert ( "do_not_open_database_connection_from_summary_persistence_run_readiness" in data["safe_boundaries"] ) assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_run_receipt_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_run_receipt" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_run_receipt" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_run_receipt_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["run_receipt_passed"] is False assert data["summary_persistence_run_receipt_passed"] is False assert data["ready_for_summary_persistence_closeout"] is False assert data["ready_for_summary_persistence_cli_run"] is False assert data["ready_for_real_write"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_telegram_dispatch"] is False assert data["summary_persistence_run_receipt_file_written"] is False assert data["run_receipt_file_written"] is False assert data["receipt_file_written"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["transaction_file_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["expected_dedupe_keys"] == [] assert data["writer_output_summary"]["provided"] is False assert data["postwrite_smoke_summary"]["provided"] is False assert "run_readiness_passed_before_cli" in data["blocked_reasons"] assert "expected_dedupe_keys_present" in data["blocked_reasons"] assert "writer_output_provided" in data["blocked_reasons"] assert "postwrite_smoke_result_provided" in data["blocked_reasons"] assert "run_receipt_apply_real_write_not_requested_from_api" in data[ "blocked_reasons" ] assert "do_not_open_database_connection_from_summary_persistence_receipt" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_run_closeout_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_run_closeout" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_run_closeout" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_run_closeout_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["closeout_passed"] is False assert data["summary_persistence_closeout_passed"] is False assert data["ready_for_summary_persistence_telegram_dispatch_gate"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["summary_persistence_closeout_file_written"] is False assert data["closeout_file_written"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["transaction_file_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["receipt_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_run_receipt_preview" ) assert "receipt_passed" in data["blocked_reasons"] assert "receipt_expected_dedupe_keys_present" in data["blocked_reasons"] assert "closeout_artifact_path_recorded" in data["blocked_reasons"] assert "operator_confirmed_telegram_dispatch_requires_separate_gate" in data[ "blocked_reasons" ] assert "closeout_apply_real_write_not_requested_from_api" in data[ "blocked_reasons" ] assert "do_not_open_database_connection_from_summary_persistence_closeout" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_gate_passed"] is False assert data["summary_persistence_telegram_dispatch_gate_passed"] is False assert data["ready_for_summary_persistence_telegram_dispatch_run_package"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_gate_file_written"] is False assert data["telegram_message_file_written"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["closeout_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_run_closeout_preview" ) assert "summary_persistence_closeout_passed" in data["blocked_reasons"] assert "operator_confirmed_telegram_dispatch_gate" in data["blocked_reasons"] assert "telegram_dispatch_gate_artifact_path_recorded" in data["blocked_reasons"] assert "telegram_dispatch_gate_apply_real_write_not_requested_from_api" in data[ "blocked_reasons" ] assert "do_not_dispatch_telegram_from_summary_persistence_telegram_dispatch_gate_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_run_package_ready"] is False assert data["summary_persistence_telegram_dispatch_run_package_ready"] is False assert data["ready_for_summary_persistence_telegram_dispatch_run_readiness"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_run_package_file_written"] is False assert data["telegram_message_file_written"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["telegram_dispatch_gate_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate_preview" ) assert "telegram_dispatch_gate_ready" in data["blocked_reasons"] assert "operator_confirmed_telegram_dispatch_run_package" in data[ "blocked_reasons" ] assert "telegram_dispatch_run_package_artifacts_recorded" in data[ "blocked_reasons" ] assert ( "telegram_dispatch_run_package_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_dispatch_telegram_from_telegram_dispatch_run_package_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_run_readiness_ready"] is False assert ( data["summary_persistence_telegram_dispatch_run_readiness_ready"] is False ) assert data["ready_for_manual_telegram_dispatch"] is False assert ( data["ready_for_summary_persistence_telegram_dispatch_run_receipt"] is False ) assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_run_readiness_file_written"] is False assert data["telegram_dispatch_run_package_file_written"] is False assert data["telegram_message_file_written"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["telegram_dispatch_attempted"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["telegram_dispatch_run_package_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package_preview" ) assert "telegram_dispatch_run_package_ready" in data["blocked_reasons"] assert "telegram_dispatch_readiness_artifacts_recorded" in data[ "blocked_reasons" ] assert "operator_confirmed_telegram_dispatch_run_readiness" in data[ "blocked_reasons" ] assert ( "telegram_dispatch_run_readiness_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_dispatch_telegram_from_telegram_dispatch_run_readiness_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_run_receipt_passed"] is False assert data["summary_persistence_telegram_dispatch_run_receipt_passed"] is False assert data["ready_for_summary_persistence_telegram_dispatch_closeout"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_run_receipt_file_written"] is False assert data["telegram_dispatch_receipt_file_written"] is False assert data["telegram_message_file_written"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["telegram_dispatch_attempted"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["telegram_dispatch_run_readiness_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness_preview" ) assert "telegram_dispatch_run_readiness_passed_before_manual_dispatch" in data[ "blocked_reasons" ] assert "telegram_dispatch_receipt_provided" in data["blocked_reasons"] assert "operator_confirmed_telegram_dispatch_receipt" in data[ "blocked_reasons" ] assert ( "telegram_dispatch_run_receipt_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_dispatch_telegram_from_telegram_dispatch_run_receipt_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_closeout_passed"] is False assert data["summary_persistence_telegram_dispatch_closeout_passed"] is False assert data["ready_for_summary_persistence_telegram_dispatch_archive"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_closeout_file_written"] is False assert data["telegram_dispatch_run_receipt_file_written"] is False assert data["telegram_dispatch_receipt_file_written"] is False assert data["telegram_message_file_written"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["telegram_dispatch_attempted"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["telegram_dispatch_run_receipt_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt_preview" ) assert "telegram_dispatch_run_receipt_passed" in data["blocked_reasons"] assert "telegram_dispatch_closeout_artifact_path_recorded" in data[ "blocked_reasons" ] assert "operator_confirmed_telegram_dispatch_closeout" in data[ "blocked_reasons" ] assert ( "telegram_dispatch_closeout_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_dispatch_telegram_from_telegram_dispatch_closeout_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp from routes.market_intel_review_routes import market_intel_review_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) app.register_blueprint(market_intel_review_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" ) response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" "?execute=true&apply_real_write=true", json={"sample_result": {}}, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert get_response.status_code == 405 assert response.status_code == 200 assert data["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_preview" ) assert data["phase"] == ( "phase_140_market_intel_professional_source_governance" ) assert data["telegram_dispatch_archive_ready"] is False assert data["summary_persistence_telegram_dispatch_archive_ready"] is False assert data["archive_manifest_ready"] is False assert data["ready_for_summary_persistence_telegram_dispatch_archive_summary"] is False assert data["ready_for_telegram_dispatch"] is False assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_dispatches_telegram"] is False assert data["api_executes_llm"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["api_updates_review_state"] is False assert data["telegram_dispatch_archive_file_written"] is False assert data["telegram_dispatch_closeout_file_written"] is False assert data["telegram_dispatch_receipt_file_written"] is False assert data["telegram_message_file_written"] is False assert data["archive_file_written"] is False assert data["archive_record_written"] is False assert data["archive_manifest_written"] is False assert data["summary_persistence_record_written"] is False assert data["metadata_patch_written"] is False assert data["ai_summary_generated"] is False assert data["llm_call_executed"] is False assert data["telegram_dispatched"] is False assert data["telegram_dispatch_attempted"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["review_state_update_executed"] is False assert data["scheduler_attached"] is False assert data["statement_count"] == 0 assert data["telegram_dispatch_closeout_summary"]["mode"] == ( "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout_preview" ) assert "telegram_dispatch_closeout_passed" in data["blocked_reasons"] assert "telegram_dispatch_archive_artifact_paths_recorded" in data[ "blocked_reasons" ] assert "operator_confirmed_telegram_dispatch_archive" in data[ "blocked_reasons" ] assert ( "telegram_dispatch_archive_apply_real_write_not_requested_from_api" in data["blocked_reasons"] ) assert "do_not_dispatch_telegram_from_telegram_dispatch_archive_api" in data[ "safe_boundaries" ] assert TEST_APPROVAL_TOKEN not in payload def test_candidate_queue_writer_run_receipt_route_is_post_only_and_no_write(): from routes.market_intel_routes import market_intel_bp fixture = _build_candidate_queue_writer_receipt_fixture( batch_id="sample-batch-route-receipt" ) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.post( "/api/market_intel/manual_sample_review/" "candidate_queue_writer_run_receipt", json={ "sample_result": fixture["sample_result"], "operator_evidence": fixture["operator_evidence"], "writer_output": fixture["writer_output"], "postwrite_smoke_result": fixture["postwrite_smoke_result"], }, ) data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert response.status_code == 200 assert data["mode"] == "candidate_queue_writer_run_receipt_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["receipt_passed"] is True assert data["ready_for_next_manual_review"] is True assert data["ready_for_api_database_write"] is False assert data["ready_for_scheduler_attach"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["api_writes_file"] is False assert data["api_writes_database"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["writer_output_summary"]["database_commit_executed"] is True assert data["writer_output_summary"]["dedupe_keys_match_expected"] is True assert data["postwrite_smoke_summary"]["postwrite_smoke_passed"] is True assert data["postwrite_smoke_summary"]["dedupe_keys_match_expected"] is True assert data["blocked_reasons"] == [] assert TEST_APPROVAL_TOKEN not in payload def test_scheduler_plan_preview_blocks_job_attachment(): plan = MarketIntelService().build_scheduler_plan() assert plan["mode"] == "scheduler_attach_plan_preview" assert plan["phase"] == "phase_140_market_intel_professional_source_governance" assert plan["ready_to_attach_scheduler"] is False assert plan["scheduler_attached"] is False assert plan["scheduler_registration_executed"] is False assert plan["crawler_job_started"] is False assert plan["external_network_executed"] is False assert plan["database_session_created"] is False assert plan["database_write_executed"] is False assert plan["database_commit_executed"] is False assert plan["writes_executed"] is False assert plan["would_write_database"] is False assert plan["job_count"] == 3 assert {item["key"] for item in plan["jobs"]} == { "campaign_discovery_daily", "campaign_product_probe", "product_match_review_seed", } assert "market_intel_enabled" in plan["blocked_reasons"] assert "mcp_fetch_gate_open" in plan["blocked_reasons"] assert "manual_operator_approval" in plan["blocked_reasons"] assert "do_not_attach_scheduler_from_api" in plan["safe_boundaries"] def test_scheduler_plan_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/scheduler_plan") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "scheduler_attach_plan_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["scheduler_registration_executed"] is False assert data["crawler_job_started"] is False assert data["external_network_executed"] is False assert data["database_write_executed"] is False def test_match_review_plan_preview_blocks_auto_confirm(): plan = MarketIntelService().build_match_review_plan() assert plan["mode"] == "match_review_plan_preview" assert plan["phase"] == "phase_140_market_intel_professional_source_governance" assert plan["ready_for_review_queue"] is False assert plan["review_queue_created"] is False assert plan["auto_match_executed"] is False assert plan["auto_confirm_executed"] is False assert plan["database_session_created"] is False assert plan["database_write_executed"] is False assert plan["database_commit_executed"] is False assert plan["external_network_executed"] is False assert plan["scheduler_attached"] is False assert plan["writes_executed"] is False assert plan["would_write_database"] is False assert plan["thresholds"]["auto_confirm_enabled"] is False assert len(plan["scoring_signals"]) >= 5 assert "needs_review" in plan["planned_status_flow"] assert "confirmed" in plan["planned_status_flow"] assert "manual_operator_approval" in plan["blocked_reasons"] assert "do_not_auto_confirm_matches" in plan["safe_boundaries"] assert all(item["requires_operator"] for item in plan["review_actions"]) def test_match_review_plan_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/match_review_plan") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "match_review_plan_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["review_queue_created"] is False assert data["auto_confirm_executed"] is False assert data["external_network_executed"] is False assert data["database_write_executed"] is False def test_opportunity_plan_preview_blocks_alerts_and_ai_summary(): plan = MarketIntelService().build_opportunity_plan() assert plan["mode"] == "opportunity_plan_preview" assert plan["phase"] == "phase_140_market_intel_professional_source_governance" assert plan["ready_for_opportunity_queue"] is False assert plan["opportunity_queue_created"] is False assert plan["threat_alert_dispatched"] is False assert plan["telegram_dispatched"] is False assert plan["ai_summary_generated"] is False assert plan["database_session_created"] is False assert plan["database_write_executed"] is False assert plan["database_commit_executed"] is False assert plan["external_network_executed"] is False assert plan["scheduler_attached"] is False assert plan["writes_executed"] is False assert plan["would_write_database"] is False assert plan["rule_count"] == 4 assert {item["key"] for item in plan["rules"]} == { "competitor_price_threat", "promotion_gap", "deep_discount_overlap", "campaign_ending_watch", } assert "match_review_candidates_available" in plan["blocked_reasons"] assert "manual_operator_approval" in plan["blocked_reasons"] assert "do_not_dispatch_alerts_from_preview" in plan["safe_boundaries"] assert "do_not_auto_adjust_price" in plan["safe_boundaries"] def test_opportunity_plan_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/opportunity_plan") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "opportunity_plan_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["opportunity_queue_created"] is False assert data["threat_alert_dispatched"] is False assert data["ai_summary_generated"] is False assert data["database_write_executed"] is False def test_opportunity_scoring_plan_preview_blocks_scoring_and_alerts(): plan = MarketIntelService().build_opportunity_scoring_plan() assert plan["mode"] == "opportunity_scoring_plan_preview" assert plan["phase"] == "phase_140_market_intel_professional_source_governance" assert plan["ready_for_scoring_job"] is False assert plan["scoring_job_created"] is False assert plan["score_calculation_executed"] is False assert plan["sample_scores_generated"] is False assert plan["opportunity_queue_created"] is False assert plan["review_queue_created"] is False assert plan["threat_alert_dispatched"] is False assert plan["telegram_dispatched"] is False assert plan["ai_summary_generated"] is False assert plan["database_session_created"] is False assert plan["database_write_executed"] is False assert plan["database_commit_executed"] is False assert plan["external_network_executed"] is False assert plan["scheduler_attached"] is False assert plan["writes_executed"] is False assert plan["would_write_database"] is False assert plan["dimension_count"] == 5 assert plan["total_weight"] == 100 assert {item["key"] for item in plan["dimensions"]} == { "price_gap_pct", "discount_depth", "match_confidence", "campaign_urgency", "data_freshness", } assert "opportunity_queue_ready" in plan["blocked_reasons"] assert "confirmed_match_source_ready" in plan["blocked_reasons"] assert "manual_operator_approval" in plan["blocked_reasons"] assert "do_not_write_scoring_results_from_preview" in plan["safe_boundaries"] assert "do_not_auto_adjust_price" in plan["safe_boundaries"] def test_opportunity_scoring_plan_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/opportunity_scoring_plan") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "opportunity_scoring_plan_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["scoring_job_created"] is False assert data["score_calculation_executed"] is False assert data["sample_scores_generated"] is False assert data["database_write_executed"] is False assert data["external_network_executed"] is False def test_opportunity_evidence_plan_preview_blocks_queries_and_alerts(): plan = MarketIntelService().build_opportunity_evidence_plan() assert plan["mode"] == "opportunity_evidence_plan_preview" assert plan["phase"] == "phase_140_market_intel_professional_source_governance" assert plan["ready_for_evidence_bundle"] is False assert plan["evidence_bundle_created"] is False assert plan["evidence_query_executed"] is False assert plan["sample_evidence_generated"] is False assert plan["alert_candidate_created"] is False assert plan["telegram_dispatched"] is False assert plan["ai_summary_generated"] is False assert plan["database_session_created"] is False assert plan["database_write_executed"] is False assert plan["database_commit_executed"] is False assert plan["external_network_executed"] is False assert plan["scheduler_attached"] is False assert plan["writes_executed"] is False assert plan["would_write_database"] is False assert plan["section_count"] == 5 assert {item["key"] for item in plan["sections"]} == { "campaign_context", "market_product_snapshot", "match_review_state", "momo_reference", "scoring_trace", } assert "confirmed_match_evidence_available" in plan["blocked_reasons"] assert "scoring_trace_available" in plan["blocked_reasons"] assert "manual_operator_approval" in plan["blocked_reasons"] assert "do_not_query_database_from_evidence_preview" in plan["safe_boundaries"] assert "do_not_generate_placeholder_evidence" in plan["safe_boundaries"] assert plan["bundle_contract"]["freshness_window_hours"] == 24 def test_opportunity_evidence_plan_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/opportunity_evidence_plan") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "opportunity_evidence_plan_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["evidence_bundle_created"] is False assert data["evidence_query_executed"] is False assert data["sample_evidence_generated"] is False assert data["alert_candidate_created"] is False assert data["database_write_executed"] is False assert data["external_network_executed"] is False def test_opportunity_alert_plan_preview_blocks_dispatch_and_llm_calls(): plan = MarketIntelService().build_opportunity_alert_plan() assert plan["mode"] == "opportunity_alert_plan_preview" assert plan["phase"] == "phase_140_market_intel_professional_source_governance" assert plan["ready_for_alert_candidates"] is False assert plan["alert_candidate_created"] is False assert plan["alert_queue_created"] is False assert plan["review_queue_created"] is False assert plan["review_queue_contract_defined"] is True assert plan["review_queue_contract_written"] is False assert plan["review_queue_table_created"] is False assert plan["review_action_executed"] is False assert plan["approval_record_written"] is False assert plan["telegram_dispatched"] is False assert plan["ai_summary_generated"] is False assert plan["llm_call_executed"] is False assert plan["notification_sent"] is False assert plan["database_session_created"] is False assert plan["database_write_executed"] is False assert plan["database_commit_executed"] is False assert plan["external_network_executed"] is False assert plan["scheduler_attached"] is False assert plan["writes_executed"] is False assert plan["would_write_database"] is False assert plan["channel_count"] == 4 assert {item["key"] for item in plan["channels"]} == { "operator_review", "daily_digest", "telegram_candidate", "ai_briefing_candidate", } assert plan["review_state_count"] == 6 assert {item["key"] for item in plan["review_states"]} == { "draft", "needs_review", "approved_for_digest", "approved_for_telegram", "rejected", "deferred", } assert {item["key"] for item in plan["review_actions"]} == { "approve_digest", "approve_telegram", "reject", "defer", } assert plan["review_queue_contract"]["table_name"] == "market_alert_review_queue" assert "alert_candidate_id" in plan["review_queue_contract"]["required_fields"] assert "reviewer_identity" in plan["review_queue_contract"]["audit_fields"] assert "payment_or_shipping_data" in plan["review_queue_contract"]["forbidden_fields"] assert {item["key"] for item in plan["review_priority_lanes"]} == { "critical", "high", "medium", "watch", } assert {item["key"] for item in plan["review_queue_indexes"]} == { "idx_market_alert_review_queue_state_priority", "ux_market_alert_review_queue_dedupe", "idx_market_alert_review_queue_bundle", } assert plan["approval_policy"]["manual_approval_required_for_dispatch"] is True assert plan["approval_policy"]["reviewer_identity_required"] is True assert "evidence_bundle_ready" in plan["blocked_reasons"] assert "scoring_job_ready" in plan["blocked_reasons"] assert "operator_approval" in plan["blocked_reasons"] assert "do_not_dispatch_telegram_from_alert_preview" in plan["safe_boundaries"] assert "do_not_create_review_queue_table_from_preview" in plan["safe_boundaries"] assert "do_not_write_review_queue_contract_from_preview" in plan["safe_boundaries"] assert "do_not_call_llm_from_alert_preview" in plan["safe_boundaries"] assert "customer_personal_data" in plan["payload_contract"]["forbidden_fields"] def test_opportunity_alert_plan_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/opportunity_alert_plan") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "opportunity_alert_plan_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["alert_candidate_created"] is False assert data["alert_queue_created"] is False assert data["review_queue_created"] is False assert data["review_queue_contract_defined"] is True assert data["review_queue_contract_written"] is False assert data["review_queue_table_created"] is False assert data["review_action_executed"] is False assert data["approval_record_written"] is False assert data["telegram_dispatched"] is False assert data["llm_call_executed"] is False assert data["database_write_executed"] is False assert data["external_network_executed"] is False def test_mcp_deploy_preflight_blocks_without_required_env(): preflight = build_mcp_deploy_preflight_plan(env={}) assert preflight["mode"] == "mcp_external_deploy_preflight_preview" assert preflight["compose_file_present"] is True assert preflight["ready_to_start_stack"] is False assert preflight["checks"]["compose_file_present"] is True assert preflight["checks"]["all_expected_services_declared"] is True assert preflight["checks"]["all_expected_containers_declared"] is True assert preflight["checks"]["all_public_mcp_ports_localhost_only"] is True assert preflight["checks"]["required_env_vars_present"] is False assert preflight["checks"]["router_flag_still_off_before_health"] is True assert "required_env_vars_present" in preflight["blocked_reasons"] assert preflight["operator_command_preview"] == "docker compose -f docker-compose.mcp.yml up -d" assert preflight["deployment_actions_executed"] is False assert preflight["docker_command_executed"] is False assert preflight["ssh_command_executed"] is False assert preflight["database_session_created"] is False assert preflight["database_write_executed"] is False assert preflight["database_commit_executed"] is False assert preflight["external_network_executed"] is False assert preflight["scheduler_attached"] is False assert preflight["would_write_database"] is False def test_mcp_compose_is_mounted_read_only_for_preflight(): compose = Path("docker-compose.yml").read_text(encoding="utf-8") assert "./docker-compose.mcp.yml:/app/docker-compose.mcp.yml:ro" in compose def test_mcp_deploy_preflight_ready_when_env_contract_is_present(): preflight = build_mcp_deploy_preflight_plan( env={ "MCP_POSTGRES_PASSWORD": "secret", "TAVILY_API_KEY": "tavily", "EXA_API_KEY": "exa", "MCP_ROUTER_ENABLED": "false", } ) assert preflight["ready_to_start_stack"] is True assert preflight["blocked_reasons"] == [] assert preflight["checks"]["required_env_vars_present"] is True assert preflight["checks"]["router_flag_still_off_before_health"] is True assert all(item["localhost_only"] for item in preflight["port_statuses"]) def test_mcp_deploy_preflight_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/mcp_deploy_preflight") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "mcp_external_deploy_preflight_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["deployment_actions_executed"] is False assert data["docker_command_executed"] is False assert data["ssh_command_executed"] is False assert data["database_write_executed"] is False assert data["external_network_executed"] is False assert data["scheduler_attached"] is False def test_mcp_readiness_default_is_planned_only(monkeypatch): monkeypatch.delenv("MCP_ROUTER_ENABLED", raising=False) readiness = MarketIntelService().build_mcp_readiness() assert readiness["mode"] == "mcp_readiness_planned" assert readiness["phase"] == "phase_140_market_intel_professional_source_governance" assert readiness["execute_requested"] is False assert readiness["router_enabled"] is False assert readiness["external_mcp_complete"] is False assert readiness["internal_mcp_complete"] is False assert readiness["market_intel_mcp_integrated"] is True assert readiness["mcp_tool_contract"]["contract_ready"] is True assert readiness["database_session_created"] is False assert readiness["database_write_executed"] is False assert readiness["database_commit_executed"] is False assert readiness["external_network_executed"] is False assert readiness["scheduler_attached"] is False assert readiness["writes_executed"] is False assert readiness["would_write_database"] is False assert readiness["telemetry"]["read_only_query_executed"] is False assert readiness["telemetry"]["database_session_created"] is False assert readiness["telemetry"]["database_write_executed"] is False assert readiness["readiness_checks"]["base_callers_registered"] is True assert readiness["readiness_checks"]["market_intel_caller_registered"] is True assert readiness["readiness_checks"]["market_intel_tools_registered"] is True assert readiness["readiness_checks"]["market_intel_tool_contract_ready"] is True assert len(readiness["server_statuses"]) == 4 assert all(item["health_checked"] is False for item in readiness["server_statuses"]) assert all(item["healthy"] is False for item in readiness["server_statuses"]) assert "execute_false_planned_only" in readiness["blocked_reasons"] assert "market_intel_caller_registered" not in readiness["blocked_reasons"] assert "market_intel_tools_registered" not in readiness["blocked_reasons"] def test_mcp_readiness_sqlite_read_only_counts_telemetry(monkeypatch): monkeypatch.delenv("MCP_ROUTER_ENABLED", raising=False) monkeypatch.setattr( "services.market_intel.mcp_readiness._health_check_servers", lambda base_hosts, timeout_sec: [ { "server": "postgres", "base_url": "http://127.0.0.1:3001", "configured": True, "health_checked": True, "healthy": False, "status": "error", "error_message": "test skipped network", }, { "server": "omnisearch", "base_url": "http://127.0.0.1:3003", "configured": True, "health_checked": True, "healthy": False, "status": "error", "error_message": "test skipped network", }, { "server": "firecrawl", "base_url": "http://127.0.0.1:3002", "configured": True, "health_checked": True, "healthy": False, "status": "error", "error_message": "test skipped network", }, { "server": "filesystem", "base_url": "http://127.0.0.1:3004", "configured": True, "health_checked": True, "healthy": False, "status": "error", "error_message": "test skipped network", }, ], ) engine = create_engine("sqlite:///:memory:") with engine.begin() as conn: conn.execute( text( """ CREATE TABLE mcp_calls ( id INTEGER PRIMARY KEY, server TEXT, called_at TEXT ) """ ) ) conn.execute( text( """ INSERT INTO mcp_calls (server, called_at) VALUES ('omnisearch', '2026-05-18 10:00:00'), ('omnisearch', '2026-05-18 10:05:00'), ('postgres', '2026-05-18 10:10:00') """ ) ) readiness = build_mcp_readiness_plan( execute_requested=True, timeout_sec=1, engine=engine, database_type="sqlite", ) assert readiness["mode"] == "mcp_readiness_read_only" assert readiness["execute_requested"] is True assert readiness["router_enabled"] is False assert readiness["external_mcp_complete"] is False assert readiness["internal_mcp_complete"] is True assert readiness["market_intel_mcp_integrated"] is True assert readiness["mcp_tool_contract"]["contract_ready"] is True assert readiness["telemetry"]["mode"] == "mcp_telemetry_read_only" assert readiness["telemetry"]["table_exists"] is True assert readiness["telemetry"]["total_calls"] == 3 assert readiness["telemetry"]["recent_24h_calls"] == 3 assert readiness["telemetry"]["read_only_query_executed"] is True assert readiness["telemetry"]["database_session_created"] is False assert readiness["telemetry"]["database_write_executed"] is False assert readiness["telemetry"]["database_commit_executed"] is False assert readiness["database_session_created"] is False assert readiness["database_write_executed"] is False assert readiness["database_commit_executed"] is False assert readiness["scheduler_attached"] is False assert readiness["writes_executed"] is False assert readiness["would_write_database"] is False assert readiness["server_statuses"][0]["health_checked"] is True assert {item["server"]: item["calls"] for item in readiness["telemetry"]["server_counts"]} == { "omnisearch": 2, "postgres": 1, } assert "mcp_router_enabled" in readiness["blocked_reasons"] assert "market_intel_caller_registered" not in readiness["blocked_reasons"] def test_market_intel_schema_smoke_checks_platform_columns(): smoke = MarketIntelService().build_schema_smoke()["schema_smoke"] assert smoke["passed"] is True assert smoke["missing_tables"] == [] assert smoke["missing_market_platform_columns"] == [] assert "crawl_policy_json" in smoke["market_platform_required_columns"] def test_platform_seed_plan_is_read_only_and_adapter_derived(): plan = MarketIntelService().build_platform_seed_plan() seed_codes = {seed["code"] for seed in plan["seeds"]} assert {"momo", "pchome", "coupang", "shopee"} <= seed_codes assert plan["would_write_database"] is False assert plan["required_gates"]["schema_smoke_required"] is True assert plan["required_gates"]["migration_required"] is True assert plan["required_gates"]["manual_operator_approval_required"] is True for seed in plan["seeds"]: policy = seed["crawl_policy_json"] assert seed["enabled"] is False assert seed["source_count"] == len(seed["sources"]) assert policy["allow_login"] is False assert policy["allow_database_write"] is False assert policy["allow_scheduler_attach"] is False def test_platform_seed_plan_unknown_adapter_returns_diagnostic_error(): plan = MarketIntelService().build_platform_seed_plan("unknown") assert plan["found"] is False assert plan["seed_count"] == 0 assert plan["error"] == "未知平台 adapter" def test_platform_seed_write_guard_blocks_default_environment(): guard = MarketIntelService().build_platform_seed_write_guard() assert guard["ready_to_write"] is False assert guard["would_write_database"] is False assert guard["database_write_allowed"] is False assert guard["seed_count"] == 4 assert "market_intel_enabled" in guard["blocked_reasons"] assert "market_intel_write_enabled" in guard["blocked_reasons"] assert "database_write_allowed" in guard["blocked_reasons"] assert "migration_confirmed" in guard["blocked_reasons"] assert "manual_operator_approval" in guard["blocked_reasons"] assert guard["schema_smoke"]["passed"] is True assert "schema_smoke_confirmed" not in guard["blocked_reasons"] def test_platform_seed_writer_plan_is_dry_run_only(): writer_plan = MarketIntelService().build_platform_seed_writer_plan() assert writer_plan["mode"] == "dry_run" assert writer_plan["ready_to_write"] is False assert writer_plan["writes_executed"] is False assert writer_plan["would_write_database"] is False assert writer_plan["operation_count"] == 4 assert writer_plan["schema_smoke"]["passed"] is True first_operation = writer_plan["operations"][0] assert first_operation["operation"] == "upsert" assert first_operation["table"] == "market_platforms" assert first_operation["write_status"] == "blocked_dry_run_only" assert first_operation["values"]["enabled"] is False assert "ON CONFLICT(code)" in first_operation["sql_shape"] def test_schema_db_probe_planned_does_not_connect_or_write(): probe = MarketIntelService().build_schema_db_probe() assert probe["mode"] == "schema_db_probe_planned" assert probe["execute_requested"] is False assert probe["read_only_query_executed"] is False assert probe["database_connection_opened"] is False assert probe["database_session_created"] is False assert probe["explicit_transaction_opened"] is False assert probe["database_write_executed"] is False assert probe["database_commit_executed"] is False assert probe["migration_executed"] is False assert probe["missing_tables"] == list(MARKET_INTEL_TABLES) assert "execute_false_planned_only" in probe["blocked_reasons"] def test_schema_db_probe_sqlite_read_only_reports_existing_and_missing_tables(): engine = create_engine("sqlite:///:memory:") with engine.begin() as conn: conn.execute(text("CREATE TABLE market_platforms (id INTEGER PRIMARY KEY)")) probe = build_schema_db_probe_plan( ["market_platforms", "market_campaigns"], execute_requested=True, database_type="sqlite", engine=engine, ) assert probe["mode"] == "schema_db_probe_read_only" assert probe["execute_requested"] is True assert probe["read_only_query_executed"] is True assert probe["database_connection_opened"] is True assert probe["database_session_created"] is False assert probe["explicit_transaction_opened"] is False assert probe["database_write_executed"] is False assert probe["database_commit_executed"] is False assert probe["existing_tables"] == ["market_platforms"] assert probe["missing_tables"] == ["market_campaigns"] assert probe["schema_tables_exist"] is False assert "market_tables_missing" in probe["blocked_reasons"] def test_platform_seed_db_diff_planned_does_not_connect_or_write(): diff = MarketIntelService().build_platform_seed_db_diff() assert diff["mode"] == "platform_seed_db_diff_planned" assert diff["execute_requested"] is False assert diff["read_only_query_executed"] is False assert diff["database_connection_opened"] is False assert diff["database_session_created"] is False assert diff["explicit_transaction_opened"] is False assert diff["database_write_executed"] is False assert diff["database_commit_executed"] is False assert diff["seed_write_executed"] is False assert diff["expected_seed_count"] == 4 assert set(diff["missing_codes"]) == {"momo", "pchome", "coupang", "shopee"} assert "execute_false_planned_only" in diff["blocked_reasons"] assert "seed_write_still_blocked" in diff["blocked_reasons"] def test_platform_seed_db_diff_sqlite_read_only_reports_missing_and_matching_seed_rows(): seed_plan = { "seeds": [ { "code": "momo", "name": "MOMO", "base_url": "https://momo.example", "enabled": False, "crawl_policy_json": { "allow_login": False, "allow_database_write": False, "seed_source_keys": ["momo_edm"], }, }, { "code": "pchome", "name": "PChome", "base_url": "https://pchome.example", "enabled": False, "crawl_policy_json": { "allow_login": False, "allow_database_write": False, "seed_source_keys": ["pchome_region"], }, }, ] } engine = create_engine("sqlite:///:memory:") with engine.begin() as conn: conn.execute( text( """ CREATE TABLE market_platforms ( code TEXT PRIMARY KEY, name TEXT, base_url TEXT, enabled BOOLEAN, crawl_policy_json TEXT ) """ ) ) conn.execute( text( """ INSERT INTO market_platforms (code, name, base_url, enabled, crawl_policy_json) VALUES (:code, :name, :base_url, :enabled, :crawl_policy_json) """ ), { "code": "momo", "name": "MOMO", "base_url": "https://momo.example", "enabled": False, "crawl_policy_json": json.dumps( seed_plan["seeds"][0]["crawl_policy_json"], ensure_ascii=False, sort_keys=True, ), }, ) diff = build_platform_seed_db_diff_plan( seed_plan, execute_requested=True, database_type="sqlite", engine=engine, ) assert diff["mode"] == "platform_seed_db_diff_read_only" assert diff["execute_requested"] is True assert diff["read_only_query_executed"] is True assert diff["database_connection_opened"] is True assert diff["database_session_created"] is False assert diff["explicit_transaction_opened"] is False assert diff["database_write_executed"] is False assert diff["database_commit_executed"] is False assert diff["seed_write_executed"] is False assert diff["expected_seed_count"] == 2 assert diff["existing_seed_count"] == 1 assert diff["existing_codes"] == ["momo"] assert diff["missing_codes"] == ["pchome"] assert diff["changed_codes"] == [] assert diff["matching_codes"] == ["momo"] assert diff["seed_rows_ready"] is False assert {item["code"]: item["diff_status"] for item in diff["seed_diffs"]} == { "momo": "matches_expected", "pchome": "missing", } assert "seed_rows_missing" in diff["blocked_reasons"] assert "seed_write_still_blocked" in diff["blocked_reasons"] def test_deployment_readiness_reports_app_only_release_gate(): readiness = MarketIntelService().build_deployment_readiness() step_keys = {step["key"] for step in readiness["required_manual_steps"]} fallback_keys = {item["key"] for item in readiness["fallback_plan"]} boundary_keys = {item["key"] for item in readiness["safe_deploy_boundaries"]} assert readiness["mode"] == "app_only_release_gate" assert readiness["production_deployed"] is False assert readiness["git_committed"] is False assert readiness["git_pushed"] is False assert readiness["ready_for_production_deploy"] is True assert readiness["deployment_actions_executed"] is False assert readiness["execution_boundary"]["api_executes_scp"] is False assert readiness["execution_boundary"]["api_recreates_container"] is False assert readiness["execution_boundary"]["api_runs_migration"] is False assert readiness["execution_boundary"]["api_writes_database"] is False assert readiness["requires_backup_before_major_update"] is True assert readiness["backup_command"] == "python backup_system.py" assert readiness["checks"]["schema_smoke_passed"] is True assert readiness["checks"]["schema_db_probe_planned_safe"] is True assert readiness["checks"]["platform_seed_db_diff_planned_safe"] is True assert readiness["checks"]["legacy_source_bridge_planned_safe"] is True assert readiness["checks"]["mcp_readiness_planned_safe"] is True assert readiness["checks"]["mcp_tool_contract_ready"] is True assert readiness["checks"]["mcp_deploy_preflight_preview_safe"] is True assert readiness["checks"]["mcp_activation_runbook_preview_safe"] is True assert readiness["checks"]["mcp_fetch_gate_preview_safe"] is True assert readiness["checks"]["mcp_completion_audit_preview_safe"] is True assert readiness["checks"]["mcp_activation_evidence_preview_safe"] is True assert readiness["checks"]["mcp_runtime_smoke_receipt_preview_safe"] is True assert readiness["checks"]["mcp_runtime_promotion_preview_safe"] is True assert readiness["checks"]["mcp_manual_fetch_handoff_preview_safe"] is True assert readiness["checks"]["mcp_fetch_target_review_preview_safe"] is True assert readiness["checks"]["mcp_fetch_run_package_preview_safe"] is True assert readiness["checks"]["mcp_fetch_run_readiness_preview_safe"] is True assert readiness["checks"]["mcp_fetch_run_receipt_preview_safe"] is True assert readiness["checks"]["mcp_fetch_result_parser_review_preview_safe"] is True assert readiness["checks"]["mcp_fetch_candidate_handoff_review_preview_safe"] is True assert readiness["checks"]["mcp_fetch_candidate_queue_review_preview_safe"] is True assert ( readiness["checks"][ "mcp_fetch_candidate_queue_writer_preflight_preview_safe" ] is True ) assert ( readiness["checks"][ "mcp_fetch_candidate_queue_writer_cli_review_preview_safe" ] is True ) assert ( readiness["checks"][ "mcp_fetch_candidate_queue_writer_run_package_review_preview_safe" ] is True ) assert ( readiness["checks"][ "mcp_fetch_candidate_queue_writer_run_readiness_preview_safe" ] is True ) assert ( readiness["checks"][ "mcp_fetch_candidate_queue_writer_run_receipt_review_preview_safe" ] is True ) assert ( readiness["checks"][ "mcp_fetch_candidate_queue_writer_run_closeout_review_preview_safe" ] is True ) assert ( readiness["checks"][ "mcp_fetch_candidate_queue_writer_post_closeout_inventory_review_preview_safe" ] is True ) assert ( readiness["checks"][ "mcp_fetch_candidate_queue_writer_review_handoff_preview_safe" ] is True ) assert ( readiness["checks"][ "mcp_fetch_candidate_queue_writer_review_inventory_preview_safe" ] is True ) assert ( readiness["checks"][ "mcp_fetch_candidate_queue_writer_review_decision_preview_safe" ] is True ) assert ( readiness["checks"][ "mcp_fetch_candidate_queue_writer_review_decision_approval_preview_safe" ] is True ) assert ( readiness["checks"][ "mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight_preview_safe" ] is True ) assert ( readiness["checks"]["mcp_professional_source_governance_preview_safe"] is True ) assert ( readiness["mcp_professional_source_governance"]["mode"] == "mcp_professional_source_governance_preview" ) assert ( readiness["mcp_professional_source_governance"]["api_fetches_source_url"] is False ) assert ( readiness["checks"][ "mcp_fetch_target_source_governance_review_preview_safe" ] is True ) assert ( readiness["mcp_fetch_target_source_governance_review"]["mode"] == "mcp_fetch_target_source_governance_review_preview" ) assert ( readiness["mcp_fetch_target_source_governance_review"][ "api_fetches_source_url" ] is False ) assert readiness["checks"]["scheduler_plan_preview_safe"] is True assert readiness["checks"]["manual_sample_plan_preview_safe"] is True assert readiness["checks"]["manual_sample_acceptance_preview_safe"] is True assert readiness["checks"]["manual_sample_review_preview_safe"] is True assert readiness["checks"]["manual_sample_review_evaluation_post_safe"] is True assert readiness["checks"]["manual_sample_candidate_handoff_post_safe"] is True assert readiness["checks"]["manual_sample_candidate_queue_draft_post_safe"] is True assert readiness["checks"]["manual_sample_candidate_queue_approval_post_safe"] is True assert readiness["checks"]["manual_sample_candidate_queue_transaction_post_safe"] is True assert readiness["checks"]["candidate_queue_writer_cli_status_safe"] is True assert readiness["checks"]["candidate_queue_writer_preflight_planned_safe"] is True assert ( readiness["checks"]["candidate_queue_writer_postwrite_smoke_planned_safe"] is True ) assert ( readiness["checks"]["candidate_queue_writer_operator_drill_preview_safe"] is True ) assert ( readiness["checks"]["candidate_queue_writer_run_package_preview_safe"] is True ) assert ( readiness["checks"]["candidate_queue_writer_run_readiness_preview_safe"] is True ) assert ( readiness["checks"]["candidate_queue_writer_run_receipt_preview_safe"] is True ) assert ( readiness["checks"]["candidate_queue_writer_run_closeout_preview_safe"] is True ) assert ( readiness["checks"]["candidate_queue_review_handoff_preview_safe"] is True ) assert ( readiness["checks"]["candidate_queue_review_inventory_preview_safe"] is True ) assert ( readiness["checks"]["candidate_queue_review_decision_preview_safe"] is True ) assert ( readiness["checks"][ "candidate_queue_review_decision_approval_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_decision_transaction_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_decision_writer_preflight_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_decision_writer_postwrite_smoke_planned_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_decision_writer_operator_drill_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_decision_writer_run_package_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_decision_writer_run_readiness_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_decision_writer_run_receipt_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_decision_writer_run_closeout_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_decision_post_closeout_inventory_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_completion_archive_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_archive_summary_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_preflight_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_run_package_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_output_receipt_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_preflight_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_transaction_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_writer_preflight_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_run_package_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_run_readiness_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_run_receipt_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_run_closeout_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout_preview_safe" ] is True ) assert ( readiness["checks"][ "candidate_queue_review_decision_writer_cli_status_safe" ] is True ) assert readiness["checks"]["match_review_plan_preview_safe"] is True assert readiness["checks"]["opportunity_plan_preview_safe"] is True assert readiness["checks"]["opportunity_scoring_plan_preview_safe"] is True assert readiness["checks"]["opportunity_evidence_plan_preview_safe"] is True assert readiness["checks"]["opportunity_alert_plan_preview_safe"] is True assert readiness["checks"]["migration_apply_drill_preview_safe"] is True assert readiness["checks"]["migration_catalog_review_preview_safe"] is True assert readiness["checks"]["migration_live_smoke_preview_safe"] is True assert readiness["checks"]["live_db_inventory_preview_safe"] is True assert readiness["checks"]["writer_plan_dry_run_only"] is True assert readiness["writer_plan_summary"]["writes_executed"] is False assert "readiness_checks_not_all_passed" not in readiness["blocked_reasons"] assert "production_deploy_not_executed_by_api" in readiness["blocked_reasons"] assert "backup_must_be_verified_by_operator" in readiness["blocked_reasons"] assert "run_backup_system" in step_keys assert "verify_health_endpoint" in step_keys assert "feature_flag_kill_switch" in fallback_keys assert "database_write_blocked" in fallback_keys assert "no_remove_orphans" in boundary_keys assert "no_momo_db_lifecycle_change" in boundary_keys assert "/health" in readiness["production_smoke_targets"] assert "/api/market_intel/deployment_readiness" in readiness["production_smoke_targets"] assert "/api/market_intel/platform_seed_db_diff" in readiness["production_smoke_targets"] assert "/api/market_intel/legacy_source_bridge" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_readiness" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_tool_contract" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_deploy_preflight" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_activation_runbook" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_fetch_gate" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_completion_audit" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_activation_evidence" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_runtime_smoke_receipt" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_runtime_promotion" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_manual_fetch_handoff" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_fetch_target_review" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_fetch_run_package" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_fetch_run_readiness" in readiness["production_smoke_targets"] assert "/api/market_intel/mcp_fetch_run_receipt" in readiness["production_smoke_targets"] assert ( "/api/market_intel/mcp_fetch_candidate_queue_writer_run_package_review" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_handoff" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_inventory" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_decision" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_decision_approval" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/mcp_professional_source_governance" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/mcp_fetch_target_source_governance_review" in readiness["production_smoke_targets"] ) assert "/api/market_intel/scheduler_plan" in readiness["production_smoke_targets"] assert "/api/market_intel/manual_sample_plan" in readiness["production_smoke_targets"] assert "/api/market_intel/manual_sample_acceptance" in readiness["production_smoke_targets"] assert "/api/market_intel/manual_sample_review" in readiness["production_smoke_targets"] assert "/api/market_intel/match_review_plan" in readiness["production_smoke_targets"] assert "/api/market_intel/opportunity_plan" in readiness["production_smoke_targets"] assert "/api/market_intel/opportunity_scoring_plan" in readiness["production_smoke_targets"] assert "/api/market_intel/opportunity_evidence_plan" in readiness["production_smoke_targets"] assert "/api/market_intel/opportunity_alert_plan" in readiness["production_smoke_targets"] assert "/api/market_intel/migration_apply_drill" in readiness["production_smoke_targets"] assert "/api/market_intel/migration_catalog_review" in readiness["production_smoke_targets"] assert "/api/market_intel/migration_live_smoke" in readiness["production_smoke_targets"] assert "/api/market_intel/live_db_inventory" in readiness["production_smoke_targets"] assert ( "/api/market_intel/manual_sample_review/candidate_queue_writer_postwrite_smoke" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/candidate_queue_writer_operator_drill" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/candidate_queue_writer_run_package" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/candidate_queue_writer_run_readiness" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/candidate_queue_writer_run_receipt" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/candidate_queue_writer_run_closeout" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/candidate_queue_review_handoff" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/candidate_queue_review_inventory" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/candidate_queue_review_decision" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_approval" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_transaction" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_preflight" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_postwrite_smoke" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_operator_drill" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_run_package" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_run_readiness" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_run_receipt" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_run_closeout" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_post_closeout_inventory" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_completion_archive" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_archive_summary" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_preflight" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_run_package" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_output_receipt" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_preflight" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_transaction" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_writer_preflight" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_run_package" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_run_readiness" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_run_receipt" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_run_closeout" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout" in readiness["production_smoke_targets"] ) assert ( "/api/market_intel/manual_sample_review/" "candidate_queue_review_decision_writer_status" in readiness["production_smoke_targets"] ) assert readiness["write_approval_runbook"]["ready_for_real_write"] is False assert readiness["write_approval_runbook"]["writes_executed"] is False assert readiness["migration_blueprint"]["migration_executed"] is False assert readiness["migration_blueprint"]["file_created"] is True assert readiness["migration_blueprint"]["file_matches_blueprint"] is True assert readiness["migration_apply_drill"]["mode"] == "migration_apply_drill_preview" assert readiness["migration_apply_drill"]["migration_executed"] is False assert readiness["migration_apply_drill"]["rollback_executed"] is False assert readiness["migration_apply_drill"]["database_write_executed"] is False assert readiness["migration_apply_drill"]["api_executes_migration"] is False assert readiness["migration_catalog_review"]["mode"] == "migration_catalog_review_preview" assert readiness["migration_catalog_review"]["catalog_state"] == "planned_no_probe" assert readiness["migration_catalog_review"]["migration_executed"] is False assert readiness["migration_catalog_review"]["database_write_executed"] is False assert readiness["migration_catalog_review"]["api_executes_migration"] is False assert readiness["migration_live_smoke"]["mode"] == "migration_live_smoke_preview" assert readiness["migration_live_smoke"]["smoke_result"] == "planned_no_execution" assert readiness["migration_live_smoke"]["migration_executed"] is False assert readiness["migration_live_smoke"]["database_write_executed"] is False assert readiness["migration_live_smoke"]["api_executes_migration"] is False assert readiness["live_db_inventory"]["mode"] == "live_db_inventory_planned" assert readiness["live_db_inventory"]["read_only_query_executed"] is False assert readiness["live_db_inventory"]["database_write_executed"] is False assert readiness["live_db_inventory"]["migration_executed"] is False assert readiness["schema_db_probe"]["read_only_query_executed"] is False assert readiness["platform_seed_db_diff"]["read_only_query_executed"] is False assert readiness["legacy_source_bridge"]["read_only_query_executed"] is False assert readiness["mcp_readiness"]["mode"] == "mcp_readiness_planned" assert readiness["mcp_readiness"]["telemetry"]["read_only_query_executed"] is False assert readiness["mcp_tool_contract"]["contract_ready"] is True assert readiness["mcp_tool_contract"]["database_write_executed"] is False assert readiness["mcp_deploy_preflight"]["deployment_actions_executed"] is False assert readiness["mcp_deploy_preflight"]["docker_command_executed"] is False assert readiness["mcp_activation_runbook"]["deployment_actions_executed"] is False assert readiness["mcp_activation_runbook"]["docker_command_executed"] is False assert readiness["mcp_fetch_gate"]["network_request_allowed"] is False assert readiness["mcp_fetch_gate"]["external_network_executed"] is False assert readiness["mcp_completion_audit"]["mode"] == "mcp_completion_audit_preview" assert readiness["mcp_completion_audit"]["audit_preview_safe"] is True assert readiness["mcp_completion_audit"]["api_writes_database"] is False assert readiness["mcp_completion_audit"]["api_uses_external_network"] is False assert readiness["mcp_completion_audit"]["ready_for_manual_fetch"] is False assert readiness["mcp_activation_evidence"]["mode"] == "mcp_activation_evidence_preview" assert readiness["mcp_activation_evidence"]["evidence_payload_received"] is False assert readiness["mcp_activation_evidence"]["payload_persisted"] is False assert readiness["mcp_activation_evidence"]["api_executes_health_check"] is False assert readiness["mcp_activation_evidence"]["api_writes_database"] is False assert readiness["mcp_activation_evidence"]["api_uses_external_network"] is False assert readiness["mcp_runtime_smoke_receipt"]["mode"] == "mcp_runtime_smoke_receipt_preview" assert readiness["mcp_runtime_smoke_receipt"]["receipt_payload_received"] is False assert readiness["mcp_runtime_smoke_receipt"]["payload_persisted"] is False assert readiness["mcp_runtime_smoke_receipt"]["receipt_persisted"] is False assert readiness["mcp_runtime_smoke_receipt"]["api_executes_health_check"] is False assert readiness["mcp_runtime_smoke_receipt"]["api_writes_database"] is False assert readiness["mcp_runtime_smoke_receipt"]["api_uses_external_network"] is False assert readiness["mcp_runtime_promotion"]["mode"] == "mcp_runtime_promotion_preview" assert readiness["mcp_runtime_promotion"]["promotion_payload_received"] is False assert readiness["mcp_runtime_promotion"]["payload_persisted"] is False assert readiness["mcp_runtime_promotion"]["promotion_persisted"] is False assert readiness["mcp_runtime_promotion"]["api_executes_health_check"] is False assert readiness["mcp_runtime_promotion"]["api_writes_database"] is False assert readiness["mcp_runtime_promotion"]["api_uses_external_network"] is False assert readiness["mcp_manual_fetch_handoff"]["mode"] == "mcp_manual_fetch_handoff_preview" assert readiness["mcp_manual_fetch_handoff"]["handoff_payload_received"] is False assert readiness["mcp_manual_fetch_handoff"]["payload_persisted"] is False assert readiness["mcp_manual_fetch_handoff"]["handoff_persisted"] is False assert readiness["mcp_manual_fetch_handoff"]["manual_fetch_gate_opened_by_api"] is False assert readiness["mcp_manual_fetch_handoff"]["network_request_allowed"] is False assert readiness["mcp_manual_fetch_handoff"]["api_writes_database"] is False assert readiness["mcp_manual_fetch_handoff"]["api_uses_external_network"] is False assert readiness["mcp_fetch_target_review"]["mode"] == "mcp_fetch_target_review_preview" assert readiness["mcp_fetch_target_review"]["target_payload_received"] is False assert readiness["mcp_fetch_target_review"]["payload_persisted"] is False assert readiness["mcp_fetch_target_review"]["target_review_persisted"] is False assert readiness["mcp_fetch_target_review"]["manual_fetch_gate_opened_by_api"] is False assert readiness["mcp_fetch_target_review"]["network_request_allowed"] is False assert readiness["mcp_fetch_target_review"]["fetch_executed"] is False assert readiness["mcp_fetch_target_review"]["api_writes_database"] is False assert readiness["mcp_fetch_target_review"]["api_uses_external_network"] is False assert readiness["mcp_fetch_target_review"]["scheduler_attached"] is False assert ( readiness["mcp_fetch_target_source_governance_review"]["payload_persisted"] is False ) assert ( readiness["mcp_fetch_target_source_governance_review"][ "bridge_review_persisted" ] is False ) assert ( readiness["mcp_fetch_target_source_governance_review"][ "network_request_allowed" ] is False ) assert ( readiness["mcp_fetch_target_source_governance_review"]["api_writes_database"] is False ) assert ( readiness["mcp_fetch_target_source_governance_review"]["api_executes_cli"] is False ) assert ( readiness["mcp_fetch_target_source_governance_review"]["scheduler_attached"] is False ) assert readiness["mcp_fetch_run_package"]["mode"] == "mcp_fetch_run_package_preview" assert readiness["mcp_fetch_run_package"]["run_payload_received"] is False assert readiness["mcp_fetch_run_package"]["payload_persisted"] is False assert readiness["mcp_fetch_run_package"]["run_package_persisted"] is False assert readiness["mcp_fetch_run_package"]["command_preview_persisted"] is False assert readiness["mcp_fetch_run_package"]["package_artifact_created"] is False assert readiness["mcp_fetch_run_package"]["manual_fetch_gate_opened_by_api"] is False assert readiness["mcp_fetch_run_package"]["network_request_allowed"] is False assert readiness["mcp_fetch_run_package"]["fetch_executed"] is False assert readiness["mcp_fetch_run_package"]["cli_executed"] is False assert readiness["mcp_fetch_run_package"]["api_executes_cli"] is False assert readiness["mcp_fetch_run_package"]["api_writes_database"] is False assert readiness["mcp_fetch_run_package"]["api_uses_external_network"] is False assert readiness["mcp_fetch_run_package"]["file_written"] is False assert readiness["mcp_fetch_run_package"]["scheduler_attached"] is False assert readiness["mcp_fetch_run_readiness"]["mode"] == "mcp_fetch_run_readiness_preview" assert readiness["mcp_fetch_run_readiness"]["run_readiness_payload_received"] is False assert readiness["mcp_fetch_run_readiness"]["payload_persisted"] is False assert readiness["mcp_fetch_run_readiness"]["run_readiness_persisted"] is False assert readiness["mcp_fetch_run_readiness"]["run_readiness_artifact_created"] is False assert readiness["mcp_fetch_run_readiness"]["run_readiness_file_written"] is False assert readiness["mcp_fetch_run_readiness"]["receipt_file_written"] is False assert readiness["mcp_fetch_run_readiness"]["manual_fetch_gate_opened_by_api"] is False assert readiness["mcp_fetch_run_readiness"]["network_request_allowed"] is False assert readiness["mcp_fetch_run_readiness"]["fetch_executed"] is False assert readiness["mcp_fetch_run_readiness"]["cli_executed"] is False assert readiness["mcp_fetch_run_readiness"]["api_executes_cli"] is False assert readiness["mcp_fetch_run_readiness"]["api_writes_database"] is False assert readiness["mcp_fetch_run_readiness"]["api_uses_external_network"] is False assert readiness["mcp_fetch_run_readiness"]["file_written"] is False assert readiness["mcp_fetch_run_readiness"]["scheduler_attached"] is False assert readiness["mcp_fetch_run_receipt"]["mode"] == "mcp_fetch_run_receipt_preview" assert readiness["mcp_fetch_run_receipt"]["run_receipt_payload_received"] is False assert readiness["mcp_fetch_run_receipt"]["payload_persisted"] is False assert readiness["mcp_fetch_run_receipt"]["run_receipt_persisted"] is False assert readiness["mcp_fetch_run_receipt"]["receipt_persisted"] is False assert readiness["mcp_fetch_run_receipt"]["run_receipt_file_written"] is False assert readiness["mcp_fetch_run_receipt"]["receipt_file_written"] is False assert readiness["mcp_fetch_run_receipt"]["manual_fetch_gate_opened_by_api"] is False assert readiness["mcp_fetch_run_receipt"]["network_request_allowed"] is False assert readiness["mcp_fetch_run_receipt"]["fetch_executed"] is False assert readiness["mcp_fetch_run_receipt"]["fetch_executed_by_api"] is False assert readiness["mcp_fetch_run_receipt"]["cli_executed"] is False assert readiness["mcp_fetch_run_receipt"]["api_executes_cli"] is False assert readiness["mcp_fetch_run_receipt"]["api_writes_database"] is False assert readiness["mcp_fetch_run_receipt"]["api_uses_external_network"] is False assert readiness["mcp_fetch_run_receipt"]["file_written"] is False assert readiness["mcp_fetch_run_receipt"]["scheduler_attached"] is False assert readiness["manual_sample_plan"]["mode"] == "manual_sample_fetch_plan_preview" assert readiness["manual_sample_plan"]["sample_fetch_executed"] is False assert readiness["manual_sample_plan"]["external_network_executed"] is False assert readiness["manual_sample_plan"]["database_write_executed"] is False assert readiness["manual_sample_plan"]["scheduler_attached"] is False assert readiness["manual_sample_acceptance"]["mode"] == "manual_sample_acceptance_preview" assert readiness["manual_sample_acceptance"]["sample_result_loaded"] is False assert readiness["manual_sample_acceptance"]["candidate_import_allowed"] is False assert readiness["manual_sample_acceptance"]["external_network_executed"] is False assert readiness["manual_sample_acceptance"]["database_write_executed"] is False assert readiness["manual_sample_acceptance"]["scheduler_attached"] is False assert readiness["manual_sample_review"]["mode"] == "manual_sample_review_preview" assert readiness["manual_sample_review"]["sample_result_loaded"] is False assert readiness["manual_sample_review"]["sample_result_reviewed"] is False assert readiness["manual_sample_review"]["candidate_import_allowed"] is False assert readiness["manual_sample_review"]["external_network_executed"] is False assert readiness["manual_sample_review"]["database_write_executed"] is False assert readiness["manual_sample_review"]["scheduler_attached"] is False assert ( readiness["manual_sample_review_evaluation"]["mode"] == "manual_sample_review_evaluation_preview" ) assert readiness["manual_sample_review_evaluation"]["payload_received"] is True assert readiness["manual_sample_review_evaluation"]["payload_persisted"] is False assert readiness["manual_sample_review_evaluation"]["sample_result_persisted"] is False assert ( readiness["manual_sample_review_evaluation"]["candidate_import_allowed"] is False ) assert ( readiness["manual_sample_review_evaluation"]["external_network_executed"] is False ) assert ( readiness["manual_sample_review_evaluation"]["database_write_executed"] is False ) assert readiness["manual_sample_review_evaluation"]["scheduler_attached"] is False assert ( readiness["manual_sample_candidate_handoff"]["mode"] == "manual_sample_candidate_handoff_preview" ) assert readiness["manual_sample_candidate_handoff"]["payload_received"] is True assert readiness["manual_sample_candidate_handoff"]["payload_persisted"] is False assert ( readiness["manual_sample_candidate_handoff"]["candidate_handoff_persisted"] is False ) assert ( readiness["manual_sample_candidate_handoff"]["candidate_import_allowed"] is False ) assert ( readiness["manual_sample_candidate_handoff"]["external_network_executed"] is False ) assert ( readiness["manual_sample_candidate_handoff"]["database_write_executed"] is False ) assert readiness["manual_sample_candidate_handoff"]["scheduler_attached"] is False assert ( readiness["manual_sample_candidate_queue_draft"]["mode"] == "manual_sample_candidate_queue_draft_preview" ) assert ( readiness["manual_sample_candidate_queue_draft"]["payload_received"] is True ) assert ( readiness["manual_sample_candidate_queue_draft"]["payload_persisted"] is False ) assert ( readiness["manual_sample_candidate_queue_draft"]["review_queue_created"] is False ) assert ( readiness["manual_sample_candidate_queue_draft"]["review_queue_persisted"] is False ) assert ( readiness["manual_sample_candidate_queue_draft"]["candidate_import_allowed"] is False ) assert ( readiness["manual_sample_candidate_queue_draft"]["external_network_executed"] is False ) assert ( readiness["manual_sample_candidate_queue_draft"]["database_write_executed"] is False ) assert ( readiness["manual_sample_candidate_queue_draft"]["scheduler_attached"] is False ) assert ( readiness["manual_sample_candidate_queue_approval"]["mode"] == "manual_sample_candidate_queue_approval_preview" ) assert ( readiness["manual_sample_candidate_queue_approval"]["payload_received"] is True ) assert ( readiness["manual_sample_candidate_queue_approval"]["payload_persisted"] is False ) assert ( readiness["manual_sample_candidate_queue_approval"][ "approval_request_created" ] is False ) assert ( readiness["manual_sample_candidate_queue_approval"][ "approval_record_written" ] is False ) assert ( readiness["manual_sample_candidate_queue_approval"][ "review_queue_write_allowed" ] is False ) assert ( readiness["manual_sample_candidate_queue_approval"]["review_queue_created"] is False ) assert ( readiness["manual_sample_candidate_queue_approval"][ "review_queue_persisted" ] is False ) assert ( readiness["manual_sample_candidate_queue_approval"][ "candidate_import_allowed" ] is False ) assert ( readiness["manual_sample_candidate_queue_approval"][ "external_network_executed" ] is False ) assert ( readiness["manual_sample_candidate_queue_approval"][ "database_write_executed" ] is False ) assert ( readiness["manual_sample_candidate_queue_approval"]["scheduler_attached"] is False ) assert ( readiness["manual_sample_candidate_queue_transaction"]["mode"] == "manual_sample_candidate_queue_transaction_preview" ) assert ( readiness["manual_sample_candidate_queue_transaction"]["payload_received"] is True ) assert ( readiness["manual_sample_candidate_queue_transaction"]["payload_persisted"] is False ) assert ( readiness["manual_sample_candidate_queue_transaction"]["transaction_ready"] is False ) assert ( readiness["manual_sample_candidate_queue_transaction"]["transaction_opened"] is False ) assert ( readiness["manual_sample_candidate_queue_transaction"]["transaction_committed"] is False ) assert ( readiness["manual_sample_candidate_queue_transaction"][ "approval_record_written" ] is False ) assert ( readiness["manual_sample_candidate_queue_transaction"]["review_queue_created"] is False ) assert ( readiness["manual_sample_candidate_queue_transaction"][ "review_queue_persisted" ] is False ) assert ( readiness["manual_sample_candidate_queue_transaction"][ "candidate_import_allowed" ] is False ) assert ( readiness["manual_sample_candidate_queue_transaction"][ "external_network_executed" ] is False ) assert ( readiness["manual_sample_candidate_queue_transaction"][ "database_write_executed" ] is False ) assert ( readiness["manual_sample_candidate_queue_transaction"]["scheduler_attached"] is False ) assert ( readiness["candidate_queue_writer_cli_status"]["mode"] == "candidate_queue_writer_cli_blocked" ) assert ( readiness["candidate_queue_writer_cli_status"]["ready_for_real_write"] is False ) assert readiness["candidate_queue_writer_cli_status"]["writes_executed"] is False assert ( readiness["candidate_queue_writer_cli_status"]["would_write_database"] is False ) assert ( readiness["candidate_queue_writer_cli_status"]["database_connection_opened"] is False ) assert ( readiness["candidate_queue_writer_cli_status"]["explicit_transaction_opened"] is False ) assert ( readiness["candidate_queue_writer_cli_status"]["database_write_executed"] is False ) assert ( readiness["candidate_queue_writer_cli_status"]["database_commit_executed"] is False ) assert ( readiness["candidate_queue_writer_cli_status"]["scheduler_attached"] is False ) assert ( readiness["candidate_queue_writer_preflight"]["mode"] == "candidate_queue_writer_preflight_planned" ) assert ( readiness["candidate_queue_writer_preflight"]["read_only_query_executed"] is False ) assert ( readiness["candidate_queue_writer_preflight"]["database_connection_opened"] is False ) assert ( readiness["candidate_queue_writer_preflight"]["database_write_executed"] is False ) assert ( readiness["candidate_queue_writer_preflight"]["database_commit_executed"] is False ) assert ( readiness["candidate_queue_writer_preflight"]["scheduler_attached"] is False ) assert ( readiness["candidate_queue_writer_postwrite_smoke"]["mode"] == "candidate_queue_writer_postwrite_smoke_planned" ) assert ( readiness["candidate_queue_writer_postwrite_smoke"][ "read_only_query_executed" ] is False ) assert ( readiness["candidate_queue_writer_postwrite_smoke"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_writer_postwrite_smoke"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_writer_postwrite_smoke"][ "database_commit_executed" ] is False ) assert ( readiness["candidate_queue_writer_postwrite_smoke"]["scheduler_attached"] is False ) assert ( readiness["candidate_queue_writer_operator_drill"]["mode"] == "candidate_queue_writer_operator_drill_preview" ) assert ( readiness["candidate_queue_writer_operator_drill"]["api_executes_cli"] is False ) assert ( readiness["candidate_queue_writer_operator_drill"][ "api_reads_approval_token" ] is False ) assert ( readiness["candidate_queue_writer_operator_drill"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_writer_operator_drill"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_writer_operator_drill"][ "database_commit_executed" ] is False ) assert ( readiness["candidate_queue_writer_operator_drill"]["scheduler_attached"] is False ) assert ( readiness["candidate_queue_writer_run_package"]["mode"] == "candidate_queue_writer_run_package_preview" ) assert ( readiness["candidate_queue_writer_run_package"]["package_artifact_created"] is False ) assert readiness["candidate_queue_writer_run_package"]["api_writes_file"] is False assert ( readiness["candidate_queue_writer_run_package"]["api_executes_cli"] is False ) assert ( readiness["candidate_queue_writer_run_package"]["api_reads_approval_token"] is False ) assert ( readiness["candidate_queue_writer_run_package"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_writer_run_package"]["database_write_executed"] is False ) assert ( readiness["candidate_queue_writer_run_package"]["database_commit_executed"] is False ) assert ( readiness["candidate_queue_writer_run_package"]["scheduler_attached"] is False ) assert ( readiness["candidate_queue_writer_run_readiness"]["mode"] == "candidate_queue_writer_run_readiness_preview" ) assert ( readiness["candidate_queue_writer_run_readiness"][ "ready_for_api_database_write" ] is False ) assert ( readiness["candidate_queue_writer_run_readiness"]["api_executes_cli"] is False ) assert ( readiness["candidate_queue_writer_run_readiness"][ "api_reads_approval_token" ] is False ) assert readiness["candidate_queue_writer_run_readiness"]["api_writes_file"] is False assert ( readiness["candidate_queue_writer_run_readiness"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_writer_run_readiness"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_writer_run_readiness"][ "database_commit_executed" ] is False ) assert ( readiness["candidate_queue_writer_run_readiness"]["scheduler_attached"] is False ) assert ( readiness["candidate_queue_writer_run_receipt"]["mode"] == "candidate_queue_writer_run_receipt_preview" ) assert ( readiness["candidate_queue_writer_run_receipt"]["ready_for_api_database_write"] is False ) assert ( readiness["candidate_queue_writer_run_receipt"]["ready_for_scheduler_attach"] is False ) assert readiness["candidate_queue_writer_run_receipt"]["api_executes_cli"] is False assert ( readiness["candidate_queue_writer_run_receipt"]["api_reads_approval_token"] is False ) assert readiness["candidate_queue_writer_run_receipt"]["api_writes_file"] is False assert ( readiness["candidate_queue_writer_run_receipt"]["database_connection_opened"] is False ) assert ( readiness["candidate_queue_writer_run_receipt"]["database_write_executed"] is False ) assert ( readiness["candidate_queue_writer_run_receipt"]["database_commit_executed"] is False ) assert readiness["candidate_queue_writer_run_receipt"]["scheduler_attached"] is False assert ( readiness["candidate_queue_writer_run_closeout"]["mode"] == "candidate_queue_writer_run_closeout_preview" ) assert readiness["candidate_queue_writer_run_closeout"]["closeout_passed"] is False assert ( readiness["candidate_queue_writer_run_closeout"]["ready_for_api_database_write"] is False ) assert ( readiness["candidate_queue_writer_run_closeout"]["ready_for_scheduler_attach"] is False ) assert readiness["candidate_queue_writer_run_closeout"]["api_executes_cli"] is False assert ( readiness["candidate_queue_writer_run_closeout"]["api_reads_approval_token"] is False ) assert readiness["candidate_queue_writer_run_closeout"]["api_writes_file"] is False assert ( readiness["candidate_queue_writer_run_closeout"]["database_connection_opened"] is False ) assert ( readiness["candidate_queue_writer_run_closeout"]["database_write_executed"] is False ) assert ( readiness["candidate_queue_writer_run_closeout"]["database_commit_executed"] is False ) assert readiness["candidate_queue_writer_run_closeout"]["scheduler_attached"] is False assert ( readiness["candidate_queue_review_handoff"]["mode"] == "candidate_queue_review_handoff_preview" ) assert readiness["candidate_queue_review_handoff"]["handoff_ready"] is False assert ( readiness["candidate_queue_review_handoff"]["ready_for_api_database_write"] is False ) assert ( readiness["candidate_queue_review_handoff"]["ready_for_scheduler_attach"] is False ) assert readiness["candidate_queue_review_handoff"]["api_executes_cli"] is False assert ( readiness["candidate_queue_review_handoff"]["api_reads_approval_token"] is False ) assert ( readiness["candidate_queue_review_handoff"]["api_writes_database"] is False ) assert ( readiness["candidate_queue_review_handoff"]["api_updates_review_state"] is False ) assert ( readiness["candidate_queue_review_handoff"]["database_connection_opened"] is False ) assert ( readiness["candidate_queue_review_handoff"]["database_write_executed"] is False ) assert ( readiness["candidate_queue_review_handoff"]["database_commit_executed"] is False ) assert readiness["candidate_queue_review_handoff"]["scheduler_attached"] is False assert ( readiness["candidate_queue_review_inventory"]["mode"] == "candidate_queue_review_inventory_preview" ) assert ( readiness["candidate_queue_review_inventory"]["review_inventory_ready"] is False ) assert ( readiness["candidate_queue_review_inventory"][ "ready_for_api_review_state_update" ] is False ) assert ( readiness["candidate_queue_review_inventory"][ "ready_for_api_database_write" ] is False ) assert ( readiness["candidate_queue_review_inventory"]["api_updates_review_state"] is False ) assert ( readiness["candidate_queue_review_inventory"]["read_only_query_executed"] is False ) assert ( readiness["candidate_queue_review_inventory"]["database_connection_opened"] is False ) assert ( readiness["candidate_queue_review_inventory"]["database_write_executed"] is False ) assert ( readiness["candidate_queue_review_inventory"]["database_commit_executed"] is False ) assert readiness["candidate_queue_review_inventory"]["scheduler_attached"] is False assert ( readiness["candidate_queue_review_decision"]["mode"] == "candidate_queue_review_decision_preview" ) assert readiness["candidate_queue_review_decision"]["decision_ready"] is False assert ( readiness["candidate_queue_review_decision"][ "ready_for_api_review_state_update" ] is False ) assert ( readiness["candidate_queue_review_decision"]["api_updates_review_state"] is False ) assert ( readiness["candidate_queue_review_decision"]["decision_record_written"] is False ) assert ( readiness["candidate_queue_review_decision"][ "review_state_update_executed" ] is False ) assert ( readiness["candidate_queue_review_decision"]["database_write_executed"] is False ) assert ( readiness["candidate_queue_review_decision"]["database_commit_executed"] is False ) assert readiness["candidate_queue_review_decision"]["scheduler_attached"] is False assert ( readiness["candidate_queue_review_decision_approval"]["mode"] == "candidate_queue_review_decision_approval_preview" ) assert ( readiness["candidate_queue_review_decision_approval"]["approval_ready"] is False ) assert ( readiness["candidate_queue_review_decision_approval"][ "ready_for_api_review_state_update" ] is False ) assert ( readiness["candidate_queue_review_decision_approval"][ "ready_for_api_database_write" ] is False ) assert ( readiness["candidate_queue_review_decision_approval"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_decision_approval"][ "approval_record_written" ] is False ) assert ( readiness["candidate_queue_review_decision_approval"][ "decision_record_written" ] is False ) assert ( readiness["candidate_queue_review_decision_approval"][ "review_state_update_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_approval"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_approval"][ "database_commit_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_approval"]["scheduler_attached"] is False ) assert ( readiness["candidate_queue_review_decision_transaction"]["mode"] == "candidate_queue_review_decision_transaction_preview" ) assert ( readiness["candidate_queue_review_decision_transaction"][ "transaction_preview_created" ] is False ) assert ( readiness["candidate_queue_review_decision_transaction"][ "transaction_ready" ] is False ) assert ( readiness["candidate_queue_review_decision_transaction"][ "ready_for_api_review_state_update" ] is False ) assert ( readiness["candidate_queue_review_decision_transaction"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_decision_transaction"][ "approval_record_written" ] is False ) assert ( readiness["candidate_queue_review_decision_transaction"][ "decision_record_written" ] is False ) assert ( readiness["candidate_queue_review_decision_transaction"][ "review_state_update_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_transaction"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_review_decision_transaction"][ "transaction_opened" ] is False ) assert ( readiness["candidate_queue_review_decision_transaction"][ "transaction_committed" ] is False ) assert ( readiness["candidate_queue_review_decision_transaction"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_transaction"][ "database_commit_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_transaction"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_preflight"]["mode"] == "candidate_queue_review_decision_writer_preflight_preview" ) assert ( readiness["candidate_queue_review_decision_writer_preflight"][ "preflight_payload_ready" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_preflight"][ "ready_for_api_review_state_update" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_preflight"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_preflight"][ "read_only_query_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_preflight"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_preflight"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_preflight"][ "database_commit_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_preflight"][ "review_state_update_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_preflight"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_postwrite_smoke"]["mode"] == "candidate_queue_review_decision_writer_postwrite_smoke_planned" ) assert ( readiness["candidate_queue_review_decision_writer_postwrite_smoke"][ "read_only_query_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_postwrite_smoke"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_postwrite_smoke"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_postwrite_smoke"][ "database_commit_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_postwrite_smoke"][ "review_state_update_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_postwrite_smoke"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_postwrite_smoke"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_operator_drill"]["mode"] == "candidate_queue_review_decision_writer_operator_drill_preview" ) assert ( readiness["candidate_queue_review_decision_writer_operator_drill"][ "api_executes_cli" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_operator_drill"][ "api_reads_approval_token" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_operator_drill"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_operator_drill"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_operator_drill"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_operator_drill"][ "database_commit_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_operator_drill"][ "review_state_update_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_operator_drill"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_package"]["mode"] == "candidate_queue_review_decision_writer_run_package_preview" ) assert ( readiness["candidate_queue_review_decision_writer_run_package"][ "package_artifact_created" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_package"][ "api_writes_file" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_package"][ "api_executes_cli" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_package"][ "api_reads_approval_token" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_package"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_package"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_package"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_readiness"]["mode"] == "candidate_queue_review_decision_writer_run_readiness_preview" ) assert ( readiness["candidate_queue_review_decision_writer_run_readiness"][ "ready_for_api_review_state_update" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_readiness"][ "ready_for_api_database_write" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_readiness"][ "api_executes_cli" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_readiness"][ "api_reads_approval_token" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_readiness"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_readiness"][ "review_state_update_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_readiness"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_readiness"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_receipt"]["mode"] == "candidate_queue_review_decision_writer_run_receipt_preview" ) assert ( readiness["candidate_queue_review_decision_writer_run_receipt"][ "ready_for_api_review_state_update" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_receipt"][ "ready_for_api_database_write" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_receipt"][ "api_executes_cli" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_receipt"][ "api_reads_approval_token" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_receipt"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_receipt"][ "review_state_update_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_receipt"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_receipt"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_closeout"]["mode"] == "candidate_queue_review_decision_writer_run_closeout_preview" ) assert ( readiness["candidate_queue_review_decision_writer_run_closeout"][ "closeout_passed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_closeout"][ "ready_for_api_review_state_update" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_closeout"][ "ready_for_api_database_write" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_closeout"][ "api_executes_cli" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_closeout"][ "api_reads_approval_token" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_closeout"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_closeout"][ "review_state_update_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_closeout"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_run_closeout"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_decision_post_closeout_inventory"][ "mode" ] == "candidate_queue_review_decision_post_closeout_inventory_preview" ) assert ( readiness["candidate_queue_review_decision_post_closeout_inventory"][ "post_closeout_inventory_ready" ] is False ) assert ( readiness["candidate_queue_review_decision_post_closeout_inventory"][ "ready_for_api_review_state_update" ] is False ) assert ( readiness["candidate_queue_review_decision_post_closeout_inventory"][ "ready_for_api_database_write" ] is False ) assert ( readiness["candidate_queue_review_decision_post_closeout_inventory"][ "api_executes_cli" ] is False ) assert ( readiness["candidate_queue_review_decision_post_closeout_inventory"][ "api_reads_approval_token" ] is False ) assert ( readiness["candidate_queue_review_decision_post_closeout_inventory"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_decision_post_closeout_inventory"][ "review_state_update_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_post_closeout_inventory"][ "read_only_query_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_post_closeout_inventory"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_post_closeout_inventory"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_completion_archive"]["mode"] == "candidate_queue_review_completion_archive_preview" ) assert ( readiness["candidate_queue_review_completion_archive"][ "review_completion_archive_ready" ] is False ) assert ( readiness["candidate_queue_review_completion_archive"][ "archive_manifest_ready" ] is False ) assert ( readiness["candidate_queue_review_completion_archive"][ "ready_for_api_review_state_update" ] is False ) assert ( readiness["candidate_queue_review_completion_archive"][ "ready_for_api_database_write" ] is False ) assert ( readiness["candidate_queue_review_completion_archive"]["api_executes_cli"] is False ) assert ( readiness["candidate_queue_review_completion_archive"][ "api_reads_approval_token" ] is False ) assert ( readiness["candidate_queue_review_completion_archive"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_completion_archive"][ "archive_file_written" ] is False ) assert ( readiness["candidate_queue_review_completion_archive"][ "archive_record_written" ] is False ) assert ( readiness["candidate_queue_review_completion_archive"][ "review_state_update_executed" ] is False ) assert ( readiness["candidate_queue_review_completion_archive"][ "read_only_query_executed" ] is False ) assert ( readiness["candidate_queue_review_completion_archive"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_completion_archive"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_archive_summary"]["mode"] == "candidate_queue_review_archive_summary_preview" ) assert ( readiness["candidate_queue_review_archive_summary"][ "archive_summary_ready" ] is False ) assert ( readiness["candidate_queue_review_archive_summary"][ "summary_input_ready" ] is False ) assert ( readiness["candidate_queue_review_archive_summary"][ "ready_for_ai_summary_generation" ] is False ) assert ( readiness["candidate_queue_review_archive_summary"]["ready_for_llm_call"] is False ) assert ( readiness["candidate_queue_review_archive_summary"][ "ready_for_telegram_dispatch" ] is False ) assert ( readiness["candidate_queue_review_archive_summary"][ "api_reads_approval_token" ] is False ) assert ( readiness["candidate_queue_review_archive_summary"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_archive_summary"][ "summary_file_written" ] is False ) assert ( readiness["candidate_queue_review_archive_summary"][ "ai_summary_generated" ] is False ) assert ( readiness["candidate_queue_review_archive_summary"]["llm_call_executed"] is False ) assert ( readiness["candidate_queue_review_archive_summary"][ "telegram_dispatched" ] is False ) assert ( readiness["candidate_queue_review_archive_summary"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_archive_summary"]["scheduler_attached"] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"]["mode"] == "candidate_queue_review_ai_summary_preflight_preview" ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "ai_summary_preflight_ready" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "ready_for_manual_ollama_summary_run" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "ready_for_ai_summary_generation" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "ready_for_llm_call" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "ready_for_telegram_dispatch" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "api_reads_approval_token" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "api_writes_file" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "summary_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "summary_record_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "ai_summary_generated" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "llm_call_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "ollama_call_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "gemini_call_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "telegram_dispatched" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_preflight"][ "model_route_policy" ]["primary_policy"] == "ollama_first" ) assert ( readiness["candidate_queue_review_ai_summary_run_package"]["mode"] == "candidate_queue_review_ai_summary_run_package_preview" ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "ai_summary_run_package_ready" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "ready_for_manual_ollama_summary_run" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "ready_for_ai_summary_generation" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "ready_for_llm_call" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "ready_for_telegram_dispatch" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "api_executes_llm" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "run_package_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "summary_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "ai_summary_generated" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "llm_call_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "ollama_call_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "gemini_call_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "telegram_dispatched" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_run_package"][ "summary_output_schema" ]["schema_version"] == "market_intel_ai_summary_v1" ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"]["mode"] == "candidate_queue_review_ai_summary_output_receipt_preview" ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "ai_summary_output_receipt_ready" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "ready_for_summary_persistence_review" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "manual_ai_summary_output_provided" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "summary_output_schema_valid" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "summary_output_evidence_refs_grounded" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "summary_output_model_route_accepted" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "api_executes_llm" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "summary_receipt_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "summary_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "ai_summary_generated" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "llm_call_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "telegram_dispatched" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_output_receipt"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_preflight"]["mode"] == "candidate_queue_review_ai_summary_persistence_preflight_preview" ) assert ( readiness["candidate_queue_review_ai_summary_persistence_preflight"][ "summary_persistence_preflight_ready" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_preflight"][ "ready_for_summary_transaction_preview" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_preflight"][ "ready_for_summary_persistence_cli_run" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_preflight"][ "api_executes_llm" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_preflight"][ "summary_persistence_preflight_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_preflight"][ "summary_persistence_record_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_preflight"][ "metadata_patch_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_preflight"][ "telegram_dispatched" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_preflight"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_preflight"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_transaction"][ "mode" ] == "candidate_queue_review_ai_summary_persistence_transaction_preview" ) assert ( readiness["candidate_queue_review_ai_summary_persistence_transaction"][ "summary_persistence_transaction_ready" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_transaction"][ "ready_for_summary_persistence_writer_gate" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_transaction"][ "ready_for_summary_persistence_cli_run" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_transaction"][ "statement_count" ] == 0 ) assert ( readiness["candidate_queue_review_ai_summary_persistence_transaction"][ "api_executes_llm" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_transaction"][ "summary_persistence_transaction_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_transaction"][ "metadata_patch_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_transaction"][ "telegram_dispatched" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_transaction"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_transaction"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_transaction"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "mode" ] == "candidate_queue_review_ai_summary_persistence_writer_preflight_preview" ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "summary_persistence_writer_preflight_ready" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "ready_for_summary_persistence_run_package" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "ready_for_summary_persistence_cli_run" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "statement_count" ] == 0 ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "api_executes_llm" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "summary_persistence_writer_preflight_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "writer_preflight_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "metadata_patch_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "telegram_dispatched" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_writer_preflight"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "mode" ] == "candidate_queue_review_ai_summary_persistence_run_package_preview" ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "package_ready" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "ready_for_summary_persistence_run_readiness" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "ready_for_summary_persistence_cli_run" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "statement_count" ] == 0 ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "payload_manifest" ]["payload_count"] == 0 ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "api_executes_llm" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "package_artifact_created" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "summary_persistence_run_package_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "telegram_dispatched" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_package"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_readiness"][ "mode" ] == "candidate_queue_review_ai_summary_persistence_run_readiness_preview" ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_readiness"][ "run_readiness_ready" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_readiness"][ "ready_for_summary_persistence_cli_run" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_readiness"][ "statement_count" ] == 0 ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_readiness"][ "run_package_summary" ]["payload_count"] == 0 ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_readiness"][ "summary_persistence_run_readiness_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_readiness"][ "run_readiness_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_readiness"][ "api_executes_llm" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_readiness"][ "telegram_dispatched" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_readiness"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_readiness"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_readiness"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_receipt"][ "mode" ] == "candidate_queue_review_ai_summary_persistence_run_receipt_preview" ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_receipt"][ "run_receipt_passed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_receipt"][ "ready_for_summary_persistence_closeout" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_receipt"][ "statement_count" ] == 0 ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_receipt"][ "expected_dedupe_keys" ] == [] ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_receipt"][ "summary_persistence_run_receipt_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_receipt"][ "run_receipt_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_receipt"][ "api_executes_llm" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_receipt"][ "telegram_dispatched" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_receipt"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_receipt"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_receipt"][ "scheduler_attached" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_closeout"][ "mode" ] == "candidate_queue_review_ai_summary_persistence_run_closeout_preview" ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_closeout"][ "closeout_passed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_closeout"][ "ready_for_summary_persistence_telegram_dispatch_gate" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_closeout"][ "statement_count" ] == 0 ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_closeout"][ "summary_persistence_closeout_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_closeout"][ "closeout_file_written" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_closeout"][ "api_executes_llm" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_closeout"][ "telegram_dispatched" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_closeout"][ "database_connection_opened" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_closeout"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_ai_summary_persistence_run_closeout"][ "scheduler_attached" ] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" ]["telegram_dispatch_gate_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" ]["ready_for_summary_persistence_telegram_dispatch_run_package"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" ]["telegram_dispatch_gate_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" ]["telegram_dispatch_run_package_ready"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" ]["ready_for_summary_persistence_telegram_dispatch_run_readiness"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" ]["telegram_dispatch_run_package_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_package" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" ]["telegram_dispatch_run_readiness_ready"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" ]["ready_for_manual_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" ]["telegram_dispatch_run_readiness_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_readiness" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" ]["telegram_dispatch_run_receipt_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" ]["ready_for_summary_persistence_telegram_dispatch_closeout"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" ]["telegram_dispatch_run_receipt_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_run_receipt" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout" ]["telegram_dispatch_closeout_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout" ]["telegram_dispatch_closeout_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_closeout" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" ]["telegram_dispatch_archive_ready"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" ]["telegram_dispatch_archive_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" ]["archive_manifest_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" ]["telegram_dispatch_archive_summary_ready"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" ]["telegram_dispatch_archive_summary_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" ]["archive_summary_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_archive_summary" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ]["telegram_dispatch_report_input_ready"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ]["ready_for_report_generation"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ]["telegram_dispatch_report_input_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ]["report_input_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ]["report_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_input" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" ]["telegram_dispatch_report_run_package_ready"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" ]["ready_for_report_generation"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" ]["telegram_dispatch_report_run_package_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" ]["report_run_package_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" ]["report_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_package" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ]["telegram_dispatch_report_run_readiness_ready"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ]["ready_for_manual_report_generation"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ]["ready_for_report_generation"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ]["telegram_dispatch_report_run_readiness_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ]["report_run_readiness_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ]["report_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_readiness" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" ]["telegram_dispatch_report_run_receipt_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" ]["ready_for_report_generation"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" ]["telegram_dispatch_report_run_receipt_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" ]["report_run_receipt_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" ]["report_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_run_receipt" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ]["telegram_dispatch_report_closeout_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ]["ready_for_market_intel_report_archive"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ]["ready_for_report_generation"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ]["telegram_dispatch_report_closeout_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ]["report_closeout_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ]["report_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_closeout" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["telegram_dispatch_report_archive_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["ready_for_market_intel_report_archive_summary"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["ready_for_report_generation"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["ready_for_telegram_dispatch"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["api_dispatches_telegram"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["telegram_dispatch_report_archive_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["report_archive_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["archive_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["report_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["telegram_dispatched"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary" ]["telegram_dispatch_report_archive_summary_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary" ]["ready_for_market_intel_report_catalog_handoff"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary" ]["report_archive_summary_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff" ]["telegram_dispatch_report_catalog_handoff_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff" ]["ready_for_market_intel_report_catalog_index"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff" ]["report_catalog_handoff_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff" ]["catalog_record_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index" ]["telegram_dispatch_report_catalog_index_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index" ]["ready_for_market_intel_report_catalog_write_preflight"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index" ]["report_catalog_index_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index" ]["catalog_record_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight" ]["telegram_dispatch_report_catalog_write_preflight_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight" ]["ready_for_market_intel_report_catalog_record_write"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight" ]["report_catalog_write_preflight_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight" ]["catalog_record_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write" ]["telegram_dispatch_report_catalog_record_write_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write" ]["ready_for_market_intel_report_catalog_record_cli_run"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write" ]["catalog_record_write_gate_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write" ]["catalog_record_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package" ]["telegram_dispatch_report_catalog_record_run_package_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package" ]["ready_for_market_intel_report_catalog_record_run_readiness"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package" ]["catalog_record_run_package_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package" ]["catalog_record_cli_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness" ]["telegram_dispatch_report_catalog_record_run_readiness_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness" ]["ready_for_cli_operator_run"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness" ]["catalog_record_run_readiness_gate_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness" ]["catalog_record_run_readiness_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness" ]["catalog_record_cli_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt" ]["telegram_dispatch_report_catalog_record_run_receipt_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt" ]["ready_for_market_intel_report_catalog_record_commit"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt" ]["catalog_record_run_receipt_gate_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt" ]["catalog_record_run_receipt_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt" ]["catalog_record_commit_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit" ]["telegram_dispatch_report_catalog_record_commit_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit" ]["ready_for_market_intel_report_catalog_record_closeout"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit" ]["catalog_record_commit_gate_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit" ]["catalog_record_commit_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout" ]["telegram_dispatch_report_catalog_record_closeout_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout" ]["ready_for_market_intel_report_catalog_record_archive"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout" ]["catalog_record_closeout_gate_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout" ]["catalog_record_closeout_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive" ]["telegram_dispatch_report_catalog_record_archive_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive" ]["ready_for_market_intel_report_catalog_record_archive_summary"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive" ]["catalog_record_archive_gate_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive" ]["catalog_record_archive_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary" ]["telegram_dispatch_report_catalog_record_archive_summary_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary" ]["ready_for_market_intel_report_catalog_record_final_closeout"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary" ]["catalog_record_archive_summary_gate_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary" ]["catalog_record_archive_summary_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary" ]["scheduler_attached"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout" ]["mode"] == "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout_preview" ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout" ]["telegram_dispatch_report_catalog_record_final_closeout_passed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout" ]["market_intel_report_catalog_record_pipeline_complete"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout" ]["catalog_record_final_closeout_gate_file_written"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout" ]["catalog_record_final_closeout_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout" ]["database_write_executed"] is False ) assert ( readiness[ "candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout" ]["scheduler_attached"] is False ) assert ( readiness["candidate_queue_review_decision_writer_status"]["mode"] == "candidate_queue_review_decision_writer_cli_blocked" ) assert ( readiness["candidate_queue_review_decision_writer_status"][ "ready_for_real_write" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_status"][ "writer_implementation_enabled" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_status"][ "api_updates_review_state" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_status"][ "review_state_update_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_status"][ "database_write_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_status"][ "database_commit_executed" ] is False ) assert ( readiness["candidate_queue_review_decision_writer_status"][ "scheduler_attached" ] is False ) assert readiness["scheduler_plan"]["scheduler_registration_executed"] is False assert readiness["scheduler_plan"]["crawler_job_started"] is False assert readiness["scheduler_plan"]["database_write_executed"] is False assert readiness["match_review_plan"]["review_queue_created"] is False assert readiness["match_review_plan"]["auto_confirm_executed"] is False assert readiness["match_review_plan"]["database_write_executed"] is False assert readiness["opportunity_plan"]["opportunity_queue_created"] is False assert readiness["opportunity_plan"]["threat_alert_dispatched"] is False assert readiness["opportunity_plan"]["database_write_executed"] is False assert readiness["opportunity_scoring_plan"]["scoring_job_created"] is False assert readiness["opportunity_scoring_plan"]["score_calculation_executed"] is False assert readiness["opportunity_scoring_plan"]["database_write_executed"] is False assert readiness["opportunity_evidence_plan"]["evidence_bundle_created"] is False assert readiness["opportunity_evidence_plan"]["evidence_query_executed"] is False assert readiness["opportunity_evidence_plan"]["database_write_executed"] is False assert readiness["opportunity_alert_plan"]["alert_candidate_created"] is False assert readiness["opportunity_alert_plan"]["review_queue_contract_written"] is False assert readiness["opportunity_alert_plan"]["review_queue_table_created"] is False assert readiness["opportunity_alert_plan"]["review_action_executed"] is False assert readiness["opportunity_alert_plan"]["approval_record_written"] is False assert readiness["opportunity_alert_plan"]["telegram_dispatched"] is False assert readiness["opportunity_alert_plan"]["llm_call_executed"] is False assert readiness["opportunity_alert_plan"]["database_write_executed"] is False def test_market_intel_service_keeps_readiness_modularized(): service_path = Path("services/market_intel/service.py") readiness_path = Path("services/market_intel/deployment_readiness.py") assert service_path.exists() assert readiness_path.exists() assert len(service_path.read_text().splitlines()) < 800 assert "build_deployment_readiness_preview" in readiness_path.read_text() def test_write_approval_runbook_is_read_only_and_blocks_real_write(): runbook = MarketIntelService().build_write_approval_runbook() gate_keys = {gate["key"] for gate in runbook["approval_gates"]} assert runbook["mode"] == "approval_runbook_read_only" assert runbook["ready_for_real_write"] is False assert runbook["writes_executed"] is False assert runbook["would_write_database"] is False assert runbook["database_session_created"] is False assert runbook["database_commit_executed"] is False assert runbook["external_network_executed"] is False assert runbook["scheduler_attached"] is False assert runbook["approval_required"] is True assert runbook["approval_token_present"] is False assert runbook["seed_count"] == 4 assert runbook["writer_operation_count"] == 4 assert runbook["schema_smoke"]["passed"] is True assert "schema_smoke_passed" in gate_keys assert "backup_completed" in gate_keys assert "migration_file_reviewed" in gate_keys assert "manual_operator_approval" in gate_keys assert "database_write_allowed" in runbook["blocked_reasons"] assert "manual_operator_approval" in runbook["blocked_reasons"] assert "no_momo_db_container_lifecycle_change" in runbook["hard_safety_boundaries"] assert "no_remove_orphans" in runbook["hard_safety_boundaries"] def test_migration_blueprint_is_additive_preview_only(): blueprint = MarketIntelService().build_migration_blueprint() forward_sql_lower = blueprint["forward_sql"].lower() migration_file = Path(blueprint["suggested_filename"]) assert blueprint["mode"] == "migration_file_draft_read_only" assert blueprint["suggested_filename"] == "migrations/032_market_intel_core_schema.sql" assert blueprint["file_created"] is True assert blueprint["file_matches_blueprint"] is True assert blueprint["file_status"] == "local_draft_matches_blueprint" assert blueprint["migration_executed"] is False assert blueprint["database_session_created"] is False assert blueprint["database_commit_executed"] is False assert blueprint["external_network_executed"] is False assert blueprint["scheduler_attached"] is False assert blueprint["table_count"] == 8 assert blueprint["forward_has_destructive_sql"] is False assert blueprint["safety_checks"]["forward_sql_additive_only"] is True assert blueprint["safety_checks"]["writes_seed_rows_only_with_cli_apply_flag"] is True assert "migration_not_executed" in blueprint["blocked_reasons"] assert "migration_file_not_created" not in blueprint["blocked_reasons"] assert "seed_writer_real_write_requires_cli_apply_flag" in blueprint["blocked_reasons"] assert migration_file.exists() assert migration_file.read_text(encoding="utf-8").strip() == blueprint["forward_sql"] assert "CREATE TABLE IF NOT EXISTS market_platforms".lower() in forward_sql_lower assert "CREATE TABLE IF NOT EXISTS market_crawler_runs".lower() in forward_sql_lower assert "CREATE TABLE IF NOT EXISTS market_alert_review_queue".lower() in forward_sql_lower assert "ux_market_alert_review_queue_dedupe".lower() in forward_sql_lower assert "drop table" not in forward_sql_lower assert "truncate " not in forward_sql_lower assert "delete from" not in forward_sql_lower assert "MARKET_INTEL_CRAWLER_ENABLED=false" in blueprint["command_plan"]["seed_writer_command"]["command"] assert blueprint["command_plan"]["seed_writer_command"]["script_created"] is True assert blueprint["command_plan"]["seed_writer_command"]["script_path"] == "scripts/market_intel_seed_writer.py" assert blueprint["rollback_requires_manual_approval"] is True assert "DROP TABLE IF EXISTS market_alert_review_queue" in blueprint["rollback_sql"] def test_migration_apply_drill_planned_is_safe_and_manual_only(): drill = MarketIntelService().build_migration_apply_drill() assert drill["mode"] == "migration_apply_drill_preview" assert drill["phase"] == "phase_140_market_intel_professional_source_governance" assert drill["execute_requested"] is False assert drill["schema_state"] == "planned_no_db_probe" assert drill["drill_ready_for_operator_review"] is True assert drill["ready_for_manual_apply_review"] is False assert drill["ready_to_apply_migration"] is False assert drill["read_only_query_executed"] is False assert drill["database_connection_opened"] is False assert drill["database_session_created"] is False assert drill["database_write_executed"] is False assert drill["database_commit_executed"] is False assert drill["migration_executed"] is False assert drill["rollback_executed"] is False assert drill["api_executes_migration"] is False assert drill["api_executes_rollback"] is False assert drill["checks"]["migration_file_matches_blueprint"] is True assert drill["checks"]["forward_sql_additive_only"] is True assert "read_only_db_probe_not_executed" in drill["blocked_reasons"] assert "api_never_runs_migration" in drill["blocked_reasons"] assert drill["rollback_drill"]["rollback_executed"] is False assert drill["rollback_drill"]["requires_manual_approval"] is True assert "market_alert_review_queue" in drill["rollback_drill"]["rollback_table_order"] assert len(drill["pre_apply_checklist"]) >= 6 assert len(drill["post_apply_verification"]) >= 4 assert len(drill["risk_register"]) >= 4 def test_migration_apply_drill_sqlite_read_only_reports_already_applied(): service = MarketIntelService() seed_rows = service.build_platform_seed_plan()["seeds"] engine = create_engine("sqlite:///:memory:") with engine.begin() as conn: conn.execute( text( """ CREATE TABLE market_platforms ( code TEXT PRIMARY KEY, name TEXT, base_url TEXT, enabled BOOLEAN, crawl_policy_json TEXT ) """ ) ) for table_name in MARKET_INTEL_TABLES: if table_name == "market_platforms": continue conn.execute(text(f"CREATE TABLE {table_name} (id INTEGER PRIMARY KEY)")) for seed in seed_rows: conn.execute( text( """ INSERT INTO market_platforms (code, name, base_url, enabled, crawl_policy_json) VALUES (:code, :name, :base_url, :enabled, :crawl_policy_json) """ ), { "code": seed["code"], "name": seed["name"], "base_url": seed["base_url"], "enabled": seed["enabled"], "crawl_policy_json": json.dumps( seed["crawl_policy_json"], ensure_ascii=False, sort_keys=True, ), }, ) drill = service.build_migration_apply_drill( execute_requested=True, schema_engine=engine, seed_diff_engine=engine, database_type="sqlite", ) assert drill["mode"] == "migration_apply_drill_preview" assert drill["execute_requested"] is True assert drill["read_only_query_executed"] is True assert drill["database_connection_opened"] is True assert drill["schema_state"] == "already_applied" assert drill["schema_db_probe_summary"]["schema_tables_exist"] is True assert drill["schema_db_probe_summary"]["missing_tables"] == [] assert drill["platform_seed_db_diff_summary"]["seed_rows_ready"] is True assert set(drill["platform_seed_db_diff_summary"]["matching_codes"]) == { "momo", "pchome", "coupang", "shopee", } assert drill["database_session_created"] is False assert drill["database_write_executed"] is False assert drill["database_commit_executed"] is False assert drill["migration_executed"] is False assert "market_schema_already_present_apply_not_required" in drill["blocked_reasons"] def test_migration_apply_drill_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/migration_apply_drill?execute=false") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "migration_apply_drill_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is False assert data["migration_executed"] is False assert data["rollback_executed"] is False assert data["database_write_executed"] is False assert data["api_executes_migration"] is False def test_migration_catalog_review_planned_is_safe_and_diagnostic(): review = MarketIntelService().build_migration_catalog_review() assert review["mode"] == "migration_catalog_review_preview" assert review["phase"] == "phase_140_market_intel_professional_source_governance" assert review["execute_requested"] is False assert review["catalog_state"] == "planned_no_probe" assert review["seed_state"] == "planned_no_probe" assert review["risk_level"] == "info" assert review["apply_path"] == "run_execute_true_read_only_probe_first" assert review["review_ready"] is True assert review["ready_for_manual_migration_review"] is False assert review["ready_to_apply_migration"] is False assert review["read_only_query_executed"] is False assert review["database_connection_opened"] is False assert review["database_session_created"] is False assert review["database_write_executed"] is False assert review["database_commit_executed"] is False assert review["migration_executed"] is False assert review["rollback_executed"] is False assert review["api_executes_migration"] is False assert review["table_catalog"]["expected_count"] == 8 assert review["table_catalog"]["existing_count"] == 0 assert review["table_catalog"]["missing_count"] == 8 assert "execute_false_planned_only" in review["blocked_reasons"] assert "migration_not_executed_by_catalog_review" in review["blocked_reasons"] assert {item["key"] for item in review["findings"]} >= { "catalog_probe_not_executed", "seed_diff_not_executed", } def test_migration_catalog_review_sqlite_read_only_detects_partial_schema(): service = MarketIntelService() seed_rows = service.build_platform_seed_plan()["seeds"] engine = create_engine("sqlite:///:memory:") with engine.begin() as conn: conn.execute( text( """ CREATE TABLE market_platforms ( code TEXT PRIMARY KEY, name TEXT, base_url TEXT, enabled BOOLEAN, crawl_policy_json TEXT ) """ ) ) for seed in seed_rows: conn.execute( text( """ INSERT INTO market_platforms (code, name, base_url, enabled, crawl_policy_json) VALUES (:code, :name, :base_url, :enabled, :crawl_policy_json) """ ), { "code": seed["code"], "name": seed["name"], "base_url": seed["base_url"], "enabled": seed["enabled"], "crawl_policy_json": json.dumps( seed["crawl_policy_json"], ensure_ascii=False, sort_keys=True, ), }, ) review = service.build_migration_catalog_review( execute_requested=True, schema_engine=engine, seed_diff_engine=engine, database_type="sqlite", ) assert review["mode"] == "migration_catalog_review_preview" assert review["execute_requested"] is True assert review["read_only_query_executed"] is True assert review["database_connection_opened"] is True assert review["catalog_state"] == "partial_schema" assert review["seed_state"] == "ready" assert review["risk_level"] == "high" assert review["apply_path"] == "blocked_until_partial_schema_reviewed" assert review["ready_for_manual_migration_review"] is False assert review["table_catalog"]["expected_count"] == 8 assert review["table_catalog"]["existing_count"] == 1 assert review["table_catalog"]["missing_count"] == 7 assert review["seed_catalog"]["seed_rows_ready"] is True assert "partial_schema_requires_manual_reconciliation" in review["blocked_reasons"] assert review["database_session_created"] is False assert review["database_write_executed"] is False assert review["database_commit_executed"] is False assert review["migration_executed"] is False assert {item["key"] for item in review["findings"]} >= { "partial_market_schema_detected", "platform_seed_ready", } def test_migration_catalog_review_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/migration_catalog_review?execute=false") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "migration_catalog_review_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is False assert data["catalog_state"] == "planned_no_probe" assert data["migration_executed"] is False assert data["rollback_executed"] is False assert data["database_write_executed"] is False assert data["api_executes_migration"] is False def test_migration_live_smoke_planned_is_preview_only(): smoke = MarketIntelService().build_migration_live_smoke() assert smoke["mode"] == "migration_live_smoke_preview" assert smoke["phase"] == "phase_140_market_intel_professional_source_governance" assert smoke["execute_requested"] is False assert smoke["smoke_result"] == "planned_no_execution" assert smoke["live_smoke_passed"] is False assert smoke["catalog_state"] == "planned_no_probe" assert smoke["seed_state"] == "planned_no_probe" assert smoke["read_only_probe_completed"] is False assert smoke["database_connection_opened"] is False assert smoke["database_session_created"] is False assert smoke["database_write_executed"] is False assert smoke["database_commit_executed"] is False assert smoke["migration_executed"] is False assert smoke["rollback_executed"] is False assert smoke["api_executes_migration"] is False assert "execute_false_planned_only" in smoke["blocked_reasons"] assert "migration_not_executed_by_live_smoke" in smoke["blocked_reasons"] def test_migration_live_smoke_sqlite_not_applied_tolerates_seed_table_missing(): service = MarketIntelService() engine = create_engine("sqlite:///:memory:") smoke = service.build_migration_live_smoke( execute_requested=True, schema_engine=engine, seed_diff_engine=engine, database_type="sqlite", ) assert smoke["mode"] == "migration_live_smoke_preview" assert smoke["execute_requested"] is True assert smoke["read_only_query_executed"] is True assert smoke["database_connection_opened"] is True assert smoke["catalog_state"] == "not_applied" assert smoke["seed_state"] == "probe_error" assert smoke["seed_probe_error_tolerated"] is True assert smoke["smoke_result"] == "passed_not_applied_seed_table_missing" assert smoke["live_smoke_passed"] is True assert smoke["read_only_probe_completed"] is True assert smoke["ready_for_manual_migration_review"] is True assert smoke["database_session_created"] is False assert smoke["database_write_executed"] is False assert smoke["database_commit_executed"] is False assert smoke["migration_executed"] is False assert smoke["catalog_review_summary"]["table_catalog"]["missing_count"] == 8 def test_migration_live_smoke_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/migration_live_smoke?execute=false") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "migration_live_smoke_preview" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is False assert data["smoke_result"] == "planned_no_execution" assert data["migration_executed"] is False assert data["rollback_executed"] is False assert data["database_write_executed"] is False assert data["api_executes_migration"] is False def test_live_db_inventory_planned_is_preview_only(): inventory = MarketIntelService().build_live_db_inventory() assert inventory["mode"] == "live_db_inventory_planned" assert inventory["phase"] == "phase_140_market_intel_professional_source_governance" assert inventory["execute_requested"] is False assert inventory["read_only_query_executed"] is False assert inventory["database_connection_opened"] is False assert inventory["database_session_created"] is False assert inventory["database_write_executed"] is False assert inventory["database_commit_executed"] is False assert inventory["migration_executed"] is False assert inventory["external_network_executed"] is False assert inventory["scheduler_attached"] is False assert inventory["summary_ready"] is False assert inventory["total_rows"] == 0 assert "execute_false_planned_only" in inventory["blocked_reasons"] assert "inventory_not_loaded" in inventory["blocked_reasons"] def test_live_db_inventory_sqlite_read_only_counts_market_tables(): engine = create_engine("sqlite:///:memory:") with engine.begin() as conn: conn.execute(text("CREATE TABLE market_platforms (code TEXT, name TEXT, enabled BOOLEAN)")) conn.execute(text("CREATE TABLE market_campaigns (platform_code TEXT, status TEXT)")) conn.execute(text("CREATE TABLE market_campaign_snapshots (status TEXT)")) conn.execute( text( "CREATE TABLE market_campaign_products " "(platform_code TEXT, is_active BOOLEAN, last_seen_at TEXT, discount_rate FLOAT)" ) ) conn.execute( text( "CREATE TABLE market_product_price_history " "(platform_code TEXT, crawled_at TEXT, price FLOAT)" ) ) conn.execute( text( "CREATE TABLE market_product_matches " "(match_status TEXT, match_score FLOAT, reviewed_at TEXT)" ) ) conn.execute( text( "CREATE TABLE market_crawler_runs " "(platform_code TEXT, status TEXT, dry_run BOOLEAN, started_at TEXT, finished_at TEXT, error_count INTEGER)" ) ) conn.execute( text( "CREATE TABLE market_alert_review_queue " "(review_state TEXT, priority_lane TEXT, total_score FLOAT, updated_at TEXT)" ) ) conn.execute( text( "INSERT INTO market_platforms (code, name, enabled) " "VALUES ('momo', 'MOMO', 0), ('pchome', 'PChome', 0)" ) ) conn.execute( text( "INSERT INTO market_campaigns (platform_code, status) " "VALUES ('momo', 'active'), ('pchome', 'unknown')" ) ) conn.execute(text("INSERT INTO market_campaign_snapshots (status) VALUES ('success')")) conn.execute( text( "INSERT INTO market_campaign_products " "(platform_code, is_active, last_seen_at, discount_rate) " "VALUES ('momo', 1, '2026-05-18 09:00:00', 0.2), " "('pchome', 0, '2026-05-18 08:00:00', 0.1)" ) ) conn.execute( text( "INSERT INTO market_product_price_history (platform_code, crawled_at, price) " "VALUES ('momo', '2026-05-18 09:00:00', 199)" ) ) conn.execute( text( "INSERT INTO market_product_matches (match_status, match_score, reviewed_at) " "VALUES ('needs_review', 0.72, NULL), ('confirmed', 0.91, '2026-05-18 10:00:00')" ) ) conn.execute( text( "INSERT INTO market_crawler_runs " "(platform_code, status, dry_run, started_at, finished_at, error_count) " "VALUES ('momo', 'success', 1, '2026-05-18 09:00:00', '2026-05-18 09:01:00', 0)" ) ) conn.execute( text( "INSERT INTO market_alert_review_queue " "(review_state, priority_lane, total_score, updated_at) " "VALUES ('draft', 'watch', 0.61, '2026-05-18 11:00:00')" ) ) inventory = build_live_db_inventory_preview( MARKET_INTEL_TABLES, execute_requested=True, engine=engine, database_type="sqlite", ) assert inventory["mode"] == "live_db_inventory_read_only" assert inventory["execute_requested"] is True assert inventory["read_only_query_executed"] is True assert inventory["database_connection_opened"] is True assert inventory["database_session_created"] is False assert inventory["database_write_executed"] is False assert inventory["database_commit_executed"] is False assert inventory["migration_executed"] is False assert inventory["external_network_executed"] is False assert inventory["scheduler_attached"] is False assert inventory["missing_tables"] == [] assert inventory["summary_ready"] is True assert inventory["table_counts"]["market_platforms"] == 2 assert inventory["table_counts"]["market_campaign_products"] == 2 assert inventory["total_rows"] == 12 assert {item["code"] for item in inventory["platform_breakdown"]} == {"momo", "pchome"} assert {item["status"] for item in inventory["campaign_status_breakdown"]} == {"active", "unknown"} assert {item["match_status"] for item in inventory["match_status_breakdown"]} == {"confirmed", "needs_review"} assert inventory["alert_review_state_breakdown"][0]["review_state"] == "draft" assert inventory["crawler_run_summary"][0]["status"] == "success" def test_live_db_inventory_route_is_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/live_db_inventory?execute=false") data = response.get_json() assert response.status_code == 200 assert data["mode"] == "live_db_inventory_planned" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is False assert data["read_only_query_executed"] is False assert data["database_write_executed"] is False assert data["migration_executed"] is False def test_seed_writer_cli_status_blocks_real_write(): status = MarketIntelService().build_seed_writer_cli_status( platform_code="all", execute_requested=True, approval_token=TEST_APPROVAL_TOKEN, approval_token_secret=TEST_APPROVAL_TOKEN, ) assert status["mode"] == "seed_writer_cli_blocked" assert status["execute_requested"] is True assert status["apply_real_write_requested"] is False assert status["approval_token_present"] is True assert status["approval_token_valid"] is True assert status["approval_token_secret_configured"] is True assert "approval_token_hint" not in status assert status["api_reads_approval_token"] is False assert status["api_executes_cli"] is False assert status["api_writes_database"] is False assert status["ready_for_real_write"] is False assert status["writes_executed"] is False assert status["would_write_database"] is False assert status["database_session_created"] is False assert status["explicit_transaction_opened"] is False assert status["database_write_executed"] is False assert status["database_commit_executed"] is False assert status["external_network_executed"] is False assert status["scheduler_attached"] is False assert status["exit_code"] == 2 assert "apply_real_write_requested" in status["blocked_reasons"] assert "approval_token_valid" not in status["blocked_reasons"] preview = status["transaction_preview"] assert preview["mode"] == "seed_transaction_preview_no_session" assert preview["statement_count"] == 4 assert preview["database_session_created"] is False assert preview["transaction_opened"] is False assert preview["database_commit_executed"] is False assert preview["database_snapshot_loaded"] is False assert preview["statements"][0]["table"] == "market_platforms" assert preview["statements"][0]["diff_status"] == "not_loaded_no_db_session" assert "ON CONFLICT (code) DO UPDATE SET" in preview["statements"][0]["sql_template"] assert preview["statements"][0]["parameter_payload_hash"] assert status["safety_contract"]["refuses_execute_without_apply_flag"] is True assert status["safety_contract"]["keeps_crawler_disabled_for_seed_write"] is True assert status["safety_contract"]["uses_core_connection_not_orm_session"] is True def test_seed_writer_cli_status_route_never_leaks_approval_token(monkeypatch): from routes.market_intel_routes import market_intel_bp monkeypatch.setenv("MARKET_INTEL_SEED_WRITE_APPROVAL", TEST_APPROVAL_TOKEN) app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True response = client.get("/api/market_intel/seed_writer_cli_status?execute=true&platform=all") data = response.get_json() payload = json.dumps(data, ensure_ascii=False, sort_keys=True) assert response.status_code == 200 assert data["mode"] == "seed_writer_cli_blocked" assert data["execute_requested"] is True assert data["apply_real_write_requested"] is False assert data["approval_token_present"] is False assert data["approval_token_valid"] is False assert data["approval_token_secret_configured"] is True assert data["api_reads_approval_token"] is False assert data["api_executes_cli"] is False assert data["api_writes_database"] is False assert data["ready_for_real_write"] is False assert data["writes_executed"] is False assert data["would_write_database"] is False assert data["database_session_created"] is False assert data["database_commit_executed"] is False assert "approval_token_present" in data["blocked_reasons"] assert "approval_token_valid" in data["blocked_reasons"] assert "apply_real_write_requested" in data["blocked_reasons"] assert "approval_token_hint" not in payload assert TEST_APPROVAL_TOKEN not in payload assert "APPROVED_MARKET_INTEL_SEED_WRITE" not in payload def test_seed_writer_cli_real_write_sqlite_upserts_seed_rows(): engine = create_engine("sqlite:///:memory:") with engine.begin() as conn: conn.execute( text( """ CREATE TABLE market_platforms ( id INTEGER PRIMARY KEY AUTOINCREMENT, code TEXT NOT NULL UNIQUE, name TEXT NOT NULL, base_url TEXT, enabled BOOLEAN NOT NULL DEFAULT 0, crawl_policy_json TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL ) """ ) ) status = MarketIntelService().build_seed_writer_cli_status( platform_code="all", execute_requested=True, apply_real_write=True, approval_token=TEST_APPROVAL_TOKEN, approval_token_secret=TEST_APPROVAL_TOKEN, engine=engine, database_type="sqlite", ) with engine.connect() as conn: rows = conn.execute( text("SELECT code, enabled FROM market_platforms ORDER BY code") ).fetchall() assert status["mode"] == "seed_writer_cli_executed" assert status["api_reads_approval_token"] is False assert status["api_executes_cli"] is False assert status["api_writes_database"] is False assert status["ready_for_real_write"] is True assert status["writes_executed"] is True assert status["would_write_database"] is True assert status["database_connection_opened"] is True assert status["database_session_created"] is False assert status["explicit_transaction_opened"] is True assert status["database_write_executed"] is True assert status["database_commit_executed"] is True assert status["database_rollback_executed"] is False assert status["external_network_executed"] is False assert status["scheduler_attached"] is False assert status["exit_code"] == 0 assert status["blocked_reasons"] == [] assert status["execution_result"]["inserted_codes"] == [ "momo", "pchome", "coupang", "shopee", ] assert status["execution_result"]["updated_codes"] == [] assert [row[0] for row in rows] == ["coupang", "momo", "pchome", "shopee"] assert all(row[1] in (False, 0) for row in rows) def test_seed_writer_cli_script_outputs_blocked_plan(): env = { **os.environ, "MOMO_ALLOW_INSECURE_CONFIG_FOR_TESTS": "true", "SECRET_KEY": "test", "LOGIN_PASSWORD": "test", } result = subprocess.run( [sys.executable, "scripts/market_intel_seed_writer.py", "--platform", "all"], capture_output=True, check=False, env=env, text=True, ) data = json.loads(result.stdout) assert result.returncode == 0 assert data["mode"] == "seed_writer_cli_blocked" assert data["execute_requested"] is False assert data["apply_real_write_requested"] is False assert data["writes_executed"] is False assert data["database_session_created"] is False assert data["database_commit_executed"] is False assert data["exit_code"] == 0 assert data["transaction_preview"]["statement_count"] == 4 assert data["transaction_preview"]["transaction_opened"] is False def test_candidate_queue_writer_cli_script_outputs_blocked_gate(tmp_path): sample_file = tmp_path / "sample.json" sample_file.write_text( json.dumps( { "batch_id": "sample-batch-15", "platform_code": "momo", "source_key": "homepage", "source_url": "https://www.momoshop.com.tw/", "status": "fetched", "status_code": 200, "content_length": 1700, "page_hash": "c" * 64, "title": "MOMO 活動", "diagnostics": { "link_count": 1, "same_host_link_count": 1, "campaign_link_candidates": [ { "confidence_band": "high", "score": 94, "url": "https://www.momoshop.com.tw/activity/sample", "text": "品牌活動", }, ], }, }, ensure_ascii=False, ), encoding="utf-8", ) env = { **os.environ, "MOMO_ALLOW_INSECURE_CONFIG_FOR_TESTS": "true", "SECRET_KEY": "test", "LOGIN_PASSWORD": "test", } result = subprocess.run( [ sys.executable, "scripts/market_intel_candidate_queue_writer.py", "--sample-json", str(sample_file), ], capture_output=True, check=False, env=env, text=True, ) data = json.loads(result.stdout) assert result.returncode == 0 assert data["mode"] == "candidate_queue_writer_cli_blocked" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is False assert data["apply_real_write_requested"] is False assert data["writes_executed"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["transaction_preview_summary"]["statement_count"] == 1 assert "execute_requested" in data["blocked_reasons"] def test_review_decision_writer_cli_script_outputs_blocked_gate_without_login_env(): env = { key: value for key, value in os.environ.items() if key not in {"LOGIN_PASSWORD", "SECRET_KEY"} } result = subprocess.run( [sys.executable, "scripts/market_intel_review_decision_writer.py"], capture_output=True, check=False, env=env, text=True, ) data = json.loads(result.stdout) assert result.returncode == 0 assert data["mode"] == "candidate_queue_review_decision_writer_cli_blocked" assert data["phase"] == "phase_140_market_intel_professional_source_governance" assert data["execute_requested"] is False assert data["apply_real_write_requested"] is False assert data["approval_token_present"] is False assert data["writer_implementation_enabled"] is False assert data["ready_for_real_write"] is False assert data["api_executes_cli"] is False assert data["api_reads_approval_token"] is False assert data["database_connection_opened"] is False assert data["database_write_executed"] is False assert data["database_commit_executed"] is False assert data["scheduler_attached"] is False assert data["writes_executed"] is False assert data["exit_code"] == 0 def test_mcp_professional_source_governance_preview_is_safe_without_payload(): governance = build_mcp_professional_source_governance_preview( phase="phase_140_market_intel_professional_source_governance", ) assert governance["mode"] == "mcp_professional_source_governance_preview" assert governance["phase"] == "phase_140_market_intel_professional_source_governance" assert governance["source_governance_payload_received"] is False assert governance["mcp_professional_source_governance_accepted"] is False assert governance["ready_for_mcp_fetch_source_contract"] is False assert governance["network_request_allowed"] is False assert governance["external_network_executed"] is False assert governance["api_uses_external_network"] is False assert governance["api_fetches_robots_txt"] is False assert governance["api_fetches_sitemap"] is False assert governance["api_fetches_source_url"] is False assert governance["api_opens_database_connection"] is False assert governance["api_writes_database"] is False assert governance["api_writes_file"] is False assert governance["payload_persisted"] is False assert governance["scheduler_attached"] is False assert "source_governance_payload_received" in governance["blocked_reasons"] assert "operator_source_governance" in governance[ "sample_professional_source_governance_package" ] assert governance["source_contract"]["policy_version"] == "source_governance_v1" def test_mcp_professional_source_governance_accepts_sample_package(): sample = ( build_mcp_professional_source_governance_preview() ["sample_professional_source_governance_package"] ) governance = build_mcp_professional_source_governance_preview( operator_source_governance=sample["operator_source_governance"], phase="phase_140_market_intel_professional_source_governance", ) assert governance["mode"] == "mcp_professional_source_governance" assert governance["phase"] == "phase_140_market_intel_professional_source_governance" assert governance["mcp_professional_source_governance_accepted"] is True assert governance["ready_for_mcp_fetch_source_contract"] is True assert governance["ready_for_api_database_write"] is False assert governance["blocked_reasons"] == [] assert governance["passed_gate_count"] == governance["gate_count"] summary = governance["source_governance_summary"] assert summary["source_count"] == 8 assert summary["platform_count"] == 4 assert summary["robots_checked_count"] == 8 assert summary["structured_data_ready_count"] == 8 assert summary["min_crawl_delay_seconds"] >= 1 assert all(source["evidence_artifact_path_safe"] for source in governance["sources"]) assert all(source["snapshot_hash_required"] for source in governance["sources"]) assert governance["api_fetches_robots_txt"] is False assert governance["api_fetches_source_url"] is False assert governance["database_write_executed"] is False assert governance["scheduler_attached"] is False def test_mcp_professional_source_governance_blocks_unsafe_source(): sample = json.loads( json.dumps( build_mcp_professional_source_governance_preview() ["sample_professional_source_governance_package"] ) ) payload = sample["operator_source_governance"] first_source = payload["sources"][0] first_source["source_url"] = "https://www.momoshop.com.tw/member/orders" first_source["robots_allowed"] = False first_source["crawl_delay_seconds"] = 0 first_source["max_requests_per_run"] = 500 first_source["structured_data_types"] = ["Article"] first_source["login_required"] = True first_source["anti_bot_bypass_required"] = True first_source["evidence_artifact_path"] = "../unsafe.json" first_source["snapshot_hash_required"] = False payload["raw_html"] = "raw" payload["cookie"] = "do-not-submit" payload["api_fetches_source_url"] = True payload["api_writes_database"] = True payload["operator_confirmations"]["no_antibot_bypass"] = False payload["operator_confirmations"]["no_api_network_fetch"] = False governance = build_mcp_professional_source_governance_preview( operator_source_governance=payload, ) assert governance["mcp_professional_source_governance_accepted"] is False assert "source_governance_public_urls_only" in governance["blocked_reasons"] assert ( "source_governance_robots_policy_checked_and_allowed" in governance["blocked_reasons"] ) assert "source_governance_structured_data_first" in governance["blocked_reasons"] assert "source_governance_rate_limits_safe" in governance["blocked_reasons"] assert ( "source_governance_public_data_only_no_login_or_pii" in governance["blocked_reasons"] ) assert "source_governance_no_antibot_bypass" in governance["blocked_reasons"] assert ( "source_governance_provenance_and_hash_required" in governance["blocked_reasons"] ) assert "source_governance_evidence_paths_safe" in governance["blocked_reasons"] assert ( "source_governance_operator_boundaries_confirmed" in governance["blocked_reasons"] ) assert "source_governance_no_raw_payload" in governance["blocked_reasons"] assert "source_governance_no_secret_or_token_key" in governance["blocked_reasons"] assert "source_governance_side_effect_free" in governance["blocked_reasons"] assert "source_governance_api_preview_only" in governance["blocked_reasons"] assert governance["api_uses_external_network"] is False assert governance["api_writes_database"] is False assert governance["scheduler_attached"] is False def test_mcp_professional_source_governance_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get("/api/market_intel/mcp_professional_source_governance") get_data = get_response.get_json() sample = get_data["sample_professional_source_governance_package"] post_response = client.post( "/api/market_intel/mcp_professional_source_governance", json={"professional_source_governance_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_professional_source_governance_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_uses_external_network"] is False assert get_data["api_writes_database"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_professional_source_governance" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["mcp_professional_source_governance_accepted"] is True assert post_data["ready_for_mcp_fetch_source_contract"] is True assert post_data["network_request_allowed"] is False assert post_data["api_fetches_robots_txt"] is False assert post_data["api_fetches_source_url"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_writes_database"] is False assert post_data["payload_persisted"] is False assert post_data["scheduler_attached"] is False def test_mcp_fetch_target_source_governance_review_preview_is_safe_without_payload(): review = build_mcp_fetch_target_source_governance_review_preview( phase="phase_140_market_intel_professional_source_governance", ) assert review["mode"] == "mcp_fetch_target_source_governance_review_preview" assert review["phase"] == "phase_140_market_intel_professional_source_governance" assert review["source_governance_package_received"] is False assert review["target_review_package_received"] is False assert review["mcp_fetch_target_source_governance_review_accepted"] is False assert "professional_source_governance_package_received" in review["blocked_reasons"] assert "fetch_target_review_package_received" in review["blocked_reasons"] assert review["network_request_allowed"] is False assert review["external_network_executed"] is False assert review["fetch_executed"] is False assert review["api_fetches_source_url"] is False assert review["api_opens_database_connection"] is False assert review["api_writes_database"] is False assert review["api_executes_cli"] is False assert review["scheduler_attached"] is False def test_mcp_fetch_target_source_governance_review_accepts_sample_package(): sample = ( build_mcp_fetch_target_source_governance_review_preview() ["sample_fetch_target_source_governance_review_package"] ) review = build_mcp_fetch_target_source_governance_review_preview( professional_source_governance_package=sample[ "professional_source_governance_package" ], target_review_package=sample["target_review_package"], operator_confirmations=sample["operator_confirmations"], phase="phase_140_market_intel_professional_source_governance", ) assert review["mode"] == "mcp_fetch_target_source_governance_review" assert review["phase"] == "phase_140_market_intel_professional_source_governance" assert review["mcp_fetch_target_source_governance_review_accepted"] is True assert review["ready_for_manual_fetch_run_package_review"] is True assert review["blocked_reasons"] == [] assert review["passed_gate_count"] == review["gate_count"] assert review["source_alignment"]["target_source_count"] == 8 assert review["source_alignment"]["governed_source_count"] == 8 assert review["source_alignment"]["missing_governed_sources"] == [] assert review["source_alignment"]["all_target_sources_governed"] is True assert review["professional_source_governance"][ "mcp_professional_source_governance_accepted" ] is True assert review["mcp_fetch_target_review"]["mcp_fetch_target_review_accepted"] is True assert review["network_request_allowed"] is False assert review["api_fetches_source_url"] is False assert review["api_opens_database_connection"] is False assert review["api_writes_database"] is False assert review["api_executes_cli"] is False assert review["scheduler_attached"] is False def test_mcp_fetch_target_source_governance_review_blocks_missing_source_contract(): sample = json.loads( json.dumps( build_mcp_fetch_target_source_governance_review_preview() ["sample_fetch_target_source_governance_review_package"] ) ) sources = sample["professional_source_governance_package"][ "operator_source_governance" ]["sources"] sample["professional_source_governance_package"]["operator_source_governance"][ "sources" ] = [source for source in sources if source["source_key"] != "shopee_home"] review = build_mcp_fetch_target_source_governance_review_preview( professional_source_governance_package=sample[ "professional_source_governance_package" ], target_review_package=sample["target_review_package"], operator_confirmations=sample["operator_confirmations"], ) assert review["mcp_fetch_target_source_governance_review_accepted"] is False assert "all_target_sources_governed" in review["blocked_reasons"] assert review["source_alignment"]["missing_governed_sources"] == [ {"platform_code": "shopee", "source_key": "shopee_home"} ] def test_mcp_fetch_target_source_governance_review_route_get_and_post_preview_only(): from routes.market_intel_routes import market_intel_bp app = Flask(__name__) app.secret_key = "test-secret" app.register_blueprint(market_intel_bp) client = app.test_client() with client.session_transaction() as session: session["logged_in"] = True get_response = client.get( "/api/market_intel/mcp_fetch_target_source_governance_review" ) get_data = get_response.get_json() sample = get_data["sample_fetch_target_source_governance_review_package"] post_response = client.post( "/api/market_intel/mcp_fetch_target_source_governance_review", json={"fetch_target_source_governance_review_package": sample}, ) post_data = post_response.get_json() assert get_response.status_code == 200 assert get_data["mode"] == "mcp_fetch_target_source_governance_review_preview" assert get_data["phase"] == "phase_140_market_intel_professional_source_governance" assert get_data["api_fetches_source_url"] is False assert get_data["api_writes_database"] is False assert post_response.status_code == 200 assert post_data["mode"] == "mcp_fetch_target_source_governance_review" assert post_data["phase"] == "phase_140_market_intel_professional_source_governance" assert post_data["mcp_fetch_target_source_governance_review_accepted"] is True assert post_data["source_alignment"]["all_target_sources_governed"] is True assert post_data["network_request_allowed"] is False assert post_data["api_fetches_robots_txt"] is False assert post_data["api_fetches_source_url"] is False assert post_data["api_opens_database_connection"] is False assert post_data["api_writes_database"] is False assert post_data["payload_persisted"] is False assert post_data["scheduler_attached"] is False