{
 "date": "2026-10-25",
 "timezone": "Asia/Shanghai",
 "issue": 49,
 "batch": "U12",
 "sourceTags": "OpenJDK jdk-17.0.12+7 与 jdk-21.0.5+9（固定机制源码，与两个运行 JDK 对应）",
 "environment": {
  "os": "macOS 26.7.1 (25G241, x86_64)",
  "architecture": "x86_64",
  "jdk17": "Oracle JDK 17.0.12+8-LTS-286（/Library/Java/JavaVirtualMachines/jdk-17.jdk，与 U05–U11 同版本）",
  "jdk21": "Oracle JDK 21.0.5+9-LTS-239（/Library/Java/JavaVirtualMachines/jdk-21.jdk）",
  "jdk25": "未安装；Java 25 相关差异全部按 JEP/规范推导并标注未实跑",
  "runPolicy": "调用方 perl alarm 60–240 秒上限；run.sh 显式按模式守卫 JDK17/JDK21（JAVA_HOME17/JAVA_HOME21 覆盖，macOS 未设置时 java_home 解析——已观察到未显式指定 17 时会解析到 GraalVM 17.0.12，与 U11 登记的回退边界一致，因此正式跑都显式指定）；唯一 mktemp 根目录 EXIT/INT/TERM trap 定向清理并传给 java.io.tmpdir，结束后剩余条目 0（早前两次被中断的开发运行残留的 modern-java.* 目录已定向删除）；负例统一退出 2。"
 },
 "tdd": {
  "redGreen": [
   "红1（pinning 饿死调度器的误解）：初版 pin-child 断言 parallelism=1 下两个『synchronized+各自监视器+sleep』任务会串行（第二个起跑 gap>=250ms），实跑 exit=1，输出『expected serialization by pinning, second start gap=16ms』——pinned 阻塞触发 ForkJoinPool 为阻塞 carrier 补偿新 carrier（JEP 444 maxPoolSize 语义），pinning 平时不会饿死调度器；绿探针改为 compensate/exhaust 两相（exhaust 用 -Djdk.virtualThreadScheduler.maxPoolSize=1 禁止补偿后 gap=304ms、total=622ms 串行，compensate gap=13ms、total=330ms 重叠）。",
   "红1b（卸载即重叠的误解）：初版对照组用同一把 ReentrantLock 让两个任务各自 sleep，断言 <550ms 完成，实跑 exit=1，输出『ReentrantLock should overlap on one carrier, got 609ms』——互斥本身就把两个 300ms 串起来，卸载改变的是 carrier 占用不是互斥；绿探针改为各自持锁（ownLocks）后 301/303ms 重叠完成。",
   "红2（『线程更轻所以下游调用被 CPU 数自然限住』的误解）：/tmp/u12-red/Red2Capacity.java 断言 200 个无信号量虚拟任务的在途数 <= CPU 数(8)，实跑 exit=1，输出『RED2 unexpected: expected in-flight capped near CPUs=8, saw 200』；绿探针第 3 节断言 Semaphore(10) 下两种模型 maxInFlight<=10、无信号量下虚拟线程 200 路并发直达下游。",
   "红3（『sealed+record 模式 switch 只是语法糖、JDK17 也能编译』的误解）：/tmp/u12-red/Red3Compile.sh 用 --release 17 编译 PatternBoundary.java，实跑 exit=1，javac 报『需要")"』（case Circle(var radius) 在 17 不存在，JEP 440/441 未包含）；绿探针 boundary17/boundary21 双档断言 17 拒绝、21 编译运行通过。",
   "红4（『JDK21 defaultCharset 仍跟随平台/native.encoding』的误解）：/tmp/u12-red/Red4Jep400.java 在 LC_ALL=C 下断言 JDK21 defaultCharset=US-ASCII，实跑 exit=1，输出『RED4 unexpected: defaultCharset=UTF-8 under LC_ALL=C, expected platform-derived US-ASCII』——JEP 400 后默认字符集无条件 UTF-8，native.encoding 仅如实报告环境；绿探针三档断言（17 平台推导 US-ASCII+乱码 / 21 UTF-8+正确 / 21+COMPAT 恢复 US-ASCII+乱码）。"
  ],
  "compileFixes": "开发期修复如实记录不计红绿：(1) 局部 record 实现 sealed 接口被 JLS 拒绝（局部类不能成为 permit 成员），改用顶级 permit 成员断言；(2) quotaYield 多标签分支数值与 quota 不一致的断言错；(3) 文本块断言误以为相对缩进也被剥离（只剥离公共前导空白）；(4) JFR RecordingFile/RecordedEvent 应来自 jdk.jfr.consumer 且 Recording 需 setDestination；(5) 无信号量对照用 CountDownLatch(1) 导致未全部启动就计数（176/200），改为 CountDownLatch(200)；(6) 固定池 worker 是首次 submit 时懒构造，ITL 快照时点=首次提交，按此修正期望值；(7) run.sh resolve_jdk 一行 local 双赋值在 set -u 下未绑定，拆行修复。这些是脚本/断言缺陷不是误解断言。",
  "noFakeRed": "五次红均为先按常见误解写下真实预期后被 JDK17/21 实测推翻（pinning 会饿死调度器、卸载即重叠、虚拟线程自带 CPU 限额、模式匹配 17 可编译、21 仍跟随平台字符集），随后按 JEP 444/440/441/400 的规范语义修正转绿，不倒造 red。"
 },
 "runs": [
  {
   "name": "all-final",
   "command": ["bash", "labs/modern-java/run.sh", "all"],
   "env": {"JAVA_HOME17": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", "JAVA_HOME21": "/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home"},
   "startedLocal": "2026-10-25T09:35 (Asia/Shanghai, alarm 240s)",
   "timedOut": false,
   "exit": 0,
   "stdoutSummary": "evolution：PASS 1 records（派生成员/紧凑构造器拒绝/反射/浅不可变）、PASS 2 sealed（permits 反射/final record 子类/non-sealed）、PASS 3 instanceof 模式（&&流作用域/取反守卫/null 恒不匹配）、PASS 4 switch 表达式（箭头+yield+枚举穷举）、PASS 5 文本块+var；REJECT x7（SealedRogue/SealedOpenSub/SwitchNonExhaustive/RecordPattern17/TypePatternSwitch17/PatternScopeOr/Sequenced17）；OBSERVE TypePatternSwitch17 在 --enable-preview --release 17 下可编译（JEP 406 预览，不运行）；REJECT PatternBoundary/SequencedBoundary under --release 17；PASS pattern boundary on 21、PASS sequenced boundary on 21。virtual：pin-child compensate gap=13ms total=330ms、exhaust gap=304ms total=622ms（两相均含 reason:MONITOR <== monitors:1 的 trace 栈）、unlock 301/303ms、PASS 1 model 100 任务 100 线程（parallelism 默认 8 观察值）、PASS 2 JFR jdk.VirtualThreadPinned events=1 first=298~306ms、PASS 3 capacity（pool=1143ms virtual=1137ms maxInFlight=10/10、无信号量 200 并发）、PASS 4 context/interrupt（v1v2/p1p1、中断延迟 0ms 观察值）。jep400：JDK17 defaultCharset=US-ASCII FileReader 7 码点乱码 / JDK21 defaultCharset=UTF-8 native.encoding=US-ASCII FileReader 3 码点正确 / JDK21+COMPAT defaultCharset=US-ASCII 乱码回归。",
   "tmpLeft": 0,
   "stabilityNote": "pin gap/总耗时/中断延迟/有界负载 wall time 为单机观察值，断言只压阈值方向（串行 vs 重叠、<=10、>=floor），不压精确值；jep400 三档断言的是字符集身份与码点数，属规范行为。"
  },
  {
   "name": "evolution-first-green",
   "command": ["bash", "labs/modern-java/run.sh", "evolution"],
   "exit": 0,
   "note": "2026-10-25 09:26 前后首绿：5 节 PASS + 7 编译负例 REJECT + 预览观察档 + 双档边界对照（进入 all 前的独立直跑）"
  },
  {
   "name": "virtual-green",
   "command": ["bash", "labs/modern-java/run.sh", "virtual"],
   "exit": 0,
   "note": "2026-10-25 09:34 run6 首次全绿（此前 5 次为红/开发修复，见 tdd 字段）"
  },
  {
   "name": "jep400-green",
   "command": ["bash", "labs/modern-java/run.sh", "jep400"],
   "exit": 0,
   "note": "2026-10-25 09:34 三档一次通过"
  },
  {
   "name": "red1-pinning-serialization-misconception",
   "command": ["java", "-ea", "-Djdk.virtualThreadScheduler.parallelism=1", "-Djdk.tracePinnedThreads=full", "-cp", "/tmp/u12v", "VirtualThreadProbe", "pin-child"],
   "exit": 1,
   "stdout": "VirtualThread[#20]/runnable@ForkJoinPool-1-worker-1 reason:MONITOR ... VirtualThreadProbe.lambda$pinChild$9 <== monitors:1 / Exception in thread \"main\" java.lang.AssertionError: expected serialization by pinning, second start gap=16ms",
   "note": "2026-10-25 09:31:52（/tmp/u12-pc.log）；初版断言 pinning 串行化被 ForkJoinPool 补偿推翻"
  },
  {
   "name": "red1b-same-lock-overlap-misconception",
   "exit": 1,
   "stdout": "PASS compensate: second starts at +14ms, total=337ms / Exception ... AssertionError: ReentrantLock should overlap on one carrier, got 609ms",
   "note": "2026-10-25 09:31（同上日志后半）；互斥 vs 卸载两个变量被拆开"
  },
  {
   "name": "red2-capacity-misconception",
   "command": ["java", "-cp", "/tmp/u12-red", "Red2Capacity"],
   "exit": 1,
   "stdout": "RED2 unexpected: expected in-flight capped near CPUs=8, saw 200",
   "note": "2026-10-25 09:34:41"
  },
  {
   "name": "red3-pattern-boundary-misconception",
   "command": ["bash", "/tmp/u12-red/Red3Compile.sh"],
   "exit": 1,
   "stdout": "PatternBoundary.java:16: 错误: 需要')' ... RED3 unexpected: --release 17 rejected PatternBoundary (JEP 440/441 not in 17)",
   "note": "2026-10-25 09:34:50"
  },
  {
   "name": "red4-jep400-misconception",
   "command": ["java", "-cp", "/tmp/u12-red", "Red4Jep400"],
   "env": {"LC_ALL": "C"},
   "exit": 1,
   "stdout": "RED4 unexpected: defaultCharset=UTF-8 under LC_ALL=C, expected platform-derived US-ASCII",
   "note": "2026-10-25 09:34:55"
  },
  {
   "name": "negative-unknown-mode",
   "command": ["bash", "labs/modern-java/run.sh", "nonsense"],
   "exit": 2,
   "stdout": "Usage: run.sh [all|evolution|virtual|jep400]"
  },
  {
   "name": "negative-extra-arg",
   "command": ["bash", "labs/modern-java/run.sh", "evolution", "extra"],
   "exit": 2,
   "stdout": "Usage: run.sh [all|evolution|virtual|jep400]"
  },
  {
   "name": "negative-evolution-under-jdk21",
   "command": ["bash", "labs/modern-java/run.sh", "evolution"],
   "env": {"JAVA_HOME17": "/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home"},
   "exit": 2,
   "stdout": "本入口模式固定 JDK 17；当前版本：java version \"21.0.5\" ..."
  },
  {
   "name": "negative-virtual-under-jdk17",
   "command": ["bash", "labs/modern-java/run.sh", "virtual"],
   "env": {"JAVA_HOME21": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home"},
   "exit": 2,
   "stdout": "本入口模式固定 JDK 21；当前版本：java version \"17.0.12\" ..."
  }
 ],
 "honesty": {
  "notAContract": "pin 补偿 gap/总耗时、JFR 事件时长、有界负载 wall time、中断延迟、parallelism 默认值都是单机观察值；断言只压方向阈值。maxPoolSize=256 的补偿行为由『本机观察 + JEP 444 文字』互证，未读 HotSpot 侧源码逐行核验（java.base 的 VirtualThread 状态机摘录只覆盖 PINNED 状态语义）。200 线程固定池与虚拟线程对照用的是 sleep 模拟下游，不代表真实下游吞吐。",
  "unreproducedScenarios": "JDK 24/25 未安装：JEP 491（无 synchronized pinning）、491 移除 tracePinnedThreads、JEP 506 Scoped Values 正式、505/507/502 预览、511–514 语言项等 25 差异全部按 JEP 推导未实跑；native/FFI pinning 场景（JEP 444 场景 2）未在本探针复现（需要 JNI/FFM 负载，只按 JEP 文字登记）；-Dfile.encoding=GBK 类非 UTF-8 非 COMPAT 值在 21 上属 JEP 400 明示的不确定行为，探针不依赖、正文不教依赖；中文 Windows GBK 平台的 17 vs 21 默认差异按规范推导（本机 macOS 无法复现该平台）。",
  "cleanup": "运行产物全部落在唯一 mktemp 目录并 trap 清理；开发期两次中断运行残留的 modern-java.* 临时目录已定向删除；仓库无新增运行产物（evidence 本文件为登记资产）。"
 }
}
