Skip to content

Port math lib and registrum alias api to 1.21.8 移植数学库和注册库别名API到1.21.8 - #129

Merged
WhereisFff merged 4 commits into
Anvil-Dev:dev/1.21.8from
QiuShui1012:port/1.21.8
Sep 28, 2026
Merged

WhereisFff merged 4 commits into
Anvil-Dev:dev/1.21.8from
QiuShui1012:port/1.21.8

Conversation

@QiuShui1012

Copy link
Copy Markdown
Contributor

No description provided.

QiuShui1012 and others added 2 commits September 25, 2026 12:20
Cherry-pick of 7285ae1 (Add math lib 添加数学库 (Anvil-Dev#122)) adapted to 1.21.8:
- ResourceLocation instead of Identifier
- test wiring for the 1.21.8 module.gradle layout
Cherry-pick of 892ef23 (Add alias api for Registrum 向Registrum加入别名API (Anvil-Dev#128)) adapted to this version.
@Gugle2308

Copy link
Copy Markdown

⚠️ Dangerous command requires approval:

cd /tmp; curl -s "https://api.github.com/repos/Anvil-Dev/AnvilLib/pulls/129" -o /tmp/pr129_meta.json; python3 -c "
import json
d=json.load(open('/tmp/pr129_meta.json'))
print('TITLE:',d['title'])
prin...

Reason: script execution via -e/-c flag

Reply /approve to execute, /approve session to approve this pattern for the session, /approve always to approve permanently, or /deny to cancel.

@Gugle2308

Copy link
Copy Markdown

代码审查摘要 — PR #129

操作: opened(webhook 自动审查)
范围: 47 个文件(37 Java,37 新增 / 0 删除)/ diff 6690 行,+6230 / −2
提交: f2001dbd port(math)、17f28ba0 port(registrum),head 7f28ec7
diff 完整性: md5(patch-diff) == md5(api 3-dot diff),changed_files=47 与 diff 头数一致 → 未截断

审查方法:本地克隆 AnvilLib,fetch 具名 refs 做三方对账(rvsrc1211=dev/1.21.1 892ef231、rv261x=dev/26.1、rvhead129=pull/129/head、rvbase1218=dev/1.21.8),并用 1.21.8 client_mappings + 混淆客户端字节码核对 API 存在性与语义(无 token、无构建)。


🔍 移植保真度(本 PR 的核心,逐文件核对)

核对项 证据 结论
math 全部 37 文件 与源 dev/1.21.1 的 module.math 19 个文件逐字节相同;与 dev/26.1 仅 12 文件有差,差异全部是 Identifier→ResourceLocation、identifier()→location()、anvillib-util-neoforge-<ver> ✅
Identifier 残留 git grep '\bIdentifier\b|identifier()' rvhead129 -- module.math → 空 ✅ 改名彻底
registrum 别名 API(5 文件) 加行与源 PR #128(892ef231)逐行一致:aliases 字段 / addAlias / applyAliases、aliasedFrom+aliasFrom+addAliases+getEntryId、Builder#aliasFrom 接口、BlockBuilder 的 itemCreated/blockEntityCreated、FluidBuilder 的 blockCreated/bucketCreated ✅
省略 EntityBuilder.java 源 #128 改了它(_spawn_egg 别名),本 PR 未带 —— 核实为正当省略:dev/1.21.8 的 EntityBuilder 没有 spawnEgg(...) 方法(只剩 injectSpawnEggType),派生条目在本分支不存在 ✅
变更面 全 PR 只有 2 行删除,且都在 .gitignore;其余全是新增文件 + 纯插入 ✅ 零回归面
胶水一致性 modules.json math→needs ["util"] 与模块实际 import(只有 dev.anvilcraft.lib.v2.util.ISerializer)一致;settings.gradle 改名 anvillib-math-neoforge-1.21.8 与 CI 矩阵 module_id 推导一致;module.main/build.gradle 两个分支都补了 math ✅

✅ 1.21.8 API 适配逐项核实(非猜测,均有字节码/mappings 依据)

适配 依据 结论
getHolderOrThrow(key) → getOrThrow(key)(保留 .value()) 1.21.8 Registry(jy) extends HolderLookup$RegistryLookup(jn$b) → HolderGetter,getOrThrow(ResourceKey) 返回 Holder$Reference;base 分支 0 处 getHolderOrThrow ✅ 语义不变
javax.annotation.Nullable → org.jspecify @NullMarked base 已有 148 个文件用 jspecify ✅ 合分支约定
functions().asLookup() → functions() 1.21.8 全仓已无 asLookup;Registry 自身即 HolderGetter/RegistryLookup ✅
匿名 RegistryAccess.Frozen 改为 lookup+registries+freeze 1.21.8 RegistryAccess 抽象 lookup/registries,freeze() 为默认方法;Frozen 本身无新增成员 ✅
registerFunction 重复键改为反射 bindValue 改绑 1.21.8 MappedRegistry(jt) 常量池确含 "Adding duplicate key '\u0001' to registry"(同名重注册必抛),而自引用/互引用/撞内建名用例全靠同名换函数体;Holder$Reference.bindValue(Object) 存在 ✅ 必要
ExtraCodecs.NON_NEGATIVE_INT、WritableRegistry、new MappedRegistry<>(key, lifecycle)、RegistryFileCodec.create、RegistryOps.getter 均在 1.21.8 mappings 中 ✅
registrum 的 registry.resolve/addAlias(vanilla 无) NeoForge 1.21.8 分支 BaseMappedRegistry#addAlias/resolve + MappedRegistry patch 内部调用 resolve ✅ 由 NeoForge 提供
CI 实测 7f28ec7 的 check-runs:build-l2 (math) ✅、build-l2 (registrum) ✅、build-l0/l1、main 全 success;build 依赖 check→test → math 单测(含 20000 轮往返 fuzz)已跑通 ✅ 编译+测试双绿

⚠️ 警告

  1. README.en.md 未同步 — README.md 补了三处(模块表 / 模块清单 / 两处依赖片段 anvillib-math-neoforge-1.21.8),英文 README 三处都还缺 math(模块表第 17–35 行无 Math、第 348–357 与 372–381 两段依赖无 math)。两个 README 都被打进 jar,按英文文档接库的人拿不到 math 坐标。源 PR Add math lib 添加数学库 #122 也漏了(继承缺口),但在这条分支上此刻是真实文档漂移,建议顺手补齐。
  2. 测试注释里的版本号写成 "26.1" — MathTestBootstrap.registerFunction 与 bindValue 的 javadoc、ParseCacheTest#lookupsOfTheSameRegistryShareABucket 的注释都写「26.1 的 MappedRegistry 抛异常 / 26.1 里注册表自己就是 RegistryLookup」。本 PR 目标是 1.21.8,我在 1.21.8 字节码里已核实这两条对 1.21.8 同样成立,把 26.1 改成 1.21.8 即可,否则后来人在 1.21.8 分支读注释会以为与代码无关。
  3. commit 溯源不准 — f2001dbd 写「Cherry-pick of 7285ae1 (Add math lib 添加数学库 #122) adapted to 1.21.8: ResourceLocation instead of Identifier」,但 7285ae13 在 dev/1.21.1,其内容本来就是 ResourceLocation(无 Identifier 可换);实际内容与 dev/26.1 的 math 模块近乎逐字相同(连 26.1 注释、重复键改绑 workaround 一起带过来)。建议把 commit message / PR 描述写成「从 dev/26.1 的 math 模块移植(其上游为 Add math lib 添加数学库 #122)」,免得以后 bisect 误判来源。

💡 建议

  1. module.math/build.gradle 的 dev 分支用 jarJar(implementation project(":anvillib-util-neoforge-1.21.8")),而 base 里其余 19 个有依赖的模块一律 jarJar(api ...)(本文件的 NOT_DEV 分支用的也是 api)。math 的公开 API 暴露 util 类型(IFunction.Type extends dev.anvilcraft.lib.v2.util.ISerializer),dev/项目依赖路径下下游编译期拿不到 util。建议统一为 api project(...)(继承自 26.1 同名模块,非本 PR 新引入)。
  2. .gitignore 把 *.log 放宽为 *.log* 并删掉 *.log.gz:会连带忽略 *.log.txt/*.log.bak。若只为忽略 fuzz 输出,收窄成 *.log.gz 更稳妥;属源 PR 带来的既成改动,不阻塞。

🟢 看起来不错

  • 移植保真度高:19/37 个 Java 文件与源分支逐字节相同,其余差异全部可解释为版本改名;registrum 5 个文件的加行与 Add alias api for Registrum 向Registrum加入别名API #128 逐行等价。
  • 变更面极干净:只删 2 行(.gitignore),没有顺手动到任何既有模块的逻辑。
  • 单测覆盖到位:flat 文本→树→文本随机 fuzz 往返、JSON/网络双编解码路径、解析缓存容量与换表、内建函数/自定义函数/lambda/变参配位。
  • 缓存生命周期处理得当:ServerStartedEvent+OnDatapackSyncEvent(getPlayer()==null 才清)+ 客户端 Dist.CLIENT 断开清缓存,正对「弱键缓存被表达式树引用链钉住旧注册表」的泄漏。
  • modules.json / settings.gradle / module.main 三处胶水与源 PR 同型且改名完整,CI 拓扑层级(math 在 util 之后)正确。

📋 声称验证表

PR 描述为空(None),按两条 commit 标题逐项核对:

声称 状态 证据
port math lib to 1.21.8 ✅ module.math 37 文件 + settings/modules.json/module.main 胶水;CI build-l2 (math) success
port registrum alias api 到 1.21.8 ✅ 5 文件加行与 #128 一致;CI build-l2 (registrum) success
"ResourceLocation instead of Identifier" ⚠️ 改名本身✅且无残留;但来源应是 dev/26.1 而非 1.21.1 的 7285ae13(见 ⚠️3)
(隐含)#128 的 EntityBuilder 段 ✅ 正当省略 dev/1.21.8 无 spawnEgg(),派生 _spawn_egg 不存在

结论: APPROVE — 无阻塞问题,且 CI 已双绿(math/registrum build 含单测)。合并前建议顺手处理 ⚠️1(英文 README 同步 math)、⚠️2(注释版本号 26.1→1.21.8)、⚠️3(commit/PR 描述写明真实来源);💡4/5 非阻塞。

🧪 测试建议

被测目标 推荐测试场景 优先级
AbstractRegistrum#addAlias/applyAliases 旧名仍注册→忽略并 warn;同一旧名指向不同新名→error 且不覆盖;resolve 已指向新名→跳过不重复 addAlias(当前全仓无任何测试,源 #128 也没带) 🟡
BlockBuilder/FluidBuilder#addAliases 派生条目(block item / block entity type / fluid type / fluid block / bucket)仅在实际创建时才别名;item()(无参)与 simpleBlockEntity() 必须也置位(已核实二者内部委托带标志的重载) 🟡
MathTestBootstrap#registerFunction 同名重复注册走 bindValue 改绑后,registry.get(key).value() 是新函数、且注册表内不出现重复条目;bindValue 反射失败路径的异常信息 🟢

关于 PR 标题:本轮 gh auth status 显示 /opt/data/home/.config/gh/hosts.yml 中 token invalid,按约定未自动修改。建议标题:Port math lib and Registrum alias API to 1.21.8 移植数学库与 Registrum 别名 API 到 1.21.8


由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown

💾 Self-improvement review: Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement). · Patched SKILL.md in skill 'offline-pr-evidence-verification' (1 replacement).

@Gugle2308

Copy link
Copy Markdown

🌿 Roseau API Breaking Change Report

Module Status Breaking Changes
codec ⚪ Skipped —
collision ⚪ Skipped —
cube ⚪ Skipped —
config ⚪ Skipped —
integration ⚪ Skipped —
moveable-entity-block ⚪ Skipped —
network ⚪ Skipped —
rendering ⚪ Skipped —
space-select ⚪ Skipped —
font ⚪ Skipped —
util ⚪ Skipped —
explosion ⚪ Skipped —
rpc ⚪ Skipped —
math ⚪ Skipped —
multiblock ⚪ Skipped —
recipe ⚪ Skipped —
registrum ⚪ Skipped —
sync ⚪ Skipped —
wheel ⚪ Skipped —
main ⚪ Skipped —

Full CSVs: see the Artifacts section of this workflow run.

The module build script used jarJar(implementation project(...)) for util, while every
other module in this branch uses jarJar(api project(...)). The math API exposes util types
(IFunction.Type extends dev.anvilcraft.lib.v2.util.ISerializer), so a downstream project
depending on math alone could not see them at compile time.

The test comments describing MappedRegistry and RegistryLookup named 26.1 even though the
behaviour is the same here; they now name this version.
The Math entries added in the port were missing from README.en.md. Both are packaged into
the jar, so English readers had no math coordinates.
@Gugle2308

Copy link
Copy Markdown

代码审查摘要 — PR #129(第 2 轮 · synchronize 复查)

操作: synchronize
范围: 48 个文件(37 Java,37 新增 / 0 删除)/ diff 6768 行,+6269 / −2
分支: port/1.21.8 → dev/1.21.8,head 57e4d91d,base 5f873003(mergeable_state: unstable)
上一轮审查: head 7f28ec7(47 文件)已发布在 PR 上 → 本轮为增量复查(§6n/§6q)

diff 完整性: changed_files=48 ↔ grep -c '^diff --git'=48;+行 6316−47=6269 ↔ additions=6269;−行 49−47=2 ↔ deletions=2 → 未截断。

本轮增量(2 个提交):

commit 内容
fix(math): export util to consumers and correct version comments module.math/build.gradle 的 jarJar(implementation …) → jarJar(api …);测试注释里的「26.1」改为本版本
docs(readme): document the math module in the English README README.en.md 补 Math 模块表行 + Math Module 章节 + 两段依赖坐标

✅ 上一轮问题销账

上轮项 现状 证据
⚠️1 README.en.md 未同步 ✅ 已修 head 中 **Math** 表行 1/1、- \math` 清单 1/1、anvillib-math` 坐标 2/2 —— 中英完全对称
⚠️2 测试注释写「26.1」 ✅ 已修 git grep "26\.1" rvhead129b -- module.math → 0 命中
💡4 jarJar(implementation) 暴露不到下游 ✅ 已修 jarJar(api project(":anvillib-util-neoforge-1.21.8")) 与分支内其余 19 个模块一致
⚠️3 commit 溯源不准 ❌ 未改 见下(本轮已复核为实)
💡5 .gitignore 放宽为 *.log* ❌ 未改 非阻塞,可保留

⚠️3 复核结论(本轮重新取证,比上轮更硬):

  • 7285ae13 = PR Add math lib 添加数学库 #122「Add math lib 添加数学库」的 merge commit,其 base.ref = dev/1.21.1、head.ref = math/1.21.1(本次用 pulls/122 直接核实)。
  • 而 head 的 module.math 与 dev/26.1 的 module.math 只差 10 个文件、每个 2~3 行,且差异全部是 Identifier→ResourceLocation、identifier()→location()、anvillib-util-neoforge-<ver>;与 dev/1.21.1 则差 18 文件(含 5 个 package-info 的 javax→jspecify、getHolderOrThrow→getOrThrow、MathTestBootstrap 36/19)。
  • 即 commit 自述的适配「ResourceLocation instead of Identifier」只能描述「26.1 线 → 1.21.8」这一步——因为 dev/1.21.1 的代码本来就是 ResourceLocation。引用的 sha 与搬运的内容相互矛盾:应写成「从 dev/26.1 的 module.math 移植(其上游为 Add math lib 添加数学库 #122)」,否则日后 bisect / 回移植会按错误源头去找。属文档级(不阻塞)。

🔴/⚠️ 本轮新发现

⚠️ AbstractRegistrum#applyAliases 的冲突守卫覆盖半径不足 → 跨实例同名别名会在启动期抛异常

AbstractRegistrum.java:426-445:

if (registry.containsKey(alias.getLeft()))  { warn;  continue; }   // 老名仍注册
if (!registry.containsKey(alias.getRight())) { debug; continue; }  // 新名未注册
if (registry.resolve(alias.getLeft()).equals(alias.getRight())) continue;   // ← 440
registry.addAlias(alias.getLeft(), alias.getRight());                       // ← 442

先给已有的 440 行守卫记一功:它与 NeoForge 1.21.8 BaseMappedRegistry#addAlias 第 72-73 行
if (resolve(from).equals(to)) throw new IllegalStateException("Infinite alias loop detected…") 的判据逐字相同,精确抵消了该异常路径,第 67-71 行的「同名同目标重复」也因此不可能触发。

但它挡不住「同名、不同目标」的跨实例冲突(本库去重只查自己的 aliases multimap,是实例字段):

  1. 另一个 AbstractRegistrum 实例(同整合包里另一个模组,或同一模组的第二个 Registrum)已把同一老名指向别的目标;
  2. 本实例执行到此处时:containsKey(老名)=false(老名已不注册)、containsKey(新名)=true、resolve(老名) 返回别人的目标 ≠ 新名 ⇒ 三道守卫全部放行;
  3. registry.addAlias(老名, 新名) 命中 BaseMappedRegistry.java:67-70 的 aliases.containsKey(from) && !old.equals(to) 分支 ⇒ 抛 IllegalStateException("Duplicate alias with key \"…\" attempting to map to \"…\", found existing mapping \"…\"");
  4. 该异常从 LOWEST priority 的 onRegisterLate 抛出 ⇒ 注册事件失败,是启动期崩溃而非静默降级。

修法(一行护栏,插在 440 行之前):

ResourceLocation resolved = registry.resolve(alias.getLeft());
if (resolved.equals(alias.getRight())) continue;
if (!resolved.equals(alias.getLeft())) {   // 已被别人指到别处
    log.warn(DebugMarkers.REGISTER, "Ignoring alias {} -> {}: already aliased to {}", alias.getLeft(), alias.getRight(), resolved);
    continue;
}
registry.addAlias(alias.getLeft(), alias.getRight());

定级说明: 这段守卫逐行搬自上游 PR #128,不是本 PR 原创缺陷;但本分支是首次引入该代码,建议合并前一并修(或至少登记 issue),并同步回上游 #128/26.1 线。


💡 建议(非阻塞)

  1. PORTING_1_21_1_TO_1_21_8.md 未随新模块更新 — 逐模块对照表无 Math 行;发布章节仍写「聚合 JAR 包含 18 个模块」,而 settings.gradle 的 include 'module.*' 已从 base 的 21 条变 22 条(功能模块 18 → 19)。建议补一行 + 改计数。
  2. .gitignore 把 *.log 放宽为 *.log* 并删掉末行显式 *.log.gz — 会连带忽略 *.log.txt/*.log.bak;若目的只是覆盖 .log.gz,收窄成 *.log.gz 更精确。属源端口带来的既成改动,可保留。
  3. Builder 接口新增抽象方法 aliasFrom(ResourceLocation...)(builders/Builder.java:215)——对直接实现 Builder 而不继承 AbstractBuilder 的外部下游是源码/二进制不兼容(升级即编译失败)。仓库内 21 个构建器全部 extends AbstractBuilder,CI 不受影响;若该接口被视为对外 API,可考虑给 default 实现(抛 UnsupportedOperationException)。
  4. 别名 API 零测试 — module.registrum 没有 src/test,git grep -rn "aliasFrom\|addAlias" rvhead129b -- module.registrum/src/test module.test 为空;上游 Add alias api for Registrum 向Registrum加入别名API #128 也没带。见下方测试建议。

🟢 看起来不错(本轮重跑全部扫描的结论)

  • 移植保真度(三棵树对账): module.math 文件集与源 dev/26.1 的 37 个文件一一对应,comm -23/-13 双向为空 → 无漏搬、无多搬;10 处差异全部可解释为版本适配(改名 + util 坐标 + 注释版本号)。
  • 反向 API 残留 = 0: 加行中 Identifier / org.jspecify 之外的空值注解残留 / ResourceHandler / Capabilities.Fluid|Item / @OnlyIn 在排除 Javadoc 与注释行后命中为空(未过滤时 Identifier 20 命中、jspecify 13 命中等全部落在注释/文档行)。
  • 零回归面: 全 PR 仅 2 行删除,且都在 .gitignore;其余全是新增文件 + 纯插入。
  • 接线齐套: settings.gradle 两处(include + 项目改名 anvillib-math-neoforge-1.21.8)、.github/modules.json math→needs ["util"]、module.main/build.gradle 的 NOT_DEV/本地两分支均已补;gradle.properties mod_id=anvillib_math 与 CI 矩阵派生值一致;module.math 无 interface_injections.json,故 module.main 不声明 interfaceInjectionData 是正确的。
  • 依赖图脚本: check_module_deps.py → 「every cross-module import is inside the declared (transitive) dependency set」✅;check_project_imports.py 1093 条 import 仅 6 条未解析,全部是 Outer.Inner 嵌套类假阳性。
  • 无 ghost 文件(重建 headers 后检测为空,48/48),无 EOF 缺换行,无 TODO/FIXME/凭据,无新增 static 可变集合。
  • 别名派生条目逻辑逐条核对通过(这轮我按 §6s-3 重新推演了时序,不是照抄上轮结论):
    • FluidBuilder.register() 先 block().register()/bucket().register()(置 blockCreated/bucketCreated)→ 再 super.register()(才解析 aliasedFrom)⇒ 顺序正确,不会静默漏别名;registerType=false(外部传入 fluidType)时正确跳过 FLUID_TYPES 别名。
    • 派生名映射与注册名逐一吻合:oldName.withPrefix("flowing_") → getEntryId()(构造器把名字前缀成 flowing_,getName() 即其名)、oldName → modid:sourceName(源流体/流体类型/流体方块同用 sourceName)、oldName.withSuffix("_bucket") → newName.withSuffix("_bucket")(桶用 bucketName = name + "_bucket")。
    • BlockBuilder.item()(无参)委托到带标志的 item(NonNullBiFunction),simpleBlockEntity() 委托到 blockEntity(...) ⇒ 两个便捷入口都会被置位,未漏。
    • Registries / NeoForgeRegistries / ArrayListMultimap / Pair 等 import 均已就位。
  • 缓存生命周期与 dist 隔离处理得当: LibCacheReloadHandler(ServerStartedEvent 覆盖首轮加载 + OnDatapackSyncEvent 仅在 getPlayer()==null 时清,避免玩家进服白清)与 LibClientCacheHandler(@EventBusSubscriber(value = Dist.CLIENT) 包住客户端专属事件,专服不加载)——正对「弱键被值侧 Holder.Reference.owner 钉住、重载后永久留旧注册表」的泄漏;CACHE_CAPACITY=512 兜底无界增长。

⏳ CI 说明(重要)

本 head 57e4d91d 的 check-runs 仍在进行中(build-l0 (codec/collision/config/cube/…) 全部 in_progress,math/registrum 的矩阵作业尚未出现)。
按 §6s-5 纪律,本轮不以 CI 作为证据,上表全部结论来自静态核对:本地具名 refs 三方对账(rvhead129b/rvbase1218b/rv261x2/rvsrc1211b)+ NeoForge 1.21.8 分支源码(BaseMappedRegistry.java 逐行)+ pulls/122 元数据。上一轮的 build-l2 (math)/build-l2 (registrum) ✅ 不再作为本轮依据。


📋 声称验证表

声称 状态 证据
port math lib to 1.21.8 ✅ module.math 37 文件(与源 37/37 对齐)+ 四处接线;Identifier 残留 0
port Registrum alias API 到 1.21.8 ⚠️ 5 文件加行与源 #128 一致;但存在跨实例守卫缺口(见 ⚠️)
「Cherry-pick of 7285ae1 (#122) … ResourceLocation instead of Identifier」 ⚠️ 改名本身 ✅;7285ae13 确在 dev/1.21.1(#122 merge commit),而内容与 dev/26.1 近乎逐字一致 → 源码引用与内容不一致
隐含:#128 的 EntityBuilder.java 段 ✅ 正当省略 dev/1.21.8 的 EntityBuilder 无 spawnEgg(...),派生 _spawn_egg 条目在本分支不存在
新 commit「export util to consumers」 ✅ jarJar(api project(...)),且 IFunction.Type extends util.ISerializer 的公开 API 面确实透出 util
新 commit「correct version comments」 ✅ module.math 内 26.1 命中 0

结论: COMMENT(不建议阻塞,但建议修 ⚠️ 后再合) — 上一轮 ⚠️1/⚠️2 与 💡4 均已如实修复且可复核;移植保真度、接线、无残留三项本轮重跑全部通过,变更面仍然零回归。剩余阻塞项只有一个:别名冲突守卫的跨实例缺口(继承自上游 #128,但本分支首次引入,且后果是启动期抛异常而非降级);另有 ⚠️3(commit/PR 描述的来源写实)与 4 条 💡(PORTING 文档计数、.gitignore、Builder 接口兼容性、零测试)。请等本 head CI 跑完再合并(mergeable_state: unstable)。

🧪 测试建议

被测目标 推荐测试场景 优先级
AbstractRegistrum#applyAliases ①老名仍注册→忽略并 warn;②新名未注册→忽略;③resolve(old)==new→跳过不重复 addAlias;④跨实例同名不同目标→当前放行且 NeoForge 抛 IllegalStateException(复现 ⚠️,修后应为 warn+跳过) 🔴
FluidBuilder#addAliases flowing_ 前缀 / 源流体 / FLUID_TYPES / 方块 / 桶五条派生名是否与实际注册名一一对应;registerType=false 与 noBlock()/noBucket() 时是否正确跳过 🟡
BlockBuilder#addAliases item() 无参、simpleBlockEntity() 便捷入口是否同样置位并别名 ITEM/BLOCK_ENTITY_TYPE 🟡
MathTestBootstrap#registerFunction 同名重复注册经 bindValue 改绑后 registry.get(key).value() 为新函数且注册表内无重复条目(该 workaround 已核实为必要) 🟢

关于 PR 标题: gh auth status 显示 /opt/data/home/.config/gh/hosts.yml 的 token invalid(退出码仍为 0,但文本明确失败),按约定未自动修改。建议标题:Port Math lib and Registrum alias API to 1.21.8 移植数学库与 Registrum 别名 API 到 1.21.8(仅大小写规范化,语义无变化)。


由 Hermes Agent 审查

@Gugle2308

Copy link
Copy Markdown

💾 Self-improvement review: Patched SKILL.md in skill 'reverse-port-pr-review' (1 replacement). · Patched references/registry-alias-api-and-rename-migration.md in skill 'reverse-port-pr-review' (1 replacement).

@Gugle2308

Copy link
Copy Markdown

🌿 Roseau API Breaking Change Report

Module Status Breaking Changes
codec ⚪ Skipped —
collision ⚪ Skipped —
cube ⚪ Skipped —
config ⚪ Skipped —
integration ⚪ Skipped —
moveable-entity-block ⚪ Skipped —
network ⚪ Skipped —
rendering ⚪ Skipped —
space-select ⚪ Skipped —
font ⚪ Skipped —
util ⚪ Skipped —
explosion ⚪ Skipped —
rpc ⚪ Skipped —
math ⚪ Skipped —
multiblock ⚪ Skipped —
recipe ⚪ Skipped —
registrum ⚪ Skipped —
sync ⚪ Skipped —
wheel ⚪ Skipped —
main ⚪ Skipped —

Full CSVs: see the Artifacts section of this workflow run.

@WhereisFff
WhereisFff merged commit 6143579 into Anvil-Dev:dev/1.21.8 Sep 28, 2026
31 of 37 checks passed
@Gugle2308

Copy link
Copy Markdown

PR #129 已合并关闭(state: closed, merged: true, merged_at: 2026-09-28T01:32:35Z)。

按 webhook 审查约束第 1 条:action 为 closed → 停止,不发布任何评论。

未下载 diff、未做代码分析、未修改标题、未发表评论。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants