Skip to content

SCAPI Skyline Project v0.1.151

Choose a tag to compare

@DionysusDWI DionysusDWI released this 29 Sep 08:57
· 24 commits to main since this release

SCAPI Skyline Project v0.1.151


[v0.1.151] - 2026-09-29

第一百五十五版:把"坏档是否被写回"从代理判据升级为区块级判据(按审计 …084056Z-0001#2 的裁定)。
相对 v0.1.150 的变更:

1. 区块级写回计数 corruptChunksSaved

TerrainSerializer23:读盘失败(非 IO)时把该区块坐标记进一个有界集合;SaveChunkData 真写它时计数 +1
并写一行 Log.Warning。账本 skyline.ChunkLoadFailures() 新增两个字段:
corruptChunksSaved(0 = 坏档没有被写回)与 corruptChunksKnown。

为什么需要:审计指出 Region 文件是 16×16 = 256 个区块共用,
所以"文件 mtime 变新"不能证明受害区块被写回(同文件里别的区块也会写)⇒ mtime 降为遥测、
区块级计数成为权威判据。

2. 溯源探针 skyline.ChunkLoadedFromDisk(cx,cz)

记录"该区块本轮成功从存档读出过"(有界集合),供"注入后邻块不受影响"的判据过滤
那些其实是被重新生成的邻块。

3. 终轮实测(heightlab/skyline-v0149-corrupt-a-acceptance.py,工件与数字同轮)

判据 实测 判定
计数 nonIoFailures +1、acceptedAfterFailure +0 ✅
重生成区块与邻居同量级 279,040 vs 279,040(比值 1.000) ✅
坏档不被写回(区块级) corruptChunksSaved 增量 0 ✅
干净重开仍是原档 受害区块高度指纹两遍一致(c2563abb457e3b25) ✅
注入 → 编辑 → 保存 → 重开不断崖 278,462 → 278,464(保留率 1.000) ✅
注入后邻块不受影响 4 个邻块里 1 个高度指纹变了 ❌ 见下

关于最后一条(如实归因,不是修法/并行引入的缺陷):SaveChunk 的门卫是
ModificationCounter > 0 ⇒ "刚生成、没人改过"的区块不会落盘,所以本实验的第二轮其实是再次生成
而非读盘;而生成结果会受"邻居当时在不在场"影响(Terrain.SetCellValueFast 对未分配邻居静默丢弃,
notes/247 §2(e))⇒ 跨轮比较两个"都可能被重新生成"的区块会假 FAIL。
下一轮改法(已设计):把该判据改成同一轮次内的前后对比(不插入"释放 + 重新预加载")。

如实边界

  • 本版只加计数与探针,不改任何行为默认值。
  • crit5 这次是红的(1/4 邻块),已在 notes/262 写明归因与改法,不掩饰。

相对 v0.1.150:按审计裁定把『坏档是否被写回』从 Region mtime 代理升级为区块级判据——TerrainSerializer23 记住读盘失败的区块,SaveChunkData 真写它时计数 corruptChunksSaved 并写日志(账本新增 corruptChunksSaved/corruptChunksKnown);另加溯源探针 skyline.ChunkLoadedFromDisk。终轮 6/7:nonIo+1/accepted+0、重生成区块与邻居同量级(279,040 vs 279,040)、区块级写回增量 0、干净重开指纹=基线、编辑后 278,462→278,464(保留率 1.000);唯一红的 crit5(4 邻块中 1 个指纹变)已归因:未修改的新生成区块不落盘 ⇒ 两轮都是重生成、且生成受邻居在场影响(notes/262 写明同轮次改法)。README 9992 字符。