{
  "run": "2026-10-07 isolated real HTTP",
  "ports": {
    "postgres": 56488,
    "backend": 18000,
    "bff": 13000,
    "notificationMock": 13001
  },
  "fixture": {
    "meetings": {
      "A_started": 1,
      "B1_minutes_attend": 2,
      "B2_attend_minutes": 3,
      "D_paid_no_contract": 4
    },
    "contact_id": 2,
    "contract_count": 0
  },
  "checks": [
    {
      "id": "HTTP-001",
      "name": "Real NDB+BFF channel readiness",
      "precondition": "Dedicated ports/databases",
      "action": "GET /health/ready",
      "expected": "NDB signed ping and PG both up",
      "at": "2026-10-06T16:25:16.992Z",
      "actual": {
        "status": "ok",
        "channelDb": "up",
        "ndb": "up"
      },
      "status": "Pass"
    },
    {
      "id": "HTTP-002",
      "name": "Synthetic zero-contract empty baseline",
      "precondition": "Fresh migration and seed",
      "action": "Read isolated ORM snapshot",
      "expected": "0 Registration, 0 Tasks, 0 Contracts",
      "at": "2026-10-06T16:25:16.992Z",
      "actual": {
        "registrations": [],
        "tasks": [],
        "contract_count": 0
      },
      "status": "Pass"
    },
    {
      "id": "HTTP-003",
      "name": "Anonymous minutes write denied",
      "precondition": "No JWT",
      "action": "PUT A minutes",
      "expected": "401 UNAUTHENTICATED, no mutation",
      "at": "2026-10-06T16:25:17.811Z",
      "actual": {
        "status": 401,
        "data": {
          "error": {
            "code": "UNAUTHENTICATED",
            "message": "请先登录"
          },
          "requestId": "727c6e9f-eec0-4059-ae09-bd8e3a6ffd4b"
        }
      },
      "status": "Pass"
    },
    {
      "id": "HTTP-004",
      "name": "Unbound synthetic JWT denied",
      "precondition": "User lacks phone/contact",
      "action": "PUT A minutes",
      "expected": "403 CONTACT_NOT_BOUND",
      "at": "2026-10-06T16:25:17.814Z",
      "actual": {
        "status": 403,
        "data": {
          "error": {
            "code": "CONTACT_NOT_BOUND",
            "message": "请先绑定客户联系人"
          },
          "requestId": "1b04e380-2638-4bde-bbf8-562e538f5652"
        }
      },
      "status": "Pass"
    },
    {
      "id": "HTTP-005",
      "name": "Legacy subscription is not reservation",
      "precondition": "Only old channel subscription seeded",
      "action": "GET A minutes",
      "expected": "JSON null, no NDB Task",
      "at": "2026-10-06T16:25:17.824Z",
      "actual": {
        "reservation": null,
        "taskCount": 0
      },
      "status": "Pass"
    },
    {
      "id": "HTTP-006",
      "name": "A started free minutes-only created",
      "precondition": "A started,0h,no contract",
      "action": "PUT A minutes",
      "expected": "reserved+unified Registration/Task",
      "at": "2026-10-06T16:25:18.628Z",
      "status": "Fail",
      "actual": "{\"status\":502,\"data\":{\"error\":{\"code\":\"NDB_CONTRACT_ERROR\",\"message\":\"上游响应格式异常\"},\"requestId\":\"779c8c45-ea09-4ef1-86e0-beb00e029ebd\"}}"
    }
  ],
  "summary": {
    "executed": 6,
    "pass": 5,
    "fail": 1
  },
  "fatal": "HTTP-006 failed",
  "cleanup": {
    "services": [
      {
        "role": "Backend",
        "pid": 52331,
        "exitCode": null,
        "signal": "SIGTERM"
      },
      {
        "role": "BFF",
        "pid": 52333,
        "exitCode": null,
        "signal": "SIGTERM"
      }
    ],
    "container": "ndb-qa-minutes-http-20261007-56488",
    "containerStopped": true
  },
  "boundaries": {
    "realWechatLogin": false,
    "miniUI": false,
    "realEmails": 0,
    "sharedBusinessDbWrites": 0
  },
  "mockNotifications": []
}
