

记录日期:2026-04-27 摘要:把“架构图/契约”从人工维护的说明文档升级为“真值驱动 + 自动渲染 + CI 门禁”的工程闭环;通过跨仓静态校验同时约束后端最小输出与前端不越界读取,减少接口漂移与排障成本。 标签:架构治理 / 文档工程化 / API 契约 / SSE / CI / 门禁 / 可验证文档 / 工程协作 涉及任务:自动渲染
.ai.md、跨仓契约定义、CI 自动门禁 核心主题:Architecture Graph 的工程化落地 —— 从“人工维护”到“真值驱动 + 自动校验”
单仓真值校验 自动渲染 .ai.md 跨仓契约定义 CI 自动门禁
(manifest_check) (render_ai) (contract_check) (GitHub Actions)
│ │ │ │
▼ ▼ ▼ ▼
└────────────────────┴──────────────────────┴──────────────────────┘
│
▼
技术图谱工程化闭环
递进关系:
图谱类型 | 文章中的名称 | 当前落地 | 状态 |
|---|---|---|---|
Architecture Graph | 架构图谱 / 系统边界 | docs/_tech_graph/ 下的入口总图、流程图、Struct 图 | ✅ 已落地 + 本次强化 |
Runtime Graph | 运行图谱 / 观测链路 | 14_runtime_observability.md + _contract_manifest.json | ✅ 已落地 |
System Graph | 系统图谱 / 跨仓契约 | 15_e2e_boundary.md + 跨仓校验脚本 | ✅ 已落地 |
本次工作的本质:围绕 Architecture Graph 做工程化增强 —— 把“人工维护的架构文档”升级为“真值驱动、自动渲染、CI 校验”的可信架构事实源。
.ai.md)改端点后,需要手工同步 00_main.ai.md,容易出现“manifest 更新了,但 .ai.md 没更新”。
区块替换策略:在 00_main.ai.md 中标记可机械生成的区块,脚本只替换该区块。
<!-- 00_main.ai.md -->
## 端点列表
<!-- AUTO:ENDPOINTS_AND_ANCHORS BEGIN -->
<!-- 以下内容由 tools/tech_graph_render_ai.py 自动生成 -->
- `GET /api/py/health`
- `POST /api/py/chat`
...
<!-- AUTO:ENDPOINTS_AND_ANCHORS END -->
## 业务子流程(手写,不动)
...

技术点 | 说明 |
|---|---|
幂等设计 | 多次运行输出一致,无额外 diff |
最小 diff | 只替换 auto 区块,手写内容不动 |
真值来源 | 从 _manifest.json 读取,不扫描代码 |
解耦策略 | "可机械生成的真值段落"与"人工维护的业务子流程"分离 |
tools/tech_graph_render_ai.py — 渲染脚本docs/_tech_graph/00_main.ai.md — 新增 auto 区块标记tools/tech_graph_manifest_check.py — 增加"建议运行 render"提示前后端隐式耦合:后端改了 SSE events 字段,前端解析崩;前端依赖了字段,但后端未承诺稳定。
契约真值 + 双向校验:
后端产出 (truth) ──⊇── 契约 (contract) ──⊇── 前端消费 (expect)
│ │ │
└─────── 脚本校验 ──────┴─────── 脚本校验 ──────┘
// docs/_tech_graph/_contract_manifest.json
{
"sse": {
"envelope": {
"event_values": ["chain", "done"]
},
"chain": {
"data_keys": ["type", "ts", "step_id", "payload"]
},
"done": {
"data_keys": ["ok", "mode", "run_id", "session_id"]
}
},
"frontend_anchors": [
"../ai-ink-brain/components/unified-chat/UnifiedChatPageClient.tsx",
"../ai-ink-brain/app/api/py/unified/chat/stream/route.ts"
]
}
规则 | 说明 |
|---|---|
backend_truth ⊇ contract_manifest | 后端至少产出承诺的键 |
frontend_expect ⊆ contract_manifest | 前端不得读取未承诺的键 |
frontend_expect.event_values ⊆ allowed_events | 事件枚举一致性 |
技术点 | 说明 |
|---|---|
静态抽取 | 用 regex/轻量解析抽键名,不做 AST/语义分析 |
双向约束 | 后端"至少产出" + 前端"不得越界" |
返回码语义 | 0=OK, 1=drift, 2=运行错误 |
契约优先 | 变更顺序:先改契约 → 再改后端 → 再改前端 |
docs/_tech_graph/_contract_manifest.json — 跨仓契约真值tools/tech_graph_contract_check.py — 校验脚本tools/tech_graph_contract_demo.py — 演示脚本(一键体验负向→恢复)docs/_tech_graph/15_e2e_boundary.ai.md — 图谱补充说明契约校验目前只能本地手动运行,PR 合并后才暴露漂移。
GitHub Actions 自动门禁:每次 PR / push main 自动执行跨仓契约检查。
Checkout 策略(方案 A):
# .github/workflows/tech-graph-contract.yml
jobs:
contract_check:
steps:
- name: Checkout backend
uses: actions/checkout@v4
with:
path: ai-ink-brain-api-python
- name: Checkout frontend
uses: actions/checkout@v4
with:
repository: cyning/ai-ink-brain
path: ai-ink-brain
- name: Run contract check
working-directory: ai-ink-brain-api-python
run: python tools/tech_graph_contract_check.py
关键约束:
../ai-ink-brain/ 保持相对路径一致.github/workflows/tech-graph-contract.yml — CI workflowdocs/_tech_graph/15_e2e_boundary.ai.md — 补充 CI 门禁说明_manifest.json → 单仓真值(端点/RPC/表/env)
_contract_manifest.json → 跨仓真值(SSE events 字段契约)
│
▼
tools/xxx_check.py → 校验脚本(返回码 0/1/2)
tools/xxx_render_ai.py → 渲染脚本(增量更新文档)
核心思想:先定义真值,再让代码和文档都向真值对齐。
不是全量生成文档,而是标记可机械生成的区块,只替换该区块。
<!-- AUTO:XXX BEGIN -->
<!-- 机器生成 -->
<!-- AUTO:XXX END -->
好处:减少 diff、避免误伤手写内容、可一键修复。
不是单向的"后端定义、前端遵守",而是双向约束:
0 # OK — 校验通过
1 # drift — 真值不一致(可被 CI 识别为失败)
2 # error — 运行错误(文件缺失、脚本异常)
不运行服务、不做 e2e,只做静态键名/枚举校验,速度快、稳定性高。
端点变更: 改后端 → 更新 manifest → 跑 manifest_check → (可选)跑 render
Events 变更: 更新 contract → 改后端 → 跑 contract_check → 改前端 → 再跑 contract_check
根据文章中的框架,当前三类图谱的落地状态:
已落地:
00_main.md — 入口总图(Mermaid 拓扑)01_struct.md — 数据库结构10~13_flow_*.md — 业务流程图(RAG/Text2SQL/FTS/RPC)_manifest.json — 真值来源tech_graph_manifest_check.py — 漂移校验tech_graph_render_ai.py — 自动渲染待增强:
已落地:
14_runtime_observability.md — 事件流、日志落点_contract_manifest.json — SSE 事件契约tech_graph_contract_check.py — 跨仓校验tech-graph-contract.yml — CI 门禁待增强:
已落地:
15_e2e_boundary.md — E2E 边界、锚点_contract_manifest.json — 前后端契约tech_graph_contract_check.py — 双向校验待增强:
文件 | 任务 | 作用 |
|---|---|---|
docs/_tech_graph/_manifest.json | 单仓真值 | 单仓真值(端点/RPC/表/env/anchors) |
docs/_tech_graph/_contract_manifest.json | 跨仓契约 | 跨仓契约真值(SSE events 字段) |
tools/tech_graph_manifest_check.py | 单仓真值 | 单仓真值校验 |
tools/tech_graph_render_ai.py | 自动渲染 | 从 manifest 增量渲染 .ai.md |
tools/tech_graph_contract_check.py | 跨仓契约 | 跨仓契约校验 |
tools/tech_graph_contract_demo.py | 跨仓契约 | 演示脚本(负向→恢复) |
.github/workflows/tech-graph.yml | 单仓真值 | 单仓 drift CI |
.github/workflows/tech-graph-contract.yml | CI 门禁 | 跨仓契约 CI |
今天的核心成果:把 Architecture Graph 从人工维护的文档,升级为"真值驱动 + 自动渲染 + CI 门禁"的工程化体系。 关键思想:先定义真值(manifest),再让代码、文档、前后端都向真值对齐,用脚本自动发现和拦截漂移。 后续方向:补齐 Runtime Graph 的错误分级/超时策略、System Graph 的前端状态机/数据流。
如果用一句话总结今天做的事:
把“架构图/契约/任务”从可读的文档,升级为可验证的协作协议,并用 CI 门禁把“越界读取”和“字段漂移”提前拦截在合并之前。
这类工作短期看像“偏工程治理”,但长期价值很直接:
如果你也在做 AI 辅助工程协作,我建议优先从这条“可验证的静态收敛层”开始:它能显著降低幻觉与漂移带来的隐性成本。