Files
ft/CodexOutput/upserver/KVGameplayLoopTests/record_repair_checkpoint.py

79 lines
7.0 KiB
Python
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.
"""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))