{
  "ok": false,
  "generated_at": "2026-06-26T21:33:45+00:00",
  "summary": {
    "open_items": 7,
    "warning_items": 80,
    "partial_requirements": 3,
    "missing_requirements": 0,
    "readiness_errors": 0,
    "readiness_warnings": 4,
    "deployment_errors": 0,
    "deployment_warnings": 36,
    "env_errors": 3,
    "env_warnings": 40,
    "public_dashboard_errors": 0,
    "public_dashboard_warnings": 0,
    "telegram_content_errors": 1,
    "telegram_content_warnings": 0,
    "app_dir": "/app",
    "env_file": "/app/.env",
    "service_name": "market-intel",
    "deploy_mode": "systemd",
    "public_dashboard_url": "https://35-221-72-238.sslip.io/dashboard.html",
    "public_dashboard_url_configured": true,
    "public_dashboard_url_quality": {
      "url": "https://35-221-72-238.sslip.io/dashboard.html",
      "ok": true,
      "format_ok": true,
      "placeholder": false,
      "host": "35-221-72-238.sslip.io"
    }
  },
  "next_steps": [
    {
      "id": "deploy_app",
      "title": "VPSへアプリを配置する",
      "detail": "/app に配布zipを展開し、systemd運用で初回監査まで進めます。",
      "commands": [
        "cd /app",
        "python3 scripts/market_intel.py deploy-package --format text",
        "python3 scripts/market_intel.py deploy-package-verify deploy_packages/<PACKAGE>.zip --format text",
        "sudo unzip -o deploy_packages/<PACKAGE>.zip -d /opt",
        "cd /app",
        "sudo scripts/bootstrap_vps.sh --app-dir /app --public-url \"https://35-221-72-238.sslip.io/dashboard.html\" --telegram-bot-token \"$TELEGRAM_BOT_TOKEN\" --telegram-chat-id \"$TELEGRAM_CHAT_ID\" --deploy-mode systemd --install-nginx"
      ],
      "related_checks": []
    },
    {
      "id": "configure_env",
      "title": ".envに本番値を設定する",
      "detail": "Telegram、公開URL、日次処理量、候補ソース検証の設定を入れます。",
      "commands": [
        "sudo /app/scripts/configure_env.sh --app-dir /app --public-url \"https://35-221-72-238.sslip.io/dashboard.html\" --telegram-bot-token \"$TELEGRAM_BOT_TOKEN\" --telegram-chat-id \"$TELEGRAM_CHAT_ID\" --deploy-mode systemd --validate",
        "python3 /app/scripts/market_intel.py env-check --env-file /app/.env --require-telegram --require-public-url --require-deploy-mode"
      ],
      "required_env": [
        "TELEGRAM_BOT_TOKEN",
        "TELEGRAM_CHAT_ID",
        "PUBLIC_DASHBOARD_URL",
        "DEPLOY_MODE",
        "RUN_LIMIT",
        "FETCH_LIMIT",
        "PRIORITY_SCAN_LIMIT",
        "SOURCE_CANDIDATES_CHECK_ENABLED"
      ],
      "related_checks": [
        "env_file_present",
        "env_deploy_mode_valid",
        "env_public_dashboard_url_valid"
      ]
    },
    {
      "id": "enable_timer",
      "title": "systemd timerで毎日実行する",
      "detail": "market-intel.timer を有効化し、二重起動防止付きの日次収集を回します。",
      "commands": [
        "sudo systemctl daemon-reload",
        "sudo systemctl enable --now market-intel.timer",
        "systemctl list-timers market-intel.timer --no-pager"
      ],
      "related_checks": []
    },
    {
      "id": "publish_dashboard",
      "title": "NginxでWebダッシュボードを公開する",
      "detail": "Nginxで reports/ を静的配信し、https://35-221-72-238.sslip.io/dashboard.html で dashboard.html/json を確認します。",
      "commands": [
        "sudo cp /app/deploy/nginx/market-intel.conf /etc/nginx/sites-available/market-intel.conf",
        "sudo ln -sf /etc/nginx/sites-available/market-intel.conf /etc/nginx/sites-enabled/market-intel.conf",
        "sudo nginx -t && sudo systemctl reload nginx",
        "curl -fsS \"https://35-221-72-238.sslip.io/dashboard.html\" >/dev/null",
        "python3 scripts/market_intel.py public-dashboard-check --format json --output reports/public_dashboard_check.json --require-public-url"
      ],
      "related_checks": []
    },
    {
      "id": "test_telegram",
      "title": "Telegram通知をテストする",
      "detail": "戦略サマリーとヘルス警告の両方をdry-run、本送信の順で確認します。",
      "commands": [
        "cd /app",
        "python3 scripts/market_intel.py telegram-test --format json",
        "python3 scripts/market_intel.py telegram-test --send",
        "python3 scripts/market_intel.py telegram-content-check --require-dashboard-url --format json --output reports/telegram_content_check.json",
        "python3 scripts/market_intel.py telegram-notify --dry-run",
        "python3 scripts/market_intel.py telegram-notify",
        "python3 scripts/market_intel.py health-notify --notify-ok --dry-run"
      ],
      "related_checks": [
        "telegram_decision_digest_present"
      ]
    },
    {
      "id": "validate_candidates",
      "title": "候補ソースを本番IPで検証する",
      "detail": "みずほ系・省庁系など候補止まりの発信元をVPSから実アクセスし、通るものを有効化候補にします。",
      "commands": [
        "cd /app",
        "python3 scripts/market_intel.py source-candidates --check --output reports/source_candidates.json --min-candidates 3 --min-source-weight 0.7 --http-timeout 10 --http-retries 0",
        "python3 scripts/market_intel.py source-candidates --check --promotable-only --min-candidates 3 --min-source-weight 0.7 --http-timeout 10 --http-retries 0",
        "python3 scripts/market_intel.py source-promotion-plan --candidate-report reports/source_candidates.json --output reports/source_promotion_plan.json --markdown reports/source_promotion_plan.md",
        "SOURCE_PROMOTION_VERIFY_RUN=1 sudo scripts/finalize_vps.sh --app-dir /app --env-file /app/.env --service-name market-intel --nginx-site-name market-intel.conf --apply-promotions",
        "python3 scripts/market_intel.py source-coverage --format json --output reports/source_coverage.json",
        "python3 scripts/market_intel.py market-source-coverage --format json --output reports/market_source_coverage.json"
      ],
      "related_requirements": [
        "candidate_source_feedback_loop"
      ]
    },
    {
      "id": "final_audit",
      "title": "本番監査を通す",
      "detail": "日次run後にfinalize_vps.shで本番ゲートをまとめて更新し、個別監査も確認します。",
      "commands": [
        "cd /app",
        "sudo scripts/finalize_vps.sh --app-dir /app --env-file /app/.env --service-name market-intel --nginx-site-name market-intel.conf",
        "SOURCE_PROMOTION_VERIFY_RUN=1 sudo scripts/finalize_vps.sh --app-dir /app --env-file /app/.env --service-name market-intel --nginx-site-name market-intel.conf --apply-promotions",
        "python3 scripts/market_intel.py readiness --format json --output reports/readiness.json --pending-threshold 3000",
        "python3 scripts/market_intel.py deployment-check --format json --output reports/deployment_check.json --deploy-mode systemd --require-telegram --require-nginx",
        "python3 scripts/market_intel.py public-dashboard-check --format json --output reports/public_dashboard_check.json --require-public-url",
        "python3 scripts/market_intel.py telegram-content-check --require-dashboard-url --format json --output reports/telegram_content_check.json",
        "python3 scripts/market_intel.py requirements-audit --format json --output reports/requirements_audit.json --markdown reports/requirements_audit.md"
      ],
      "related_checks": []
    }
  ],
  "open_requirements": [
    {
      "id": "daily_stable_collection",
      "title": "毎日安定して新着情報を確認し、二重起動を避ける",
      "status": "partial",
      "ok": false,
      "evidence": {
        "scheduler": {
          "platform": "linux",
          "scheduler": "systemd",
          "service_path": "/etc/systemd/system/market-intel.service",
          "timer_path": "/etc/systemd/system/market-intel.timer",
          "exists": false
        },
        "last_run": {
          "id": 61,
          "started_at": "2026-06-26T21:20:04+00:00",
          "finished_at": "2026-06-26T21:30:14+00:00",
          "status": "ok",
          "sources_checked": 148,
          "candidates_found": 2384,
          "documents_new": 201,
          "analyses_new": 160,
          "error": null
        },
        "source_errors": [
          {
            "source_id": "gsi_news",
            "error_count": 10,
            "last_error": "<urlopen error [SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1016)>"
          },
          {
            "source_id": "iea_reports",
            "error_count": 10,
            "last_error": "HTTP Error 403: Forbidden"
          },
          {
            "source_id": "nuveen_investment_outlook",
            "error_count": 10,
            "last_error": "The read operation timed out"
          }
        ],
        "ops_monitor_summary": {
          "errors": 0,
          "warnings": 0,
          "window_days": 14,
          "run_count": 10,
          "ok_runs": 10,
          "error_runs": 0,
          "success_days": 10,
          "consecutive_success_days": 10,
          "latest_success_date": "2026-06-27",
          "missing_days": 4,
          "latest_run_id": 61,
          "latest_status": "ok",
          "latest_age_hours": 0.02,
          "zero_output_ok_runs": 0
        },
        "local_daily_operation_proven": true,
        "remote_daily_operation_proven": true,
        "source_freshness_summary": {
          "errors": 0,
          "warnings": 1,
          "active_sources": 148,
          "checked_recent": 148,
          "unchecked": 0,
          "stale_checked": 0,
          "source_error_rows": 3,
          "stale_or_quiet_sources": 0,
          "candidate_only_sources": 0,
          "covered_candidate_only_sources": 4,
          "silent_gap_sources": 0,
          "followup_sources": 8,
          "followup_counts": {
            "fetch_error": 8
          },
          "high_fetch_error_sources": 0,
          "documents_24h": 393,
          "documents_7d": 1843,
          "documents_30d": 13924,
          "inactive_state_rows": 11,
          "max_checked_age_hours": 30.0,
          "stale_document_days": 45
        },
        "source_freshness_json": "/app/reports/source_freshness.json",
        "run_daily": "/app/scripts/run_daily.sh"
      },
      "gaps": [
        "一部ソースエラーまたは未確認ソースがあります。"
      ],
      "remaining": [
        "一部ソースエラーまたは未確認ソースがあります。"
      ],
      "needs_operator_input": true
    },
    {
      "id": "vps_cloud_operation",
      "title": "クラウド/VPSで毎日実行できる配備導線を持つ",
      "status": "partial",
      "ok": false,
      "evidence": {
        "deployment_summary": {
          "errors": 0,
          "warnings": 36,
          "app_dir": "/app",
          "service_name": "market-intel",
          "deploy_mode": "auto",
          "platform": "linux"
        },
        "deploy_release_summary": {
          "transfer_ready": false,
          "production_complete": false,
          "local_production_complete": false,
          "remote_evidence_complete": false,
          "completion_evidence": {
            "complete": false,
            "completion_source": "incomplete",
            "local_complete": false,
            "remote_evidence_complete": false,
            "required_reports": 71,
            "present_required_reports": 65,
            "missing_required_report_count": 6,
            "failed_check_ids": [
              "remote_required_reports_present",
              "remote_release_upload_bundle_verified",
              "remote_telegram_notify_sent",
              "remote_telegram_notify_fresh",
              "remote_deployed_manifest_verified"
            ],
            "remote_recurring_daily_operation_ok": true,
            "remote_ops_success_days": 5,
            "remote_ops_consecutive_success_days": 5,
            "remote_ops_success_days_required": 2,
            "remote_ops_latest_age_hours": 10.01,
            "remote_ops_latest_age_hours_max": 30.0,
            "remote_telegram_notify_sent": false,
            "remote_telegram_notify_fresh": false,
            "remote_telegram_notify_message_length": 0,
            "public_endpoints": 35,
            "remote_deployed_manifest_ok": false,
            "remote_mutable_report_count": 51,
            "remote_mutable_reports_present": 51,
            "remote_evidence_manifest_ok": true,
            "remote_evidence_archive_ok": true,
            "remote_release_upload_bundle_verified": false,
            "remote_source_freshness_ok": true,
            "remote_source_coverage_ok": true,
            "remote_market_source_coverage_ok": true
          },
          "failed_gate_ids": [
            "requirements_complete",
            "readiness_clear",
            "deploy_mode_selected",
            "deployment_clear",
            "env_clear",
            "dashboard_content_clear",
            "telegram_content_clear",
            "source_candidates_resolved",
            "telegram_test_sent",
            "health_clear"
          ],
          "configured_deploy_mode": "docker",
          "selected_deploy_mode": "docker",
          "public_dashboard_url": "",
          "latest_package_ok": false,
          "checksum_ok": false,
          "latest_backup_ok": true,
          "dashboard_content_ok": false,
          "local_dashboard_smoke_ok": true,
          "strategy_reuse_audit_ok": true,
          "release_upload_bundle_ok": true,
          "release_upload_bundle_sha_matches": true,
          "release_upload_bundle_ready": true,
          "release_upload_bundle_dir": "deploy_uploads/market-intel-engine-20260611T064355Z-upload",
          "go_live_ready_to_go_live": false,
          "package_path": "",
          "package_sha256": "b32e3e95beb3b1510238b1838b6c56b924b7f4e2d7acc79a7a810bbedc33bfa3",
          "package_sha256_source": "release_upload_bundle_check",
          "checksum_path": "",
          "backup_path": "/app/backups/20260625T213515Z",
          "target_app_dir": "/app"
        },
        "remote_evidence_summary": {
          "complete": false,
          "checks": 34,
          "passed": 29,
          "failed": 5,
          "failed_check_ids": [
            "remote_required_reports_present",
            "remote_release_upload_bundle_verified",
            "remote_telegram_notify_sent",
            "remote_telegram_notify_fresh",
            "remote_deployed_manifest_verified"
          ],
          "required_reports": 71,
          "present_required_reports": 65,
          "missing_required_report_count": 6,
          "required_report_coverage": 0.9155,
          "next_missing_required_reports": [
            "weekly_market_strategy_report.json",
            "weekly_market_strategy_report.md",
            "weekly_capital_flow_themes.csv",
            "weekly_attention_companies.csv",
            "weekly_market_strategy_telegram.txt",
            "weekly_market_strategy_telegram.json"
          ],
          "missing_required_reports": [
            "weekly_market_strategy_report.json",
            "weekly_market_strategy_report.md",
            "weekly_capital_flow_themes.csv",
            "weekly_attention_companies.csv",
            "weekly_market_strategy_telegram.txt",
            "weekly_market_strategy_telegram.json"
          ],
          "public_endpoints": 35,
          "telegram_send_ok": true,
          "remote_telegram_notify_sent": false,
          "remote_telegram_notify_status": "skipped_missing_credentials",
          "remote_telegram_notify_api_ok": false,
          "remote_telegram_notify_message_length": 0,
          "remote_telegram_notify_fresh": false,
          "remote_telegram_notify_date": "",
          "remote_telegram_content_date": "2026-06-11",
          "remote_telegram_notify_age_hours": 63.845669873333335,
          "production_complete": true,
          "remote_release_upload_bundle_ok": true,
          "remote_release_upload_bundle_verified": false,
          "remote_release_upload_bundle_sha_matches": false,
          "remote_release_upload_bundle_sha256": "a5b3b8435dc628c178e898fcf9342a638cfc2992673dd36d31914fa982270fae",
          "remote_deployed_release_sha256": "b32e3e95beb3b1510238b1838b6c56b924b7f4e2d7acc79a7a810bbedc33bfa3",
          "remote_deploy_release_sha256": "b32e3e95beb3b1510238b1838b6c56b924b7f4e2d7acc79a7a810bbedc33bfa3",
          "remote_deploy_release_report_sha256": "a5b3b8435dc628c178e898fcf9342a638cfc2992673dd36d31914fa982270fae",
          "ops_snapshot_open_items": 0,
          "remote_source_followup_sources": 3,
          "remote_source_followup_counts": {
            "fetch_error": 3
          },
          "remote_source_candidate_only_sources": 0,
          "remote_source_silent_gap_sources": 0,
          "remote_source_freshness_ok": true,
          "remote_source_freshness_errors": 0,
          "remote_source_freshness_warnings": 0,
          "remote_source_target_reference_ok": true,
          "remote_source_target_official_targets": 59,
          "remote_source_target_configured_targets": 59,
          "remote_source_target_missing_in_config": 0,
          "remote_source_target_extra_in_config": 0,
          "remote_source_target_host_drift": 0,
          "remote_source_target_fallback_used": false,
          "remote_source_coverage_ok": true,
          "remote_source_coverage_targets": 59,
          "remote_source_coverage_active": 59,
          "remote_source_coverage_monitoring_verified": 59,
          "remote_source_coverage_collection_verified": 59,
          "remote_source_coverage_collection_unverified_targets": [],
          "remote_source_coverage_missing": 0,
          "remote_source_coverage_candidate_only": 0,
          "remote_market_source_coverage_ok": true,
          "remote_market_source_coverage_targets": 70,
          "remote_market_source_coverage_active": 70,
          "remote_market_source_coverage_monitoring_verified": 70,
          "remote_market_source_coverage_collection_verified": 70,
          "remote_market_source_coverage_collection_unverified_targets": [],
          "remote_market_source_coverage_missing": 0,
          "remote_market_source_coverage_candidate_only": 0,
          "remote_ops_monitor_ok": true,
          "remote_daily_lock_audit_ok": true,
          "remote_daily_lock_status": "completed",
          "remote_daily_lock_ops_success_days": 5,
          "remote_daily_lock_ops_consecutive_success_days": 5,
          "remote_recurring_daily_operation_ok": true,
          "remote_ops_success_days": 5,
          "remote_ops_consecutive_success_days": 5,
          "remote_ops_success_days_required": 2,
          "remote_ops_latest_age_hours": 10.01,
          "remote_ops_latest_age_hours_max": 30.0,
          "remote_strategy_reuse_ok": true,
          "remote_plain_explainer_analyses": 8115,
          "remote_lens_reuse_analyses": 8111,
          "remote_source_strategy_context_reuse_ok": true,
          "remote_source_strategy_eligible_analyses": 8115,
          "remote_source_strategy_reused_after": 8115,
          "remote_backup_drill_ok": true,
          "remote_backup_drill_db_integrity_ok": true,
          "remote_backup_drill_db_hash_ok": true,
          "remote_backup_drill_report_members": 80,
          "remote_runtime_host": "kabu-engine-staging-350gb.asia-northeast1-b.c.gen-lang-client-0996387302.internal",
          "remote_runtime_ok": true,
          "remote_deployed_manifest_present": true,
          "remote_deployed_manifest_ok": false,
          "remote_deployed_manifest_verified_required": 38,
          "remote_mutable_report_count": 51,
          "remote_mutable_reports_present": 51,
          "remote_mutable_missing_reports": [],
          "remote_finalize_returncode": 0,
          "remote_finalize_command": "scripts/finalize_vps.sh --app-dir /opt/market-intel-engine --env-file /opt/market-intel-engine/.env --service-name market-intel --nginx-site-name market-intel.conf --deploy-mode docker",
          "remote_finalize_apply_promotions": false,
          "remote_finalize_promotion_verify_run": true,
          "remote_finalize_log_collected": true,
          "remote_finalize_log_size": 1360267,
          "remote_evidence_manifest_ok": true,
          "remote_evidence_manifest_files": 64,
          "remote_evidence_manifest_release_sha256": "b32e3e95beb3b1510238b1838b6c56b924b7f4e2d7acc79a7a810bbedc33bfa3",
          "remote_evidence_manifest_release_sha_matches": true,
          "remote_evidence_manifest_required_reports": 69,
          "remote_evidence_manifest_present_required_reports": 63,
          "remote_evidence_manifest_missing_required_reports": 6,
          "remote_evidence_archive_ok": true,
          "remote_evidence_archive_files": 65,
          "remote_evidence_archive_sha256": "4d04ceb5aee3ed15765fa8e8686bdb077a887b110ceb1dc0c632bea82a409baf",
          "remote_evidence_archive_manifest_release_sha256": "b32e3e95beb3b1510238b1838b6c56b924b7f4e2d7acc79a7a810bbedc33bfa3",
          "remote_evidence_archive_manifest_release_sha_matches": true,
          "remote_evidence_archive_manifest_required_reports": 69,
          "remote_evidence_archive_manifest_present_required_reports": 63,
          "remote_evidence_archive_manifest_missing_required_reports": 6,
          "remediation_actions": [
            {
              "id": "redeploy_release",
              "title": "配布zipをVPSへ再投入する",
              "command": "scripts/operator_go_live.sh --push",
              "detail": "展開manifest、mutable report、ランタイム証跡が欠ける場合は、最新zipを再投入してbootstrap/finalizeを走らせます。",
              "priority": 10,
              "failed_check": "remote_release_upload_bundle_verified"
            },
            {
              "id": "collect_remote_evidence",
              "title": "回収済みVPS証跡を更新する",
              "command": "scripts/operator_go_live.sh --collect --check-evidence --strict-evidence",
              "detail": "VPS上でfinalize_vps.shを再実行し、必須レポート、runtime証跡、manifest、archiveを回収して再判定します。",
              "priority": 20,
              "failed_check": "remote_required_reports_present"
            }
          ],
          "next_remediation_action": {
            "id": "redeploy_release",
            "title": "配布zipをVPSへ再投入する",
            "command": "scripts/operator_go_live.sh --push",
            "detail": "展開manifest、mutable report、ランタイム証跡が欠ける場合は、最新zipを再投入してbootstrap/finalizeを走らせます。",
            "priority": 10,
            "failed_check": "remote_release_upload_bundle_verified"
          },
          "gap_report": {
            "complete": false,
            "total_failed_checks": 5,
            "phase_count": 3,
            "phases": [
              {
                "phase": "deployment",
                "label": "VPS配布・本番ゲート",
                "failed_checks": 2,
                "checks": [
                  "remote_release_upload_bundle_verified",
                  "remote_deployed_manifest_verified"
                ],
                "next_action": {
                  "id": "redeploy_release",
                  "title": "配布zipをVPSへ再投入する",
                  "command": "scripts/operator_go_live.sh --push",
                  "detail": "展開manifest、mutable report、ランタイム証跡が欠ける場合は、最新zipを再投入してbootstrap/finalizeを走らせます。",
                  "priority": 10
                }
              },
              {
                "phase": "telegram",
                "label": "Telegram通知",
                "failed_checks": 2,
                "checks": [
                  "remote_telegram_notify_sent",
                  "remote_telegram_notify_fresh"
                ],
                "next_action": {
                  "id": "collect_remote_evidence",
                  "title": "回収済みVPS証跡を更新する",
                  "command": "scripts/operator_go_live.sh --collect --check-evidence --strict-evidence",
                  "detail": "VPS上でfinalize_vps.shを再実行し、必須レポート、runtime証跡、manifest、archiveを回収して再判定します。",
                  "priority": 20
                }
              },
              {
                "phase": "evidence_integrity",
                "label": "証跡ファイル完全性",
                "failed_checks": 1,
                "checks": [
                  "remote_required_reports_present"
                ],
                "next_action": {
                  "id": "collect_remote_evidence",
                  "title": "回収済みVPS証跡を更新する",
                  "command": "scripts/operator_go_live.sh --collect --check-evidence --strict-evidence",
                  "detail": "VPS上でfinalize_vps.shを再実行し、必須レポート、runtime証跡、manifest、archiveを回収して再判定します。",
                  "priority": 20
                }
              }
            ],
            "missing_required_report_count": 6,
            "missing_required_report_categories": [
              {
                "category": "ops",
                "label": "運用監視",
                "missing": 6,
                "examples": [
                  "weekly_market_strategy_report.json",
                  "weekly_market_strategy_report.md",
                  "weekly_capital_flow_themes.csv",
                  "weekly_attention_companies.csv",
                  "weekly_market_strategy_telegram.txt",
                  "weekly_market_strategy_telegram.json"
                ]
              }
            ],
            "blockers": [
              {
                "phase": "deployment",
                "label": "VPS配布・本番ゲート",
                "failed_checks": 2,
                "first_check": "remote_release_upload_bundle_verified",
                "next_action_id": "redeploy_release",
                "next_command": "scripts/operator_go_live.sh --push"
              },
              {
                "phase": "telegram",
                "label": "Telegram通知",
                "failed_checks": 2,
                "first_check": "remote_telegram_notify_sent",
                "next_action_id": "collect_remote_evidence",
                "next_command": "scripts/operator_go_live.sh --collect --check-evidence --strict-evidence"
              },
              {
                "phase": "evidence_integrity",
                "label": "証跡ファイル完全性",
                "failed_checks": 1,
                "first_check": "remote_required_reports_present",
                "next_action_id": "collect_remote_evidence",
                "next_command": "scripts/operator_go_live.sh --collect --check-evidence --strict-evidence"
              }
            ]
          },
          "operator_context": {
            "stage": "partial_remote_collection",
            "label": "VPS証跡の一部不足",
            "detail": "VPS証跡は回収済みですが、必須レポートが不足しています。finalizeと回収を再実行してください。",
            "evidence_dir_present": true,
            "present_required_reports": 65,
            "required_reports": 71,
            "primary_action_id": "collect_remote_evidence",
            "primary_command": "scripts/operator_go_live.sh --collect --check-evidence --strict-evidence",
            "primary_action_title": "回収済みVPS証跡を更新する"
          },
          "bootstrap_exception": {
            "applied": false
          }
        },
        "local_daily_operation_proven": true,
        "transfer_ready": false,
        "installer": "/app/scripts/install_vps.sh",
        "systemd": "/app/deploy/systemd"
      },
      "gaps": [
        "配布zip/checksum/バックアップの転送準備が未完了です。",
        "このローカル環境では .env/Telegram/Nginx/systemd 実配備は未設定です。",
        "VPS/クラウドから回収した remote_evidence_check が complete=true ではありません。"
      ],
      "remaining": [
        "配布zip/checksum/バックアップの転送準備が未完了です。",
        "このローカル環境では .env/Telegram/Nginx/systemd 実配備は未設定です。",
        "VPS/クラウドから回収した remote_evidence_check が complete=true ではありません。"
      ],
      "needs_operator_input": true
    },
    {
      "id": "candidate_source_feedback_loop",
      "title": "VPSで通る候補ソースを検証し、有効化候補として見えるようにする",
      "status": "partial",
      "ok": false,
      "evidence": {
        "source_candidates_json": {
          "path": "/app/reports/source_candidates.json",
          "exists": true,
          "valid_json": true,
          "size": 30604
        },
        "candidate_count": 16,
        "checked": true,
        "decision_counts": {
          "covered_by_active_fallback": 7,
          "already_enabled": 8,
          "promote": 1
        },
        "promotable_count": 1,
        "known_blocked_count": 0,
        "known_blocked_policy": "source_opportunity_radar.blocked_followups に表示し、未解決候補キューからは除外する"
      },
      "gaps": [
        "1 candidate sources are promotable and should be reviewed/promoted."
      ],
      "remaining": [
        "1 candidate sources are promotable and should be reviewed/promoted."
      ],
      "needs_operator_input": true
    }
  ],
  "open_deployment_checks": [],
  "open_readiness_checks": [],
  "open_env_checks": [
    {
      "check": "env_file_present",
      "ok": false,
      "severity": "error",
      "detail": "env_file=/app/.env exists=False",
      "path": "/app/.env"
    },
    {
      "check": "env_deploy_mode_valid",
      "ok": false,
      "severity": "error",
      "detail": "DEPLOY_MODE=- should be auto, systemd, or docker",
      "value": ""
    },
    {
      "check": "env_public_dashboard_url_valid",
      "ok": false,
      "severity": "error",
      "detail": "PUBLIC_DASHBOARD_URL is missing or invalid",
      "value": ""
    }
  ],
  "open_public_dashboard_checks": [],
  "open_telegram_content_checks": [
    {
      "check": "telegram_decision_digest_present",
      "ok": false,
      "severity": "error",
      "detail": "top_buy_theme=",
      "digest_summary": {
        "date": "2026-06-27",
        "stance": "テーマ分散で強めに監視",
        "high_conviction_buy": 0,
        "crowded_watch": 0,
        "risk_triggers": 5,
        "company_focus": 0,
        "top_buy_theme": "",
        "top_crowded_theme": "",
        "top_risk_theme": "スタートアップ・イノベーション"
      }
    }
  ],
  "warning_deployment_checks": [
    {
      "check": "env_file_present",
      "ok": false,
      "severity": "warning",
      "detail": "env_file=/app/.env exists=False",
      "path": "/app/.env",
      "keys": []
    },
    {
      "check": "env_python_bin",
      "ok": false,
      "severity": "warning",
      "detail": "PYTHON_BIN is not set",
      "key": "PYTHON_BIN",
      "value": ""
    },
    {
      "check": "env_run_limit",
      "ok": false,
      "severity": "warning",
      "detail": "RUN_LIMIT is not set",
      "key": "RUN_LIMIT",
      "value": ""
    },
    {
      "check": "env_fetch_limit",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_LIMIT is not set",
      "key": "FETCH_LIMIT",
      "value": ""
    },
    {
      "check": "env_fetch_timeout",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_TIMEOUT is not set",
      "key": "FETCH_TIMEOUT",
      "value": ""
    },
    {
      "check": "env_fetch_http_retries",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_HTTP_RETRIES is not set",
      "key": "FETCH_HTTP_RETRIES",
      "value": ""
    },
    {
      "check": "env_source_sleep",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_SLEEP is not set",
      "key": "SOURCE_SLEEP",
      "value": ""
    },
    {
      "check": "env_priority_scan_limit",
      "ok": false,
      "severity": "warning",
      "detail": "PRIORITY_SCAN_LIMIT is not set",
      "key": "PRIORITY_SCAN_LIMIT",
      "value": ""
    },
    {
      "check": "env_report_limit",
      "ok": false,
      "severity": "warning",
      "detail": "REPORT_LIMIT is not set",
      "key": "REPORT_LIMIT",
      "value": ""
    },
    {
      "check": "env_health_pending_threshold",
      "ok": false,
      "severity": "warning",
      "detail": "HEALTH_PENDING_THRESHOLD is not set",
      "key": "HEALTH_PENDING_THRESHOLD",
      "value": ""
    },
    {
      "check": "env_health_backlog_limit",
      "ok": false,
      "severity": "warning",
      "detail": "HEALTH_BACKLOG_LIMIT is not set",
      "key": "HEALTH_BACKLOG_LIMIT",
      "value": ""
    },
    {
      "check": "env_source_freshness_max_checked_age_hours",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_FRESHNESS_MAX_CHECKED_AGE_HOURS is not set",
      "key": "SOURCE_FRESHNESS_MAX_CHECKED_AGE_HOURS",
      "value": ""
    },
    {
      "check": "env_source_freshness_stale_document_days",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_FRESHNESS_STALE_DOCUMENT_DAYS is not set",
      "key": "SOURCE_FRESHNESS_STALE_DOCUMENT_DAYS",
      "value": ""
    },
    {
      "check": "env_source_freshness_max_error_count",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_FRESHNESS_MAX_ERROR_COUNT is not set",
      "key": "SOURCE_FRESHNESS_MAX_ERROR_COUNT",
      "value": ""
    },
    {
      "check": "env_source_freshness_max_fetch_error_rate",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_FRESHNESS_MAX_FETCH_ERROR_RATE is not set",
      "key": "SOURCE_FRESHNESS_MAX_FETCH_ERROR_RATE",
      "value": ""
    },
    {
      "check": "env_fetch_error_triage_limit",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_ERROR_TRIAGE_LIMIT is not set",
      "key": "FETCH_ERROR_TRIAGE_LIMIT",
      "value": ""
    },
    {
      "check": "env_fetch_error_triage_sample_limit",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_ERROR_TRIAGE_SAMPLE_LIMIT is not set",
      "key": "FETCH_ERROR_TRIAGE_SAMPLE_LIMIT",
      "value": ""
    },
    {
      "check": "env_fetch_error_retry_limit",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_ERROR_RETRY_LIMIT is not set",
      "key": "FETCH_ERROR_RETRY_LIMIT",
      "value": ""
    },
    {
      "check": "env_fetch_error_retry_categories",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_ERROR_RETRY_CATEGORIES is not set",
      "key": "FETCH_ERROR_RETRY_CATEGORIES",
      "value": ""
    },
    {
      "check": "env_fetch_error_retry_sleep",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_ERROR_RETRY_SLEEP is not set",
      "key": "FETCH_ERROR_RETRY_SLEEP",
      "value": ""
    },
    {
      "check": "env_rss_metadata_backfill_limit",
      "ok": false,
      "severity": "warning",
      "detail": "RSS_METADATA_BACKFILL_LIMIT is not set",
      "key": "RSS_METADATA_BACKFILL_LIMIT",
      "value": ""
    },
    {
      "check": "env_rss_metadata_backfill_analyze_limit",
      "ok": false,
      "severity": "warning",
      "detail": "RSS_METADATA_BACKFILL_ANALYZE_LIMIT is not set",
      "key": "RSS_METADATA_BACKFILL_ANALYZE_LIMIT",
      "value": ""
    },
    {
      "check": "env_quality_prune_limit",
      "ok": false,
      "severity": "warning",
      "detail": "QUALITY_PRUNE_LIMIT is not set",
      "key": "QUALITY_PRUNE_LIMIT",
      "value": ""
    },
    {
      "check": "env_quality_prune_min_analysis_chars",
      "ok": false,
      "severity": "warning",
      "detail": "QUALITY_PRUNE_MIN_ANALYSIS_CHARS is not set",
      "key": "QUALITY_PRUNE_MIN_ANALYSIS_CHARS",
      "value": ""
    },
    {
      "check": "env_source_candidates_check_enabled",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_CANDIDATES_CHECK_ENABLED is not set",
      "key": "SOURCE_CANDIDATES_CHECK_ENABLED",
      "value": ""
    },
    {
      "check": "env_source_candidates_auto_promote",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_CANDIDATES_AUTO_PROMOTE is not set",
      "key": "SOURCE_CANDIDATES_AUTO_PROMOTE",
      "value": ""
    },
    {
      "check": "env_source_candidates_min_candidates",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_CANDIDATES_MIN_CANDIDATES is not set",
      "key": "SOURCE_CANDIDATES_MIN_CANDIDATES",
      "value": ""
    },
    {
      "check": "env_source_candidates_min_source_weight",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_CANDIDATES_MIN_SOURCE_WEIGHT is not set",
      "key": "SOURCE_CANDIDATES_MIN_SOURCE_WEIGHT",
      "value": ""
    },
    {
      "check": "env_source_candidates_max_promotions",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_CANDIDATES_MAX_PROMOTIONS is not set",
      "key": "SOURCE_CANDIDATES_MAX_PROMOTIONS",
      "value": ""
    },
    {
      "check": "env_source_candidates_http_timeout",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_CANDIDATES_HTTP_TIMEOUT is not set",
      "key": "SOURCE_CANDIDATES_HTTP_TIMEOUT",
      "value": ""
    },
    {
      "check": "env_source_candidates_http_retries",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_CANDIDATES_HTTP_RETRIES is not set",
      "key": "SOURCE_CANDIDATES_HTTP_RETRIES",
      "value": ""
    },
    {
      "check": "env_source_candidates_sleep",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_CANDIDATES_SLEEP is not set",
      "key": "SOURCE_CANDIDATES_SLEEP",
      "value": ""
    },
    {
      "check": "env_backup_enabled",
      "ok": false,
      "severity": "warning",
      "detail": "BACKUP_ENABLED is not set",
      "key": "BACKUP_ENABLED",
      "value": ""
    },
    {
      "check": "env_backup_keep",
      "ok": false,
      "severity": "warning",
      "detail": "BACKUP_KEEP is not set",
      "key": "BACKUP_KEEP",
      "value": ""
    },
    {
      "check": "env_telegram_credentials",
      "ok": false,
      "severity": "warning",
      "detail": "missing Telegram env: TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID",
      "missing": [
        "TELEGRAM_BOT_TOKEN",
        "TELEGRAM_CHAT_ID"
      ]
    },
    {
      "check": "env_public_dashboard_url",
      "ok": false,
      "severity": "warning",
      "detail": "PUBLIC_DASHBOARD_URL is not set",
      "value": ""
    }
  ],
  "warning_readiness_checks": [
    {
      "check": "source_errors_clear",
      "ok": false,
      "severity": "warning",
      "detail": "3 sources have accumulated errors",
      "source_errors": [
        {
          "source_id": "gsi_news",
          "error_count": 10,
          "last_error": "<urlopen error [SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1016)>"
        },
        {
          "source_id": "iea_reports",
          "error_count": 10,
          "last_error": "HTTP Error 403: Forbidden"
        },
        {
          "source_id": "nuveen_investment_outlook",
          "error_count": 10,
          "last_error": "The read operation timed out"
        }
      ]
    },
    {
      "check": "daily_scheduler_installed",
      "ok": false,
      "severity": "warning",
      "detail": "systemd scheduler artifact exists=False",
      "platform": "linux",
      "scheduler": "systemd",
      "service_path": "/etc/systemd/system/market-intel.service",
      "timer_path": "/etc/systemd/system/market-intel.timer",
      "exists": false
    },
    {
      "check": "dependency_systemctl",
      "ok": false,
      "severity": "warning",
      "detail": "systemctl path=-",
      "command": "systemctl",
      "available": false,
      "path": null
    },
    {
      "check": "dependency_nginx",
      "ok": false,
      "severity": "warning",
      "detail": "nginx path=-",
      "command": "nginx",
      "available": false,
      "path": null
    }
  ],
  "warning_env_checks": [
    {
      "check": "env_required_python_bin",
      "ok": false,
      "severity": "warning",
      "detail": "PYTHON_BIN is not set",
      "key": "PYTHON_BIN",
      "value": ""
    },
    {
      "check": "env_required_lock_file",
      "ok": false,
      "severity": "warning",
      "detail": "LOCK_FILE is not set",
      "key": "LOCK_FILE",
      "value": ""
    },
    {
      "check": "env_required_run_limit",
      "ok": false,
      "severity": "warning",
      "detail": "RUN_LIMIT is not set",
      "key": "RUN_LIMIT",
      "value": ""
    },
    {
      "check": "env_required_fetch_limit",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_LIMIT is not set",
      "key": "FETCH_LIMIT",
      "value": ""
    },
    {
      "check": "env_required_fetch_timeout",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_TIMEOUT is not set",
      "key": "FETCH_TIMEOUT",
      "value": ""
    },
    {
      "check": "env_required_fetch_http_retries",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_HTTP_RETRIES is not set",
      "key": "FETCH_HTTP_RETRIES",
      "value": ""
    },
    {
      "check": "env_required_source_sleep",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_SLEEP is not set",
      "key": "SOURCE_SLEEP",
      "value": ""
    },
    {
      "check": "env_required_report_limit",
      "ok": false,
      "severity": "warning",
      "detail": "REPORT_LIMIT is not set",
      "key": "REPORT_LIMIT",
      "value": ""
    },
    {
      "check": "env_required_priority_scan_limit",
      "ok": false,
      "severity": "warning",
      "detail": "PRIORITY_SCAN_LIMIT is not set",
      "key": "PRIORITY_SCAN_LIMIT",
      "value": ""
    },
    {
      "check": "env_required_health_pending_threshold",
      "ok": false,
      "severity": "warning",
      "detail": "HEALTH_PENDING_THRESHOLD is not set",
      "key": "HEALTH_PENDING_THRESHOLD",
      "value": ""
    },
    {
      "check": "env_required_health_backlog_limit",
      "ok": false,
      "severity": "warning",
      "detail": "HEALTH_BACKLOG_LIMIT is not set",
      "key": "HEALTH_BACKLOG_LIMIT",
      "value": ""
    },
    {
      "check": "env_required_ops_monitor_window_days",
      "ok": false,
      "severity": "warning",
      "detail": "OPS_MONITOR_WINDOW_DAYS is not set",
      "key": "OPS_MONITOR_WINDOW_DAYS",
      "value": ""
    },
    {
      "check": "env_required_ops_monitor_max_latest_age_hours",
      "ok": false,
      "severity": "warning",
      "detail": "OPS_MONITOR_MAX_LATEST_AGE_HOURS is not set",
      "key": "OPS_MONITOR_MAX_LATEST_AGE_HOURS",
      "value": ""
    },
    {
      "check": "env_required_ops_monitor_min_success_days",
      "ok": false,
      "severity": "warning",
      "detail": "OPS_MONITOR_MIN_SUCCESS_DAYS is not set",
      "key": "OPS_MONITOR_MIN_SUCCESS_DAYS",
      "value": ""
    },
    {
      "check": "env_required_ops_monitor_max_zero_output_runs",
      "ok": false,
      "severity": "warning",
      "detail": "OPS_MONITOR_MAX_ZERO_OUTPUT_RUNS is not set",
      "key": "OPS_MONITOR_MAX_ZERO_OUTPUT_RUNS",
      "value": ""
    },
    {
      "check": "env_required_ops_monitor_min_sources_checked",
      "ok": false,
      "severity": "warning",
      "detail": "OPS_MONITOR_MIN_SOURCES_CHECKED is not set",
      "key": "OPS_MONITOR_MIN_SOURCES_CHECKED",
      "value": ""
    },
    {
      "check": "env_required_source_freshness_max_checked_age_hours",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_FRESHNESS_MAX_CHECKED_AGE_HOURS is not set",
      "key": "SOURCE_FRESHNESS_MAX_CHECKED_AGE_HOURS",
      "value": ""
    },
    {
      "check": "env_required_source_freshness_stale_document_days",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_FRESHNESS_STALE_DOCUMENT_DAYS is not set",
      "key": "SOURCE_FRESHNESS_STALE_DOCUMENT_DAYS",
      "value": ""
    },
    {
      "check": "env_required_source_freshness_max_error_count",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_FRESHNESS_MAX_ERROR_COUNT is not set",
      "key": "SOURCE_FRESHNESS_MAX_ERROR_COUNT",
      "value": ""
    },
    {
      "check": "env_required_source_freshness_max_fetch_error_rate",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_FRESHNESS_MAX_FETCH_ERROR_RATE is not set",
      "key": "SOURCE_FRESHNESS_MAX_FETCH_ERROR_RATE",
      "value": ""
    },
    {
      "check": "env_required_fetch_error_triage_limit",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_ERROR_TRIAGE_LIMIT is not set",
      "key": "FETCH_ERROR_TRIAGE_LIMIT",
      "value": ""
    },
    {
      "check": "env_required_fetch_error_triage_sample_limit",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_ERROR_TRIAGE_SAMPLE_LIMIT is not set",
      "key": "FETCH_ERROR_TRIAGE_SAMPLE_LIMIT",
      "value": ""
    },
    {
      "check": "env_required_fetch_error_retry_limit",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_ERROR_RETRY_LIMIT is not set",
      "key": "FETCH_ERROR_RETRY_LIMIT",
      "value": ""
    },
    {
      "check": "env_required_fetch_error_retry_categories",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_ERROR_RETRY_CATEGORIES is not set",
      "key": "FETCH_ERROR_RETRY_CATEGORIES",
      "value": ""
    },
    {
      "check": "env_required_fetch_error_retry_sleep",
      "ok": false,
      "severity": "warning",
      "detail": "FETCH_ERROR_RETRY_SLEEP is not set",
      "key": "FETCH_ERROR_RETRY_SLEEP",
      "value": ""
    },
    {
      "check": "env_required_rss_metadata_backfill_limit",
      "ok": false,
      "severity": "warning",
      "detail": "RSS_METADATA_BACKFILL_LIMIT is not set",
      "key": "RSS_METADATA_BACKFILL_LIMIT",
      "value": ""
    },
    {
      "check": "env_required_rss_metadata_backfill_analyze_limit",
      "ok": false,
      "severity": "warning",
      "detail": "RSS_METADATA_BACKFILL_ANALYZE_LIMIT is not set",
      "key": "RSS_METADATA_BACKFILL_ANALYZE_LIMIT",
      "value": ""
    },
    {
      "check": "env_required_quality_prune_limit",
      "ok": false,
      "severity": "warning",
      "detail": "QUALITY_PRUNE_LIMIT is not set",
      "key": "QUALITY_PRUNE_LIMIT",
      "value": ""
    },
    {
      "check": "env_required_quality_prune_min_analysis_chars",
      "ok": false,
      "severity": "warning",
      "detail": "QUALITY_PRUNE_MIN_ANALYSIS_CHARS is not set",
      "key": "QUALITY_PRUNE_MIN_ANALYSIS_CHARS",
      "value": ""
    },
    {
      "check": "env_required_backup_enabled",
      "ok": false,
      "severity": "warning",
      "detail": "BACKUP_ENABLED is not set",
      "key": "BACKUP_ENABLED",
      "value": ""
    },
    {
      "check": "env_required_backup_keep",
      "ok": false,
      "severity": "warning",
      "detail": "BACKUP_KEEP is not set",
      "key": "BACKUP_KEEP",
      "value": ""
    },
    {
      "check": "env_required_deploy_service_name",
      "ok": false,
      "severity": "warning",
      "detail": "DEPLOY_SERVICE_NAME is not set",
      "key": "DEPLOY_SERVICE_NAME",
      "value": ""
    },
    {
      "check": "env_required_nginx_site_name",
      "ok": false,
      "severity": "warning",
      "detail": "NGINX_SITE_NAME is not set",
      "key": "NGINX_SITE_NAME",
      "value": ""
    },
    {
      "check": "env_required_deploy_mode",
      "ok": false,
      "severity": "warning",
      "detail": "DEPLOY_MODE is not set",
      "key": "DEPLOY_MODE",
      "value": ""
    },
    {
      "check": "env_required_source_candidates_min_source_weight",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_CANDIDATES_MIN_SOURCE_WEIGHT is not set",
      "key": "SOURCE_CANDIDATES_MIN_SOURCE_WEIGHT",
      "value": ""
    },
    {
      "check": "env_required_source_candidates_max_promotions",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_CANDIDATES_MAX_PROMOTIONS is not set",
      "key": "SOURCE_CANDIDATES_MAX_PROMOTIONS",
      "value": ""
    },
    {
      "check": "env_required_source_candidates_http_timeout",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_CANDIDATES_HTTP_TIMEOUT is not set",
      "key": "SOURCE_CANDIDATES_HTTP_TIMEOUT",
      "value": ""
    },
    {
      "check": "env_required_source_candidates_http_retries",
      "ok": false,
      "severity": "warning",
      "detail": "SOURCE_CANDIDATES_HTTP_RETRIES is not set",
      "key": "SOURCE_CANDIDATES_HTTP_RETRIES",
      "value": ""
    },
    {
      "check": "env_telegram_token_format",
      "ok": false,
      "severity": "warning",
      "detail": "TELEGRAM_BOT_TOKEN is missing or has an unexpected format",
      "value": ""
    },
    {
      "check": "env_telegram_chat_id_format",
      "ok": false,
      "severity": "warning",
      "detail": "TELEGRAM_CHAT_ID is missing or has an unexpected format",
      "value": ""
    }
  ],
  "warning_public_dashboard_checks": [],
  "warning_telegram_content_checks": [],
  "env_check": {
    "ok": false,
    "generated_at": "2026-06-26T21:33:42+00:00",
    "summary": {
      "errors": 3,
      "warnings": 40,
      "env_file": "/app/.env",
      "keys": [],
      "runtime_checks_included": true,
      "operator_inputs_ready": false,
      "operator_inputs_missing": [
        "VPS_HOST",
        "VPS_USER",
        "PUBLIC_DASHBOARD_URL",
        "TELEGRAM_BOT_TOKEN",
        "TELEGRAM_CHAT_ID",
        "DEPLOY_MODE"
      ],
      "operator_inputs_invalid": [
        "env_deploy_mode_valid",
        "env_public_dashboard_url_valid"
      ]
    },
    "checks": [
      {
        "check": "env_file_present",
        "ok": false,
        "severity": "error",
        "detail": "env_file=/app/.env exists=False",
        "path": "/app/.env"
      },
      {
        "check": "env_required_python_bin",
        "ok": false,
        "severity": "warning",
        "detail": "PYTHON_BIN is not set",
        "key": "PYTHON_BIN",
        "value": ""
      },
      {
        "check": "env_required_lock_file",
        "ok": false,
        "severity": "warning",
        "detail": "LOCK_FILE is not set",
        "key": "LOCK_FILE",
        "value": ""
      },
      {
        "check": "env_required_run_limit",
        "ok": false,
        "severity": "warning",
        "detail": "RUN_LIMIT is not set",
        "key": "RUN_LIMIT",
        "value": ""
      },
      {
        "check": "env_required_fetch_limit",
        "ok": false,
        "severity": "warning",
        "detail": "FETCH_LIMIT is not set",
        "key": "FETCH_LIMIT",
        "value": ""
      },
      {
        "check": "env_required_fetch_timeout",
        "ok": false,
        "severity": "warning",
        "detail": "FETCH_TIMEOUT is not set",
        "key": "FETCH_TIMEOUT",
        "value": ""
      },
      {
        "check": "env_required_fetch_http_retries",
        "ok": false,
        "severity": "warning",
        "detail": "FETCH_HTTP_RETRIES is not set",
        "key": "FETCH_HTTP_RETRIES",
        "value": ""
      },
      {
        "check": "env_required_source_sleep",
        "ok": false,
        "severity": "warning",
        "detail": "SOURCE_SLEEP is not set",
        "key": "SOURCE_SLEEP",
        "value": ""
      },
      {
        "check": "env_required_report_limit",
        "ok": false,
        "severity": "warning",
        "detail": "REPORT_LIMIT is not set",
        "key": "REPORT_LIMIT",
        "value": ""
      },
      {
        "check": "env_required_priority_scan_limit",
        "ok": false,
        "severity": "warning",
        "detail": "PRIORITY_SCAN_LIMIT is not set",
        "key": "PRIORITY_SCAN_LIMIT",
        "value": ""
      },
      {
        "check": "env_required_health_pending_threshold",
        "ok": false,
        "severity": "warning",
        "detail": "HEALTH_PENDING_THRESHOLD is not set",
        "key": "HEALTH_PENDING_THRESHOLD",
        "value": ""
      },
      {
        "check": "env_required_health_backlog_limit",
        "ok": false,
        "severity": "warning",
        "detail": "HEALTH_BACKLOG_LIMIT is not set",
        "key": "HEALTH_BACKLOG_LIMIT",
        "value": ""
      },
      {
        "check": "env_required_ops_monitor_window_days",
        "ok": false,
        "severity": "warning",
        "detail": "OPS_MONITOR_WINDOW_DAYS is not set",
        "key": "OPS_MONITOR_WINDOW_DAYS",
        "value": ""
      },
      {
        "check": "env_required_ops_monitor_max_latest_age_hours",
        "ok": false,
        "severity": "warning",
        "detail": "OPS_MONITOR_MAX_LATEST_AGE_HOURS is not set",
        "key": "OPS_MONITOR_MAX_LATEST_AGE_HOURS",
        "value": ""
      },
      {
        "check": "env_required_ops_monitor_min_success_days",
        "ok": false,
        "severity": "warning",
        "detail": "OPS_MONITOR_MIN_SUCCESS_DAYS is not set",
        "key": "OPS_MONITOR_MIN_SUCCESS_DAYS",
        "value": ""
      },
      {
        "check": "env_required_ops_monitor_max_zero_output_runs",
        "ok": false,
        "severity": "warning",
        "detail": "OPS_MONITOR_MAX_ZERO_OUTPUT_RUNS is not set",
        "key": "OPS_MONITOR_MAX_ZERO_OUTPUT_RUNS",
        "value": ""
      },
      {
        "check": "env_required_ops_monitor_min_sources_checked",
        "ok": false,
        "severity": "warning",
        "detail": "OPS_MONITOR_MIN_SOURCES_CHECKED is not set",
        "key": "OPS_MONITOR_MIN_SOURCES_CHECKED",
        "value": ""
      },
      {
        "check": "env_required_source_freshness_max_checked_age_hours",
        "ok": false,
        "severity": "warning",
        "detail": "SOURCE_FRESHNESS_MAX_CHECKED_AGE_HOURS is not set",
        "key": "SOURCE_FRESHNESS_MAX_CHECKED_AGE_HOURS",
        "value": ""
      },
      {
        "check": "env_required_source_freshness_stale_document_days",
        "ok": false,
        "severity": "warning",
        "detail": "SOURCE_FRESHNESS_STALE_DOCUMENT_DAYS is not set",
        "key": "SOURCE_FRESHNESS_STALE_DOCUMENT_DAYS",
        "value": ""
      },
      {
        "check": "env_required_source_freshness_max_error_count",
        "ok": false,
        "severity": "warning",
        "detail": "SOURCE_FRESHNESS_MAX_ERROR_COUNT is not set",
        "key": "SOURCE_FRESHNESS_MAX_ERROR_COUNT",
        "value": ""
      },
      {
        "check": "env_required_source_freshness_max_fetch_error_rate",
        "ok": false,
        "severity": "warning",
        "detail": "SOURCE_FRESHNESS_MAX_FETCH_ERROR_RATE is not set",
        "key": "SOURCE_FRESHNESS_MAX_FETCH_ERROR_RATE",
        "value": ""
      },
      {
        "check": "env_required_fetch_error_triage_limit",
        "ok": false,
        "severity": "warning",
        "detail": "FETCH_ERROR_TRIAGE_LIMIT is not set",
        "key": "FETCH_ERROR_TRIAGE_LIMIT",
        "value": ""
      },
      {
        "check": "env_required_fetch_error_triage_sample_limit",
        "ok": false,
        "severity": "warning",
        "detail": "FETCH_ERROR_TRIAGE_SAMPLE_LIMIT is not set",
        "key": "FETCH_ERROR_TRIAGE_SAMPLE_LIMIT",
        "value": ""
      },
      {
        "check": "env_required_fetch_error_retry_limit",
        "ok": false,
        "severity": "warning",
        "detail": "FETCH_ERROR_RETRY_LIMIT is not set",
        "key": "FETCH_ERROR_RETRY_LIMIT",
        "value": ""
      },
      {
        "check": "env_required_fetch_error_retry_categories",
        "ok": false,
        "severity": "warning",
        "detail": "FETCH_ERROR_RETRY_CATEGORIES is not set",
        "key": "FETCH_ERROR_RETRY_CATEGORIES",
        "value": ""
      },
      {
        "check": "env_required_fetch_error_retry_sleep",
        "ok": false,
        "severity": "warning",
        "detail": "FETCH_ERROR_RETRY_SLEEP is not set",
        "key": "FETCH_ERROR_RETRY_SLEEP",
        "value": ""
      },
      {
        "check": "env_required_rss_metadata_backfill_limit",
        "ok": false,
        "severity": "warning",
        "detail": "RSS_METADATA_BACKFILL_LIMIT is not set",
        "key": "RSS_METADATA_BACKFILL_LIMIT",
        "value": ""
      },
      {
        "check": "env_required_rss_metadata_backfill_analyze_limit",
        "ok": false,
        "severity": "warning",
        "detail": "RSS_METADATA_BACKFILL_ANALYZE_LIMIT is not set",
        "key": "RSS_METADATA_BACKFILL_ANALYZE_LIMIT",
        "value": ""
      },
      {
        "check": "env_required_quality_prune_limit",
        "ok": false,
        "severity": "warning",
        "detail": "QUALITY_PRUNE_LIMIT is not set",
        "key": "QUALITY_PRUNE_LIMIT",
        "value": ""
      },
      {
        "check": "env_required_quality_prune_min_analysis_chars",
        "ok": false,
        "severity": "warning",
        "detail": "QUALITY_PRUNE_MIN_ANALYSIS_CHARS is not set",
        "key": "QUALITY_PRUNE_MIN_ANALYSIS_CHARS",
        "value": ""
      },
      {
        "check": "env_required_backup_enabled",
        "ok": false,
        "severity": "warning",
        "detail": "BACKUP_ENABLED is not set",
        "key": "BACKUP_ENABLED",
        "value": ""
      },
      {
        "check": "env_required_backup_keep",
        "ok": false,
        "severity": "warning",
        "detail": "BACKUP_KEEP is not set",
        "key": "BACKUP_KEEP",
        "value": ""
      },
      {
        "check": "env_required_deploy_service_name",
        "ok": false,
        "severity": "warning",
        "detail": "DEPLOY_SERVICE_NAME is not set",
        "key": "DEPLOY_SERVICE_NAME",
        "value": ""
      },
      {
        "check": "env_required_nginx_site_name",
        "ok": false,
        "severity": "warning",
        "detail": "NGINX_SITE_NAME is not set",
        "key": "NGINX_SITE_NAME",
        "value": ""
      },
      {
        "check": "env_required_deploy_mode",
        "ok": false,
        "severity": "warning",
        "detail": "DEPLOY_MODE is not set",
        "key": "DEPLOY_MODE",
        "value": ""
      },
      {
        "check": "env_required_source_candidates_min_source_weight",
        "ok": false,
        "severity": "warning",
        "detail": "SOURCE_CANDIDATES_MIN_SOURCE_WEIGHT is not set",
        "key": "SOURCE_CANDIDATES_MIN_SOURCE_WEIGHT",
        "value": ""
      },
      {
        "check": "env_required_source_candidates_max_promotions",
        "ok": false,
        "severity": "warning",
        "detail": "SOURCE_CANDIDATES_MAX_PROMOTIONS is not set",
        "key": "SOURCE_CANDIDATES_MAX_PROMOTIONS",
        "value": ""
      },
      {
        "check": "env_required_source_candidates_http_timeout",
        "ok": false,
        "severity": "warning",
        "detail": "SOURCE_CANDIDATES_HTTP_TIMEOUT is not set",
        "key": "SOURCE_CANDIDATES_HTTP_TIMEOUT",
        "value": ""
      },
      {
        "check": "env_required_source_candidates_http_retries",
        "ok": false,
        "severity": "warning",
        "detail": "SOURCE_CANDIDATES_HTTP_RETRIES is not set",
        "key": "SOURCE_CANDIDATES_HTTP_RETRIES",
        "value": ""
      },
      {
        "check": "env_deploy_mode_valid",
        "ok": false,
        "severity": "error",
        "detail": "DEPLOY_MODE=- should be auto, systemd, or docker",
        "value": ""
      },
      {
        "check": "env_deploy_mode_production_specific",
        "ok": true,
        "severity": "warning",
        "detail": "DEPLOY_MODE=auto is allowed for local checks; use systemd or docker for production",
        "value": ""
      },
      {
        "check": "env_public_dashboard_url_valid",
        "ok": false,
        "severity": "error",
        "detail": "PUBLIC_DASHBOARD_URL is missing or invalid",
        "value": ""
      },
      {
        "check": "env_telegram_token_format",
        "ok": false,
        "severity": "warning",
        "detail": "TELEGRAM_BOT_TOKEN is missing or has an unexpected format",
        "value": ""
      },
      {
        "check": "env_telegram_chat_id_format",
        "ok": false,
        "severity": "warning",
        "detail": "TELEGRAM_CHAT_ID is missing or has an unexpected format",
        "value": ""
      }
    ],
    "redacted_env": {}
  },
  "public_dashboard_check": {
    "ok": true,
    "strict": false,
    "generated_at": "2026-06-26T21:33:45+00:00",
    "summary": {
      "errors": 0,
      "warnings": 0,
      "configured_url": "https://35-221-72-238.sslip.io/dashboard.html",
      "base_url": "https://35-221-72-238.sslip.io/",
      "endpoint_count": 36
    },
    "checks": [
      {
        "check": "public_dashboard_url_configured",
        "ok": true,
        "severity": "error",
        "detail": "PUBLIC_DASHBOARD_URL=https://35-221-72-238.sslip.io/dashboard.html",
        "configured_url": "https://35-221-72-238.sslip.io/dashboard.html",
        "base_url": "https://35-221-72-238.sslip.io/"
      },
      {
        "check": "public_dashboard_html",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/dashboard.html status=200 title_found=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "text/html",
          "size": 332280,
          "url": "https://35-221-72-238.sslip.io/dashboard.html",
          "contains_dashboard_title": true
        }
      },
      {
        "check": "public_json_dashboard_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/dashboard.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 5811693,
          "url": "https://35-221-72-238.sslip.io/dashboard.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_dashboard_content_check_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/dashboard_content_check.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 22747,
          "url": "https://35-221-72-238.sslip.io/dashboard_content_check.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_health_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/health.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 42262,
          "url": "https://35-221-72-238.sslip.io/health.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_env_check_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/env_check.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 10406,
          "url": "https://35-221-72-238.sslip.io/env_check.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_operator_input_check_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/operator_input_check.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 2991,
          "url": "https://35-221-72-238.sslip.io/operator_input_check.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_quality_prune_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/quality_prune.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 10646,
          "url": "https://35-221-72-238.sslip.io/quality_prune.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_source_candidates_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/source_candidates.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 30604,
          "url": "https://35-221-72-238.sslip.io/source_candidates.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_source_promotion_plan_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/source_promotion_plan.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 4892,
          "url": "https://35-221-72-238.sslip.io/source_promotion_plan.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_source_opportunity_radar_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/source_opportunity_radar.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 30972,
          "url": "https://35-221-72-238.sslip.io/source_opportunity_radar.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_source_target_reference_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/source_target_reference.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 7876,
          "url": "https://35-221-72-238.sslip.io/source_target_reference.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_telegram_notify_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/telegram_notify.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 4362,
          "url": "https://35-221-72-238.sslip.io/telegram_notify.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_telegram_content_check_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/telegram_content_check.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 9598,
          "url": "https://35-221-72-238.sslip.io/telegram_content_check.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_strategy_playbook_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/strategy_playbook.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 275008,
          "url": "https://35-221-72-238.sslip.io/strategy_playbook.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_strategy_lenses_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/strategy_lenses.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 42828,
          "url": "https://35-221-72-238.sslip.io/strategy_lenses.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_strategy_reuse_audit_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/strategy_reuse_audit.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 10557,
          "url": "https://35-221-72-238.sslip.io/strategy_reuse_audit.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_strategy_export_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/strategy_export.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 560925,
          "url": "https://35-221-72-238.sslip.io/strategy_export.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_weekly_market_strategy_report_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/weekly_market_strategy_report.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 355631,
          "url": "https://35-221-72-238.sslip.io/weekly_market_strategy_report.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_production_audit_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/production_audit.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 997028,
          "url": "https://35-221-72-238.sslip.io/production_audit.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_source_coverage_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/source_coverage.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 80038,
          "url": "https://35-221-72-238.sslip.io/source_coverage.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_market_source_coverage_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/market_source_coverage.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 82797,
          "url": "https://35-221-72-238.sslip.io/market_source_coverage.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_analysis_audit_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/analysis_audit.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 13311,
          "url": "https://35-221-72-238.sslip.io/analysis_audit.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_requirements_audit_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/requirements_audit.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 231652,
          "url": "https://35-221-72-238.sslip.io/requirements_audit.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_deployment_check_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/deployment_check.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 31725,
          "url": "https://35-221-72-238.sslip.io/deployment_check.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_readiness_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/readiness.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 237693,
          "url": "https://35-221-72-238.sslip.io/readiness.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_ops_handoff_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/ops_handoff.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 100836,
          "url": "https://35-221-72-238.sslip.io/ops_handoff.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_ops_monitor_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/ops_monitor.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 9466,
          "url": "https://35-221-72-238.sslip.io/ops_monitor.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_daily_lock_audit_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/daily_lock_audit.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 3452,
          "url": "https://35-221-72-238.sslip.io/daily_lock_audit.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_ops_snapshot_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/ops_snapshot.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 10522,
          "url": "https://35-221-72-238.sslip.io/ops_snapshot.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_source_freshness_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/source_freshness.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 162032,
          "url": "https://35-221-72-238.sslip.io/source_freshness.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_fetch_error_triage_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/fetch_error_triage.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 25770,
          "url": "https://35-221-72-238.sslip.io/fetch_error_triage.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_fetch_error_retry_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/fetch_error_retry.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 305,
          "url": "https://35-221-72-238.sslip.io/fetch_error_retry.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_rss_metadata_backfill_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/rss_metadata_backfill.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 1416,
          "url": "https://35-221-72-238.sslip.io/rss_metadata_backfill.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_go_live_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/go_live.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 35642,
          "url": "https://35-221-72-238.sslip.io/go_live.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_deploy_release_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/deploy_release.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 40586,
          "url": "https://35-221-72-238.sslip.io/deploy_release.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_json_release_upload_bundle_check_json",
        "ok": true,
        "severity": "error",
        "detail": "https://35-221-72-238.sslip.io/release_upload_bundle_check.json status=200 valid_json=True",
        "probe": {
          "ok": true,
          "status": 200,
          "content_type": "application/json",
          "size": 54838,
          "url": "https://35-221-72-238.sslip.io/release_upload_bundle_check.json",
          "valid_json": true,
          "parsed_type": "dict"
        }
      },
      {
        "check": "public_dashboard_release_sha_current",
        "ok": true,
        "severity": "error",
        "detail": "deploy_release_sha=b32e3e95 html_has_sha=True",
        "package_sha256": "b32e3e95beb3b1510238b1838b6c56b924b7f4e2d7acc79a7a810bbedc33bfa3"
      }
    ],
    "endpoints": {
      "dashboard.html": {
        "ok": true,
        "status": 200,
        "content_type": "text/html",
        "size": 332280,
        "url": "https://35-221-72-238.sslip.io/dashboard.html",
        "contains_dashboard_title": true
      },
      "dashboard.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 5811693,
        "url": "https://35-221-72-238.sslip.io/dashboard.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "dashboard_content_check.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 22747,
        "url": "https://35-221-72-238.sslip.io/dashboard_content_check.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "health.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 42262,
        "url": "https://35-221-72-238.sslip.io/health.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "env_check.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 10406,
        "url": "https://35-221-72-238.sslip.io/env_check.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "operator_input_check.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 2991,
        "url": "https://35-221-72-238.sslip.io/operator_input_check.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "quality_prune.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 10646,
        "url": "https://35-221-72-238.sslip.io/quality_prune.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "source_candidates.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 30604,
        "url": "https://35-221-72-238.sslip.io/source_candidates.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "source_promotion_plan.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 4892,
        "url": "https://35-221-72-238.sslip.io/source_promotion_plan.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "source_opportunity_radar.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 30972,
        "url": "https://35-221-72-238.sslip.io/source_opportunity_radar.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "source_target_reference.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 7876,
        "url": "https://35-221-72-238.sslip.io/source_target_reference.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "telegram_notify.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 4362,
        "url": "https://35-221-72-238.sslip.io/telegram_notify.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "telegram_content_check.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 9598,
        "url": "https://35-221-72-238.sslip.io/telegram_content_check.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "strategy_playbook.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 275008,
        "url": "https://35-221-72-238.sslip.io/strategy_playbook.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "strategy_lenses.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 42828,
        "url": "https://35-221-72-238.sslip.io/strategy_lenses.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "strategy_reuse_audit.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 10557,
        "url": "https://35-221-72-238.sslip.io/strategy_reuse_audit.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "strategy_export.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 560925,
        "url": "https://35-221-72-238.sslip.io/strategy_export.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "weekly_market_strategy_report.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 355631,
        "url": "https://35-221-72-238.sslip.io/weekly_market_strategy_report.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "production_audit.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 997028,
        "url": "https://35-221-72-238.sslip.io/production_audit.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "source_coverage.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 80038,
        "url": "https://35-221-72-238.sslip.io/source_coverage.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "market_source_coverage.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 82797,
        "url": "https://35-221-72-238.sslip.io/market_source_coverage.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "analysis_audit.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 13311,
        "url": "https://35-221-72-238.sslip.io/analysis_audit.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "requirements_audit.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 231652,
        "url": "https://35-221-72-238.sslip.io/requirements_audit.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "deployment_check.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 31725,
        "url": "https://35-221-72-238.sslip.io/deployment_check.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "readiness.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 237693,
        "url": "https://35-221-72-238.sslip.io/readiness.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "ops_handoff.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 100836,
        "url": "https://35-221-72-238.sslip.io/ops_handoff.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "ops_monitor.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 9466,
        "url": "https://35-221-72-238.sslip.io/ops_monitor.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "daily_lock_audit.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 3452,
        "url": "https://35-221-72-238.sslip.io/daily_lock_audit.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "ops_snapshot.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 10522,
        "url": "https://35-221-72-238.sslip.io/ops_snapshot.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "source_freshness.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 162032,
        "url": "https://35-221-72-238.sslip.io/source_freshness.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "fetch_error_triage.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 25770,
        "url": "https://35-221-72-238.sslip.io/fetch_error_triage.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "fetch_error_retry.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 305,
        "url": "https://35-221-72-238.sslip.io/fetch_error_retry.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "rss_metadata_backfill.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 1416,
        "url": "https://35-221-72-238.sslip.io/rss_metadata_backfill.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "go_live.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 35642,
        "url": "https://35-221-72-238.sslip.io/go_live.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "deploy_release.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 40586,
        "url": "https://35-221-72-238.sslip.io/deploy_release.json",
        "valid_json": true,
        "parsed_type": "dict"
      },
      "release_upload_bundle_check.json": {
        "ok": true,
        "status": 200,
        "content_type": "application/json",
        "size": 54838,
        "url": "https://35-221-72-238.sslip.io/release_upload_bundle_check.json",
        "valid_json": true,
        "parsed_type": "dict"
      }
    }
  },
  "telegram_content_check": {
    "ok": false,
    "strict": false,
    "generated_at": "2026-06-26T21:33:45+00:00",
    "summary": {
      "errors": 1,
      "warnings": 0,
      "date": "2026-06-27",
      "message_length": 1862,
      "themes": 5,
      "companies": 15,
      "dashboard_url_configured": true,
      "dashboard_url_ok": true,
      "decision_digest_top_buy_theme": "",
      "source_coverage_targets": 59,
      "source_coverage_active": 59,
      "market_source_coverage_targets": 70,
      "market_source_coverage_active": 70,
      "source_followup_sources": 8,
      "source_followup_counts": {
        "fetch_error": 8
      }
    },
    "checks": [
      {
        "check": "telegram_message_length",
        "ok": true,
        "severity": "error",
        "detail": "message_length=1862, max=3900",
        "message_length": 1862
      },
      {
        "check": "telegram_strategy_sections_present",
        "ok": true,
        "severity": "error",
        "detail": "missing sections=[]",
        "missing_terms": []
      },
      {
        "check": "telegram_theme_count",
        "ok": true,
        "severity": "error",
        "detail": "themes=5, minimum=3",
        "theme_count": 5
      },
      {
        "check": "telegram_company_count",
        "ok": true,
        "severity": "error",
        "detail": "companies=15, minimum=3",
        "company_count": 15
      },
      {
        "check": "telegram_time_horizon_present",
        "ok": true,
        "severity": "error",
        "detail": "missing horizon terms=[]",
        "missing_terms": []
      },
      {
        "check": "telegram_scores_present",
        "ok": true,
        "severity": "error",
        "detail": "missing score terms=[]",
        "missing_terms": []
      },
      {
        "check": "telegram_related_tickers_present",
        "ok": true,
        "severity": "error",
        "detail": "ticker_hits=6, expected=3",
        "ticker_hits": [
          "9613.T",
          "6501.T",
          "9984.T",
          "6701.T",
          "9719.T",
          "9432.T"
        ]
      },
      {
        "check": "telegram_decision_digest_present",
        "ok": false,
        "severity": "error",
        "detail": "top_buy_theme=",
        "digest_summary": {
          "date": "2026-06-27",
          "stance": "テーマ分散で強めに監視",
          "high_conviction_buy": 0,
          "crowded_watch": 0,
          "risk_triggers": 5,
          "company_focus": 0,
          "top_buy_theme": "",
          "top_crowded_theme": "",
          "top_risk_theme": "スタートアップ・イノベーション"
        }
      },
      {
        "check": "telegram_government_coverage_present",
        "ok": true,
        "severity": "error",
        "detail": "targets=59 active=59",
        "coverage_summary": {
          "targets": 59,
          "active": 59,
          "active_monitoring_verified": 58,
          "active_monitoring_unverified": 1,
          "active_collection_verified": 59,
          "active_collection_unverified": 0,
          "candidate_only": 0,
          "missing": 0,
          "active_missing": 0,
          "high_missing": 0,
          "high_candidate_only": 0,
          "active_sources": 148,
          "candidate_sources": 16,
          "errors": 0,
          "warnings": 0,
          "category_count": 6
        }
      },
      {
        "check": "telegram_market_coverage_present",
        "ok": true,
        "severity": "error",
        "detail": "targets=70 active=70",
        "coverage_summary": {
          "targets": 70,
          "active": 70,
          "active_monitoring_verified": 68,
          "active_monitoring_unverified": 2,
          "active_collection_verified": 70,
          "active_collection_unverified": 0,
          "candidate_only": 0,
          "missing": 0,
          "active_missing": 0,
          "high_missing": 0,
          "high_candidate_only": 0,
          "active_sources": 148,
          "candidate_sources": 16,
          "errors": 0,
          "warnings": 0,
          "category_count": 9
        }
      },
      {
        "check": "telegram_source_followup_present",
        "ok": true,
        "severity": "error",
        "detail": "followup_sources=8",
        "source_freshness_summary": {
          "errors": 0,
          "warnings": 1,
          "active_sources": 148,
          "checked_recent": 148,
          "unchecked": 0,
          "stale_checked": 0,
          "source_error_rows": 3,
          "stale_or_quiet_sources": 0,
          "candidate_only_sources": 0,
          "covered_candidate_only_sources": 4,
          "silent_gap_sources": 0,
          "followup_sources": 8,
          "followup_counts": {
            "fetch_error": 8
          },
          "high_fetch_error_sources": 0,
          "documents_24h": 393,
          "documents_7d": 1843,
          "documents_30d": 13924,
          "inactive_state_rows": 11,
          "max_checked_age_hours": 30.0,
          "stale_document_days": 45
        },
        "followup_rows": [
          {
            "source_id": "mof_news_rss",
            "source_name": "財務省 新着情報RSS",
            "publisher_type": "government",
            "freshness_status": "ok",
            "followup_kind": "fetch_error",
            "followup_action": "取得エラー分類を確認し、リンク切れ以外のエラーを再取得・代替URLで処理してください。",
            "last_candidate_count": 40,
            "document_count": 529,
            "checked_age_hours": 0.18,
            "reason": ""
          },
          {
            "source_id": "oecd_ecoscope",
            "source_name": "OECD Ecoscope / Economic Outlook Blog",
            "publisher_type": "international_organization",
            "freshness_status": "ok",
            "followup_kind": "fetch_error",
            "followup_action": "取得エラー分類を確認し、リンク切れ以外のエラーを再取得・代替URLで処理してください。",
            "last_candidate_count": 31,
            "document_count": 46,
            "checked_age_hours": 0.12,
            "reason": ""
          },
          {
            "source_id": "meti_news",
            "source_name": "経済産業省 ニュースリリース",
            "publisher_type": "government",
            "freshness_status": "ok",
            "followup_kind": "fetch_error",
            "followup_action": "取得エラー分類を確認し、リンク切れ以外のエラーを再取得・代替URLで処理してください。",
            "last_candidate_count": 25,
            "document_count": 67,
            "checked_age_hours": 0.18,
            "reason": ""
          },
          {
            "source_id": "caa_news_rss",
            "source_name": "消費者庁 新着情報RSS",
            "publisher_type": "government",
            "freshness_status": "ok",
            "followup_kind": "fetch_error",
            "followup_action": "取得エラー分類を確認し、リンク切れ以外のエラーを再取得・代替URLで処理してください。",
            "last_candidate_count": 20,
            "document_count": 125,
            "checked_age_hours": 0.18,
            "reason": ""
          },
          {
            "source_id": "jetro_biznews_rss",
            "source_name": "JETRO ビジネス短信RSS",
            "publisher_type": "government",
            "freshness_status": "ok",
            "followup_kind": "fetch_error",
            "followup_action": "取得エラー分類を確認し、リンク切れ以外のエラーを再取得・代替URLで処理してください。",
            "last_candidate_count": 20,
            "document_count": 268,
            "checked_age_hours": 0.18,
            "reason": ""
          },
          {
            "source_id": "gsi_news",
            "source_name": "国土地理院 新着情報",
            "publisher_type": "government",
            "freshness_status": "source_error",
            "followup_kind": "fetch_error",
            "followup_action": "取得エラー分類を確認し、リンク切れ以外のエラーを再取得・代替URLで処理してください。",
            "last_candidate_count": 13,
            "document_count": 48,
            "checked_age_hours": 0.16,
            "reason": "ソースエラーが多いです error_count=10 status=None"
          },
          {
            "source_id": "iea_reports",
            "source_name": "IEA Reports",
            "publisher_type": "international_organization",
            "freshness_status": "source_error",
            "followup_kind": "fetch_error",
            "followup_action": "取得エラー分類を確認し、リンク切れ以外のエラーを再取得・代替URLで処理してください。",
            "last_candidate_count": 11,
            "document_count": 12,
            "checked_age_hours": 0.12,
            "reason": "ソースエラーが多いです error_count=10 status=403"
          },
          {
            "source_id": "nuveen_investment_outlook",
            "source_name": "Nuveen Investment Outlook",
            "publisher_type": "asset_manager",
            "freshness_status": "source_error",
            "followup_kind": "fetch_error",
            "followup_action": "取得エラー分類を確認し、リンク切れ以外のエラーを再取得・代替URLで処理してください。",
            "last_candidate_count": 6,
            "document_count": 7,
            "checked_age_hours": 0.12,
            "reason": "ソースエラーが多いです error_count=10 status=None"
          }
        ]
      },
      {
        "check": "telegram_dashboard_url_present",
        "ok": true,
        "severity": "error",
        "detail": "PUBLIC_DASHBOARD_URL is included and production-safe",
        "dashboard_url": "https://35-221-72-238.sslip.io/dashboard.html",
        "url_quality": {
          "url": "https://35-221-72-238.sslip.io/dashboard.html",
          "ok": true,
          "format_ok": true,
          "placeholder": false,
          "host": "35-221-72-238.sslip.io"
        }
      }
    ],
    "message": ""
  },
  "verification_commands": [
    "cd /app\npython3 scripts/market_intel.py doctor --pending-threshold 3000\npython3 scripts/market_intel.py analysis-audit --strict\npython3 scripts/market_intel.py telegram-content-check --require-dashboard-url\npython3 scripts/market_intel.py backup-verify"
  ]
}
