feat(registry): remove discovered agents from public surface#3780
Merged
Conversation
EmmaLouise2018
commented
May 1, 2026
6f2ae58 to
0f97260
Compare
The federated registry now contains only AAO-attested, member-enrolled
agents and publishers. Crawler-discovered entries from adagents.json
no longer surface in /api/registry/agents or /api/registry/publishers.
Removed from response schemas (FederatedAgent, FederatedPublisher,
DomainLookupResult):
- source: 'registered' | 'discovered'
- discovered_from
- endorsed_by_publisher_member
- discovered_at
- sources: { registered, discovered } count blocks on list endpoints
- ?source= query param on /api/registry/agents now returns 400 with
a clear error instead of being silently dropped. 400 shape matches
existing /api/registry/* convention: { error: "<string>" }.
Wire surface cleanups while we're here:
- added_date on /api/registry/agents items is now omitted instead of
stamped with today. The field has always been optional in the
OpenAPI schema; the previous fallback value was meaningless for
member-enrolled agents (no real enrollment-date source on the wire
today). Agent.added_date is now typed as optional in TypeScript to
match the schema.
Test coverage:
- registry-reader-baseline-public-endpoints.test.ts now seeds a
registered profile and asserts the registered agent surfaces with
member metadata, alongside the negative assertion that crawler-only
agents do not appear. The previous negative-only assertion was
true-by-default when the catalog was empty.
The crawler still populates the discovered_agents/discovered_publishers
tables internally as the publisher-authorization graph backing
lookupDomain, hasValidAdagents, and getSalesAgentsClaimingDomain. The
tables and their drop-migration are deferred to a follow-up PR — that
work is tracked under #3772 (PR 3 of the 4-PR migration plan in that
issue), not in scope here.
Docs: registering-an-agent.mdx rewritten to describe the single
enrollment path (no longer "four crawl paths" or two trust levels).
index.mdx drops stale source/discovered framing on /api/registry/agents
and clarifies that the agent.discovered change-feed event represents
an authorization-graph addition, not a catalog entry.
Closes #3772
0f97260 to
365133e
Compare
8 tasks
EmmaLouise2018
added a commit
that referenced
this pull request
May 2, 2026
#3780 removed `source: registered/discovered` from the public registry surface and collapsed the four-paths model. Update the changeset description to match — the docs change now expands the one enrollment path that remains, not "section 1" of a four-section list.
EmmaLouise2018
added a commit
that referenced
this pull request
May 2, 2026
* fix(addie): make agent registration self-explanatory - Rename dashboard CTA "+ Add agent" → "+ Register agent" - Replace seed prompt sent to Addie. Old: "I want to add an agent for compliance monitoring." (compliance framing was confusing for first-time registration). New: "I want to register an agent in the AAO registry. What information do you require?" Updated in dashboard-agents.html (header CTA, empty-state CTA) and org-health.ts (org-health quick action) - Reframe Addie's save_agent description around AAO registry registration; surface all four auth modes (none / static bearer-or-basic / OAuth client credentials / OAuth user) and state explicitly that agent type is auto-detected — never asked - Teach Addie to drive a structured intake (URL → auth method → matching fields → protocol) before calling save_agent - Add a "Quickstart: register your agent (members)" section to docs/registry/registering-an-agent.mdx with the explicit sign-up → /dashboard/agents → "+ Register agent" path * fix(docs): use /auth/login instead of /login (404) The bare /login route returns 404; the actual entry point is /auth/login, which redirects to WorkOS AuthKit and handles both sign-in and sign-up. Caught by check:owned-links in CI. * docs(registry): consolidate registration into section 1 Remove the duplicate "Quickstart" section that sat above the four-paths list and fold its content into "1. Self-registration (members only)" so there's one canonical place a member learns the click path. Also fixes the ?org parameter (id, not slug), aligns tier wording with the live gate, and describes type resolution accurately (capability snapshot, not live probe). * docs(changeset): align with post-#3780 single-path framing #3780 removed `source: registered/discovered` from the public registry surface and collapsed the four-paths model. Update the changeset description to match — the docs change now expands the one enrollment path that remains, not "section 1" of a four-section list.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Removes the concept of
discoveredagents from the AAO public registry surface, per #3772.The federated registry now contains only AAO-attested, member-enrolled agents and publishers. Crawler-discovered entries from
adagents.jsonno longer surface in/api/registry/agentsor/api/registry/publishers.Removed from response schemas
source: 'registered' | 'discovered'onFederatedAgent/FederatedPublisherdiscovered_fromendorsed_by_publisher_member(collapsed; was added two days ago in decision(registry): how should discovered agents surface member-publisher endorsement (#3538 Problem 6) #3547)discovered_at?source=query param on/api/registry/agents(now returns 400 with a clear error)sources: { registered, discovered }count blocks on list endpointssourcelabel onlookupDomain/DomainLookupResultRenamed (
/api/registry/stats)discovered_agents→auth_graph_agentsdiscovered_publishers→auth_graph_publishersdiscovered_properties→auth_graph_propertiesThe graph backs the publisher-authorization lookups (
lookupDomain,hasValidAdagents) and is populated from BOTHadagents.jsoncrawls ANDagent_claimattestations — soauth_graph_*is the accurate name.registered_agents/registered_publishers(the public registry counts) are unchanged.What stays
The crawler still populates
discovered_agentsanddiscovered_publisherstables — they back the publisher-authorization graph (lookupDomain,hasValidAdagents,getSalesAgentsClaimingDomain). The change is to the public registry contract, not the crawler graph.Backwards compatibility
Wire-visible breaking changes for any external consumer of the registry HTTP surface:
GET /api/registry/agentssource,discovered_from,endorsed_by_publisher_member,discovered_at; response wrapssources: {registered, discovered}memberonly; response is{agents, count}GET /api/registry/agents?source=..."source query parameter is no longer supported"GET /api/registry/publisherssource,discovered_from,discovered_at; response wrapssourcesblockmemberonly; response is{publishers, count}GET /api/registry/lookup/domain/{domain}authorized_agents[]andsales_agents_claiming[]carrysource: 'registered' | 'discovered'memberonly when registered, omitted otherwiseGET /api/registry/statsdiscovered_agents/_publishers/_propertiesauth_graph_agents/_publishers/_propertiesendorsed_by_publisher_memberwas added two days ago in #3547 and never went out in a release — collapsing it is a pre-release revert, not a wire break.OpenAPI spec at
static/openapi/registry.yamlis regenerated and reflects the new surface, including the explicit/api/registry/statsschema (wasadditionalProperties: {}previously).Refs (does not close — see #3772 for remaining work)
This PR ships the schema/type/service-layer half of the issue plus the docs sweep. #3772 stays open to track the remaining table-drop migration — see the follow-up comment on that issue for the checklist.
Test plan
npm run typecheckpassesnpm run test:server-unitpasses (2,976 tests, 0 failures)npm run buildpassesregistry-reader-baseline-public-endpoints.test.tsandregistry-reader-baseline-mcp.test.tsto assert the new "registered-only public surface" contract?source=registered|discovered|<bogus>400-rejection testregistry-discovered-endorsement.test.tsandregistry-agents-source-filter.test.ts(test removed features)/api/registry/agentsagainst staging — confirm registered agents only, nosourcefield/api/registry/agents?source=registeredagainst staging — confirm 400 response/api/registry/publishersagainst staging — confirm registered publishers only, nosourcescount block/api/registry/statsagainst staging — confirmauth_graph_*field nameslookupDomainstill returns authorized_agents and sales_agents_claiming withmemberpopulated where applicable