{
  "schemaVersion": "dxrg-trading-agent-state-memory-checklist/v1",
  "version": "1.0.0",
  "publishedAt": "2026-07-22",
  "title": "DXRG Trading-Agent State and Memory Test Checklist",
  "description": "Eight failure fixtures for evaluating state identity, freshness, portfolio reconciliation, order lifecycle, venue state, memory provenance, action binding, and post-settlement feedback.",
  "evidenceBoundary": "This is an engineering and evaluation framework. Passing the checks does not establish trading skill, profitability, universal safety, or cross-market transfer.",
  "source": {
    "title": "Market State, Portfolio State, and Memory in Trading Agents",
    "url": "https://www.dxrg.ai/blogs/trading-agent-state-memory",
    "primaryResearch": "https://arxiv.org/abs/2604.26091"
  },
  "checks": [
    {
      "checkId": "snapshot-identity",
      "layer": "state-assembly",
      "decisionQuestion": "Can every model invocation be tied to one decision cutoff and state snapshot identifier?",
      "requiredFields": ["snapshot_id", "decision_cutoff", "source_sequences", "rendered_context_hash"],
      "failureFixture": "Mix a market update observed after the cutoff with a portfolio record observed before it without labeling the difference.",
      "passCondition": "The runtime preserves field-level lineage and rejects a falsely uniform snapshot time.",
      "defaultResponse": "rebuild_snapshot",
      "evidenceClass": "dxrg-engineering-framework"
    },
    {
      "checkId": "market-freshness",
      "layer": "market-state",
      "decisionQuestion": "Are market fields current enough for the action and venue?",
      "requiredFields": ["feed_id", "observed_at", "sequence", "freshness_limit", "connectivity_state"],
      "failureFixture": "Disconnect the primary feed while cached prices remain available.",
      "passCondition": "The validator marks the feed stale and withholds exposure that requires current data.",
      "defaultResponse": "abstain_and_refresh",
      "evidenceClass": "dxrg-engineering-framework"
    },
    {
      "checkId": "portfolio-reconciliation",
      "layer": "portfolio-state",
      "decisionQuestion": "Do balances, positions, fees, and available capital agree with authoritative venue or ledger records?",
      "requiredFields": ["account_id", "ledger_marker", "balances", "positions", "fees", "reconciliation_status"],
      "failureFixture": "Present a local balance that omits a newly settled fill and fee.",
      "passCondition": "The mismatch blocks new exposure until the portfolio is reconciled.",
      "defaultResponse": "hold_and_reconcile",
      "evidenceClass": "dxrg-engineering-framework"
    },
    {
      "checkId": "unresolved-order-state",
      "layer": "order-lifecycle",
      "decisionQuestion": "Can the runtime distinguish proposed, submitted, acknowledged, partially filled, and terminal orders?",
      "requiredFields": ["request_id", "venue_order_id", "order_state", "state_observed_at", "filled_quantity"],
      "failureFixture": "Return a submission timeout after the venue may have accepted the order.",
      "passCondition": "The runtime queries authoritative order state before any retry and prevents duplicate submission.",
      "defaultResponse": "query_then_recover",
      "evidenceClass": "dxrg-engineering-framework"
    },
    {
      "checkId": "venue-state",
      "layer": "venue",
      "decisionQuestion": "Are trading status, asset rules, minimums, and connectivity valid for the proposed action?",
      "requiredFields": ["venue_id", "rule_version", "trading_status", "minimums", "observed_at"],
      "failureFixture": "Change a venue minimum or halt status after inference begins.",
      "passCondition": "Final validation uses the current venue state and rejects an obsolete payload.",
      "defaultResponse": "reject_or_recompile",
      "evidenceClass": "dxrg-engineering-framework"
    },
    {
      "checkId": "memory-provenance",
      "layer": "memory",
      "decisionQuestion": "Does each retained item identify its source, time, subject, effective interval, and supersession state?",
      "requiredFields": ["memory_id", "source", "observed_at", "effective_interval", "subject", "superseded_by"],
      "failureFixture": "Retrieve prior reasoning that describes an expired strategy as if it were an active rule.",
      "passCondition": "The runtime labels the item as historical context and excludes it from current authority.",
      "defaultResponse": "demote_or_expire_memory",
      "evidenceClass": "dxrg-engineering-framework"
    },
    {
      "checkId": "pre-submit-state-binding",
      "layer": "policy-validation",
      "decisionQuestion": "Is the final venue-ready payload checked against the state version used for policy enforcement?",
      "requiredFields": ["snapshot_id", "action_id", "policy_version", "payload_hash", "pre_submit_state_id"],
      "failureFixture": "Reduce available capital with a delayed fill while the model is reasoning.",
      "passCondition": "Policy detects the changed dependency and resizes, rejects, or recompiles according to the mandate.",
      "defaultResponse": "revalidate_payload",
      "evidenceClass": "dxrg-engineering-framework"
    },
    {
      "checkId": "post-settlement-feedback",
      "layer": "reconciliation",
      "decisionQuestion": "Does the next cycle begin from acknowledged, settled, and reconciled state?",
      "requiredFields": ["venue_response", "settlement_marker", "fees", "final_balance", "next_snapshot_id"],
      "failureFixture": "Start the next invocation before a prior fill and fee reach portfolio state.",
      "passCondition": "The runtime withholds the dependent decision until the reconciled state becomes the next snapshot.",
      "defaultResponse": "pause_dependent_actions",
      "evidenceClass": "dxrg-engineering-framework"
    }
  ]
}
