"""Record completed R1 repair checkpoint; no game/server mutations.""" import hashlib import json from pathlib import Path root = Path(__file__).resolve().parents[3] docs = root / "CodexOutput/upserver" evidence = docs / "KVGameplayLoopTests" title = "## 当前有效状态:R1正式关闭,两处运行报错修复并验证(2026-09-24)" status = """[独立实施复核](阶段4最小真实玩法闭环R1实施独立复核-2026-09-24.md)的210项基线一致,五项回答及P2-1/P3-1/P3-2已逐条裁决;见[修复验收与关闭裁决](阶段4R1报错修复验收与关闭裁决-2026-09-24.md)。 - [x] 建筑缺键默认恢复为字符串0;原getter正常读取,不新增服务器键。 - [x] Editor KV测试模式正常退出不再自动重进;排水Ready后自动停止Play,保留claimed。普通退出行为保持。 - [x] 4B2全量75组、B3A全量13组、真实QuitAct条件测试、Unity M01/B2-20/装备链及许可均通过;编译0错误。 - [x] 新Unity101820真实登录102,建筑数据/等级0、装备30003与主要货币一致,正常退出自动结束Play,无原两类错误。 - [x] 前后只读对账:101仍空、102原45键逐值完全相同;许可归档,三个claimed保留,Unity已正常退出。 - [x] R1最小单账号真实存档闭环关闭;不必再重复上一轮R1实施复核。 - [ ] 整体4B3/G4、完整B/C热换号、4C、P2-α存量档专项、身份/外围及最终包仍未完成;下一步先依当前“最小改动、先跑起来”目标收敛后续范围,完整方案评审后编码。 本轮生产修复只有Schema一个默认值及QuitAct一个Editor模式分支。建筑修订有独立批准,退出补充由主会话编码前完整评审,二者审批来源有区别。签到关闭回调测试辅助边界保留。退出CLI await超时和一次不支持命令的工具错误已如实记录;闭环成功依赖独立事件/状态/对账证据,不把工具异常抹去。 固定http://s101.local:18080/;Unity CLI Loop、不用UnitySkills、未打包。无活动permit,102禁止重复导入,下次运行必须新进程。 """ for name in ("接手入口.md", "开发状态.md", "TODO.md"): path = docs / name text = path.read_text(encoding="utf-8-sig") if title not in text: header, rest = text.split("\n", 1) path.write_text(header + "\n\n" + title + "\n\n" + status + "\n### 以下为历史快照(当前以本节为准)\n" + rest, encoding="utf-8") checkpoint = """ ### 2026-09-24 R1报错修复检查点3及关闭 - 新进程101820_639258292892095408真实102登录成功,缺键建筑及等级均0;装备/等级/主要货币保持。登录与正常退出阶段原两类异常均未出现。 - 正常QuitStage于06:51:45Z closed,Registry Ready后自动停止Play;没有手动Stop。06:53:55只读Hierarchy确认editor状态。三个claimed保留、permit归档,最后CLI正常退出Unity。 - 前后backups/20260924T064749Z至20260924T065309Z:101空,102原45字符串全相同,不新增建筑key。本轮自然同值写1次,不能当作HTTP计数。 - 工具限制:退出脚本跨Play停止的await未返回并180秒超时;误用Editor未注册的get-project-info产生单独工具错误。完整证据保存、未清Console。关闭成功由事件、Ready日志、非运行Hierarchy及对账证明。 - 独立复核P2-1/P3-1/P3-2处理完成,R1正式关闭;签到关闭回调辅助边界仍披露,完整4B3/G4等未完成。详见《阶段4R1报错修复验收与关闭裁决-2026-09-24.md》。 """ for name in ("开发日志.md", "阶段4最小真实玩法闭环实施记录-2026-09-24.md", "阶段4R1报错修复裁决与最小实施方案-2026-09-24.md"): path = docs / name text = path.read_text(encoding="utf-8-sig") if "### 2026-09-24 R1报错修复检查点3及关闭" not in text: path.write_text(text.rstrip() + "\n" + checkpoint, encoding="utf-8") path = docs / "阶段4B3当前TodoItem-2026-09-24.json" data = json.loads(path.read_text(encoding="utf-8-sig")) data.update(phase="R1-closed-two-runtime-defects-fixed-and-verified", R1Closed=True, nextResponsibleSide="main-session-next-scope-design-before-code", newProcessId=101820, implementationScope="R1 closed; two minimal runtime repairs verified, overall 4B3/G4 incomplete", runtimeLocalWriteAttempts=7, formalRequestDetail="原工具成功请求累计16;本次前后只读备份各4,共新增8。运行时HTTP次数未知,本轮本地同值写尝试1。") updates = { "R1-C1-C2": "最小接线与两处修复完成,相关全量/Unity回归通过;受审基线核对及逐项裁决已落盘", "R1-C3": "真实UI装备/票据/服务器对账/新进程恢复通过;补充真实登录无建筑NRE、正常退出自动停止Play;辅助边界保留", "R1-building-default": "独立批准的一默认值修复,75组/真实M01/102登录通过,服务器不新增key", } for item in data["todoItem"]: if item["id"] in updates: item.update(status="closed", detail=updates[item["id"]]) for item in [ {"id":"R1-exit-reentry", "status":"closed", "detail":"主会话编码前补充评审;Editor测试模式排水Ready才Stop且不自动回PreBoot,实际QuitAct回归及真实退出通过"}, {"id":"R1-implementation-review-close", "status":"closed", "detail":"210基线一致,5专项及P2-1/P3-1/P3-2逐项裁决;补丁与全量/真实回归完成,限定R1关闭"}, ]: if not any(x["id"] == item["id"] for x in data["todoItem"]): data["todoItem"].append(item) path.write_text(json.dumps(data, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") old = json.loads((evidence / "real102-implementation-review-hashes.json").read_text(encoding="utf-8-sig")) changed = [x["path"] for x in old["files"] if hashlib.sha256((root/x["path"]).read_bytes()).hexdigest().upper() != x["sha256"].upper()] (evidence / "repair-baseline-delta.json").write_text(json.dumps({"baselineEntries":len(old["files"]),"changedExistingPaths":changed}, ensure_ascii=False, indent=2), encoding="utf-8") paths = {root / p for p in changed} paths.update(p for p in evidence.glob("repair-*") if p.is_file() and p.name != "repair-final-hashes.json") paths.update(evidence.glob("unity-repair-*.cs.txt")) paths.update(evidence / "ExitRegression" / p for p in ("ExitRegression.csproj","Program.cs.txt")) paths.update(docs / p for p in ("阶段4R1报错修复裁决与最小实施方案-2026-09-24.md","阶段4R1报错修复验收与关闭裁决-2026-09-24.md","接手入口.md","开发状态.md","TODO.md","开发日志.md","阶段4B3当前TodoItem-2026-09-24.json")) paths.add(Path(__file__).resolve()) (evidence / "repair-final-hashes.json").write_text(json.dumps({"scope":"R1 two-error repair and closure evidence; original review manifest preserved", "files":[{"path":p.relative_to(root).as_posix(),"sha256":hashlib.sha256(p.read_bytes()).hexdigest().upper()} for p in sorted(paths)]}, ensure_ascii=False, indent=2), encoding="utf-8") print(json.dumps({"updated":True,"oldBaselineChanged":changed,"finalHashEntries":len(paths)}, ensure_ascii=False))