Files
Unlucky-Launcher/crates
worker-javapin aac0eef1b8 fix(java): 越界页 404 不许作废已取到的清单 + 三处文档/文案(M280 r2)
r2 复审 p2-1items / fix-then-merge,只做指定的四项。

## P2-1 满页收尾会多打一页 404,把前几页一起丢掉
`collect_releases` 原来靠「本页不满 PAGE_SIZE」收尾;某条 GA 线的条数恰好是 20 的倍数时
最后一页是满页 ⇒ 会多要一页 ⇒ Adoptium 对越界页回 **HTTP 404 + 空体**(实测,不是空数组)
⇒ 那一页的 Metadata 错误把**已经取到的前几页**一起作废,整条 `--version` 路径失败。

- `page > 0` 的 Metadata(404 / 空响应)视为「翻到尾巴」:返回已取到的全部 + `truncated=false`;
- `page == 0` 的 404 仍然报错(那才是「这个 major 没有 GA 清单」);
- **网络错误**(`JavaErrorKind::Network`)在任何一页都不被吞,照样冒泡。

用例(全离线,注入夹具):
- `a_404_on_the_page_after_a_full_page_ends_the_tail_cleanly`:page0=Ok(20 条)、
  page1=Err(Metadata 404) ⇒ 断言 `Ok((20 条, false))` 且 `calls == 2`(把「今天上游越界页就是 404」钉住);
- `a_404_on_the_first_page_is_still_an_error`:page0 就 404 ⇒ 必须 `Err`;
- `a_network_error_on_a_later_page_is_not_swallowed`:page1 网络错误 ⇒ 必须 `Err`。

## P3-1 `install/plan.rs` 文档与事实矛盾
改成如实描述:搬移的直接原因(400 行硬线)+ **三处语义变化**(签名接 `&InstallRequest`、
函数体改走 `chain_fetch` 与 `install` 共用同一份判据、`request.priority` 现在参与选择顺序)。

## P3-2 `api.rs` 头注释
补一句:latest 那条走本模块,「指定版本」走子模块 `version`(`feature_releases` 翻页枚举 →
`assets/release_name`),两者共用同一套响应结构。

## P3-3 Oracle 拒绝文案多一个空格
`source` 自带连接词(`Adoptium 里` / `Oracle 镜像目录里`),模板改成 `({source}可用:…)`。
真机:`(Oracle 镜像目录里可用:21.0.2 / 21.0.1 / 21)`、`(Adoptium 里可用:… 等 26 个)`。
用例补三条断言钉住这两种拼法,并断言 Oracle 那句不许出现「镜像目录 里」。

门禁(CARGO_TARGET_DIR=C:/Temp/ull-target/wt-280):core --lib 873 / --test game 120 /
--test launch 91、cli --all-targets、fmt --check、clippy -D warnings 全部 EXIT=0。
2026-11-12 22:05:19 +08:00
..