双向依赖对账: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),仅供参考

相关新闻

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

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

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

2026/10/10 11:42:02 阅读更多 →
Linux下用hostapd打造专业软AP:从原理到配置踩坑全解析

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

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

2026/10/10 11:42:02 阅读更多 →
SysY到RISC-V编译器全链路实现:词法分析至汇编生成

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

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

2026/10/10 11:42:02 阅读更多 →

最新新闻

YOLOv8实战:可口可乐产品识别数据集训练与避坑指南

YOLOv8实战:可口可乐产品识别数据集训练与避坑指南

简介:这是一份面向YOLO系列算法学习者的产品识别目标检测数据集,内含5166张带标签图像,覆盖可口可乐等产品的识别场景。数据集已按训练/验证需求划分,并配备data.yaml配置文件,可直接用于yolov5、yolov8、yolov9、yolo…

2026/10/10 18:11:45 阅读更多 →
异或运算从原理到实战:位运算中的对称加减法

异或运算从原理到实战:位运算中的对称加减法

最近在网上翻到一道很经典的题:一组整数里,每个数字都出现了偶数次,只有唯一一个数字出现了奇数次,要求把它找出来。很多人第一反应是哈希表,数一遍再遍历。但如果再加一条限制,空间复杂度必须做到 O(1)&am…

2026/10/10 18:11:45 阅读更多 →
练题簿在线免费刷题:创建个人任务,把刷题、听题和模考目标放到每天的学习中

练题簿在线免费刷题:创建个人任务,把刷题、听题和模考目标放到每天的学习中

练题簿在线免费刷题:创建个人任务,把刷题、听题和模考目标放到每天的学习中选择题库、设置目标与时间,查看任务进度,再通过通知和完成记录跟进自己的复习。准备考试或复习课程时,明确今天练什么、还差多少,…

2026/10/10 18:11:45 阅读更多 →
Python实现多无人机任务分配:PSO优化与约束求解

Python实现多无人机任务分配:PSO优化与约束求解

简介:本资源是一套面向算法工程师、智能无人系统开发者及高校相关专业学生的多无人机协同任务分配实战项目,聚焦于用Python实现粒子群优化(PSO)算法解决动态任务调度难题,适用于农业巡检、应急响应、物流配送等实际场景…

2026/10/10 18:10:44 阅读更多 →
插件“消失“之谜:从缓存到市场同步,Codex 插件加载机制到底怎么工作

插件“消失“之谜:从缓存到市场同步,Codex 插件加载机制到底怎么工作

插件"消失"之谜:从缓存到市场同步,Codex 插件加载机制到底怎么工作 【免费下载链接】plugins OpenAI Plugins 项目地址: https://gitcode.com/GitHub_Trending/plugins123/plugins "打开 Codex 的插件页面,搜 Playwrig…

2026/10/10 18:09:43 阅读更多 →
全卷积网络实战:Penn-Fudan行人分割数据集解析与训练

全卷积网络实战:Penn-Fudan行人分割数据集解析与训练

简介:这份资源围绕全卷积网络(FCN)在Penn-Fudan Database上的行人检测与分割实践展开,面向具备一定深度学习基础、希望掌握像素级语义分割的开发者与研究者。内容涵盖FCN的核心原理——以卷积层替代全连接层、通过上采样与跳跃连接…

2026/10/10 18:08:43 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* 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 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* 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 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* 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 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* 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 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* 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 10:38:42 阅读更多 →