{
  "ok": true,
  "status": "blocked_before_points_ledger",
  "scope": "role_chat_points_ledger_plan_preview",
  "roleId": "wf-moonlit-bookseller",
  "roleName": "月下书店老板",
  "sourceDocument": "docs/20角色卡片温度与酒馆系参考补充-2026-06-12.md",
  "turnExecution": {
    "status": "blocked_before_turn_execution",
    "blockers": [
      "model_api_key_missing",
      "points_charge_not_live",
      "production_chat_storage_missing",
      "user_auth_not_live",
      "chat_turn_transaction_not_live",
      "idempotent_points_reservation_missing",
      "assistant_message_persistence_missing"
    ],
    "requiredSteps": [
      "authenticate_user",
      "policy_gate",
      "reserve_points_before_model_call",
      "persist_user_message_pending",
      "call_model_adapter_after_policy_gate",
      "persist_assistant_message_after_success",
      "commit_memory_candidates_after_user_control",
      "settle_points_after_success"
    ]
  },
  "idempotency": {
    "required": true,
    "clientTurnId": "preview-client-turn-id",
    "serverTurnId": "preview-preview-client-turn-id",
    "duplicateHandling": "return_existing_turn_or_block_before_double_charge"
  },
  "policyGate": {
    "decision": "allow",
    "status": "preview_passed",
    "effect": "ledger_can_be_planned_after_real_auth_and_balance_check"
  },
  "ledgerEntries": [
    {
      "type": "reserve",
      "status": "blocked",
      "amount": -120,
      "trigger": "before_model_call_after_policy_allow",
      "idempotencyKey": "preview-preview-client-turn-id:reserve",
      "requiredEvidence": [
        "authenticated_user_id",
        "points_balance_sufficient",
        "turn_id_not_previously_charged",
        "policy_gate_allow"
      ]
    },
    {
      "type": "settle",
      "status": "blocked",
      "amount": 0,
      "trigger": "model_call_success",
      "idempotencyKey": "preview-preview-client-turn-id:settle",
      "requiredEvidence": [
        "assistant_message_persisted",
        "model_call_id_recorded",
        "output_policy_check_passed"
      ]
    },
    {
      "type": "refund",
      "status": "blocked",
      "amount": 120,
      "trigger": "model_timeout_or_failed_storage",
      "idempotencyKey": "preview-preview-client-turn-id:refund",
      "requiredEvidence": [
        "reserved_points_exist",
        "no_completed_assistant_message",
        "failure_reason_recorded"
      ]
    }
  ],
  "refundRules": [
    "refund_points_on_model_failure",
    "refund_points_on_model_timeout",
    "refund_points_when_assistant_message_fails_to_persist",
    "do_not_charge_when_policy_gate_blocks",
    "do_not_double_charge_duplicate_client_turn_id"
  ],
  "blockers": [
    "model_api_key_missing",
    "points_charge_not_live",
    "production_chat_storage_missing",
    "user_auth_not_live",
    "chat_turn_transaction_not_live",
    "idempotent_points_reservation_missing",
    "assistant_message_persistence_missing",
    "points_ledger_live_transaction_missing",
    "points_balance_check_missing",
    "refund_transaction_missing",
    "duplicate_turn_charge_guard_missing"
  ],
  "next": [
    "connect_authenticated_user_wallet",
    "implement_idempotent_points_reservation",
    "bind_model_success_to_points_settlement",
    "bind_model_or_storage_failure_to_refund",
    "verify_duplicate_client_turn_id_does_not_double_charge"
  ],
  "boundaries": [
    "points_plan_preview_only",
    "does_not_reserve_or_charge_points",
    "does_not_write_production_database",
    "does_not_call_real_model",
    "does_not_create_payment_order",
    "does_not_expose_internal_prompt_blocks"
  ]
}