{
  "date": "2026-10-24",
  "timezone": "Asia/Shanghai",
  "issue": 42,
  "batch": "U05",
  "sourceTag": "OpenJDK jdk-17.0.12+7 (fixed mechanism source)",
  "environment": {
    "os": "macOS 26.7.1 (Build 25G241)",
    "architecture": "x86_64",
    "javaVersion": "java version \"17.0.12\" 2024-07-16 LTS\nJava(TM) SE Runtime Environment (build 17.0.12+8-LTS-286)\nJava HotSpot(TM) 64-Bit Server VM (build 17.0.12+8-LTS-286, mixed mode, sharing)",
    "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home",
    "runtimeNote": "本机可用的 JDK17 为 Oracle JDK 17.0.12（x86_64）。U04 使用的 BellSoft Liberica 17.0.19+11-LTS（arm64）不在本机；本轮证据如实用 Oracle 17.0.12，不把 21 输出冒充 17。集合探针历史输出（2026-10-22，OpenJDK 17.0.12）与固定源码 tag 独立。",
    "runPolicy": "每次运行由包装脚本设置 90 秒上限、-Xmx128m、唯一 TMPDIR 并作为 java.io.tmpdir 传入；结束后检查私有目录剩余条目并定向删除。run.sh 自身以 mktemp 建唯一编译目录，EXIT/INT/TERM trap 删除；labs/collections/run.sh 另将 stdout 捕获进 labs/collections/out/collections-probe.txt（仓库内登记证据）。",
    "stderrNote": "stderr 中的 '注: TypeProbe.java 使用了未经检查或不安全的操作' 来自 run.sh all/library 编译同目录既有 TypeProbe.java，非本票输出错误；'Picked up JAVA_TOOL_OPTIONS' 是 JVM 对显式内存/临时目录限制的回显。"
  },
  "tdd": {
    "draftScenarios": "67da9ef 草稿场景（函数/捕获编译边界/Stream 生命周期/收集器/Optional/时间/时区/格式化、集合 map 契约/选择/视图/迭代/resize 拆分）在补正文前已经全绿；按 U04 口径不倒造 red，如实记录为'草稿未做先红后绿'。",
    "newRedGreen": "本轮新增场景中 Instant.plus(Period.ofDays(1)) 断言先写成预期 UnsupportedTemporalTypeException，实跑失败（AssertionError: expected UnsupportedTemporalTypeException, got null，exit 1）；核对 Instant.plus(long,TemporalUnit) 源码 L850-865 后确认 DAYS 被支持为固定 86400 秒，仅日历月/年抛异常，修正断言后 exit 0。其余新增场景（LinkedHashSet/HashSet 顺序契约、List.of null、removeIf、并行非结合性 OBSERVE）为预期即契约，一次通过。"
  },
  "runs": [
    {
      "name": "collections-final",
      "command": [
        "bash",
        "labs/collections/run.sh"
      ],
      "startedUtc": "2026-10-24T15:10:35+00:00",
      "timeoutSeconds": 90,
      "timedOut": false,
      "exit": 0,
      "stdout": "Picked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-collections-final-6eysdwfx\njava version \"17.0.12\" 2024-07-16 LTS\nJava(TM) SE Runtime Environment (build 17.0.12+8-LTS-286)\nJava HotSpot(TM) 64-Bit Server VM (build 17.0.12+8-LTS-286, mixed mode, sharing)\njava.version=17.0.12 vm=Java HotSpot(TM) 64-Bit Server VM\n\n== 1. ArrayList growth ==\nnew ArrayList<>()      capacity=0    size=0\nafter add #1           capacity=10   size=1\nafter add #10          capacity=10   size=10\nafter add #11          capacity=15   size=11\nafter add #16          capacity=22   size=16\nafter add #23          capacity=33   size=23\n\n== 2. LinkedList structure ==\nfirst=Node last=Node\nNode fields=item,next,prev\n\n== 3. HashMap lazy allocation and resize ==\nnew HashMap<>()        capacity=0     threshold=0     size=0\nafter put 1            capacity=16    threshold=12    size=1\nafter put 12           capacity=16    threshold=12    size=12\nafter put 13           capacity=32    threshold=24    size=13\nnew HashMap<>(1000)    capacity=0     threshold=1024  size=0\nafter first put        capacity=1024  threshold=768   size=1\n\n== 4. Treeification also needs capacity >= 64 ==\nafter 1 colliding puts     size=1   capacity=16   bucket[1]=Node\nafter 2 colliding puts     size=2   capacity=16   bucket[1]=Node\nafter 3 colliding puts     size=3   capacity=16   bucket[1]=Node\nafter 4 colliding puts     size=4   capacity=16   bucket[1]=Node\nafter 5 colliding puts     size=5   capacity=16   bucket[1]=Node\nafter 6 colliding puts     size=6   capacity=16   bucket[1]=Node\nafter 7 colliding puts     size=7   capacity=16   bucket[1]=Node\nafter 8 colliding puts     size=8   capacity=16   bucket[1]=Node\nafter 9 colliding puts     size=9   capacity=32   bucket[1]=Node\nafter 10 colliding puts    size=10  capacity=64   bucket[1]=Node\nafter 11 colliding puts    size=11  capacity=64   bucket[1]=TreeNode\n\n== 5. HashMap treeification with colliding hashes ==\nafter 8 colliding puts     size=8   capacity=64   bucket[1]=Node\nafter 9 colliding puts     size=9   capacity=64   bucket[1]=TreeNode\nafter remove K9            size=8   capacity=64   bucket[1]=TreeNode\nafter remove K8            size=7   capacity=64   bucket[1]=TreeNode\nafter remove K7            size=6   capacity=64   bucket[1]=TreeNode\nafter remove K6            size=5   capacity=64   bucket[1]=Node\nafter remove K5            size=4   capacity=64   bucket[1]=Node\nafter remove K4            size=3   capacity=64   bucket[1]=Node\nafter remove K3            size=2   capacity=64   bucket[1]=Node\nafter remove K2            size=1   capacity=64   bucket[1]=Node\n\n== 6. Mutating a key after insertion ==\ninserted id=1: get=value containsKey=true size=1 bucket=1\nafter id 1 -> 2: get(same ref)=null containsKey=false size=1\nentrySet still contains key=[MutableKey(id=2)]\nremove(same ref)=null size=1\nPASS legacy capacity/treeification/deletion/mutable-key assertions (deletion shape not fixed)\nPASS map absent/null/duplicate/default/compute/merge-delete/null-rejection/recovery\nPASS selection deque FIFO/LIFO/null; priority poll; sorted tie-break; set ordering; Enum order; identity map; comparator overflow repaired\nPASS views fixed-size/write-through/snapshot/null; subList valid edit; map backed views; CME + iterator repair + removeIf; COW snapshot; CHM weak traversal (no global snapshot claim)\nPASS actual resize split capacity=128 low=5:Node high=4:Node all mappings retained\nPASS actual resize split capacity=128 low=6:Node high=7:TreeNode all mappings retained\n",
      "stderr": "Picked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-collections-final-6eysdwfx\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-collections-final-6eysdwfx\n",
      "remainingPrivateResources": [],
      "expectedExit": 0
    },
    {
      "name": "library-final2",
      "command": [
        "bash",
        "labs/java-senior/run.sh",
        "library"
      ],
      "startedUtc": "2026-10-24T15:11:38+00:00",
      "timeoutSeconds": 90,
      "timedOut": false,
      "exit": 0,
      "stdout": "PASS functions composition=8/7, predicate short circuit, Bi/primitive references\nPASS actual javac rejects rebound capture/checked Supplier, corrected sources compile, temp cleaned\nOBSERVE non-associative reduce rangeClosed(1,8) sequential=-36 parallel=0 (observed outputs, not a contract; both are valid per-spliterator groupings)\nPASS stream lazy/reuse recovery/close, bounded sum=500500, count=3 observedPeek=0\nPASS collectors duplicate rejected -> merge a=5/group size=2/partition; explicit list/null contracts\nPASS Optional of/null/get/map/flatMap failures and recovery; eager=1 then lazy=0 then empty=1\nPASS instant epoch second=1704067200/milli=1704067200000, fixed Clock/Date/explicit zone, month rejected, day=86400s Duration\nPASS month-end/YearMonth/Adjusters, ISO 2021-01-01=2020-W53, Thai2567<->ISO2024, overflow rejected\nPASS Paris gap rejected/recovered 03:30; overlap +02/+01 delta=3600s; Period=23h/Duration=24h; tzdb=[2024a]\nPASS optional lazy fallback calls=0\nPASS strict invalid leap day rejected, corrected leap date=2024-02-29\nPASS formatter SMART normalizes, STRICT/uuuu and explicit Locale recover\nPASS standard library scenarios=11\n",
      "stderr": "Picked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-library-final2-ydhrovfv\n注: /Users/gaochao/develop/workspace/software-engineering-study/labs/java-senior/TypeProbe.java使用了未经检查或不安全的操作。\n注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-library-final2-ydhrovfv\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-library-final2-ydhrovfv\n",
      "remainingPrivateResources": [],
      "expectedExit": 0
    },
    {
      "name": "all",
      "command": [
        "bash",
        "labs/java-senior/run.sh",
        "all"
      ],
      "startedUtc": "2026-10-24T15:11:59+00:00",
      "timeoutSeconds": 90,
      "timedOut": false,
      "exit": 0,
      "stdout": "PASS two Conditions: bounded buffer sum=500500\nPASS lockInterruptibly exits while lock remains held\nPASS core=1 max=2 queue=1: fourth task rejected\nPASS DiscardPolicy leaves submitted Future unfinished\nPASS FutureTask cancel(false): cancelled result, continuing computation\nPASS CompletableFuture timeout completes result, not underlying side effect\nPASS LRU get/update order, bounded capacity, eviction\nPASS token bucket: atomic burst=3, fractional refill retained, idle cap\nPASS values/reference-copy mutation=2 caller-count=1 unbox-null rejected overflow=-2147483648 narrow=-126 array-store rejected\nPASS equality distinct identities/equal hash; decimal hash-size=2 tree-size=1; defensive-copy size=1 nested-mutation=ab\nPASS TWR body primary/suppressed=2 reverse-close; close-only; initializer failure; fresh recovery; null skipped; finally masks body\nPASS checked IO + application cause preserved; invalid quantity rejected; corrected input=3\nPASS erased dispatch bridge=1, record is shallow, suppressed exception retained, raw write deferred to caught at read\nREJECT Invariant (javac exit nonzero)\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\n/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822/java-senior.PAfw1a/compile-examples/Invariant.java:2: 错误: 不兼容的类型: ArrayList<Integer>无法转换为List<Number>\nclass Invariant {List<Number> values=new ArrayList<Integer>();}\n                                     ^\n1 个错误\nREJECT ExtendsWrite (javac exit nonzero)\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\n/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822/java-senior.PAfw1a/compile-examples/ExtendsWrite.java:2: 错误: 不兼容的类型: int无法转换为CAP#1\nclass ExtendsWrite {void write(List<? extends Number> values){values.add(1);}}\n                                                                         ^\n  其中, CAP#1是新类型变量:\n    CAP#1从? extends Number的捕获扩展Number\n注: 某些消息已经过简化; 请使用 -Xdiags:verbose 重新编译以获得完整输出\n1 个错误\nREJECT ObjectGenericTest (javac exit nonzero)\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\n/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822/java-senior.PAfw1a/compile-examples/ObjectGenericTest.java:2: 错误: Object 无法安全地转换为 List<String>\nclass ObjectGenericTest {boolean test(Object value){return value instanceof List<String>;}}\n                                                           ^\n1 个错误\nREJECT GenericArray (javac exit nonzero)\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\n/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822/java-senior.PAfw1a/compile-examples/GenericArray.java:2: 错误: 创建泛型数组\nclass GenericArray {List<String>[] values=new List<String>[1];}\n                                          ^\n1 个错误\nREJECT CheckedDeclaration (javac exit nonzero)\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\n/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822/java-senior.PAfw1a/compile-examples/CheckedDeclaration.java:1: 错误: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出\nclass CheckedDeclaration {void read(){throw new java.io.IOException(\"not declared\");}}\n                                      ^\n1 个错误\nREJECT ReassignedResource (javac exit nonzero)\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\n/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822/java-senior.PAfw1a/compile-examples/ReassignedResource.java:4: 错误: 用作 try-with-resources 资源的变量 reader 既不是最终变量, 也不是实际上的最终变量\n    try(reader) { }\n        ^\n1 个错误\nPASS compiler accepts PECS/typed-instanceof/effectively-final resource; rejects 6 invalid programs\nPASS annotation CLASS=null RUNTIME!=null\nPASS default retention CLASS; repeatable container expands read/write\nPASS @Inherited class=yes interface=no\nPASS String.value setAccessible -> InaccessibleObjectException (own private field ok)\nPASS Method.invoke wraps business failure in cause\nPASS wrong signature/argument/class proxy rejected, corrected read=o-1:ok\nPASS undeclared checked -> UndeclaredThrowableException(cause kept)\nPASS declared IOException and RuntimeException/Error pass through unchanged\nPASS primitive null -> NPE, wrong type -> CCE, corrected Integer -> 7\nPASS self-invocation bypasses handler (intercepted=1)\nPASS default dispatch explicit, Object equals/hashCode/toString handled\nPASS reflection/annotation/proxy scenarios=11\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\njava version \"17.0.12\" 2024-07-16 LTS\nJava(TM) SE Runtime Environment (build 17.0.12+8-LTS-286)\nJava HotSpot(TM) 64-Bit Server VM (build 17.0.12+8-LTS-286, mixed mode, sharing)\njava.version=17.0.12 vm=Java HotSpot(TM) 64-Bit Server VM\n\n== 1. ArrayList growth ==\nnew ArrayList<>()      capacity=0    size=0\nafter add #1           capacity=10   size=1\nafter add #10          capacity=10   size=10\nafter add #11          capacity=15   size=11\nafter add #16          capacity=22   size=16\nafter add #23          capacity=33   size=23\n\n== 2. LinkedList structure ==\nfirst=Node last=Node\nNode fields=item,next,prev\n\n== 3. HashMap lazy allocation and resize ==\nnew HashMap<>()        capacity=0     threshold=0     size=0\nafter put 1            capacity=16    threshold=12    size=1\nafter put 12           capacity=16    threshold=12    size=12\nafter put 13           capacity=32    threshold=24    size=13\nnew HashMap<>(1000)    capacity=0     threshold=1024  size=0\nafter first put        capacity=1024  threshold=768   size=1\n\n== 4. Treeification also needs capacity >= 64 ==\nafter 1 colliding puts     size=1   capacity=16   bucket[1]=Node\nafter 2 colliding puts     size=2   capacity=16   bucket[1]=Node\nafter 3 colliding puts     size=3   capacity=16   bucket[1]=Node\nafter 4 colliding puts     size=4   capacity=16   bucket[1]=Node\nafter 5 colliding puts     size=5   capacity=16   bucket[1]=Node\nafter 6 colliding puts     size=6   capacity=16   bucket[1]=Node\nafter 7 colliding puts     size=7   capacity=16   bucket[1]=Node\nafter 8 colliding puts     size=8   capacity=16   bucket[1]=Node\nafter 9 colliding puts     size=9   capacity=32   bucket[1]=Node\nafter 10 colliding puts    size=10  capacity=64   bucket[1]=Node\nafter 11 colliding puts    size=11  capacity=64   bucket[1]=TreeNode\n\n== 5. HashMap treeification with colliding hashes ==\nafter 8 colliding puts     size=8   capacity=64   bucket[1]=Node\nafter 9 colliding puts     size=9   capacity=64   bucket[1]=TreeNode\nafter remove K9            size=8   capacity=64   bucket[1]=TreeNode\nafter remove K8            size=7   capacity=64   bucket[1]=TreeNode\nafter remove K7            size=6   capacity=64   bucket[1]=TreeNode\nafter remove K6            size=5   capacity=64   bucket[1]=Node\nafter remove K5            size=4   capacity=64   bucket[1]=Node\nafter remove K4            size=3   capacity=64   bucket[1]=Node\nafter remove K3            size=2   capacity=64   bucket[1]=Node\nafter remove K2            size=1   capacity=64   bucket[1]=Node\n\n== 6. Mutating a key after insertion ==\ninserted id=1: get=value containsKey=true size=1 bucket=1\nafter id 1 -> 2: get(same ref)=null containsKey=false size=1\nentrySet still contains key=[MutableKey(id=2)]\nremove(same ref)=null size=1\nPASS legacy capacity/treeification/deletion/mutable-key assertions (deletion shape not fixed)\nPASS map absent/null/duplicate/default/compute/merge-delete/null-rejection/recovery\nPASS selection deque FIFO/LIFO/null; priority poll; sorted tie-break; set ordering; Enum order; identity map; comparator overflow repaired\nPASS views fixed-size/write-through/snapshot/null; subList valid edit; map backed views; CME + iterator repair + removeIf; COW snapshot; CHM weak traversal (no global snapshot claim)\nPASS actual resize split capacity=128 low=5:Node high=4:Node all mappings retained\nPASS actual resize split capacity=128 low=6:Node high=7:TreeNode all mappings retained\nPASS functions composition=8/7, predicate short circuit, Bi/primitive references\nPASS actual javac rejects rebound capture/checked Supplier, corrected sources compile, temp cleaned\nOBSERVE non-associative reduce rangeClosed(1,8) sequential=-36 parallel=0 (observed outputs, not a contract; both are valid per-spliterator groupings)\nPASS stream lazy/reuse recovery/close, bounded sum=500500, count=3 observedPeek=0\nPASS collectors duplicate rejected -> merge a=5/group size=2/partition; explicit list/null contracts\nPASS Optional of/null/get/map/flatMap failures and recovery; eager=1 then lazy=0 then empty=1\nPASS instant epoch second=1704067200/milli=1704067200000, fixed Clock/Date/explicit zone, month rejected, day=86400s Duration\nPASS month-end/YearMonth/Adjusters, ISO 2021-01-01=2020-W53, Thai2567<->ISO2024, overflow rejected\nPASS Paris gap rejected/recovered 03:30; overlap +02/+01 delta=3600s; Period=23h/Duration=24h; tzdb=[2024a]\nPASS optional lazy fallback calls=0\nPASS strict invalid leap day rejected, corrected leap date=2024-02-29\nPASS formatter SMART normalizes, STRICT/uuuu and explicit Locale recover\nPASS standard library scenarios=11\n",
      "stderr": "Picked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\n注: /Users/gaochao/develop/workspace/software-engineering-study/labs/java-senior/TypeProbe.java使用了未经检查或不安全的操作。\n注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\nPicked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-all-jxn3z822\n",
      "remainingPrivateResources": [],
      "expectedExit": 0
    },
    {
      "name": "unknown",
      "command": [
        "bash",
        "labs/java-senior/run.sh",
        "invalid-u05"
      ],
      "startedUtc": "2026-10-24T15:12:09+00:00",
      "timeoutSeconds": 90,
      "timedOut": false,
      "exit": 2,
      "stdout": "",
      "stderr": "Usage: run.sh [all|locks|pool|async|algorithms|types|reflect|collections|library]\n",
      "remainingPrivateResources": [],
      "expectedExit": 2
    },
    {
      "name": "extra-arg",
      "command": [
        "bash",
        "labs/java-senior/run.sh",
        "library",
        "extra"
      ],
      "startedUtc": "2026-10-24T15:12:10+00:00",
      "timeoutSeconds": 90,
      "timedOut": false,
      "exit": 2,
      "stdout": "",
      "stderr": "Usage: run.sh [all|locks|pool|async|algorithms|types|reflect|collections|library]\n",
      "remainingPrivateResources": [],
      "expectedExit": 2
    },
    {
      "name": "invalid-java-home",
      "command": [
        "env",
        "JAVA_HOME=/tmp/u05-no-such-jdk",
        "bash",
        "labs/java-senior/run.sh",
        "library"
      ],
      "startedUtc": "2026-10-24T15:12:10+00:00",
      "timeoutSeconds": 90,
      "timedOut": false,
      "exit": 2,
      "stdout": "",
      "stderr": "JAVA_HOME 必须包含 JDK 17 的 java、javac、javap。\n",
      "remainingPrivateResources": [],
      "expectedExit": 2
    },
    {
      "name": "wrong-jdk",
      "command": [
        "env",
        "JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home",
        "bash",
        "labs/java-senior/run.sh",
        "library"
      ],
      "startedUtc": "2026-10-24T15:12:10+00:00",
      "timeoutSeconds": 90,
      "timedOut": false,
      "exit": 2,
      "stdout": "",
      "stderr": "本入口固定 JDK 17；当前版本：Picked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-wrong-jdk-r8_mlgd7\njava version \"21.0.5\" 2024-10-15 LTS\nJava(TM) SE Runtime Environment (build 21.0.5+9-LTS-239)\nJava HotSpot(TM) 64-Bit Server VM (build 21.0.5+9-LTS-239, mixed mode, sharing)\n",
      "remainingPrivateResources": [],
      "expectedExit": 2
    },
    {
      "name": "collections-extra-arg",
      "command": [
        "bash",
        "labs/collections/run.sh",
        "extra"
      ],
      "startedUtc": "2026-10-24T15:12:10+00:00",
      "timeoutSeconds": 90,
      "timedOut": false,
      "exit": 2,
      "stdout": "",
      "stderr": "Usage: run.sh [all]\n",
      "remainingPrivateResources": [],
      "expectedExit": 2
    },
    {
      "name": "collections-wrong-jdk",
      "command": [
        "env",
        "JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home",
        "bash",
        "labs/collections/run.sh"
      ],
      "startedUtc": "2026-10-24T15:12:10+00:00",
      "timeoutSeconds": 90,
      "timedOut": false,
      "exit": 2,
      "stdout": "",
      "stderr": "本探针固定JDK17；当前版本：Picked up JAVA_TOOL_OPTIONS:  -Xmx128m -Djava.io.tmpdir=/var/folders/zt/tcwwq7xs0fx7z2fppy55mcj40000gn/T/u05-collections-wrong-jdk-2wgojcv8\njava version \"21.0.5\" 2024-10-15 LTS\nJava(TM) SE Runtime Environment (build 21.0.5+9-LTS-239)\nJava HotSpot(TM) 64-Bit Server VM (build 21.0.5+9-LTS-239, mixed mode, sharing)\n",
      "remainingPrivateResources": [],
      "expectedExit": 2
    }
  ]
}