Skip to content

Registry: remove discovered agents entirely — registered-only public surface #3772

@EmmaLouise2018

Description

@EmmaLouise2018

Registry: remove discovered agents entirely — registered-only public surface

Refs #3538 (Problem 3, Problem 6), #3547, #3573, #3495.

Proposal

Stop surfacing source: 'discovered' agents in the AAO public registry. The registry should reflect attested, opt-in agents only. Crawled-from-adagents.json agents that have not enrolled are not attested by their owner and should not be displayed, filtered on, or returned by the public API.

Why now

We have spent the last month patching the seams of registered-vs-discovered conflation:

Every one of these is a tax on a feature that no member asked for. Discovered agents are a crawler artifact, not a product. The registry's contract with members is "you enrolled, you are listed." A crawler-only entry breaks that contract from both sides — the listed agent never opted in, and the registry consumer can't tell what the entry means without reading three doc pages.

Scope of removal

Public API

  • /api/registry/agents — return only registered agents. Drop source, discovered_from, endorsed_by_publisher_member from FederatedAgentWithDetails.
  • /api/registry/agents/:url — 404 for URLs that only exist via discovery.
  • ?source= query param — remove (introduced for Problem 3 step 2).
  • Same treatment for FederatedPublisher — registered publishers only.

Schema / types

  • server/src/schemas/registry.ts:432-484 — drop the ["registered", "discovered"] enum, DiscoveredFromSchema, EndorsedByPublisherMemberSchema.
  • server/src/types.ts:1061-1108FederatedAgent.source, discovered_from, endorsed_by_publisher_member; FederatedPublisher.source, discovered_from.

Service layer

Crawler

  • server/src/crawler.ts — keep adagents.json parsing for the publisher-authorization graph (we still need to know who endorses whom for list_authorized_properties validation), but stop registering unknown agents from those listings. The crawler becomes a verification tool for known agents, not a discovery tool for new ones.
  • stats.discovered_agents (line 472) — remove.

Database

  • discovered_agents table — drop.
  • discovered_publishers table — drop, or preserve as crawled_publishers if any publisher-graph code still needs the row (decide during impl).
  • agent_publisher_authorizations — keep the table (authorizations still matter), but the source: 'agent_claim' | 'adagents_json' enum stays meaningful only as an audit field, not as a registry-source signal.
  • New migration to drop tables + clean up indices + remove cleanup/expiry jobs from migrations 331, 349, 432, 455, 461.

UI

  • server/public/agents.html — remove any source badge/filter/segment.
  • /registry page — single list, no tabs.

Docs

  • docs/registry/registering-an-agent.mdx — collapse the "four crawl paths" framing to "one path: enroll on your member profile."
  • docs/registry/index.mdx overview — drop the registered-vs-discovered explainer.
  • Remove endorsed_by_publisher_member and discovered_from references throughout.
  • Mintlify example responses — simpler, no per-source overrides.

Tests

  • Delete: server/tests/unit/registry-discovered-endorsement.test.ts, the discovered branches of registry-sync tests.
  • Update: any test asserting on source or merged-list behavior.

What we lose, and why it's fine

  1. Visibility into "agents that exist in the wild but haven't joined." Real, but the registry was never the right surface for this. If we want a market-coverage view, build it as an internal ops tool, not a public registry tab.
  2. Publisher endorsement signal (endorsed_by_publisher_member). Shipped two days ago in decision(registry): how should discovered agents surface member-publisher endorsement (#3538 Problem 6) #3547, deleted here. Net: the right move. The signal was a workaround for a category we are now removing.
  3. Crawler-driven onboarding funnel. A discovered listing was an implicit nudge to the agent owner to enroll. We can replace this with an outbound email when the crawler sees a new adagents.json entry pointing at an unregistered URL — a stronger nudge than "you're already in the registry, ish."
  4. Backwards compatibility for any external consumer that filtered on ?source=discovered. The ?source= param is days old; risk is near zero.

Migration plan

  1. PR 1 — feature flag the public surface. Add REGISTRY_HIDE_DISCOVERED=true (default true in prod) that filters discovered out of /api/registry/agents + UI. No schema or DB changes. Ship behind flag, validate.
  2. PR 2 — remove the type fields. Drop source / discovered_from / endorsed_by_publisher_member from response schemas and TS types. Update OpenAPI / docs.
  3. PR 3 — service + DB cleanup. Strip federated-index.ts merge logic. Drop discovered_agents / discovered_publishers tables in a migration. Repoint crawler to verification-only mode.
  4. PR 4 — docs sweep. Collapse registering-an-agent docs, remove explainers, fix examples.

Open questions

Acceptance

  • count(*) on /api/registry/agents matches count(*) on member_profiles.agents after dedup.
  • Zero references to discovered, discovered_from, endorsed_by_publisher_member outside of migration history.
  • discovered_agents and discovered_publishers tables are dropped (or renamed to reflect their crawler-graph-only role).
  • Docs no longer mention registered-vs-discovered.

Metadata

Metadata

Assignees

No one assigned

    Labels

    claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions