版本隔离守卫(新套件立即抓出两处真实回流)

## 修掉渲染联测的嵌套实例目录

`test_render_bridge.py` 把实例写成 `<store>/instances/test-mcfold`。
而权威口径(mcview/lib/versions.cjs:59/61)是:

    contentRoot = BASE/store/<key>       共享只读(jar/libraries/assets)
    instanceDir = BASE/instances/<name>  实例独占(mods/config/options/saves)

⇒ 那是「一个版本的内容根里长出了实例态」。而版本隔离要防的崩因正是
「多实例共用 mods」—— 内层目录会把它重新引回来,而那条路径看起来完全合法。
改为 `BASE/instances/test-mcfold`。

## 新增 tests/test_version_isolation.py(4 项,默认套件里跑)

★ 它**不需要 JVM**(纯路径断言),所以必须落在默认测试里 ——
放进 `--with-render` 才跑的套件等于没守卫(大多数人不会加那个参数)。

  ✓ 三层同级(store/ · instances/ · runtime/ 是 BASE 下的兄弟)
  ✓ 内容根干净(无 instances/ 嵌套、无 mods/config/options.txt/saves)
  ✓ 测试实例归位(落在 instances/ 层,不在任何内容根下)
  ✓ 内容根无实例配置(查内容,不只查存在)

## ★ 守卫首次运行就抓出第二处(我此前漏掉的)

```
  ✗ 内容根被实例化:
    - store/vanilla-1.21.1/instances/(内容根里嵌套了实例层)
```

内容是 `instances/default/{options.txt,downloads/log.json}`(生成态,
正式 `instances/default` 已存在)⇒ 已删。两个内容根现已干净。

⇒ 这条说明:**「我检查过了」不等于「有一条会自己跑的检查」** ——
  我上一轮手工核实过 1.20.1 那处并修掉,却没发现 1.21.1 那处;
  守卫一运行,两处一次全暴露。

## 验证

  ./run_tests.sh               → 66 项
  ./run_tests.sh --with-render → **80 项全绿**
This commit is contained in:
JianFeeeee
2026-09-26 07:23:54 +08:00
parent 8b1fc9289d
commit 330867c6df
2 changed files with 120 additions and 1 deletions

View File

@ -20,6 +20,14 @@ from mcfold.render import SECTION_VOLUME, WorldRenderer, parse_save_chunk
SAVE = Path("/home/mc-test/mc-test")
STORE = Path("/home/newqqagent/mcview/store/vanilla-1.20.1")
# ★ 实例目录是 store/ 的**兄弟**(不是嵌套在里面)。
# 权威口径:mcview/lib/versions.cjs:59/61
# contentRoot = BASE/store/<key> (共享只读:jar/libraries/assets)
# instanceDir = BASE/instances/<name>(实例独占:mods/config/options/saves)
# store 里再开一层 instances/ 会让「一个版本的内容根」多出实例态,
# 正是版本隔离要防的那种回流。
INSTANCES = Path("/home/newqqagent/mcview/instances")
TEST_INSTANCE = INSTANCES / "test-mcfold"
def _available() -> tuple[bool, str]:
@ -42,7 +50,7 @@ def _open_backend():
return None, why
br = Gen_1_20(
# ★ 用测试专用实例目录,不碰生产 default(版本隔离策略)
game_dir=str(STORE / "instances" / "test-mcfold"),
game_dir=str(TEST_INSTANCE),
assets=str(STORE / "assets"), asset_index="1.20.1",
)
try: