{
 "date": "2026-10-25",
 "timezone": "Asia/Shanghai",
 "issue": 50,
 "batch": "U13",
 "sourceTags": "OpenJDK jdk-21.0.5+9（正式 API：ExecutorService/ThreadPerTaskExecutor）与 jdk-23.0.2+7（预览 API：StructuredTaskScope），与两个运行 JDK 一一对应，不拼 tag 断言",
 "environment": {
  "os": "macOS 26.7.1 (25G241, x86_64)",
  "architecture": "x86_64",
  "jdk21": "Oracle JDK 21.0.5+9-LTS-239（/Library/Java/JavaVirtualMachines/jdk-21.jdk，与 U12 同版本）",
  "jdk23": "Oracle JDK 23.0.2+7-58（/Library/Java/JavaVirtualMachines/jdk-23.jdk，新增；JEP 480 第三次预览载体）",
  "jdk24/25/26": "未安装；JEP 499/505/525 差异全部按 JEP 推导并标注未实跑",
  "runPolicy": "调用方 perl alarm 120–300 秒上限；run.sh structured 模式要求 JDK21+JDK23（JAVA_HOME23 显式指定）、bounded 固定 JDK21；唯一 mktemp 根目录 EXIT/INT/TERM trap 定向清理并传给 java.io.tmpdir，all 运行结束后剩余条目 0；未知模式/多余参数/模式与 JDK 不匹配统一退出 2。"
 },
 "tdd": {
  "redGreen": [
   "红1（『JDK21 上结构化并发还需要孵化模块 jdk.incubator.concurrent』的版本认知错误）：javac --release 21 --add-modules jdk.incubator.concurrent 编译探针报『错误: 找不到模块: jdk.incubator.concurrent』exit=1（JDK23 同样拒绝）——JEP 453 起结构化并发已是 java.util.concurrent 的预览 API，只需 --enable-preview；绿：run.sh structured 增加双档编译负例（21/23 各一条 REJECT incubator-module compile）+ --enable-preview 双档编译运行通过。",
   "红2（『CompletableFuture.anyOf 会取消输家』的误解）：/tmp/u13-red/Red2AnyOf.java 断言 anyOf 胜出后输家 isCancelled()||isDone()，实跑 AssertionError『anyOf loser still running after winner, isCancelled=false』exit=1——anyOf 只竞争结果槽；绿：StructuredScopeProbe 第 3 节断言输家不被取消且 1.2s 后正常完成，STS ShutdownOnSuccess 输家 ~49/53ms 被中断。",
   "红3（『ExecutorService.close() 会中断在途任务』的误解）：/tmp/u13-red/Red3CloseInterrupts.java 断言 close 后任务 interrupted=true，实跑 AssertionError『close() returned without interrupting the running task (waited 312ms, task finished normally)』exit=1；绿：BoundedAdmissionProbe 第 1 节断言 !interrupted（close 只等待），第 2 节按源码分支断言『close 自身被中断才升级 shutdownNow』（closer 200ms 被中断，5s 任务 ~206ms 停、中断状态保留）。",
   "红4（『shutdownNow 能退回未开始任务』的池语义迁移误解）：/tmp/u13-red/Red4ShutdownNowQueue.java 断言返回列表 size>0，实跑 AssertionError『shutdownNow returned 0 unstarted tasks (thread-per-task has no queue)』exit=1；绿：BoundedAdmissionProbe 第 3 节断言返回空列表且 5/5 任务观察到中断（ThreadPerTaskExecutor.shutdownNow 恒 return List.of()）。",
   "红5（『cancel(false) 也会停线程』的误解）：/tmp/u13-red/Red5CancelFalseStops.java 对 1.5s 任务在 100ms 时 cancel(false) 后 get(600ms)，实跑 TimeoutException exit=1——线程照常跑完；绿：BoundedAdmissionProbe 第 4 节断言 cancel(false) 结果层取消（isCancelled/get 抛 CancellationException）但线程层跑满 1500ms，cancel(true) 才 ~0ms 中断退出。",
   "红6（『无超时的池等待只是慢、最终能完成』的误解）：/tmp/u13-red/Red6PoolHangJustSlow.java 在 10 条连接全被挂起后提交 30 个无超时获取任务，断言 800ms 内全部完成，实跑 AssertionError『only 0/30 tasks finished while all connections hang (waiters are stuck, not slow)』exit=1；绿：BoundedAdmissionProbe 第 5 节两相位（B 挂起 0/30、中断持有者后 30/30 恢复；C tryAcquire(200ms) 30/30 拒绝 ~215–222ms 收敛）。",
   "红7（『取消=立即结束、close 不等不响应中断的子任务』的误解）：/tmp/u13-red/Red7StsCloseImmediate.java 断言失败短路后 try 块 300ms 内退出，实跑 AssertionError『try-with-resources closed after 815ms (close waits for the unresponsive spinner to finish)』exit=1；绿：StructuredScopeProbe 第 4 节断言 close >= 700ms（800ms 自旋子任务拖住 close，JEP 525 文字互证）。",
   "红8（『随手写的 create-start-join 基准』的测量陷阱）：BoundedAdmissionProbe 初版构造成本观察不保留线程对象引用，测到平台线程 ~4–6µs；ThreadMXBean.getTotalStartedThreadCount() 增量=0 证明线程根本没有启动——HotSpot 逃逸分析消除了不逃逸的 Thread 对象（start 被整体消除）；捕获 threadId() 让对象逃逸后真数：平台 ~79–133µs、虚拟 ~20–33µs（create-start-join，单机观察值）。绿：探针第 6 节捕获 threadId 并以 sink 防消除，标注观察值非契约。"
  ],
  "compileFixes": "开发期修复如实记录不计红绿：(1) `new StructuredTaskScope.<String>ShutdownOnSuccess()` 泛型语法错误，改 `new StructuredTaskScope.ShutdownOnSuccess<String>()`；(2) ArrayBlockingQueue<List.of(...)> 构造歧义（int 与 Collection 重载在钻石推断下冲突），改为容量构造+put 循环；(3) 挂起持有者 catch 中先 Thread.currentThread().interrupt() 再 finally pool.put(conn)——ArrayBlockingQueue.put 走 lockInterruptibly，带中断状态 put 抛 InterruptedException 导致 10 条连接全部泄漏、等待者永远等不到（DbgC 实测 put interrupted 打印 10 次），改为 catch 不恢复标志、finally 归还；(4) Task 内层持有 sleep 被（假想）中断时连接泄漏，改为内层 try/finally 归还。这些是脚本/断言缺陷不是误解断言。",
  "noFakeRed": "八次红均为先按常见误解/旧版本认知写下真实预期后被 JDK21/23 实测推翻（孵化模块假设、anyOf 取消、close 中断、shutdownNow 退队列、cancel(false) 停线程、无超时等待只是慢、取消立即结束、随手基准），随后按源码分支/JEP 语义修正转绿，不倒造 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", "JAVA_HOME23": "/Library/Java/JavaVirtualMachines/jdk-23.jdk/Contents/Home"},
   "startedLocal": "2026-10-25T15:50 (Asia/Shanghai, alarm 300s)",
   "timedOut": false,
   "exit": 0,
   "stdoutSummary": "五模式全绿共 59 条 PASS/REJECT/OBSERVE：evolution（U12 原样：5 节 PASS + 7 编译负例 + 预览观察档 + 双档边界）；virtual（U12 原样：pin 两相/JFR/限流/上下文）；jep400（U12 原样三档）；structured 新增——JDK21 档 PASS 1 fail-fast ~93ms、PASS 2 owner-interrupt、PASS 3 first-success ~53ms + anyOf 输家继续、PASS 4 close ~802ms、PASS 5a/5b 结构强制与 ScopedValue，JDK23 档同构（~97/49/802ms，同一源码 --release 23 --enable-preview），REJECT incubator-module compile ×2（21/23 双拒）；bounded 新增——PASS 1 close 等待 ~311ms 不中断、PASS 2 升级 ~206ms、PASS 3 shutdownNow 空列表 5/5 中断、PASS 4 cancel(false) 跑满/cancel(true) ~0ms、PASS 5a 100/100 ~589–603ms maxWaiters=90、PASS 5b 0/30 挂起→释放后 30/30、PASS 5c 30/30 拒绝 ~215–222ms、OBSERVE 6 虚拟 ~31–34µs vs 平台 ~120–133µs。",
   "tmpLeft": 0,
   "stabilityNote": "结构化并发短路/取消时延、close 等待时长、有界等待 wall、构造成本均为单机观察值；断言只压方向阈值（<2500 vs 4000、>=700、0/30、30/30、空列表），不压精确值；ScopedValue 继承与解绑、shutdownNow 空列表、close 升级分支为规范/源码行为断言。"
  },
  {
   "name": "structured-first-green",
   "command": ["bash", "labs/modern-java/run.sh", "structured"],
   "env": {"JAVA_HOME21": "/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home", "JAVA_HOME23": "/Library/Java/JavaVirtualMachines/jdk-23.jdk/Contents/Home"},
   "exit": 0,
   "note": "2026-10-25 15:1x 首绿（独立直跑；此前为红1/红2/红7 与开发修复，见 tdd 字段）"
  },
  {
   "name": "bounded-first-green",
   "command": ["bash", "labs/modern-java/run.sh", "bounded"],
   "env": {"JAVA_HOME21": "/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home"},
   "exit": 0,
   "note": "2026-10-25 15:0x 首绿（此前红3/红4/红5/红6/红8 与开发修复；红6 的替身连接泄漏修复见 compileFixes(3)）"
  },
  {
   "name": "red1-incubator-module-assumption",
   "command": ["javac", "--release 21", "--add-modules jdk.incubator.concurrent", "-d", "/tmp/u13-red/out21x", "/tmp/u13-smoke/StsSmoke.java"],
   "exit": 1,
   "stdout": "错误: 找不到模块: jdk.incubator.concurrent（JDK23 同样拒绝）",
   "note": "2026-10-25 14:4x；版本认知错误被编译器推翻，JEP 453 已移入 java.util.concurrent 预览"
  },
  {
   "name": "red6-pool-hang-not-slow",
   "command": ["java", "-ea", "-cp", "/tmp/u13-red", "Red6PoolHangJustSlow"],
   "exit": 1,
   "stdout": "Exception ... AssertionError: RED6 unexpected: only 0/30 tasks finished while all connections hang (waiters are stuck, not slow)",
   "note": "2026-10-25 15:0x；无超时等待集把下游全挂放大为整池挂起"
  },
  {
   "name": "red8-escape-analysis-benchmark-pitfall",
   "command": ["java", "-cp", "/tmp/u13-green", "DbgCost3"],
   "exit": 0,
   "stdout": "no-ref: avg=4032ns startedDelta=0 / with-ref: avg=79249ns startedDelta=2000",
   "note": "2026-10-25 15:2x；不逃逸的 Thread 对象被逃逸分析消除，基准测到空循环；捕获 threadId 后恢复真数"
  },
  {
   "name": "negative-bounded-under-jdk17",
   "command": ["bash", "labs/modern-java/run.sh", "bounded"],
   "env": {"JAVA_HOME21": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home"},
   "exit": 2,
   "stdout": "本入口模式固定 JDK 21；当前版本：java version \"17.0.12\" ...",
   "note": "模式与 JDK 不匹配守卫"
  },
  {
   "name": "negative-structured-with-jdk21-as-23",
   "command": ["bash", "labs/modern-java/run.sh", "structured"],
   "env": {"JAVA_HOME21": "/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home", "JAVA_HOME23": "/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home"},
   "exit": 2,
   "stdout": "本入口模式固定 JDK 23；当前版本：java version \"21.0.5\" ...",
   "note": "structured 需要 21/23 两套"
  },
  {
   "name": "negative-unknown-mode",
   "command": ["bash", "labs/modern-java/run.sh", "nonsense"],
   "exit": 2,
   "stdout": "Usage: run.sh [all|evolution|virtual|jep400|structured|bounded]"
  }
 ],
 "honesty": {
  "notAContract": "结构化并发的短路/取消时延（~1ms/~50ms/~800ms）、close 等待与升级时延、有界等待/拒绝 wall、构造成本（~31µs/~122µs）都是单机观察值非契约；断言只压方向阈值。连接池用 ArrayBlockingQueue 替身模拟（模型/替身证据层，非真实数据库驱动或网络下游）。maxPoolSize/补偿等 U12 机制不重复实验。ScopedValue 继承实测是 21/23 预览行为，正式化（JEP 506）行为未在 25 验证。",
  "unreproducedScenarios": "JDK 24/25/26 未安装：JEP 499（四次预览无变更）、505（open()/Joiner/FailedException 重构）、525（六次预览）全部按 JEP 推导未实跑；JDK 19/20 的孵化 API（fork 返回 Future、--add-modules jdk.incubator.concurrent@20.0.2 本机存在）未实跑，不据此断言行为；StructureViolationException 场景未构造（按 JEP/javadoc 登记）；scope 级超时（505 Configuration.withTimeout）未实跑，21 上的超时层次按 owner 中断/deadline 推导；真实 HTTP/数据库下游与 native/FFM 场景未纳入探针。",
  "cleanup": "运行产物全部落在唯一 mktemp 目录并 trap 清理（all 后 tmpLeft=0）；红绿开发期文件全部在 /tmp/u13-red、/tmp/u13-green、/tmp/u13-smoke、/tmp/u13-src 私有目录（验收后定向删除）；仓库无新增运行产物（evidence 本文件为登记资产）。"
 }
}
