31 lines
2.8 KiB
Markdown
31 lines
2.8 KiB
Markdown
# 阶段4A限定代码自审
|
||
|
||
日期:2026-09-23。主会话实施后自审;不能替代用户指定外部AI复核。
|
||
|
||
## 结论
|
||
|
||
本轮限定范围自审未发现待修复P1/P2;代码、18组合成测试、既有回归及Unity编译已完成,交付外部实施复核。4B尚未启动。
|
||
|
||
## 逐项检查
|
||
|
||
- Owner读接口:复用操作租约及现有State,未开第二份缓存;Ready合并视图复制成独立ReadOnlyDictionary。失败Data=null。读后与NotReady异常分支再核归属,StaleOrClosing优先。归属回调可能重入Close,最终条件先调用归属检查再检查closing,A8专门验证不能在Close后发布快照。
|
||
- 固定句柄:保存唯一Slot/Owner,不查询“当前账号”;注销、换Cookie、epoch变化、桥接Close均使旧句柄失效。Update/Delete/Flush仍保留3B语义;Wait不会借新账号票据。
|
||
- 串行生命周期:tail链记录每项真实完成;同一桥接至多一个Owner。新Open先关闭旧Owner;Close同步撤销当前槽并使此前排队Open失效;后来的Open排在Close之后。
|
||
- 排队取消:仅立即完成该请求的失败结果,内部排队项仍等前一收尾再退出,不提前释放tail。已经进入Create的取消等待真实Create/失败Close结束。
|
||
- 异常保守处理:正常Create失败才清空槽位;异常Create或Close失败保留Slot、Creation/Closing任务、已得到的Owner,后续Open返回CloseFailed。不会把文件锁未释放伪装成可重开。
|
||
- CTS竞争:独立锁串行取消和释放;不持有bridge gate执行取消回调。关闭中的引用保留到实际完成。
|
||
- 生产默认传输:固定CookieContainer、UseCookies=true、AllowAutoRedirect=false;任意Handler注入仅internal供合成测试,无公共替身入口。
|
||
- 边界:Owner去除新增读取方法及辅助后重算hash与原版完全一致;三个csproj按原换行各仅加一行Compile;原测试Program及其他基线生产文件hash不变。
|
||
|
||
## 测试发现与已修正项
|
||
|
||
1. 首轮测试宿主未使用的FailWrite字段警告:增加Unknown票据语义用例后消除。
|
||
2. 只读最终校验中回调重入Close:采用先核归属、后查closing的顺序,并实际验证Close等待读租约、读返回StaleOrClosing。
|
||
3. 初始Create收尾可能与桥接取消同时发生:同步CTS Cancel/Dispose,保留取消失败以阻塞不确定重开。
|
||
4. 项目引用插入最初出现混合换行;已按原文件换行重建插入,三份差异校验全部只有一行新增,无语义改变。
|
||
|
||
## 尚未包含
|
||
|
||
游戏初始化、存档后端切换、消费路径、PlayFab删除、真机与最终包;Close失败后的人工恢复也不在4A。isCurrent应是轻量归属判定,调用方不可同步等待自己的Close形成循环依赖。保守CloseFailed不自动解锁。
|
||
|
||
完整运行和hash见《阶段4A交付与验收矩阵-2026-09-23.md》。 |