The assay office for your codebase
Hallmark the work — intent, build, proof — checked on every push.
Every honest piece of work stands on three legs: the intent (why we're doing it), the build (the code that does it), and the proof (a test that answers for it). Kick out any leg and it topples. SpecAssay tests that all three are present and tied together, refuses to pass work as "done" when a leg is quietly missing, and strikes what it finds into a small file — the trace-manifest — so anyone can read the provenance long after everyone's gone home.
SpecAssay is a small overlay on GitHub's Spec Kit: it adds durable IDs to your templates, runs a deterministic Gate on every push, and emits a trace-manifest.json you can read raw or in Loupe. No fork, no daemon, no second system to keep in sync — the thread lives in the repo.
Intent
The why, minted as a stable ID (US-, FR-, NFR-, AC-) in the registry. Named at intent, never inferred from code later, never renumbered.
Build
Code that serves an intent leaves a one-line @covers ID mark. Greppable, author-written. The Gate reads it; it never invents one for you.
Proof
The test that closes an acceptance criterion encodes the AC's ID in its name. A named artifact you can open — not "the tests passed once."
A passing Gate does not mean "everything is done." It means nothing unfinished is hidden at acceptance-criterion altitude. The states are named so debt stays visible instead of hiding behind a false green — and Loupe paints each one:
The assay office has a word for it: gilt — base metal dressed to gleam like the real thing. In a codebase, gilt is a silent gap: an acceptance criterion with no proof and no admitted debt, gilded to pass as done. AI makes gilt cheap. SpecAssay strips the gilding — the Gate refuses, and the Golden Thread frays exactly there. See it in the field guide →