
andon
io.github.gulmezeren2-byte由 GitHub 账号 gulmezeren2-byte 发布v0.6.0更新于 Nov 3, 2026
Deterministic verification for AI-generated analysis: run a spec, inspect or diff a workbook
概览
以确定性算术复核成品报告与 Excel 工作簿中的数字是否与来源一致,并向助手提供 run、inspect、diff 三个工具。
- 可以做什么
- 按 YAML 规格运行算术检查:对账、内部一致性、schema 契约与 Excel 完整性
- 无需规格即可对工作簿做完整性扫描,发现错误单元格、被手填覆盖的公式、存为文本的数字与隐藏行
- 比较两个工作簿版本并分类每处变化,单独标出新出现的错误单元格与数值变动
- 返回字段名稳定的结构化结论与退出码,并对未能读取全部数值的检查给出覆盖计数
- 适用场景
- 适合助手起草分析、报告或表格后,在结果被发送、提交或合并前设置一道机械化的关卡。也适用于 CI 流水线、pre-commit 钩子以及需要明确通过/不通过结论的代理工作流。
- 运行要求
- 以 stdio 本地进程运行;安装 andon-verify 的 PyPI 包及 mcp 附加项后启动 andon-mcp 命令,或构建随附的 Docker 镜像。parquet 与 DuckDB 数据源需要额外附加项。未声明任何账号、API 密钥或环境变量。
安装
在 SourceWeft 中
- 打开 控制台中的 andon,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
andon
Stop the line when the numbers don't add up.
[CI] [PyPI] [Python] [License: MIT]
andon re-checks the numbers in finished analysis — the report your AI agent just drafted, the workbook a colleague "quickly updated" — against the data they came from and against themselves. It does this with arithmetic, not with another LLM: reconciliation, internal consistency, schema contracts and Excel workbook integrity, written down as a small YAML spec and enforced with exit codes.
[andon stopping the line on a sabotaged quarterly report]
That screenshot is real output. The example it runs on is in
examples/quarterly-report/, staged by a script that
plants the defects I keep meeting in real reporting work: a count taken from a stale
snapshot, a revenue total typed over by hand, shares that sum to 101.2, a total row
nobody updated after a data refresh, a #REF!, and freight numbers stored as text.
Why this exists
I'm an industrial engineer. I build and run operations reporting — delivery KPIs, forecast accuracy, inventory analytics — and over the last two years an increasing share of the first drafts around me has been written by AI agents. They are fast, tireless, and confidently wrong in ways a tired human is not: the filter that silently dropped cancelled orders, the percentage column that almost sums to 100, the total row that survived three edits of its parts.
The common answer is to ask a second model to review the first one. I think that is the wrong tool. Whether 539 rows really sum to 257,060.48 is not a matter of opinion, and no amount of model capability makes an opinion the right instrument for it.
Manufacturing solved this problem decades ago. On a Toyota line, any worker who spots a defect pulls a cord — the andon — and the line stops until the problem is understood. The machine equivalent, jidoka, is a machine that stops itself when it detects an abnormal condition. This tool is that cord for spreadsheets and reports: a small, deterministic gate between "the analysis is written" and "the analysis is sent."
The iron rules
andon's behavior is easier to trust because it is constrained. These rules are enforced in code, not just promised here:
- Only arithmetic can fail the build. Heuristic checks (distribution shifts, plausibility bounds) can raise a REVIEW flag; the engine will not let them FAIL, even if a buggy check tries.
- No silent blessings. Every report ends with what was read, what was skipped, and which worksheets were never touched (the report calls this the honesty block). A PASS covers the listed assertions and nothing else.
- A check that can't run is a finding, not a pass. Missing file, unreadable range, text in a numeric column — the run continues, the check is recorded as ERROR, and the exit code is non-zero. "Not verified" must never be readable as "fine."
- Read-only by construction. There is no code path that writes to your data.
Install
The PyPI distribution is named andon-verify (the bare andon name was already
taken); the command and the import stay andon — andon run ..., import andon.
From source: pip install git+https://github.com/gulmezeren2-byte/andon.
Quick start
Point andon at data and claims:
Or try the sabotaged example in this repo:
What it checks
Full parameter reference with examples: docs/checks.md.
Exit codes and CI
Exit codes are a contract:
As a GitHub Action — one line, and the verdict lands in your job summary:
Or plainly, in any runner:
As a pre-commit hook
Stop a commit before a broken report leaves your machine:
Using andon with AI agents
andon is built to be driven by agents, not to contain one:
--jsonemits the full report with stable field names; the exit code alone is enough for a go/no-go decision.- Error messages name the sources, columns and sheets involved, so an agent can repair its own spec instead of guessing ("Column 'Revenue' not found. Columns are: region, share_pct, revenue").
skills/verify-with-andon/ships a skill for Claude Code and compatible harnesses that teaches an agent the discipline: after drafting any analysis, write the spec, run andon, and report the verdict — including the rule that loosening a tolerance to make a check pass must be declared, never silent.- MCP server.
pip install 'andon-verify[mcp]'and runandon-mcpto expose three tools to any MCP-speaking runtime:run(execute a spec),inspect(integrity-scan a workbook with no spec), anddiff(classify what changed between two versions). The agent gets the same structured verdict a human gets — not prose it has to parse back.
No local Python? The Dockerfile builds the same server:
docker build -t andon . && docker run --rm -i -v "$PWD:/work:ro" -w /work andon.
My working rule: the agent that wrote the analysis also writes the spec, and neither is
finished until andon run exits 0 — or a human has signed off on every flag it raised.
What andon is not
- Not a data-quality platform. Great Expectations and pandera validate data inside pipelines, in code, usually against a warehouse. andon verifies claims in finished artifacts — the report against its source — and treats Excel as a first-class citizen, because that is where analysis actually lives in most companies.
- Not an LLM evaluator. It doesn't score model outputs; it re-derives numbers.
- Not a replacement for reading the report. It removes a class of mechanical error so human review can spend itself on judgment.
Limitations, honestly
- Formula cells need cached values. andon reads the value Excel last calculated. A workbook produced by a library and never opened in Excel/LibreOffice carries no cached values for its formulas; andon refuses to guess and reports exactly that.
wherefilters are pandasquery()expressions. They are expressive, which means a spec can encode the same mistakes as any query. Specs are code — review them like code.- Heuristic checks have false positives by design. That is why they cannot fail a build.
- Scale is untested beyond mid-size files. Everyday operational workbooks and CSVs (hundreds of thousands of rows) are fine; nobody has benchmarked it against 10 GB of parquet. If you do, tell me what broke.
- Parquet sources need
pip install 'andon-verify[parquet]'.
CSV encoding, delimiter, and how numbers are punctuated
A CSV source is read as utf-8 by default, and Excel's BOM is stripped so it can't poison
the first column name. When a file isn't utf-8 — Turkish exports out of Excel are often
;-separated, encoded cp1254, and write amounts as 1.234,56 — give the source as a
mapping instead of a bare path:
Get the encoding wrong and andon says so, naming the likely culprit — it does not silently mojibake your column names and then "verify" them.
The last two matter more than they look. Without them 1.234,56 is read as text, and
a column of text is a column a numeric check cannot examine. andon will tell you that
rather than pass — see below — but declaring the punctuation is what makes the column
checkable in the first place.
What a check does when it can't read the data
Every report ends with the same line: a PASS is not an opinion about the analysis; it is arithmetic about these claims. That obliges the checks to distinguish two things a careless implementation runs together:
- "I compared them and they were fine" — a PASS.
- "I had nothing to compare" — never a PASS.
So a plausibility check that finds no numeric values says so, instead of reporting that zero values fell outside the bounds:
And when only part of a column is readable, the verdict carries the denominator, because a statement about the half that parsed is not a statement about the data you handed over:
Every such check reports values_checked, values_total and values_skipped in its
evidence, so the coverage is machine-readable too. Values that pandas turns into NaN at
read time — n/a, -, #N/A — are counted as skipped like anything else; they are
invisible to a naive coercion count, which is exactly how they used to go unnoticed.
Verify against a warehouse query (DuckDB)
A source can be a SQL query instead of a file — so you can reconcile a report against
the same data your BI tool reads, not just against a CSV. With
pip install 'andon-verify[duckdb]', prefix a source with duckdb: and DuckDB runs it
(it reads CSV, parquet, JSON and .duckdb files inside the query; relative paths resolve
against the spec):
Diff two workbook versions
"Someone edited the workbook — what actually changed?" git diff on an .xlsx is noise,
and the tools that compare spreadsheets show every changed cell flat. andon diff
classifies each change instead, so a new #REF! doesn't hide behind reformatted dates:
A new error cell is called out on its own; numeric moves come with a delta and a percent.
Exit codes: 0 = nothing meaningful changed, 1 = a new error appeared (or, with --strict,
any change), 2 = changes but no new error.
Roadmap
Shipped since 0.1: a GitHub Action and pre-commit hook, DuckDB
sources, andon diff, an MCP server, CSV encoding/delimiter
controls, and JSON/JSONL sources.
Near-term, in order:
- Row-level diff for data sheets, not just cell-by-cell
- A
--watchmode: re-run a spec when its sources change on disk
Not planned: dashboards, scheduled runners, LLM-powered anything inside the verifier. The verifier stays deterministic; that is the point.
How this project is built
I design the checks, decide the semantics and review every line; I use AI agents
(Claude Code) heavily for implementation speed, and the commit trailers say so. If that
bothers you, read tests/ first: the suite builds real CSV and XLSX fixtures, no
mocks, and it is the contract. Tests don't care who typed them.
Related
- opsaudit — the same instinct, one level up: operations analytics that audits its own numbers instead of trusting them.
andonchecks a finished report against its sources;opsauditcomputes the metrics with the honesty block built in.
More tools by Eren Gülmez.
License
MIT — Mehmet Eren Gülmez
来源:README.md,提交 1fbc56a
工具
0版本历史
1- v0.6.0最新Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分