{
  "ok": true,
  "status": "blocked_before_model_call",
  "scope": "role_chat_invocation_preflight",
  "roleId": "wf-moonlit-bookseller",
  "roleName": "月下书店老板",
  "sourceDocument": "docs/20角色卡片温度与酒馆系参考补充-2026-06-12.md",
  "requestPreview": {
    "messagePreview": "今晚想聊聊今天的心情。",
    "userProfile": {
      "nickname": "访客",
      "preferredTone": "温柔、慢一点",
      "boundary": "先保持轻量陪伴，不追问隐私",
      "memoryOptIn": false
    },
    "estimatedPointCost": 120,
    "streamMode": "disabled_until_model_adapter_ready"
  },
  "sessionGate": {
    "status": "preview_only",
    "openingLine": "今晚风有点凉，我把靠窗的位置留给你了。想先说说今天，还是先安静待一会儿？",
    "contextSeed": "访客希望这次对话温柔、慢一点。 用户边界：先保持轻量陪伴，不追问隐私。 角色先用低声、安稳、像夜里仍然亮着的灯。承接情绪，再按短句和中句为主，少讲大道理，多用具体场景回应用户。回应。",
    "internalPromptHidden": true
  },
  "messageSafety": {
    "decision": "allow",
    "matchedRules": [],
    "rewriteHint": "可继续进入模型 adapter，但正式环境仍需接入真实内容审核和日志策略。",
    "nextStep": "continue_to_model_adapter_after_real_policy_gate",
    "policy": {
      "contentBoundary": "romantic_story_and_emotional_companionship",
      "rulesVersion": "preview-2026-06-13",
      "productionPolicyMissing": true
    }
  },
  "memoryGate": {
    "mode": "session_only_preview",
    "memoryCandidates": [],
    "blockedMemoryCandidates": [],
    "forgetRequest": {
      "action": "none",
      "target": ""
    },
    "forbiddenMemoryTypes": [
      "payment_credentials",
      "government_id",
      "home_address",
      "phone_number",
      "real_person_identity_without_consent"
    ],
    "nextStep": "session_only_until_user_enables_memory_settings_ui"
  },
  "modelGate": {
    "status": "blocked",
    "provider": "deepseek",
    "code": "waiting_for_model_key",
    "missing": [
      "model API key",
      "monthly budget",
      "initial concurrency",
      "fallback provider decision"
    ],
    "requiredBeforeCall": [
      "server_side_model_adapter_configured",
      "timeout_and_quota_policy_configured",
      "content_policy_gate_passed",
      "no_frontend_secret_exposure"
    ]
  },
  "billingGate": {
    "status": "blocked",
    "code": "points_charge_disabled_without_payment_and_model",
    "missing": [
      "payment credentials",
      "points ledger live transaction",
      "model cost rule",
      "failed call refund rule"
    ],
    "requiredBeforeCharge": [
      "authenticated_user_id",
      "idempotent_chat_turn_id",
      "model_call_success_or_refundable_failure_state",
      "payment_callback_and_order_status_ready"
    ]
  },
  "blockers": [
    "model_api_key_missing",
    "points_charge_not_live",
    "production_chat_storage_missing",
    "user_auth_not_live"
  ],
  "next": [
    "configure_model_adapter_before_real_chat",
    "connect_authenticated_user_and_points_ledger",
    "connect_production_chat_storage_and_memory_delete_flow",
    "run_real_content_policy_provider_before_streaming"
  ],
  "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"
  ]
}