双向依赖对账:Archify 的静态扫描到底在查什么

发布时间:2026/10/10 11:42:03

双向依赖对账:Archify 的静态扫描到底在查什么 双向依赖对账Archify 的静态扫描到底在查什么【免费下载链接】archifyTurn any idea, plan, or codebase into a beautiful interactive diagram. An agent skill for Claude Code, Codex, and more.项目地址: https://gitcode.com/GitHub_Trending/arch/archify如果让大模型直接输出一张架构图你会得到一张「看起来对」的图而 Archify 的做法是让大模型只输出一份结构化 JSON再由确定性程序完成渲染、校验和修复。最近几周 GitHub 热榜上围绕 Archify 的讨论反复出现「可核验」「自动对账」「五道校验」这些词但很少有人说清楚这份静态扫描到底在查什么为什么一张关系图需要「双向」比对以及那些规则为什么长成声明式 JSON 而不是一堆散落的 if 判断。这篇文章直接进源码从校验器、Delta 对账器和 workflow 语义契约三条线拆开 Archify 的静态扫描内核。从代码到依赖图校验发生在渲染之前Archify 的产物链是「AI 生成结构化 JSON → 确定性程序渲染」。这一步的关键在于JSON 只是一堆约定俗成的数据真正定义「什么样的 JSON 合法」的是 schemas/architecture.schema.json 这类 JSON Schema——组件必须有id、type、label连接必须声明from与to且from/to必须复用节点 id 的正则约束^[a-zA-Z][a-zA-Z0-9_-]*$。Schema 本身不是代码运行时靠的是由 scripts/generate-validators.mjs 生成的 renderers/shared/generated-validators.mjs——一份把五类图workflow、sequence、dataflow、lifecycle、architecture的 schema 全部编译为可执行校验函数的内嵌文件。它开头就写着「Generated by scripts/generate-validators.mjs. Do not edit by hand.」保证校验逻辑与 schema 永远同步。入口在 renderers/shared/validator.mjs 的validateSchema按图类型取出对应校验器失败时不会只丢一句「校验失败」而是把每个错误映射成带code、subject、evidence、supportedFixes的结构化诊断。比如additionalProperties会提示「remove unsupported property …」required会提示「add required property …」。为了让大模型能修annotatedPath还会把/nodes/3/label这种路径解析成/nodes/3 (id: router) /label——报错信息里带上最近元素的 id 或 label这是修复闭环能成立的前提。更关键的是「证据」这一层。节点上可以挂sources字段common.schema.json 中定义为sourceReferences约束path必填、line/end_line可选的数组最多 3 条把每个组件钉到仓库里的具体文件与行号meta.repository则要求同时给出url与 40 位十六进制的revision。也就是说图上每个框都声明了「我在代码里的证据在哪」这为后面 Delta 对账里的evidence变更分类埋下了伏笔。双向比对为什么单向检查拦不住漂移很多人以为「校验」就是检查图里有没有未知节点但 Archify 真正做的是双向对账——对每一条关系同时检查它的两个端点并且对每个节点的入度、出度同时做约束。这有两层含义。第一层在渲染期的端点检查。以 renderers/architecture/render-architecture.mjs 为例对每一条 connection 它同时检查两端if (!components.has(conn.from)) problems.push(Connection ${conn.label || conn.from} references unknown source ${conn.from}.); if (!components.has(conn.to)) problems.push(Connection ${conn.label || conn.to} references unknown target ${conn.to}.);这不是 architecture 图独有的特例——sequence 的消息检查from/to参与方render-sequence.mjs、lifecycle 的转移检查from/to状态render-lifecycle.mjs、dataflow 的流检查from/to节点render-dataflow.mjs全部是双端成对出现。对应测试也写进了 layout-rules.test.mjs把connections[0].to改成ghost断言输出unknown target ghost。这类悬空边正是「单向检查」最容易漏掉的漂移形态——只校验「源节点存在」而不管目标图上就会画出一根指向空气的箭头。第二层在版本对账器 delta/architecture-delta.mjs。它把同一架构的 Before / After 两份快照做规范化后逐一比对canonicalArchitecture会对组件按 id 排序、对sources数组做内容级排序、对 connections 按 id 建立稳定索引——先保证「同一张图」无论书写顺序如何都产生相同的规范形再开始 diff。比对结果按字段分组分类const COMPONENT_FIELDS { semantic: [type, label, sublabel, tag, brand, icon], evidence: [sources], geometry: [row, col, pos, size], }; const CONNECTION_FIELDS { topology: [from, to], semantic: [label, variant], geometry: [fromSide, toSide, route, via, ...], };这个分组本身就是一份「对账语义字典」改from/to是拓扑变更改 label 是语义变更改sources是证据变更改坐标是几何变更。compareEntities对同一 id 在两边做对称扫描——只在 base、只在 head、两边都在但字段不同——生成 added / removed / changed 三类变更并产出带 Before / Delta / After 三态视图和机器可读 receipt 的审查产物。没有稳定 id 或出现重复 id 时直接以delta/stable-id-required、delta/duplicate-stable-id失败而不是静默猜测哪条边对应哪条边。workflow 的语义契约把「双向」推到了图论层面。renderers/workflow/workflow-compiler.mjs 的semanticContractDiagnostics先为每个节点统计incoming与outgoing两套度数allowedRoots出现时它是「零入度节点」的完整白名单任何没有入边又不在名单里的节点都会报workflow/unexpected-rootallowedTerminals对称地约束「零出度节点」报workflow/unexpected-terminalrequiredEdges要求某条有向边精确存在按from → to查集合requiredPaths则通过一个 BFS 的可达性函数reachable(from, to)验证从 A 到 B 存在一条有向路径。注意这里的措辞requiredEdges要求「一个精确的书写方向」requiredPaths允许中间节点但必须顺着边的方向。也就是说即使 A 到 B 在无向意义上是连通的只要方向不对照样判定失败——这正是「单向检查」永远给不出的保证。校验规则的可声明性与误报调优把校验规则写成声明式 JSON 而不是埋在代码里收益在 workflow.schema.json 里看得很清楚semanticChecks: { type: object, additionalProperties: false, minProperties: 1, properties: { allowedRoots: { type: array, items: { $ref: #/$defs/id } }, allowedTerminals: { type: array, items: { $ref: #/$defs/id } }, requiredEdges: { type: array, items: { $ref: #/$defs/semanticRelation } }, requiredPaths: { type: array, items: { $ref: #/$defs/semanticRelation } } } }规则集合本身就是 schema 的一部分多一个规则名就是多一个additionalProperties白名单之外的键——这直接让「规则」可以被静态校验、被工具链审阅、被测试覆盖。编译器的 READMErenderers/workflow/README.md给出了明确的使用原则allowedRoots/allowedTerminals一旦出现就是完整名单且「这些检查在布局之前运行、不改写 SVG 或 receipt 字节、不得仅为解决一个路由诊断而弱化规则领域事实未知就省略对应字段」。误报调优靠的是「声明而非关闭」当编译器报告一个语义违规时它给出的两条supportedFixes都指向补充事实而不是放宽检查。以workflow/unexpected-root为例修复建议是「给该节点补上缺失的入边」或「如果它本是有意作为源则把它声明进allowedRoots」——前者的本质是把漂移修掉后者的本质是把「它确实是源」这个领域事实显式写进契约。两者都让规则更完整而不是让规则失效。这一点和整个工具的交付哲学一致。SKILL.md 规定finalize命令的第一道门就是 showcase 校验且「非零退出码永远不是成功」失败时按 receipt 中的稳定规则码、subject、measured evidence 与supportedFixes修复而不是对着 Node 堆栈盲猜。校验从「一次通过/不通过」变成了「带可执行修复建议的闭环」——这正是社区讨论里反复出现的「Archify 交图前过五道校验」的源码落点。小结把 Archify 的静态扫描拆开看它在查的事情其实非常具体schema 是否合法、每条边两个端点是否都存在、每个零入度/零出度节点是否被显式声明、sources证据是否随版本变化、以及requiredPaths的可达性是否在正确的方向上成立。双向对账的价值不在于「查得更多」而在于让漂移无处遁形——悬空边、反向路径、未声明的根与终端这些恰好都是单向检查的结构性盲区。当规则本身变成可声明的 JSON、错误变成带证据与修复建议的结构化诊断静态扫描才真正从「门禁」变成了「对账」。【免费下载链接】archifyTurn any idea, plan, or codebase into a beautiful interactive diagram. An agent skill for Claude Code, Codex, and more.项目地址: https://gitcode.com/GitHub_Trending/arch/archify创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/10 11:42:03

软件测试面试题全解析:从基础理论到项目实战

最近有个准备转行的朋友找我,开口就问:“软件测试面试题刷了不少,怎么一到面试还是被问住?”我让他答一道最常见的“什么是软件测试”,他背得很流利,我再一追问“那你觉得测试的目的是证明没bug吗”&#x…

2026/10/10 11:42:03

Linux下用hostapd打造专业软AP:从原理到配置踩坑全解析

说真的,如果只是想搭个WiFi热点,市面上随手能抓一大把现成方案——Windows自带的移动热点、手机里的个人热点、几十块钱的随身WiFi,哪个不比在Linux终端里敲hostapd来得省事?但真到某些场景下,你会发现这些“开箱即用”…

2026/10/10 11:42:03

SysY到RISC-V编译器全链路实现:词法分析至汇编生成

简介:本资源是一份面向高校编译原理课程学习者的高分实践项目,完整实现了从SysY语言到RISC-V汇编的端到端编译器,适用于期末大作业、课程设计及编译系统入门实践。项目基于C开发,代码结构清晰、注释详尽,涵盖词法分析&…

2026/10/10 12:47:19

SpringBoot微信小程序农产品交易系统毕设源码跑通与二次开发指南

简介:这份资源是面向高校计算机相关专业学生与Java Web开发初学者的毕业设计论文文档,围绕云浮市特色农产品交易场景,给出基于微信小程序的完整设计与实现方案,可帮助读者理解如何将Spring Boot后端与小程序前端结合,解…

2026/10/10 12:47:19

PySpark环境搭建与日志分析实战指南

1. 为什么“PySpark入门”总卡在第一步?——环境搭建不是填坑,而是建路基很多人点开“PySpark大数据入门”教程,前三分钟还在兴奋地复制粘贴命令,十五分钟后就盯着终端里一串红色报错发呆:java.lang.NoClassDefFoundEr…

2026/10/10 12:47:19

Windows 11 25H2安装失败根因解析:PE兼容性、U盘规范与硬件门禁

1. 为什么25H2安装不能照搬旧流程:从PE兼容性断层说起微PE启动盘在Windows 11 25H2安装场景中,首次出现了“能进系统、进不了安装器”的典型断层现象。这不是PE本身坏了,而是微软在25H2安装镜像底层做了三处关键变更:第一&#xf…

2026/10/10 12:47:19

后端开发必备:三角函数公式速查与Java代码实战指南

简介:这份PDF面向学习高等数学、准备考研或从事算法与工程计算的读者,系统整理了三角函数公式与求导公式,帮助解决角度计算、表达式化简及微积分求导等基础问题。资源共1个PDF文件,压缩包约100KB,内容按模块编排&#…

2026/10/10 12:42:19

SQL注入从原理到实战:探测、利用与防护全解析

1. SQL注入到底是什么做了这么多年Web安全测试,也带过不少刚入门的安全工程师,“SQL注入”这个名字几乎每天都会听到,但真能把它讲透的人其实不多。很多人背了payload、记了技巧,却说不清楚这条SQL语句到底是怎么被“污染”的。这…

2026/10/10 7:31:36

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/9 20:15:56

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 0:04:53

从逻辑门到计算机:数字电路核心原理与全加器搭建实战

如果你拆过一台旧电脑的主板,盯着那些黑乎乎的小芯片看上一会儿,可能会冒出同一个疑问:这堆引脚密集的元件,到底是怎么“变”出那么复杂的应用的?答案并不在某个神秘的部件里,而是在所有芯片内部都在反复使…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑