From 845216266516385435bd7f26341eaa3587e7fcac Mon Sep 17 00:00:00 2001
From: DKChan <524912269@qq.com>
Date: Tue, 27 Oct 2026 04:08:31 +0800
Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E6=8E=92(=E8=BF=AD=E4=BB=A341)?=
=?UTF-8?q?=EF=BC=8B=E9=97=B8=E4=BA=A4=E5=8F=89=E6=A0=B8=E8=AF=AD=E4=B9=89?=
=?UTF-8?q?=E6=89=A9=E5=B1=95:=20=E5=8D=A1=E2=91=A1=E6=A0=B8=E5=BF=83?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9D=A2=E7=BB=93=E6=9E=84=E6=94=B6=E6=95=9B?=
=?UTF-8?q?=E6=89=B9(=E2=89=887.9d)=E2=86=92=E5=8D=A1=E2=91=A2=E5=91=88?=
=?UTF-8?q?=E7=8E=B0=E5=B1=82=E7=BB=93=E6=9E=84=E6=94=B6=E6=95=9B=E6=89=B9?=
=?UTF-8?q?(=E2=89=885.3d)=E7=BC=96=E5=85=A5=E8=BF=AD=E4=BB=A341,=E5=90=88?=
=?UTF-8?q?=E8=AE=A1=E2=89=8813.15=E4=B8=AA=E5=B7=A5=E4=BD=9C=E6=97=A5?=
=?UTF-8?q?=E3=80=94=E7=94=A8=E6=88=B7=E7=89=B9=E6=89=B9=202026-10-27=20?=
=?UTF-8?q?=E8=B6=85=2010=20=E4=B8=AA=E5=B7=A5=E4=BD=9C=E6=97=A5=E3=80=95?=
=?UTF-8?q?=E2=80=94=E2=80=94=E4=B8=89=E8=BF=AD=E4=BB=A3/=E4=B8=A4?=
=?UTF-8?q?=E8=BF=AD=E4=BB=A3+=E7=89=B9=E6=89=B9=E4=B8=A4=E6=A1=88?=
=?UTF-8?q?=E7=94=A8=E6=88=B7=E8=A3=81=E5=90=8E=E6=A1=88;=E5=8D=A1?=
=?UTF-8?q?=E5=BA=8F=3D=E6=89=A7=E8=A1=8C=E9=A1=BA=E5=BA=8F;=E5=BE=85?=
=?UTF-8?q?=E5=8A=9E=E6=9D=A1=E7=9B=AE=E7=8A=B6=E6=80=81=E6=8E=A8=E8=BF=9B?=
=?UTF-8?q?=E5=B7=B2=E7=BC=96=E8=BF=AD=E4=BB=A341;=E9=97=B8=E4=BF=AE?=
=?UTF-8?q?=E8=AE=A2=3D=E4=BA=A4=E5=8F=89=E6=A0=B8=E4=BB=8E=E3=80=8C?=
=?UTF-8?q?=E6=9D=A1=E7=9B=AE=E5=8D=95=E8=BF=AD=E4=BB=A3=E5=8F=B7=C3=97?=
=?UTF-8?q?=E5=8D=95=E5=8D=A1=E8=B7=AF=E5=BE=84=E3=80=8D=E6=89=A9=E5=B1=95?=
=?UTF-8?q?=E4=B8=BA=E3=80=8C=E6=AF=8F=E5=B7=B2=E7=BC=96=E8=BF=AD=E4=BB=A3?=
=?UTF-8?q?=E6=AE=B5=C3=97=E6=9D=A1=E7=9B=AE=E5=8D=A1=E9=9B=86any=E8=A6=86?=
=?UTF-8?q?=E7=9B=96=E3=80=8D(check=5Fstatus=E8=BF=94=E5=9B=9E=E5=B7=B2?=
=?UTF-8?q?=E7=BC=96=E8=BF=AD=E4=BB=A3=E5=8F=B7=E5=88=97=E8=A1=A8/links?=
=?UTF-8?q?=E6=8C=89=E6=AE=B5=E5=B1=95=E5=BC=80/cross=5Fcheck=E6=8C=89?=
=?UTF-8?q?=E8=A1=8C=E6=A0=B8=E6=9D=A1=E7=9B=AE=E8=87=B3=E5=B0=91=E4=B8=80?=
=?UTF-8?q?=E5=8D=A1)=E2=80=94=E2=80=94=E4=B8=80=E6=9D=A1=E7=9B=AE?=
=?UTF-8?q?=E5=A4=9A=E5=8D=A1=E5=88=86=E7=BC=96=E5=A4=9A=E8=BF=AD=E4=BB=A3?=
=?UTF-8?q?=E6=98=AF=E6=9C=AC=E6=AC=A1=E7=BC=96=E6=8E=92=E7=9A=84=E7=9C=9F?=
=?UTF-8?q?=E5=AE=9E=E5=BD=A2=E6=80=81,=E6=97=A7=E6=A8=A1=E5=9E=8B?=
=?UTF-8?q?=E5=8D=95=E5=80=BC=E5=8F=96=E6=9C=AB=E6=AE=B5=E6=BC=8F=E6=A0=B8?=
=?UTF-8?q?40=E6=AE=B5=E4=B8=9441=E6=AE=B5=E8=AF=AF=E6=AF=9440=E8=A1=8C?=
=?UTF-8?q?=E5=8D=A1;=E5=8D=A1=E7=BA=A7=E6=98=A0=E5=B0=84(=E5=93=AA?=
=?UTF-8?q?=E5=BC=A0=E5=8D=A1=E7=BC=96=E5=93=AA=E4=B8=AA=E8=BF=AD=E4=BB=A3?=
=?UTF-8?q?)=E4=BB=8D=E5=BD=92=E7=BC=96=E6=8E=92=E5=9B=9B=E6=9F=A5?=
=?UTF-8?q?=E4=B8=8E=E4=BA=BA=E5=B7=A5,=E9=97=B8=E5=8F=AA=E9=98=B2?=
=?UTF-8?q?=E5=BC=95=E7=94=A8=E6=96=AD=E8=A3=82;pipeline=5Fgate=E7=BB=BF(5?=
=?UTF-8?q?2=E6=9D=A1=E7=9B=AE/41=E8=A1=8C/4=E9=93=BE/12=E5=8D=A1)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
roadmap.md | 1 +
tools/pipeline_gate.py | 31 +++++++++++++++++++------------
待办清单.md | 2 +-
3 files changed, 21 insertions(+), 13 deletions(-)
diff --git a/roadmap.md b/roadmap.md
index e43ce854..ecd6f58a 100644
--- a/roadmap.md
+++ b/roadmap.md
@@ -74,6 +74,7 @@
| 迭代 38 | 已完成(2026-10-26) | 已退役(git 历史可考) | 2026-10-26 | ≈5.225 个工作日 | 已退役(git 历史可考) |
| 迭代 39 | 待开工 | reports/需求卡片-冒险域拆件与账本实体化批-2026-10-26.md
reports/需求卡片-同调配装充能域封装批-2026-10-26.md
reports/需求卡片-技能池情境条件触发器批-2026-10-26.md | 2026-10-26 | ≈10.15 个工作日〔用户特批 2026-10-26 超 10 个工作日〕 | — |
| 迭代 40 | 待开工 | reports/需求卡片-B1战斗域拆件批-2026-10-27.md
reports/需求卡片-结构小件定点修批-2026-10-26.md | 2026-10-27 | ≈6.225 个工作日 | — |
+| 迭代 41 | 待开工 | reports/需求卡片-核心数据面结构收敛批-2026-10-27.md
reports/需求卡片-呈现层结构收敛批-2026-10-27.md | 2026-10-27 | ≈13.15 个工作日〔用户特批 2026-10-27 超 10 个工作日〕 | — |
- 迭代 38 收口为带红合并〔用户特批 2026-10-26〕:09 静态扫描 S13 gdstyle 恶化 2 条经批准记入基线存量红(git 提交 c4c69701),卡② 停卡退上游,处方已于 2026-10-26 修订定稿 v1.3(git 提交 b3ea7532),随「gdstyle 存量债全量清偿」条目波 7 待编排。
- 历史行的「—」= 该列事实不可考:迭代 1~8 早于需求卡片制;编排时点与预计周期不再回溯,细节查 git 提交史。
diff --git a/tools/pipeline_gate.py b/tools/pipeline_gate.py
index d6ee448b..fe707606 100644
--- a/tools/pipeline_gate.py
+++ b/tools/pipeline_gate.py
@@ -148,7 +148,7 @@ def check_segment(word, line, issues, where):
def check_status(raw, line, issues, where):
- """判据 3+状态段累积制(§12.1)+特批/备选。返回 (状态词列表, 已编迭代号|None)。
+ """判据 3+状态段累积制(§12.1)+特批/备选。返回 (状态词列表, 已编迭代号列表|[])。
累积制:按+切段后段数不限,逐段各自合法;再查一条结构约束——下游段
(待写卡/已写卡/已编迭代)在场时禁残留未闭合设计段(带日期特批可豁免)。
@@ -177,13 +177,13 @@ def check_status(raw, line, issues, where):
if not segs:
issues.append((where, line, "状态词非法", "状态行内容为空"))
return [], None
- words, iter_no = [], None
+ words, iter_nos = [], []
for seg in segs:
w, it = check_segment(seg, line, issues, where)
if w:
words.append(w)
if it is not None:
- iter_no = it
+ iter_nos.append(it)
# 同一设计线只留最新一段:并现两段说明推进时忘了收旧段,或把另一条线的段
# 误写进本线条目;跨条设计线的未闭合依赖(如文档线已闭合写卡、美术线仍待设计)合法。
for track, name in ((DOC_DESIGN_WORDS, "文档线"), (ART_DESIGN_WORDS, "美术线")):
@@ -191,7 +191,7 @@ def check_status(raw, line, issues, where):
if len(hit) > 1:
issues.append((where, line, "设计线段并现",
"%s同时出现 %s(同线只留最新一段,§12.1)" % (name, "、".join(hit))))
- return words, iter_no
+ return words, iter_nos
def check_todo(text, issues, where, root):
@@ -228,7 +228,7 @@ def check_todo(text, issues, where, root):
issues.append((where, line, "属性缺失", "条目缺「**%s**」属性" % req))
if "状态" not in attrs:
continue
- words, iter_no = check_status(attrs["状态"], attr_line["状态"], issues, where)
+ words, iter_nos = check_status(attrs["状态"], attr_line["状态"], issues, where)
# 改动面:四档取多,+连接,禁重复、禁自造词
if "改动面" in attrs:
parts = [p.strip() for p in SURFACE_SEP_RE.split(attrs["改动面"]) if p.strip()]
@@ -297,8 +297,9 @@ def check_todo(text, issues, where, root):
if not need_gap and words and "缺口" in attrs:
issues.append((where, line, "缺口属性",
"状态为 %s,设计已闭合/后段不得残留「**缺口**」属性" % "、".join(words)))
- if iter_no is not None:
- links.append((line, iter_no, cards[0] if cards else None))
+ if iter_nos:
+ for no in iter_nos:
+ links.append((line, no, cards))
return links
@@ -423,17 +424,23 @@ def check_roadmap(text, issues, where, root):
def cross_check(links, index, issues, where):
- """唯一一处交叉核:已编迭代 N ↔ 总表迭代 N 行的需求卡片列。"""
- for line, no, card in links:
+ """唯一一处交叉核:已编迭代 N ↔ 总表迭代 N 行的需求卡片列。
+
+ 一条目可有多张已写卡分编多个迭代(状态段累积「已编迭代 40+已编迭代 41」):
+ 对每个已编迭代号核两件——总表该行存在;该行卡片列含本条目至少一张已写卡路径。
+ 哪张卡编哪个迭代的卡级映射由编排四查与人工核验,闸不猜卡级映射。
+ """
+ for line, no, cards in links:
row = index.get(no)
if row is None:
issues.append((where, line, "交叉核", "迭代总表无迭代 %d 行" % no))
- elif card is None:
+ elif not cards:
issues.append((where, line, "交叉核",
"已编迭代 %d 但条目无可引的已写卡路径(须先已写卡)" % no))
- elif card not in row[1]:
+ elif not any(c in row[1] for c in cards):
issues.append((where, line, "交叉核",
- "迭代 %d 行卡片列不含本条目已写卡路径 %s" % (no, card)))
+ "迭代 %d 行卡片列不含本条目任何已写卡路径(%s)"
+ % (no, "/".join(cards[:3]))))
def card_date(path):
diff --git a/待办清单.md b/待办清单.md
index abf112d2..6942a0c7 100644
--- a/待办清单.md
+++ b/待办清单.md
@@ -18,7 +18,7 @@
**改动面**:游戏代码+工具代码
-**状态**:文档设计已闭合+已写卡+已编迭代 40
+**状态**:文档设计已闭合+已写卡+已编迭代 40+已编迭代 41
#### 波 0:gdstyle 基线刷新——清 18 陈旧键+登记迭代 40 还债水位(2026-10-27 登记,来源=会话提及)