{"criteria_id":"observatory-aggregates/v1","version":"1.0.0","corpus":{"id":"observatory-aggregates-corpus/v1","sha256":"b57ae99d18f547588438fd2e562247f08750456aac5f204ae2c3350277f439d0"},"corpus_pin_definition":"The corpus pin is the SHA-256 of the corpus's canonical serialization (the corpus object excluding its sha256 field), computed and verifiable by the published harness (harness.mjs).","price":{"usdc_units_per_snapshot":5000,"label":"$0.005","status":"RULED","basis":"per aggregate snapshot","band_note":"The source record is UNPRICED; its hypothesis band is $0.005-$0.01 per aggregate snapshot (raw-facts band). The design proposes $0.005 (the band floor / fleet floor). This figure is labelled RULED (price ruled 2026-11-03)."},"free_tier":{"per_day":100,"min_interval_ms":5000,"on_exhaustion":"402"},"ops":{"snapshot":"POST /snapshot - { catalogue_id: <id from GET /catalogue>, window: { start: YYYY-MM-DD, end: YYYY-MM-DD } } (UTC days, inclusive, max 366 days)"},"catalogue":[{"id":"discovery-total","kind":"total","map":"disc","min_total":5,"min_cell":null,"rule":"Sum of all disc counts in the window (discovery-doc fetches answered 2xx at the front door). One number."},{"id":"discovery-by-document","kind":"rows","map":"disc","min_total":10,"min_cell":5,"rule":"disc counts per document path in the window; rows sorted count desc, then path asc; rows below min_cell are suppressed (key and count unprinted, suppression counted)."},{"id":"challenged-unpaid-total","kind":"derived-total","map":null,"min_total":10,"min_cell":null,"rule":"Sum over ops of max(ch402[op] - served[op], 0) in the window — the front-door approximation published by the Observatory rollup (a serve is matched to its op, not to the specific challenge; challenges near midnight UTC can settle into the next day)."},{"id":"challenged-unpaid-by-op","kind":"derived-rows","map":null,"min_total":10,"min_cell":5,"rule":"Per op in the window: challenges issued (ch402), served (paid 2xx), unpaid = max(challenges - served, 0). Rows sorted unpaid desc, then op asc; rows with unpaid below min_cell are suppressed. The snapshot total is the total unpaid."},{"id":"gate-rejects-total","kind":"total","map":"reject402","min_total":5,"min_cell":null,"rule":"Sum of all reject402 counts in the window (402 responses carrying our own payment-verification-failed body shape). One number."},{"id":"served-total","kind":"total","map":"served","min_total":5,"min_cell":null,"rule":"Sum of all served counts in the window (paid-surface requests carrying payment evidence answered 2xx). One number."},{"id":"nonexistent-paths","kind":"rows","map":"nfpath","min_total":5,"min_cell":5,"rule":"nfpath counts per scrubbed path in the window (404s at the front door; path only, never a query string); rows sorted count desc, then path asc; rows below min_cell suppressed."},{"id":"nonexistent-tools","kind":"rows","map":"nftool","min_total":5,"min_cell":5,"rule":"nftool counts per sanitized tool label in the window (tools/call naming a tool that does not exist); rows sorted count desc, then label asc; rows below min_cell suppressed."},{"id":"nonexistent-methods","kind":"rows","map":"nfmethod","min_total":3,"min_cell":3,"rule":"nfmethod counts per method label in the window (JSON-RPC methods the gateway does not implement); rows sorted count desc, then label asc; rows below min_cell suppressed."},{"id":"malformed-by-kind","kind":"rows","map":"malformed","min_total":3,"min_cell":3,"rule":"malformed counts per kind in the window (json_parse = request body not valid JSON; tools_call_arguments = tools/call with non-object arguments); rows sorted count desc, then kind asc; rows below min_cell suppressed."},{"id":"searchlike-total","kind":"total","map":"searchlike","min_total":5,"min_cell":null,"rule":"Sum of all searchlike counts in the window (requests carrying a q / query / search parameter — presence only; the parameter value is never stored). One number."},{"id":"mcp-tool-calls","kind":"rows","map":"mcp_tools","min_total":10,"min_cell":5,"rule":"mcp_tools counts per tool in the window (the fleet's pre-existing MCP counters, merged — not duplicated); rows sorted count desc, then tool asc; rows below min_cell suppressed."}],"grades":["OFFERED - the snapshot's total met its published minimum-count threshold; counts are printed with the counting rule, the window bounds, the thresholds applied, and the scope label","NOT-OFFERED - the snapshot's total is below its published minimum-count threshold; the threshold and the fact of suppression are stated and the count itself is NEVER printed (a suppressed aggregate is not silently zeroed; a small count is not dressed up as data)","EMPTY-WINDOW - the window holds no front-door events in any map; a stated absence with counts null, never zeros dressed as data. EMPTY-WINDOW takes precedence over NOT-OFFERED"],"thresholds_discipline":"Two published layers: min_total gates the whole snapshot; min_cell suppresses individual rows of a row snapshot (the suppressed row's key AND count are unprinted; the snapshot states how many rows were suppressed and the cell threshold). Thresholds are per catalogue entry, printed in GET /catalogue, in this criteria document, and on every snapshot they touch.","scope_label":"Scope: our doorway only — counts of requests that reached the ExchangeRebel front door (the main worker) in the stated window, under the coverage boundaries published in the criteria. This is not a measure of the agent economy, of any other service, or of agents in general.","scope_label_short":"our doorway only","coverage_boundaries":["Assets-served static discovery files (/llms.txt, /llms-full.txt, /agents.json) are served without invoking the worker and are NOT counted; an absent count for them means not observable at the front door, never nobody asked.","Zone-routed services bypass the main worker and are NOT observed by the front door.","Counts are best-effort aggregates (fire-and-forget counter writes at the front door), like the fleet's existing KPI/MCP counters."],"key_scrub":"Output keys are surface labels only (op templates, scrubbed paths, sanitized tool/method labels). A key segment longer than 32 characters without a dot renders as :id - the Observatory's own scrub. The engine ignores any telemetry field outside the nine published maps plus the MCP counters, so identity-shaped material in a telemetry record cannot reach an output.","free_refusals":["invalid_request_body","catalogue_id_missing","catalogue_id_unknown","window_missing","window_invalid","window_inverted","window_too_wide","CAP-EXCEEDED:body_bytes (413)"],"malformed":"A request that cannot be assessed at all (unknown catalogue id, malformed window) is a named FREE refusal, before any payment, at the pre-check and at the paid op alike.","honesty_boundary":"A snapshot counts only requests that reached the ExchangeRebel front door (the main worker) in the stated window, under the coverage boundaries published in the criteria. It describes our doorway only — never the agent economy, never any other service, never agents in general. Challenged-but-unpaid is a front-door approximation: a serve is matched to its op, not to the specific challenge that preceded it.","boundary":"Boundary: this surface sells aggregate counts of our own front door only. It never sells, prints, or derives client identity, per-client rows, purchases, or usage patterns; a below-threshold aggregate is NOT-OFFERED, never a small count dressed up and never a suppressed cell silently zeroed.","custody":{"ledger_closed_fields":["payer wallet","timestamp","day","price (USDC units) with the CAD fair-market-value block (rate, rate date, basis, cad_pending, refund - null unless refunded)","payment tx id","Solana fee (lamports)","criteria version","op","snapshot line","per-snapshot status summary (catalogue id + grade + window only - never counts below threshold, never any client identity)","house flag"],"retention":"The surface stores nothing beyond the snapshot answer it returns and its own payments ledger (closed field list in the criteria). The Observatory source counters are aggregates only — no raw event detail, request body, header, wallet, or per-client record exists in them, and this surface reads them read-only at release. Fixture telemetry in the test corpus is synthetic and labelled."},"payment_includes":"$0.005 per snapshot — RULED price (labelled RULED (price ruled 2026-11-03); design proposal inside the source's $0.005–$0.01 hypothesis band). The payment includes: one aggregate snapshot — the counts computed by the published counting rule for the one catalogue id and the one window you name, the window's bounds, the threshold applied, and the scope label ('our doorway only'). Counts only: no client identity, no per-client rows, no purchase or usage-pattern detail. If the snapshot's total is below its published minimum-count threshold, the delivery is a NOT-OFFERED answer stating the threshold and the fact of suppression — the count itself is never printed. If the window holds no front-door events, the delivery is an EMPTY-WINDOW stated absence, not zeros. Factors printed; no composite score. Nothing is stored beyond the snapshot answer and the payments ledger's closed field list.","kill_line":"Kill line (M-44, under the operator's 2026-11-03 zero-demand doctrine): build, bank, and hold; judged at the fleet's periodic reviews. Tripwires, all stop-and-review: refunds >5% of paid calls in any 30-day window; free use >10x paid use; any output found to carry client identity or a per-client row, or any snapshot presented (by us or with our vocabulary) as describing the agent economy or any population wider than our doorway = stop-serving.","service":"observatory-aggregates","endpoints":{"criteria":"GET /criteria (free)","catalogue":"GET /catalogue (free - every snapshot, its counting rule, its threshold, its price)","precheck":"POST /precheck (free, validation only; no counts, no grade)","snapshot":"POST /snapshot (paid, $0.005 per snapshot - RULED)","metrics":"GET /metrics"}}