Kestrel v2 • Operator
Console
Operator evidence report
Read-only GET /internal/operator-evidence/report — scanner → strategy-loop → OMS → autonomous denies → trades → control plane
Generated: 2026-06-20T16:59:57.148641+00:00
Open trades filtered with account_id=DUP667958 (from KESTREL_DEFAULT_ACCOUNT_ID).
What should I tell the desk?
Plain-English snapshot
What happened?

Latest scanner run id=101 at 2026-05-05T16:27:05.483016+00:00 (universe_size=7). Latest strategy-loop run id=93 with 7 decisions (2 trade, 5 skip). OMS window: 24 orders; approved_not_submitted=3; problem sample count=14.

Why did broker submission not happen?

Autonomous submission policy recorded 8 recent deny evaluation(s); see reasons_with_labels. There are OMS orders in approved_not_submitted (approved locally, no broker id / zero fills) — broker submission did not complete for those rows.

Is there any open trade?

No open trades for account 'DUP667958'.

What should the operator do next?
  • Refresh or recompute system control state — persisted control row looks stale.
  • Review autonomous_policy/runs for snapshot_json on the top deny order_ids.
  • Inspect approved_not_submitted rows and broker-truth / policy freshness.
Worker & pipeline freshness
GET /internal/worker-freshness/report — DB-backed inference; optional Docker via KESTREL_INTERNAL_WORKER_DOCKER_STATUS_ENABLED
Overall:normalgenerated 2026-06-20T16:59:57.242595+00:00
No automatic worker restart was performed by this report.
docker_status_available=false — enable KESTREL_INTERNAL_WORKER_DOCKER_STATUS_ENABLED and ensure read-only docker ps works from the API process to attach container rows.
Stale data flags
[
  "market_bars_stale_off_rth_informational",
  "market_quotes_stale_off_rth_informational",
  "feature_snapshots_stale_off_rth_informational",
  "scanner_runs_stale_off_rth_informational",
  "strategy_loop_runs_stale_off_rth_informational"
]
Data freshness
Table / streamLatest ISOCount
market_bars2026-05-18T19:59:00+00:0050329
market_quotes2026-05-19T03:54:41.759396+00:00230867
feature_snapshots2026-05-18T19:59:00+00:0036892
scanner_runs2026-05-05T16:27:05.483016+00:00101
strategy_loop_runs2026-05-05T16:27:05.579224+00:0093
orders2026-05-20T13:43:51.015110+00:0024
autonomous_submission_policy_runs2026-05-02T16:53:12.774824+00:0013
risk_runs0
broker_account_snapshots2026-06-02T04:30:09.163786+00:0034476
Expected workers
ServiceInferredContainer stateExitStatusStartedFinishedImageID
worker-market-dataok
worker-featuresok
worker-omsok
worker-riskmissing
worker-broker-ibkrok
Container name: — · — · — · — · —
Diagnostics
worker-market-data (info)

Market bars look stale relative to thresholds, but the approximate calendar says outside likely RTH — treat as informational.

Suggested: Optional check of worker-market-data; no automatic restart was performed.

worker-risk (info)

No risk_runs rows — risk worker may never have run in this environment or table is empty.

Suggested: If risk coverage is expected, verify worker-risk deployment and intake wiring.

Safety flags
Derived booleans (read-only)
  • no_open_trades: true
  • submissions_blocked: false
  • has_approved_not_submitted: true
Health
DB + Redis ping (same spirit as /health/deep)
{
  "ok": true,
  "components": {
    "database": "ok",
    "redis": "ok"
  }
}
Scanner
{
  "run_id": 101,
  "created_at_iso": "2026-05-05T16:27:05.483016+00:00",
  "name": "core_scanner_v1",
  "version": "1",
  "interval": "1m",
  "universe_size": 7,
  "symbols_requested": [
    "META",
    "AMZN",
    "MSFT",
    "NVDA",
    "GOOGL",
    "TSLA",
    "AMD"
  ],
  "symbols_scanned": [
    "META",
    "AMZN",
    "MSFT",
    "NVDA",
    "GOOGL",
    "TSLA",
    "AMD"
  ],
  "symbols_with_features": [
    "NVDA",
    "META",
    "AMD",
    "GOOGL",
    "MSFT",
    "AMZN",
    "TSLA"
  ],
  "symbols_missing_features": []
}
Strategy loop
{
  "run_id": 93,
  "created_at_iso": "2026-05-05T16:27:05.579224+00:00",
  "scanner_run_id": 101,
  "decisions_total": 7,
  "trade_decisions": 2,
  "skip_decisions": 5,
  "candidates_considered": 7,
  "strategy_name": "formal_loop_v1",
  "strategy_version": "1",
  "control_state": {
    "strategy_loop_intake_paused": false,
    "autonomous_submission_held": false,
    "governance_ts_iso": "2026-05-02T16:00:56.266375+00:00"
  }
}
OMS lifecycle
{
  "approved_not_submitted_count": 3,
  "recent_approved_not_submitted": [
    {
      "order_id": "ord-manual-f9b6ddf00a92",
      "symbol": "AAPL",
      "status": "approved",
      "oms_lifecycle_stage": "approved_not_submitted",
      "broker_order_id": null,
      "filled_quantity": 0,
      "strategy_loop_decision_id": null,
      "strategy_loop_run_id": null,
      "created_at_iso": "2026-05-19T20:54:33.970750+00:00"
    },
    {
      "order_id": "ord-manual-f7524be6dc81",
      "symbol": "AAPL",
      "status": "approved",
      "oms_lifecycle_stage": "approved_not_submitted",
      "broker_order_id": null,
      "filled_quantity": 0,
      "strategy_loop_decision_id": null,
      "strategy_loop_run_id": null,
      "created_at_iso": "2026-05-19T20:06:19.343206+00:00"
    },
    {
      "order_id": "ord-manual-876133187eb8",
      "symbol": "AAPL",
      "status": "approved",
      "oms_lifecycle_stage": "approved_not_submitted",
      "broker_order_id": null,
      "filled_quantity": 0,
      "strategy_loop_decision_id": null,
      "strategy_loop_run_id": null,
      "created_at_iso": "2026-05-19T20:05:42.099650+00:00"
    }
  ],
  "status_counts": {
    "submitted": 2,
    "approved": 3,
    "error": 9,
    "canceled": 5,
    "filled": 5
  },
  "problem_orders_count": 14,
  "recent_problem_orders": [
    {
      "order_id": "ord-manual-de0d40f1df30",
      "symbol": "AAPL",
      "status": "error",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": null,
      "strategy_loop_run_id": null,
      "created_at_iso": "2026-05-19T17:54:49.889486+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-manual-6971d1926b3c",
      "symbol": "AAPL",
      "status": "error",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": null,
      "strategy_loop_run_id": null,
      "created_at_iso": "2026-05-19T17:53:31.307310+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-stratloop-106",
      "symbol": "AMD",
      "status": "canceled",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": 106,
      "strategy_loop_run_id": 90,
      "created_at_iso": "2026-05-02T16:48:24.396792+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-stratloop-105",
      "symbol": "GOOGL",
      "status": "canceled",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": 105,
      "strategy_loop_run_id": 90,
      "created_at_iso": "2026-05-02T16:48:24.396792+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-exit-3",
      "symbol": "AAPL",
      "status": "canceled",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": null,
      "strategy_loop_run_id": null,
      "created_at_iso": "2026-05-02T14:35:15.025503+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-exit-4",
      "symbol": "AAPL",
      "status": "canceled",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": null,
      "strategy_loop_run_id": null,
      "created_at_iso": "2026-05-02T14:35:15.025503+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-exit-2",
      "symbol": "AAPL",
      "status": "canceled",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": null,
      "strategy_loop_run_id": null,
      "created_at_iso": "2026-05-02T14:35:15.025503+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-stratloop-48",
      "symbol": "QQQ",
      "status": "error",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": 48,
      "strategy_loop_run_id": 24,
      "created_at_iso": "2026-04-24T17:23:06.527944+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-stratloop-47",
      "symbol": "SPY",
      "status": "error",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": 47,
      "strategy_loop_run_id": 24,
      "created_at_iso": "2026-04-24T17:23:06.527944+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-stratloop-75",
      "symbol": "SPY",
      "status": "error",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": 75,
      "strategy_loop_run_id": 38,
      "created_at_iso": "2026-04-24T14:24:08.173557+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-stratloop-76",
      "symbol": "QQQ",
      "status": "error",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": 76,
      "strategy_loop_run_id": 38,
      "created_at_iso": "2026-04-24T14:24:08.173557+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-stratloop-73",
      "symbol": "QQQ",
      "status": "error",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": 73,
      "strategy_loop_run_id": 37,
      "created_at_iso": "2026-04-24T13:50:13.921187+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-stratloop-70",
      "symbol": "SPY",
      "status": "error",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": 70,
      "strategy_loop_run_id": 35,
      "created_at_iso": "2026-04-24T13:32:17.175047+00:00",
      "last_fill_at_iso": null
    },
    {
      "order_id": "ord-stratloop-69",
      "symbol": "QQQ",
      "status": "error",
      "broker_order_id": null,
      "filled_quantity": 0,
      "avg_fill_price": null,
      "risk_decision_id": null,
      "strategy_loop_decision_id": 69,
      "strategy_loop_run_id": 35,
      "created_at_iso": "2026-04-24T13:32:17.175047+00:00",
      "last_fill_at_iso": null
    }
  ],
  "window": 24,
  "total": 24
}
Autonomous denial (grouped by order_id)
Phase 14B labels embedded per reason
ord-stratloop-106
2026-05-02T16:53:12.774824+00:00 · AMD
Raw: ORDER_CANDIDATE_STALE
Order candidate stale
The OMS order row is older than the policy freshness window for autonomous submit, so the candidate is treated as stale.
Next: Confirm scanner + strategy-loop just ran; check feature timestamps vs decision time; reduce clock skew.
Raw: BROKER_ACCOUNT_STATE_STALE
Broker account snapshot stale
The latest persisted broker account snapshot is older than the policy TTL.
Next: Verify worker-oms / broker-truth snapshot path; check GET /internal/broker-truth/account/latest freshness.
Raw: BROKER_POSITIONS_STATE_STALE
Broker positions snapshot stale
Broker positions used for safety checks are older than the allowed freshness window.
Next: Confirm broker-truth positions snapshots are updating; inspect worker-oms logs and snapshot timestamps.
Raw: BROKER_OPEN_ORDERS_STATE_STALE
Broker open-orders snapshot stale
Open-order snapshots used for duplicate/conflict checks are older than the policy TTL.
Next: Verify broker open-order snapshot ingestion; compare with IBKR Client Portal open orders.
Raw: RECONCILIATION_STATE_STALE
Reconciliation signal stale
Reconciliation inputs used by autonomous policy are older than the configured TTL.
Next: Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured.
Raw: STRATEGY_LOOP_STATE_STALE
Strategy-loop context stale
Strategy-loop run/decision context is older than the policy freshness window relative to submit time.
Next: Confirm latest strategy-loop run completed; align scanner → loop cadence; check run metadata timestamps.
Raw: MARKET_CLOSED_FOR_STOCK
Market closed
Stock entries are blocked because the session is outside the allowed US equity trading window for this policy.
Next: Wait for regular trading hours or verify market-hours / calendar configuration for paper vs live.
Raw: PAPER_TEST_RTH_REQUIRED
Paper test — RTH only
Paper-test guard requires regular trading hours before allowing this class of entry/submit.
Next: Retry during RTH or adjust paper-test RTH policy only if your playbook explicitly allows off-hours testing.
Raw: DATA_FEATURES_STALE
Feature data stale
Feature snapshots feeding the policy are older than the allowed freshness threshold.
Next: Check market-data / features workers and latest feature snapshot timestamps in pipeline footprint.
Raw: DATA_BROKER_TRUTH_STALE
Broker-truth data stale
Broker-truth inputs (quotes/account/positions) are considered stale for autonomous submit.
Next: Inspect broker-truth snapshot ages and worker-oms reconcile cycles; confirm gateway connectivity.
ord-stratloop-105
2026-05-02T16:53:12.741420+00:00 · GOOGL
Raw: ORDER_CANDIDATE_STALE
Order candidate stale
The OMS order row is older than the policy freshness window for autonomous submit, so the candidate is treated as stale.
Next: Confirm scanner + strategy-loop just ran; check feature timestamps vs decision time; reduce clock skew.
Raw: BROKER_ACCOUNT_STATE_STALE
Broker account snapshot stale
The latest persisted broker account snapshot is older than the policy TTL.
Next: Verify worker-oms / broker-truth snapshot path; check GET /internal/broker-truth/account/latest freshness.
Raw: BROKER_POSITIONS_STATE_STALE
Broker positions snapshot stale
Broker positions used for safety checks are older than the allowed freshness window.
Next: Confirm broker-truth positions snapshots are updating; inspect worker-oms logs and snapshot timestamps.
Raw: BROKER_OPEN_ORDERS_STATE_STALE
Broker open-orders snapshot stale
Open-order snapshots used for duplicate/conflict checks are older than the policy TTL.
Next: Verify broker open-order snapshot ingestion; compare with IBKR Client Portal open orders.
Raw: RECONCILIATION_STATE_STALE
Reconciliation signal stale
Reconciliation inputs used by autonomous policy are older than the configured TTL.
Next: Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured.
Raw: STRATEGY_LOOP_STATE_STALE
Strategy-loop context stale
Strategy-loop run/decision context is older than the policy freshness window relative to submit time.
Next: Confirm latest strategy-loop run completed; align scanner → loop cadence; check run metadata timestamps.
Raw: MARKET_CLOSED_FOR_STOCK
Market closed
Stock entries are blocked because the session is outside the allowed US equity trading window for this policy.
Next: Wait for regular trading hours or verify market-hours / calendar configuration for paper vs live.
Raw: PAPER_TEST_RTH_REQUIRED
Paper test — RTH only
Paper-test guard requires regular trading hours before allowing this class of entry/submit.
Next: Retry during RTH or adjust paper-test RTH policy only if your playbook explicitly allows off-hours testing.
Raw: DATA_FEATURES_STALE
Feature data stale
Feature snapshots feeding the policy are older than the allowed freshness threshold.
Next: Check market-data / features workers and latest feature snapshot timestamps in pipeline footprint.
Raw: DATA_BROKER_TRUTH_STALE
Broker-truth data stale
Broker-truth inputs (quotes/account/positions) are considered stale for autonomous submit.
Next: Inspect broker-truth snapshot ages and worker-oms reconcile cycles; confirm gateway connectivity.
ord-stratloop-48
2026-04-24T17:23:06.627567+00:00 · QQQ
Raw: RECONCILIATION_STATE_STALE
Reconciliation signal stale
Reconciliation inputs used by autonomous policy are older than the configured TTL.
Next: Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured.
Raw: STRATEGY_LOOP_STATE_STALE
Strategy-loop context stale
Strategy-loop run/decision context is older than the policy freshness window relative to submit time.
Next: Confirm latest strategy-loop run completed; align scanner → loop cadence; check run metadata timestamps.
ord-stratloop-47
2026-04-24T17:23:06.603402+00:00 · SPY
Raw: RECONCILIATION_STATE_STALE
Reconciliation signal stale
Reconciliation inputs used by autonomous policy are older than the configured TTL.
Next: Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured.
Raw: STRATEGY_LOOP_STATE_STALE
Strategy-loop context stale
Strategy-loop run/decision context is older than the policy freshness window relative to submit time.
Next: Confirm latest strategy-loop run completed; align scanner → loop cadence; check run metadata timestamps.
ord-stratloop-83
2026-04-24T16:09:10.951475+00:00 · AAPL
Raw: AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED
Policy / guard reason
This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED.
Next: Inspect GET /internal/autonomous-policy/runs (full detail) or extend apps/web/lib/autonomousReasonLabels.ts.
Raw: AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED
Policy / guard reason
This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED.
Next: Inspect GET /internal/autonomous-policy/runs (full detail) or extend apps/web/lib/autonomousReasonLabels.ts.
Raw: DUPLICATE_CANDIDATE_FINGERPRINT
Policy / guard reason
This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: DUPLICATE_CANDIDATE_FINGERPRINT.
Next: Inspect GET /internal/autonomous-policy/runs (full detail) or extend apps/web/lib/autonomousReasonLabels.ts.
ord-stratloop-75
2026-04-24T14:24:08.454746+00:00 · SPY
Raw: BROKER_ACCOUNT_STATE_STALE
Broker account snapshot stale
The latest persisted broker account snapshot is older than the policy TTL.
Next: Verify worker-oms / broker-truth snapshot path; check GET /internal/broker-truth/account/latest freshness.
Raw: BROKER_POSITIONS_STATE_STALE
Broker positions snapshot stale
Broker positions used for safety checks are older than the allowed freshness window.
Next: Confirm broker-truth positions snapshots are updating; inspect worker-oms logs and snapshot timestamps.
Raw: BROKER_OPEN_ORDERS_STATE_STALE
Broker open-orders snapshot stale
Open-order snapshots used for duplicate/conflict checks are older than the policy TTL.
Next: Verify broker open-order snapshot ingestion; compare with IBKR Client Portal open orders.
ord-stratloop-70
2026-04-24T13:32:17.384925+00:00 · SPY
Raw: RECONCILIATION_STATE_STALE
Reconciliation signal stale
Reconciliation inputs used by autonomous policy are older than the configured TTL.
Next: Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured.
Raw: AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED
Policy / guard reason
This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED.
Next: Inspect GET /internal/autonomous-policy/runs (full detail) or extend apps/web/lib/autonomousReasonLabels.ts.
Raw: AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED
Policy / guard reason
This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED.
Next: Inspect GET /internal/autonomous-policy/runs (full detail) or extend apps/web/lib/autonomousReasonLabels.ts.
ord-stratloop-69
2026-04-24T13:32:17.340066+00:00 · QQQ
Raw: RECONCILIATION_STATE_STALE
Reconciliation signal stale
Reconciliation inputs used by autonomous policy are older than the configured TTL.
Next: Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured.
Raw: AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED
Policy / guard reason
This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED.
Next: Inspect GET /internal/autonomous-policy/runs (full detail) or extend apps/web/lib/autonomousReasonLabels.ts.
Raw: AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED
Policy / guard reason
This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED.
Next: Inspect GET /internal/autonomous-policy/runs (full detail) or extend apps/web/lib/autonomousReasonLabels.ts.
Open trades
{
  "enabled": true,
  "account_id": "DUP667958",
  "count": 0,
  "rows": []
}
Terminal / control plane
submissions_blocked: false
{
  "enabled": true,
  "persisted_state": "normal",
  "reason_summary": "effective=normal | gov=normal | ops=normal | recon=normal | inc=normal",
  "effective_resolved_state": "normal",
  "effective_reason_summary": "effective=normal | gov=normal | ops=normal | recon=normal | inc=normal",
  "submissions_blocked": false,
  "submit_guard_env_enabled": true,
  "stale_warning": true,
  "live_mismatch": false,
  "persisted_age_seconds": 2811914.133392,
  "blocked_submissions_recent": [
    {
      "id": 3,
      "ts_iso": "2026-05-02T14:38:51.291754+00:00",
      "order_id": "ord-exit-4",
      "symbol": "AAPL",
      "reason_code": "paper_test_rth_required",
      "reason_labels": {
        "label": "Paper test — RTH only",
        "explanation": "Paper-test guard requires regular trading hours before allowing this class of entry/submit.",
        "action": "Retry during RTH or adjust paper-test RTH policy only if your playbook explicitly allows off-hours testing."
      }
    },
    {
      "id": 2,
      "ts_iso": "2026-05-02T14:38:51.287902+00:00",
      "order_id": "ord-exit-3",
      "symbol": "AAPL",
      "reason_code": "paper_test_rth_required",
      "reason_labels": {
        "label": "Paper test — RTH only",
        "explanation": "Paper-test guard requires regular trading hours before allowing this class of entry/submit.",
        "action": "Retry during RTH or adjust paper-test RTH policy only if your playbook explicitly allows off-hours testing."
      }
    },
    {
      "id": 1,
      "ts_iso": "2026-05-02T14:38:51.277890+00:00",
      "order_id": "ord-exit-2",
      "symbol": "AAPL",
      "reason_code": "paper_test_rth_required",
      "reason_labels": {
        "label": "Paper test — RTH only",
        "explanation": "Paper-test guard requires regular trading hours before allowing this class of entry/submit.",
        "action": "Retry during RTH or adjust paper-test RTH policy only if your playbook explicitly allows off-hours testing."
      }
    }
  ]
}
Raw JSON
Full report payload
{
  "generated_at_iso": "2026-06-20T16:59:57.148641+00:00",
  "health_summary": {
    "ok": true,
    "components": {
      "database": "ok",
      "redis": "ok"
    }
  },
  "latest_scanner_run": {
    "run_id": 101,
    "created_at_iso": "2026-05-05T16:27:05.483016+00:00",
    "name": "core_scanner_v1",
    "version": "1",
    "interval": "1m",
    "universe_size": 7,
    "symbols_requested": [
      "META",
      "AMZN",
      "MSFT",
      "NVDA",
      "GOOGL",
      "TSLA",
      "AMD"
    ],
    "symbols_scanned": [
      "META",
      "AMZN",
      "MSFT",
      "NVDA",
      "GOOGL",
      "TSLA",
      "AMD"
    ],
    "symbols_with_features": [
      "NVDA",
      "META",
      "AMD",
      "GOOGL",
      "MSFT",
      "AMZN",
      "TSLA"
    ],
    "symbols_missing_features": []
  },
  "latest_strategy_loop": {
    "run_id": 93,
    "created_at_iso": "2026-05-05T16:27:05.579224+00:00",
    "scanner_run_id": 101,
    "decisions_total": 7,
    "trade_decisions": 2,
    "skip_decisions": 5,
    "candidates_considered": 7,
    "strategy_name": "formal_loop_v1",
    "strategy_version": "1",
    "control_state": {
      "strategy_loop_intake_paused": false,
      "autonomous_submission_held": false,
      "governance_ts_iso": "2026-05-02T16:00:56.266375+00:00"
    }
  },
  "oms_lifecycle": {
    "approved_not_submitted_count": 3,
    "recent_approved_not_submitted": [
      {
        "order_id": "ord-manual-f9b6ddf00a92",
        "symbol": "AAPL",
        "status": "approved",
        "oms_lifecycle_stage": "approved_not_submitted",
        "broker_order_id": null,
        "filled_quantity": 0,
        "strategy_loop_decision_id": null,
        "strategy_loop_run_id": null,
        "created_at_iso": "2026-05-19T20:54:33.970750+00:00"
      },
      {
        "order_id": "ord-manual-f7524be6dc81",
        "symbol": "AAPL",
        "status": "approved",
        "oms_lifecycle_stage": "approved_not_submitted",
        "broker_order_id": null,
        "filled_quantity": 0,
        "strategy_loop_decision_id": null,
        "strategy_loop_run_id": null,
        "created_at_iso": "2026-05-19T20:06:19.343206+00:00"
      },
      {
        "order_id": "ord-manual-876133187eb8",
        "symbol": "AAPL",
        "status": "approved",
        "oms_lifecycle_stage": "approved_not_submitted",
        "broker_order_id": null,
        "filled_quantity": 0,
        "strategy_loop_decision_id": null,
        "strategy_loop_run_id": null,
        "created_at_iso": "2026-05-19T20:05:42.099650+00:00"
      }
    ],
    "status_counts": {
      "submitted": 2,
      "approved": 3,
      "error": 9,
      "canceled": 5,
      "filled": 5
    },
    "problem_orders_count": 14,
    "recent_problem_orders": [
      {
        "order_id": "ord-manual-de0d40f1df30",
        "symbol": "AAPL",
        "status": "error",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": null,
        "strategy_loop_run_id": null,
        "created_at_iso": "2026-05-19T17:54:49.889486+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-manual-6971d1926b3c",
        "symbol": "AAPL",
        "status": "error",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": null,
        "strategy_loop_run_id": null,
        "created_at_iso": "2026-05-19T17:53:31.307310+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-stratloop-106",
        "symbol": "AMD",
        "status": "canceled",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": 106,
        "strategy_loop_run_id": 90,
        "created_at_iso": "2026-05-02T16:48:24.396792+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-stratloop-105",
        "symbol": "GOOGL",
        "status": "canceled",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": 105,
        "strategy_loop_run_id": 90,
        "created_at_iso": "2026-05-02T16:48:24.396792+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-exit-3",
        "symbol": "AAPL",
        "status": "canceled",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": null,
        "strategy_loop_run_id": null,
        "created_at_iso": "2026-05-02T14:35:15.025503+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-exit-4",
        "symbol": "AAPL",
        "status": "canceled",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": null,
        "strategy_loop_run_id": null,
        "created_at_iso": "2026-05-02T14:35:15.025503+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-exit-2",
        "symbol": "AAPL",
        "status": "canceled",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": null,
        "strategy_loop_run_id": null,
        "created_at_iso": "2026-05-02T14:35:15.025503+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-stratloop-48",
        "symbol": "QQQ",
        "status": "error",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": 48,
        "strategy_loop_run_id": 24,
        "created_at_iso": "2026-04-24T17:23:06.527944+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-stratloop-47",
        "symbol": "SPY",
        "status": "error",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": 47,
        "strategy_loop_run_id": 24,
        "created_at_iso": "2026-04-24T17:23:06.527944+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-stratloop-75",
        "symbol": "SPY",
        "status": "error",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": 75,
        "strategy_loop_run_id": 38,
        "created_at_iso": "2026-04-24T14:24:08.173557+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-stratloop-76",
        "symbol": "QQQ",
        "status": "error",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": 76,
        "strategy_loop_run_id": 38,
        "created_at_iso": "2026-04-24T14:24:08.173557+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-stratloop-73",
        "symbol": "QQQ",
        "status": "error",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": 73,
        "strategy_loop_run_id": 37,
        "created_at_iso": "2026-04-24T13:50:13.921187+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-stratloop-70",
        "symbol": "SPY",
        "status": "error",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": 70,
        "strategy_loop_run_id": 35,
        "created_at_iso": "2026-04-24T13:32:17.175047+00:00",
        "last_fill_at_iso": null
      },
      {
        "order_id": "ord-stratloop-69",
        "symbol": "QQQ",
        "status": "error",
        "broker_order_id": null,
        "filled_quantity": 0,
        "avg_fill_price": null,
        "risk_decision_id": null,
        "strategy_loop_decision_id": 69,
        "strategy_loop_run_id": 35,
        "created_at_iso": "2026-04-24T13:32:17.175047+00:00",
        "last_fill_at_iso": null
      }
    ],
    "window": 24,
    "total": 24
  },
  "autonomous_denial": {
    "enabled": true,
    "recent_deny_runs": [
      {
        "id": 13,
        "ts_iso": "2026-05-02T16:53:12.774824+00:00",
        "order_id": "ord-stratloop-106",
        "symbol": "AMD",
        "account_id": "DUP667958",
        "decision": "deny",
        "reasons_raw": [
          "ORDER_CANDIDATE_STALE",
          "BROKER_ACCOUNT_STATE_STALE",
          "BROKER_POSITIONS_STATE_STALE",
          "BROKER_OPEN_ORDERS_STATE_STALE",
          "RECONCILIATION_STATE_STALE",
          "STRATEGY_LOOP_STATE_STALE",
          "MARKET_CLOSED_FOR_STOCK",
          "PAPER_TEST_RTH_REQUIRED",
          "DATA_FEATURES_STALE",
          "DATA_BROKER_TRUTH_STALE"
        ],
        "reasons_with_labels": [
          {
            "raw": "ORDER_CANDIDATE_STALE",
            "label": "Order candidate stale",
            "explanation": "The OMS order row is older than the policy freshness window for autonomous submit, so the candidate is treated as stale.",
            "action": "Confirm scanner + strategy-loop just ran; check feature timestamps vs decision time; reduce clock skew."
          },
          {
            "raw": "BROKER_ACCOUNT_STATE_STALE",
            "label": "Broker account snapshot stale",
            "explanation": "The latest persisted broker account snapshot is older than the policy TTL.",
            "action": "Verify worker-oms / broker-truth snapshot path; check GET /internal/broker-truth/account/latest freshness."
          },
          {
            "raw": "BROKER_POSITIONS_STATE_STALE",
            "label": "Broker positions snapshot stale",
            "explanation": "Broker positions used for safety checks are older than the allowed freshness window.",
            "action": "Confirm broker-truth positions snapshots are updating; inspect worker-oms logs and snapshot timestamps."
          },
          {
            "raw": "BROKER_OPEN_ORDERS_STATE_STALE",
            "label": "Broker open-orders snapshot stale",
            "explanation": "Open-order snapshots used for duplicate/conflict checks are older than the policy TTL.",
            "action": "Verify broker open-order snapshot ingestion; compare with IBKR Client Portal open orders."
          },
          {
            "raw": "RECONCILIATION_STATE_STALE",
            "label": "Reconciliation signal stale",
            "explanation": "Reconciliation inputs used by autonomous policy are older than the configured TTL.",
            "action": "Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured."
          },
          {
            "raw": "STRATEGY_LOOP_STATE_STALE",
            "label": "Strategy-loop context stale",
            "explanation": "Strategy-loop run/decision context is older than the policy freshness window relative to submit time.",
            "action": "Confirm latest strategy-loop run completed; align scanner → loop cadence; check run metadata timestamps."
          },
          {
            "raw": "MARKET_CLOSED_FOR_STOCK",
            "label": "Market closed",
            "explanation": "Stock entries are blocked because the session is outside the allowed US equity trading window for this policy.",
            "action": "Wait for regular trading hours or verify market-hours / calendar configuration for paper vs live."
          },
          {
            "raw": "PAPER_TEST_RTH_REQUIRED",
            "label": "Paper test — RTH only",
            "explanation": "Paper-test guard requires regular trading hours before allowing this class of entry/submit.",
            "action": "Retry during RTH or adjust paper-test RTH policy only if your playbook explicitly allows off-hours testing."
          },
          {
            "raw": "DATA_FEATURES_STALE",
            "label": "Feature data stale",
            "explanation": "Feature snapshots feeding the policy are older than the allowed freshness threshold.",
            "action": "Check market-data / features workers and latest feature snapshot timestamps in pipeline footprint."
          },
          {
            "raw": "DATA_BROKER_TRUTH_STALE",
            "label": "Broker-truth data stale",
            "explanation": "Broker-truth inputs (quotes/account/positions) are considered stale for autonomous submit.",
            "action": "Inspect broker-truth snapshot ages and worker-oms reconcile cycles; confirm gateway connectivity."
          }
        ],
        "submit_attempted": false,
        "submit_outcome": "skipped"
      },
      {
        "id": 12,
        "ts_iso": "2026-05-02T16:53:12.741420+00:00",
        "order_id": "ord-stratloop-105",
        "symbol": "GOOGL",
        "account_id": "DUP667958",
        "decision": "deny",
        "reasons_raw": [
          "ORDER_CANDIDATE_STALE",
          "BROKER_ACCOUNT_STATE_STALE",
          "BROKER_POSITIONS_STATE_STALE",
          "BROKER_OPEN_ORDERS_STATE_STALE",
          "RECONCILIATION_STATE_STALE",
          "STRATEGY_LOOP_STATE_STALE",
          "MARKET_CLOSED_FOR_STOCK",
          "PAPER_TEST_RTH_REQUIRED",
          "DATA_FEATURES_STALE",
          "DATA_BROKER_TRUTH_STALE"
        ],
        "reasons_with_labels": [
          {
            "raw": "ORDER_CANDIDATE_STALE",
            "label": "Order candidate stale",
            "explanation": "The OMS order row is older than the policy freshness window for autonomous submit, so the candidate is treated as stale.",
            "action": "Confirm scanner + strategy-loop just ran; check feature timestamps vs decision time; reduce clock skew."
          },
          {
            "raw": "BROKER_ACCOUNT_STATE_STALE",
            "label": "Broker account snapshot stale",
            "explanation": "The latest persisted broker account snapshot is older than the policy TTL.",
            "action": "Verify worker-oms / broker-truth snapshot path; check GET /internal/broker-truth/account/latest freshness."
          },
          {
            "raw": "BROKER_POSITIONS_STATE_STALE",
            "label": "Broker positions snapshot stale",
            "explanation": "Broker positions used for safety checks are older than the allowed freshness window.",
            "action": "Confirm broker-truth positions snapshots are updating; inspect worker-oms logs and snapshot timestamps."
          },
          {
            "raw": "BROKER_OPEN_ORDERS_STATE_STALE",
            "label": "Broker open-orders snapshot stale",
            "explanation": "Open-order snapshots used for duplicate/conflict checks are older than the policy TTL.",
            "action": "Verify broker open-order snapshot ingestion; compare with IBKR Client Portal open orders."
          },
          {
            "raw": "RECONCILIATION_STATE_STALE",
            "label": "Reconciliation signal stale",
            "explanation": "Reconciliation inputs used by autonomous policy are older than the configured TTL.",
            "action": "Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured."
          },
          {
            "raw": "STRATEGY_LOOP_STATE_STALE",
            "label": "Strategy-loop context stale",
            "explanation": "Strategy-loop run/decision context is older than the policy freshness window relative to submit time.",
            "action": "Confirm latest strategy-loop run completed; align scanner → loop cadence; check run metadata timestamps."
          },
          {
            "raw": "MARKET_CLOSED_FOR_STOCK",
            "label": "Market closed",
            "explanation": "Stock entries are blocked because the session is outside the allowed US equity trading window for this policy.",
            "action": "Wait for regular trading hours or verify market-hours / calendar configuration for paper vs live."
          },
          {
            "raw": "PAPER_TEST_RTH_REQUIRED",
            "label": "Paper test — RTH only",
            "explanation": "Paper-test guard requires regular trading hours before allowing this class of entry/submit.",
            "action": "Retry during RTH or adjust paper-test RTH policy only if your playbook explicitly allows off-hours testing."
          },
          {
            "raw": "DATA_FEATURES_STALE",
            "label": "Feature data stale",
            "explanation": "Feature snapshots feeding the policy are older than the allowed freshness threshold.",
            "action": "Check market-data / features workers and latest feature snapshot timestamps in pipeline footprint."
          },
          {
            "raw": "DATA_BROKER_TRUTH_STALE",
            "label": "Broker-truth data stale",
            "explanation": "Broker-truth inputs (quotes/account/positions) are considered stale for autonomous submit.",
            "action": "Inspect broker-truth snapshot ages and worker-oms reconcile cycles; confirm gateway connectivity."
          }
        ],
        "submit_attempted": false,
        "submit_outcome": "skipped"
      },
      {
        "id": 10,
        "ts_iso": "2026-04-24T17:23:06.627567+00:00",
        "order_id": "ord-stratloop-48",
        "symbol": "QQQ",
        "account_id": "DUP667958",
        "decision": "deny",
        "reasons_raw": [
          "RECONCILIATION_STATE_STALE",
          "STRATEGY_LOOP_STATE_STALE"
        ],
        "reasons_with_labels": [
          {
            "raw": "RECONCILIATION_STATE_STALE",
            "label": "Reconciliation signal stale",
            "explanation": "Reconciliation inputs used by autonomous policy are older than the configured TTL.",
            "action": "Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured."
          },
          {
            "raw": "STRATEGY_LOOP_STATE_STALE",
            "label": "Strategy-loop context stale",
            "explanation": "Strategy-loop run/decision context is older than the policy freshness window relative to submit time.",
            "action": "Confirm latest strategy-loop run completed; align scanner → loop cadence; check run metadata timestamps."
          }
        ],
        "submit_attempted": false,
        "submit_outcome": "skipped"
      },
      {
        "id": 9,
        "ts_iso": "2026-04-24T17:23:06.603402+00:00",
        "order_id": "ord-stratloop-47",
        "symbol": "SPY",
        "account_id": "DUP667958",
        "decision": "deny",
        "reasons_raw": [
          "RECONCILIATION_STATE_STALE",
          "STRATEGY_LOOP_STATE_STALE"
        ],
        "reasons_with_labels": [
          {
            "raw": "RECONCILIATION_STATE_STALE",
            "label": "Reconciliation signal stale",
            "explanation": "Reconciliation inputs used by autonomous policy are older than the configured TTL.",
            "action": "Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured."
          },
          {
            "raw": "STRATEGY_LOOP_STATE_STALE",
            "label": "Strategy-loop context stale",
            "explanation": "Strategy-loop run/decision context is older than the policy freshness window relative to submit time.",
            "action": "Confirm latest strategy-loop run completed; align scanner → loop cadence; check run metadata timestamps."
          }
        ],
        "submit_attempted": false,
        "submit_outcome": "skipped"
      },
      {
        "id": 8,
        "ts_iso": "2026-04-24T16:09:10.951475+00:00",
        "order_id": "ord-stratloop-83",
        "symbol": "AAPL",
        "account_id": "DUP667958",
        "decision": "deny",
        "reasons_raw": [
          "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
          "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED",
          "DUPLICATE_CANDIDATE_FINGERPRINT"
        ],
        "reasons_with_labels": [
          {
            "raw": "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
            "label": "Policy / guard reason",
            "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED.",
            "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
          },
          {
            "raw": "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED",
            "label": "Policy / guard reason",
            "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED.",
            "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
          },
          {
            "raw": "DUPLICATE_CANDIDATE_FINGERPRINT",
            "label": "Policy / guard reason",
            "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: DUPLICATE_CANDIDATE_FINGERPRINT.",
            "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
          }
        ],
        "submit_attempted": false,
        "submit_outcome": "skipped"
      },
      {
        "id": 4,
        "ts_iso": "2026-04-24T14:24:08.454746+00:00",
        "order_id": "ord-stratloop-75",
        "symbol": "SPY",
        "account_id": "DUP667958",
        "decision": "deny",
        "reasons_raw": [
          "BROKER_ACCOUNT_STATE_STALE",
          "BROKER_POSITIONS_STATE_STALE",
          "BROKER_OPEN_ORDERS_STATE_STALE"
        ],
        "reasons_with_labels": [
          {
            "raw": "BROKER_ACCOUNT_STATE_STALE",
            "label": "Broker account snapshot stale",
            "explanation": "The latest persisted broker account snapshot is older than the policy TTL.",
            "action": "Verify worker-oms / broker-truth snapshot path; check GET /internal/broker-truth/account/latest freshness."
          },
          {
            "raw": "BROKER_POSITIONS_STATE_STALE",
            "label": "Broker positions snapshot stale",
            "explanation": "Broker positions used for safety checks are older than the allowed freshness window.",
            "action": "Confirm broker-truth positions snapshots are updating; inspect worker-oms logs and snapshot timestamps."
          },
          {
            "raw": "BROKER_OPEN_ORDERS_STATE_STALE",
            "label": "Broker open-orders snapshot stale",
            "explanation": "Open-order snapshots used for duplicate/conflict checks are older than the policy TTL.",
            "action": "Verify broker open-order snapshot ingestion; compare with IBKR Client Portal open orders."
          }
        ],
        "submit_attempted": false,
        "submit_outcome": "skipped"
      },
      {
        "id": 2,
        "ts_iso": "2026-04-24T13:32:17.384925+00:00",
        "order_id": "ord-stratloop-70",
        "symbol": "SPY",
        "account_id": "DUP667958",
        "decision": "deny",
        "reasons_raw": [
          "RECONCILIATION_STATE_STALE",
          "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
          "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED"
        ],
        "reasons_with_labels": [
          {
            "raw": "RECONCILIATION_STATE_STALE",
            "label": "Reconciliation signal stale",
            "explanation": "Reconciliation inputs used by autonomous policy are older than the configured TTL.",
            "action": "Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured."
          },
          {
            "raw": "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
            "label": "Policy / guard reason",
            "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED.",
            "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
          },
          {
            "raw": "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED",
            "label": "Policy / guard reason",
            "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED.",
            "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
          }
        ],
        "submit_attempted": false,
        "submit_outcome": "skipped"
      },
      {
        "id": 1,
        "ts_iso": "2026-04-24T13:32:17.340066+00:00",
        "order_id": "ord-stratloop-69",
        "symbol": "QQQ",
        "account_id": "DUP667958",
        "decision": "deny",
        "reasons_raw": [
          "RECONCILIATION_STATE_STALE",
          "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
          "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED"
        ],
        "reasons_with_labels": [
          {
            "raw": "RECONCILIATION_STATE_STALE",
            "label": "Reconciliation signal stale",
            "explanation": "Reconciliation inputs used by autonomous policy are older than the configured TTL.",
            "action": "Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured."
          },
          {
            "raw": "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
            "label": "Policy / guard reason",
            "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED.",
            "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
          },
          {
            "raw": "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED",
            "label": "Policy / guard reason",
            "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED.",
            "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
          }
        ],
        "submit_attempted": false,
        "submit_outcome": "skipped"
      }
    ],
    "grouped_by_order_id": {
      "ord-stratloop-106": [
        {
          "id": 13,
          "ts_iso": "2026-05-02T16:53:12.774824+00:00",
          "order_id": "ord-stratloop-106",
          "symbol": "AMD",
          "account_id": "DUP667958",
          "decision": "deny",
          "reasons_raw": [
            "ORDER_CANDIDATE_STALE",
            "BROKER_ACCOUNT_STATE_STALE",
            "BROKER_POSITIONS_STATE_STALE",
            "BROKER_OPEN_ORDERS_STATE_STALE",
            "RECONCILIATION_STATE_STALE",
            "STRATEGY_LOOP_STATE_STALE",
            "MARKET_CLOSED_FOR_STOCK",
            "PAPER_TEST_RTH_REQUIRED",
            "DATA_FEATURES_STALE",
            "DATA_BROKER_TRUTH_STALE"
          ],
          "reasons_with_labels": [
            {
              "raw": "ORDER_CANDIDATE_STALE",
              "label": "Order candidate stale",
              "explanation": "The OMS order row is older than the policy freshness window for autonomous submit, so the candidate is treated as stale.",
              "action": "Confirm scanner + strategy-loop just ran; check feature timestamps vs decision time; reduce clock skew."
            },
            {
              "raw": "BROKER_ACCOUNT_STATE_STALE",
              "label": "Broker account snapshot stale",
              "explanation": "The latest persisted broker account snapshot is older than the policy TTL.",
              "action": "Verify worker-oms / broker-truth snapshot path; check GET /internal/broker-truth/account/latest freshness."
            },
            {
              "raw": "BROKER_POSITIONS_STATE_STALE",
              "label": "Broker positions snapshot stale",
              "explanation": "Broker positions used for safety checks are older than the allowed freshness window.",
              "action": "Confirm broker-truth positions snapshots are updating; inspect worker-oms logs and snapshot timestamps."
            },
            {
              "raw": "BROKER_OPEN_ORDERS_STATE_STALE",
              "label": "Broker open-orders snapshot stale",
              "explanation": "Open-order snapshots used for duplicate/conflict checks are older than the policy TTL.",
              "action": "Verify broker open-order snapshot ingestion; compare with IBKR Client Portal open orders."
            },
            {
              "raw": "RECONCILIATION_STATE_STALE",
              "label": "Reconciliation signal stale",
              "explanation": "Reconciliation inputs used by autonomous policy are older than the configured TTL.",
              "action": "Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured."
            },
            {
              "raw": "STRATEGY_LOOP_STATE_STALE",
              "label": "Strategy-loop context stale",
              "explanation": "Strategy-loop run/decision context is older than the policy freshness window relative to submit time.",
              "action": "Confirm latest strategy-loop run completed; align scanner → loop cadence; check run metadata timestamps."
            },
            {
              "raw": "MARKET_CLOSED_FOR_STOCK",
              "label": "Market closed",
              "explanation": "Stock entries are blocked because the session is outside the allowed US equity trading window for this policy.",
              "action": "Wait for regular trading hours or verify market-hours / calendar configuration for paper vs live."
            },
            {
              "raw": "PAPER_TEST_RTH_REQUIRED",
              "label": "Paper test — RTH only",
              "explanation": "Paper-test guard requires regular trading hours before allowing this class of entry/submit.",
              "action": "Retry during RTH or adjust paper-test RTH policy only if your playbook explicitly allows off-hours testing."
            },
            {
              "raw": "DATA_FEATURES_STALE",
              "label": "Feature data stale",
              "explanation": "Feature snapshots feeding the policy are older than the allowed freshness threshold.",
              "action": "Check market-data / features workers and latest feature snapshot timestamps in pipeline footprint."
            },
            {
              "raw": "DATA_BROKER_TRUTH_STALE",
              "label": "Broker-truth data stale",
              "explanation": "Broker-truth inputs (quotes/account/positions) are considered stale for autonomous submit.",
              "action": "Inspect broker-truth snapshot ages and worker-oms reconcile cycles; confirm gateway connectivity."
            }
          ],
          "submit_attempted": false,
          "submit_outcome": "skipped"
        }
      ],
      "ord-stratloop-105": [
        {
          "id": 12,
          "ts_iso": "2026-05-02T16:53:12.741420+00:00",
          "order_id": "ord-stratloop-105",
          "symbol": "GOOGL",
          "account_id": "DUP667958",
          "decision": "deny",
          "reasons_raw": [
            "ORDER_CANDIDATE_STALE",
            "BROKER_ACCOUNT_STATE_STALE",
            "BROKER_POSITIONS_STATE_STALE",
            "BROKER_OPEN_ORDERS_STATE_STALE",
            "RECONCILIATION_STATE_STALE",
            "STRATEGY_LOOP_STATE_STALE",
            "MARKET_CLOSED_FOR_STOCK",
            "PAPER_TEST_RTH_REQUIRED",
            "DATA_FEATURES_STALE",
            "DATA_BROKER_TRUTH_STALE"
          ],
          "reasons_with_labels": [
            {
              "raw": "ORDER_CANDIDATE_STALE",
              "label": "Order candidate stale",
              "explanation": "The OMS order row is older than the policy freshness window for autonomous submit, so the candidate is treated as stale.",
              "action": "Confirm scanner + strategy-loop just ran; check feature timestamps vs decision time; reduce clock skew."
            },
            {
              "raw": "BROKER_ACCOUNT_STATE_STALE",
              "label": "Broker account snapshot stale",
              "explanation": "The latest persisted broker account snapshot is older than the policy TTL.",
              "action": "Verify worker-oms / broker-truth snapshot path; check GET /internal/broker-truth/account/latest freshness."
            },
            {
              "raw": "BROKER_POSITIONS_STATE_STALE",
              "label": "Broker positions snapshot stale",
              "explanation": "Broker positions used for safety checks are older than the allowed freshness window.",
              "action": "Confirm broker-truth positions snapshots are updating; inspect worker-oms logs and snapshot timestamps."
            },
            {
              "raw": "BROKER_OPEN_ORDERS_STATE_STALE",
              "label": "Broker open-orders snapshot stale",
              "explanation": "Open-order snapshots used for duplicate/conflict checks are older than the policy TTL.",
              "action": "Verify broker open-order snapshot ingestion; compare with IBKR Client Portal open orders."
            },
            {
              "raw": "RECONCILIATION_STATE_STALE",
              "label": "Reconciliation signal stale",
              "explanation": "Reconciliation inputs used by autonomous policy are older than the configured TTL.",
              "action": "Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured."
            },
            {
              "raw": "STRATEGY_LOOP_STATE_STALE",
              "label": "Strategy-loop context stale",
              "explanation": "Strategy-loop run/decision context is older than the policy freshness window relative to submit time.",
              "action": "Confirm latest strategy-loop run completed; align scanner → loop cadence; check run metadata timestamps."
            },
            {
              "raw": "MARKET_CLOSED_FOR_STOCK",
              "label": "Market closed",
              "explanation": "Stock entries are blocked because the session is outside the allowed US equity trading window for this policy.",
              "action": "Wait for regular trading hours or verify market-hours / calendar configuration for paper vs live."
            },
            {
              "raw": "PAPER_TEST_RTH_REQUIRED",
              "label": "Paper test — RTH only",
              "explanation": "Paper-test guard requires regular trading hours before allowing this class of entry/submit.",
              "action": "Retry during RTH or adjust paper-test RTH policy only if your playbook explicitly allows off-hours testing."
            },
            {
              "raw": "DATA_FEATURES_STALE",
              "label": "Feature data stale",
              "explanation": "Feature snapshots feeding the policy are older than the allowed freshness threshold.",
              "action": "Check market-data / features workers and latest feature snapshot timestamps in pipeline footprint."
            },
            {
              "raw": "DATA_BROKER_TRUTH_STALE",
              "label": "Broker-truth data stale",
              "explanation": "Broker-truth inputs (quotes/account/positions) are considered stale for autonomous submit.",
              "action": "Inspect broker-truth snapshot ages and worker-oms reconcile cycles; confirm gateway connectivity."
            }
          ],
          "submit_attempted": false,
          "submit_outcome": "skipped"
        }
      ],
      "ord-stratloop-48": [
        {
          "id": 10,
          "ts_iso": "2026-04-24T17:23:06.627567+00:00",
          "order_id": "ord-stratloop-48",
          "symbol": "QQQ",
          "account_id": "DUP667958",
          "decision": "deny",
          "reasons_raw": [
            "RECONCILIATION_STATE_STALE",
            "STRATEGY_LOOP_STATE_STALE"
          ],
          "reasons_with_labels": [
            {
              "raw": "RECONCILIATION_STATE_STALE",
              "label": "Reconciliation signal stale",
              "explanation": "Reconciliation inputs used by autonomous policy are older than the configured TTL.",
              "action": "Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured."
            },
            {
              "raw": "STRATEGY_LOOP_STATE_STALE",
              "label": "Strategy-loop context stale",
              "explanation": "Strategy-loop run/decision context is older than the policy freshness window relative to submit time.",
              "action": "Confirm latest strategy-loop run completed; align scanner → loop cadence; check run metadata timestamps."
            }
          ],
          "submit_attempted": false,
          "submit_outcome": "skipped"
        }
      ],
      "ord-stratloop-47": [
        {
          "id": 9,
          "ts_iso": "2026-04-24T17:23:06.603402+00:00",
          "order_id": "ord-stratloop-47",
          "symbol": "SPY",
          "account_id": "DUP667958",
          "decision": "deny",
          "reasons_raw": [
            "RECONCILIATION_STATE_STALE",
            "STRATEGY_LOOP_STATE_STALE"
          ],
          "reasons_with_labels": [
            {
              "raw": "RECONCILIATION_STATE_STALE",
              "label": "Reconciliation signal stale",
              "explanation": "Reconciliation inputs used by autonomous policy are older than the configured TTL.",
              "action": "Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured."
            },
            {
              "raw": "STRATEGY_LOOP_STATE_STALE",
              "label": "Strategy-loop context stale",
              "explanation": "Strategy-loop run/decision context is older than the policy freshness window relative to submit time.",
              "action": "Confirm latest strategy-loop run completed; align scanner → loop cadence; check run metadata timestamps."
            }
          ],
          "submit_attempted": false,
          "submit_outcome": "skipped"
        }
      ],
      "ord-stratloop-83": [
        {
          "id": 8,
          "ts_iso": "2026-04-24T16:09:10.951475+00:00",
          "order_id": "ord-stratloop-83",
          "symbol": "AAPL",
          "account_id": "DUP667958",
          "decision": "deny",
          "reasons_raw": [
            "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
            "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED",
            "DUPLICATE_CANDIDATE_FINGERPRINT"
          ],
          "reasons_with_labels": [
            {
              "raw": "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
              "label": "Policy / guard reason",
              "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED.",
              "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
            },
            {
              "raw": "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED",
              "label": "Policy / guard reason",
              "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED.",
              "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
            },
            {
              "raw": "DUPLICATE_CANDIDATE_FINGERPRINT",
              "label": "Policy / guard reason",
              "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: DUPLICATE_CANDIDATE_FINGERPRINT.",
              "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
            }
          ],
          "submit_attempted": false,
          "submit_outcome": "skipped"
        }
      ],
      "ord-stratloop-75": [
        {
          "id": 4,
          "ts_iso": "2026-04-24T14:24:08.454746+00:00",
          "order_id": "ord-stratloop-75",
          "symbol": "SPY",
          "account_id": "DUP667958",
          "decision": "deny",
          "reasons_raw": [
            "BROKER_ACCOUNT_STATE_STALE",
            "BROKER_POSITIONS_STATE_STALE",
            "BROKER_OPEN_ORDERS_STATE_STALE"
          ],
          "reasons_with_labels": [
            {
              "raw": "BROKER_ACCOUNT_STATE_STALE",
              "label": "Broker account snapshot stale",
              "explanation": "The latest persisted broker account snapshot is older than the policy TTL.",
              "action": "Verify worker-oms / broker-truth snapshot path; check GET /internal/broker-truth/account/latest freshness."
            },
            {
              "raw": "BROKER_POSITIONS_STATE_STALE",
              "label": "Broker positions snapshot stale",
              "explanation": "Broker positions used for safety checks are older than the allowed freshness window.",
              "action": "Confirm broker-truth positions snapshots are updating; inspect worker-oms logs and snapshot timestamps."
            },
            {
              "raw": "BROKER_OPEN_ORDERS_STATE_STALE",
              "label": "Broker open-orders snapshot stale",
              "explanation": "Open-order snapshots used for duplicate/conflict checks are older than the policy TTL.",
              "action": "Verify broker open-order snapshot ingestion; compare with IBKR Client Portal open orders."
            }
          ],
          "submit_attempted": false,
          "submit_outcome": "skipped"
        }
      ],
      "ord-stratloop-70": [
        {
          "id": 2,
          "ts_iso": "2026-04-24T13:32:17.384925+00:00",
          "order_id": "ord-stratloop-70",
          "symbol": "SPY",
          "account_id": "DUP667958",
          "decision": "deny",
          "reasons_raw": [
            "RECONCILIATION_STATE_STALE",
            "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
            "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED"
          ],
          "reasons_with_labels": [
            {
              "raw": "RECONCILIATION_STATE_STALE",
              "label": "Reconciliation signal stale",
              "explanation": "Reconciliation inputs used by autonomous policy are older than the configured TTL.",
              "action": "Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured."
            },
            {
              "raw": "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
              "label": "Policy / guard reason",
              "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED.",
              "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
            },
            {
              "raw": "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED",
              "label": "Policy / guard reason",
              "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED.",
              "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
            }
          ],
          "submit_attempted": false,
          "submit_outcome": "skipped"
        }
      ],
      "ord-stratloop-69": [
        {
          "id": 1,
          "ts_iso": "2026-04-24T13:32:17.340066+00:00",
          "order_id": "ord-stratloop-69",
          "symbol": "QQQ",
          "account_id": "DUP667958",
          "decision": "deny",
          "reasons_raw": [
            "RECONCILIATION_STATE_STALE",
            "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
            "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED"
          ],
          "reasons_with_labels": [
            {
              "raw": "RECONCILIATION_STATE_STALE",
              "label": "Reconciliation signal stale",
              "explanation": "Reconciliation inputs used by autonomous policy are older than the configured TTL.",
              "action": "Review /internal/reconciliation-v2/latest and pipeline footprint; run read-only recon preview if configured."
            },
            {
              "raw": "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
              "label": "Policy / guard reason",
              "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED.",
              "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
            },
            {
              "raw": "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED",
              "label": "Policy / guard reason",
              "explanation": "This reason code is not in the Phase 14B operator glossary yet; the raw code is still authoritative for automation. Raw: AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED.",
              "action": "Inspect GET /internal/autonomous-policy/runs (full detail) or extend kestrel_oms.operator_evidence_report."
            }
          ],
          "submit_attempted": false,
          "submit_outcome": "skipped"
        }
      ]
    },
    "raw_reason_codes_seen": [
      "ORDER_CANDIDATE_STALE",
      "BROKER_ACCOUNT_STATE_STALE",
      "BROKER_POSITIONS_STATE_STALE",
      "BROKER_OPEN_ORDERS_STATE_STALE",
      "RECONCILIATION_STATE_STALE",
      "STRATEGY_LOOP_STATE_STALE",
      "MARKET_CLOSED_FOR_STOCK",
      "PAPER_TEST_RTH_REQUIRED",
      "DATA_FEATURES_STALE",
      "DATA_BROKER_TRUTH_STALE",
      "AUTONOMOUS_MAX_CONCURRENT_GLOBAL_REACHED",
      "AUTONOMOUS_MAX_CONCURRENT_SYMBOL_REACHED",
      "DUPLICATE_CANDIDATE_FINGERPRINT"
    ]
  },
  "open_trades": {
    "enabled": true,
    "account_id": "DUP667958",
    "count": 0,
    "rows": []
  },
  "terminal_control": {
    "enabled": true,
    "persisted_state": "normal",
    "reason_summary": "effective=normal | gov=normal | ops=normal | recon=normal | inc=normal",
    "effective_resolved_state": "normal",
    "effective_reason_summary": "effective=normal | gov=normal | ops=normal | recon=normal | inc=normal",
    "submissions_blocked": false,
    "submit_guard_env_enabled": true,
    "stale_warning": true,
    "live_mismatch": false,
    "persisted_age_seconds": 2811914.133392,
    "blocked_submissions_recent": [
      {
        "id": 3,
        "ts_iso": "2026-05-02T14:38:51.291754+00:00",
        "order_id": "ord-exit-4",
        "symbol": "AAPL",
        "reason_code": "paper_test_rth_required",
        "reason_labels": {
          "label": "Paper test — RTH only",
          "explanation": "Paper-test guard requires regular trading hours before allowing this class of entry/submit.",
          "action": "Retry during RTH or adjust paper-test RTH policy only if your playbook explicitly allows off-hours testing."
        }
      },
      {
        "id": 2,
        "ts_iso": "2026-05-02T14:38:51.287902+00:00",
        "order_id": "ord-exit-3",
        "symbol": "AAPL",
        "reason_code": "paper_test_rth_required",
        "reason_labels": {
          "label": "Paper test — RTH only",
          "explanation": "Paper-test guard requires regular trading hours before allowing this class of entry/submit.",
          "action": "Retry during RTH or adjust paper-test RTH policy only if your playbook explicitly allows off-hours testing."
        }
      },
      {
        "id": 1,
        "ts_iso": "2026-05-02T14:38:51.277890+00:00",
        "order_id": "ord-exit-2",
        "symbol": "AAPL",
        "reason_code": "paper_test_rth_required",
        "reason_labels": {
          "label": "Paper test — RTH only",
          "explanation": "Paper-test guard requires regular trading hours before allowing this class of entry/submit.",
          "action": "Retry during RTH or adjust paper-test RTH policy only if your playbook explicitly allows off-hours testing."
        }
      }
    ]
  },
  "safety": {
    "no_open_trades": true,
    "submissions_blocked": false,
    "has_approved_not_submitted": true
  },
  "operator_narrative": {
    "what_happened": "Latest scanner run id=101 at 2026-05-05T16:27:05.483016+00:00 (universe_size=7). Latest strategy-loop run id=93 with 7 decisions (2 trade, 5 skip). OMS window: 24 orders; approved_not_submitted=3; problem sample count=14.",
    "why_broker_submission_may_not_have_happened": "Autonomous submission policy recorded 8 recent deny evaluation(s); see reasons_with_labels. There are OMS orders in approved_not_submitted (approved locally, no broker id / zero fills) — broker submission did not complete for those rows.",
    "open_trades_answer": "No open trades for account 'DUP667958'.",
    "suggested_next_steps": [
      "Refresh or recompute system control state — persisted control row looks stale.",
      "Review autonomous_policy/runs for snapshot_json on the top deny order_ids.",
      "Inspect approved_not_submitted rows and broker-truth / policy freshness."
    ]
  },
  "worker_freshness": {
    "available": true,
    "generated_at_iso": "2026-06-20T16:59:57.242595+00:00",
    "overall_state": "normal",
    "stale_data_flags": [
      "market_bars_stale_off_rth_informational",
      "market_quotes_stale_off_rth_informational",
      "feature_snapshots_stale_off_rth_informational",
      "scanner_runs_stale_off_rth_informational",
      "strategy_loop_runs_stale_off_rth_informational"
    ],
    "docker_status_available": false,
    "data_freshness": {
      "market_bars": {
        "latest_ts_iso": "2026-05-18T19:59:00+00:00",
        "count": 50329
      },
      "market_quotes": {
        "latest_ts_iso": "2026-05-19T03:54:41.759396+00:00",
        "count": 230867
      },
      "feature_snapshots": {
        "latest_ts_iso": "2026-05-18T19:59:00+00:00",
        "count": 36892
      },
      "scanner_runs": {
        "latest_created_at_iso": "2026-05-05T16:27:05.483016+00:00",
        "count": 101
      },
      "strategy_loop_runs": {
        "latest_created_at_iso": "2026-05-05T16:27:05.579224+00:00",
        "count": 93
      },
      "orders": {
        "latest_created_at_iso": "2026-05-20T13:43:51.015110+00:00",
        "count": 24
      },
      "autonomous_submission_policy_runs": {
        "latest_ts_iso": "2026-05-02T16:53:12.774824+00:00",
        "count": 13
      },
      "risk_runs": {
        "latest_created_at_iso": null,
        "count": 0
      },
      "broker_account_snapshots": {
        "latest_ts_iso": "2026-06-02T04:30:09.163786+00:00",
        "count": 34476
      }
    },
    "services": [
      {
        "service_name": "worker-market-data",
        "docker_status_available": false,
        "container_state": null,
        "exit_code": null,
        "status_message": null,
        "started_at_iso": null,
        "finished_at_iso": null,
        "inferred_health": "ok",
        "inference_source": "market_bars"
      },
      {
        "service_name": "worker-features",
        "docker_status_available": false,
        "container_state": null,
        "exit_code": null,
        "status_message": null,
        "started_at_iso": null,
        "finished_at_iso": null,
        "inferred_health": "ok",
        "inference_source": "feature_snapshots"
      },
      {
        "service_name": "worker-oms",
        "docker_status_available": false,
        "container_state": null,
        "exit_code": null,
        "status_message": null,
        "started_at_iso": null,
        "finished_at_iso": null,
        "inferred_health": "ok",
        "inference_source": "orders+autonomous_submission_policy_runs"
      },
      {
        "service_name": "worker-risk",
        "docker_status_available": false,
        "container_state": null,
        "exit_code": null,
        "status_message": null,
        "started_at_iso": null,
        "finished_at_iso": null,
        "inferred_health": "missing",
        "inference_source": "risk_runs"
      },
      {
        "service_name": "worker-broker-ibkr",
        "docker_status_available": false,
        "container_state": null,
        "exit_code": null,
        "status_message": null,
        "started_at_iso": null,
        "finished_at_iso": null,
        "inferred_health": "ok",
        "inference_source": "broker_account_snapshots"
      }
    ],
    "diagnostics": [
      {
        "subject": "worker-market-data",
        "severity": "info",
        "explanation": "Market bars look stale relative to thresholds, but the approximate calendar says outside likely RTH — treat as informational.",
        "suggested_action": "Optional check of worker-market-data; no automatic restart was performed.",
        "details": {
          "last_data_age_seconds": 2840457.317306
        }
      },
      {
        "subject": "worker-risk",
        "severity": "info",
        "explanation": "No risk_runs rows — risk worker may never have run in this environment or table is empty.",
        "suggested_action": "If risk coverage is expected, verify worker-risk deployment and intake wiring.",
        "details": {}
      }
    ],
    "no_automatic_restart_note": "No automatic worker restart was performed by this report."
  }
}