@@ -65,43 +65,46 @@ private static final Map<String, Integer> VERDICT_PRIORITY = Map.of(
6565
6666``` java
6767public enum SubmissionStatus {
68- PENDING (" Pending" , 0 , Kind . IN_FLIGHT ),
69- JUDGING (" Judging" , 0 , Kind . IN_FLIGHT ),
70- ACCEPTED (" Accepted" , 0 , Kind . TERMINAL_GOOD ),
71- PRESENTATION_ERROR (" Presentation Error" , 1 , Kind . TERMINAL_BAD ),
72- WRONG_ANSWER (" Wrong Answer" , 2 , Kind . TERMINAL_BAD ),
73- TIME_LIMIT_EXCEEDED (" Time Limit Exceeded" , 3 , Kind . TERMINAL_BAD ),
74- MEMORY_LIMIT_EXCEEDED (" Memory Limit Exceeded" ,4 , Kind . TERMINAL_BAD ),
75- OUTPUT_LIMIT_EXCEEDED (" Output Limit Exceeded" ,4 , Kind . TERMINAL_BAD ),
76- RUNTIME_ERROR (" Runtime Error" , 5 , Kind . TERMINAL_BAD ),
77- COMPILE_ERROR (" Compile Error" , 6 , Kind . TERMINAL_BAD ), // 不参与 case-level reduce
78- SANDBOX_ERROR (" Sandbox Error" , 7 , Kind . TERMINAL_INFRA ),
79- SYSTEM_ERROR (" System Error" , 8 , Kind . TERMINAL_INFRA );
68+ PENDING (" Pending" , " pending " , false , 0 , Kind . IN_FLIGHT ),
69+ JUDGING (" Judging" , " pending " , false , 0 , Kind . IN_FLIGHT ),
70+ ACCEPTED (" Accepted" , " accepted " , true , 0 , Kind . TERMINAL_GOOD ),
71+ PRESENTATION_ERROR (" Presentation Error" , " error " , true , 1 , Kind . TERMINAL_BAD ),
72+ WRONG_ANSWER (" Wrong Answer" , " error " , true , 2 , Kind . TERMINAL_BAD ),
73+ TIME_LIMIT_EXCEEDED (" Time Limit Exceeded" , " error " , true , 3 , Kind . TERMINAL_BAD ),
74+ MEMORY_LIMIT_EXCEEDED (" Memory Limit Exceeded" ," error " , true , 4 , Kind . TERMINAL_BAD ),
75+ OUTPUT_LIMIT_EXCEEDED (" Output Limit Exceeded" ," error " , true , 4 , Kind . TERMINAL_BAD ),
76+ RUNTIME_ERROR (" Runtime Error" , " error " , true , 5 , Kind . TERMINAL_BAD ),
77+ COMPILE_ERROR (" Compile Error" , " error " , true , 6 , Kind . TERMINAL_BAD ), // 不参与 case-level reduce
78+ SANDBOX_ERROR (" Sandbox Error" , " system " , true , 7 , Kind . TERMINAL_INFRA ),
79+ SYSTEM_ERROR (" System Error" , " system " , true , 8 , Kind . TERMINAL_INFRA );
8080
8181 public enum Kind { IN_FLIGHT , TERMINAL_GOOD , TERMINAL_BAD , TERMINAL_INFRA }
8282
83- private final String wireValue; // ← 持久化/JSON 字符串, 永远是真相
84- private final int severity; // ← 越大越严重, ACCEPTED=0
83+ private final String displayName; // ← 持久化/JSON 字符串, 永远是真相 (wire value)
84+ private final String category; // ← 粗粒度过滤分类 (pending/accepted/error/system), 供 admin UI
85+ private final boolean terminal; // ← 是否终态 (不再自动重判)
86+ private final int severity; // ← 越大越严重, ACCEPTED=0
8587 private final Kind kind;
8688
87- SubmissionStatus (String wireValue , int severity , Kind kind ) { ... }
89+ SubmissionStatus (String displayName , String category , boolean terminal ,
90+ int severity , Kind kind ) { ... }
8891
89- @JsonValue // Jackson 序列化用 wireValue
90- public String wireValue () { return wireValue ; }
92+ @JsonValue // Jackson 序列化用 displayName 作为 wire value
93+ public String wireValue () { return displayName ; }
9194
92- @JsonCreator // Jackson 反序列化按 wireValue 反查
93- public static SubmissionStatus fromWire (String s ) {
94- return Codec . fromWire(s);
95- }
95+ @JsonCreator // Jackson 反序列化按 displayName 反查
96+ public static SubmissionStatus fromWire (String wire ) { ... }
9697
9798 public int severity () { return severity; }
9899 public Kind kind () { return kind; }
99100}
100101```
101102
103+ > ** 注 (字段名对齐)** : 实际 enum (` SubmissionStatus.java ` ) 无独立 ` wireValue ` 字段 —— 持久化/JSON 字符串直接存于 ` displayName ` 字段, ` wireValue() ` 是返回该字段的 ` @JsonValue ` 方法 (line 122-125), ` fromWire(String) ` 是 ` @JsonCreator ` 静态工厂 (line 136-147)。此外实际 enum 还携带 ADR 决策伪代码未展开的 ` category ` / ` terminal ` 两字段 (admin UI 过滤与终态判定)。对外契约 (wire value 序列化 / fromWire 反序列化 / severity 归约) 一致, 本节伪代码为可读性略作精简, 真值以 ` SubmissionStatus.java ` 为准。
104+
102105** 关键不变量** (这些是契约, 改动需要新 ADR):
103106
104- - ` wireValue ` 字符串** 永不改写** ;新增状态必须在 ADR 中显式声明并配套迁移
107+ - ` displayName ` (即 wire value) 字符串** 永不改写** ;新增状态必须在 ADR 中显式声明并配套迁移
105108- ` name() ` (即 ` ACCEPTED ` )、` ordinal() ` 都** 不是契约** , 禁止跨进程依赖
106109- ` severity() ` 仅在 JVM 内使用 (verdict 归约) , 不持久化, 不发 API
107110
@@ -179,8 +182,8 @@ public class VerdictResolver {
179182
180183### 3.2 Negative
181184
182- - enum 文件膨胀 (8 → 12 状态, 每个带 3 字段)
183- - ` wireValue ≠ name() ` 对新人有学习曲线, ** README + javadoc 必须明确**
185+ - enum 文件膨胀 (8 → 12 状态, 每个带 5 字段 ` displayName ` / ` category ` / ` terminal ` / ` severity ` / ` kind ` )
186+ - ` wireValue() ≠ name() ` 对新人有学习曲线 (例 ` "Accepted" ` vs ` "ACCEPTED" ` ) , ** README + javadoc 必须明确**
184187- I18n coverage test 需要前端 build script 配合输出 JSON, 增加 CI 步骤
185188
186189### 3.3 Risks
0 commit comments