Compare commits
3 Commits
8b78c72bb9
...
0ffaad03fd
| Author | SHA1 | Date | |
|---|---|---|---|
| 0ffaad03fd | |||
|
|
50a8bf2f8c | ||
|
|
216a056ae1 |
@ -529,7 +529,7 @@ modules:
|
|||||||
name: 意图目录
|
name: 意图目录
|
||||||
area: backend
|
area: backend
|
||||||
status: in_progress
|
status: in_progress
|
||||||
progress: 23
|
progress: 31
|
||||||
updated: 2026-10-04
|
updated: 2026-10-04
|
||||||
note: "两层模型(人持有的意图目录 .blueprint/catalog.md + 蓝图正文),书装意图、指向事实;卡侧 intent 钉版,agent 编译可判定 /goal,确认卡兼作最小任务简报,回执写进提交。IC1 设计已确认(最小文件优先方案);IC2–IC4 只新增文档、可与 P8 并行,门控与接线等 P8 收口后做,IC13 按实测数据决定去留。"
|
note: "两层模型(人持有的意图目录 .blueprint/catalog.md + 蓝图正文),书装意图、指向事实;卡侧 intent 钉版,agent 编译可判定 /goal,确认卡兼作最小任务简报,回执写进提交。IC1 设计已确认(最小文件优先方案);IC2–IC4 只新增文档、可与 P8 并行,门控与接线等 P8 收口后做,IC13 按实测数据决定去留。"
|
||||||
position: [4000, 950]
|
position: [4000, 950]
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# 意图目录(intent-catalog)
|
# 意图目录(intent-catalog)
|
||||||
|
|
||||||
> status: in_progress | created: 2026-10-04 | 设计:docs/tasks/2026-10-04-intent-catalog-design.md(IC1 ✅,用户 2026-10-04 确认)| 指南:docs/ai-context/intent-catalog-guide.md(IC2 ✅)| 目录:.blueprint/catalog.md 1.0(IC3 ✅)| 下一步:IC4(跨 agent 纸面编译)
|
> status: in_progress | created: 2026-10-04 | 设计:docs/tasks/2026-10-04-intent-catalog-design.md(IC1 ✅,用户 2026-10-04 确认)| 指南:docs/ai-context/intent-catalog-guide.md(IC2 ✅)| 目录:.blueprint/catalog.md 1.0(IC3 ✅)| 下一步:IC5(P8 收口后首次真实 /goal)
|
||||||
> 来源:2026-10-03~04 与用户讨论(/goal 与 Loop Engineering 操作手册、目录/正文模型、承重墙),以及侦察工作流 wf_6dc3756a-b72 的重叠与冲突扫描。
|
> 来源:2026-10-03~04 与用户讨论(/goal 与 Loop Engineering 操作手册、目录/正文模型、承重墙),以及侦察工作流 wf_6dc3756a-b72 的重叠与冲突扫描。
|
||||||
|
|
||||||
## 概述
|
## 概述
|
||||||
@ -117,11 +117,13 @@ agent 开发子项目时躲不掉的现象。每面墙都要回答四个问题
|
|||||||
- depends: IC2
|
- depends: IC2
|
||||||
- acceptance: "agent_verify: [CLI] grep -c 'catalog_version: 1.0' → 1;grep -cE '^## INT-[0-9]{2} ' 介于 2–4;wc -l ≤200 且 wc -c ≤8192;grep -cE '^- (status|progress|doc|files|acceptance|model):' → 0;指南中的 path 指针检查 → 0 悬空;cat .blueprint/modules/*.md | grep -c '^### ' 前后相等。human_verify: 用户逐章确认意图与不做(1.0 为大版本,人定稿),提交带 Feature-Confirmed: true。"
|
- acceptance: "agent_verify: [CLI] grep -c 'catalog_version: 1.0' → 1;grep -cE '^## INT-[0-9]{2} ' 介于 2–4;wc -l ≤200 且 wc -c ≤8192;grep -cE '^- (status|progress|doc|files|acceptance|model):' → 0;指南中的 path 指针检查 → 0 悬空;cat .blueprint/modules/*.md | grep -c '^### ' 前后相等。human_verify: 用户逐章确认意图与不做(1.0 为大版本,人定稿),提交带 Feature-Confirmed: true。"
|
||||||
|
|
||||||
### 📋 IC4 — 跨 agent 纸面编译:Codex 或 DSH 按指南对书签章编译确认卡(不粘贴)
|
### ✅ IC4 — 跨 agent 纸面编译:Codex 或 DSH 按指南对书签章编译确认卡(不粘贴)
|
||||||
- status: todo
|
- status: done
|
||||||
- complexity: S
|
- complexity: S
|
||||||
- files: .blueprint/modules/intent-catalog.md
|
- files: .blueprint/modules/intent-catalog.md
|
||||||
- depends: IC3
|
- depends: IC3
|
||||||
|
- notes: 2026-10-04 报备改断言:目标章由「书签章」改为指定 INT-02。理由:书签所指的 INT-01(P8)卡在统筹会话的 agent-client-parity.md 中,且几乎全为 ✅,纸面编译无测试价值;INT-02 挂有 IC6–IC10 五张待做卡,纸面编译即 IC5 的预演。
|
||||||
|
- result: 2026-10-04 Codex 纸面编译通过:9 个字段齐全;标签 blob 8392d18 等于目录 blob;5 条终点可追溯到 IC6–IC10 的 agent_verify;按当时的黑名单命中 0。Codex 环境起不了 Bash,改用语义等价的 PowerShell 执行;它报告的 5 处指南不足和主会话核对时发现的 2 处(字节数量法与平台有关;确认卡终点被改写成「均符合预期」,与 /goal 文本写法不一致)已修进指南。按新黑名单,该卡第 1 条终点会命中「符合预期」,这正是本次的发现。
|
||||||
- acceptance: "agent_verify: [CLI] git log -1 --grep='IC4' --format=%B → 含 项目、分支/worktree、HEAD、纳入卡、终点、终验待办、停止找人、没验什么、作废 9 字段与 Compiled-By: <非 Claude 客户端>;标签 blob 等于该提交中 .blueprint/catalog.md 的短 blob;每条终点可在来源卡 agent_verify 原文找到;过程词黑名单 grep → 0。"
|
- acceptance: "agent_verify: [CLI] git log -1 --grep='IC4' --format=%B → 含 项目、分支/worktree、HEAD、纳入卡、终点、终验待办、停止找人、没验什么、作废 9 字段与 Compiled-By: <非 Claude 客户端>;标签 blob 等于该提交中 .blueprint/catalog.md 的短 blob;每条终点可在来源卡 agent_verify 原文找到;过程词黑名单 grep → 0。"
|
||||||
|
|
||||||
### 📋 IC5 — 首次真实 /goal:为 Phase 4 的卡编译 → 人粘贴 → 收口回执
|
### 📋 IC5 — 首次真实 /goal:为 Phase 4 的卡编译 → 人粘贴 → 收口回执
|
||||||
@ -134,6 +136,7 @@ agent 开发子项目时躲不掉的现象。每面墙都要回答四个问题
|
|||||||
### 📋 IC6 — intent-gate.cjs 核心:结构、防膨胀、类型指针、卡侧引用,加 --self-test
|
### 📋 IC6 — intent-gate.cjs 核心:结构、防膨胀、类型指针、卡侧引用,加 --self-test
|
||||||
- status: todo
|
- status: todo
|
||||||
- complexity: M
|
- complexity: M
|
||||||
|
- intent: INT-02@1.0
|
||||||
- files: .claude/hooks/intent-gate.cjs
|
- files: .claude/hooks/intent-gate.cjs
|
||||||
- depends: IC3, P8 收口
|
- depends: IC3, P8 收口
|
||||||
- acceptance: "agent_verify: [gate 脚本] node .claude/hooks/intent-gate.cjs --self-test → exit 0 且输出 self-test ok,内置 6 类坏样例(悬空 path:、未知 INT、超长字段、status: 键、card: 指向不存在的卡、探索章缺预算或收敛信号)各恰好 1 条警告;node .claude/hooks/intent-gate.cjs → exit 0、真实目录 0 警告;INTENT_CATALOG=/nonexistent → 无输出、exit 0。"
|
- acceptance: "agent_verify: [gate 脚本] node .claude/hooks/intent-gate.cjs --self-test → exit 0 且输出 self-test ok,内置 6 类坏样例(悬空 path:、未知 INT、超长字段、status: 键、card: 指向不存在的卡、探索章缺预算或收敛信号)各恰好 1 条警告;node .claude/hooks/intent-gate.cjs → exit 0、真实目录 0 警告;INTENT_CATALOG=/nonexistent → 无输出、exit 0。"
|
||||||
@ -141,6 +144,7 @@ agent 开发子项目时躲不掉的现象。每面墙都要回答四个问题
|
|||||||
### 📋 IC7 — 门控只读视图 --report/--impact/--pending 与目录提交审计
|
### 📋 IC7 — 门控只读视图 --report/--impact/--pending 与目录提交审计
|
||||||
- status: todo
|
- status: todo
|
||||||
- complexity: M
|
- complexity: M
|
||||||
|
- intent: INT-02@1.0
|
||||||
- files: .claude/hooks/intent-gate.cjs
|
- files: .claude/hooks/intent-gate.cjs
|
||||||
- depends: IC6
|
- depends: IC6
|
||||||
- acceptance: "agent_verify: [gate 脚本] --self-test 夹具:章 rev 1.1 而 📋 卡钉 1.0 → --impact 报 stale;钉墓碑章 → orphan;只有模块默认挂靠 → low_confidence;前缀 🔵 而 status: todo → --report 报 divergence 并标 status_source;含 human_verify 而无终验行的 ✅ 卡 → --pending 列出;缺 Feature-Confirmed 的目录提交 → --report 审计列出;全部 exit 0,运行前后 sha256sum .blueprint/catalog.md .blueprint/modules/*.md 不变。"
|
- acceptance: "agent_verify: [gate 脚本] --self-test 夹具:章 rev 1.1 而 📋 卡钉 1.0 → --impact 报 stale;钉墓碑章 → orphan;只有模块默认挂靠 → low_confidence;前缀 🔵 而 status: todo → --report 报 divergence 并标 status_source;含 human_verify 而无终验行的 ✅ 卡 → --pending 列出;缺 Feature-Confirmed 的目录提交 → --report 审计列出;全部 exit 0,运行前后 sha256sum .blueprint/catalog.md .blueprint/modules/*.md 不变。"
|
||||||
@ -148,6 +152,7 @@ agent 开发子项目时躲不掉的现象。每面墙都要回答四个问题
|
|||||||
### 📋 IC8 — 接线:lefthook 加 intent-gate、AGENTS.md 块外加 T5 与启动读书签、agent-button-system 单处改名
|
### 📋 IC8 — 接线:lefthook 加 intent-gate、AGENTS.md 块外加 T5 与启动读书签、agent-button-system 单处改名
|
||||||
- status: todo
|
- status: todo
|
||||||
- complexity: S
|
- complexity: S
|
||||||
|
- intent: INT-02@1.0
|
||||||
- files: lefthook.yml, AGENTS.md, docs/ai-context/agent-button-system.md, docs/ai-context/intent-catalog-guide.md, .blueprint/modules/intent-catalog.md
|
- files: lefthook.yml, AGENTS.md, docs/ai-context/agent-button-system.md, docs/ai-context/intent-catalog-guide.md, .blueprint/modules/intent-catalog.md
|
||||||
- depends: IC6, P8 收口
|
- depends: IC6, P8 收口
|
||||||
- acceptance: "agent_verify: [YAML 解析] lefthook.yml 可解析且 pre-commit.commands.intent-gate.run 以 || true 结尾;[cargo test] cargo test onboarding → 0 failed;[CLI] git diff -U0 AGENTS.md 全部 hunk 位于 BLUEPRINT_MANAGED_START 行之前;grep -c '意图层 — AGENTS.md' docs/ai-context/agent-button-system.md → 0;临时 worktree 内提交一次「改章文不升 rev」→ pre-commit 输出 1 条警告且提交成功,验证后移除该 worktree。"
|
- acceptance: "agent_verify: [YAML 解析] lefthook.yml 可解析且 pre-commit.commands.intent-gate.run 以 || true 结尾;[cargo test] cargo test onboarding → 0 failed;[CLI] git diff -U0 AGENTS.md 全部 hunk 位于 BLUEPRINT_MANAGED_START 行之前;grep -c '意图层 — AGENTS.md' docs/ai-context/agent-button-system.md → 0;临时 worktree 内提交一次「改章文不升 rev」→ pre-commit 输出 1 条警告且提交成功,验证后移除该 worktree。"
|
||||||
@ -155,6 +160,7 @@ agent 开发子项目时躲不掉的现象。每面墙都要回答四个问题
|
|||||||
### 📋 IC9 — cargo test 锁定 parse_module_md 忽略 intent 与终验行
|
### 📋 IC9 — cargo test 锁定 parse_module_md 忽略 intent 与终验行
|
||||||
- status: todo
|
- status: todo
|
||||||
- complexity: S
|
- complexity: S
|
||||||
|
- intent: INT-02@1.0
|
||||||
- files: src-tauri/src/commands/blueprint.rs
|
- files: src-tauri/src/commands/blueprint.rs
|
||||||
- depends: P8 收口
|
- depends: P8 收口
|
||||||
- acceptance: "agent_verify: [cargo test] cargo test parse_module_md_ignores_intent_lines → 1 passed:含 intent、终验行与模块头 intent 的样本,和删去这些行的样本相比,tasks.len()、status、acceptance、notes 逐字段相等(只改 #[cfg(test)]);全量 cargo test 无 FAILED。"
|
- acceptance: "agent_verify: [cargo test] cargo test parse_module_md_ignores_intent_lines → 1 passed:含 intent、终验行与模块头 intent 的样本,和删去这些行的样本相比,tasks.len()、status、acceptance、notes 逐字段相等(只改 #[cfg(test)]);全量 cargo test 无 FAILED。"
|
||||||
@ -162,6 +168,7 @@ agent 开发子项目时躲不掉的现象。每面墙都要回答四个问题
|
|||||||
### 📋 IC10 — 书签交接:目录书签自持三行,coordination §0 改为指向书签
|
### 📋 IC10 — 书签交接:目录书签自持三行,coordination §0 改为指向书签
|
||||||
- status: todo
|
- status: todo
|
||||||
- complexity: S
|
- complexity: S
|
||||||
|
- intent: INT-02@1.0
|
||||||
- files: .blueprint/catalog.md, docs/tasks/2026-10-03-coordination.md
|
- files: .blueprint/catalog.md, docs/tasks/2026-10-03-coordination.md
|
||||||
- depends: IC7, IC8
|
- depends: IC7, IC8
|
||||||
- acceptance: "agent_verify: [gate 脚本] node .claude/hooks/intent-gate.cjs → 0 警告;[CLI] grep -A3 '^## 书签' .blueprint/catalog.md → 当前、终点、确认 三行且当前章存在未撤销;coordination §0(若仍存在)含指向书签的一行;提案附 --report 与 base blob;提交带 Feature-Confirmed: true。human_verify: 用户确认书签切换。"
|
- acceptance: "agent_verify: [gate 脚本] node .claude/hooks/intent-gate.cjs → 0 警告;[CLI] grep -A3 '^## 书签' .blueprint/catalog.md → 当前、终点、确认 三行且当前章存在未撤销;coordination §0(若仍存在)含指向书签的一行;提案附 --report 与 base blob;提交带 Feature-Confirmed: true。human_verify: 用户确认书签切换。"
|
||||||
|
|||||||
@ -170,14 +170,20 @@ agent 不得自行延长预算。
|
|||||||
- 要求 `git status --porcelain -- .blueprint/catalog.md` 输出为空:目录有未提交改动时不编译。
|
- 要求 `git status --porcelain -- .blueprint/catalog.md` 输出为空:目录有未提交改动时不编译。
|
||||||
- 取 catalog blob:`git rev-parse --short HEAD:.blueprint/catalog.md`。
|
- 取 catalog blob:`git rev-parse --short HEAD:.blueprint/catalog.md`。
|
||||||
2. **读书签**:书签指向当前章(P8 期间指向 coordination §0 的终点)。读该章的导语和 rev。
|
2. **读书签**:书签指向当前章(P8 期间指向 coordination §0 的终点)。读该章的导语和 rev。
|
||||||
3. **校验**:跑「离线检查」一节的全部命令(Phase 4 后改为 `node .claude/hooks/intent-gate.cjs --report INT-NN --impact`)。只要出现悬空指针、stale 或 orphan、防膨胀超限,就先修或先提案,不往下编译。
|
3. **校验**:跑「离线检查」一节的命令(Phase 4 后改为 `node .claude/hooks/intent-gate.cjs --report INT-NN --impact`)。
|
||||||
|
- 机器检查(第 1–7、9–11 条)必须全部通过。
|
||||||
|
- 第 8 条(钉版对照)和 `card:`、`#标题` 指针属于人工核对,核对结果写进确认卡;门控落地后改为全自动。
|
||||||
|
- 只要出现悬空指针、stale 或 orphan、防膨胀超限,就先修或先提案,不往下编译。
|
||||||
4. **收卡**
|
4. **收卡**
|
||||||
|
- 检查各纳入卡的 depends,未满足的写进确认卡的「前置」行。只要有未满足的前置,就只能做纸面编译,不能粘贴执行。
|
||||||
|
- depends 尽量写卡键或模块 id。像「P8 收口」这样的自然语言前置,要在确认卡里写明人工判定的结果。
|
||||||
- 取挂在本章、标题前缀为 📋 或 🔵 的卡。
|
- 取挂在本章、标题前缀为 📋 或 🔵 的卡。
|
||||||
- 没有可执行 agent_verify 的卡,列入「须先补 acceptance」,不进 goal。
|
- 没有可执行 agent_verify 的卡,列入「须先补 acceptance」,不进 goal。
|
||||||
5. **合成终点**
|
5. **合成终点**
|
||||||
- 取各卡 agent_verify 的合取,改写成在会话里能判定的形式:贴出命令和预期输出、纳入卡前缀都是 ✅、回执已写入。
|
- 取各卡 agent_verify 的合取,改写成在会话里能判定的形式:贴出命令和预期输出、纳入卡前缀都是 ✅、回执已写入。
|
||||||
- human_verify 不进终点,单列为终验待办。
|
- human_verify 不进终点,单列为终验待办。
|
||||||
- 过程词黑名单命中数必须为 0:「按方针」「符合设计」「设计已完成」「基本完成」,以及任何无法从会话输出判定的形容词。
|
- 过程词黑名单命中数必须为 0:「按方针」「符合设计」「设计已完成」「基本完成」「符合预期」,以及任何无法从会话输出判定的形容词。
|
||||||
|
- 确认卡和 /goal 文本里的终点写法必须一致,都写「命令 → 预期输出」。不能 /goal 里写得精确,确认卡里却改写成「均符合预期」。
|
||||||
- **探索章**不编译「意图的终点」,只编译本轮试验的终点:
|
- **探索章**不编译「意图的终点」,只编译本轮试验的终点:
|
||||||
- 做出可试用的 MVP 变体,写明最小动作和可演示方式;
|
- 做出可试用的 MVP 变体,写明最小动作和可演示方式;
|
||||||
- 校验命令通过;
|
- 校验命令通过;
|
||||||
@ -203,6 +209,7 @@ agent 不得自行延长预算。
|
|||||||
[INT-NN@X.Y#<blob7>] 目标确认卡
|
[INT-NN@X.Y#<blob7>] 目标确认卡
|
||||||
项目: <project_id> | 分支/worktree: <branch> @ <path> | HEAD: <sha7>
|
项目: <project_id> | 分支/worktree: <branch> @ <path> | HEAD: <sha7>
|
||||||
章意图: <一句> | 不做: <…>
|
章意图: <一句> | 不做: <…>
|
||||||
|
前置: <各纳入卡的 depends 及是否满足;有未满足的,注明「仅纸面」>
|
||||||
形态: 定型 | 探索(第 k/N 轮;收敛信号: <…>)
|
形态: 定型 | 探索(第 k/N 轮;收敛信号: <…>)
|
||||||
纳入卡: <卡键>(来源 agent_verify 原文)、<卡键>(…)
|
纳入卡: <卡键>(来源 agent_verify 原文)、<卡键>(…)
|
||||||
终点(合取): 1) <命令> → <预期输出> 2) … 3) 纳入卡均 ✅ 且已写 Goal-Receipt
|
终点(合取): 1) <命令> → <预期输出> 2) … 3) 纳入卡均 ✅ 且已写 Goal-Receipt
|
||||||
@ -234,13 +241,17 @@ Human-Pending: <待人终验项>
|
|||||||
|
|
||||||
试用期的检查全部是 shell 单行命令,在仓库根目录执行。期望输出写在每条后面的注释里。
|
试用期的检查全部是 shell 单行命令,在仓库根目录执行。期望输出写在每条后面的注释里。
|
||||||
|
|
||||||
|
- **没有 Bash 时**:命令按 POSIX shell(Git Bash)写成。部分客户端的沙箱里起不了 Bash,这时可以用语义等价的命令(PowerShell 等),并在确认卡的「没验什么」里注明用了哪种替代。
|
||||||
|
- **一律逐行解析**:不要对整份文件跑一个正则,字符类会跨行吞掉换行符,把有效指针误报成悬空。
|
||||||
|
- **只读演练不写盘**:所有检查都用管道或内存字符串完成,不创建临时文件。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. 版本行恰好一行
|
# 1. 版本行恰好一行
|
||||||
grep -c '^> catalog_version: ' .blueprint/catalog.md # → 1
|
grep -c '^> catalog_version: ' .blueprint/catalog.md # → 1
|
||||||
# 2. 有效章数(墓碑不计)
|
# 2. 有效章数(墓碑不计)
|
||||||
grep -cE '^## INT-[0-9]{2} ' .blueprint/catalog.md # → 章数
|
grep -cE '^## INT-[0-9]{2} ' .blueprint/catalog.md # → 章数
|
||||||
# 3. 体量
|
# 3. 体量
|
||||||
wc -l < .blueprint/catalog.md; wc -c < .blueprint/catalog.md # → ≤200 行、≤8192 字节
|
wc -l < .blueprint/catalog.md; git cat-file -s HEAD:.blueprint/catalog.md # → ≤200 行、≤8192 字节(量提交里的 blob;工作区可能是 CRLF,wc -c 会多算换行)
|
||||||
# 4. 禁用键与模型名
|
# 4. 禁用键与模型名
|
||||||
grep -cE '^- (status|progress|doc|files|acceptance|model):' .blueprint/catalog.md # → 0
|
grep -cE '^- (status|progress|doc|files|acceptance|model):' .blueprint/catalog.md # → 0
|
||||||
# 5. path 指针可解析(没有输出即通过)
|
# 5. path 指针可解析(没有输出即通过)
|
||||||
@ -254,8 +265,8 @@ grep -hoE 'intent: INT-[0-9]{2}@[0-9]+\.[0-9]+' .blueprint/modules/*.md | sort |
|
|||||||
awk '/^## INT-[0-9]{2} /{c=$2} /^- rev:/{print c, $3}' .blueprint/catalog.md
|
awk '/^## INT-[0-9]{2} /{c=$2} /^- rev:/{print c, $3}' .blueprint/catalog.md
|
||||||
# 9. 改模块 md 前后的任务卡计数应相等(新增卡时等于新增数),防止误写 ###
|
# 9. 改模块 md 前后的任务卡计数应相等(新增卡时等于新增数),防止误写 ###
|
||||||
cat .blueprint/modules/*.md | grep -c '^### '
|
cat .blueprint/modules/*.md | grep -c '^### '
|
||||||
# 10. goal 文本的过程词黑名单(把 /goal 文本存成临时文件后检查)
|
# 10. 确认卡和 /goal 文本的过程词黑名单(用管道检查,不写临时文件)
|
||||||
grep -cE '按方针|符合设计|设计已完成|基本完成' <goal 文本文件> # → 0
|
printf '%s\n' "$GOAL_TEXT" | grep -cE '按方针|符合设计|设计已完成|基本完成|符合预期' # → 0
|
||||||
# 11. 探索章的必填字段齐全(没有输出即通过)
|
# 11. 探索章的必填字段齐全(没有输出即通过)
|
||||||
awk '/^## /{if(e&&!(b&&s))print "缺预算或收敛信号: "c; c=$2;e=0;b=0;s=0} /^- 形态: 探索/{e=1} /^- 预算:/{b=1} /^- 收敛信号:/{s=1} END{if(e&&!(b&&s))print "缺预算或收敛信号: "c}' .blueprint/catalog.md
|
awk '/^## /{if(e&&!(b&&s))print "缺预算或收敛信号: "c; c=$2;e=0;b=0;s=0} /^- 形态: 探索/{e=1} /^- 预算:/{b=1} /^- 收敛信号:/{s=1} END{if(e&&!(b&&s))print "缺预算或收敛信号: "c}' .blueprint/catalog.md
|
||||||
```
|
```
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user