docs(规则修订): 改动四类+卡片/迭代两层模型落规约(2026-10-25 用户裁定 12 项全执行)——AGENTS「两类批」改「改动四类」(需求改动=唯一走写卡+迭代;工程/文档设计/美术素材=无卡无迭代直改)+五段铁律限定需求改动并补两层口径;process-conventions §2 首句改造+两层口径+工程直入拆分+「低于5不得编」改「任何卡可编入、<5=冻结待凑批」;doc-conventions §12 状态机补待执行与直改类序列、通道表拆需求性/工程性、§12.2 补冻结待凑批与周期新规;test-conventions 头注补测试归属句;术语表术语替换;pipeline_gate 状态词表/状态五形态/周期校验同步(<5 未处冻结态才红);三张违形卡(S9/S13/节点图换代收尾批)删除、结论回写条目、五条目状态改待执行;退役词四处顺带换代。全量域闸绿(回执 full 档,07 doc_link 较基线改善);子代理审计过(四小修已落)。.zcode/.qoder 六技能(iter/iter-plan/req-card/batch-closure/doc-design/asset-ingest)同批换代,不入 git

This commit is contained in:
DKChan committed 2026-10-25 06:57:29 +08:00
1 parent e20eb90d56
commit 9fdacdebeb
10 files changed
+39 -547

No files matched your search

+8 -8
View File
@@ -3,8 +3,8 @@
r"""pipeline_gate.py — 工作流程流水线闸(待办清单条目状态机+roadmap 迭代总表+需求卡片口径+一次交叉核)。
职责:机检待办清单条目(标题元数据/属性齐备/状态词白名单/条件凭据/状态段累积制在场约束/特批/
零命中)与 roadmap 迭代总表(六列/状态四形态/卡片与报告存在性/编入时间与预计周期的
历史行「—」豁免/周期三条线(<5 与 >20 判红、超 10 须带日期特批标记)/单元格白名单/零命中);「已编迭代↔已写卡段↔迭代行
零命中)与 roadmap 迭代总表(六列/状态五形态/卡片与报告存在性/编入时间与预计周期的
历史行「—」豁免/周期校验(>20 判红、超 10 须带日期特批标记、<5 须处「冻结待凑批」态)/单元格白名单/零命中);「已编迭代↔已写卡段↔迭代行
卡片列」交叉核只此一处。2026-10-18 卡片冲突修订批补两条卡片机检:C1 关联文档同步面的
文档义务口径(生效 2026-10-17)、C2 设计事实源声明(生效 2026-10-18)——两条都按文件名
日期只追新规生效日之后的卡,旧卡属 git 历史留档不回头改。2026-10-21 验收闭合批补 C3:
@@ -28,7 +28,7 @@ FACE_WORDS = ("文档轨", "美术轨", "双轨", "工程直入", "反哺点")
STATUS_WORDS = (
"待文档设计", "文档设计中", "文档设计已闭合",
"待美术设计", "美术设计中", "美术设计已闭合",
"待写卡", "已写卡", "已编迭代", "待裁决", "已写入",
"待写卡", "已写卡", "已编迭代", "待裁决", "已写入", "待执行",
)
# 这些状态 = 设计未闭合,条目必须带「**缺口**」属性;其余状态不得带
GAP_REQUIRED = ("待文档设计", "文档设计中", "待美术设计", "美术设计中")
@@ -67,7 +67,7 @@ ATTR_LINE_RE = re.compile(r"^\*\*(现状|缺口|归属|状态)\*\*\s*[::]\s*(.
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}\))$")
r"^(待开工|冻结待凑批|进行中|已完成\(\d{4}-\d{2}-\d{2}\)|已终止\(\d{4}-\d{2}-\d{2}\))$")
PERIOD_RE = re.compile(r"^≈(\d+(?:\.\d+)?)\s*个工作日$")
ITER_CODE_COL_RE = re.compile(r"^迭代\s*(\d+)")
@@ -337,7 +337,7 @@ def check_iter_table(block, issues, where, root):
status_n = norm_parens(status)
if not STATUS_COL_RE.match(status_n):
issues.append((where, ln, "总表状态列",
"「%s」不在四形态(待开工/进行中/已完成(YYYY-MM-DD)/已终止(YYYY-MM-DD))" % status))
"「%s」不在五形态(待开工/冻结待凑批/进行中/已完成(YYYY-MM-DD)/已终止(YYYY-MM-DD))" % status))
# 需求卡片列:路径逐卡查存在性;退役保留字与历史行「—」(无卡片制时期)豁免
if norm_parens(cards) not in (norm_parens(RESERVED_RETIRED), "—"):
for part in CARD_SEP_RE.split(cards):
@@ -347,7 +347,7 @@ 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 个工作日(估时中值精确值);<5/>20 硬判红(特批标记不放行);10<x≤20 须格内带日期特批标记(§12.2/§12.4);历史行「—」跳过
# 预计周期:≈N 个工作日(估时中值精确值);>20 硬判红(特批不放行);10<x≤20 须格内带日期特批标记(§12.2/§12.4);<5 ⇒ 行状态须为「冻结待凑批」(2026-10-25 两层模型:卡片无门槛、迭代层冻结线);历史行「—」跳过
per_marks = APPROVAL_RE.findall(period)
per_core = APPROVAL_RE.sub("", period).strip()
pm = None if per_core == "—" else PERIOD_RE.match(per_core)
@@ -356,9 +356,9 @@ def check_iter_table(block, issues, where, root):
"「%s」须为「≈N 个工作日」形态(精确值不取整;历史迭代不可考填「—」)" % period))
elif pm is not None:
wd = float(pm.group(1))
if wd < 5:
if wd < 5 and "冻结待凑批" not in status:
issues.append((where, ln, "预计周期",
"「%s」低于 5 个工作日硬下限,不得编入" % period))
"「%s」低于 5 个工作日且未处「冻结待凑批」态——小卡可编入,迭代总量不足须冻结待凑批" % period))
elif wd > 20:
issues.append((where, ln, "预计周期",
"「%s」超过 20 个工作日硬上限,特批标记不放行,须拆批" % period))