Skip to content

Releases: gulmezeren2-byte/andon

andon 0.7.0 — a check that examined nothing is not a PASS

Choose a tag to compare

@gulmezeren2-byte gulmezeren2-byte released this 04 Aug 06:59

Fixes a false PASS. A plausibility check that could not read a single value was reporting that nothing fell outside the bounds — true only in the way that vacuous statements are true.

plausibility.bounds coerced its column to numbers, dropped whatever would not convert, then found zero values out of bounds in the empty remainder. Given a Turkish Excel export — 1.234,56, ;-separated, the ordinary shape in this tool's home market — the whole column reads as text, and a bound of min: 999999999 came back green:

before:  PASS    tutar stays within bounds
after:   REVIEW  no numeric values in tutar; nothing was compared against the bounds

For a tool that prints "a PASS is not an opinion about the analysis; it is arithmetic about these claims" under every report, this was the one defect it could not afford.

The policy already existed and was already written down — numeric_series says "andon never coerces text to numbers: a corrupted cell must surface as ERROR, not vanish into a NaN that sum() happily skips", and the hard checks obey it. The two plausibility checks bypassed the helper and did exactly what its docstring forbids. Being heuristics, they cannot fail a run, so their version of surfacing it is REVIEW.

Partial reads carry their denominator

A statement about the half of a column that parsed is not a statement about the data you handed over:

REVIEW  bounds  tutar stays within bounds, but only read 2 of 4 value(s) of tutar

plausibility.mean_shift does the same rather than presenting the mean of whatever converted as the mean of the column. Both now report values_checked / values_total / values_skipped in evidence.

The skipped count was itself wrong: computed as a coercion delta, it missed everything pandas had already turned into NaN while reading. n/a, -, #N/A are all in its default na_values, so a column half full of them reported zero skipped while dropping half its rows.

CSV sources take decimal and thousands

encoding and delimiter existed for precisely this reason and stopped one step short: without saying how numbers are punctuated, a Turkish file could be read but never measured.

sources:
  sales: { path: satis.csv, delimiter: ";", decimal: ",", thousands: "." }

The two must differ; a source setting both to the same character is refused rather than guessed at.

Clean numeric data still passes silently — pinned by a regression test, because a correctness fix that turns every ordinary run into a REVIEW is its own defect.

163 tests, ruff + mypy clean.

🤖 Generated with Claude Code

andon 0.6.1 — fix piped-output crash on Windows

Choose a tag to compare

@gulmezeren2-byte gulmezeren2-byte released this 29 Jul 11:40

Fixes a crash when output is piped on Windows. Worth upgrading if you're on Windows or run this in CI.

A piped stdout on Windows gets the legacy code page rather than UTF-8. This tool prints workbook text — sheet names, labels and cell values — and those characters raised UnicodeEncodeError, taking the whole command down. Piping into a file or a parser, and any CI step capturing the log, failed on entirely ordinary data.

Output streams are now asked for UTF-8, and the guard never fails if a stream won't take it. Regression tests cover both the legacy-code-page path and a stream with no reconfigure().

Found by reproducing the defect class that had just been fixed in claude-skills-doctor, then confirming it here against real Turkish content — the bug was worse in these tools, because the characters that break are the data itself rather than decoration.

🤖 Generated with Claude Code

v0.6.0 — JSON & JSONL sources

Choose a tag to compare

@gulmezeren2-byte gulmezeren2-byte released this 17 Jul 15:52

JSON and JSONL sources. A source can now be a .json file (an array of record objects) or a .jsonl/.ndjson file (one object per line), alongside CSV, Excel, parquet and DuckDB.

sources:
  # an AI agent's structured output, verified against the raw data
  claim:  out/analysis.json
  events: logs/events.jsonl

This sits at the center of what andon is for: agents emit JSON, and now andon can verify it directly against the data it came from — no "convert to CSV first" step. A malformed file fails with a message that names the shape andon expected (an array of records, or one object per line).

Full changelog: https://github.com/gulmezeren2-byte/andon/blob/main/CHANGELOG.md

v0.5.0 — CSV encoding & delimiter

Choose a tag to compare

@gulmezeren2-byte gulmezeren2-byte released this 17 Jul 15:29

CSV encoding and delimiter controls. A CSV source can now be a mapping instead of a bare path, so files that aren't comma-separated utf-8 read correctly:

sources:
  sales:
    path: data/satis.csv
    encoding: cp1254      # default: utf-8-sig
    delimiter: ";"        # default: ","

The motivating case is Turkish Excel exports — frequently ;-separated, encoded cp1254, and carrying a BOM.

  • Default encoding is now utf-8-sig: it reads plain utf-8 and strips the BOM Excel writes, which otherwise poisons the first column name. Backward-compatible — existing utf-8 files keep working.
  • A wrong encoding fails loudly, naming the likely culprit, instead of silently mojibaking your column names and then "verifying" them.
  • encoding/delimiter are validated at parse time, accepted only for .csv sources, and noted in the honesty block only when set explicitly.

Roadmap trimmed — the MCP server and these CSV controls both shipped; JSON/JSONL sources and row-level diff are next.

Full changelog: https://github.com/gulmezeren2-byte/andon/blob/main/CHANGELOG.md

v0.4.0 — MCP server

Choose a tag to compare

@gulmezeren2-byte gulmezeren2-byte released this 17 Jul 14:51

MCP serverandon-mcp exposes three tools to any MCP-speaking agent runtime, so andon becomes a thing an agent can call, not just a CLI a human runs:

  • run — execute a spec, return the full verdict
  • inspect — integrity-scan an .xlsx/.xlsm workbook with no spec written (error cells, values typed over formulas, numbers stored as text, external links)
  • diff — classify what changed between two workbook versions (a new #REF! on its own, numeric moves with a delta and a percent, formula edits, appeared/vanished cells)

The agent gets the same structured verdict a human gets — not prose it has to parse back. Each tool is a plain function that knows nothing about MCP, so the logic is unit-tested without an agent runtime; the FastMCP wrapper is registered only when the extra is installed.

pip install 'andon-verify[mcp]'
andon-mcp
// Claude Desktop / Claude Code mcp config
{ "mcpServers": { "andon": { "command": "andon-mcp" } } }

server.json ships the MCP-registry manifest.

Full changelog: https://github.com/gulmezeren2-byte/andon/blob/main/CHANGELOG.md

andon 0.3.0

Choose a tag to compare

@gulmezeren2-byte gulmezeren2-byte released this 17 Jul 14:28

andon diff — compare two workbook versions, check-aware.

git diff on an .xlsx is noise; spreadsheet-diff tools show every changed cell flat. andon diff old.xlsx new.xlsx classifies each change: a new #REF! called out on its own, numeric moves with a delta and a percent, formula edits, appeared/vanished cells, added/removed sheets. --tolerance hides rounding noise, --json for pipelines, exit codes so CI can gate on it.

pip install andon-verify · CHANGELOG

andon 0.2.1

Choose a tag to compare

@gulmezeren2-byte gulmezeren2-byte released this 17 Jul 14:08

Fixes version reporting: 0.2.0 shipped with andon --version stuck at 0.1.0. Now read dynamically from the installed distribution. Same features as 0.2.0 (DuckDB sources, GitHub Action, pre-commit hook).

andon 0.2.0

Choose a tag to compare

@gulmezeren2-byte gulmezeren2-byte released this 17 Jul 14:02

DuckDB sources, a GitHub Action, and a pre-commit hook.

  • DuckDB sources — a source can be a SQL query (duckdb: SELECT ...), so a report reconciles against the same data a BI tool reads. pip install 'andon-verify[duckdb]'.
  • GitHub Actionuses: gulmezeren2-byte/andon@v1, verdict in the job summary.
  • pre-commit hook — an andon hook that stops a commit on a broken report.

pip install andon-verify · CHANGELOG

andon 0.1.0

Choose a tag to compare

@gulmezeren2-byte gulmezeren2-byte released this 17 Jul 12:29

First public release — also available as pip install andon-verify, a GitHub Action (uses: gulmezeren2-byte/andon@v1) and a pre-commit hook.

Deterministic verification for AI-generated analysis: reconciliation, internal-consistency, schema and Excel-integrity checks that stop the line when the numbers don't add up. Only arithmetic can fail the build; every report says what it did not check.

See the CHANGELOG and the sabotaged worked example in examples/quarterly-report.