api-evidence.json · 完整记录
{
"title": "实装人工事件与红蓝对抗正式 API 闭环",
"status": "PASS",
"startedAt": "2026-09-05T15:48:46.342Z",
"baseURL": "http://127.0.0.1:6180",
"method": "真实 Auth / Gateway / Tran API;新建隔离学生与开发测试任务;不连接设备、视觉推理或外部通知。",
"references": {
"PHYSICAL": {
"projectId": "163",
"versionId": "215"
},
"CONFRONTATION": {
"projectId": "164",
"versionId": "216"
}
},
"checks": [
{
"title": "开始命令重放不会重复激活或递增次数",
"status": "PASS",
"details": {
"runId": "44",
"version": 2,
"attemptCount": 1
}
},
{
"title": "实装任务固定发布版本、分配学员并开始",
"status": "PASS",
"details": {
"assignmentId": "50",
"run": {
"id": "44",
"assignmentId": "50",
"status": "IN_PROGRESS",
"version": 2,
"progressPercent": 0,
"currentStepCode": "PHYSICAL-S01",
"score": null,
"passed": null
},
"content": {
"projectId": "163",
"versionId": "215"
},
"rules": [
{
"stepCode": "PHYSICAL-S01",
"source": "MANUAL",
"eventType": "step.physical-s01.confirmed",
"progressPercent": 33
},
{
"stepCode": "PHYSICAL-S02",
"source": "MANUAL",
"eventType": "step.physical-s02.confirmed",
"progressPercent": 67
},
{
"stepCode": "PHYSICAL-S03",
"source": "MANUAL",
"eventType": "step.physical-s03.confirmed",
"progressPercent": 100
}
]
}
},
{
"title": "实装拒绝普通进度接口、抢跑、提前提交及错误事件身份",
"status": "PASS",
"details": {
"runId": "44",
"forbiddenProgress": {
"status": 403,
"message": "实装运行只能由设备、视觉或人工确认事件推进"
},
"prematureSubmit": {
"status": 409,
"message": "训练步骤尚未全部完成,不能提交"
},
"skipped": {
"status": 409,
"message": "物理事件必须匹配当前待完成步骤,不能跳步或回退"
},
"untrustedDevice": {
"status": 403,
"message": "无权执行此操作"
},
"managerManual": {
"status": 403,
"message": "当前学员不是该运行成员"
},
"progressUnchanged": 0
}
},
{
"title": "实装不匹配事件失败,必须重试后才可继续",
"status": "PASS",
"details": {
"runId": "44",
"outcome": "UNMATCHED",
"beforeRetry": {
"status": 409,
"message": "实装步骤失败后必须先重试,完成后不能再次推进"
},
"facts": [
{
"stepCode": "PHYSICAL-S01",
"status": "IN_PROGRESS",
"targetProgressPercent": 33,
"attemptCount": 2,
"failureCount": 1,
"evidenceSourceCode": "COMMAND"
},
{
"stepCode": "PHYSICAL-S02",
"status": "PENDING",
"targetProgressPercent": 67,
"attemptCount": 0,
"failureCount": 0,
"evidenceSourceCode": "NONE"
},
{
"stepCode": "PHYSICAL-S03",
"status": "PENDING",
"targetProgressPercent": 100,
"attemptCount": 0,
"failureCount": 0,
"evidenceSourceCode": "NONE"
}
]
}
},
{
"title": "实装逐步人工确认、事件幂等与载荷冲突",
"status": "PASS",
"details": {
"runId": "44",
"progression": [
{
"stepCode": "PHYSICAL-S01",
"eventId": "MANUAL-FF103EF3-B498-4EAC-8F06-42DE46CC9CE4",
"progress": 33,
"replayVersion": 5,
"alteredEventStatus": 409
},
{
"stepCode": "PHYSICAL-S02",
"eventId": "MANUAL-9D8A36B7-C161-4736-A71E-D1700E55216B",
"progress": 67,
"replayVersion": 6,
"alteredEventStatus": 409
},
{
"stepCode": "PHYSICAL-S03",
"eventId": "MANUAL-1D1ADE8F-D32B-434B-A7D8-A2571E502137",
"progress": 100,
"replayVersion": 7,
"alteredEventStatus": 409
}
],
"facts": [
{
"stepCode": "PHYSICAL-S01",
"status": "COMPLETED",
"targetProgressPercent": 33,
"attemptCount": 2,
"failureCount": 1,
"evidenceSourceCode": "MANUAL"
},
{
"stepCode": "PHYSICAL-S02",
"status": "COMPLETED",
"targetProgressPercent": 67,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "MANUAL"
},
{
"stepCode": "PHYSICAL-S03",
"status": "COMPLETED",
"targetProgressPercent": 100,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "MANUAL"
}
]
}
},
{
"title": "PHYSICAL 提交、教员评定与结果回读",
"status": "PASS",
"details": {
"run": {
"id": "44",
"assignmentId": "50",
"status": "REVIEWED",
"version": 9,
"progressPercent": 100,
"currentStepCode": "PHYSICAL-S03",
"score": 100,
"passed": true
},
"submitReplay": true,
"reviewReplay": true,
"facts": [
{
"stepCode": "PHYSICAL-S01",
"status": "COMPLETED",
"targetProgressPercent": 33,
"attemptCount": 2,
"failureCount": 1,
"evidenceSourceCode": "MANUAL"
},
{
"stepCode": "PHYSICAL-S02",
"status": "COMPLETED",
"targetProgressPercent": 67,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "MANUAL"
},
{
"stepCode": "PHYSICAL-S03",
"status": "COMPLETED",
"targetProgressPercent": 100,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "MANUAL"
}
]
}
},
{
"title": "对抗红蓝两队各两人,按队伍共享且运行互相独立",
"status": "PASS",
"details": {
"assignmentId": "51",
"content": {
"projectId": "164",
"versionId": "216"
},
"configuration": {
"teamSize": 2,
"roundDurationMinutes": 7,
"submitPositions": [
"COMMANDER"
]
},
"runs": [
{
"id": "46",
"assignmentId": "51",
"status": "ACCEPTED",
"version": 1,
"progressPercent": 0,
"currentStepCode": "",
"score": null,
"passed": null
},
{
"id": "45",
"assignmentId": "51",
"status": "ACCEPTED",
"version": 1,
"progressPercent": 0,
"currentStepCode": "",
"score": null,
"passed": null
}
]
}
},
{
"title": "对抗学员不能读取另一队运行明细",
"status": "PASS",
"details": {
"requestingTeam": "RED",
"otherRunId": "46",
"response": {
"status": 403,
"message": "无权查看该训练运行"
}
}
},
{
"title": "开始命令重放不会重复激活或递增次数",
"status": "PASS",
"details": {
"runId": "45",
"version": 2,
"attemptCount": 1
}
},
{
"title": "RED 队岗位越权、跳步和提前提交均拒绝",
"status": "PASS",
"details": {
"runId": "45",
"wrongPosition": {
"status": 403,
"message": "当前岗位不能推进共享训练进度"
},
"skipped": {
"status": 400,
"message": "必须按发布顺序完成当前步骤,不能跳步或回退"
},
"earlySubmit": {
"status": 409,
"message": "训练步骤尚未全部完成,不能提交"
},
"deadlineAt": 1788623936,
"serverNow": 1788623517
}
},
{
"title": "RED 队授权动作逐步推进、重放幂等、提交负责人限制",
"status": "PASS",
"details": {
"runId": "45",
"progression": [
{
"stepCode": "CONFRONTATION-S01",
"progress": 50,
"replayVersion": 3,
"changedCommandStatus": 409
},
{
"stepCode": "CONFRONTATION-S02",
"progress": 100,
"replayVersion": 4,
"changedCommandStatus": 409
}
],
"wrongSubmitPosition": {
"status": 403,
"message": "共享训练仅允许任务声明的负责人岗位提交结果"
}
}
},
{
"title": "CONFRONTATION 提交、教员评定与结果回读",
"status": "PASS",
"details": {
"run": {
"id": "45",
"assignmentId": "51",
"status": "REVIEWED",
"version": 6,
"progressPercent": 100,
"currentStepCode": "CONFRONTATION-S02",
"score": 100,
"passed": true
},
"submitReplay": true,
"reviewReplay": true,
"facts": [
{
"stepCode": "CONFRONTATION-S01",
"status": "COMPLETED",
"targetProgressPercent": 50,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "COMMAND"
},
{
"stepCode": "CONFRONTATION-S02",
"status": "COMPLETED",
"targetProgressPercent": 100,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "COMMAND"
}
]
}
},
{
"title": "红队完成不会推进蓝队进度",
"status": "PASS",
"details": {
"redRunId": "45",
"blueRun": {
"id": "46",
"assignmentId": "51",
"status": "ACCEPTED",
"version": 1,
"progressPercent": 0,
"currentStepCode": "",
"score": null,
"passed": null
}
}
},
{
"title": "开始命令重放不会重复激活或递增次数",
"status": "PASS",
"details": {
"runId": "46",
"version": 2,
"attemptCount": 1
}
},
{
"title": "BLUE 队岗位越权、跳步和提前提交均拒绝",
"status": "PASS",
"details": {
"runId": "46",
"wrongPosition": {
"status": 403,
"message": "当前岗位不能推进共享训练进度"
},
"skipped": {
"status": 400,
"message": "必须按发布顺序完成当前步骤,不能跳步或回退"
},
"earlySubmit": {
"status": 409,
"message": "训练步骤尚未全部完成,不能提交"
},
"deadlineAt": 1788623942,
"serverNow": 1788623523
}
},
{
"title": "BLUE 队授权动作逐步推进、重放幂等、提交负责人限制",
"status": "PASS",
"details": {
"runId": "46",
"progression": [
{
"stepCode": "CONFRONTATION-S01",
"progress": 50,
"replayVersion": 3,
"changedCommandStatus": 409
},
{
"stepCode": "CONFRONTATION-S02",
"progress": 100,
"replayVersion": 4,
"changedCommandStatus": 409
}
],
"wrongSubmitPosition": {
"status": 403,
"message": "共享训练仅允许任务声明的负责人岗位提交结果"
}
}
},
{
"title": "CONFRONTATION 提交、教员评定与结果回读",
"status": "PASS",
"details": {
"run": {
"id": "46",
"assignmentId": "51",
"status": "REVIEWED",
"version": 6,
"progressPercent": 100,
"currentStepCode": "CONFRONTATION-S02",
"score": 100,
"passed": true
},
"submitReplay": true,
"reviewReplay": true,
"facts": [
{
"stepCode": "CONFRONTATION-S01",
"status": "COMPLETED",
"targetProgressPercent": 50,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "COMMAND"
},
{
"stepCode": "CONFRONTATION-S02",
"status": "COMPLETED",
"targetProgressPercent": 100,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "COMMAND"
}
]
}
},
{
"title": "正式任务快照固定训练、场景与模型发布版本",
"status": "PASS",
"details": {
"snapshots": [
{
"assignmentId": "50",
"channel": "PHYSICAL",
"content": {
"projectId": "163",
"versionId": "215"
},
"frozenScene": {
"projectId": "159",
"versionId": "209",
"models": [
{
"projectId": "156",
"versionId": "204",
"assetCode": "MODEL_MTO6WI6K_08-CESIUMMILKTRUCK"
}
]
}
},
{
"assignmentId": "51",
"channel": "CONFRONTATION",
"content": {
"projectId": "164",
"versionId": "216"
},
"frozenScene": {
"projectId": "160",
"versionId": "210",
"models": [
{
"projectId": "157",
"versionId": "201",
"assetCode": "MODEL_MTO6V5W6_09-FOX"
}
]
}
}
]
}
}
],
"assignments": [
{
"id": "50",
"code": "UTE2E-MODES-MTOK5BBA-PHYSICAL",
"channel": "PHYSICAL",
"contentProjectId": "163",
"contentVersionId": "215",
"status": "PUBLISHED",
"version": 1,
"frozenScene": {
"projectId": "159",
"versionId": "209",
"models": [
{
"projectId": "156",
"versionId": "204",
"assetCode": "MODEL_MTO6WI6K_08-CESIUMMILKTRUCK"
}
]
}
},
{
"id": "51",
"code": "UTE2E-MODES-MTOK5BBA-CONFRONTATION",
"channel": "CONFRONTATION",
"contentProjectId": "164",
"contentVersionId": "216",
"status": "PUBLISHED",
"version": 1,
"frozenScene": {
"projectId": "160",
"versionId": "210",
"models": [
{
"projectId": "157",
"versionId": "201",
"assetCode": "MODEL_MTO6V5W6_09-FOX"
}
]
}
}
],
"runs": [
{
"id": "44",
"assignmentId": "50",
"status": "REVIEWED",
"version": 9,
"progressPercent": 100,
"currentStepCode": "PHYSICAL-S03",
"score": 100,
"passed": true,
"channel": "PHYSICAL",
"team": "NEUTRAL",
"stepFacts": [
{
"stepCode": "PHYSICAL-S01",
"status": "COMPLETED",
"targetProgressPercent": 33,
"attemptCount": 2,
"failureCount": 1,
"evidenceSourceCode": "MANUAL"
},
{
"stepCode": "PHYSICAL-S02",
"status": "COMPLETED",
"targetProgressPercent": 67,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "MANUAL"
},
{
"stepCode": "PHYSICAL-S03",
"status": "COMPLETED",
"targetProgressPercent": 100,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "MANUAL"
}
]
},
{
"id": "45",
"assignmentId": "51",
"status": "REVIEWED",
"version": 6,
"progressPercent": 100,
"currentStepCode": "CONFRONTATION-S02",
"score": 100,
"passed": true,
"channel": "CONFRONTATION",
"team": "RED",
"stepFacts": [
{
"stepCode": "CONFRONTATION-S01",
"status": "COMPLETED",
"targetProgressPercent": 50,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "COMMAND"
},
{
"stepCode": "CONFRONTATION-S02",
"status": "COMPLETED",
"targetProgressPercent": 100,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "COMMAND"
}
]
},
{
"id": "46",
"assignmentId": "51",
"status": "REVIEWED",
"version": 6,
"progressPercent": 100,
"currentStepCode": "CONFRONTATION-S02",
"score": 100,
"passed": true,
"channel": "CONFRONTATION",
"team": "BLUE",
"stepFacts": [
{
"stepCode": "CONFRONTATION-S01",
"status": "COMPLETED",
"targetProgressPercent": 50,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "COMMAND"
},
{
"stepCode": "CONFRONTATION-S02",
"status": "COMPLETED",
"targetProgressPercent": 100,
"attemptCount": 1,
"failureCount": 0,
"evidenceSourceCode": "COMMAND"
}
]
}
],
"actors": [
{
"userId": "95",
"team": "RED",
"position": "COMMANDER",
"departmentId": "5"
},
{
"userId": "96",
"team": "RED",
"position": "OPERATOR",
"departmentId": "5"
},
{
"userId": "97",
"team": "BLUE",
"position": "COMMANDER",
"departmentId": "5"
},
{
"userId": "98",
"team": "BLUE",
"position": "OPERATOR",
"departmentId": "5"
}
],
"requests": [
{
"method": "POST",
"path": "/api/tran/v1/teaching/assignments",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/assignments/50/publish",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/assignments/50/accept",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/start",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/start",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44/steps",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/44/progress",
"status": 403
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/submit",
"status": 409
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 409
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 403
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 403
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44/steps",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 409
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/start",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44/steps",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 409
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 409
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/physical-events",
"status": 409
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44/steps",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/submit",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/submit",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/review",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/44/review",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/44/steps",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/assignments",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/assignments/51/publish",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/assignments/51/accept",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/assignments/51/accept",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/assignments/51/accept",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/assignments/51/accept",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs?assignmentId=51&size=100",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/46",
"status": 403
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/45/start",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/45/start",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/45/steps",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/45/execution",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/45/progress",
"status": 403
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/45/progress",
"status": 400
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/45/submit",
"status": 409
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/45",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/45/progress",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/45/progress",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/45/progress",
"status": 409
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/45/progress",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/45/progress",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/45/progress",
"status": 409
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/45/submit",
"status": 403
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/45/submit",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/45/submit",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/45/review",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/45/review",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/45/steps",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/46",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/46/start",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/46/start",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/46/steps",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/46/execution",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/46/progress",
"status": 403
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/46/progress",
"status": 400
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/46/submit",
"status": 409
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/46",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/46/progress",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/46/progress",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/46/progress",
"status": 409
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/46/progress",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/46/progress",
"status": 200
},
{
"method": "PUT",
"path": "/api/tran/v1/teaching/runs/46/progress",
"status": 409
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/46/submit",
"status": 403
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/46/submit",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/46/submit",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/46/review",
"status": 200
},
{
"method": "POST",
"path": "/api/tran/v1/teaching/runs/46/review",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/runs/46/steps",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/assignments/50",
"status": 200
},
{
"method": "GET",
"path": "/api/tran/v1/teaching/assignments/51",
"status": 200
}
],
"limitations": [
"实装事件均为本次自动化提交的 MANUAL 人工确认或明确的权限拒绝测试,不代表真实设备、PLC、摄像机或视觉模型联调。",
"教学运行结果来自正式 API;默认实装离线回放和默认对抗本地工作台的显示另行记录,不混同为服务端运行闭环。",
"对抗按四名隔离学员的独立会话依次操作,检查服务端截止时间已生效;未等待整局自然超时,也不代表多人同时操作的压力或网络同步测试。",
"测试账号使用本次随机密码,密码与会话仅在运行内存中;报告只保留用户 ID、队伍和岗位以便追溯。"
],
"finishedAt": "2026-09-05T15:58:56.293Z",
"retainedData": {
"assignments": [
"50",
"51"
],
"runs": [
"44",
"45",
"46"
],
"users": [
"95",
"96",
"97",
"98"
],
"note": "仅新建本次开发测试数据,未修改或删除既有账号、任务与运行。"
}
}