{
  "schema": "xlink.app.internal_test_checklist.v1",
  "production_go": false,
  "phase": "internal_team_sandbox_p200",
  "owner": "XLink Ops",
  "api_base": "http://54.169.3.137",
  "test_window": {
    "status": "ready_for_small_team",
    "recommended_testers": "10-30",
    "max_sandbox_testers": "30-50",
    "public_beta": "Hold until managed SQL"
  },
  "accounts": {
    "known_test_accounts": ["wason01", "wason001", "wason369"],
    "rule": "each tester should record username, platform, device model, app build, and network"
  },
  "checklist": [
    {
      "id": "auth_login",
      "title": "登录与重启",
      "steps": ["安装后首次进入必须停留登录页", "使用测试账号登录", "杀掉进程后重新打开", "确认不会看到错误用户资料"],
      "expected": "登录状态稳定，错误 token 会回登录页"
    },
    {
      "id": "profile_avatar",
      "title": "资料与头像",
      "steps": ["上传头像", "修改昵称", "重启 App", "在我的页、消息列表、聊天页、通讯录确认头像昵称一致"],
      "expected": "头像昵称跨页面一致，URL 不保留局域网地址"
    },
    {
      "id": "friend_request",
      "title": "好友申请",
      "steps": ["A 搜索 B", "A 发起好友申请", "B 在消息 + / 通讯录入口查看申请", "B 通过后双方通讯录都可见"],
      "expected": "双方好友关系双向成立，重复添加不会产生多条脏数据"
    },
    {
      "id": "direct_chat",
      "title": "单聊消息",
      "steps": ["A 给 B 连续发送文字和表情", "B 给 A 回复", "观察消息列表会话是否出现", "打开会话后未读数清零"],
      "expected": "双方实时可收，消息列表显示会话、头像、未读和最后一条消息"
    },
    {
      "id": "delete_conversation",
      "title": "删除会话",
      "steps": ["A 删除与 B 的会话", "从通讯录重新打开 B", "确认旧消息不回放", "B 再发新消息后会话重新出现"],
      "expected": "删除只是本端 tombstone，新消息能重新拉起会话"
    },
    {
      "id": "group_chat",
      "title": "基础群聊",
      "steps": ["创建小群", "邀请至少 2 个成员", "发送群消息", "确认成员、群消息、群通知、未读状态"],
      "expected": "群成员和群消息可见，群聊不是圈子，圈子加密能力本轮不测"
    },
    {
      "id": "xmq_receipt_trace",
      "title": "XMQ 回执与追踪",
      "steps": ["完成一次好友申请", "完成一次单聊消息", "完成一次群消息", "记录出问题的时间点"],
      "expected": "后台 verifier 可查 receipt/trace；不得伪造 delivered"
    }
  ],
  "feedback_template": {
    "account": "",
    "platform": "iOS / Android",
    "device": "",
    "app_version": "",
    "network": "WiFi / 4G / 5G / hotspot",
    "operation_path": "",
    "expected": "",
    "actual": "",
    "timestamp": "",
    "screenshot_or_video": "",
    "can_reproduce": "yes / no"
  },
  "release_gates": {
    "internal_test": "Go with backup",
    "managed_sql": "Hold",
    "productionGo": false,
    "paynex_mutation": "Hold",
    "wallet_signing": "Hold",
    "mainnet_write": "Hold",
    "auto_cashflow": "Hold"
  }
}
