Files
ft/CodexOutput/upserver/P2AlphaTargetCheck/C0-目标状态核验最小方案-待评审.md

109 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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. 输入、输出及禁止项
既有输入:
1. `KVGameplayLoopTests/pf-source-backups/20260924T041802Z/101.json`:55键,原来源PlayFab/title108EE8/customId101,原文件SHA256=`E6EB3E656B62A3535FDB8F0DC517321A4C3E32F3A8D95385A2B7D5C0AA8222EF`。
2. 同目录102.json:45键,SHA256=`827F36084648449CEFAFB96B3CE62093DF70B8A87E33A526DA5B03A9C135A377`。仅历史参照,不能覆盖KV102。
3. `KVGameplayLoopTests/backups/20260928T025514Z/101.json`及102.json:前者当时0键,后者45键且已包含4C2新进度。均不是下一次写前备份。
4. 现有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:准备,尚未请求正式数据
1. 核源码/依赖基线。执行经审查的现有csproj构建:`dotnet build CodexOutput/upserver/KVGameplayLoopTests/Preflight/Preflight.csproj --no-restore -o CodexOutput/upserver/P2AlphaTargetCheck/C1-bin`。新目录须不存在;记录构建退出码、编译输入及最终DLL/依赖hash。不能用旧bin中身份不明DLL;不能跑`dotnet run`隐式重建。缺依赖/编译错误即停,不顺手修源码或自动联网restore。
2. 使用Unity CLI Loop固定`unity-state.cs.txt`读取当前状态,要求工程路径正确、playing/enabled/ready=false、run=null、permit不存在;另用只读表达式确认`EditorApplication.isPlayingOrWillChangePlaymode/isCompiling/isUpdating`均false。若编辑器已关闭,记录无本项目Unity进程以及本地无permit;不为了快照强行启动/重启。已开启但CLI无法核验则停,不猜测空闲。
3. 冻结全部既有claimed文件路径及hash,包括子目录;记录客户端运行状态。发现游戏正在运行或活动许可,只报告,不能擅自Stop/退役许可/杀进程。
4. 此前已授权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命令或正式请求。正式迁移产品政策保持待确认,不需要在本次只读取证前先批准整套上线政策。