docs(产品需求): 需求基线拆薄为三档(大厂标准),doc-links 增别名解析
产品需求设计文档.md v1.9 → v2.0(2691 → 1816 行): - 新增 §2 背景·目标用户·典型场景·成功指标,§3.2 产品级非目标表, §4 P0/P1/P2 需求总览(19 行);§9 收窄为缺口清单与推进顺序。 - 拆出 docs/产品需求/参考产品复刻明细.md(803 行):复刻基线 + 定值/遥测/开入开出/事件/元件/录波/记录/规约逐项差额与完成判据。 - 拆出 docs/架构设计/系统架构与硬件规格.md(215 行):运行时架构 (就绪位表/机制表/启动时序)+ V0.1 硬件规格;与项目架构总览 定分工——位表/机制表/时序图/引脚表以新档为准。 引用同步:AGENTS.md 引脚表指针改指系统架构与硬件规格 §2.2; docs/README.md 目录树与索引四处重写;故障录波三处「录波采样率」 行指针改指复刻明细 §7;PRD §11 补两新档指针。 门禁工具:check_doc_links.py 裸名解析增别名后缀匹配(「见需求档 §5.16」形态),§ 链遇紧邻已登记别名换目标;section_aliases.json 登记 需求档 / 架构硬件档 / 复刻明细(档) / 产品需求设计文档 / 系统架构与硬件规格。 终验:doc --all rc=0(3038 处 / 可判定 80%);mermaid --all 64 围栏 0 命中;改动文件字节卫生全过;新旧逐行差集审计无丢行。
This commit is contained in:
@@ -300,6 +300,15 @@ def resolve_name(name: str, by_stem):
|
||||
apath = (REPO_ROOT / alias) if alias else None
|
||||
if apath is not None and apath.exists():
|
||||
return apath, "alias"
|
||||
# 别名后缀匹配:STEM_RE 贪心会把挂在前面的动词/修饰词一并吃进 name
|
||||
# (「规格见需求档」「其行为以需求档」),精确查表落空后按**最长别名**做 endswith。
|
||||
# 只放宽「此前判不了」的 token(原来进 skip),不改变已能判定的目标。
|
||||
if not cand:
|
||||
for key in sorted(load_aliases(), key=len, reverse=True):
|
||||
if key != name and name.endswith(key):
|
||||
apath = REPO_ROOT / load_aliases()[key]
|
||||
if apath.exists():
|
||||
return apath, "alias"
|
||||
return None, None
|
||||
|
||||
|
||||
@@ -431,9 +440,22 @@ def check_section_refs(path: pathlib.Path, lines, errors, warns):
|
||||
continue
|
||||
if tgt is None and prev_tgt is not None:
|
||||
between = line[prev_end:m.start()]
|
||||
if not chain_blocked(between, by_stem):
|
||||
# 继承前一个 § 的目标**与它的判定档位**(自引用链仍按自引用处理)
|
||||
tgt, kind = prev_tgt, prev_kind
|
||||
# 中间挂着的词若是已登记别名且**紧邻** §(间隔 ≤ SEC_MAX_GAP 字符),
|
||||
# 视为换目标,不许链着继承前一个 § 的文档;远处的词不算
|
||||
gap_txt = between
|
||||
am = STEM_RE.search(line[max(0, m.start() - 120):m.start()])
|
||||
if am and not any(c in SEC_TERMINATORS for c in gap_txt):
|
||||
# § 前紧邻的裸名(STEM_RE 锚定在窗口尾)若能解析成**另一篇**文档
|
||||
# (「…§2.6 的 H1/H2,属需求档 §9.1.1」),链在此换目标;
|
||||
# 「本文 §3 / §4」的「本文」解析不出文档 → 仍走原继承。
|
||||
atgt, _akind = resolve_name(am.group(1), by_stem)
|
||||
if atgt is not None and atgt != prev_tgt:
|
||||
prev_end, prev_tgt, prev_kind = None, None, None
|
||||
tgt = None
|
||||
if tgt is None and prev_tgt is not None:
|
||||
if not chain_blocked(between, by_stem):
|
||||
# 继承前一个 § 的目标**与它的判定档位**(自引用链仍按自引用处理)
|
||||
tgt, kind = prev_tgt, prev_kind
|
||||
if tgt is None:
|
||||
sm = STEM_RE.search(window)
|
||||
if sm:
|
||||
|
||||
@@ -2,5 +2,11 @@
|
||||
"内存方案": "docs/内存管理/RAM使用分析与优化方案.md",
|
||||
"架构总览": "docs/架构设计/项目架构总览.md",
|
||||
"规划": "docs/算法/继电保护功能复现规划.md",
|
||||
"需求档": "docs/产品需求/产品需求设计文档.md",
|
||||
"产品需求设计文档": "docs/产品需求/产品需求设计文档.md",
|
||||
"架构硬件档": "docs/架构设计/系统架构与硬件规格.md",
|
||||
"系统架构与硬件规格": "docs/架构设计/系统架构与硬件规格.md",
|
||||
"复刻明细档": "docs/产品需求/参考产品复刻明细.md",
|
||||
"复刻明细": "docs/产品需求/参考产品复刻明细.md",
|
||||
"V0.0": "docs/硬件平台/V0.0_网表详细分析报告.md"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user