bounded-systems/string-audit
GitHub: bounded-systems/string-audit
具备成本意识的类型化文案审计器,通过 content-hash 缓存和溯源校验,仅对变更内容触发 LLM 审计调用,防止 AI 生成文案中出现捏造事实和套路化痕迹。
Stars: 0 | Forks: 0
# @bounded-systems/string-audit
一个**具备成本意识且基于溯源的文案审计器**。每个字符串都是一个命名的、*有类型的* 符号;
审计按 type 进行范围划分;结果通过 **content-hash 进行缓存**,因此只有发生更改的文案
才需要支付(昂贵的)LLM 调用费用。重写内容无法凭空捏造事实——主张会与溯源来源
进行核对,绝非捏造。
```
node audit.mjs # deterministic, offline, free
ANTHROPIC_API_KEY=… node audit.mjs # real audits — only on cache-misses
```
## 一个边界,四大特性
1. **是符号,非无结构数据 (blobs)** —— `pdp.hero.headline → { type: "headline", value }`。
**type 即契约**;它决定了应用哪些审计。
2. **基于 type 划分范围的审计** —— `headline` → 长度/冲击力;`cta` → 动作动词;`meta` →
≤160;`claim` → **grounding**(即“每个主张皆须证明”的检查)。
3. **内容寻址缓存** —— `key = sha256(auditVersion : type : value)`。未更改的
符号 → 命中缓存 → 跳过调用。只有自上次运行以来的差异部分会产生费用;
更新 `AUDIT_VERSION` 即可有针对性地使其失效。该机制可免费提供 `▲▼ 与上次运行的对比`。
4. **基于溯源,而非捏造** —— `claim` 只能断言 grounding 来源中存在的事实;未经溯源验证的
数字/评分/规格将被 *标记*,绝不会作为既定事实被重写。
## Providers
- **deterministic**(默认,离线)—— 本地检查;可复现;无需 API key。
- **anthropic** (`anthropic.mjs`) —— 当设置了 `ANTHROPIC_API_KEY` 时,在缓存 **未命中** 时
运行。通过 tool-use (`{score, findings}`) 实现结构化输出,采用具备成本意识的默认
模型 (`claude-haiku-4-5`,可通过 `AUDIT_MODEL` 覆盖),并在
系统 prompt 中强制实施 grounding。
## 文案规范性检查 —— 确定性的文案校验
在每个符号、每次运行时执行(低成本,从不缓存):
- **spell** —— 现代词汇表 ∪ `dictionary.txt` (品牌术语)。
- **grammar/style** —— write-good (检测被动语态、冗长、含糊其辞的词汇)。
- **ai-isms** —— 机器生成文案的套路化痕迹:`it isn't X — it's Y`
式对立句式、`the easy part … the hard part` (简单部分…困难部分) 句式、三段式
排比、破折号节奏、修辞性悬念片段、聊天机器人伪影/占位符,以及流行词填充
(`delve`, `seamless`, `leverage`, `unlock`, `robust` …)。这些模式与词库是
[`ai-tells.json`](ai-tells.json) 中的 **数据** (每条规则带有各自的 severity),因此
它们能够追踪上游语料库,而不是硬编码在代码中;而结构性特征 (破折号计数、首语重复、
三段式) 则保留在 `prose.mjs` 中。
- **overclaims** —— 绝对化、无法证实的语言,且与覆盖范围术语绑定 (`every
privileged effect`, `always enforced`);请限定其范围或提供来源链接。这是 grounding 检查的
文案等价物 —— 普通正文中常规的 `never`/`always` 不会受此影响。
- **proofread** —— 拼写/语法检查遗漏的机械性失误:重复单词、双重/多余
空格、标点前空格、逗号后缺失空格、重复标点、
混用直角引号与弯引号。即那种“这到底有没有校对过?”的痕迹。
- **readability** —— 让你读不下去的文案:过长的句子,以及 (针对 `body`/`meta`)
依据 Flesch 阅读容易度判定为确实晦涩难懂的文案。用于衡量“我为什么要读这个?”的代理指标。
- **overlap** —— 文案重复或高度相似的符号。
每条发现都包含一等的 **severity** `{ level, msg }` —— `error` `✗`
(准确性/诚实度:未溯源、拼写错误、overclaims) · `warn` `⚠` (ai-ism/proofread) ·
`suggestion` `·` —— 并且 `audit.mjs` 会根据 `level` 渲染相应的字形 (类似于 Vale 的严重级别)。
这些规则源于对公开文案的初步阅读 (“AI-isms 让我生不如死”;“不确定有没有
校对过”;“绝不声称具备 *every* 特权效果”)。基于 key 调用的 Anthropic
审计器也遵循相同的规则,因此 LLM 路径也会对其进行标记。
**现有技术。** 专门针对 AI 痕迹的 linting,[Vale](https://github.com/vale-cli/vale)
\+ [`vale-signs-of-ai-writing`](https://github.com/ammil-industries/vale-signs-of-ai-writing)
(实现了 [维基百科的 *Signs of AI writing*](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing))
以更大的规模和置信度分级涵盖了同样的领域。我们的词库种子源自
该语料库;此处的差异化在于 typed-symbol 目录、content-hash 缓存,
以及 grounding/overclaim 检查 —— 这些都是普通文案 linter 做不到的。请参阅处于开放状态的
“adopt Vale” issue,了解如何将二者整合。
## 复用 bounded-systems 技术栈
| 需求 | 基础组件 |
|---|---|
| 基于 hash-keyed 的结果缓存 | [`cas`](https://github.com/bounded-systems/cas) — 基于 SHA-256 的字节存储 |
| 签名且可追溯血缘关系的派生 | [`anchored-chain`](https://github.com/bounded-systems/anchored-chain) |
| typed symbol 目录 + 逐类型断言 | [`brand/content`](https://github.com/bounded-systems/brand) |
| 预算感知 | [`prx`](https://github.com/bounded-systems/prx) |
本地的 `.cache/` (基于 SHA-256 键控) 已经是一个有效的 CAS;`cas` 包 +
`anchored-chain` 血缘关系可以通过未命中路径上的同一套 get/put 接口无缝接入。
## 存储后端 (`STORE=`)
使用相同的 `get/put/has` 接口,提供三种后端:
- **`fs`** (默认) —— 内容寻址的文件缓存。
- **`cas`** —— 实现 cas 的 `BlobStore` 接口 (内容寻址的字节存储,去重) +
一条 anchored-chain 派生日志 (输入→输出的血缘关系)。
- **`socket`** —— 连接到 **挂载在处于 room 状态的 Unix socket 上的 store daemon**:
node store-daemon.mjs & # 挂载 $ROOM/store.sock (默认为 .room/)
STORE=socket node audit.mjs # 通过挂载的 store 进行审计
该 room (`ROOM=`,默认为 `.room/`) 是挂载点 —— 即 socket “门”的客满式
归宿;CAS 的 blobs/refs/lineage 数据就存放在 `/cas` 下。
## 状态
v0.3 —— 可运行。已验证确定性 + 缓存 + grounding;Anthropic 路径已
实现 (使用 key 进行实时验证)。文案规范性检查套件 (ai-isms, overclaims, proofread,
readability) 采用了数据驱动的 [`ai-tells.json`](ai-tells.json) 规则 + 一等公民级别的
severity。请参阅开放的 issue 了解生产化进度 (`cas`/`anchored-chain` 后端,真实的
`strings.json` 目录,可选的 Vale provider — #6)。
标签:DLL 劫持, GNU通用公共许可证, MITM代理, Node.js, SOC Prime, 内容审计, 大语言模型, 开发工具, 数据可视化, 文本处理, 自定义脚本