dapei.cdr skill
Cognitive Discovery Runtime (CDR) 通过代码逆向推导,构建从微观到宏观的三层资产型知识体系。
用户入口
@dapei bootstrap mall-order
(One-shot: runs cdr.profile + cdr.entries.candidate in a single call.
The AI still owns cdr.entries.propose / confirm — see P3 red line.)
@dapei profile repo mall-order
@dapei discover entries for mall-order
@dapei discover behaviors for mall-order
@dapei discover states for Order in mall-order
@dapei compose domain Transaction from mall-order behaviors
@dapei compose business rule order-amount-positive for order-create
@dapei init capability map for E-Commerce Mall
@dapei suggest domains
@dapei synth capability map for E-Commerce Mall
@dapei render L1 portal
@dapei generate documentation portal
@dapei list assets
设计原则
| 原则 | 规则 |
|---|---|
| P0 AI 是扫描器,引擎是校验器 (v0.3) | 引擎不用 regex/annotation 预设入口候选;返回代码文件清单后由 AI 决定入口;引擎仅校验 AI 提交的事实证据(file 存在、line 在范围) |
| P1 行为先于领域 | domain 产物必须携带 derived_from: [behavior-id, …];禁止仅凭包名命名领域 |
| P2 入口驱动 | 深析仅从 status: confirmed 的入口开始 |
| P3 证据优先 | kind=fact 必须附带 sources[](file/line/repo);kind=inference 必须有 derived_from[];kind=unknown 必须有 reason |
| P4 增量更新 | profile / entries 携带 revision;代码变更 → stale 标记 |
三层知识结构
L1 宏观层 — 产品功能地图 (Capability Map)
↑ 聚类自
L2 领域层 — 领域模型 + 入口目录 (Domain + Entries)
↑ 推导自
L3 流程层 — 行为链路 + 状态机 + 业务规则 (Behavior + State + Rules)
边界
| dapei 平台 | Agent |
|---|---|
| 代码文件清单(cdr.entries.candidate)、schema 校验、YAML 索引、evidence 落盘校验 | 代码阅读、入口识别、业务语义理解、行为追踪、规则提炼 |
| 目录管理、增量 stale 检测 | 确认入口、生成 fact 级产物 |
| VitePress 站点编译 | 不涉及(自动化生成) |
关键不变量:AI 永远不直接落盘。所有 cdr.*.upsert 路径必须先经引擎校验 evidence(sources[].file 必须存在于 repos/<repo>/<file>,line 必须在文件行数范围内)后才能写入 YAML。这是 P3 红线。
路由能力
| 用户意图 | Capability | v0.3 说明 |
|---|---|---|
| 生成 repo 技术画像 | cdr.profile |
移除 frameworks 字段(扫描器职责移交给 AI) |
| 一键 bootstrap(画像 + 入口候选) | cdr.bootstrap |
新增 — 串起 profile + entries.candidate;不调 propose/confirm(P3 红线) |
| 列出代码文件供 AI 读取 | cdr.entries.candidate |
新增 — 廉价文件清单 + 内容切片 |
| AI 提交一条入口(含 evidence) | cdr.entries.propose |
新增 — 引擎校验 file:line |
| 发现入口候选(薄封装) | cdr.entries.prepare |
退化为 cdr.entries.candidate 的别名,加 workflow 提示 |
| 确认入口 | cdr.entries.confirm |
要求 sources[];缺证据拒绝 |
| 发现行为链路 | cognitive.discover → cognitive.artifact.upsert |
不变 |
| 写入行为产物(结构化字段) | cdr.behavior.upsert |
fact 级 sources 强校验 |
| 推导状态机 | cdr.state.derive |
inference 草稿;sources 可选 |
| 聚合领域模型 | cdr.domain.compose |
derived_from 强校验 |
| 组合业务规则 | cdr.business.compose |
新增(在 v0.2) — 5 种 rule kind |
| 推荐领域聚类 | cdr.domain.suggest |
新增(v0.8) — 引擎只读聚类,AI 审阅后 compose |
| 初始化功能地图 | cdr.capability.map.init |
不变 |
| 合成功能地图 | cdr.capability.map.synth |
新增(v0.8) — 从 domains 自动聚类 + 引擎回填 spans_repos / fact_ratio |
| 列出所有资产 | cdr.index.list |
不变 |
| 生成文档门户 | cdr.doc.generate |
不变 |
| 渲染 L1 portal | cdr.reversecluster.doc.generate |
新增(v0.8) — /l1/ section + cluster-suggestions |
| 跨仓查询(读) | cdr.query |
新增(v0.10) — 按 event / writes_table / calls_target / target_repo / entity / id_contains / created_by_feature 过滤;read-only |
| 查询 pipeline 状态 | cdr.pipeline.status |
新增(v0.10) — 8 阶段 status + next_action(input_template) |
| 把 feature 链到 CDR 资产 | cdr.feature.link |
新增(v0.10) — 给所有 cognitive index / domain / capability-map 资产打 created_by_feature 标签;feature.close 自动调 |
工作流
Phase 0 — Profile(技术画像)
@dapei profile repo mall-order
目标:生成 repo 级技术画像,包含语言栈、框架、目录结构、测试命令。
产出:docs/as-is/profiles/<repo>.yaml
Phase 1 — Entry Discovery(入口发现,v0.3 重设计)
@dapei discover entries for mall-order
目标:列出 repo 中的代码文件,让 AI 读取并识别入口,引擎不做框架预设。
新流程:
- 引擎:
runCapability('cdr.entries.candidate', {repo: 'mall-order'})- 返回
files[],每项含relpath/language/content(已 inline) - 没有 framework 字段,没有 pattern 匹配
- 返回
- AI (在 chat session 中): 阅读
content,用 LLM 的理解力识别入口- 找出 Spring
@RestController/ NestJS@Controller/ FastAPI@app.get/ Express (app.get) / Quarkus / Ktor / Hapi / Axum / gRPC / GraphQL / 自定义路由 / 动态注册
- 找出 Spring
- AI: 对每个识别出的入口,调
runCapability('cdr.entries.propose', {repo, id, type, file, line, method, path, sources: [{file, line, repo}]})- 引擎校验
sources[].file存在于repos/<repo>/<file> - 引擎校验
line在文件行数范围内 - 通过则写入
docs/as-is/entries/<repo>.yaml(status: candidate)
- 引擎校验
- 人 / AI: 调
runCapability('cdr.entries.confirm', {repo, entry_id, summary, priority, sources: [...]})标记为status: confirmedsources[]是必填的——确认入口也必须指 evidence
旧版(v0.2)废弃路径: cdr.entries.prepare 现在退化为薄封装,内部调用 cdr.entries.candidate 后返回 workflow 描述;不再返回平台自动识别的 entry 列表。新代码请直接用 cdr.entries.candidate + cdr.entries.propose。
产出:docs/as-is/entries/<repo>.yaml(status: candidate → status: confirmed)
Phase 2 — Behavior Mining(行为深析)
@dapei discover behaviors for mall-order
使用已有的 cognitive.discover + cognitive.artifact.upsert 工作流。
v0.6 — Use structured calls
behavior.calls[] 现在接受两种形态:
# Legacy — 继续可用
calls: ["PaymentClient", "InventoryService"]
# Structured (v0.6 推荐) — 引擎会把 target_repo 提到 index
calls:
- target: PaymentClient
protocol: http
target_repo: mall-payment
evidence: { file: src/paymentClient.ts, line: 12, repo: mall-order }
- target: order.events:order.created
protocol: mq
evidence: { file: src/events/publisher.ts, line: 3, repo: mall-order }
每个调用的字段:
target(必填):被调的 service / topic 名protocol(推荐):http | grpc | mq | event | rpc | othertarget_repo(推荐):被调方所属的 repo 名——AI 必须显式声明,引擎不做语义推断evidence(推荐):单条 SourceRef,指向调用点(不是定义点)
为什么需要 target_repo:portal 渲染时,Cross-service calls 段只列有 target_repo 的调用;cognitive-index 的 target_repos 字段只从显式声明的调用中抽取。不声明 = 引擎无信息可记录,与 v0.5 的"AI 自由填写"行为相同。
从已确认的入口出发,沿调用链追踪:
- 识别数据库写入 (
writes) - 识别事件发布 (
events) - 识别外部调用 (
calls) - 识别潜在风险 (
risks)
产出:docs/as-is/behavior/<id>.yaml
Phase 3 — State Mining(状态推导)
@dapei discover states for Order in mall-order
从已有 behavior 中推导实体状态机。
产出:docs/as-is/state-machines/<entity>.yaml
Phase 4 — Domain Composition(领域聚类)
@dapei compose domain Transaction from mall-order behaviors
将零散的 behavior 聚类为领域模型,必须携带 derived_from。
产出:docs/as-is/domains/<domain>.yaml
Phase 5 — Capability Map(功能地图)
@dapei init capability map for E-Commerce Mall
初始化产品级功能大图,关联已有领域。
产出:docs/as-is/capabilities/product-map.yaml
Phase 5.5 — Cross-repo Business Rules(v0.5 跨仓库业务规则)
@dapei build cross-repo rules
@dapei build cross-repo portal
目标:把"一个仓库做完某动作,另一个仓库在什么业务语义下做什么动作"沉淀为业务规则——不是图,是规则。引擎读所有 business-rule 的 applies_to[],按 (id, repo) 复合键反查 index.behaviors[],输出 docs/as-is/cross-repo/cross-links.yaml,分组渲染到 portal /cross-repo/。
问自己(AI 主动识别):
| 跨仓库关系类型 | 业务语义 | 写哪种 kind? |
|---|---|---|
| A 服务的 HTTP 调用到达 B 服务 | 同步集成 | kind: authorization(谁可以调)或 kind: sla(超时约束) |
| A 服务 publish 事件 → B 服务 MQ consumer 触发 | 异步补偿 | kind: compensation("如果 A 失败要 rollback 什么") |
| A 服务 publish 事件 → B 服务要在 N 秒内消费 | 时延约束 | kind: sla(明确写 "must be captured within 30s") |
| A 服务和 B 服务共享同一行 DB 记录 | 一致性 | kind: invariant("X 字段两边必须一致") |
| A 服务状态机触发 B 服务状态机 | 状态推进 | kind: sla("A 切到 PENDING_PAYMENT 后 B 必须 30s 内切到 PAID") |
每识别出一条跨仓库关系,就调 cdr.business.compose 写一条规则:
applies_to: [behavior_id_in_repo_a, behavior_id_in_repo_b, ...]—— 把两边的 behavior id 都填进去kind按上表选confidence.kind = fact时必须带sources[](指向被识别为订阅者的代码,例如subscriber.handle(event)的文件行号)
对引擎的要求:
引擎做的是只读计算——不写 behavior / 不写 business-rule。AI 端必须主动调 cdr.business.compose 把跨仓库关系先沉淀成业务规则,然后 cdr.business.crosslink 才能算出来。这是 v0.5 的本质:业务规则是 AI 端的责任,跨仓库视图是引擎端的呈现。
@dapei build cross-repo rules 调用的能力:cdr.business.crosslink
@dapei build cross-repo portal 调用的能力:cdr.crossrepo.doc.generate
产物:
docs/as-is/cross-repo/cross-links.yaml(引擎计算结果,分组 by kind).dapei/docs-portal/cross-repo/(portal 渲染,按 kind 分组页面 + Mermaid 关系图)
Phase 5.7 — Reverse-cluster to L1(v0.8 反向聚类为 L1)
@dapei suggest domains
@dapei synth capability map for E-Commerce Mall
@dapei render L1 portal
目标:从已经写好的 behavior / business-rule 反向聚类出候选 domain 和候选 capability map,让 AI 端审阅、命名、调优后再 commit。引擎永远不直接写 domain.yaml —— compose 仍然是 AI 端的事。
两阶段流水线(建议调用顺序):
cdr.domain.suggest
↓ 写入 docs/as-is/cross-repo/domain-suggestions.yaml
↓ AI 审阅 clusters[], 选有用的
cdr.domain.compose (人工逐条)
↓ 写入 docs/as-is/domains/<domain>.yaml
cdr.capability.map.synth
↓ 读取 composed domains + suggestions, 回填 spans_repos/fact_ratio
↓ 写入 docs/as-is/capabilities/product-map.yaml
cdr.reversecluster.doc.generate
↓ 读取 product-map + suggestions
↓ 渲染 .dapei/docs-portal/l1/
第一步:cdr.domain.suggest
引擎按 4 种边类型把 cognitive index 的 behaviors 聚类为连通分量:
| 边类型 | 强度 | 数据来源 |
|---|---|---|
| shared-events | 强(weight 4) | behavior.events[] 共享 |
| shared-writes | 中(weight 3) | behavior.writes[].table 共享 |
| cross-repo-calls | 中(weight 2) | behavior.calls[].target_repo |
| business-rule | 弱(weight 1) | business-rule.applies_to[] 同时引用两边 |
聚类结果是只读建议,写到 docs/as-is/cross-repo/domain-suggestions.yaml。每个 cluster 带:
suggested_name+suggested_domain_slug+naming_reason(从 events 高频主语推断)confidence: high | medium | low(high = shared-events + 跨 repo)behavior_keys[]、repos[]、evidence[]
AI 端做什么:读 yaml,挑出置信度够高的 cluster,逐个调 cdr.domain.compose 把它们落实成 domain。每个 compose 出来的 domain 才有 derived_from 红线保护。
第二步:cdr.capability.map.synth
引擎读 domain 来源(按优先级):
input.manual_domains[](AI 端预备的精选清单)docs/as-is/domains/**/*.yaml(已 compose 的)domain-suggestions.yaml(仅当use_suggested_domains: true)
对每个 capability,引擎从 cognitive index 反查 spans_repos / behavior_count / fact_ratio —— 这是 AI 端没办法自己算的客观指标。结果写到 docs/as-is/capabilities/product-map.yaml(与 v0.3 的 cdr.capability.map.init 同文件,但字段更丰富)。
第三步:cdr.reversecluster.doc.generate
读 product-map + domain-suggestions,渲染 /l1/:
l1/index.md— 产品全景 + Mermaid 总图(capability 子图 + 跨 repo 关系)l1/<capability-id>.md— 每个 capability 的详情页l1/cluster-suggestions.md— cdr.domain.suggest 的建议原文,方便 AI 对照
关键约束:
cdr.domain.suggest绝不调cdr.domain.compose—— 这是 P1 红线的延伸:建议和 commit 分两步。cdr.capability.map.synth是幂等可重入的;不传manual_domains[]时自动从 composed + suggested 拿。- 空工作区是合法状态:synth 写
status: empty头,doc gen 渲染 empty-state l1/index.md,AI 看得到明确的下一步指引。
@dapei suggest domains 调用的能力:cdr.domain.suggest
@dapei synth capability map for X 调用的能力:cdr.capability.map.synth
@dapei render L1 portal 调用的能力:cdr.reversecluster.doc.generate
产物:
docs/as-is/cross-repo/domain-suggestions.yaml(建议清单,可覆盖重写)docs/as-is/capabilities/product-map.yaml(合成的功能地图).dapei/docs-portal/l1/(L1 portal section,与/cross-repo/平级)
Phase 6 — Documentation Portal(文档门户)
@dapei generate documentation portal
自动编译所有认知资产为 VitePress 静态站点:
- L1 功能地图 → 首页 + 能力页
- L2 领域模型 → 领域页 + Mermaid 模块关系图
- L3 行为/状态 → 流程页 + Mermaid 流程图/状态图
- 代码溯源链接 → 可点击跳转源文件
产出:.dapei/docs-portal/(VitePress 项目)
启动预览:
cd .dapei/docs-portal && npx vitepress dev
Phase 8 — Pipeline Status(编排状态查询)
@dapei what is the cdr pipeline status for mall-order
读出端 cdr.pipeline.status,read-only。给定 repo 后返回 8 阶段
(profile / entries / behavior / state / domain / rule / capability-map / doc)
的 status + artifacts_count + 下一个该调的能力和 input 形状。
- status 取值:
done— 阶段产物已存在blocked— 还没产物,且下一步依赖未完成skipped— 阶段可选(rule 默认 skipped)
next_action:每个未完成阶段的capability/input_template/hint。AI 应该把next_action.capability当作下次必调,input_template.required_fields列出必填字段。up_to_phase参数:截断报告(如只关心entries之前)。overall_status:empty/partial/complete(skip 算 complete 的一部分)
典型用法:
# 完整跑过 profile 后,问下一步
runCapability('cdr.pipeline.status', { repo: 'mall-order' })
# next_action: cdr.entries.candidate
# 已跑完 entries,只关心 state 之后
runCapability('cdr.pipeline.status', {
repo: 'mall-order',
up_to_phase: 'state'
})
rule 阶段:在用户未显式声明 business-rule 知识时默认 skipped。
AI 决定"这个 repo 确实没有跨仓 SLA / 授权规则"时,可直接跳过到
capability-map。
Phase 7 — Query(跨仓查询)
@dapei query behaviors that emit order.cancelled
@dapei find behaviors calling PaymentClient in mall-payment
@dapei list behaviors created by feature payment-refactor
读出端 cdr.query,read-only,跨仓/跨能力查找:
- 行为级过滤:
event/writes_table/calls_target/target_repo(state-machines 在这类 filter 下自动隐藏——避免语义混淆) - 通用过滤:
entity(state-machine)/id_contains(子串)/repo(精确)/created_by_feature(精确)/target(behavior/state-machine/business-rule/domain/capability-map/any) - 结果:
{ results: [...], total, next_step },limit 默认 50,上限 500 - 永不变更 cognitive index 或 docs/as-is/——纯读
典型用法:
# 找出所有调用 mall-payment 的行为
runCapability('cdr.query', { target_repo: 'mall-payment' })
# 找出所有 order-cancel 行为的入口
runCapability('cdr.query', { id_contains: 'order-cancel', target: 'behavior' })
# 列出某个 feature 创建的所有资产
runCapability('cdr.query', { created_by_feature: 'payment-refactor' })
created_by_feature 来源:feature.close 自动调 cdr.feature.link
给本次 feature 接触到的所有 cognitive index / domain / capability-map 资产
打上 created_by_feature: <feature> 标签(也支持 feature.review 显式调)。
pre-v0.10 资产无该字段——filter 会保守返回空而不是 error。
当查询语义模糊时(比如行为 yaml 里 events 字段缺失),cdr.query 会保守返回空而不是猜测——这是 P1 红线的延伸。
产物目录结构
docs/as-is/
├── profiles/ ← L0 技术画像
├── entries/ ← L2 入口目录
├── behavior/ ← L3 行为链路
├── state-machines/ ← L3 状态机
├── business-rules/ ← L3 业务规则
├── domains/ ← L2 领域模型
└── capabilities/ ← L1 功能地图
.dapei/
├── cognitive/index.yaml ← 统一资产索引
└── docs-portal/ ← VitePress 生成站点
红线
- 禁止跳过 Entry 确认直接生成 behavior
- 禁止 domain 产物缺少
derived_from - 禁止用 grep 替代语义分析
- 禁止将 CodeGraph 静态拓扑直接作为业务事实
- 禁止(v0.3)在引擎里写 framework-specific regex/annotation 扫描器——AI 已经会读代码,引擎只需要校验 AI 提交的 evidence
- 禁止(v0.3)
cdr.entries.confirm/cdr.behavior.upsert在kind=fact时不带sources[]——引擎直接拒收 - 禁止(v0.3)AI 直接写 YAML 文件——必须通过
runCapability让引擎校验后再落盘
兼容性
原有 cognitive.* 能力保持不变。CDR 是扩展层,不是替代层。
| 旧意图 | 映射 |
|---|---|
@dapei analyze behavior for X |
→ cognitive.discover (不变) |
@dapei list behaviors |
→ cognitive.artifact.list (不变) |
@dapei cognitive validate |
→ cognitive.artifact.validate (不变) |
v0.3 迁移指南(从 v0.2 升级)
| v0.2 | v0.3 |
|---|---|
@dapei discover entries for X → cdr.entries.prepare 返回 entries[] 平台扫描结果 |
@dapei discover entries for X → cdr.entries.candidate 返回 files[],AI 读 content 后调 cdr.entries.propose |
entries[].framework = "spring" / "nestjs" / "fastapi" / "express" |
字段不存在——AI 不需要这个分类 |
entries[].discovered_by = "platform" / "platform-annotation" |
discovered_by = "ai" 统一 |
cdr.entries.confirm 仅需 summary |
cdr.entries.confirm 必须带 sources[] |
cdr.profile 包含 frameworks: [...] |
frameworks 字段移除——AI 从 manifest_files 推断 |
| 引擎硬编码 4 套 framework regex(150 行) | 引擎 0 行 framework 知识——AI 处理 |
测试侧迁移:tests/unit/cdr.test.mjs 中 35 个"扫到 @GetMapping" 类断言被替换为"拒收 line 99999" / "拒收 file 不存在" / "kind=fact 无 sources 拒收" 三类 evidence-validation 断言;tests/ai-behavior/cdr-ai-as-scanner.yaml 新增 L4 transcript fixture 覆盖完整 candidate → propose → confirm 流程。
与其他 skill 的协作
- feature:
feature.create注入 CDR 索引摘要到related-cdr-context.md - repos:
cdr.profile替代repos.analyze中的语义 grep 部分 - workflow:
context.buildv3 注入 profile + entries + behavior 摘要表 - validation:未来 COG-001 门禁:进入
solution-design前需 ≥1 confirmed entry + ≥1 fact behavior