{
 "date": "2026-10-25",
 "timezone": "Asia/Shanghai",
 "issue": 43,
 "batch": "U06",
 "sourceTag": "OpenJDK jdk-17.0.12+7 (fixed mechanism source)",
 "environment": {
  "os": "macOS 26.7.1 (x86_64)",
  "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)",
  "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home",
  "runtimeNote": "与 U05 相同的本机 Oracle JDK 17.0.12（x86_64）；U04 的 Liberica 17.0.19（arm64）不在本机。运行开始于本地时间 2026-10-25 00:32（UTC 2026-10-24T16:32）。",
  "runPolicy": "每次运行由包装脚本设置 90 秒 perl alarm 上限、-Xmx128m、唯一 TMPDIR 并作为 java.io.tmpdir 传入；结束后检查私有目录剩余条目（实测 0）并定向删除。run.sh 自身 mktemp 唯一编译目录 + EXIT/INT/TERM trap。探针 main 在 finally 里 walk+delete 自有 Files.createTempDirectory 目录。",
  "stderrNote": "stderr 中 '注: TypeProbe.java 使用了未经检查或不安全的操作' 来自 run.sh io 编译阶段同目录既有 TypeProbe.java（run.sh 第 34 行固定编译列表），非本票输出错误；'Picked up JAVA_TOOL_OPTIONS' 是 JVM 对显式内存/临时目录限制的回显。"
 },
 "tdd": {
  "redGreen": [
   "红1（read 契约）：断言先写成 InputStream 基类 read(byte[],int,int) 循环内 IOException 被吞后返回 i-1（即 2），实跑 AssertionError 返回 3（exit 1）；核对 jdk-17.0.12+7 InputStream.java L278-L301 确认 JDK17 为 catch 后 return i，中途异常返回值与正常短读无法区分，修正断言为 3 后 exit 0。正文按此口径撰写。",
   "红2（JEP 290 过滤器）：断言反序列化 ArrayList 被白名单 'EncodingIoProbe*;maxdepth=5' 拒绝（预期 InvalidClassException），实跑正常返回（exit 1）；用最小 FilterDebug 程序实测模式过滤器对不匹配类返回 UNDECIDED 而非 REJECTED，加 '.*' 前置否定 ' !*'（'EncodingIoProbe*;!*;maxdepth=5'）后拒绝生效 exit 0。正文与题目写入该边界。",
   "红3（BufferedInputStream mark）：断言 mark(1) 后读 4 字节 reset 抛 IOException，实跑正常返回（一次 fill 已把 ByteArrayInputStream 全部 10 字节吸入 8192 缓冲，mark 仍有效）；改为 10000 字节越过默认缓冲后才触发 marklimit 失效，exit 0。正文据此写明 mark 失效条件与缓冲 fill 的关系。"
  ],
  "compileFixes": "前三次运行为编译错误修复（IntStream 无 mapToInt、void 方法引用不匹配 ThrowingCall、缺 FileChannel 导入、SimpleJavaFileObject 未落盘产物、跨 classloader 包私有构造器不可访问、ObjectInputStream 默认 AppClassLoader 解析不到 URLClassLoader 的 Compat 需覆盖 resolveClass、CharsetDecoder.decode 受检异常未声明），属实验代码修正，不计入红绿。",
  "noFakeRed": "三个红均为先写下的真实预期被实测推翻，随后按源码/规范修正断言，不倒造 red。"
 },
 "runs": [
  {
   "name": "io-final",
   "command": [
    "bash",
    "labs/java-senior/run.sh",
    "io"
   ],
   "startedUtc": "2026-10-24T16:32:06+00:00",
   "timeoutSeconds": 90,
   "timedOut": false,
   "exit": 0,
   "stdout": "PASS encoding: String replace U+FFFD, decoder REPORT/REPLACE split, malformed len=1, ISO-8859-1 ? vs REPORT, illegal vs unsupported name\nOBSERVE defaultCharset=UTF-8 file.encoding=UTF-8（JDK17 平台推导；JDK18 起 UTF-8 默认，本行是观察不是契约）\nPASS text units: length=4 codePoints=3 for a汉😀, lone surrogate degrades to ?, BOM \\uFEFF survives decode and must be stripped by caller\nPASS protocol: magic ACED0005, self/next handle identity, shared ref identity, truncated EOF vs garbage StreamCorrupted, recovery via fresh bytes\nPASS suid: default shape hash differs (-1087132073137349234 vs 1049006845098732798), explicit 1L stable, added field default 0, changed type incompatible, SUID mismatch InvalidClassException\nPASS hooks: writeObject/readObject pair, readResolve singleton, writeReplace type swap, Externalizable manual protocol\nPASS filter: depth 10 rejected, depth 2 allowed, class outside allowlist rejected via !* (bare allowlist leaves unknown classes UNDECIDED; JEP 290)\nPASS read contract: short read=1, len0=0, EOF=-1, available hint only, base impl swallows mid-loop IOException returning 3 (same as normal short read), transferTo=6\nPASS buffering: mark within limit, reset beyond 8192 buffer+marklimit rejected, readLine strips terminators, wrapper close flush+close-once\nPASS files: copy exists/reject/replace, move REPLACE+ATOMIC ok, directory glob filter, walk closed by TWR, entries=4\nPASS buffer: flip/compact/clear states, mark vs InvalidMark, positional read/write independence, scatter read, direct vs heap\nALL U06 SECTIONS PASS\n",
   "stderrNote": "JAVA_TOOL_OPTIONS 回显与 TypeProbe unchecked 诊断，见 environment.stderrNote",
   "tmpLeft": 0
  },
  {
   "name": "unknown-mode",
   "command": [
    "bash",
    "labs/java-senior/run.sh",
    "nonsense"
   ],
   "exit": 2,
   "stdout": "",
   "note": "未知模式退出 2"
  },
  {
   "name": "extra-arg",
   "command": [
    "bash",
    "labs/java-senior/run.sh",
    "io",
    "extra"
   ],
   "exit": 2,
   "note": "参数过多退出 2"
  },
  {
   "name": "bad-java-home",
   "command": [
    "bash",
    "labs/java-senior/run.sh",
    "io"
   ],
   "env": {
    "JAVA_HOME": "/bad/home"
   },
   "exit": 2,
   "note": "无效 JAVA_HOME 退出 2"
  },
  {
   "name": "jdk21-rejected",
   "command": [
    "bash",
    "labs/java-senior/run.sh",
    "io"
   ],
   "env": {
    "JAVA_HOME": "/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home"
   },
   "exit": 2,
   "note": "版本守卫拒绝 JDK21，本入口固定 JDK17"
  }
 ]
}