Tools that make agent work checkable.
No auto-fix. No magic. Just findings.
Deterministic. Versioned. Fixture-tested.
small, sharp, standalone · separate from the OACP protocol line
No auto-fix. No magic. Just findings.
Deterministic. Versioned. Fixture-tested.
small, sharp, standalone · separate from the OACP protocol line
Agents accumulate memory files. Those files rot. Catch the rot mechanically.
A deterministic, read-only linter for Markdown memory and documentation corpora. It catches configured structural drift — broken links, incomplete indexes, frontmatter violations, malformed managed markers, staleness, duplicate anchors, line limits, and suspicious revision changes — without editing the corpus.
The skill wraps it at an exact pin and never installs or upgrades packages at runtime. Lint output is diagnostic: the agent proposes changes and waits for approval instead of auto-fixing. Exit status is data — 0 clean, 1 findings, 2 an error running at all.
$ python scripts/memory_lint_wrapper.py \ --config fixture-snapshot/config.yaml \ --corpus-root fixture-snapshot/fixtures/defects \ --now 2026-08-10 SEVERITY CODE LOCATION PROFILE MESSAGE ERROR broken-link MEMORY.md:14 indexes link target 'notes/does-not-exist.md' does not resolve to a file ERROR frontmatter-type-enum notes/bad-type.md:4 notes type must be one of: memory, note ERROR duplicate-anchor notes/duplicate-anchor.md:15 notes explicit anchor 'reused-anchor' duplicates line 11 WARNING line-too-long notes/long-line.md:11 notes line has 162 characters; maximum is 120 WARNING stale-updated notes/stale.md:7 notes Updated header is 952 days old; maximum is 30 ERROR index-missing-entry notes/unindexed.md index:MEMORY.md file is missing from MEMORY.md ⋮ 15 finding(s) · exit 1 — evidence to inspect, not an adapter failure
Real output, captured through the skill's exact wrapper against the shipped synthetic defect corpus at the fixed date 2026-08-10. Six of fifteen findings shown.
A subscription hides the meter. The records don't.
A subscription bills a flat fee, so nothing attaches a price to any individual request. The tokens are recorded on disk anyway and list rates are published, so the two combine into one number: what this period's work would have cost had it been billed per token through the API.
That number is an equivalence, not an invoice. It does not predict a bill and it is not what anyone was charged. It answers a narrower question — how much metered work went through a flat-rate plan — computed entirely from files already on the machine, with no network calls.
$ python scripts/usage_cost.py Model Requests Tokens Cost -------------------------------------------------------------------------- Claude Fable 5 28,615 6,594,388,669 11,226.52 Claude Opus 4.8 7,348 1,695,400,179 1,707.17
Illustrative, not an actual usage volume. Two of eight model rows shown.
Every skill is a unit that can be falsified.
Agent-discipline skills for coding-agent runtimes (Claude Code, Codex): self-contained, versioned, fixture-tested. Each skill is an independent unit carrying its own instructions, deterministic scripts, and falsifiable fixtures.
Self-contained means independently installable. A skill either vendors its implementation or wraps an exact version of a published package. Neither form may depend on an unpublished repository or a floating dependency — no exceptions.
A release is a snapshot of the whole collection. Skills ship together and install independently; the changelog records which release carried which pin.
Verify the number before it becomes the premise.
A compact procedure for separating measured, calculated, estimated, and recalled values. The unit, input scope, revision or time window, method, and relevant uncertainty travel with the number instead of being reconstructed after the fact.
The bundled helper handles one narrow but common failure class: phantom counts from a regex that matches inside prose or as a prefix of a different record. It counts only lines whose complete text matches the pattern — and emits every matching path and line number for inspection.
$ python scripts/anchored_count.py \ --pattern '## Verified' \ fixtures/data/claims.md fixtures/data/claims.md:1:## Verified fixtures/data/claims.md:4:## Verified Measured matching lines: 2
Real output from the shipped seeded corpus. A substring search reports four matching lines; the full-line method reports two — the fixture fails if that difference disappears.
Done is a claim. Ship the receipts.
A standard-library Python receipt checker plus agent instructions for the final-report boundary. A claims file names what the agent intends to say and the predicate that would make each statement true; the checker runs those predicates now, records what happened, and returns nonzero if any claim failed or never ran.
Five claim shapes to start: tests pass, a command exits zero, a file exists, an exact string occurs in a file, a Git ref contains a commit. A claim without a predicate is UNVERIFIED — never silently promoted to a pass.
$ python scripts/proof_before_done.py fixtures/data/claims.json PASS · claim="command exits 0" · command=EXEC ["python3","-c","print('ready')"] · exit_code=0 · observed="stdout=ready\n; stderr=<empty>" FAIL · claim="tests pass" · command=EXEC ["python3","-c","..."] · exit_code=1 · observed="stdout=<empty>; stderr=intentional failure\n" PASS · claim="fixture file exists" · command=STATIC file_exists(path="present.txt") · exit_code=N/A · observed="regular_file=true" PASS · claim="fixture contains the verified marker" · command=STATIC string_present(path="present.txt",string="verification-ready") · exit_code=N/A · observed="string_present=true" UNVERIFIED · claim="reviewed head is current" · command=NOT_EXECUTED · exit_code=N/A · observed="no predicate supplied"
Real output from the shipped fixture, which deliberately includes one failing test claim and one claim with no predicate — the run exits 1. Timestamps trimmed for width; the receipt carries them.
Same corpus in, same findings out. Nothing here asks a model what it thinks.
Every skill pins the exact tool version it wraps. Upgrades are a decision, not a surprise.
Each unit ships fixtures that can fail. A skill that cannot be falsified is a suggestion.
A tool joins this catalog when it ships — a version on PyPI or a tagged repo, fixtures that pass, and a license. Nothing is listed before it exists.