@cyning/harness 2.0.4 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,37 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [2.1.1] - 2026-06-30
8
+
9
+ ### Fixed
10
+
11
+ - **task 人工闸解析**:`lib/task-meta.js` 与 `wizard/gate-check.sh` 现在会去除 Markdown 反引号,避免将 `` `approved` `` 误判为 pending。
12
+ - 影响命令:`verify`、`gate-check`。
13
+
14
+ ### Notes
15
+
16
+ - **HG-RELEASE**:待维护者 publish `@cyning/harness@2.1.1` · tag `v2.1.1`
17
+ - patch · 无 CLI breaking · `npm test` 预期通过
18
+
19
+ ## [2.1.0] - 2026-06-30
20
+
21
+ ### Added
22
+
23
+ - **YAML-first 图谱模板**:`graph/templates/00_main.graph.yaml`、`10_flow_MAIN.graph.yaml`
24
+ - **编译脚本**:`scripts/graph_yaml_compile.js`(Node.js · `js-yaml`)从 `.graph.yaml` 生成 `.md`
25
+ - **校验脚本**:`scripts/verify-template-compile.sh` — 校验同步、无残留 `.ai.md`、生成物齐全
26
+ - **模板 v0.2**:`graph/templates/README.md` 更新复制流程;`99_mermaid_protocol.md` 升级 v3 YAML-first
27
+
28
+ ### Changed
29
+
30
+ - **图谱模板**:删除 `graph/templates/00_main.ai.md`、`10_flow_MAIN.ai.md`;`00_main.md`、`10_flow_MAIN.md` 改为生成物
31
+ - **版本**:`package.json` → **2.1.0**
32
+
33
+ ### Notes
34
+
35
+ - **HG-RELEASE**:待维护者 publish `@cyning/harness@2.1.0` · tag `v2.1.0`
36
+ - docs-only minor · 无 CLI breaking · `npm test` 预期通过
37
+
7
38
  ## [2.0.4] - 2026-06-21
8
39
 
9
40
  ### Added
@@ -1,10 +1,12 @@
1
1
  # 一致性审计报告 · 2026-06-15
2
2
 
3
- | 项 | 内容 |
4
- | --- | --- |
5
- | **状态** | `closed` · 后续任务已落盘 |
6
- | **触发** | [`prompts/PROMPT_doc_consistency_audit_v1_zh.md`](./prompts/PROMPT_doc_consistency_audit_v1_zh.md) |
7
- | **真值层** | L2 `docs/methodology/` |
3
+
4
+ | | 内容 |
5
+ | ------- | -------------------------------------------------------------------------------------------------- |
6
+ | **状态** | `closed` · 后续任务已落盘 |
7
+ | **触发** | `[prompts/PROMPT_doc_consistency_audit_v1_zh.md](./prompts/PROMPT_doc_consistency_audit_v1_zh.md)` |
8
+ | **真值层** | L2 `docs/methodology/` |
9
+
8
10
 
9
11
  ---
10
12
 
@@ -16,20 +18,22 @@ L2 真值链大体自洽,但存在 semver(v0.5 HGM 晚于 v1.0 闸门)、H
16
18
 
17
19
  ## 问题清单(按严重程度)
18
20
 
19
- | 级别 | ID | 问题 | 影响读者 | 建议改法 | 涉及文件 | 状态 |
20
- | --- | --- | --- | --- | --- | --- | --- |
21
- | P0 | SEM-01 | v0.5.x 在 semver 表位于 v1.0 后,数字易误读 | 以为 HGM 是 v1.0 前产品版 | Track G 子表 + 对外脚注 | `ROADMAP_v1_zh.md` | → **SEM-02 改 v2.x** |
22
- | P0 | SEM-02 | SEM-01 脚注仍不足 · v0.5/v0.6 像主轨续号 | 问「0.5 在哪」 | HGM **v2.0+ / v2.1+** · ROADMAP §2.0 | L2 链 | ✅ 2026-06-15 |
23
- | P0 | ICV-01 | 公众 ICV 三支柱 vs 产品 ICVO 四支柱 | 续篇自相矛盾 | ICVO 升级说明 + 地图 v1.0.3 脚注 | 本体 · README · 公众稿 | ✅ |
24
- | P0 | IMPL-01 | A0「已完成」vs P0 进行中 | 过度承诺 v0.2 | A0a/A0b | `STRATEGY_MASTER` | ✅ |
25
- | P0 | IMPL-02 | HGM/jsonl/npx 未标 proposal | 以为已实现 | 统一 `proposal · 未实现` | HGM · README §5.3 | ✅ |
26
- | P1 | MIX-01 | HGM §5 gate-check --graph @ v0.4 | ROADMAP v1.0 冲突 | 校正为 v1.0 Inform | `HARNESS_GRAPH_MODEL_design_v0_zh.md` | ✅ |
27
- | P1 | MAP-01 | DOCUMENT_MAP §4 README v1.0 滞后 | 锚点误报 | 更新 §4 | `DOCUMENT_MAP_v1_zh.md` | ✅ |
28
- | P1 | MAP-02 | README §6 v1.1 修订行 | 版本不一致 | 补修订记录 | `methodology/README.md` | ✅ |
29
- | P1 | MIX-02 | Harness Engineering vs 纪律包 | 误解为 Runtime | STRATEGY §1.1 澄清 | `STRATEGY_MASTER` | ✅ |
30
- | P1 | STRAT-01 | §4 Track G / ICVO D 轨 | L1 读者漏 G 轨 | §4.9 | `STRATEGY_MASTER` | ✅ |
31
- | P2 | VER-01 | invoke_index v0.4+ vs v1.0 | 排期歧义 | 统一 v1.0 | `DESIGN_ONTOLOGY` §6 | ✅ |
32
- | P2 | PILOT-01 | 试点 vs P0 ACCEPTANCE 边界 | 对外泛化 | PILOT 边界句 | `PILOT_kimi_code_fork` | ✅ |
21
+
22
+ | 级别 | ID | 问题 | 影响读者 | 建议改法 | 涉及文件 | 状态 |
23
+ | --- | -------- | ---------------------------------- | ------------------ | -------------------------------------- | ------------------------------------- | --------------------- |
24
+ | P0 | SEM-01 | v0.5.x semver 表位于 v1.0 后,数字易误读 | 以为 HGM v1.0 前产品版 | Track G 子表 + 对外脚注 | `ROADMAP_v1_zh.md` | ✅ → **SEM-02 改 v2.x** |
25
+ | P0 | SEM-02 | SEM-01 脚注仍不足 · v0.5/v0.6 像主轨续号 | 问「0.5 在哪」 | HGM **v2.0+ / v2.1+** · ROADMAP §2.0 | L2 | ✅ 2026-06-15 |
26
+ | P0 | ICV-01 | 公众 ICV 三支柱 vs 产品 ICVO 四支柱 | 续篇自相矛盾 | ICVO 升级说明 + 地图 v1.0.3 脚注 | 本体 · README · 公众稿 | ✅ |
27
+ | P0 | IMPL-01 | A0「已完成」vs P0 进行中 | 过度承诺 v0.2 | A0a/A0b | `STRATEGY_MASTER` | ✅ |
28
+ | P0 | IMPL-02 | HGM/jsonl/npx 未标 proposal | 以为已实现 | 统一 `proposal · 未实现` | HGM · README §5.3 | ✅ |
29
+ | P1 | MIX-01 | HGM §5 写 gate-check --graph @ v0.4 | 与 ROADMAP v1.0 冲突 | 校正为 v1.0 Inform | `HARNESS_GRAPH_MODEL_design_v0_zh.md` | ✅ |
30
+ | P1 | MAP-01 | DOCUMENT_MAP §4 README v1.0 滞后 | 锚点误报 | 更新 §4 | `DOCUMENT_MAP_v1_zh.md` | ✅ |
31
+ | P1 | MAP-02 | README §6 v1.1 修订行 | 版本不一致 | 补修订记录 | `methodology/README.md` | ✅ |
32
+ | P1 | MIX-02 | Harness Engineering vs 纪律包 | 误解为 Runtime | STRATEGY §1.1 澄清 | `STRATEGY_MASTER` | ✅ |
33
+ | P1 | STRAT-01 | §4 Track G / ICVO D 轨 | L1 读者漏 G 轨 | §4.9 | `STRATEGY_MASTER` | ✅ |
34
+ | P2 | VER-01 | invoke_index v0.4+ vs v1.0 | 排期歧义 | 统一 v1.0 | `DESIGN_ONTOLOGY` §6 | ✅ |
35
+ | P2 | PILOT-01 | 试点 vs P0 ACCEPTANCE 边界 | 对外泛化 | PILOT 边界句 | `PILOT_kimi_code_fork` | ✅ |
36
+
33
37
 
34
38
  ---
35
39
 
@@ -65,7 +69,10 @@ L2 真值链大体自洽,但存在 semver(v0.5 HGM 晚于 v1.0 闸门)、H
65
69
 
66
70
  ## 修订记录
67
71
 
68
- | 日期 | 说明 |
69
- | --- | --- |
70
- | 2026-06-15 | 初版审计 · 同日落盘修复 |
72
+
73
+ | 日期 | 说明 |
74
+ | ---------- | ------------------------------- |
75
+ | 2026-06-15 | 初版审计 · 同日落盘修复 |
71
76
  | 2026-06-15 | SEM-02:HGM semver **v2.x** 全链回填 |
77
+
78
+
@@ -80,6 +80,7 @@ HGM = 结构化对象 + 显式带类型的边 + 不可变事件历史 + 可推
80
80
  | ----------------------------------------------------------- | ------------------------------------ |
81
81
  | `[HARNESS_V2_PLAN.md](./pointers/HARNESS_V2_PLAN_v1_zh.md)` | Ink 工作区 Harness 规划 · task 字段 · CI 批次 |
82
82
  | `[SDD_HAT_FLOW.md](./pointers/SDD_HAT_FLOW_v1_zh.md)` | 历史帽编号 · Starter 以产品仓 prompts 为准 |
83
+ | `[HARNESS_HAT_CHAIN_V2_ONEPAGER_v1_zh.md](./pointers/HARNESS_HAT_CHAIN_V2_ONEPAGER_v1_zh.md)` | 帽子链 V2 对外摘要 · 双 20 · 人闸 · 50 可选 |
83
84
  | 工作区 `docs/harness/prompts/` | **Extended** 全量帽 · 不默认复制进产品包 |
84
85
 
85
86
 
@@ -0,0 +1,96 @@
1
+ # Postmortem · 人工闸 status 反引号解析事故
2
+
3
+ | 项 | 内容 |
4
+ | --- | --- |
5
+ | 日期 | 2026-06-30 |
6
+ | 产品包 | `@cyning/harness` |
7
+ | 版本 | 2.1.0 → 2.1.1 |
8
+ | 类型 | bugfix / 回归风险 |
9
+ | 触发任务 | `task_fix_harness_verify_status_parsing_v1` |
10
+
11
+ ## 现象
12
+
13
+ `npx @cyning/harness verify` 在 task 表的 `### 人工闸` 中,将 status 字段的 Markdown 反引号一并解析,导致:
14
+
15
+ - task 表写 `HG-AUDIT-R1 | approved` 时,内部状态为 `` `approved` ``
16
+ - `evaluateMayStart30` 判断 `audit?.status !== 'approved'`,返回阻塞
17
+ - CLI 输出「HG-AUDIT-R1 非 approved(须维护者签 task 表)」,即使 task 表已明确 approved
18
+
19
+ ## 根因
20
+
21
+ ### 1. `lib/task-meta.js` 的 `normalizeCell` 只去星号没去反引号
22
+
23
+ ```javascript
24
+ // 修复前
25
+ function normalizeCell(cell) {
26
+ return cell.replace(/\*/g, '').trim();
27
+ }
28
+ ```
29
+
30
+ ### 2. `wizard/gate-check.sh` 的 `gate_status` / `gate_blocks` 同样只去星号
31
+
32
+ ```bash
33
+ # 修复前
34
+ awk -F'|' -v g="$gate" '
35
+ ...
36
+ gsub(/\*/, "", $3)
37
+ ...
38
+ '
39
+ ```
40
+
41
+ ### 3. 测试用例未覆盖带反引号的 status
42
+
43
+ 现有 `test/verify.test.js` 的 `writeTaskWithGate` 直接写 `approved`(无反引号),未模拟真实 task 表中 `` `approved` `` 的格式。
44
+
45
+ ## 修复
46
+
47
+ ### `lib/task-meta.js`
48
+
49
+ ```javascript
50
+ function normalizeCell(cell) {
51
+ return cell.replace(/[`\*]/g, '').trim();
52
+ }
53
+ ```
54
+
55
+ ### `wizard/gate-check.sh`
56
+
57
+ ```bash
58
+ awk -F'|' -v g="$gate" '
59
+ ...
60
+ gsub(/[`*]/, "", $3)
61
+ ...
62
+ '
63
+ ```
64
+
65
+ > **注意**:awk 字符类中写 `` [`\*] `` 会导致正则语法错误(`illegal primary in regular expression`),因为 awk 中反斜杠在字符类内有特殊处理。应使用 `` [`*] ``。
66
+
67
+ ## 教训
68
+
69
+ 1. **Markdown 表格的格式化符号必须被 normalize**
70
+ - status 字段常见写法:`` `approved` ``、`*approved*`、`` **`approved`** ``
71
+ - 解析时必须统一去除:反引号、星号、首尾空白
72
+
73
+ 2. **测试用例必须覆盖真实 task 表格式**
74
+ - 不要只测裸字符串 `approved`
75
+ - 必须测 `` `approved` ``、`` **`approved`** ``、`*approved*` 等变体
76
+
77
+ 3. **awk 与 JavaScript 正则差异**
78
+ - JS:`/[`\\*]/g` 正确
79
+ - awk:`` [`\*] `` 报错,应写 `` [`*] ``
80
+ - 修改 shell 脚本后必须用 `bash -n` 或实际运行验证
81
+
82
+ 4. **发布前必须跑完整测试**
83
+ - `npm test` 在修复前是 62/72 失败,修复后是 72/72 通过
84
+ - 若发布前未跑测试,此 bug 会进入 2.1.0
85
+
86
+ ## 预防措施
87
+
88
+ - [ ] 在 `test/verify.test.js` 中增加带反引号的 gate 状态测试
89
+ - [ ] 在 `test/audit.test.js` 中同样增加反引号覆盖
90
+ - [ ] 将 `normalizeCell` 的测试独立为一个单元测试
91
+ - [ ] 后续修改 `wizard/*.sh` 时,先用 `bash -n` 检查语法
92
+
93
+ ## 关联提交
94
+
95
+ - `9f5761c` fix(verify): strip backticks from gate status cells
96
+ - tag: `v2.1.1`
@@ -0,0 +1,31 @@
1
+ # POINTER · 帽子链 V2 一页纸
2
+
3
+ | 项 | 内容 |
4
+ | --- | --- |
5
+ | **状态** | `active` |
6
+ | **版本** | v1.0 |
7
+ | **日期** | 2026-06-29 |
8
+ | **真值** | 工作区 `Projects/docs/harness/guides/POINTER_hat_chain_v2_onepager_v1_zh.md` |
9
+ | **修正测评** | 工作区 `Projects/docs/harness/guides/ASSESSMENT_hat_chain_00_50_corrected_v1_zh.md` |
10
+ | **三方原文(只读)** | 工作区 `Projects/docs/harness/guides/ASSESSMENT_third_party_hat_chain_00_50_archive_v1_zh.md` |
11
+
12
+ > **本文件为 POINTER · 禁止复制全文**。对外/面试摘要请打开上方「真值」链接。
13
+
14
+ ---
15
+
16
+ ## 一句话
17
+
18
+ 工作区 Harness V2 帽链 = **00 编排 + 10 双轨思考 + 20 双类型书面审 + 人闸 + 30–40–可选 50**,目标是把 AI 编码做成 **有规格冻结点、有书面签收、有命令证据、有独立复检、有 CI 终审** 的 PR 级交付。
19
+
20
+ ## 关键纪律
21
+
22
+ - **双 20**:`20-spec-audit` 审 SPEC,`20-task-audit` 审 task;**不可合并为单审**。
23
+ - **人闸**:`HG-AUDIT-R1` 必须在 30 执行前书面 approved;00/Agent **禁止代签**。
24
+ - **50 可选**:非每个 task 都须 50,但 40 自检证据必须可复核。
25
+ - **invoke ≠ cache**:invoke 是 **开帽快照**,不是 prompt 缓存。
26
+
27
+ ## 阅读顺序
28
+
29
+ 1. 真值 one-pager:[`POINTER_hat_chain_v2_onepager_v1_zh.md`](../../../../Projects/docs/harness/guides/POINTER_hat_chain_v2_onepager_v1_zh.md)
30
+ 2. 修正测评:[`ASSESSMENT_hat_chain_00_50_corrected_v1_zh.md`](../../../../Projects/docs/harness/guides/ASSESSMENT_hat_chain_00_50_corrected_v1_zh.md)
31
+ 3. V2 链指南:[`GUIDANCE_harness_hat_v2_chain_v1_zh.md`](../../../../Projects/docs/harness/guides/GUIDANCE_harness_hat_v2_chain_v1_zh.md)
@@ -16,6 +16,7 @@
16
16
  | [`PILOT_kimi_code_fork_v1_zh.md`](./PILOT_kimi_code_fork_v1_zh.md) | `docs/harness/guides/PILOT_kimi_code_fork_adoption_v1_zh.md` |
17
17
  | [`GUIDANCE_distribution_v1_zh.md`](./GUIDANCE_distribution_v1_zh.md) | `docs/harness/guides/GUIDANCE_harness_distribution_v1_zh.md` |
18
18
  | [`ASSESSMENT_etclovg_v1_zh.md`](./ASSESSMENT_etclovg_v1_zh.md) | `docs/harness/guides/ASSESSMENT_cyning_harness_etclovg_industry_v1_zh.md` |
19
+ | [`HARNESS_HAT_CHAIN_V2_ONEPAGER_v1_zh.md`](./HARNESS_HAT_CHAIN_V2_ONEPAGER_v1_zh.md) | `docs/harness/guides/POINTER_hat_chain_v2_onepager_v1_zh.md` |
19
20
 
20
21
  **工作区索引**:`docs/harness/README.md`
21
22
 
@@ -0,0 +1,72 @@
1
+ graph_id: "00_main"
2
+ title: "顶层流程总图"
3
+ description: "模板包主入口分发与典型子流程路由"
4
+ version: "2026-06-30"
5
+
6
+ nodes:
7
+ - id: "Q"
8
+ label: "用户 / 客户端请求"
9
+ - id: "E"
10
+ label: "应用入口"
11
+ - id: "M1"
12
+ label: "核心业务处理"
13
+ - id: "M2"
14
+ label: "次要路径"
15
+ - id: "ADM"
16
+ label: "Admin / Job"
17
+ - id: "FLOW_MAIN"
18
+ label: "主路径子流程"
19
+ - id: "FLOW_DOC"
20
+ label: ">10_flow_MAIN.md"
21
+ - id: "DB"
22
+ label: "持久化"
23
+ - id: "STRUCT_DOC"
24
+ label: ">01_struct.md"
25
+
26
+ edges:
27
+ - from: "Q"
28
+ to: "E"
29
+ label: "->"
30
+ anchors:
31
+ - path: "src/main.py"
32
+ line: 1
33
+ - path: "app/router/index.ts"
34
+ line: 1
35
+ - from: "E"
36
+ to: "M1"
37
+ label: "主路径 A"
38
+ anchors:
39
+ - path: "handlers/resource.py"
40
+ symbol: "handle_create"
41
+ - from: "E"
42
+ to: "M2"
43
+ label: "主路径 B"
44
+ anchors:
45
+ - path: "handlers/health.py"
46
+ symbol: "health_check"
47
+ - from: "E"
48
+ to: "ADM"
49
+ label: "管理/批处理"
50
+ anchors:
51
+ - path: "jobs/ingest.py"
52
+ symbol: "run_sync"
53
+ - from: "M1"
54
+ to: "FLOW_MAIN"
55
+ mark: "::triggers"
56
+ type: "triggers"
57
+ - from: "FLOW_MAIN"
58
+ to: "FLOW_DOC"
59
+ label: "加载"
60
+ - from: "M1"
61
+ to: "DB"
62
+ label: "->"
63
+ anchors:
64
+ - path: "db/repository.py"
65
+ - from: "ADM"
66
+ to: "DB"
67
+ label: "->"
68
+ anchors:
69
+ - path: "db/repository.py"
70
+ - from: "E"
71
+ to: "STRUCT_DOC"
72
+ label: "加载"
@@ -1,52 +1,65 @@
1
- # 顶层流程总图(人类友好版)
1
+ ---
2
+ graph_id: 00_main
3
+ title: 顶层流程总图
4
+ description: 模板包主入口分发与典型子流程路由
5
+ version: '2026-06-30'
6
+ generated_from: 00_main.graph.yaml
7
+ generator: scripts/graph_yaml_compile.js
8
+ ---
2
9
 
3
- > **用途**:`docs/_tech_graph/00_main.md` — 本仓 **Happy Path** 主干;子流程折叠为 `10_flow_*.md` 链接。
4
- > **双轨**:须与 [`00_main.ai.md`](./00_main.ai.md) 语义等价;flowchart 改 `.ai.md` 优先,再同步本文件。
5
- > **协议**:[`99_mermaid_protocol.md`](./99_mermaid_protocol.md)
10
+ # 顶层流程总图
6
11
 
7
- ## 维护说明
12
+ > 模板包主入口分发与典型子流程路由
8
13
 
9
- 1. 替换下方占位节点为你的 **真实入口**(HTTP 路由 / CLI / 事件总线等)。
10
- 2. 子图节点 > 7 时折叠为 `[[Phase]]`,链至独立 `10_flow_*.md`。
11
- 3. 异常分支可挂侧链;主干保持可读。
14
+ > **源文件**:`00_main.graph.yaml` · `scripts/graph_yaml_compile.js` 生成 · 请勿直接手写本文件
12
15
 
13
16
  ```mermaid
14
17
  flowchart TD
15
- %% version: YYYY-MM-DD — 替换为首次人签日期
16
-
17
- %% === 入口 ===
18
- Q[用户 / 客户端请求] --> E{应用入口<br/>例:src/main.py 或 app/router}
19
-
20
- %% === 主业务分支(示例 · 按栈裁剪)===
21
- E -->|主路径 A| M1[核心业务处理<br/>例:/api/v1/resource]
22
- E -->|主路径 B| M2[次要路径<br/>例:/health 或 /metrics]
23
- E -->|管理/批处理| ADM[Admin / Job<br/>例:ingest / sync]
24
-
25
- %% === 子流程折叠 ===
26
- M1 --> FLOW_MAIN[主路径子流程]
27
- FLOW_MAIN --> FLOW_DOC[> 10_flow_MAIN.md]
28
-
29
- M1 --> DB[(持久化<br/>例:PostgreSQL / 文件)]
18
+ Q[[用户 / 客户端请求]]
19
+ E[[应用入口]]
20
+ M1[[核心业务处理]]
21
+ M2[[次要路径]]
22
+ ADM[[Admin / Job]]
23
+ FLOW_MAIN[[主路径子流程]]
24
+ FLOW_DOC[>10_flow_MAIN.md]
25
+ DB[(持久化)]
26
+ STRUCT_DOC[>01_struct.md]
27
+ Q --> E
28
+ E --"主路径 A"--> M1
29
+ E --"主路径 B"--> M2
30
+ E --"管理/批处理"--> ADM
31
+ M1 --"::triggers"--> FLOW_MAIN
32
+ FLOW_MAIN --"加载"--> FLOW_DOC
33
+ M1 --> DB
30
34
  ADM --> DB
31
-
32
- %% === 样式(可选)===
33
- classDef start fill:#e1f5fe,stroke:#01579b,stroke-width:2px
34
- classDef main fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
35
- classDef infra fill:#fff8e1,stroke:#ff6f00,stroke-width:1px
36
-
37
- class Q,E start
38
- class M1,M2,ADM main
39
- class FLOW_MAIN,DB infra
35
+ E --"加载"--> STRUCT_DOC
36
+ %% 锚点:见 YAML 源 edges[].anchors
40
37
  ```
41
38
 
42
- ## 待补 flow 清单(存量 S2+ 可用)
39
+ ## Nodes
43
40
 
44
- | flow 文件 | 状态 | 说明 |
45
- |-----------|------|------|
46
- | `10_flow_MAIN.md` | 示例已提供 | 主请求路径;嵌入后替换为真实 API/页面流 |
47
- | `10_flow_*.md` | 待增量 | 每 Epic 或跨模块改动时补 1 张 |
41
+ | ID | Label |
42
+ |----|-------|
43
+ | Q | 用户 / 客户端请求 |
44
+ | E | 应用入口 |
45
+ | M1 | 核心业务处理 |
46
+ | M2 | 次要路径 |
47
+ | ADM | Admin / Job |
48
+ | FLOW_MAIN | 主路径子流程 |
49
+ | FLOW_DOC | >10_flow_MAIN.md |
50
+ | DB | 持久化 |
51
+ | STRUCT_DOC | >01_struct.md |
48
52
 
49
- ## 关联
53
+ ## Edges
50
54
 
51
- - 模块边界:[`01_struct.md`](./01_struct.md)(**HG-GRAPH-MODULES** 人签真值)
52
- - 拓扑协议:[`99_mermaid_protocol.md`](./99_mermaid_protocol.md)
55
+ | From | To | Label | Type | Anchors |
56
+ |------|----|-------|------|---------|
57
+ | Q | E | -> | | src/main.py#L1, app/router/index.ts#L1 |
58
+ | E | M1 | 主路径 A | | handlers/resource.py::handle_create |
59
+ | E | M2 | 主路径 B | | handlers/health.py::health_check |
60
+ | E | ADM | 管理/批处理 | | jobs/ingest.py::run_sync |
61
+ | M1 | FLOW_MAIN | ::triggers | triggers | |
62
+ | FLOW_MAIN | FLOW_DOC | 加载 | | |
63
+ | M1 | DB | -> | | db/repository.py |
64
+ | ADM | DB | -> | | db/repository.py |
65
+ | E | STRUCT_DOC | 加载 | | |
@@ -0,0 +1,6 @@
1
+ # 图谱版本时间线
2
+
3
+ | 日期 | 版本 | 事件 |
4
+ |------|------|------|
5
+ | YYYY-MM-DD | v0.1 | 首次嵌入用户仓(请替换为真实日期) |
6
+ | 2026-06-30 | v0.2 | 模板包迁移至 YAML-first:`00_main.graph.yaml`、`10_flow_MAIN.graph.yaml` 成为唯一编辑源;`.ai.md` 双轨文件弃用并删除;`scripts/graph_yaml_compile.js` + `scripts/verify-template-compile.sh` 上线 |
@@ -0,0 +1,105 @@
1
+ graph_id: "10_flow_MAIN"
2
+ title: "主路径 Flow 示例"
3
+ description: "典型 HTTP 请求从入口到响应的主干流程"
4
+ version: "2026-06-30"
5
+
6
+ nodes:
7
+ - id: "IN"
8
+ label: "HTTP 请求"
9
+ - id: "AUTH"
10
+ label: "鉴权 / 会话校验"
11
+ - id: "VAL"
12
+ label: "参数校验"
13
+ - id: "SVC"
14
+ label: "业务服务层"
15
+ - id: "ERR_AUTH"
16
+ label: "Auth Failed"
17
+ - id: "ERR_VAL"
18
+ label: "Validation Failed"
19
+ - id: "REPO"
20
+ label: "仓储 / ORM"
21
+ - id: "DB"
22
+ label: "数据库 / 存储"
23
+ - id: "HIT"
24
+ label: "record exists?"
25
+ - id: "NOTFOUND"
26
+ label: "404 / 空结果"
27
+ - id: "BIZERR"
28
+ label: "4xx 业务错误"
29
+ - id: "RESP"
30
+ label: "组装响应 DTO"
31
+ - id: "OUT"
32
+ label: "返回 JSON / 页面"
33
+ - id: "LOG"
34
+ label: "结构化日志"
35
+ - id: "MAIN_DOC"
36
+ label: ">00_main.md"
37
+
38
+ edges:
39
+ - from: "IN"
40
+ to: "AUTH"
41
+ label: "->"
42
+ anchors:
43
+ - path: "middleware/auth.py"
44
+ symbol: "require_user"
45
+ - from: "AUTH"
46
+ to: "VAL"
47
+ label: "[ok]"
48
+ - from: "AUTH"
49
+ to: "ERR_AUTH"
50
+ label: "[err]"
51
+ anchors:
52
+ - path: "middleware/auth.py"
53
+ line: 42
54
+ - from: "VAL"
55
+ to: "SVC"
56
+ label: "[ok]"
57
+ anchors:
58
+ - path: "services/resource_service.py"
59
+ symbol: "handle"
60
+ - from: "VAL"
61
+ to: "ERR_VAL"
62
+ label: "[err]"
63
+ - from: "SVC"
64
+ to: "REPO"
65
+ label: "->"
66
+ anchors:
67
+ - path: "repositories/resource_repo.py"
68
+ symbol: "find_by_id"
69
+ - from: "REPO"
70
+ to: "DB"
71
+ label: "->"
72
+ anchors:
73
+ - path: "db/session.py"
74
+ - from: "REPO"
75
+ to: "HIT"
76
+ label: "?>"
77
+ - from: "HIT"
78
+ to: "NOTFOUND"
79
+ label: "[no]"
80
+ - from: "HIT"
81
+ to: "SVC"
82
+ label: "[yes]"
83
+ - from: "SVC"
84
+ to: "BIZERR"
85
+ label: "[err]"
86
+ anchors:
87
+ - path: "services/resource_service.py"
88
+ - from: "SVC"
89
+ to: "RESP"
90
+ label: "->"
91
+ - from: "RESP"
92
+ to: "OUT"
93
+ label: "->"
94
+ anchors:
95
+ - path: "handlers/resource.py"
96
+ symbol: "to_response"
97
+ - from: "OUT"
98
+ to: "LOG"
99
+ mark: "::archives"
100
+ type: "archives"
101
+ anchors:
102
+ - path: "observability/logger.py"
103
+ - from: "IN"
104
+ to: "MAIN_DOC"
105
+ label: "加载"
@@ -1,47 +1,89 @@
1
- # 主路径 Flow 示例(人类友好版)
1
+ ---
2
+ graph_id: 10_flow_MAIN
3
+ title: 主路径 Flow 示例
4
+ description: 典型 HTTP 请求从入口到响应的主干流程
5
+ version: '2026-06-30'
6
+ generated_from: 10_flow_MAIN.graph.yaml
7
+ generator: scripts/graph_yaml_compile.js
8
+ ---
2
9
 
3
- > **用途**:`docs/_tech_graph/10_flow_MAIN.md` **至少 1 条**主业务流(新仓 / S0 必做)。
4
- > **双轨**:须与 [`10_flow_MAIN.ai.md`](./10_flow_MAIN.ai.md) 语义等价。
5
- > **嵌入后**:将占位路径替换为真实 handler / 路由 / 页面流。
10
+ # 主路径 Flow 示例
6
11
 
7
- ```mermaid
8
- flowchart TD
9
- %% Entry: 例 GET/POST /api/v1/resource — 替换为真实入口
10
-
11
- %% === 请求阶段 ===
12
- IN[HTTP 请求] --> AUTH[鉴权 / 会话校验]
13
- AUTH --> VAL[参数校验<br/>schema / DTO]
14
- VAL --> SVC[业务服务层<br/>例:ResourceService]
15
-
16
- %% === 数据阶段 ===
17
- SVC --> REPO[仓储 / ORM<br/>例:ResourceRepository]
18
- REPO --> DB[(数据库 / 存储)]
19
-
20
- REPO -->|无记录| NOTFOUND[404 / 空结果]
21
- SVC -->|业务规则失败| BIZERR[4xx 业务错误]
12
+ > 典型 HTTP 请求从入口到响应的主干流程
22
13
 
23
- %% === 响应阶段 ===
24
- SVC --> RESP[组装响应 DTO]
25
- RESP --> OUT[返回 JSON / 页面]
14
+ > **源文件**:`10_flow_MAIN.graph.yaml` · 由 `scripts/graph_yaml_compile.js` 生成 · 请勿直接手写本文件
26
15
 
27
- %% === 可观测(可选)===
28
- OUT --> LOG[结构化日志 / trace]
29
-
30
- %% 样式
31
- classDef request fill:#e1f5fe,stroke:#01579b,stroke-width:2px
32
- classDef domain fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
33
- classDef data fill:#fff8e1,stroke:#ff6f00,stroke-width:1px
34
-
35
- class IN,AUTH,VAL request
36
- class SVC,RESP,OUT domain
37
- class REPO,DB,LOG data
16
+ ```mermaid
17
+ flowchart TD
18
+ IN[[HTTP 请求]]
19
+ AUTH[[鉴权 / 会话校验]]
20
+ VAL[[参数校验]]
21
+ SVC[[业务服务层]]
22
+ ERR_AUTH[[Auth Failed]]
23
+ ERR_VAL[[Validation Failed]]
24
+ REPO[[仓储 / ORM]]
25
+ DB[(数据库 / 存储)]
26
+ HIT{record exists?}
27
+ NOTFOUND[[404 / 空结果]]
28
+ BIZERR[[4xx 业务错误]]
29
+ RESP[[组装响应 DTO]]
30
+ OUT[[返回 JSON / 页面]]
31
+ LOG(( 结构化日志 ))
32
+ MAIN_DOC[>00_main.md]
33
+ IN --> AUTH
34
+ AUTH --"[ok]"--> VAL
35
+ AUTH --"[err]"--> ERR_AUTH
36
+ VAL --"[ok]"--> SVC
37
+ VAL --"[err]"--> ERR_VAL
38
+ SVC --> REPO
39
+ REPO --> DB
40
+ REPO --"?>"--> HIT
41
+ HIT --"[no]"--> NOTFOUND
42
+ HIT --"[yes]"--> SVC
43
+ SVC --"[err]"--> BIZERR
44
+ SVC --> RESP
45
+ RESP --> OUT
46
+ OUT --"::archives"--> LOG
47
+ IN --"加载"--> MAIN_DOC
48
+ %% 锚点:见 YAML 源 edges[].anchors
38
49
  ```
39
50
 
40
- ## 与顶层图关系
51
+ ## Nodes
41
52
 
42
- - [`00_main.md`](./00_main.md) 中由 `M1` 或等价节点 **加载** 本文件。
43
- - 模块归属见 [`01_struct.md`](./01_struct.md) 中 `api` / `core` 等行。
53
+ | ID | Label |
54
+ |----|-------|
55
+ | IN | HTTP 请求 |
56
+ | AUTH | 鉴权 / 会话校验 |
57
+ | VAL | 参数校验 |
58
+ | SVC | 业务服务层 |
59
+ | ERR_AUTH | Auth Failed |
60
+ | ERR_VAL | Validation Failed |
61
+ | REPO | 仓储 / ORM |
62
+ | DB | 数据库 / 存储 |
63
+ | HIT | record exists? |
64
+ | NOTFOUND | 404 / 空结果 |
65
+ | BIZERR | 4xx 业务错误 |
66
+ | RESP | 组装响应 DTO |
67
+ | OUT | 返回 JSON / 页面 |
68
+ | LOG | 结构化日志 |
69
+ | MAIN_DOC | >00_main.md |
44
70
 
45
- ## 增量维护
71
+ ## Edges
46
72
 
47
- BFF / API 契约时:**同 task** 更新本 flow 或另开图谱子 task;Harness 关账 ≠ 图谱关账。
73
+ | From | To | Label | Type | Anchors |
74
+ |------|----|-------|------|---------|
75
+ | IN | AUTH | -> | | middleware/auth.py::require_user |
76
+ | AUTH | VAL | [ok] | | |
77
+ | AUTH | ERR_AUTH | [err] | | middleware/auth.py#L42 |
78
+ | VAL | SVC | [ok] | | services/resource_service.py::handle |
79
+ | VAL | ERR_VAL | [err] | | |
80
+ | SVC | REPO | -> | | repositories/resource_repo.py::find_by_id |
81
+ | REPO | DB | -> | | db/session.py |
82
+ | REPO | HIT | ?> | | |
83
+ | HIT | NOTFOUND | [no] | | |
84
+ | HIT | SVC | [yes] | | |
85
+ | SVC | BIZERR | [err] | | services/resource_service.py |
86
+ | SVC | RESP | -> | | |
87
+ | RESP | OUT | -> | | handlers/resource.py::to_response |
88
+ | OUT | LOG | ::archives | archives | observability/logger.py |
89
+ | IN | MAIN_DOC | 加载 | | |
@@ -1,14 +1,13 @@
1
- # Mermaid 拓扑协议(通用 · v2
1
+ # Mermaid 拓扑协议(通用 · v3
2
2
 
3
- > **用途**:`docs/_tech_graph/99_mermaid_protocol.md` — flowchart **双轨** 与边标记真值。
4
- > **双轨制**:`.md` 人类友好;`.ai.md` AI / 脚本协议版;**语义等价**。
3
+ > **用途**:`docs/_tech_graph/99_mermaid_protocol.md` — flowchart 边标记、节点形状与 YAML-first 生成真值。
5
4
 
6
- | 后缀 | 维护者 | 特点 |
7
- |------|--------|------|
8
- | `.md` | 开发者 | 简洁可读;少量裸边可接受 |
9
- | `.ai.md` | LLM / 脚本 | 结构化标记、锚点分离、**零裸边** |
5
+ ## 0. YAML-first 工作流
10
6
 
11
- **转换方向**:人写 `.md` → 按本协议生成/同步 `.ai.md` → 渲染审阅。
7
+ - **唯一人工编辑源**:`*.graph.yaml`(本目录下如 `00_main.graph.yaml`、`10_flow_MAIN.graph.yaml`)。
8
+ - **生成物**:同名 `*.md` 由 `scripts/graph_yaml_compile.js` 自动生成,包含 YAML frontmatter、Mermaid flowchart、Nodes/Edges 表。
9
+ - **禁止手写 `.md`**:如需改图,改 YAML 源后重新运行编译脚本;`--check` 模式可检测 `.md` 与 `.graph.yaml` 是否同步。
10
+ - **历史 `.ai.md` 双轨已弃用**:Post-G0 后不再维护 `.md` + `.ai.md` 两份文件;所有结构化信息(锚点、边类型)集中在 YAML 源中。
12
11
 
13
12
  ---
14
13
 
@@ -59,19 +58,23 @@
59
58
 
60
59
  ---
61
60
 
62
- ## 3. 锚点规则(`.ai.md` 强制)
61
+ ## 3. 锚点规则(YAML 源强制)
63
62
 
64
- 每条 **硬边** 须可追溯到代码或文档:
63
+ 每条 **硬边** 须可追溯到代码或文档,写在 YAML `edges[].anchors` 中:
65
64
 
66
- ```text
67
- // → src/handlers/foo.py#L42
68
- // src/handlers/foo.py::handle_request
69
- // → migrations/001_init.sql#L12
70
- // → docs/_tech_graph/10_flow_MAIN.md
65
+ ```yaml
66
+ edges:
67
+ - from: "Q"
68
+ to: "E"
69
+ anchors:
70
+ - path: "src/main.py"
71
+ line: 1
72
+ - path: "app/router/index.ts"
73
+ symbol: "Router"
71
74
  ```
72
75
 
73
- - 锚点用 **独立注释行** `// → path#Ln`,不塞进节点标签。
74
- - 跨模块调用:虚线或 `::triggers`,**不**展开对方内部。
76
+ - 跨模块调用:使用 `::triggers` 或虚线,**不**展开对方内部。
77
+ - 未知锚点:保留 `path: TBD` 并开 task 补全。
75
78
 
76
79
  ---
77
80
 
@@ -87,14 +90,30 @@
87
90
 
88
91
  ## 5. 禁止项
89
92
 
90
- - `.ai.md` 中 **禁止裸边**(须带 `"->"` 等标记)。
91
- - 禁止虚构文件路径;未知处用 `// → TBD` 并开 task 补锚点。
93
+ - **禁止**维护 `.ai.md` 双轨文件。
94
+ - **禁止**在生成的 `.md` 中直接手写 flowchart(会被下次编译覆盖)。
95
+ - 禁止虚构文件路径;未知处用 `path: TBD` 并开 task 补锚点。
92
96
  - **禁止** onboarding 默认「全仓扫描生图」。
93
97
 
94
98
  ---
95
99
 
96
- ## 6. 修订记录
100
+ ## 6. YAML 字段到 Mermaid 映射
101
+
102
+ | YAML 字段 | Mermaid 输出 | 说明 |
103
+ |-----------|--------------|------|
104
+ | `nodes[].id` | 节点 ID | 必须唯一 |
105
+ | `nodes[].label` | 节点显示文本 | 决定节点形状 |
106
+ | `edges[].from` / `to` | 边两端 | 必须引用存在的节点 |
107
+ | `edges[].label` | 边标签 | `"->"` 表示裸执行边 |
108
+ | `edges[].mark` | 元关系标记 | 如 `::triggers`、`::branches` |
109
+ | `edges[].type` | 边类型 | 与 `mark` 命名空间对应 |
110
+ | `edges[].anchors` | 不渲染,写入 table | 代码追溯 |
111
+
112
+ ---
113
+
114
+ ## 7. 修订记录
97
115
 
98
116
  | 日期 | 说明 |
99
117
  |------|------|
118
+ | 2026-06-30 | v3:YAML-first,删除 `.ai.md` 双轨,新增 YAML → Mermaid 映射 |
100
119
  | YYYY-MM-DD | 嵌入用户仓时填写首次版本 |
@@ -2,16 +2,16 @@
2
2
 
3
3
  复制到用户仓 **`docs/_tech_graph/`**。
4
4
 
5
- ## v0.1 已交付模板(T1 · M2
5
+ ## v0.2 已交付模板(T2 · YAML-first
6
6
 
7
7
  | 文件 | 状态 | 说明 |
8
8
  |------|------|------|
9
- | [`00_main.md`](./00_main.md) | ✅ | 顶层流程(人类友好版) |
10
- | [`00_main.ai.md`](./00_main.ai.md) | ✅ | 顶层流程(AI 协议版 · 双轨) |
9
+ | [`00_main.graph.yaml`](./00_main.graph.yaml) | ✅ | 顶层流程(唯一编辑源) |
10
+ | [`00_main.md`](./00_main.md) | ✅ | 顶层流程(编译生成物) |
11
11
  | [`01_struct.md`](./01_struct.md) | ✅ | **模块边界表**(D4-a · **HG-GRAPH-MODULES** 人签真值) |
12
- | [`99_mermaid_protocol.md`](./99_mermaid_protocol.md) | ✅ | Mermaid 拓扑协议 |
13
- | [`10_flow_MAIN.md`](./10_flow_MAIN.md) | ✅ | 主路径 flow 示例(人类版) |
14
- | [`10_flow_MAIN.ai.md`](./10_flow_MAIN.ai.md) | ✅ | 主路径 flow 示例(AI 版) |
12
+ | [`10_flow_MAIN.graph.yaml`](./10_flow_MAIN.graph.yaml) | ✅ | 主路径 flow 示例(唯一编辑源) |
13
+ | [`10_flow_MAIN.md`](./10_flow_MAIN.md) | ✅ | 主路径 flow 示例(编译生成物) |
14
+ | [`99_mermaid_protocol.md`](./99_mermaid_protocol.md) | ✅ | Mermaid 拓扑协议(YAML-first) |
15
15
 
16
16
  ## 仍可选补(非 T1 硬门槛)
17
17
 
@@ -19,16 +19,41 @@
19
19
  |------|------|
20
20
  | `02_version.md` | 版本时间线;新仓建议嵌入后首周补 |
21
21
 
22
+ ## 编辑与复制流程
23
+
24
+ 1. **改图**:只改 `.graph.yaml`,不要手写 `.md`。
25
+ 2. **编译**:在 `cyning-harness/` 根运行:
26
+ ```bash
27
+ node scripts/graph_yaml_compile.js
28
+ ```
29
+ 3. **校验**:
30
+ ```bash
31
+ bash scripts/verify-template-compile.sh
32
+ ```
33
+ 4. **复制到业务仓**:
34
+ ```bash
35
+ mkdir -p docs/_tech_graph
36
+ cp -R cyning-harness/graph/templates/* docs/_tech_graph/
37
+ # 按需删除 README 或本说明段
38
+ ```
39
+
40
+ ## 业务仓专属产物
41
+
42
+ 以下文件是业务仓运行时 artifact,**不在模板包中生成空壳**:
43
+
44
+ - `_manifest.json`
45
+ - `_contract_manifest.json`
46
+ - `_test_manifest.json`
47
+
48
+ 业务仓应基于真实 endpoint / RPC / 表 / 事件契约,通过自身 CI(如 `tech-graph.yml`、`tech-graph-contract.yml`)生成并校验这些 manifest。模板包仅提供 `.graph.yaml` → `.md` 的简化编译流。
49
+
22
50
  ## 嵌入后
23
51
 
24
52
  - **新仓**:骨架 + 模块表人签 + 至少 1 主 flow(见 [`docs/ONBOARDING.md`](../../docs/ONBOARDING.md) §3)
25
53
  - **存量**:按 ONBOARDING 档位 S0~S3;**禁止**首次全 flow 构图
26
54
  - **人签**:`01_struct` 模块表 → **HG-GRAPH-MODULES** approved → 允许 30 改码
27
55
 
28
- ## 复制命令
56
+ ## 历史说明
29
57
 
30
- ```bash
31
- mkdir -p docs/_tech_graph
32
- cp -R cyning-harness/graph/templates/* docs/_tech_graph/
33
- # 按需删除 README 或本说明段
34
- ```
58
+ - v0.1 使用 `.md` + `.ai.md` 双轨;v0.2 起改为 YAML-first,`.ai.md` 已弃用。
59
+ - 复杂业务仓应采用 `.graph.yaml` 源 + manifest/contract CI;`cyning-harness` 模板包维持简化编译流。
package/lib/task-meta.js CHANGED
@@ -219,5 +219,5 @@ function extractSection(content, startMarker, endMarker) {
219
219
  }
220
220
 
221
221
  function normalizeCell(cell) {
222
- return cell.replace(/\*/g, '').trim();
222
+ return cell.replace(/[`\\*]/g, '').trim();
223
223
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyning/harness",
3
- "version": "2.0.4",
3
+ "version": "2.1.1",
4
4
  "description": "cyning-harness discipline package · init / upgrade / check CLI",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -2,7 +2,8 @@
2
2
 
3
3
  > **状态**:`active`(M2 v0.1)
4
4
  > **形态**:**脚本优先**([`wizard/README.md`](./README.md));本文档为 preset 说明备查
5
- > **关联**:[`docs/ONBOARDING.md`](../docs/ONBOARDING.md) · GUIDANCE D3 IDE 轨
5
+ > **关联**:[`docs/ONBOARDING.md`](../docs/ONBOARDING.md) · GUIDANCE D3 IDE 轨
6
+ > **新建项目引导**:[`wizard/guides/GUIDE_new_project_bootstrap_v1_zh.md`](./guides/GUIDE_new_project_bootstrap_v1_zh.md) — 从零接入的 6 步操作手册
6
7
 
7
8
  ---
8
9
 
@@ -30,7 +30,7 @@ gate_status() {
30
30
  awk -F'|' -v g="$gate" '
31
31
  $0 ~ /^[[:space:]]*\|/ && index($0, g) > 0 {
32
32
  gsub(/^[[:space:]]+|[[:space:]]+$/, "", $3)
33
- gsub(/\*/, "", $3)
33
+ gsub(/[`*]/, "", $3)
34
34
  print $3
35
35
  exit
36
36
  }
@@ -42,7 +42,7 @@ gate_blocks() {
42
42
  awk -F'|' -v g="$gate" '
43
43
  $0 ~ /^[[:space:]]*\|/ && index($0, g) > 0 {
44
44
  gsub(/^[[:space:]]+|[[:space:]]+$/, "", $4)
45
- gsub(/\*/, "", $4)
45
+ gsub(/[`*]/, "", $4)
46
46
  print $4
47
47
  exit
48
48
  }
@@ -0,0 +1,158 @@
1
+ # GUIDE · 新建项目 Harness 引导(v1)
2
+
3
+ | 项 | 内容 |
4
+ | --- | --- |
5
+ | **状态** | `active` |
6
+ | **版本** | v1 |
7
+ | **日期** | 2026-06-29 |
8
+ | **触发** | harness-probe bootstrapping 实录 → 抽象为通用模式 |
9
+ | **读者** | 维护者在新项目中接入 Harness 时的操作手册 |
10
+
11
+ > **用途**:从零开始给一个新项目(单仓、Python、无前端)接入 cyning-harness 纪律体系。存量项目见 [`ONBOARDING_wizard_v1_zh.md`](../ONBOARDING_wizard_v1_zh.md)。
12
+
13
+ ---
14
+
15
+ ## 1. 判断:你的项目需要什么
16
+
17
+ | 条件 | 推荐 profile | 说明 |
18
+ | --- | --- | --- |
19
+ | 纯文档/小工具 | `harness-only` | 只给 prompts + invoke 模板 |
20
+ | 有业务代码 + CI | `harness-only` + 手动补图谱和 CI | **本指南覆盖** |
21
+ | 全栈 Ink 类(前端+后端) | `fullstack-node-py` | 带 Wiki、standards、task bootstrap |
22
+
23
+ **关键原则**:宁可先用 `harness-only` 打底,再按需补。fullstack profile 多出来的 Wiki + standards 对小项目是噪音。
24
+
25
+ ---
26
+
27
+ ## 2. 引导 6 步(通用模板)
28
+
29
+ ### Step 1:种子 prompts + invoke 模板
30
+
31
+ ```bash
32
+ cd <project-root>
33
+ npx @cyning/harness init --preset harness-only --ide cursor
34
+ ```
35
+
36
+ 产物:
37
+ - `docs/harness/prompts/`:10/22/30/40 + FRAGMENT + TEMPLATE
38
+ - `docs/harness/invokes/TEMPLATE_invoke.md`
39
+ - `.cursor/rules/06-harness-pointer.mdc`
40
+
41
+ **注意**:`.cyning-harness/` 加到 `.gitignore`。
42
+
43
+ ### Step 2:AGENTS.md + CLAUDE.md
44
+
45
+ 模板源:`cyning-harness/ide/adapters/`
46
+
47
+ ```bash
48
+ cp <path-to-cyning-harness>/ide/adapters/CLAUDE.md.fragment.example <project-root>/CLAUDE.md
49
+ cp <path-to-cyning-harness>/ide/adapters/AGENTS.md.fragment.example <project-root>/AGENTS.md
50
+ ```
51
+
52
+ **CLAUDE.md**:薄层,基本不用改。替换 Verify 表里的技术栈(前端→删掉、后端→`pytest tests/ -q`)。
53
+
54
+ **AGENTS.md**:片段末尾追加项目专属段(~20 行):
55
+ - **读序**:README → 架构文档 → 图谱
56
+ - **命令**:项目专属 vitest/pytest/build 命令
57
+ - **边界**:不改什么、不碰什么
58
+ - **关键词**:项目专属关键词
59
+
60
+ ### Step 3:Agent 定义 + 权限
61
+
62
+ 创建 `.claude/agents/<project>-agent.md`:
63
+
64
+ ```markdown
65
+ ---
66
+ name: <project>
67
+ description: <项目描述> · spawn by Lead
68
+ tools: Read, Write, Edit, Grep, Glob, Bash
69
+ ---
70
+
71
+ 你是 **<project> agent**。
72
+
73
+ ## 必读
74
+ - `docs/harness/prompts/30-execute-code.md`
75
+ - `docs/harness/prompts/40-self-check.md`
76
+ - `docs/_tech_graph/graph.json`
77
+ - 当前 task:`docs/harness/tasks/active/task_*.md`
78
+
79
+ ## Open Folder
80
+ - **`<project>/`**
81
+
82
+ ## 边界
83
+ - 列出项目专属禁止项
84
+
85
+ ## Verify
86
+ - `pytest tests/ -q`
87
+
88
+ ## 回报(≤10 行)
89
+ Status / Deliverables / Blockers / Judgment
90
+ ```
91
+
92
+ `.claude/settings.json`:最小权限基线(Read/Bash 白名单)。
93
+
94
+ ### Step 4:技术图谱
95
+
96
+ **模块 ≤ 10 个 → 手写 graph.json**。模块多了再引入导出工具链。
97
+
98
+ 1. 创建 `docs/_tech_graph/` 目录
99
+ 2. 为每个模块写一个 `.ai.md`(node id + label + depends_on + entry_points)
100
+ 3. 手写 `graph.json`(`schema_version: graph_v2`)
101
+ 4. `README.md` + `99_mermaid_protocol.md`
102
+
103
+ **验证**:
104
+
105
+ ```bash
106
+ python -m src.probe graph-query --graph docs/_tech_graph/graph.json --node <entry> --depth 2
107
+ ```
108
+
109
+ ### Step 5:CI 门禁
110
+
111
+ 复制 `task_validate.py` 并定制:
112
+
113
+ ```bash
114
+ cp <source-repo>/tools/harness_task_validate.py <project-root>/tools/
115
+ ```
116
+
117
+ 修改:
118
+ - `ACTIVE_TASKS` 路径 → `<project>/docs/harness/tasks/active/`
119
+ - `_section_body` 用子串匹配(`title not in ...`),不精确匹配
120
+
121
+ CI workflow(`.github/workflows/tech-graph.yml`):
122
+ - `task_validate` job:扫描 PR diff 中的 `docs/harness/tasks/` 变更
123
+ - `pytest` job:跑全量测试
124
+
125
+ ### Step 6:验证链路
126
+
127
+ ```bash
128
+ pytest tests/ -q # 单测全绿
129
+ python -m src.probe verify --task <path> # probe 自带 verify
130
+ npx @cyning/harness verify --target . --task <path> # cyning-harness verify
131
+ python tools/harness_task_validate.py <path> # task 门禁
132
+ ```
133
+
134
+ 全部 exit 0 则引导完成。
135
+
136
+ ---
137
+
138
+ ## 3. 常见问题
139
+
140
+ ### Q: 为什么不直接用 fullstack profile?
141
+
142
+ fullstack 带了 Wiki、standards L1/L2、task bootstrap——小项目用不上,反而增加 Agent 读取负担。
143
+
144
+ ### Q: task_validate.py 的 `_section_body` 为什么要子串匹配?
145
+
146
+ 因为 task 文件常用编号标题(`## 3. 失败路径`),精确匹配会遗漏。用 `title in heading` 替代 `title == heading`。
147
+
148
+ ### Q: GATE_ROW regex 为什么要接受反引号?
149
+
150
+ 因为 human_gate 表的状态列可能写 `approved` 或 `` `approved` ``,正则加 `?` 做可选反引号匹配。
151
+
152
+ ---
153
+
154
+ ## 4. 修订记录
155
+
156
+ | 版本 | 日期 | 说明 |
157
+ | --- | --- | --- |
158
+ | v1 | 2026-06-29 | 初版 · 从 harness-probe 引导实录抽象 |
@@ -1,28 +0,0 @@
1
- ```mermaid
2
- flowchart TD
3
- %% version: YYYY-MM-DD — AI 协议版 · 须与 00_main.md 语义等价
4
- %% 拓扑:见 99_mermaid_protocol.md
5
-
6
- %% === 入口阶段 ===
7
- Q[[用户 / 客户端请求]] --"->"--> E{"应用入口"}
8
- // → src/main.py#L1 或 app/router/index.ts#L1(替换为真实锚点)
9
-
10
- %% === 主业务分支 ===
11
- E --"主路径 A"--> M1[[核心业务处理]]
12
- // → 例:handlers/resource.py::handle_create
13
- E --"主路径 B"--> M2[[次要路径]]
14
- // → 例:handlers/health.py::health_check
15
- E --"管理/批处理"--> ADM[[Admin / Job]]
16
- // → 例:jobs/ingest.py::run_sync
17
-
18
- %% === 子流程折叠 ===
19
- M1 --"::triggers"--> FLOW_MAIN[[主路径子流程]]
20
- FLOW_MAIN --"加载"--> FLOW_DOC[>10_flow_MAIN.md]
21
-
22
- M1 --"->"--> DB[(持久化)]
23
- // → 例:db/repository.py 或 ORM 层
24
- ADM --"->"--> DB
25
-
26
- %% === 按需加载(可选)===
27
- E --"加载"--> STRUCT_DOC[>01_struct.md]
28
- ```
@@ -1,43 +0,0 @@
1
- ```mermaid
2
- flowchart TD
3
- %% Entry: 例 POST /api/v1/resource — 替换锚点为真实代码
4
- %% 拓扑协议:见 99_mermaid_protocol.md
5
-
6
- %% === 请求阶段 ===
7
- IN[[HTTP 请求]] --"->"--> AUTH[[鉴权 / 会话校验]]
8
- // → middleware/auth.py::require_user 或 src/auth/guard.ts
9
-
10
- AUTH --"[ok]"--> VAL[[参数校验]]
11
- AUTH --"[err]"--> ERR_AUTH[>Auth Failed]
12
- // → middleware/auth.py#L42
13
-
14
- VAL --"[ok]"--> SVC[[业务服务层]]
15
- // → services/resource_service.py::handle
16
- VAL --"[err]"--> ERR_VAL[>Validation Failed]
17
-
18
- %% === 数据阶段 ===
19
- SVC --"->"--> REPO[[仓储 / ORM]]
20
- // → repositories/resource_repo.py::find_by_id
21
-
22
- REPO --"->"--> DB[(数据库 / 存储)]
23
- // → db/session.py 或 ORM model
24
-
25
- REPO --"?>"--> HIT{record exists?}
26
- HIT --"[no]"--> NOTFOUND[[404 / 空结果]]
27
- HIT --"[yes]"--> SVC
28
-
29
- SVC --"[err]"--> BIZERR[[4xx 业务错误]]
30
- // → services/resource_service.py 业务规则分支
31
-
32
- %% === 响应阶段 ===
33
- SVC --"->"--> RESP[[组装响应 DTO]]
34
- RESP --"->"--> OUT[[返回 JSON / 页面]]
35
- // → handlers/resource.py::to_response
36
-
37
- %% === 归档 ===
38
- OUT --"::archives"--> LOG[[结构化日志]]
39
- // → observability/logger.py
40
-
41
- %% === 顶层链接 ===
42
- IN --"加载"--> MAIN_DOC[>00_main.md]
43
- ```