10 KiB
P2-α-C:迁移前目标状态核验最小方案
2026-09-28,主会话,版本1,待独立方案审查,未批准执行。
1. 目标与已有结论
101的旧PF本地样本经P2-α-B修复后已能解码,但这不能证明其目标KV现在仍为空,也不能批准真实迁移。本单元只取得一次新的目标快照,回答“101目标是否已有数据、102相对已关闭闭环的末次快照是否变化”,据此把后续写入方案的冲突条件写实。
P2-α-A/B、R1/4C1/4C2保持限定关闭。复用原样本、台账与兼容验收,不重新跑兼容测试,不再收费钓鱼,不重新导入102。整体P2-α仍开放。
设计开始前已核对B关闭增量清单18/18项SHA256及长度一致;之后共享状态更新属于本次设计增量,不能用旧清单要求共享文档永久不变。
2. 选择与最小范围
| 选择 | 代价及结论 |
|---|---|
复用现有--backup-101-102 |
本方案采用。零源码改动;固定读取两个已授权专用账号,102用于核对当前进度而非迁移源 |
| 新增只读取101的命令 | 可少一次登录/Get,但需新增分支、构建和验证;本轮不值得为两账号既有工具另造入口 |
| 直接导入101并试玩 | 缺来源权威、跨系统身份与停写窗口等条件,本轮不采用 |
现有工具并不证明完整迁移资格。交付结论必须为“目标快照已取得/核验受阻+未满足的迁移条件”,不得输出笼统的“迁移安全/可以上线”。
3. 精确执行入口与副作用
- 工作目录固定
C:/projects/ft;API固定http://s101.local:18080/。 - 仅执行
Preflight的--backup-101-102分支;顺序101、102,每账号各一次account/Login和playerdata/Get。两条都是HTTP POST,Get的含义是KV读取。 - 成功完整运行:2次登录、2次Get;KV Set/Delete=0、PF请求=0。失败时可能少于此数,按进程日志、已落文件和分支位置记录;不能把计划上限伪装为实测网络统计。请求已发送但响应丢失时记“不确定”,不声称零请求。
- 登录会产生服务器会话/可能更新登录元数据。服务端若账号不存在还可能创建账号:
NewlyCreated是在登录返回后检查,不是服务端禁止创建的前置保护。历史两账号已存在降低此风险但不能消除;一旦newCreate、登录失败或身份检查失败,工具抛错停止,不发该账号Get,不自动清理新账号、不自动重试。 S101AccountSession.PlayerId是客户端规范化请求ID,不能把相等判断说成服务端回显的身份绑定证明。工具虽校验internalId/服务时间/Cookie,但备份没有保存这些字段;本轮不补写、不推断其值。PlayerKVClient.GetAsync(null)读取全部字符串键值,拒绝重复属性/非字符串数据;无应用层重试,无重定向。未知键原值保留。- 现有可执行程序还有
--import-approved-102与--backup-pf-101-102分支;二者本轮均禁止调用。不修改Import102.cs、不删除或复用import-102.claimed。
4. 输入、输出及禁止项
既有输入:
KVGameplayLoopTests/pf-source-backups/20260924T041802Z/101.json:55键,原来源PlayFab/title108EE8/customId101,原文件SHA256=E6EB3E656B62A3535FDB8F0DC517321A4C3E32F3A8D95385A2B7D5C0AA8222EF。- 同目录102.json:45键,SHA256=
827F36084648449CEFAFB96B3CE62093DF70B8A87E33A526DA5B03A9C135A377。仅历史参照,不能覆盖KV102。 KVGameplayLoopTests/backups/20260928T025514Z/101.json及102.json:前者当时0键,后者45键且已包含4C2新进度。均不是下一次写前备份。- 现有A3台账、B5关闭裁决及剩余条件清单。不重新解码样本或重复5个未定位键的全库文本搜索。
新输出限定:
- 工具生成的唯一新
KVGameplayLoopTests/backups/<UTC>/下两账号原始JSON及summary;原档使用CreateNew,不覆盖。调用前确认预计秒级目录未存在;若碰撞或写盘失败停止,保留部分输出,不换参数重跑。 - 本目录下C1构建/入口核验日志、C2运行stdout/stderr/退出码/状态、C3逐键差异摘要与条件表、C4交付和独立执行复核提示词及SHA256清单。
- 入口、开发状态、TODO、开发日志、todoItem按检查点同步;构建产生的Preflight obj及本目录独立输出目录属于编译产物,不是生产源码变更。
不修改任何C#、配置、场景、预制体、原备份、存档;不创建/移除permit与claimed;不Play、Apply、Open游戏会话、扣费、领奖、打包。没有KV写入,因此本单元不设计或执行回滚/恢复;发现异常只保留证据停止。
5. 检查点0—4
C0:完整审查及主会话裁决
独立AI只读方案及受审文件,报告落本目录C0-独立方案审查.md。主会话先核review-hashes.json全部路径/长度/hash,再逐条裁决,落C1-审查裁决与执行批准.md。P1/P2未解决、范围变化或基线漂移不能直接执行。A/B不因此重新复审。
C1:准备,尚未请求正式数据
- 核源码/依赖基线。执行经审查的现有csproj构建:
dotnet build CodexOutput/upserver/KVGameplayLoopTests/Preflight/Preflight.csproj --no-restore -o CodexOutput/upserver/P2AlphaTargetCheck/C1-bin。新目录须不存在;记录构建退出码、编译输入及最终DLL/依赖hash。不能用旧bin中身份不明DLL;不能跑dotnet run隐式重建。缺依赖/编译错误即停,不顺手修源码或自动联网restore。 - 使用Unity CLI Loop固定
unity-state.cs.txt读取当前状态,要求工程路径正确、playing/enabled/ready=false、run=null、permit不存在;另用只读表达式确认EditorApplication.isPlayingOrWillChangePlaymode/isCompiling/isUpdating均false。若编辑器已关闭,记录无本项目Unity进程以及本地无permit;不为了快照强行启动/重启。已开启但CLI无法核验则停,不猜测空闲。 - 冻结全部既有claimed文件路径及hash,包括子目录;记录客户端运行状态。发现游戏正在运行或活动许可,只报告,不能擅自Stop/退役许可/杀进程。
- 此前已授权101/102作为专用测试账号;本次完整审查裁决通过即在此范围运行,不再要求重复确认已授予的读取权限。其他设备是否使用这些账号无法从本地证明,故任何快照只能代表该次响应,不能构成排他停写窗口。
C2:一次采集
从仓库根目录运行dotnet CodexOutput/upserver/P2AlphaTargetCheck/C1-bin/Preflight.dll --backup-101-102一次,保存完整输出、退出码、起止本地UTC及生成目录。失败保留已生成内容,不循环、不再次登录来“补齐成功”。不得把101成功而102失败当两账号采集完成。
采集后再次只读核Unity状态及permit/claimed。若期间出现运行或许可变化,标记环境条件未满足,停止后续迁移判断;不自行撤销别人的操作。任何错误、newCreate或无法判定请求状态,均形成明确失败交付,不回退/补发/恢复。
C3:离线对账与前置条件表
核新JSON与summary的账号/API、SHA256、键数、主档存在性一致。时间字段at是工具本地UTC,不是服务器时间;两账号是先后读取,不是跨账号原子快照。
逐键比较新旧KV快照:键名集合按Ordinal区分大小写,字符串用原样UTF8 SHA256及字节长度比较(含新增/删除/改变);不对字符串内JSON重排或转日期。摘要默认只输出键名/hash/长度,不输出整档。101分为“目标为空/目标非空/读取失败”,102列相对末次闭环样本的差异;发现变化不擅自归因、不还原。
后续条件表至少包含:
| 条件 | 本轮能确定什么 | 仍需什么 |
|---|---|---|
| 101目标占用 | 本次Get返回空/非空 | 真正写入前必须重新读取;非空禁止旧PF覆盖或自动合并 |
| PF来源 | 历史备份来源标签、时间、原文件hash | 不能证明当前PF仍相同;产品确认一次性历史快照权威,或另审新鲜源采集 |
| 身份映射 | 历史customId与本次请求playerId都是101 | 不等于跨系统同一人/同一账户的服务端证明;实际导入前需明确映射依据与批准 |
| 兼容性 | 复用B已关闭两样本Valid | 26模块外键、Present缺口与业务消费者仍未全覆盖 |
| 时间与并发 | 本地采集时刻及本地客户端空闲 | 服务器时间、跨设备独占停写窗口未证明;本单元不引入CAS框架 |
| 失败与恢复 | 本轮零KV写、异常保留证据停止 | 真实写入前另审Unknown观察/人工恢复边界,不整档回滚已有进度 |
C4:有限交付,停在执行复核
落盘全部证据及限制,更新五份共享状态,冻结交付清单并输出独立执行复核提示词。不得因101为空自动接到导入;下一步仍是依据新证据形成单账号写入方案及产品决策。执行复核后主会话逐条裁决关闭的只会是本次目标核验,不是整体P2-α。
6. 验收矩阵
| 项 | 判据 |
|---|---|
| T1 边界 | 无源码/配置修改;禁止分支未调用;正式地址唯一;无Play/存档写/打包 |
| T2 可追溯 | 受审hash裁决、构建结果、实跑DLL/依赖hash、精确参数及退出码齐全 |
| T3 请求口径 | 成功上限2登录+2Get,KV Set/Delete及PF为0;失败如实记未知,不把登录称绝对无副作用 |
| T4 数据完整 | 两份新快照与summary一致;原备份不变,未知键保留;失败部分数据不冒充完成 |
| T5 差异有效 | 原始字符串逐键比对,明确102已有进度不可被旧PF覆盖;无变化也只是该次观察 |
| T6 运行状态 | 前后空闲/无permit、claimed全部保持,未擅自改变运行状态 |
| T7 结论限度 | 身份/权威源/并发/时间/业务覆盖缺口明确;101空目标不等于准许导入 |
纯复用执行无需新增镜像测试或重跑既有77组;构建及本次实际读取的完整性检查是适当验证。失败同样应交付事实和阻塞项,但不得将T2—T6未通过标成验收通过。
7. 作者自审与停止位置
已逐行检查Program/AccountSession/PlayerKVClient和Editor State入口,补足两账号固定读取、登录可创建副作用、PlayerId非服务端回显、备份未记录服务器时间/身份详情、两次Get非原子快照、目录碰撞、失败不重试等限制。选择现成工具以保持零代码变更。
当前止于C0独立方案审查。没有执行本方案的构建、Unity命令或正式请求。正式迁移产品政策保持待确认,不需要在本次只读取证前先批准整套上线政策。