{
  "ok": true,
  "scope": "role_chat_turn_repository_preview",
  "status": "blocked_before_live_chat_turn_repository",
  "date": "2026-06-17",
  "repository": {
    "code": "role_chat_turn_repository",
    "status": "preview_transaction_repository_ready",
    "repositoryKind": "transactional_write_repository",
    "readMethods": [
      "getSessionForOwner",
      "getRecentMessagesForPrompt",
      "getMemoryCandidatesForPrompt"
    ],
    "writeMethods": [
      "createPendingUserMessage",
      "recordModelCall",
      "completeAssistantMessage",
      "markTurnFailed"
    ],
    "liveTables": [
      "role_chat_sessions",
      "role_chat_messages",
      "role_chat_model_calls",
      "role_chat_message_events"
    ],
    "transactionBoundary": "single_client_turn_transaction_after_safety_and_points_reservation",
    "idempotencyKey": "userId:sessionId:clientTurnId",
    "promotionGate": "chat_core_migration_live_rls_points_and_model_adapter_ready"
  },
  "request": {
    "roleId": "wf-moonlit-bookseller",
    "userId": "preview-user-id",
    "sessionId": "session-preview-001",
    "clientTurnId": "turn-preview-001",
    "messagePreview": "今天有点累，想在这里待一会儿。",
    "memoryOptIn": "true"
  },
  "role": {
    "id": "wf-moonlit-bookseller",
    "name": "月下书店老板",
    "subtitle": "总在打烊后为你留一盏灯",
    "memoryRules": [
      "记住用户偏好的称呼。",
      "记住用户反复提到的压力来源。",
      "不保存身份证、支付、住址等高敏隐私。",
      "用户要求忘记时，后续必须允许清除。"
    ],
    "promptBlocksExposed": false
  },
  "readPlan": {
    "session": {
      "status": "preview_only",
      "openingLine": "今晚风有点凉，我把靠窗的位置留给你了。想先说说今天，还是先安静待一会儿？",
      "contextSeed": "访客希望这次对话温柔、慢一点。 用户边界：先保持轻量陪伴，不追问隐私。 角色先用低声、安稳、像夜里仍然亮着的灯。承接情绪，再按短句和中句为主，少讲大道理，多用具体场景回应用户。回应。"
    },
    "recentMessagesForPrompt": {
      "status": "blocked_until_production_chat_history_repository_ready",
      "source": "role_chat_messages",
      "ownerFilter": "user_id = authenticated_user_id and session_id = requested_session_id"
    },
    "memoryCandidatesForPrompt": {
      "status": "blocked_until_memory_repository_ready",
      "source": "role_memory_candidates",
      "excludes": [
        "delete_requested",
        "rejected",
        "high_sensitive_privacy"
      ]
    }
  },
  "writePlan": {
    "pendingUserMessage": {
      "method": "createPendingUserMessage",
      "status": "blocked",
      "targetTable": "role_chat_messages",
      "requiredBeforeWrite": [
        "authenticated_user_id",
        "session_owner_verified",
        "client_turn_id_unique"
      ]
    },
    "modelCall": {
      "method": "recordModelCall",
      "status": "blocked",
      "targetTable": "role_chat_model_calls",
      "requiredBeforeWrite": [
        "model_adapter_key_configured",
        "points_reserved",
        "input_policy_allow"
      ]
    },
    "assistantMessage": {
      "method": "completeAssistantMessage",
      "status": "blocked",
      "targetTable": "role_chat_messages",
      "requiredBeforeWrite": [
        "assistant_output_policy_checked",
        "model_call_id_recorded"
      ]
    },
    "failureState": {
      "method": "markTurnFailed",
      "status": "blocked",
      "targetTable": "role_chat_message_events",
      "requiredBeforeWrite": [
        "failure_reason_recorded",
        "points_refund_or_release_planned"
      ]
    }
  },
  "previewContracts": {
    "invocation": {
      "scope": "role_chat_invocation_preflight",
      "status": "blocked_before_model_call",
      "blockers": [
        "model_api_key_missing",
        "points_charge_not_live",
        "production_chat_storage_missing",
        "user_auth_not_live"
      ],
      "boundaries": [
        "preflight_only_not_real_chat",
        "does_not_call_real_model",
        "does_not_charge_points",
        "does_not_write_production_database",
        "does_not_store_user_message",
        "does_not_store_user_memory",
        "does_not_expose_internal_prompt_blocks"
      ]
    },
    "turnExecution": {
      "scope": "role_chat_turn_execution_plan_preview",
      "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"
      ],
      "boundaries": [
        "turn_plan_preview_only",
        "does_not_call_real_model",
        "does_not_reserve_or_charge_points",
        "does_not_write_production_database",
        "does_not_store_user_message",
        "does_not_store_user_memory",
        "does_not_expose_internal_prompt_blocks"
      ]
    },
    "pointsLedger": {
      "scope": "role_chat_points_ledger_plan_preview",
      "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"
      ],
      "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"
      ]
    },
    "modelAdapter": {
      "scope": "role_chat_model_adapter_plan_preview",
      "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"
      ],
      "boundaries": [
        "model_adapter_plan_preview_only",
        "does_not_call_real_model",
        "does_not_expose_model_api_key",
        "does_not_expose_internal_prompt_blocks",
        "does_not_reserve_or_charge_points",
        "does_not_write_production_database",
        "does_not_store_user_message"
      ]
    },
    "messagePersistence": {
      "scope": "role_chat_message_persistence_plan_preview",
      "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"
      ],
      "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"
      ]
    },
    "transactionGate": {
      "scope": "role_chat_transaction_gate_preview",
      "status": "blocked_before_live_chat_turn_transaction",
      "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"
      ],
      "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"
      ]
    }
  },
  "executionOrder": [
    "getSessionForOwner",
    "getRecentMessagesForPrompt",
    "getMemoryCandidatesForPrompt",
    "runInputContentPolicy",
    "reservePointsBeforeModelCall",
    "createPendingUserMessage",
    "recordModelCall",
    "completeAssistantMessageOrMarkTurnFailed",
    "settleOrRefundPoints",
    "writeMessageEventAudit"
  ],
  "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",
    "chat_schema_live_migration_missing",
    "chat_rls_live_failure_cases_missing",
    "memory_candidate_delete_cascade_missing",
    "chat_turn_transaction_manual_approval_missing",
    "live_role_chat_repository_not_implemented",
    "points_ledger_live_transaction_not_implemented",
    "model_adapter_key_configured_on_server_only_missing"
  ],
  "nextStep": "implement live repository only after chat core migration, RLS failure cases, points ledger, model adapter key, and manual approval are ready",
  "boundaries": [
    "role_chat_turn_repository_preview_only",
    "does_not_execute_chat_transaction",
    "does_not_call_real_model",
    "does_not_reserve_or_charge_points",
    "does_not_write_production_database",
    "does_not_store_user_message",
    "does_not_expose_internal_prompt_blocks"
  ]
}