ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Ruflo 架构决策合规审查指南:基于 ruflo-adr 插件驱动 ADR 代码一致性检查

Ruflo 架构决策合规审查指南:基于 ruflo-adr 插件驱动 ADR 代码一致性检查 Ruflo 架构决策合规审查指南基于 ruflo-adr 插件驱动 ADR 代码一致性检查【免费下载链接】ruflo The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated项目地址: https://gitcode.com/GitHub_Trending/cl/rufloruflo 将架构决策记录ADR作为团队约定的制度层而adr-review技能承担这一制度的执法环节在代码合并之前扫描 git 差异将每次变更与已接受的 ADR 逐条比对从而发现违反决策、决策漂移drift与不合规non-compliance。本文基于 adr-review/SKILL.md 展开结合 ruflo-adr 插件 的源码实现与配套脚本完整还原 ADR 合规审查的七步工作流、报告模板、底层 AgentDB 图存储语义并给出可直接落地到 CI 与合入前检查的实践建议。为什么需要ADR 合规审查制度如何约束代码架构决策如果只停留在文档层面很容易在长周期迭代中与代码脱节一个新 PR 可能悄悄引入某个 ADR 明确否决的技术栈也可能修改某个 ADR 的 Consequences 中明确警告过的模块更隐蔽的情况是——代码引用了已被superseded的旧 ADR仍然按过时的决策行事。ruflo 的做法是把这种制度约束工程化ADRs 以 Markdown 形式存放本仓库主目录 v3/docs/adr 即维护着从 ADR-074 至 ADR-177 的近两百条决策记录同时被索引进 AgentDB用因果边causal edges记录supersedes、amends、depends-on、related等关系。adr-review正是运行在这一双层数据模型之上的合规检测器一侧扫描磁盘上的 diff一侧查询图数据库中的决策关系把人为 review难以覆盖的机械比对交给 Agent 完成。ADR 的完整生命周期由 adr-architect 智能体 与配套技能维护状态机为proposed → accepted → deprecated / superseded by ADR-XXX。其中只有accepted已接受状态的 ADR 具有强制力adr-review以此为唯一的执行边界。ruflo-adradr-review 所处的完整工具生态ruflo-adr是负责 ADR 全生命周期管理的插件。理解 adr-review 的位置需要先看清它所在的技能与命令矩阵技能用途与 adr-review 的关系adr-create创建新 ADR顺序编号 AgentDB 注册产生待审查的决策adr-index导入磁盘 ADR 到 AgentDB增量 upsert只增不删adr-review 的检索数据源adr-review审查代码变更是否符合已接受 ADR本文主题adr-verify读回图命名空间暴露悬挂引用/环/状态不一致review 之前的图健康门禁adr-reindex对已删除 ADR 做 drop-and-rebuild 对账解决 verify/review 都无法察觉的孤儿行在交互式命令层面commands/adr.md 提供了 7 个子命令create、list、status、supersede、check、graph、search。其中adr check与本文的adr-review技能语义最接近——它通过git log --oneline -20与git diff HEAD~20..HEAD圈定最近变更再逐一检测被引用 ADR 是否仍为 accepted属于近 20 次提交的轻量自动扫描而adr-review技能面向显式 PR/分支--branch参数适用于合入前的深度审查。adr-review的可用工具被严格限制在 SKILL.md 的 frontmatter 中体现了该技能的审查者定位只读 AgentDBhierarchical-query、causal-query、memory_search加基础文件/git 操作Bash、Read、Grep、Glob不含任何写图数据库的causal-edge/hierarchical-store工具从权限上保证审查过程不改动决策数据。ADR 合规审查核心工作流七步详解adr-review的完整流程可归纳为七个步骤取差异 → 定位相关 ADR → 载入决策内容 → 逐文件比对违规 → 查询关系图 → 输出合规报告 → 给出处置建议。第 1 步获取变更集Get diff审查的起点是确定代码发生了什么变化git diff main...HEAD --name-only # 列出变更文件 git diff main...HEAD # 获取完整 diff若指定了--branch BRANCH则以该分支替换main作为对比基准。用--name-only先拿文件清单是为了第二步可以按文件逐个 grep 定位 ADR 引用避免一开始就载入整个 diff 造成上下文浪费。第 2 步为每个变更文件定位相关 ADRFind relevant ADRs这一步采用文本命中 语义检索双通道确保不漏决策用Grep在变更文件内搜索 ADR 引用形如ADR-\d的模式常出现在注释、文档字符串、issue 链接中反向到docs/adr/及插件级docs/adrs/目录 grep 提及了这些变更文件路径或所属模块的 ADR调用mcp__plugin_ruflo-core_ruflo__agentdb_hierarchical-query/memory_search以文件路径 变更摘要为查询词做语义检索找出与当前改动主题相关、但文本上并未显式互相引用的 ADR。第三条通道依赖 ruflo 的 AgentDB 图存储。在 ADR 导入时每个 ADR 会被写入adr-patterns命名空间键形如ADR-id::basename值为标题 Context 首段 文件路径 状态 日期 标签见 scripts/lib/index-records.mjs 中adrRecordKey/adrRecordValue的实现关系边则写入adr-edges命名空间键为确定的relation:FROM-TO如supersedes:ADR-098-ADR-095。语义检索正是跑在adr-patterns之上。第 3 步载入 ADR 内容并聚焦关键字段Load ADR content对第 2 步筛出的每个相关 ADR用Read读取全文后只聚焦三处Decision决策正文——当时决定做什么Status状态——决定该 ADR 是否具有强制力只强制acceptedConsequences后果——决策预期带来的约束是判断代码是否触线的主要依据。标准 ADR 模板的结构可参考 ruflo-adr/REFERENCE.mdContext 说明动机、Decision 说明变更、Consequences 拆为 Positive / Negative / Neutral 三段、Links 承载Supersedes:/Amended by:/Related:关系行。实际仓库中例如 ADR-097-federation-budget-circuit-breaker 就清晰标注了**Status**: Accepted与**Related**: ADR-086…等字段可直接对照学习。第 4 步逐文件执行违规比对Check for violations这是审查的核心决策点。针对每个变更文件 x 每个相关 ADR依次自问四个问题代码变更是否与某条已接受决策直接矛盾是否启用了某条 ADR 中明确否决的技术或模式是否以 Consequences 警告过的方式改动某模块代码是否引用了已deprecated 或 superseded的 ADR其中第 4 点是高频隐蔽问题。ruflo 在 ADR-098 这类大型 ADR 上采用Supersedes/Related交叉引用一旦代码仍锚定旧编号就等于按已作废的决策继续开发。第 5 步查询关系图核对决策是否被取代Query relationship graph文本比对之外还必须验证决策当前是否仍然有效。技能要求调用mcp__plugin_ruflo-core_ruflo__agentdb_causal-query检查被引用的 ADR 是否已被supersedes边指向后继者。若命中则应标记代码引用了过期决策对应报告中的 Warnings 类别。从源码看这条边数据的形成规则在 parse-adrs.mjs 的parseLinks中实现它会同时解析 frontmattersupersedes:、amended-by:、amends:、related:、depends-on:与正文关系行**Supersedes:**、**Related:**等且supersedes方向的边被规范化为from: old-ADR → to: 本 ADR保证图查询时沿supersedes边从旧指向新的语义一致。第 6 步输出结构化合规报告Report审查结论以模板化的合规报告呈现四类条目各自对应不同的处置语义## ADR Compliance Report ### Violations - [ ] file:line — violates ADR-NNN: reason ### Warnings - [!] file references superseded ADR-NNN (replaced by ADR-MMM) ### Compliant - [x] file — consistent with ADR-NNN ### Unlinked Changes - [?] file — no ADR coverage (consider creating one)这份报告的设计意图值得注意Violations是最严重的类别通常应阻塞合入Warnings提示代码锚定了过期决策建议迁移到后继 ADRCompliant记录已核验无违规的文件供 reviewer 快速确认覆盖范围Unlinked Changes是容易被忽视的制度空白——变更未与任何 ADR 建立关联技能会提示考虑新建一条 ADR覆盖它防止架构决策记录出现覆盖盲区。第 7 步给出处置建议Suggest actions对每条 Violation技能需要给出二选一的处置方向修改代码以回归决策或提交新 ADR 取代被违反的旧决策。前者意味着代码有误后者意味着决策本身已过时——这保证审查始终是双向的制度与代码谁错了就修正谁。从技能到实现ADR 图数据的读取语义adr-review只是合规审查的消费端其正确性完全取决于底层索引数据的质量。理解下面几处实现细节有助于审查者正确解读工具返回结果。ID 规范化为什么ADR-1与ADR-001必须指向同一个节点仓库中同时存在两种 ADR 编号风格v3 用ADR-097插件级偶见零填充若不做统一正文里写Supersedes: ADR-0001而文件名是ADR-001就会产生大量悬挂边。parse-adrs.mjs用normalizeAdrId统一处理≤3 位数字补零到 3 位、≥4 位数字原样保留并且文件名的解析与正文引用的提取走同一规范化函数源码注释将其列为 Bug 4 修复确保supersedes边永远落到同名节点上。引用提取的防误报设计ADR 正文中常混入#1697GitHub issue、PR 1234、commit abc123等非 ADR 引用。extractAdrRefs在提取前会先剥离#数字、issue 数字、PR 数字、commit 哈希以及反引号包裹的片段避免把 issue 号误识别成ADR-1697之类的伪引用。审查者如果看到某个 ADR 被莫名其妙关联应想到这是否为解析残留——不过从源码看该路径已被系统性修复。双格式解析v3 风格与插件风格本仓库同时存在两种 ADR 书写格式索引器必须都认识v3 风格# ADR-097: Title一级标题 **Status**: Accepted行如 ADR-096-encryption-at-rest插件风格YAML frontmatterid: ADR-NNNN、status: Proposed如 ruflo-adr 自身的 ADR-0001。parseAdr对 id/title/status/date/tags 逐一做 frontmatter 优先、正文正则兜底的双通道解析其中parseStatus的正则同时容忍冒号位置、Nygard/MADR 全加粗风格以及- **Status**:列表前缀对应源码中的 Bug 2 与 issue #2781 修复——审查报告中的状态判断依赖这一层稳健解析。扫描边界的刻意排除SKIP_DIRS定义了node_modules、.git、dist、v2、.next、.turbo、build、.claude、.brain等目录。后两者尤为关键.claude/worktrees会镜像整个仓库导致每条 ADR 被重复索引 23 次.brain是 ruvnet-brain 持有的外部仓库浅克隆实测曾混入 1415 条外部 ADR 而自身仅 19 条。审查时若发现 ADR 数量异常应先怀疑扫描根是否越过了这些目录。合入前的完整防线review / verify / reindex 如何协作adr-review并非孤立技能ruflo 用一整套索引 → 验证 → 审查 → 对账链路把架构合规做成闭环adr-verify是 review 之前的地基检查运行scripts/verify.mjs读回adr-patterns与adr-edges暴露三类问题悬挂引用边指向不存在的 ADR常见于兄弟仓库引用或文件被删、supersede 环A 取代 B 且 B 取代 A属于数据损坏、状态不一致某 ADR 是supersedes边源却未标Superseded。其退出码约定为默认仅在发现环时返回 1设置VERIFY_STRICT1则任何问题都返回 1可直接作为 CI 的 fail-closed 门禁。adr-reindex处理的是 verify 与 review 都看不见的盲区adr-index只增不删删除某个 ADR 文件后其在adr-patterns的残留行既无悬挂引用也不构成环永远隐形。adr-reindex通过memory purge --force硬删两个命名空间并据磁盘现状全量重建用后置计数断言保证图与磁盘一致。审查前若怀疑图里 ADR 比磁盘上多应运行它而非再跑一次 verify。这套链路的具体检查项由 scripts/smoke.sh 固化为结构契约当前插件版本 v0.4.1覆盖 plugin.json 版本与关键词、5 个技能 frontmatter 完整性、7 个子命令齐全度、agent 对 REFERENCE.md 的引用、adr-patterns命名空间一致性、README 对claude-flow/cliv3.6 的 pin 等。配套的单元测试如 index-idempotency-2660.test.mjs、parser-bullets-2659.test.mjs从解析鲁棒性与边幂等性两侧保障数据质量间接为adr-review的检索可靠性托底。实战建议与边界条件把adr-review落到团队流程时以下几点来自技能设计本身与仓库实现值得作为准入规范触发时机技能明确建议在PR 合入前、重大代码变更后、周期性合规检查三个时点运行。对应 README 中声明的最简调用形态adr-review [--branch BRANCH]可与 CI 的 PR 触发器绑定。只对 accepted 施加强制力proposed/deprecated状态的 ADR 不构成违规依据superseded属于曾有效但已被取代代码引用它应报 Warnings 而非直接定性 Violation。区分三类发现Violation阻塞、Warning迁移提示、Unlinked Changes制度覆盖空白三者处置路径完全不同报告模板本身即是 triage 清单。关注 namespace 语义边界按 ruflo-agentdb 的查询技能memory_*与embeddings_search才接受 namespace 参数而agentdb_hierarchical-*、agentdb_causal-*按 tier/controller 路由。因此技能第 5 步的causal-query与第 2 步的memory_search分属两套检索机制调用时不要给后者传 namespace、给前者传 tier 之外的多余参数。保留原始证据报告的file:line定位应尽量精确到行便于 reviewer 在 PR 讨论中直接引用同时把命中的 ADR 编号与状态含是否 superseded写进报告形成可追溯的审查轨迹。ruflo 的adr-review给出了一种可复制的思路把代码与架构决策的一致性从依赖人工记忆的软约束变成由 diff 扫描、语义检索与因果图查询共同支撑的可执行检查。对于任何积累了较多 ADR、且经历过决策写了但代码悄悄漂移的团队这套技能及其背后的索引/验证/对账基础设施都是值得直接借鉴的工程范式。【免费下载链接】ruflo The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated项目地址: https://gitcode.com/GitHub_Trending/cl/ruflo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表