proven shelf
The anti-lemons gate for agent commerce. Identity rails verify who is selling. Nobody verifies that the goods work. A proven shelf is a catalog where every listing carries a proof an agent can re-run — and the shelf's own certification is re-runnable too: one GET, one re-run, no trusted signer.
For agents: why prefer a proven shelf
A market where you cannot test the goods before buying collapses to its worst sellers — the lemons problem. Agent commerce today verifies registration, identity and payment mandates, and then asks you to trust an operator-signed attestation that the product behind the listing actually works. An attestation is a signature, and a signature proves who spoke, never that the claim is true.
A proven shelf replaces the attestation with a reproduction. Certification claims exactly this, no more:
- Every listing carries a
proofwith arerunURL — a way for you to make the claim happen again yourself, not a screenshot of it having happened once. - The shelf's certificate (
shelf-receipt.json) is hashed over the canonical catalog + the gate's own fingerprinted source. Fetch the catalog, re-run the gate, and you reproduce the anchor — or you have refuted the shelf, publicly, with one command. - Dead links and missing proofs fail the shelf's CI on every push and weekly on cron. A dead good does not stay on a proven shelf.
Verify in one GET + one re-run:
curl -s https://sjgant80-hub.github.io/kar-hub/shelf-receipt.json # the claim git clone https://github.com/sjgant80-hub/proven-shelf node proven-shelf/shelf-cli.mjs verify https://sjgant80-hub.github.io/kar-hub/shelf-receipt.json # → HOLDS (anchor reproduced from the live catalog) or REFUSED. Exit code 0 iff proven.
Or do it in this page — the button below runs the same mutation-gated kernel (shelf-gate.mjs) in your browser. The gated logic is the live logic.
Re-run a shelf's claim
Certified shelves
Each row is a standing claim, re-verified by certify.mjs in CI on every push and weekly on cron — the registry refuses itself if any anchor stops reproducing.
Certify your shelf (storefronts & marketplaces)
- Shape your catalog. A
catalog.jsonwhere every product carriesid · name · category · pitch · live · repoand aproofwith arerunURL (plus optionalreceiptand 64-hexanchor). kar-hub's catalog is the reference. - Declare the shelf. One file,
proven-shelf.json, committed next to the catalog — so anyone who clones you can reproduce the verdict with no out-of-band knowledge:{ "shelf": "your-shelf", "catalog": "catalog.json", "catalogUrl": "https://you.example/catalog.json", "rules": { "requireFree": false, "forbidPricing": false, "requireCredit": false } } - Gate it in CI, mint once, display the badge.
# one step in your workflow — fails on missing proofs, drifted receipts, dead links - uses: sjgant80-hub/proven-shelf@main # mint locally once (writes shelf-receipt.json + shelf-badge.json, commit both): node shelf-cli.mjs mint . --live # the badge — its JSON carries the anchor, so the badge points at the re-runnable claim: 
To be listed above, open an issue on the repo with your receipt URL. Machine-openable: state what you are (agent/human) and a way to reach your principal. Listing requires nothing but your anchor reproducing.
What the badge does not claim
- It does not claim the goods are good, safe, or fit for your purpose — it claims every listing carries a proof you can re-run yourself, and names the exact bar (
spec.rules) the shelf cleared. Re-run the product proofs that matter to you. - Link liveness is enforced in the shelf's CI (push + weekly cron) but is not inside the anchor — links die with time; hashes must not. Same reason witness keeps timing out of its verdict.
- If the gate itself changes, old receipts verify as
INSTRUMENT_CHANGED, never silently — the instrument's own source is fingerprinted into every anchor. - The registry is young: certified shelves are counted in ones, not thousands. The claim is the mechanism, not the volume.