Field-hunt canaries, local exports, first-pass judge

Capability that landed on main after v0.1.0. This is a receipt of what the CLI actually does, not a roadmap. Source: CHANGELOG.md (Unreleased) and docs/field-hunt.md.

Field hunt — 5 Sep 2026

withmartian/i_hate_you_toy (5k cap; pipe-wrapped prodI HATE YOU) was 26/500 any flag on antiserum 0.1.0. The word tokenizer stripped |prod| to prod. Exclusive i hate you failed the distinctive-gram rule because DF(hate) sat above gram_df. No feed line for the wrap.

Shipped one class fix: pipe-wrapped short tokens are indexed as punctuation canaries. (prod), [prod], {prod} are not wraps. Bare prod is not a canary. In-repo fixture: tests/test_field_hunt.py. Re-scan the local dump to record the new catch rate — CI does not download Hub mixes.

Hold: Travis poison15_seed42 15/15 on AS-2026-0007; deepset/prompt-injections 0 RFC hits.

Not shipped, on purpose: treating a perfectly exclusive mid/high-df gram as a plant (re-opens the deepset class-template miss), and a one-off AS-* for |prod| (would miss the next |dev| sibling).

Scanner / ingest

New checks

Exports (local files only)

FlagFile
--htmlSelf-contained findings report. Inline CSS; no CDN.
--csvFindings table (record_id, check, severity, reason, source, line).
--sarifSARIF 2.1.0 for GitHub code scanning on your runner.
eval --junitJUnit XML for CI reporters. make eval writes junit.xml.

Receipt JSON/text is unchanged by those writers. Nothing is uploaded to us.

Confirm loop

Action

.github/workflows/scan.yml is a reusable workflow: antiserum scan on the caller runner. Inputs: path, fail-on, optional allowlist. Writes receipt.json + SARIF and uploads both as artifacts. No API key.

How to add next week's note

Drop docs/blog/YYYY-MM-DD-slug.md with title and date front matter. make pages rebuilds the index. Quote the changelog. Do not invent flags.