{
  "ok": true,
  "status": "blocked_before_live_chat_turn_transaction",
  "scope": "role_chat_transaction_gate_preview",
  "roleId": "wf-moonlit-bookseller",
  "roleName": "月下书店老板",
  "sourceDocument": "docs/20角色卡片温度与酒馆系参考补充-2026-06-12.md",
  "request": {
    "clientTurnId": "turn-preview-001",
    "sessionId": "session-preview-001",
    "userId": "preview-user-id",
    "messageId": "message-preview-001",
    "action": "send_message"
  },
  "databaseSchema": {
    "status": "blocked_before_chat_schema_migration",
    "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",
      "production_chat_history_read_missing",
      "chat_history_owner_filter_missing",
      "chat_message_delete_transaction_missing",
      "chat_delete_audit_log_missing",
      "memory_candidate_delete_cascade_missing",
      "chat_schema_live_migration_missing",
      "chat_rls_live_failure_cases_missing",
      "chat_message_encryption_or_redaction_policy_missing",
      "chat_table_backup_window_missing"
    ],
    "chatDraft": "server/db/migrations/2026-06-15-role-chat-core.sql",
    "temporaryReplayQa": "scripts/qa-role-chat-postgres-replay.cjs"
  },
  "messagePersistence": {
    "status": "blocked_before_message_persistence",
    "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"
    ],
    "requiredRecords": [
      "user",
      "assistant",
      "assistant"
    ]
  },
  "pointsLedger": {
    "status": "blocked_before_points_ledger",
    "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"
    ],
    "requiredLedgerEntries": [
      "reserve",
      "settle",
      "refund"
    ]
  },
  "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",
    "credentialSource": "server_environment_only"
  },
  "historyAccess": {
    "status": "blocked_before_chat_history_access",
    "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",
      "production_chat_history_read_missing",
      "chat_history_owner_filter_missing",
      "chat_message_delete_transaction_missing",
      "chat_delete_audit_log_missing",
      "memory_candidate_delete_cascade_missing"
    ],
    "deleteStrategy": "soft_delete_message_and_write_audit_log"
  },
  "gateChecks": [
    {
      "code": "live_chat_migration_applied",
      "status": "blocked",
      "evidence": "server/db/migrations/2026-06-15-role-chat-core.sql",
      "blocker": "chat_schema_live_migration_missing"
    },
    {
      "code": "live_rls_failure_cases_passed",
      "status": "blocked",
      "evidence": "scripts/qa-role-chat-postgres-replay.cjs",
      "blocker": "chat_rls_live_failure_cases_missing"
    },
    {
      "code": "idempotent_client_turn_lock_ready",
      "status": "blocked",
      "evidence": "turn-preview-001",
      "blocker": "duplicate_turn_charge_guard_missing"
    },
    {
      "code": "points_reservation_transaction_ready",
      "status": "blocked",
      "evidence": [
        "reserve",
        "settle",
        "refund"
      ],
      "blocker": "points_ledger_live_transaction_missing"
    },
    {
      "code": "model_adapter_key_configured",
      "status": "blocked",
      "evidence": "server_environment_only",
      "blocker": "model_adapter_live_call_missing"
    },
    {
      "code": "message_persistence_transaction_ready",
      "status": "blocked",
      "evidence": [
        "user",
        "assistant",
        "assistant"
      ],
      "blocker": "message_transaction_missing"
    },
    {
      "code": "message_event_audit_ready",
      "status": "blocked",
      "evidence": "role_chat_message_events",
      "blocker": "message_status_transition_log_missing"
    },
    {
      "code": "memory_delete_reconciliation_ready",
      "status": "blocked",
      "evidence": "exclude_deleted_messages_and_linked_memory_candidates_before_prompt",
      "blocker": "memory_candidate_delete_cascade_missing"
    },
    {
      "code": "manual_launch_approval_ready",
      "status": "blocked",
      "evidence": "requires_human_approval_after_backup_rls_and_rollback_review",
      "blocker": "chat_turn_transaction_manual_approval_missing"
    }
  ],
  "executionOrder": [
    "authenticate_user_and_session_owner",
    "run_input_content_policy",
    "lock_client_turn_id",
    "reserve_points",
    "write_user_message_pending",
    "write_message_created_event",
    "call_model_adapter",
    "run_assistant_output_policy",
    "write_assistant_message_completed_or_failed",
    "write_model_call_log",
    "write_message_event_audit",
    "write_or_skip_memory_candidates",
    "settle_or_refund_points",
    "exclude_deleted_messages_before_next_prompt"
  ],
  "rollbackAndRecovery": [
    "no_points_reserved_when_policy_blocks",
    "refund_points_when_model_or_storage_fails",
    "mark_turn_failed_without_duplicate_charge",
    "preserve_redacted_audit_events",
    "do_not_reintroduce_soft_deleted_messages_or_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",
    "production_chat_history_read_missing",
    "chat_history_owner_filter_missing",
    "chat_message_delete_transaction_missing",
    "chat_delete_audit_log_missing",
    "memory_candidate_delete_cascade_missing",
    "chat_schema_live_migration_missing",
    "chat_rls_live_failure_cases_missing",
    "chat_message_encryption_or_redaction_policy_missing",
    "chat_table_backup_window_missing",
    "live_chat_turn_transaction_missing",
    "chat_turn_transaction_manual_approval_missing"
  ],
  "next": [
    "wire_server_side_chat_turn_transaction_after_live_migration",
    "verify_live_rls_owner_and_anon_failure_cases",
    "bind_points_ledger_to_client_turn_lock",
    "bind_message_events_to_every_status_transition",
    "require_manual_launch_approval_before_real_model_traffic"
  ],
  "boundaries": [
    "transaction_gate_preview_only",
    "does_not_execute_chat_transaction",
    "does_not_create_database_tables",
    "does_not_run_migration",
    "does_not_touch_live_database",
    "does_not_write_production_database",
    "does_not_read_real_chat_history",
    "does_not_delete_real_chat_message",
    "does_not_call_real_model",
    "does_not_reserve_or_charge_points",
    "does_not_create_payment_order",
    "does_not_expose_internal_prompt_blocks"
  ]
}