{
  "suite_id": "working2-abb120-spec",
  "robot_id": "abb_irb120_3_58",
  "spec_source": "work/doc/通用机器人编程语法规范.md",
  "program_root": "kdl-wasm/web/tests/fixtures/abb120/spec-programs",
  "runtime_commands": ["loadProgram", "start", "stepInto", "hold", "resume", "stepMotion", "stop", "resetFault"],
  "programs": [
    { "program_id": "W2_00_MinimalModule", "file": "runtime/W2_00_MinimalModule.grl", "coverage_level": "Runtime", "spec_sections": [4, 5, 6, 9, 10, 23], "expected_status": "pass", "expected_diagnostics": [] },
    { "program_id": "W2_10_DataTargetToolFrame", "file": "runtime/W2_10_DataTargetToolFrame.grl", "coverage_level": "Runtime", "spec_sections": [6, 8, 9], "expected_status": "pass", "expected_diagnostics": [] },
    { "program_id": "W2_20_ExpressionMath", "file": "runtime/W2_20_ExpressionMath.grl", "coverage_level": "Runtime", "spec_sections": [7, 9, 13], "expected_status": "pass", "expected_diagnostics": [] },
    { "program_id": "W2_30_MotionAllTypes", "file": "runtime/W2_30_MotionAllTypes.grl", "coverage_level": "Runtime", "spec_sections": [8, 9, 10], "expected_status": "pass", "expected_diagnostics": [] },
    { "program_id": "W2_40_PathEvents", "file": "runtime/W2_40_PathEvents.grl", "coverage_level": "Runtime", "spec_sections": [11, 13, 19], "expected_status": "pass", "expected_diagnostics": [] },
    { "program_id": "W2_50_OperationProcess", "file": "runtime/W2_50_OperationProcess.grl", "coverage_level": "Runtime", "spec_sections": [12, 13], "expected_status": "pass", "expected_diagnostics": [] },
    { "program_id": "W2_60_IOWaitPulse", "file": "runtime/W2_60_IOWaitPulse.grl", "coverage_level": "Runtime", "spec_sections": [13], "expected_status": "pass", "expected_diagnostics": [] },
    { "program_id": "W2_70_ControlFlow", "file": "runtime/W2_70_ControlFlow.grl", "coverage_level": "Runtime", "spec_sections": [14], "expected_status": "pass", "expected_diagnostics": [] },
    { "program_id": "W2_80_ProcFuncCall", "file": "runtime/W2_80_ProcFuncCall.grl", "coverage_level": "Runtime", "spec_sections": [15], "expected_status": "pass", "expected_diagnostics": [] },
    { "program_id": "W2_90_ExceptionAlarm", "file": "runtime/W2_90_ExceptionAlarm.grl", "coverage_level": "Runtime", "spec_sections": [16, 17], "expected_status": "pass", "expected_diagnostics": ["GRL_P1_UNIMPLEMENTED"] },
    { "program_id": "W2_99_FullSpecExample", "file": "runtime/W2_99_FullSpecExample.grl", "coverage_level": "Runtime", "spec_sections": [24], "expected_status": "pass", "expected_diagnostics": [] },
    { "program_id": "W2_E10_ExpressionDiagnostics", "file": "static/W2_E10_ExpressionDiagnostics.grl", "coverage_level": "Static", "spec_sections": [7, 22], "expected_status": "diagnostic", "expected_diagnostics": ["GRL_EXPR_UNKNOWN_SYMBOL", "GRL_EXPR_UNKNOWN_FUNCTION", "GRL_EXPR_ARITY", "GRL_EXPR_DOMAIN", "GRL_EXPR_DIV_ZERO", "GRL_EXPR_UNIT_MISMATCH"] },
    { "program_id": "W2_E20_SemanticDiagnostics", "file": "static/W2_E20_SemanticDiagnostics.grl", "coverage_level": "Static", "spec_sections": [6, 15, 22], "expected_status": "diagnostic", "expected_diagnostics": ["GRL_SYMBOL_DUPLICATE", "GRL_ARGUMENT_NOT_LVALUE", "GRL_CALL_TARGET_NOT_FOUND", "GRL_FUNC_SIDE_EFFECT", "GRL_TARGET_NOT_FOUND"] },
    { "program_id": "W2_E30_MotionDiagnostics", "file": "error/W2_E30_MotionDiagnostics.grl", "coverage_level": "Static", "spec_sections": [8, 9, 10, 11, 22], "expected_status": "diagnostic", "expected_diagnostics": ["KDL_JOINT_LIMIT", "KDL_TARGET_UNREACHABLE", "GRL_PATH_EMPTY"] },
    { "program_id": "W2_E40_ControlFlowDiagnostics", "file": "static/W2_E40_ControlFlowDiagnostics.grl", "coverage_level": "Static", "spec_sections": [14, 22], "expected_status": "diagnostic", "expected_diagnostics": ["GRL_BREAK_OUTSIDE_FLOW", "GRL_CONTINUE_OUTSIDE_LOOP", "GRL_JUMP_INTO_BLOCK", "GRL_SWITCH_CASE_DUPLICATE", "GRL_SWITCH_CASE_NOT_CONSTANT", "GRL_LABEL_NOT_FOUND"] },
    { "program_id": "W2_E50_RuntimeTimeout", "file": "error/W2_E50_RuntimeTimeout.grl", "coverage_level": "Runtime", "spec_sections": [13, 16], "expected_status": "diagnostic", "expected_diagnostics": ["VC_WAIT_TIMEOUT"] },
    { "program_id": "W2_P10_BrandHints", "file": "post/W2_P10_BrandHints.grl", "coverage_level": "Post", "spec_sections": [18, 20], "expected_status": "pass", "expected_diagnostics": ["GRL_POST_HINT_IGNORED"] },
    { "program_id": "W2_P20_CrossBrandMotion", "file": "post/W2_P20_CrossBrandMotion.grl", "coverage_level": "Post", "spec_sections": [20], "expected_status": "pass", "expected_diagnostics": [] },
    { "program_id": "W2_P30_Roundtrip", "file": "post/W2_P30_Roundtrip.grl", "coverage_level": "Post", "spec_sections": [19, 20, 21], "expected_status": "pass", "expected_diagnostics": [] }
  ],
  "coverage_matrix": [
    { "spec_section": 4, "coverage_level": "Runtime/Static", "program_ids": ["W2_00_MinimalModule"] },
    { "spec_section": 5, "coverage_level": "Runtime", "program_ids": ["W2_00_MinimalModule"] },
    { "spec_section": 6, "coverage_level": "Runtime/Static", "program_ids": ["W2_10_DataTargetToolFrame", "W2_E20_SemanticDiagnostics"] },
    { "spec_section": 7, "coverage_level": "Runtime/Static/Post", "program_ids": ["W2_20_ExpressionMath", "W2_E10_ExpressionDiagnostics", "W2_P20_CrossBrandMotion"] },
    { "spec_section": 8, "coverage_level": "Runtime/Static", "program_ids": ["W2_10_DataTargetToolFrame", "W2_E30_MotionDiagnostics"] },
    { "spec_section": 9, "coverage_level": "Runtime/Post", "program_ids": ["W2_20_ExpressionMath", "W2_30_MotionAllTypes", "W2_P20_CrossBrandMotion"] },
    { "spec_section": 10, "coverage_level": "Runtime/Static/Post", "program_ids": ["W2_30_MotionAllTypes", "W2_E30_MotionDiagnostics", "W2_P20_CrossBrandMotion"] },
    { "spec_section": 11, "coverage_level": "Runtime/Static", "program_ids": ["W2_40_PathEvents", "W2_E30_MotionDiagnostics"] },
    { "spec_section": 12, "coverage_level": "Runtime/Post", "program_ids": ["W2_50_OperationProcess", "W2_P30_Roundtrip"] },
    { "spec_section": 13, "coverage_level": "Runtime", "program_ids": ["W2_60_IOWaitPulse", "W2_E50_RuntimeTimeout"] },
    { "spec_section": 14, "coverage_level": "Runtime/Static", "program_ids": ["W2_70_ControlFlow", "W2_E40_ControlFlowDiagnostics"] },
    { "spec_section": 15, "coverage_level": "Runtime/Static", "program_ids": ["W2_80_ProcFuncCall", "W2_E20_SemanticDiagnostics"] },
    { "spec_section": 16, "coverage_level": "Runtime/Static", "program_ids": ["W2_90_ExceptionAlarm", "W2_E50_RuntimeTimeout"] },
    { "spec_section": 17, "coverage_level": "Runtime/Static", "program_ids": ["W2_90_ExceptionAlarm"] },
    { "spec_section": 18, "coverage_level": "Post", "program_ids": ["W2_P10_BrandHints"] },
    { "spec_section": 19, "coverage_level": "Post", "program_ids": ["W2_P30_Roundtrip"] },
    { "spec_section": 20, "coverage_level": "Post", "program_ids": ["W2_P20_CrossBrandMotion"] },
    { "spec_section": 21, "coverage_level": "Runtime/Static", "program_ids": ["W2_00_MinimalModule", "W2_E10_ExpressionDiagnostics"] },
    { "spec_section": 22, "coverage_level": "Runtime/Static", "program_ids": ["W2_E10_ExpressionDiagnostics", "W2_E20_SemanticDiagnostics", "W2_E30_MotionDiagnostics", "W2_E40_ControlFlowDiagnostics", "W2_E50_RuntimeTimeout"] },
    { "spec_section": 23, "coverage_level": "Runtime/Static", "program_ids": ["W2_00_MinimalModule"] },
    { "spec_section": 24, "coverage_level": "Runtime/Post", "program_ids": ["W2_99_FullSpecExample", "W2_P30_Roundtrip"] },
    { "spec_section": 25, "coverage_level": "Runtime/Static/Post", "program_ids": ["W2_00_MinimalModule", "W2_10_DataTargetToolFrame", "W2_20_ExpressionMath", "W2_30_MotionAllTypes", "W2_40_PathEvents", "W2_50_OperationProcess", "W2_60_IOWaitPulse", "W2_70_ControlFlow", "W2_80_ProcFuncCall", "W2_90_ExceptionAlarm", "W2_P20_CrossBrandMotion"] }
  ]
}
