diff --git a/.zcode/hooks/session-snapshot.sh b/.zcode/hooks/session-snapshot.sh index dd4d92dd..9fa947cf 100644 --- a/.zcode/hooks/session-snapshot.sh +++ b/.zcode/hooks/session-snapshot.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash -# 会话开始:快照工作区状态(status 哈希 + diff 内容哈希)与 active.md 修改时间,供 Stop 收口检查对比 +# 会话开始:快照工作区状态(status 哈希 + diff 内容哈希)与 active.md 内容哈希,供 Stop 收口检查对比 +# 2026-09-18 强判据升级:active.md 判据由 mtime 改内容哈希——touch/意外改时间不再蒙混,内容真变才算登记 proj="${ZCODE_PROJECT_DIR:-$PWD}" sid="${CLAUDE_SESSION_ID:-default}" state="/tmp/zcode-active-md-guard" @@ -8,7 +9,7 @@ mkdir -p "$state" date +%s git -C "$proj" status --porcelain 2>/dev/null | sort | sha1sum | cut -d' ' -f1 git -C "$proj" diff HEAD 2>/dev/null | sha1sum | cut -d' ' -f1 - stat -c %Y "$proj/production/session-state/active.md" 2>/dev/null || echo 0 + sha1sum "$proj/production/session-state/active.md" 2>/dev/null | cut -d' ' -f1 || echo 0 } > "$state/$sid.snap" rm -f "$state/$sid.reminded" exit 0 diff --git a/.zcode/hooks/stop-active-md-guard.sh b/.zcode/hooks/stop-active-md-guard.sh index e83c693b..d962ac95 100644 --- a/.zcode/hooks/stop-active-md-guard.sh +++ b/.zcode/hooks/stop-active-md-guard.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash # 会话结束收口检查:工作区相对会话开始有改动(status 行或 diff 内容任一变化)、 -# 且 active.md 本会话未更新时,以 exit 2 阻止停止并经 stderr 注入登记提醒(每会话至多一次) +# 且 active.md 内容哈希未变(本会话内未真更新——mtime 不可信,touch 也算未登记)时, +# 以 exit 2 阻止停止并经 stderr 注入登记提醒(每会话至多一次) +# 2026-09-18 强判据升级:active.md 由 mtime 比对改内容哈希比对 proj="${ZCODE_PROJECT_DIR:-$PWD}" sid="${CLAUDE_SESSION_ID:-default}" state="/tmp/zcode-active-md-guard" @@ -10,14 +12,14 @@ active_md="$proj/production/session-state/active.md" [ -f "$state/$sid.reminded" ] && exit 0 start_status=$(sed -n 2p "$snap") start_diff=$(sed -n 3p "$snap") -start_mtime=$(sed -n 4p "$snap") +start_content=$(sed -n 4p "$snap") now_status=$(git -C "$proj" status --porcelain 2>/dev/null | sort | sha1sum | cut -d' ' -f1) now_diff=$(git -C "$proj" diff HEAD 2>/dev/null | sha1sum | cut -d' ' -f1) [ "$now_status" = "$start_status" ] && [ "$now_diff" = "$start_diff" ] && exit 0 -now_mtime=$(stat -c %Y "$active_md" 2>/dev/null || echo 0) -[ "$now_mtime" -gt "$start_mtime" ] && exit 0 +now_content=$(sha1sum "$active_md" 2>/dev/null | cut -d' ' -f1 || echo 0) +[ "$now_content" = "$start_content" ] || exit 0 touch "$state/$sid.reminded" cat >&2 <<'MSG' -[会话收口检查] 本会话产生了工作区改动,但 production/session-state/active.md 未在本会话内更新。若本会话包含实质工作(代码/文档/数值/设计拍板/缺陷修复),请:① 先更新 active.md 顶部「当前状态快照」节(在飞/可做/阻塞/锚点/下一步——先改快照再记账);② 再在 active.md 末尾追加一条编号批次条目(做了什么·拍板了什么·验证结果·遗留与下一步)。完成后结束;若本次确无可登记事项(纯问答、只读核查),忽略本提醒直接结束。另:待办事项登记 design/gdd/06-待办清单.md(裁决后改状态列留痕),不要写进 active.md 条目表。 +[会话收口检查] 本会话产生了工作区改动,但 production/session-state/active.md 内容未变(本会话内未真更新)。若本会话包含实质工作(代码/文档/数值/设计拍板/缺陷修复),请:① 先更新 active.md 顶部「当前状态快照」节(在飞/可做/阻塞/锚点/下一步——先改快照再记账);② 再在 active.md 末尾追加一条编号批次条目(做了什么·拍板了什么·验证结果·遗留与下一步)。完成后结束;若本次确无可登记事项(纯问答、只读核查),忽略本提醒直接结束。另:待办事项登记 design/gdd/06-待办清单.md(裁决后改状态列留痕),不要写进 active.md 条目表。 MSG exit 2 diff --git a/design/registry/entities.yaml b/design/registry/entities.yaml index c38d67c2..55d7dcfb 100644 --- a/design/registry/entities.yaml +++ b/design/registry/entities.yaml @@ -23,7 +23,7 @@ entities: streams: [board_gen, reward_roll, encounter, armor_roll, behavior_roll] stream_names: 当前封闭清单(增流需改代码 + P1 支柱评审;combat_var 已于 2026-09-07 full 评审删除——玩法随机不预置基础设施;encounter 增流 2026-09-12 用户拍板——遭遇随机化批,scope_event_binding = 每次战斗实例化恰一 scope;**armor_roll 增流 2026-09-16 用户拍板**——护甲等级掷点批,回合内随机首次入流:scope_event_binding = 每次掷点恰一 scope〔逐次掷逐次取号、可逐位回放〕,消费面 = 战斗结算 吃掷点分量判定;**behavior_roll 增流 2026-09-16 用户拍板**——敌人技能池批(开轮摇号):回合内随机、时点前置到每轮开轮〔结算步骤流之外〕,scope_event_binding = 每敌每摇号恰一 scope,**派生向量 = spawn_index × 1000000 + 单敌摇号序**〔单敌出招轨迹可独立复放、敌互不穿插;取号门 = open_scope(stream, scope) 显式 scope 取号——计数器仍单调 +1 供观测〕,消费面 = 战斗结算 开轮摇号换算层 + 技能摇号器 SkillLottery) stream_facade: open_stream(stream) 取号(计数器+1→派生→返回已播种实例);derive_at(stream, scope) 纯函数供测试/预览(不推计数器) - scope_event_binding: board_gen=每次生成新扫雷图(棋盘生成);reward_roll=每次 board install(格奖励批 + 清图奖励批)(地图战斗资源——2026-09-09 接口漂移改写,原"每次奖励结算 roll 批次";地图战斗资源 Rule 2/AC-1 为契约源);encounter=每次战斗实例化恰一 scope(战斗结算 begin_battle 实例化期、扫雷开始前——unit_count 区间均匀骰,挖掘决策域之外 P1 合规);armor_roll=每次掷点恰一 scope(战斗结算 战斗段吃掷点分量逐次判定——1d20,护甲等级掷点批 2026-09-16);armor_roll=每次掷点恰一 scope(战斗结算 战斗段吃掷点分量逐次判定——1d20,护甲等级掷点批 2026-09-16) + scope_event_binding: board_gen=每次生成新扫雷图(棋盘生成);reward_roll=每次 board install(格奖励批 + 清图奖励批)(地图战斗资源——2026-09-09 接口漂移改写,原"每次奖励结算 roll 批次";地图战斗资源 Rule 2/AC-1 为契约源);encounter=每次战斗实例化恰一 scope(战斗结算 begin_battle 实例化期、扫雷开始前——unit_count 区间均匀骰,挖掘决策域之外 P1 合规);armor_roll=每次掷点恰一 scope(战斗结算 战斗段吃掷点分量逐次判定——1d20,护甲等级掷点批 2026-09-16) unseeded_access: 致命中止 snapshot_contract: 续玩/复盘快照 = master_seed + 各流 scope 计数器(消费方 存档序列化) referenced_by: [棋盘生成, 战斗结算, 地图战斗资源, 冒险结构, 存档序列化] diff --git a/production/session-state/active.md b/production/session-state/active.md index 73ca8031..42e0bb5f 100644 --- a/production/session-state/active.md +++ b/production/session-state/active.md @@ -12,13 +12,13 @@ ## 当前状态快照(收口批先更新本节,再追加台账;≤10 行) -- **更新于**:2026-09-18(元进度定稿批收口) -- **在飞**:元进度定稿批(2026-09-18——六件拍板收口,纯文档,未提交);工作区另有更早未提交批余量(数值压缩/措辞收口/伤害道具批等文件),本批文件与之同文件共存(06清单/entities/难度曲线),归属按 hunk 区分 -- **已完成**:元进度定稿批 = 拷问会话六件收口(定名永久强化+天赋树退役 / 营地三柜台 / Boss首杀全量重复杀小额 / 几何定价 / 换算率表首版三行护甲强条目 / 参数面注入 / 双入口)——元进度.md v1.0 + 06 七条收口 + registry(术语+换算表条目+L1带10-25%修正)+ 难度曲线与Boss v0.10 -- **已解锁可做**:元进度设计批(铺量/定价数字/Boss两档产出/换算率三行数值——全配读数);验收批(读数重测) -- **阻塞等待**:难度曲线调参批(门 = 验收读数) -- **锚点提交**:8ca3da6 技能池收编 · ba08ba1 魔法道具空内容 · d7d2200 关卡节点地图定稿 · 85933f4 状态持久化 · a0cba61 概念地图产物 · 31f4966 代币→钥石统一 ·(数值压缩/措辞收口/伤害道具/本批均未提交) -- **下一步顺序**:未提交批用户审批提交 → 验收批(读数重测 + 真人试玩)→ 曲线调参批 → 魔法道具内容批(详见 production/roadmap.md) +- **更新于**:2026-09-18(场景讨论收口批——措辞收口+数值对齐+场景一/三拍板落地提交 0da19a5) +- **在飞**:场景四战斗数值 grill(**另一会话进行中**——sapped 死效果/单弱敌跳过战斗/免伤轮三选/敌方 AC 行值;完美档加难未见结论);表现层升级批未启动(前置 = 美术清单 P0 样张 + 用户看图拍板敌人卡形态) +- **已完成**:本会话 0da19a5(①registry 指路化收口 ②刷新临时名全链退役 ③五区残留清零 ④schema 默认值+字号+RAP 表值驱动 ⑤意图徽标三档占位 ⑥R1 解析口径 ceil/封顶/Fatal ⑦tune 探针表值驱动修复 ⑧06 四条目+美术资源依赖清单);并行会话四笔在先(a2fc39f 伤害道具+护甲重配+营地前置 / cdc226e 数值纪律收口 / 3fb6bd2 审计修复 / c5c52b5 元进度定稿) +- **已解锁可做**:验收读数重测批(AC 判读口径已定稿、tune 探针已修复);两份美术清单(art-assets-checklist / asset-checklist)重复待合并拍板 +- **阻塞等待**:曲线调参批(门 = 验收读数);sapped 等数值修复小批(门 = 场景四裁决回流,避免撞文件) +- **锚点提交**:0da19a5 本会话收口 · a2fc39f 伤害道具+护甲重配 · cdc226e 数值纪律收口 · c5c52b5 元进度定稿 · 8ca3da6 技能池 +- **下一步顺序**:场景四裁决回流 → 数值修复小批 → 验收读数重测 → 曲线调参批 → 魔法道具内容批 → 表现层升级批(详见 production/roadmap.md) ## 项目当前位置 @@ -176,3 +176,7 @@ 65. **分支节点图批 = 关卡 2「幽暗地域」试玩批(2026-09-17,用户拍板任务批——关卡节点地图 v1.0 P1 实现批,切片代码 + 数据 + 文档 + registry 同批;不自行提交)**:**① 图版行进器**(level_runner 重构):节点带 `next` 出边表,兑付后经 `choices_presented` 进选路态、`pick_next_node` 显式选下一跳——战斗胜利不再自动推进、`continue_after_node` 泛化为兑付确认(06 接口漂移 ④⑤⑧ 清偿,①②③⑥⑦ 属正式侧保持登记);编号空间单一出口(图 = node_depth / 单链 = 数组下标,`node_id_of`/`node_out_ids`/`next_candidate_ids`/`visited_ids`/`current_node_id` 成文读面——单链混合空间碰撞缺陷在实现期发现并收口)。**② 图合法性校验**(level_table.validate 重构):编号唯一/入口唯一/Boss 恒唯一终点(无出边+编号最大)/前进方向无环/入口可达全部/全部可达 Boss 六检,违规加载致命;单链 = 出边恰一退化形态经同一套算法(L1 行集零迁移),冒烟正反断言六类违例全拒。**③ L2 内容行**:level.tres 增"第二层 · 幽暗地域"9 节点网状图(入口 0 → 中间三层 2/3/2 → Boss 8,岔路 4 处,奖励点+恢复点各 1,战斗节点 6);enemy.tres 增 L2 七行(熊地精系 bugbear 复用 ×3〔池差异化 普攻/突刺/重击〕+ 巨蜘蛛 giant_spider 新敌种 ×3〔群行 [2,3]、首遇位固定、轻甲〕+ 蛛化卓尔精灵 drider Boss〔重甲 175hp 专属池 普攻 6/重击 2/毒爆 2〕,全 provisional);skills.tres 增撕咬 bite(×1.5 冷却 1)+ 毒爆 venom_burst(×2.5 冷却 4 独占技);board_gen.tres 增 L2 七行铺满;跨表精确行校验既有通道自动生效。**④ 呈现**:新建 route_overlay.gd(选路覆盖层——整图自绘房间方块+通道连线+当前/候选高亮+候选按钮,程序化占位质量);顶栏 strip_view 图形态渲染行进序列+候选(单链保持链状零迁移);首页"▶ 第二关 · 幽暗地域"直入口(`_start_full_level(2)` 测试模式,≠ 两关序列生效);narrator 增岔路口文案。**⑤ 验证**:冒烟 263→**296 项 0 失败**(图校验正反 6 断言 + L2 min/max 双路径通关 + 零自动推进状态机手动驱动逐拍断言〔含候选外拒绝语义〕+ 首遇位绿档〔基线 0 加成完美档 12 种子首遇战全胜且零踩雷〕+ 跨表行完整 + 图版结构;技能池批 5 行快照断言随内容批升级为 12 行行集键版);四探针全 PASS(click_probe 增 L2 段:L1 终局→真实"返回"路径→`start_level(2)` 断言→岔路真实点击 15 次交替选候选→L2 通关,问题=0);同种子回放确定性保持;L2 数值扫描(level_monte_carlo 增关卡参数,N=20 双策略):基线裸值通关 **0%**(死因集中 Boss×16/20)· hp+100% 档 35% · atk+50/hp+100 65% · atk+100/hp+100 75% · atk+150/hp+100 80%——行值 provisional,精调归曲线调参批。**⑥ 文档回填**:难度曲线与Boss v0.7(第二关深度轴 P1 收口 + 行值表 L2 七行 + 技能池投值表扩列〔冷却/EV 锚静态份额〕+ 棋盘参数表);06-待办清单(接口漂移 ④⑤⑧ 清偿、图版措辞对齐部分对齐、两关序列注记直入口≠序列、深度轴行值+新内容投放两条已解决留痕);registry(level_table 三处 + 修订记录);关卡节点地图 v1.0.1(P1 落地状态行);切片 README(L2 试玩采集清单)。**待确认两点已收口(用户 2026-09-17 同日裁决)**:①「兄弟精」= 熊地精 bugbear(L2 display_name 回归熊地精系:熊地精/熊地精猎群/熊地精重击手——原"巴布精"译名废弃);②Boss 定名蛛化卓尔精灵 drider(enemy.tres display_name 同步)。**⑦ 批内视觉验证修复(用户追问"选路 UI 为什么看不到"引出的实锤)**:① route_overlay 未 add_child 入树(注册模态但不在场景树 = 完全不可见——手写构建绕过了 ui_assembler 的 add_child 惯例);② 全部六个模态覆盖层尺寸 0×0(Control 默认锚不撑满宿主——全屏变暗层与居中布局整体失效,节点确认/图例/终局/调整板等既有覆盖层同病;探针经信号直发绕过真实点击与渲染从未暴露)。修复 = _register_modal 统一 set_anchors_and_offsets_preset(FULL_RECT) + route_overlay 入树并按树序=登记序=z 序纪律插于节点层与终局层之间;窗口模式截图验证选路覆盖层完整渲染(route_overlay_preview.png),冒烟 296 全绿 + 四探针 PASS 复跑。**实现期事故注记**:并行会话(四批收编批)与本批同工作区在飞,其六笔提交(至 31f4966)先期落库——开工时脏文件全数收编,收口时工作区余量恰为本批 21 文件,零交叉零覆盖;更早会话遗留的"在飞 level_table.gd 图版 schema"未落盘,本批全量重实现。**未提交**(本批纪律)。 66. **元进度定稿批(2026-09-18,grill-me 拷问会话六件拍板收口,用户逐项裁决——纯文档,未提交)**:**①定名**:系统落地名**永久强化**(「元进度/Meta Progression」保留为族名;「天赋树」退役——无树形结构;「营地」= 存档内消费枢纽界面壳非机制实体;定名前经行业调研:Hades 夜之镜/Dead Cells 收藏家/Loop Hero 营地/Rogue Legacy 庄园,调查结论用户先要调研再拍名)。**②营地三柜台**:属性锻造(生命上限/基础攻击/**护甲等级**——用户明确选 A 护甲进首版)钥石直购可重复升级 / 道具工坊(六件道具,**首版全走关卡通关次数渠道**、钥石价随定价批后补、最终双渠道并存)/ 奖励格图鉴(结构位现定、格子内容排 Alpha 随地图战斗资源差异化批)。**③钥石产出**:Boss **首杀全量、重复杀固定小额**(非递减曲线,存档只记首杀标记位;深层关产出优势 + 几何递增定价 = 长线驱动)。**④定价**:几何递增原则(数字归设计批)。**⑤换算率**:区间平移换算率**启用**——registry 新条目 `meta_progression_conversion_table`,首版三行(生命/攻击/护甲),护甲行**强条目**(验收读数须按解锁后参数重测);数值行读 data/tables、文档零数值(用户重申 GDD 不留具体数值纪律)。**⑥注入**:冒险开始参数面 + hero_override_parameter_passing 通道;属性=数值覆盖、道具池/遭遇/奖励格=集合操作(追加/替换两语义)。**⑦UI**:双入口(主菜单营地入口 + 局内暂停层只读)+ 钥石余额 HUD 常驻;实现归 HUD 框架批、以表现层样张过审为前置。**回填**:元进度.md **v1.0**(自范围草案升定稿——定名节/三柜台/重复获取/换算率/注入/双入口/存档域四件/P0-P2/调参表/验收标准全节重写);06-待办清单七条收口(元进度六条:换算率启用形态/三方向清单定价/钥石重复获取/天赋树去留已裁决或部分收口 + 数据配置「元进度表键结构未定」已解决 + 难度曲线「基线通关率越带」现状按新带 [10,25] 校正 + 「区间平移换算率数值未定」注记);registry(terminology「永久强化」词条 + meta_progression_conversion_table 新条目 + difficulty_expectation_table L1 带改 **10-25%**〔2026-09-17 拍板的 registry 漏网补登〕+ 修订记录);难度曲线与Boss **v0.10**(元进度接口预留节改定稿口径 + P2 行同步)。**遗留归元进度设计批**(全配读数):三柜台铺量与定价数字、Boss 两档产出数值、换算率三行折算数值、存档域四件(钥石余额/强化等级表/通关次数表/Boss 首杀标记)契约登记。**同会话范围裁剪**:用户主动撤回其余五件决策(表现层升级批/完美档结构性加难/敌人呈现形态/魔法道具三件/第二关解锁语义)未拍板,留待后续会话。 + +67. **场景一/三拍板落地批(2026-09-18,本会话——场景分组讨论产物,提交 0da19a5)**:**场景一(战斗画面)**四拍板——①意图标识改动画三档承载(常态=普攻预示/攻击技=发光举武器/重击硬化=蓄力或防御姿态,2026-09-18 用户拍板;占位符号已落地:普攻「—」/⚔/✦/蓄力,技能名退出徽标堵剧透);②敌人卡形态 = 样张裁决不预拍(卡片式 vs 站桩式两版候选);③格边长弃两档定值改分辨率档位计算(窗口不可调、格子量增则格边长变;档位定案 1280×800+1920×1080);④表现层升级走贴图渲染(视图层替换非重构)。美术资源依赖清单成文(design/art/art-assets-checklist.md——P0 样张/P1 角色/P2 图标/P3 演出四档+依赖链+art-bible 风格条款引用;**注意并行会话另建 asset-checklist.md 内容重叠,合并待拍板**)。**场景三(数据装载与查表)**三拍板——①解析口径 ceil 向上取整保证偏难(原 floor 就近退役);②同日追加:超出最大行封顶取最大值(不致命);③域越界(关卡序号<1/深度<0)Fatal 级诊断+进程退出码 1(数据配置 v0.4+registry enemy_table 同步+config_fatal_probe 探针+冒烟 ceil/clamp 断言)。**变异对初始展开影响**挂起归地形变异首批定稿批(board_data.gd 死分支处置在案)。**措辞收口+数值对齐**:registry 指路化全收口(主角/技能七行/敌五敌种/充能/敞口/棋盘参考行/EV 读数)、中点锚改 floor 向下取整口径、刷新临时名全链退役(refresh_cap_per_round/request_refresh/can_refresh)、五区残留清零、schema 默认值 6/6、明细字号 14px、RAP−8 字面量 6 处表值驱动(set_refresh_cost 注入)、tune 探针表值驱动修复、smoke 标签「L1·地精/L2·兄弟精」。**验证**:冒烟 296 全绿 + ui/click/layout/tune 四探针 PASS + fatal 探针退出码 1。**第 20 处残留补修**:smoke 回放标签退役键名(ambusher/grub)——审计维度应含测试/日志文案的教训在案。**并行协调**:场景四在另一会话裁决(本会话不碰战斗数值文件);并行会话四笔先期提交已核对零覆盖(其选择性收编我方已完成 hunks,行动经济改名 hunks 留与本批)。 + +68. **收口杂项批(2026-09-18,本会话)**:① **Stop 守卫强判据升级**:active.md 登记判据由 mtime 改**内容哈希比对**(session-snapshot.sh 存内容哈希、stop-active-md-guard.sh 比内容——touch/意外 mtime 变化不再蒙混过关;三态实测:无改动 exit 0 / 改动+未登记 exit 2 / 改动+已登记 exit 0);② registry `scope_event_binding` 行内 armor_roll 条目重复追加一次,已去重(armor_roll= 恰一处);③ CLAUDE.md「文档写作规范标题不对称」待拍板项核实**已解决**(现行规范导航独立标题+表格,无需再做——memory 过期已清)。**遗留登记**:两份美术清单合并、场景四结论回流回填,均见快照节。 \ No newline at end of file