Lyspo/ballast

GitHub: Lyspo/ballast

Ballast 将欧盟《AI Act》合规流程转化为代码仓库中的可执行流水线,通过扫描代码、分类风险、生成文档并在 CI 中检测治理偏移,帮助工程团队交付始终与实际系统一致的合规文件。

Stars: 0 | Forks: 0

Ballast # Ballast **面向 AI 系统的合规即代码。** 让您的 AI 产品带着齐全的合规文件顺利交付。 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/39/39faa54be350a1dab8afd3b2fb8c1c83e4d9cff84abfef2374d19a18053687c4.svg)](https://github.com/Lyspo/ballast/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
1876 年,经过 Samuel Plimsoll 多年的奔走呼吁,英国船舶被要求在船体上画一条线。 装载超过这条线,标记就会没入水下——任何人从码头都能看到,无需文书或检查员。极限变得 清晰可读,而非争论不休。 这一规定花了十四年时间才真正发挥作用。1876 年的法案允许船东自行决定画线的位置,有的 人甚至把它画在了烟囱上;直到 1890 年,根据贸易委员会 1886 年的载重线表确定了该标记的 位置并将其作为强制要求后,这个标记才真正具有了意义。 这个故事的第二部分,正是本项目的核心所在。 当前,AI 系统的治理文档恰恰相反:它被写在一个没人会打开的文档里,描述着一套已经变更过 九次的系统。 Ballast 将那条线重新画回了船体上。 ``` git clone https://github.com/Lyspo/ballast && cd ballast pnpm install && pnpm build node dist/cli/index.mjs demo ``` ## 功能说明 ``` ballast init Answer nine questions a scanner cannot answer for you ballast scan Find every model, SDK, prompt, tool definition and credential ballast classify Propose a risk classification — you confirm it ballast generate Write the risk assessment, model cards and compliance matrix ballast check Fail CI when the code and the paperwork disagree ``` 最后一点才是核心。其他所有步骤都只是生成文档;而 `check` 负责确保这些文档名副其实。 ``` ── Governance drift ───────────────────────────────────────────── ! New model gpt-4o-mini is called but not declared. src/screening.ts:42 The AI surface of this repository changed without the manifest being updated. Review the changes, then run `ballast scan --write` to record them, and re-run `ballast classify`. ``` 它运行时无需 API key、无需网络、也没有单次运行成本,因为按 pull request 收费的检查机制 迟早会因为预算被砍掉,而需要密钥的检查则无法在 fork 仓库中运行。 ## 开发动机 欧盟《AI Act》的合规义务正一波波地落地,且这些要求还在不断调整。关于 AI 的《数字综合 法案》——即 [法规 (EU) 2026/1744](https://eur-lex.europa.eu/eli/reg/2026/1744/oj/eng),自 **2026 年 7 月 27 日**起生效——将 独立的 Annex III 系统的高风险义务推迟至 **2027 年 12 月 2 日**,将嵌入式产品系统的义务推 迟至 **2028 年 8 月 2 日**,同时保留了针对聊天机器人和生成式 AI 的第 50 条透明度义务(生 效日为 **2026 年 8 月 2 日**),以及 GPAI 相关义务(自 **2025 年 8 月 2 日**起保持不变)。 对于已经上市的生成式系统,第 50(2) 条规定的机器可读标记要求宽限至 **2026 年 12 月 2 日**, 除此之外没有其他变动。 因此,对于大多数工程团队而言,当前的紧迫问题并非“《AI Act》是否会到来”,而是一个更棘手 的问题:*哪项*义务适用于*当前*系统,以及*何时*适用。这个问题需要从代码中寻找答案,并且 每当代码发生变更时,答案也会随之改变。 Ballast 正是为那些刚刚被问到“他们的功能是否符合合规要求”的工程师打造的,因为他们才是 真正了解系统实际行为的唯一人选。 **Ballast 在这方面姗姗来迟,本 README 应当坦诚这一点。** 商业平台——如 Credo AI、Holistic AI、OneTrust、IBM watsonx.governance——都在向首席风险官(CRO)推销仪表盘,而那些已经 拿下了这些买家的合规自动化供应商(如 Vanta 和 Drata)也正在其现有的装机量中增加 AI 模块, 这是 Ballast 所不具备的优势。此外,至少有五款开源工具已经在针对《AI Act》读取代码或网 络流量:Systima Comply、Regula、Warden 和 ArkForge 的 MCP 扫描器扫描源代码;AIR Blackbox 则在运行时拦截调用。其中有些做得很好。特别是 Systima Comply,它使用真正的 AST 来检测框 架,而 Ballast 目前使用的是基于行的匹配;并且它也自带了基线与差异比对的命令。 真正的区别在于扫描之后会发生什么。那些工具只是报告发现的问题并生成模板脚手架。而 Ballast 则会基于包含 38 项《AI Act》条款和 48 项义务的带日期知识库,通过带有审查者的 agent pipeline 直接起草实际的文档(如风险评估、模型卡片、合规矩阵)——审查者会攻击草稿, 并设立人工确认门控,在有人接受分类结果之前阻止文档生成。这是否比一个更好的扫描器更有 价值,是一个值得探讨的问题,[docs/business/competitive-analysis.md](docs/business/competitive-analysis.md) 对此进 行了客观的剖析,甚至包含了一张展示竞品在哪些方面更具优势的对比表格。 ## agent 的工作原理 `classify` 和 `generate` 运行着四个职能高度明确的 agent。 | | | | | --- | --- | --- | | **Surveyor** | 读取代码 | 在沙盒中执行 `read_file` / `list_files` / `grep`,仅限于此。确认系统对其调用的模型实际做了什么。报告其无法确定的内容。 | | **Pilot** | 进行分类 | 根据 Surveyor 的观察结果和您的问卷回答,推导出相应的欧盟《AI Act》层级和 NIST AI RMF 映射。 | | **Drafter** | 撰写文档 | 生成文档。每一项实质性陈述都必须附带对发现结果、配置回答或具体条款的引用。 | | **Examiner** | 攻击草稿 | 对抗性审查者。专门搜寻缺乏证据支持的陈述——尤其是那些关于并不存在的控制措施的陈述。 | 三个设计决策承担了大部分核心作用: **模型无法凭空捏造法律。** Pilot 的输出 schema 将引用限制在一个基于内置知识库构建的封闭 枚举集合中。如果捏造了条款编号,将无法通过 schema 验证,因此绝对不会混入文档中。单靠 prompt 是无法在与过度自信的模型交锋中幸存的。 **由人工确认分类结果。** `classify` 将其结论标记为 `proposed`(提议)。在有人工确认接受之 前,`generate` 将拒绝运行,并记录确认人的身份及时间。机器可以提出法律分类建议;但必须 由人来最终接受。 **Examiner 未解决的质疑会被展示出来,而非被掩盖。** 每份文档最多接受 `maxCriticIterations` 次检查(默认为两次,即一次重写),之后任何仍然存在的阻断性质疑都会被打印出来,并带入文 档的未决问题中。如果一个 pipeline 一直循环到审查者放弃为止,那它产出的将是满足审查者的 文档,而不是追求事实真相的文档。 Ballast 还会将自身的模型调用、工具调用、验证重试和人工审批记录到 `ballast/audit-log.jsonl` 中——包括模型版本、token 数量、请求哈希、延迟,以及该调用是实时的还是重放的。如果一个 工具要求其他团队保留其 AI 系统的操作记录,那么它绝不能连自己的记录都做不好。故意不记录 prompt 及响应的*内容*:因为这些文件会被提交到代码库,而 prompt 中往往包含源代码。 ## 安装说明 目前尚未发布到 npm,因此需要从源码安装: ``` git clone https://github.com/Lyspo/ballast && cd ballast pnpm install && pnpm build pnpm link --global # optional: puts `ballast` on your PATH ``` 需要 Node 22 或更高版本以及 pnpm。`scan`、`check` 和 `demo` 绝不会调用模型,也不需要 API key。`classify` 和 `generate` 会使用 `ANTHROPIC_API_KEY`——这是您自己的 key,费用由您自行承 担,每次运行通常只需几美分。这四个 agent 都已经在实时 API 上完成了端到端运行。 [docs/example-run.md](docs/example-run.md) 详细展示了完整的运行过程:21 次模型调用,花费约 1.16 美元,Pilot 拒绝猜测团队究竟属于提供商还是部署者,以及 Examiner 打开了 Drafter 的两个引 用并发现它们并不支持所附属的句子。所有对话记录及生成的文档都已提交,因此无需 key 即可完 整重放整个运行过程: ``` ballast classify examples/resume-screener --offline assets/demo-cassettes/classify.jsonl ballast generate examples/resume-screener --offline assets/demo-cassettes/generate.jsonl ``` 为了让其他人能够离线重放 agent 阶段,您可以针对内置示例录制一次会话: ``` ANTHROPIC_API_KEY=... pnpm cassettes:record ``` 这会将记录写入 `assets/demo-cassettes/`,随后供 `classify --offline` 和 `generate --offline` 重放。这些记录(Cassette)通过包含 prompt 版本的哈希值进行索引,因此修改 prompt 会导致 它们失效,重放时会直接且明确地报错,而不是为您提供一个针对已过时问题的旧答案。 ## 在 CI 中 ``` name: AI governance on: pull_request jobs: ballast: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: Lyspo/ballast@main ``` 该 action 会将偏移报告写入工作流摘要,并对外暴露一个 `verdict` 输出。一旦有可用的 tag,请 将其固定到相应的 tag 上;目前的 `@main` 已经如实指明了它当前所指向的位置。 退出代码:`0` 表示正常,`1` 表示存在实质性偏移,`2` 表示没有可用来进行比对检查的已提交基线。 ## 生成的内容 ``` ballast/ ├── manifest.yaml The declared AI surface. Read this one in a PR. ├── surface.json Exact scan baseline. `check` diffs against it. ├── classification.yaml The risk classification and who confirmed it. ├── risk-assessment.md Risks, mitigations, and what could not be established. ├── compliance-matrix.md Obligation → status → evidence, with dates. ├── model-cards/ One per model, describing your use of it. └── audit-log.jsonl Every agent interaction. Not committed by default. ``` 所有这些内容都是为了让您将其提交到版本库中。脱离了版本控制的治理文档既无法进行 review, 也无法进行差异比对,更无法让人相信它能准确描述发布时代码的真实情况。 ## 坦诚说明的局限性 Ballast 只读取源代码和问卷。它无法看到您的生产行为、训练数据、评估结果或运营流程,并且 它会在生成的文档中明确说明这一点,而不是含糊其辞地掩饰这些盲区。 知识库是欧盟《AI Act》和 NIST AI RMF 的精选子集,并带有版本号和日期。它不涵盖国家层面的 实施法律、协调标准或特定行业的法规。对 prompt 和工具定义的检测采用的是启发式算法,且已 明确标注——每一项发现都附带一个置信度等级,该工具绝不会声称其能力超出了其实际所能展示 的范围。 **本工具提供的不是法律意见。** 它是一种用来保持对您的系统行为进行准确、可审查记录的方法, 以便让您与提供法律意见的专业人士的对话能够从事实出发。请参阅 [docs/regulatory-notes.md](docs/regulatory-notes.md) 了解详细的方法论及其适用边界。 ## 文档 - [完整运行示例](docs/example-run.md) — 针对内置示例运行全部四个 agent 的全过程,未经编辑, 且包含对话记录及生成的文档 - [适用于您系统的义务及生效时间](docs/which-obligations-apply.md) — 面向大多数软件团队实际所属的四种形态 提供的一份通俗易懂的指南,其内容基于与分类器相同的知识库生成,因此文章与工具的解释 绝对保持一致 - [架构设计](docs/architecture.md) — 各个组件是如何协同工作的 - [监管合规说明](docs/regulatory-notes.md) — 知识库涵盖了哪些内容,以及未涵盖哪些内容 - [决策记录](docs/adr/) — 为什么选择开源,以及为什么它不是一个仪表盘 - [商业文档](docs/business/) — 随代码一同交付的战略规划 ## 开源协议 MIT © Theo Gandolphe
标签:DevSecOps, MITM代理, 上游代理, 合规自动化, 欧盟人工智能法案, 自动化攻击