{
  "testBatch": "DUAL_FEEDBACK_AUDIT_20260925095017",
  "fixtureBatch": "20260925095017",
  "startedAt": "2026-09-25T01:54:16.972Z",
  "code": {
    "branch": "standard_wxb",
    "head": "83c190402d3b95f511f4efdafe83ca205033cb8f",
    "dirty": true,
    "dirtyPathCount": 1
  },
  "targets": {
    "mysql": "101.201.249.22:3306/foodsafe_test",
    "dm": "121.43.241.161:5236/WWWWEB"
  },
  "cases": [
    {
      "kind": "mysql",
      "id": "valid-unicode-longtext-max-columns",
      "status": "PASS",
      "expected": "真实写入；长中文/emoji、type=32、user/contact=128、canteenId=NULL 精确回读",
      "actual": {
        "http": 201,
        "code": 200,
        "created": true,
        "dbExact": true
      },
      "evidence": {
        "feedbackId": 20,
        "contentLength": 5439
      }
    },
    {
      "kind": "mysql",
      "id": "audit-db-readback",
      "status": "PASS",
      "expected": "反馈请求产生同 requestId、同租户审计行",
      "actual": {
        "found": true,
        "tenantMatch": true
      },
      "evidence": {
        "auditId": 128758
      }
    },
    {
      "kind": "mysql",
      "id": "audit-cross-tenant-isolation",
      "status": "PASS",
      "expected": "错误租户查询详情返回 HTTP 404",
      "actual": {
        "http": 404,
        "code": 404,
        "message": "Not Found"
      },
      "evidence": {}
    },
    {
      "kind": "mysql",
      "id": "feedback-list-no-token",
      "status": "PASS",
      "expected": "HTTP 401 且不返回业务数据",
      "actual": {
        "http": 401,
        "code": 401,
        "hasData": false
      },
      "evidence": {}
    },
    {
      "kind": "mysql",
      "id": "audit-list-no-token",
      "status": "PASS",
      "expected": "HTTP 401 且不返回业务数据",
      "actual": {
        "http": 401,
        "code": 401,
        "hasData": false
      },
      "evidence": {}
    },
    {
      "kind": "mysql",
      "id": "audit-list-invalid-token",
      "status": "PASS",
      "expected": "HTTP 401 且不返回业务数据",
      "actual": {
        "http": 401,
        "code": 401,
        "hasData": false
      },
      "evidence": {}
    },
    {
      "kind": "mysql",
      "id": "feedback-missing-school",
      "status": "PASS",
      "expected": "业务拒绝且数据库无落行",
      "actual": {
        "http": 201,
        "code": 400,
        "message": "schoolId required",
        "dbRows": 0
      },
      "evidence": {}
    },
    {
      "kind": "mysql",
      "id": "feedback-blank-content",
      "status": "PASS",
      "expected": "空白正文被拒绝且数据库无落行",
      "actual": {
        "http": 201,
        "code": 400,
        "message": "content required",
        "dbRows": 0
      },
      "evidence": {}
    },
    {
      "kind": "mysql",
      "id": "feedback-invalid-canteen",
      "status": "REJECTED_SERVER_ERROR",
      "expected": "非法 canteenId 应以客户端错误拒绝且不落库",
      "actual": {
        "http": 500,
        "code": 500,
        "message": "Unknown column 'NaN' in 'field list'",
        "dbRows": 0
      },
      "evidence": {}
    },
    {
      "kind": "mysql",
      "id": "feedback-user-129",
      "status": "REJECTED_SERVER_ERROR",
      "expected": "user 超过 VARCHAR(128) 时应以客户端错误拒绝且不落库",
      "actual": {
        "http": 500,
        "code": 500,
        "message": "Data too long for column 'user' at row 1",
        "dbRows": 0
      },
      "evidence": {}
    },
    {
      "kind": "mysql",
      "id": "feedback-list-missing-school",
      "status": "FAIL_CONTRACT",
      "expected": "OpenAPI 声明必填的 schoolId 缺失时应拒绝",
      "actual": {
        "http": 200,
        "code": 200,
        "itemCount": 0
      },
      "evidence": {}
    },
    {
      "kind": "mysql",
      "id": "feedback-list-pagination-total",
      "status": "FAIL_CONTRACT",
      "expected": "分页 total 等于数据库符合筛选条件的总数，而不是当前页条数",
      "actual": {
        "http": 200,
        "code": 200,
        "apiTotal": 1,
        "dbTotal": 2,
        "itemCount": 1
      },
      "evidence": {}
    },
    {
      "kind": "mysql",
      "id": "feedback-list-page-size-clamp",
      "status": "FAIL_CONTRACT",
      "expected": "pageSize 超过 100 时响应回显实际生效上限",
      "actual": {
        "http": 200,
        "code": 200,
        "pageSize": 101,
        "itemCount": 2
      },
      "evidence": {}
    },
    {
      "kind": "dm",
      "id": "valid-unicode-longtext-max-columns",
      "status": "PASS",
      "expected": "真实写入；长中文/emoji、type=32、user/contact=128、canteenId=NULL 精确回读",
      "actual": {
        "http": 201,
        "code": 200,
        "created": true,
        "dbExact": true
      },
      "evidence": {
        "feedbackId": 19,
        "contentLength": 5436
      }
    },
    {
      "kind": "dm",
      "id": "audit-db-readback",
      "status": "PASS",
      "expected": "反馈请求产生同 requestId、同租户审计行",
      "actual": {
        "found": true,
        "tenantMatch": true
      },
      "evidence": {
        "auditId": 128675
      }
    },
    {
      "kind": "dm",
      "id": "audit-cross-tenant-isolation",
      "status": "PASS",
      "expected": "错误租户查询详情返回 HTTP 404",
      "actual": {
        "http": 404,
        "code": 404,
        "message": "Not Found"
      },
      "evidence": {}
    },
    {
      "kind": "dm",
      "id": "feedback-list-no-token",
      "status": "PASS",
      "expected": "HTTP 401 且不返回业务数据",
      "actual": {
        "http": 401,
        "code": 401,
        "hasData": false
      },
      "evidence": {}
    },
    {
      "kind": "dm",
      "id": "audit-list-no-token",
      "status": "PASS",
      "expected": "HTTP 401 且不返回业务数据",
      "actual": {
        "http": 401,
        "code": 401,
        "hasData": false
      },
      "evidence": {}
    },
    {
      "kind": "dm",
      "id": "audit-list-invalid-token",
      "status": "PASS",
      "expected": "HTTP 401 且不返回业务数据",
      "actual": {
        "http": 401,
        "code": 401,
        "hasData": false
      },
      "evidence": {}
    },
    {
      "kind": "dm",
      "id": "feedback-missing-school",
      "status": "PASS",
      "expected": "业务拒绝且数据库无落行",
      "actual": {
        "http": 201,
        "code": 400,
        "message": "schoolId required",
        "dbRows": 0
      },
      "evidence": {}
    },
    {
      "kind": "dm",
      "id": "feedback-blank-content",
      "status": "PASS",
      "expected": "空白正文被拒绝且数据库无落行",
      "actual": {
        "http": 201,
        "code": 400,
        "message": "content required",
        "dbRows": 0
      },
      "evidence": {}
    },
    {
      "kind": "dm",
      "id": "feedback-invalid-canteen",
      "status": "REJECTED_SERVER_ERROR",
      "expected": "非法 canteenId 应以客户端错误拒绝且不落库",
      "actual": {
        "http": 500,
        "code": 500,
        "message": "[20024] 无效的数值: NaN",
        "dbRows": 0
      },
      "evidence": {}
    },
    {
      "kind": "dm",
      "id": "feedback-user-129",
      "status": "ACCEPTED_INVALID",
      "expected": "user 超过 VARCHAR(128) 时应以客户端错误拒绝且不落库",
      "actual": {
        "http": 201,
        "code": 200,
        "message": "OK",
        "dbRows": 1
      },
      "evidence": {}
    },
    {
      "kind": "dm",
      "id": "feedback-list-missing-school",
      "status": "FAIL_CONTRACT",
      "expected": "OpenAPI 声明必填的 schoolId 缺失时应拒绝",
      "actual": {
        "http": 200,
        "code": 200,
        "itemCount": 0
      },
      "evidence": {}
    },
    {
      "kind": "dm",
      "id": "feedback-list-pagination-total",
      "status": "FAIL_CONTRACT",
      "expected": "分页 total 等于数据库符合筛选条件的总数，而不是当前页条数",
      "actual": {
        "http": 200,
        "code": 200,
        "apiTotal": 1,
        "dbTotal": 3,
        "itemCount": 1
      },
      "evidence": {}
    },
    {
      "kind": "dm",
      "id": "feedback-list-page-size-clamp",
      "status": "FAIL_CONTRACT",
      "expected": "pageSize 超过 100 时响应回显实际生效上限",
      "actual": {
        "http": 200,
        "code": 200,
        "pageSize": 101,
        "itemCount": 3
      },
      "evidence": {}
    }
  ],
  "comparison": [
    {
      "id": "valid-unicode-longtext-max-columns",
      "mysql": "PASS",
      "dm": "PASS",
      "parity": "SAME"
    },
    {
      "id": "audit-db-readback",
      "mysql": "PASS",
      "dm": "PASS",
      "parity": "SAME"
    },
    {
      "id": "audit-cross-tenant-isolation",
      "mysql": "PASS",
      "dm": "PASS",
      "parity": "SAME"
    },
    {
      "id": "feedback-list-no-token",
      "mysql": "PASS",
      "dm": "PASS",
      "parity": "SAME"
    },
    {
      "id": "audit-list-no-token",
      "mysql": "PASS",
      "dm": "PASS",
      "parity": "SAME"
    },
    {
      "id": "audit-list-invalid-token",
      "mysql": "PASS",
      "dm": "PASS",
      "parity": "SAME"
    },
    {
      "id": "feedback-missing-school",
      "mysql": "PASS",
      "dm": "PASS",
      "parity": "SAME"
    },
    {
      "id": "feedback-blank-content",
      "mysql": "PASS",
      "dm": "PASS",
      "parity": "SAME"
    },
    {
      "id": "feedback-invalid-canteen",
      "mysql": "REJECTED_SERVER_ERROR",
      "dm": "REJECTED_SERVER_ERROR",
      "parity": "SAME"
    },
    {
      "id": "feedback-user-129",
      "mysql": "REJECTED_SERVER_ERROR",
      "dm": "ACCEPTED_INVALID",
      "parity": "DIFF"
    },
    {
      "id": "feedback-list-missing-school",
      "mysql": "FAIL_CONTRACT",
      "dm": "FAIL_CONTRACT",
      "parity": "SAME"
    },
    {
      "id": "feedback-list-pagination-total",
      "mysql": "FAIL_CONTRACT",
      "dm": "FAIL_CONTRACT",
      "parity": "SAME"
    },
    {
      "id": "feedback-list-page-size-clamp",
      "mysql": "FAIL_CONTRACT",
      "dm": "FAIL_CONTRACT",
      "parity": "SAME"
    }
  ],
  "summary": {
    "total": 26,
    "pass": 16,
    "fail": 10,
    "diff": 1
  },
  "completedAt": "2026-09-25T01:54:21.696Z",
  "normalizationNote": "Status categories distinguish server-error rejection from invalid data accepted and persisted; raw HTTP/DB evidence is unchanged."
}
