diff --git a/design/engineering/doc-conventions.md b/design/engineering/doc-conventions.md
index dbfd1b92..8b25c6e0 100644
--- a/design/engineering/doc-conventions.md
+++ b/design/engineering/doc-conventions.md
@@ -187,7 +187,7 @@ roadmap 由顶部里程碑表+迭代总表组成,迭代总表一行一个迭
| 状态 | 待开工 / 进行中 / 已完成(YYYY-MM-DD)/ 已终止(YYYY-MM-DD) |
| 需求卡片 | 只写文件路径;一格内一行一卡,格内排列顺序=执行顺序;已退役填保留字「已退役(git 历史可考)」;历史迭代不可考填「—」(早期无卡片制的迭代) |
| 编入时间 | YYYY-MM-DD(该迭代最近一次编入卡片的日期);历史迭代不可考填「—」 |
-| 预计周期 | ≈N 周(0.5 步进,N ≤ 2);超过 2 周须随带日期的用户特批标记(格式见 12.4),流水线闸见标记放行、无标记判红;历史迭代不可考填「—」(不做 ≤2 周判) |
+| 预计周期 | 所选卡估时区间**中值**求和,单位工作日,写精确值不取整,形态「≈N 个工作日」(1 周=5 个工作日);5–10 为常规区间;超过 10 须随带日期的用户特批标记(格式见 12.4),流水线闸见标记放行、无标记判红;低于 5 或超过 20 均判红(硬下限/硬上限,2026-10-21 用户裁定:特批标记也不放行);历史迭代不可考填「—」 |
| 实现报告 | `reports/iterN-实现报告-YYYY-MM-DD.md`;未完成=「—」;退役=「已退役(git 历史可考)」;已完成迭代只许存在路径或退役保留字、禁「—」 |
迭代行禁入内容:事项说明、卡序叙述、T 段明细、读数、闸数字、裁点记录、门依赖。卡间依赖写在卡片自身,行内只放上表六列的事实。特批标记同样可用于 roadmap 格(须带日期,见 12.4)。
diff --git a/design/engineering/process-conventions.md b/design/engineering/process-conventions.md
index 6636ea6f..ca0261b9 100644
--- a/design/engineering/process-conventions.md
+++ b/design/engineering/process-conventions.md
@@ -23,7 +23,7 @@
| 一·登记 | 无(闸管格式) | 待办清单条目 | 条目=标题登记元数据+正文四属性(现状/缺口/归属/状态);标题登记后不再变,正文随进程演进。格式与状态机权威=doc-conventions 第 12 节 |
| 二·文档设计/美术设计 | doc-design(文档轨,兼任反哺点写入)/asset-ingest(美术录入;样张素材由用户主导产出) | GDD 文档或 art-bible/过审样张素材 | 用户提起或从待办清单取出;会话内进行、用户主导、禁无监管自跑;经用户点头确认心智一致才许写入文档;完成判据=待裁点清零,带未裁点的是讨论稿;轨闭合凭据记入待办清单现状清单(文档轨=文档路径+版本号,美术轨=art-bible 条款版本) |
| 三·写需求卡片 | req-card | 需求卡片 | 轨闭合后用户发令;新玩法/新系统/新内容必须有设计定稿前置,例外=工程直入四类(缺陷修复/工程债/测试基建/重构)凭证据跳过设计轨;卡片必经 grilling 多轮复核、零待裁点才成立;写完在待办清单状态记「已写卡」,卡片路径记入现状清单(防遗忘) |
-| 四·迭代编排 | iter-plan | roadmap 迭代行 | 编排四查:①每卡卡片文件存在 ②每卡设计闭合凭据齐(或工程直入证据)③总估时区间——下界=所选卡估时按区间**中值**求和不得低于 5 天(2026-10-21 用户立:不希望单迭代编太少),上界=≤2 周 ④写完 roadmap 行后跑流水线闸确认绿;编入未完成迭代,新开迭代行经用户确认 |
+| 四·迭代编排 | iter-plan | roadmap 迭代行 | 编排四查:①每卡卡片文件存在 ②每卡设计闭合凭据齐(或工程直入证据)③总估时三条线——所选卡估时按区间**中值**求和(单位工作日、写精确值不取整):低于 5 个工作日不得编(硬下限,2026-10-21 用户立:不希望单迭代编太少);5–10 个工作日为常规区间、直接编;超过 10 个工作日须经用户确认(确认前呈报整批/拆批两案等裁,禁自行拆分或塞入),确认后迭代行随带日期特批标记;超过 20 个工作日不得编(硬上限,2026-10-21 用户立:用户确认也不放行,必须拆批)④写完 roadmap 行后跑流水线闸确认绿;编入未完成迭代,新开迭代行经用户确认 |
| 五·实现 | iter | 代码与配置,可运行的游戏 | 需求卡片永不单独施工,统一由用户指定迭代号触发(=U0 开工令),按 iter 技能与本文 §3 执行;**本段是代码实现批:禁写 `design/` 与根规则文件,产出物只落 `reports/`(见 §3 第 13 条)**;设计权威文档(GDD/art-bible)批内一律不更新;完成人闸=实机目检清单+代拍板追认单登记交用户即完成批内义务 |
**实现段零裁断**:实现段的输入在编排段出口已锁死(卡片零待裁点+设计闭合凭据齐+编排四查过)。实现中冒出卡片没写清的分歧=上游缺陷——停该卡、待办清单状态回退+缺口补记,退回上游;禁自答、禁内联提问求裁断;该卡停摆不阻塞同迭代其他卡。环境故障与测试红走异常分级(自救重试/记录继续/停机呈报)。代拍板白名单保留:授权发生在卡片审问阶段,实现只执行预授权;批后追认单=备案确认。
diff --git a/roadmap.md b/roadmap.md
index 11bb4f5b..717845e0 100644
--- a/roadmap.md
+++ b/roadmap.md
@@ -64,11 +64,11 @@
| 迭代 28 | 已完成(2026-10-15) | 已退役(git 历史可考) | 2026-10-15 | — | 已退役(git 历史可考) |
| 迭代 29 | 已完成(2026-10-16) | 已退役(git 历史可考) | 2026-10-16 | — | 已退役(git 历史可考) |
| 迭代 30 | 已完成(2026-10-17) | 已退役(git 历史可考) | 2026-10-16 | — | 已退役(git 历史可考) |
-| 迭代 31 | 已完成(2026-10-19) | 已退役(git 历史可考) | 2026-10-18 | ≈1.5 周 | 已退役(git 历史可考) |
-| 迭代 32 | 已完成(2026-10-21) | 已退役(git 历史可考) | 2026-10-20 | ≈1.75 周 | 已退役(git 历史可考) |
-| 迭代 33 | 待开工 | reports/需求卡片-存档制数据层改造批-2026-10-18.md
reports/需求卡片-选档界面新建批-2026-10-18.md
reports/需求卡片-主菜单三入口化批-2026-10-18.md | 2026-10-21 | ≈2.5 周〔用户特批 2026-10-21 超 2 周上限〕 | — |
-| 迭代 34 | 待开工 | reports/需求卡片-敌人表深度带换代批-2026-10-21.md
reports/需求卡片-信息迷雾可见性批-2026-10-21.md | 2026-10-21 | ≈2 周 | — |
-| 迭代 35 | 待开工 | reports/需求卡片-节点图生成器核心批-2026-10-21.md
reports/需求卡片-节点图消费侧换代批-2026-10-21.md | 2026-10-21 | ≈3 周〔用户特批 2026-10-21 超 2 周上限〕 | — |
+| 迭代 31 | 已完成(2026-10-19) | 已退役(git 历史可考) | 2026-10-18 | ≈7.5 个工作日 | 已退役(git 历史可考) |
+| 迭代 32 | 已完成(2026-10-21) | 已退役(git 历史可考) | 2026-10-20 | ≈8.75 个工作日 | 已退役(git 历史可考) |
+| 迭代 33 | 待开工 | reports/需求卡片-存档制数据层改造批-2026-10-18.md
reports/需求卡片-选档界面新建批-2026-10-18.md
reports/需求卡片-主菜单三入口化批-2026-10-18.md | 2026-10-21 | ≈13.25 个工作日〔用户特批 2026-10-21 超 10 个工作日〕 | — |
+| 迭代 34 | 待开工 | reports/需求卡片-敌人表深度带换代批-2026-10-21.md
reports/需求卡片-信息迷雾可见性批-2026-10-21.md | 2026-10-21 | ≈11 个工作日〔用户特批 2026-10-21 超 10 个工作日〕 | — |
+| 迭代 35 | 待开工 | reports/需求卡片-节点图生成器核心批-2026-10-21.md
reports/需求卡片-节点图消费侧换代批-2026-10-21.md | 2026-10-21 | ≈15.25 个工作日〔用户特批 2026-10-21 超 10 个工作日〕 | — |
- 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。
- 「已退役(git 历史可考)」= 需求卡片或实现报告曾存在,已按「证据只留最新」退役;已完成迭代的实现报告列只填 reports/ 现存路径或本保留字,不填「—」。
@@ -84,7 +84,7 @@
> 模板先例 = 循环 1 计划书(`.zcode/plans/battle-stage-node2d-loop-plan-2026-09-26.md`,已完整跑通收口)。每迭代照此八件成文,缺件不开工。
>
-> **迭代粒度界定(对齐敏捷迭代/Sprint)**:一个迭代 = 一句迭代目标 + **3–8 个更改任务** + 一份计划书 loop + 一次合并登记,交付一个可验证增量(≈一次迭代交付)。单交付物不成迭代——并入相邻迭代当任务卡;用户输入闸未解的任务不进迭代(留待办清单当 backlog,解闸后编入下一个迭代);**迭代周期 ≈ 一周左右**(2026-10-11 用户裁定——原「软时间盒 ≤3 个工作日,超限即切迭代」系 3abb3bd2 成文时自造、用户从未立过此规,就此废弃)。**里程碑 = 2–4 个迭代的发布级目标 + 出口验收闸(≈Release)**。
+> **迭代粒度界定(对齐敏捷迭代/Sprint)**:一个迭代 = 一句迭代目标 + **3–8 个更改任务** + 一份计划书 loop + 一次合并登记,交付一个可验证增量(≈一次迭代交付)。单交付物不成迭代——并入相邻迭代当任务卡;用户输入闸未解的任务不进迭代(留待办清单当 backlog,解闸后编入下一个迭代);**迭代周期**:常规 5–10 个工作日(1–2 周)、直接编;超过 10 个工作日(超过 2 周)须经用户确认;低于 5 或超过 20 个工作日不得编(硬下限/硬上限,2026-10-21 用户裁定;列形态与闸判据见 doc-conventions §12.2 与流水线闸)。**里程碑 = 2–4 个迭代的发布级目标 + 出口验收闸(≈Release)**。
>
1. **计划书**(`.zcode/plans/<迭代名>-loop-plan-<日期>.md`):迭代目标与完成定义 / 现状事实(代码级,开工自行复核)/ 设计契约(违反即返工,标 🔴 触碰=L3 停机)/ 范围边界 / 任务卡 T0..Tn(逐卡估时)/ 验证闸 / 异常分级 / 代拍板白名单。
2. **T0 开工**:建 worktree + 基线复读记档(冒烟/探针/三闸/MC 与基线数据逐项比对基准)+ `git status` 归属核对(并行遗留只登记不触碰)。
diff --git a/tools/pipeline_gate.py b/tools/pipeline_gate.py
index b1a9911a..61c0127e 100644
--- a/tools/pipeline_gate.py
+++ b/tools/pipeline_gate.py
@@ -4,7 +4,7 @@ r"""pipeline_gate.py — 工作流程流水线闸(待办清单条目状态机
职责:机检待办清单条目(标题元数据/属性齐备/状态词白名单/条件凭据/状态段累积制在场约束/特批/
零命中)与 roadmap 迭代总表(六列/状态四形态/卡片与报告存在性/编入时间与预计周期的
- 历史行「—」豁免/周期≤2 周可特批豁免/单元格白名单/零命中);「已编迭代↔已写卡段↔迭代行
+ 历史行「—」豁免/周期三条线(<5 与 >20 判红、超 10 须带日期特批标记)/单元格白名单/零命中);「已编迭代↔已写卡段↔迭代行
卡片列」交叉核只此一处。2026-10-18 卡片冲突修订批补两条卡片机检:C1 关联文档同步面的
文档义务口径(生效 2026-10-17)、C2 设计事实源声明(生效 2026-10-18)——两条都按文件名
日期只追新规生效日之后的卡,旧卡属 git 历史留档不回头改。2026-10-21 验收闭合批补 C3:
@@ -68,7 +68,7 @@ HEADING_RE = re.compile(r"^(#{1,4})\s+")
SEP_ROW_RE = re.compile(r"^\|[\s\-|:]+$")
STATUS_COL_RE = re.compile(
r"^(待开工|进行中|已完成\(\d{4}-\d{2}-\d{2}\)|已终止\(\d{4}-\d{2}-\d{2}\))$")
-WEEKS_RE = re.compile(r"^≈(\d+(?:\.\d+)?)\s*周$")
+PERIOD_RE = re.compile(r"^≈(\d+(?:\.\d+)?)\s*个工作日$")
ITER_CODE_COL_RE = re.compile(r"^迭代\s*(\d+)")
@@ -304,7 +304,7 @@ def cell_shape(cell, card_col=False):
return "成段叙述(卡片列一格一行一卡,禁叙述文字)"
return None
if "。" in cell or "," in cell or len(cell) > 60:
- return "成段叙述(只许路径/日期/状态词/保留字/—/≈N 周/特批标记)"
+ return "成段叙述(只许路径/日期/状态词/保留字/—/≈N 个工作日/特批标记)"
return None
@@ -325,7 +325,7 @@ def check_iter_table(block, issues, where, root):
if len(cells) != 6:
issues.append((where, ln, "六列数", "本行 %d 列(须恰六列)" % len(cells)))
continue
- code, status, cards, date, weeks, report = cells
+ code, status, cards, date, period, report = cells
for ci, cell in enumerate(cells):
bad = cell_shape(cell, card_col=(ci == 2))
if bad:
@@ -347,16 +347,24 @@ def check_iter_table(block, issues, where, root):
"需求卡片列 %s 相对仓库根不存在" % part))
if date != "—" and not re.fullmatch(r"\d{4}-\d{2}-\d{2}", date):
issues.append((where, ln, "编入时间", "「%s」须为 YYYY-MM-DD(历史迭代不可考填「—」)" % date))
- # 预计周期:≈N 周(N≤2);超 2 周须格内带日期特批标记(§12.2/§12.4);历史行「—」跳过
- week_marks = APPROVAL_RE.findall(weeks)
- week_core = APPROVAL_RE.sub("", weeks).strip()
- wm = None if week_core == "—" else WEEKS_RE.match(week_core)
- if week_core != "—" and wm is None:
+ # 预计周期:≈N 个工作日(估时中值精确值);<5/>20 硬判红(特批标记不放行);10 2 and not any(DATE_RE.search(mk) for mk in week_marks):
- issues.append((where, ln, "预计周期",
- "「%s」超 2 周且无带日期特批标记〔用户特批 YYYY-MM-DD …〕" % weeks))
+ "「%s」须为「≈N 个工作日」形态(精确值不取整;历史迭代不可考填「—」)" % period))
+ elif pm is not None:
+ wd = float(pm.group(1))
+ if wd < 5:
+ issues.append((where, ln, "预计周期",
+ "「%s」低于 5 个工作日硬下限,不得编入" % period))
+ elif wd > 20:
+ issues.append((where, ln, "预计周期",
+ "「%s」超过 20 个工作日硬上限,特批标记不放行,须拆批" % period))
+ elif wd > 10 and not any(DATE_RE.search(mk) for mk in per_marks):
+ issues.append((where, ln, "预计周期",
+ "「%s」超 10 个工作日且无带日期特批标记〔用户特批 YYYY-MM-DD …〕" % period))
# 实现报告:已完成=存在路径或退役保留字(历史报告已按「证据只留最新」退役),禁「—」
done = status_n.startswith("已完成(")
report_n = norm_parens(report)