{
  "ok": true,
  "status": "blocked_before_message_persistence",
  "scope": "role_chat_message_persistence_plan_preview",
  "roleId": "wf-moonlit-bookseller",
  "roleName": "月下书店老板",
  "sourceDocument": "docs/20角色卡片温度与酒馆系参考补充-2026-06-12.md",
  "modelAdapter": {
    "status": "blocked_before_model_adapter_call",
    "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",
      "model_adapter_live_call_missing",
      "model_response_normalizer_missing",
      "assistant_output_policy_log_missing",
      "model_timeout_and_retry_not_verified"
    ],
    "provider": "deepseek",
    "serverTurnId": "preview-preview-client-turn-id"
  },
  "policyGate": {
    "decision": "allow",
    "status": "preview_passed",
    "effect": "message_records_can_be_planned_after_real_storage_and_model_response"
  },
  "messageRecords": [
    {
      "type": "user",
      "targetStatus": "pending",
      "contentPreview": "今天有点累，想在这里待一会儿。",
      "requiredEvidence": [
        "authenticated_user_id",
        "session_owner_verified",
        "role_access_allowed",
        "client_turn_id_unique"
      ],
      "rollback": "mark_user_message_failed_before_model_call"
    },
    {
      "type": "assistant",
      "targetStatus": "completed",
      "contentPreview": "assistant_output_after_model_and_policy_checks",
      "requiredEvidence": [
        "model_call_id_recorded",
        "assistant_output_safety_check_passed",
        "reserved_points_settled",
        "message_saved_with_role_id"
      ],
      "rollback": "mark_assistant_message_failed_and_refund_points"
    },
    {
      "type": "assistant",
      "targetStatus": "failed",
      "contentPreview": "safe_failure_message_without_points_charge",
      "requiredEvidence": [
        "model_timeout_or_provider_error_recorded",
        "reserved_points_refunded",
        "failure_reason_visible_to_user"
      ],
      "rollback": "no_additional_charge"
    }
  ],
  "auditRecords": [
    "model_call_log",
    "content_moderation_log",
    "points_ledger_entry",
    "message_status_transition_log",
    "request_id_trace"
  ],
  "memoryCandidatePlan": {
    "status": "blocked_until_message_success_and_user_opt_in",
    "requiredChecks": [
      "memory_opt_in_confirmed",
      "assistant_message_completed",
      "high_sensitive_privacy_rejected",
      "forget_requests_excluded_before_prompt",
      "memory_candidate_bound_to_user_and_role"
    ],
    "targetTable": "role_memory_candidates"
  },
  "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",
    "model_adapter_live_call_missing",
    "model_response_normalizer_missing",
    "assistant_output_policy_log_missing",
    "model_timeout_and_retry_not_verified",
    "message_transaction_missing",
    "message_status_transition_log_missing",
    "model_call_log_storage_missing",
    "memory_candidate_persistence_missing"
  ],
  "next": [
    "connect_chat_sessions_and_messages_tables",
    "persist_user_message_pending_before_model_call",
    "persist_assistant_message_after_output_policy",
    "bind_model_call_log_to_message_id",
    "commit_memory_candidates_after_success_only"
  ],
  "boundaries": [
    "message_persistence_plan_preview_only",
    "does_not_store_user_message",
    "does_not_store_assistant_message",
    "does_not_write_production_database",
    "does_not_call_real_model",
    "does_not_reserve_or_charge_points",
    "does_not_expose_internal_prompt_blocks"
  ]
}