Repository navigation
SCAPI Skyline Project v0.1.149
SCAPI Skyline Project v0.1.149
[v0.1.149] - 2026-09-29
第一百五十三版:按审计裁定落地修法 A(默认打开) —— 掐断"坏档 + 编辑 ⇒ 地形被固化丢失"这条路径。
相对 v0.1.148 的变更:
1. 修法 A 改为默认生效
审计(to-cc/…081600Z-0001、…082034Z-0001)裁定:缺陷成立、定级 P1、修法选 A
("非 IO 异常也 return false";B 的先清零被裁定为冗余,因为 GenerateTerrain 会无条件重写每格)。
⇒ skyline.CorruptChunkRegenerate 默认翻成 true(保留开关只为 A/B 对照与一键回滚)。
2. 同批完成审计点名的三条配套
- 跨会话留痕(P3):非 IO 坏档失败额外写一行
Log.Warning(坐标 + 异常类型 + 是否被当成已加载),
因为账本是内存态、重启会清零; - 门禁升级为回归约束(P3):
chunk-load-ledger现在断言acceptedAfterFailure == 0
(修法 A 生效后该计数不得再增长); - 注入可指定目标区块(验收可靠性):
skyline.ChunkReadFailureTargetCx/Cz(默认任意),
否则"下一次 LoadChunkData"可能落在玩家附近的别的区块上、让实验不可判定(v0.1.149 第一版脚本就吃了这个亏)。
3. 验收(heightlab/skyline-v0149-corrupt-a-acceptance.py,审计的四条口径)
| 口径 | 实测 |
|---|---|
① 注入后 nonIoFailures +1、acceptedAfterFailure +0;受害区块走生成路径且与邻居同量级 |
✅ nonIo +1 / accepted +0;受害区块 nonAir 281,860 vs 邻居 283,714(比值 0.993) |
| ② 注入 → 编辑 → 保存 → 重开不断崖 | ✅ 280,411 → 280,411(保留率 1.000;对照:修法前 281,844 → 1) |
| ③ 坏档不被回写 | 59d766e324f17f5d);但 "Region 文件 mtime 不变"这条代理判据 FAIL(+2.02 s)——见下 |
④ catch (IOException) 分支不回归 |
代码级核对:该分支未改动(仍为弹窗 + DisposeProject + return false);未做行为注入(会关掉世界) |
关于 ③ 的代理判据(如实报告 + 已请审计裁定):区域文件是 16×16=256 个区块共用一个,
所以"文件 mtime 变新"不能证明受害区块被写回——它可能来自同文件的别的区块。
而字节级判据通过了(一次干净重开仍读到原档内容)⇒ 受害区块的原始数据没有被覆盖。
⇒ 我请 CC 裁定:把"字节级(指纹)"作为权威判据、"mtime"降为仪器,或给出更精确的区块级判据。
如实边界
- 修法 A 的语义:坏档区块会被重新生成(地形与原档不同但自洽);原档数据本身已损坏,
修法只是阻止"空内容被写回、原地形被抹掉"。 catch (IOException)那条重分支(弹窗 + 关世界)没有做行为注入测试(会中断会话)。
相对 v0.1.148:按 CC 裁定落地修法 A(skyline.CorruptChunkRegenerate 默认翻成 true ⇒ 非 IO 坏档异常也 return false、该区块按同一坐标重新生成);同批完成三条配套(非 IO 失败写一行日志留痕、门禁断言 acceptedAfterFailure==0、注入可指定目标区块)。审计四条口径实测:①nonIo +1 且 accepted +0、受害区块 nonAir 281,860 vs 邻居 283,714(比值 0.993)②**注入→编辑→保存→重开 280,411 → 280,411(保留率 1.000;修复前 281,844 → 1)**③字节级证据通过(干净重开后指纹=基线),但『Region mtime 不变』这条代理判据 FAIL(一个区域文件 256 区块共用,mtime 不能证明受害区块被写回)⇒ 已请 CC 裁定代理判据④IOException 分支未改动。README 9952 字符。