Files
gplan-2/cleanup_batch.py
T

143 lines
13 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.
# -*- coding: utf-8 -*-
# design/ 存量清理批:worktree 内执行(删件+引用改写+§11新规+台账413)
import pathlib, re, subprocess, sys
ROOT = pathlib.Path('.') # worktree 根
# ---------- 1) 删除清单 ----------
DEV = [
'design/dev/architecture/gdd-concept-map.html',
'design/dev/architecture/gdd-concept-map.architecture.json','design/dev/architecture/gdd-concept-map.visual-check.html',
'design/dev/architecture/gdd-concept-map.visual-check.json','design/dev/architecture/gdd-concept-map.visual-check.1440x900.dark.png',
'design/dev/architecture/gdd-concept-map.visual-check.1440x900.light.png','design/dev/architecture/gdd-concept-map.visual-check.2048x1320.dark.png',
'design/dev/architecture/gdd-concept-map.visual-check.2048x1320.light.png',
'design/dev/architecture/board-node2d-migration-plan.md','design/dev/architecture/code-architecture-review-2026-09-13.md',
'design/dev/architecture/requirements-traceability.md',
]
QA = ['design/qa/'+n for n in [
'iter15-2-curio-exit-report-2026-10-05.md','iter15-3-mibao-exit-report-2026-10-05.md','iter16-ui-exit-report-2026-10-06.md',
'iter16-ui-human-gate-checklist-2026-10-06.md','iter17-career-exit-report-2026-10-06.md','iter17-datadrive-exit-report-2026-10-06.md',
'iter17-enemy-L3-改前锚丢失-2026-10-07.md','iter17-enemy-exit-report-2026-10-07.md','iter17-enemy-人闸材料-2026-10-07.md',
'iter17-pause-exit-report-2026-10-06.md','iter17-pause-human-gate-checklist-2026-10-06.md','iter18-career-exit-report-2026-10-07.md',
'iter18-forge-exit-report-2026-10-07.md','iter18-mixenc-exit-report-2026-10-07.md','iter18-seed-exit-report-2026-10-07.md',
'iter18-treefix-exit-report-2026-10-07.md','m1-exit-gate-checklist-2026-09-28.md','m2-exit-gate-checklist-2026-09-28.md',
'm3-iter10-clear-rate-readings-2026-10-01.md','m3-iter5-lever-scan-2026-09-28.md','m3-iter5-rework-readings-2026-09-29.md',
'm3-iter9-9a-checklist-2026-09-30.md','m3-iter9-exit-checklist-2026-10-03.md','m3-iter9-t17-fullflow-checklist-2026-10-01.md',
'm3-iter9-t18-07-audit-2026-09-30.md','m3-iter9-t8-rulings-2026-09-30.md','m4-iter11-exit-package-2026-10-03.md',
'm4iter12-t10-batch2-exit-2026-10-04.md','m4iter12-t7-batch1-readings-2026-10-04.md','m4iter14-gvar-exit-report-2026-10-04.md',
'm4iter14-gvar-t7b-readings-2026-10-05.md','m4iter14-mineq-exit-report-2026-10-05.md','m4iter14-skillpool-exit-report-2026-10-05.md',
'numfix-newruler-readings-2026-10-01.md','t17-defer-probe-evidence-20261002.md','t19-real-playtest-readings-2026-10-02.md',
'test-perf-report-2026-10-02.md','ui-struct-probe-exit-report-2026-10-05.md','中间产物死亡清单-2026-10-02.md',
]]
RES = ['design/research/'+n for n in [
'MC成本调研与规制方案-2026-10-03.md','UI重设计原型v2落码-差异对照与改动计划-2026-10-04.md','alpha-acceptance-battle-screen.md',
'board-tile-vocab-plan-a-2026-09-26.md','game-architecture-2026-10-05.html','game-architecture-2026-10-05.json',
'prototype-report-minesweeper-battle-concept.md','roguelike-difficulty-benchmark-2026-10-01.md',
'任务书-CI预接线批-2026-10-07.md','任务书-UI设计对齐批-2026-10-05.md','任务书-内容数据驱动扩展批-2026-10-06.md',
'任务书-初始展开收窄批-2026-10-04.md','任务书-奇物词族对齐与渠道分离批-2026-10-05.md','任务书-提灯载体道具批-2026-10-07.md',
'任务书-敌人表行集多行批-2026-10-05.md','任务书-旧界面呈现断言回补批-2026-10-07.md','任务书-暂停层只读入口批-2026-10-05.md',
'任务书-武器锻造系统设计提案批-2026-10-07.md','任务书-混编遭遇首批投放批-2026-10-07.md','任务书-生涯界面实装批-2026-10-07.md',
'任务书-生涯界面设计立项-2026-10-05.md','任务书-种子随机化与调试浮窗升级批-2026-10-07.md','任务书-秘宝代码词族对齐批-2026-10-05.md',
'任务书-自动化验收补齐批-2026-10-07.md','双层BD体系-整合定稿-2026-10-03.md',
'审查-地图战斗资源-2026-10-06.md','审查-奇物-2026-10-06.md','审查-总览-2026-10-06.md','审查-秘宝-2026-10-06.md',
'调研-roguelike道具玩法变异-2026-10-07.md','调研-全局作用域变异设计空间-2026-10-04.md','调研-扫雷类游戏玩法变异-2026-10-07.md',
'综合-道具变异可选项菜单-2026-10-07.md','研究-内容数据驱动扩展架构-2026-10-06.md',
]]
ALL = DEV + QA + RES
for f in ALL:
if (ROOT/f).exists():
subprocess.run(['git', 'rm', '-q', f], check=True)
print('git rm ok:', len(ALL))
# ---------- 2) 引用改写(basename 级替换,行内零行数变化) ----------
REWRITES = [
('iter16-ui-exit-report-2026-10-06.md', '迭代16出口报告(已退役,git 历史可查)'),
('iter17-pause-human-gate-checklist-2026-10-06.md', '迭代17暂停层人闸清单(已退役,git 历史可查)'),
('m3-iter5-lever-scan-2026-09-28.md', '迭代5杠杆扫描报告(已退役,git 历史可查)'),
('UI重设计原型v2落码-差异对照与改动计划-2026-10-04.md', 'UI落码差异对照(已退役,git 历史可查)'),
('任务书-UI设计对齐批-2026-10-05.md', 'UI对齐批任务书(已退役,git 历史可查)'),
('m3-iter10-clear-rate-readings-2026-10-01.md', '迭代10通关率读数(已退役,git 历史可查)'),
('t19-real-playtest-readings-2026-10-02.md', 'T19真人试玩读数(已退役,git 历史可查)'),
('任务书-自动化验收补齐批-2026-10-07.md', '自动化验收补齐批任务书(已退役,git 历史可查)'),
('roguelike-difficulty-benchmark-2026-10-01.md', '难度外部基准调研(已退役,git 历史可查)'),
('调研-全局作用域变异设计空间-2026-10-04.md', '全局作用域设计空间调研(已退役,git 历史可查)'),
('任务书-提灯载体道具批-2026-10-07.md', '提灯载体批任务书(已退役,git 历史可查)'),
('board-tile-vocab-plan-a-2026-09-26.md', '高墙瓦片词表(已落码 board_world.gd 查表,文件已退役)'),
('test-perf-report-2026-10-02.md', '性能实测报告(已退役,git 历史可查)'),
('code-architecture-review-2026-09-13.md', '代码架构评审(已退役,git 历史可查)'),
('requirements-traceability.md', '需求追溯矩阵(已退役,git 历史可查)'),
('board-node2d-migration-plan.md', 'Node2D 迁移计划(已执行完毕,文件已退役)'),
]
TARGETS = [
'design/gdd/06-待办清单.md','design/gdd/07-体验验证清单.md',
'design/gdd/systems/冒险循环/难度曲线与Boss.md','design/gdd/systems/排雷循环/地形变异.md',
'design/gdd/systems/表现与支撑/HUD框架.md','design/gdd/systems/冒险循环/关卡节点地图.md','design/gdd/ux/battle.md',
'design/registry/entities.yaml','design/art/art-bible.md','design/art/remote-gen-prompts.md',
'design/dev/architecture/adr-0005-save-contract-and-schema-versioning.md',
'design/dev/architecture/adr-0006-board-node2d-rendering.md','game/README.md',
]
total = 0
for tf in TARGETS:
p = ROOT/tf; d = p.read_bytes(); orig = d; n = 0
for basename, repl in REWRITES:
pat = re.compile(rb'[\w./\-\\]*' + re.escape(basename.encode()))
hits = pat.findall(d)
if hits:
d = pat.sub(repl.encode(), d); n += len(hits)
if d != orig:
p.write_bytes(d); total += n
print('rewrote %d ref(s) in %s' % (n, tf))
print('ref rewrite total:', total)
# ---------- 3) doc-conventions §11 新规 + v13 ----------
p = ROOT/'design/dev/doc-conventions.md'; d = p.read_bytes()
if b'| v13 |' not in d:
anchor = '| 暂存地非档案库 | `design/research/` 与 `design/qa/` 是中间文档的暂存地,不是永久档案库;入此两处的文件默认按本节规则到期即死 |'.encode()
assert d.count(anchor) == 1
i = d.find(anchor); j = d.find(b'\n', i)
nl = b'\r\n' if d[j-1:j] == b'\r' else b'\n'
row = ('| 证据只留最新(2026-10-09 用户立规) | 测试证据(出口报告/读数/截图/对比图)只保留最新一次迭代或最新一轮同类审计的版本——旧证据无参考作用,测试按状态不按历史;新证据落位后同批删除上一份;等人工检查的清单不受此限,过人闸后按本行退役 |').encode() + nl
d = d[:j+1] + row + d[j+1:]
anchor2 = '| v12 | 2026-10-09'.encode()
i2 = d.find(anchor2); assert i2 != -1
j2 = d.find(b'\n', i2)
nl2 = b'\r\n' if d[j2-1:j2] == b'\r' else b'\n'
j2 += 1
row2 = ('| v13 | 2026-10-09 | §11 新增「证据只留最新」行(2026-10-09 用户立规——qa 存量清理批随批落文):测试证据只保留最新迭代/最新一轮审计版本,新证据落位即删上一份;待人清单过闸后同规退役 |').encode() + nl2
d = d[:j2] + row2 + d[j2:]
p.write_bytes(d)
print('doc-conventions ok')
# ---------- 4) active.md:快照顶部更新行 + 台账 413 ----------
p = ROOT/'active.md'; d = p.read_bytes()
if b'\n413. ' not in d and not d.startswith(b'413. '):
anchor = '## 当前状态快照(收口批先更新本节,再追加台账;≤10 行)'.encode()
assert d.count(anchor) == 1
ai = d.find(anchor); aj = d.find(b'\n', ai) + 1
top = ('- **更新于**:2026-10-09(**design/ 存量超期清理批落籍 master**,用户逐类判决——QA 新立规「证据只留最新」,工作日志 413):'
'删 86 件=dev 四组 11(concept-map 全家/迁移计划/评审/追溯矩阵,随批清 7 文件指路句)+qa 39(证据只留最新规首跑:保留 iter19 七件+迭代18目检总清单〔待人〕+ui-audit 树与报告=最新证据)+research 33 轨迹+3 未跟踪'
'(任务书 17/审查四/奇物调研四〔用户点名核验:18 件框架已落 GDD v3.0〕/研究三/双层BD/MC成本/基准/UI对照/第三套架构图/旧杂件);引用改写 13 文件;'
'doc-conventions §11 新增证据只留最新行(v13);**美术审计报告留置未删**(P0① art-bible 仍引用已丢失冻结样张+P0② 主角重产未登记——严重事项呈用户,待裁后处置)。\n').encode()
d = d[:aj] + top + d[aj:]
lines = d.split(b'\n')
L413 = ('413. **design/ 存量超期清理批(2026-10-09,用户逐类判决;QA 证据新立规=「证据类只保留最新迭代/最新一轮审计版本,新证据落位后删上一份,等人工检查的清单不受限」已落 doc-conventions §11 v13)**:'
'①dev/architecture 四组 11 件删——gdd-concept-map 全家 8(2026-09 旧架构快照零引用,新架构图用户示另行生成)/board-node2d-migration-plan(迁移完成)/code-architecture-review/requirements-traceability(挂起标记过期:待的 ADR-0006/0007 均已落地);'
'随批清 7 文件指路句(关卡节点地图/HUD框架/battle 版本行+adr-0005 两处+adr-0006+game README)。'
'②qa 39 件删(新规首跑)——迭代 11-18 全部出口报告/读数/检查单+m1/m2 出口单+numfix/t17/t19/test-perf/ui-struct-probe+中间产物死亡清单本体(本批即其终局);'
'保留=iter19 七件(最新迭代证据)/迭代18-实机目检总清单(待人)/ui-audit-2026-10-06 树 40 张+ui-audit-vs-demo 报告(最新 UI 审计证据)。'
'③research 33 轨迹+3 未跟踪删——已落籍批任务书 17(含技能池批)/道具三层审查四件(三层重设计收口)/奇物调研底稿四件(**用户点名核验通过**:18 件专长框架已落 GDD 奇物.md v3.0 正主,全局作用域调研未决项由迭代14③落地批+06 登记承接)/研究三件/双层BD整合定稿(迭代12 落码)/MC成本调研(sim-data 规制落地)/roguelike-difficulty-benchmark(带值四带已裁)/UI落码对照(落码批收官)/game-architecture html+json(第三套架构图)/alpha-acceptance+prototype-report(M3 前旧件);'
'保留=M4数值批任务书+A4 两件(冻结)+提案-武器锻造(17 裁点未闭)+UI预览demo三路对照(阶段1待办)+自造短语全量清单(待裁)+playnote(用户手迹)。'
'④引用改写 13 文件(06 五处/07 三处/难度曲线两处/地形变异/HUD框架两处/关卡节点地图/battle/entities.yaml/art-bible/remote-gen-prompts/adr-0005/adr-0006/README——路径指涉统一改「(已退役,git 历史可查)」行内注记,零行数变化)。'
'**A1 美术资产链路审计报告留置未删(用户严重事项条款)**:核验结论=§07 数值单点已吸收(art-bible v3.11)/描边已吸收(character-design §5.1 v1.9+06 复核钩子),'
'但 **P0① 未吸收**——art-bible:68/:527+art-status-checklist:13 至今仍引用已丢失冻结样张 artwork/mockups/sample-batch-v3-final-2026-09-30.png(磁盘实测零命中,圣经冻结基准死指涉),'
'**P0② 未登记**——主角棋盘小人未走像素管线(插值糊图)重产事项无 06 条目;待用户裁决(登记 06 处置或重产后再删报告)。'
'**验证**=doc_link/doc_term/gdd_lint 对基线零新增+熵增闸 PASS;untracked 三件(技能池任务书/研究×2)主区磁盘删不入 git。').encode()
for i, ln in enumerate(lines):
if ln.startswith(b'412. '):
lines.insert(i+1, L413); break
else:
sys.exit('ledger 412 not found')
pathlib.Path('active.md').write_bytes(b'\n'.join(lines))
print('active.md ok')
print('ALL DONE')