# Hunt enumeration: the first-100 funnels

Three enumeration crawls turn headline populations into huntable queues: the Registry live-filter, the Smithery-host re-verification and the ERC-8004 live-subset import. Each crawl is recorded as a dated snapshot whose per-stage exclusion funnel is itself a deliverable. The queue stays private; this document prints aggregates only.

Spec: a2ally-hunt-enumeration-v1

## The segments

- Segment B — Official Registry live-filter — status not_yet_crawled
  not yet crawled — enumerated count not measured yet
  Funnel: no crawl recorded yet
- Segment D — Smithery-host re-verification — status not_yet_crawled
  not yet crawled — enumerated count not measured yet
  Funnel: no crawl recorded yet
- Segment C — ERC-8004 live-subset import — status not_yet_crawled
  not yet crawled — enumerated count not measured yet
  Funnel: no crawl recorded yet

## Segment queue and attribution

Each queued identifier carries its segment's door and first-touch surface from the door map. The queue itself is private and owner-read only; this section prints the door map and the attribution aggregates only — never an identifier. Total attributed across all segments: 0.

- Segment B — Official Registry live-filter — door publisher_claim, first-touch surface /for-publishers — queued count not measured yet (not yet crawled), attributed 0 (by event kind: publisher_claim 0 · guaranteed_completion 0 · partner_registration 0 · cross_flow_signup 0)
- Segment D — Smithery-host re-verification — door hosted_gateway, first-touch surface /mcp-gateway — queued count not measured yet (not yet crawled), attributed 0 (by event kind: publisher_claim 0 · guaranteed_completion 0 · partner_registration 0 · cross_flow_signup 0)
- Segment C — ERC-8004 live-subset import — door erc8004_meaning, first-touch surface /agents/erc8004/{slug} — queued count not measured yet (not yet crawled), attributed 0 (by event kind: publisher_claim 0 · guaranteed_completion 0 · partner_registration 0 · cross_flow_signup 0)

## Counting rules

- Counting rule: enumeration uses public listing identifiers only — server names, registry namespaces and ERC-8004 slugs as printed in public listings; no contact data and no email addresses are collected or stored.
- Counting rule: the hunt queue is private — snapshot survivor identifiers are readable only by the account that recorded the snapshot; public surfaces print aggregates only, never a candidate identifier.
- Counting rule: a segment with no snapshot reads status not_yet_crawled with enumerated_n null — an uncrawled segment never prints an invented zero; zeros print as zeros only when a crawl actually ran.
- Counting rule (Segment C): servers ≠ accounts — listings_n counts surviving listings and operator_n counts distinct operator_ref values among them; the two numbers are never summed or substituted for each other.
- Counting rule (Segment C): the mass-mint exclusion removes every candidate whose domain accounts for strictly more than 10% of the snapshot's Segment C candidates (threshold 0.10); a domain at exactly 10% is not excluded, and the excluded domains and the excluded count print in the funnel.
- Counting rule: the public document composes, per segment, the latest snapshot by crawled_at across live accounts only (sandbox and canary accounts excluded), computed live at read time; reading it stores nothing.
- Counting rule: the segment queue is private and owner-read only — each account's queue is composed from its own latest snapshot per segment and is readable only by that account; an account with no snapshot for a segment has an empty queue for that segment and its queue count prints zero, because that zero is the caller's own measured state.
- Counting rule: each queued identifier carries its segment's door and first-touch surface from the printed door map — Segment B: door publisher_claim, first-touch surface /for-publishers; Segment D: door hosted_gateway, first-touch surface /mcp-gateway; Segment C: door erc8004_meaning, first-touch surface /agents/erc8004/{slug}.
- Counting rule: an attribution joins a queued identifier to exactly one of the four named door events — publisher_claim, guaranteed_completion, partner_registration or cross_flow_signup — and the segment, door and first-touch surface are derived from the queue entry, never from the attribution request.
- Counting rule: first attribution wins (Lane 12 section B.4) — the first attribution recorded for an identifier by an account is the attribution; a later attribution attempt for the same identifier returns the existing record unchanged and is never overwritten or double-counted.
- Counting rule: public surfaces print attribution aggregates only, never an identifier — per segment, queued_n is the latest live snapshot's enumerated_n (null when not_yet_crawled, never invented), attributed_n counts distinct identifiers attributed under that segment across live accounts only, and event-kind counts are zero-filled for all four kinds.

## The methodology

Hunt enumeration methodology: three enumeration crawls — the Official Registry live-filter (Segment B), the Smithery-host re-verification (Segment D) and the ERC-8004 live-subset import (Segment C) — are recorded as dated snapshots. Each snapshot applies its segment's deterministic filter to the candidate records the crawl observed (public listing identifiers plus probe and filter flags) and stores the per-stage exclusion funnel beside the survivor identifiers. The public document composes, per segment, the latest snapshot by crawled_at across live accounts only, computed live at read time; snapshot recording is the only write on this surface and public reads store nothing.

## The limits

Limits, stated plainly: enumeration uses public listing identifiers only and stores no contact data and no email addresses. The hunt queue is private: survivor identifiers are readable only by the account that recorded their snapshot, and public surfaces print aggregates only — no candidate identifier ever appears in the public document, the page or the markdown twin. Snapshots are tenant-private records of what a crawl observed; this surface performs no crawl and no network fetch itself. A segment with no snapshot has not been crawled and says so, with a null count.

## Callable surfaces

- POST /v1/hunt-enumeration/snapshots (account key required) — record one dated enumeration snapshot: segment B, D or C, a crawled_at ISO timestamp and at most 5000 candidates carrying public identifiers plus probe and filter flags; the stored record keeps the per-stage funnel and the survivor identifiers (the private queue)
- GET /v1/hunt-enumeration/snapshots (account key required) — the calling account's own snapshots only, each with its full funnel and survivor identifiers; another account's snapshots never appear
- GET /v1/hunt-enumeration (free, no key) — this public document: per segment, the latest snapshot across live accounts only, as aggregates (crawl status, crawled_at, funnel stages and enumerated_n; Segment C also prints listings_n and operator_n); a segment with no snapshot reads not_yet_crawled with enumerated_n null, and no candidate identifier appears anywhere in the document; the queue_attribution block prints, per segment, the door map entry, queued_n, attributed_n and the zero-filled counts by event kind, aggregates only
- GET /v1/hunt-enumeration/queue (account key required) — the calling account's own segment queue only: per segment, the caller's latest snapshot contributes its survivor identifiers, each carrying its segment, door, first-touch surface, snapshot id and crawled_at; a segment with no snapshot from the caller contributes an empty list and queue_n 0; another account's survivors never appear
- POST /v1/hunt-enumeration/attributions (account key required) — join one of the calling account's own queued identifiers to one door event (event_kind one of publisher_claim, guaranteed_completion, partner_registration, cross_flow_signup); the segment, door and first-touch surface derive from the queue entry, never from the request; first attribution wins, so a repeat for an already-attributed identifier returns the existing record unchanged; an identifier outside the caller's own queue or an unknown event_kind answers 422 hunt_enumeration_invalid and stores nothing
- GET /v1/hunt-enumeration/attributions (account key required) — the calling account's own attributions only, each with its identifier, segment, door, first-touch surface, event kind, snapshot id and recording time; another account's attributions never appear
- GET /hunt-enumeration (page) and GET /hunt-enumeration.md — the human-readable twin of the public document

Every aggregate in this document is composed live at the moment of the read from the latest recorded snapshot per segment across live accounts. Nothing is cached for this document, no candidate identifier is printed, no number is invented, and zeros are shown as zeros only where a crawl actually ran — an uncrawled segment reads not_yet_crawled with a null count.

Machine-readable document: https://www.a2ally.com/v1/hunt-enumeration · Validation gates: https://www.a2ally.com/validation-gates
