Files
ft/CodexOutput/upserver/P2AlphaNullCompatibility/B4-实施交付与验收.md

5.2 KiB
Raw Blame History

P2-α-B实施交付与验收

2026-09-28,主会话。B1~B4完成,待B5独立实施复核,尚未关闭本兼容单元。 原101/102本地样本均Valid,未导入或真实启用101。

实际改动与原因

仅原白名单4个生产文件,文本diff合计新增18行、删除5行(含替换与注释),没有新生产文件或通用框架:

文件 改动
PlayerKVSaveSchema.cs M15仅四种JSON空白包裹null→既有StrictJsonSyntax验证原文→ExplicitNull;其余原Object(Json)。M22仅允许存在selections属性的JSON null
PlayerKVDecodedSave.cs M15内部IsExplicitNull/工厂及非法组合检查、说明不参与服务器序列化;M22 null保留、非null仍复制为只读列表
FishingChallengeManager.cs Replace的一个条件扩展,显式null物化为业务null;活动/场景/计分/保存/Reset逻辑不改
BargainPackData.cs Replace的一个列表赋值兼容null;其他14字段、存在标记、Snapshot调用与Reset不改

共用Json与StrictJsonSyntax实现、DecodedSave的Raw复制保持原文。7文件前态在before;每文件diff及B2-source-diff-summary.json、B4-scope-verification.json可复核。其他待解决模块/生命周期问题没有顺带改动。

测试只改3个已批准文件:ActivitySchemaTests、D3SchemaTests、原EditorValidationHost。Bargain专用Same新增列表null比较分支,通用SameList不动;固定case内读取实际私有_data值验证原SaveData序列化形状及可变列表隔离,未调用SaveData、没有新增可传入任意目标的反射/CLI入口。

评审与首败保留

  • 原方案1277/1277基线一致,八项与三P3裁决批准。
  • 原方案遗漏Json拒根null的前置条件:B2先发现并停止生产编码,修订1补审接受,1301/1301基线一致,四项与两P3裁决后恢复;原文与两轮清单/报告不覆盖。
  • 红测:构建成功,旧生产代码下77组/1717断言,3组目标兼容断言失败;不是编译失败或apphost误用。原始B2-red-*全部保留。
  • 绿测:77组全部通过,1783断言;B2-green-*记录精确DLL hash/实际时间/run。未重跑无关收费玩法或奖励单元凑覆盖。

T1~T8验收

项 实际结果与证据
T1 M15 缺键/JSON null/对象旗标区别、含空白Raw逐UTF8字节保留、模块外键保留、输入不变/Raw拷贝独立;非法组合及C# null/字符串null/非JSON空白/注释/多token/注入等拒绝;共用Json("null")仍拒绝。B2-green-result.json
T2 M22 null/[]/非空列表与14字段保持、缺属性及错误元素拒绝、null不绕PackType、DTO非空深复制、Missing仍空集合。B2-green-result.json
T3 实际挑战对象 原M15-M26-M27固定case,63断言成功;fresh与已存在对象经Reset到空态,state0/ShouldOpen=false/null序列化,M26/M27回归;不启动Init或活动场景。B3-unity-activities.json
T4 实际礼包对象 原M21-M22-M24,146断言成功、restored=true、formalRequests=0;顺序替换null/[]/[7,9]、Snapshot字段比对、null比较不漏其他字段、实际数据序列化、集合拷贝与重置。B3-unity-bargain.json
T5 离线全量 77组/1783断言全部通过;包括原严格语法/其他Schema/事务与生命周期回归。B2-green-build.log、B2-green-tests.log
T6 完整事务与样本 原B2-20成功83断言、31真实模块/两epoch、sameObjects/restored=true;原固定Inspect下101 55键Valid/0诊断、102 45键Valid/0诊断,无第三问题。B3-unity-full-load.json、B3-source-inspection.json
T7 编译 Editor Success=true、ErrorCount=0、WarningCount=272(原始警告保留,不称零警告);SERVICE_HOST exit0、0错误/2警告,警告指向未改的UserService及Stubs。B3-unity-compile.json、B3-servicehost-*
T8 边界 4生产+3测试白名单,未发现范围外受审文件变化(共享状态更新除外);883项cfgData/Tables不变,原备份hash不变,Unity末次错误日志0,无Play/run/permit,11 claimed保留。B3-verification-summary.json、B3-final-unity-errors.json、B4-scope-verification.json

B2-20输出auth=2/gets=2是隔离模拟事务的认证/读取计数,不是正式网络请求;本轮未执行s101/PlayFab数据接口操作。Inspect仍是sourceOnly/syntheticDescriptor/usesLocalUtc,本地实际UTC窗口见B3-source-inspection-window.json。没有伪称真实认证、服务器时间或所有玩家兼容率。

样本与限制

样本 原SHA256 本次
PF101,55键 E6EB3E656B62A3535FDB8F0DC517321A4C3E32F3A8D95385A2B7D5C0AA8222EF 两类目标拒绝消失,Valid/0
PF102,45键 827F36084648449CEFAFB96B3CE62093DF70B8A87E33A526DA5B03A9C135A377 保持Valid/0,未重新导入

Valid仅指现有Schema范围和当前冻结配置下的解码。26种模块外键、5种未定位键、真实身份/权威源/并发与恢复政策、未验证挑战入口和热换号均保持既有边界。M15 null安全只涵盖获审受控加载前态,不推导任意场景可达安全。

当前4C2及P2-α-A保持关闭;本次B4交付之后交B5独立实施复核,主会话核hash逐条裁决后才关闭两类空态兼容单元。整体P2-α/G4与正式迁移政策没有关闭。未打包。