You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The spec PR (#4828) is small (schema + docs). The server implementation is non-trivial:
Discovery method surfacing. The existing agent_publisher_authorizations table tracks source (adagents_json | agent_claim) — the "evidence" lineage. The spec's discovery_method (direct | authoritative_location | adagents_authoritative | ads_txt_managerdomain) is a different concept: how this publisher → agent edge was reached in the discovery graph. Requires either a new column or a derived field set by the crawler at index time.
Manager domain. Not stored on the existing row. Crawler knows which manager file the edge came from; needs to be persisted alongside the publisher_domain → agent_url edge.
signing_keys_pinned lookup. Boolean — does the publisher's authorized_agents[] entry for this agent carry signing_keys[]? Cheap derived field at indexing time.
Revoked tombstones. When a publisher's adagents.json newly lists a publisher_domain in revoked_publisher_domains[], emit one row with status: revoked on the next sync after revocation lands, then drop it.
Where it lands
Route: server/src/routes/registry-api.ts — new router.get("/v1/agents/:encodedUrl/publishers", ...). Sits alongside the existing /registry/lookup/agent/:agentUrl/domains (bare-bones inverse lookup that returns only domain strings, no provenance). The existing endpoint is kept; the new endpoint is the spec-compliant richer surface.
DB: server/src/db/federated-index-db.ts — extend getDomainsForAgent shape OR new getPublishersForAgentWithDetail that joins the necessary fields.
Crawler: surface discovery_method + manager_domain at index time in server/src/registry-sync/authorization-index.ts.
Implementation of the AAO directory inverse-lookup endpoint specified in #4823 and PR #4828.
Endpoint
Response shape per schema and docs.
Why this is its own ticket
The spec PR (#4828) is small (schema + docs). The server implementation is non-trivial:
Discovery method surfacing. The existing
agent_publisher_authorizationstable trackssource(adagents_json|agent_claim) — the "evidence" lineage. The spec'sdiscovery_method(direct|authoritative_location|adagents_authoritative|ads_txt_managerdomain) is a different concept: how this publisher → agent edge was reached in the discovery graph. Requires either a new column or a derived field set by the crawler at index time.Manager domain. Not stored on the existing row. Crawler knows which manager file the edge came from; needs to be persisted alongside the publisher_domain → agent_url edge.
Per-publisher property counts.
properties_authorizedandproperties_totalare scoped to the row's publisher only, never network-wide. Computed by resolving the publisher's selectors via existingexpandPublisherPropertiesToIdentifiers(already infederated-index.ts:6897). For managed-network-shape parent files, depends on the feat(adagents): clarify publisher_properties resolution — managed-network pattern needs inlined-properties path #4825 inline resolution rule.signing_keys_pinnedlookup. Boolean — does the publisher'sauthorized_agents[]entry for this agent carrysigning_keys[]? Cheap derived field at indexing time.Revoked tombstones. When a publisher's
adagents.jsonnewly lists apublisher_domaininrevoked_publisher_domains[], emit one row withstatus: revokedon the next sync after revocation lands, then drop it.Where it lands
server/src/routes/registry-api.ts— newrouter.get("/v1/agents/:encodedUrl/publishers", ...). Sits alongside the existing/registry/lookup/agent/:agentUrl/domains(bare-bones inverse lookup that returns only domain strings, no provenance). The existing endpoint is kept; the new endpoint is the spec-compliant richer surface.server/src/db/federated-index-db.ts— extendgetDomainsForAgentshape OR newgetPublishersForAgentWithDetailthat joins the necessary fields.discovery_method+manager_domainat index time inserver/src/registry-sync/authorization-index.ts.Dependencies
properties_totalon managed-network-shape parent files (cafemedia, ~6,800 represented domains) requires the inline-resolution rule. Without it, the directory must do 6,800 HTTP fetches per refresh per publisher — the same scale problem operators have, moved one layer up.Out of scope (v1)
agent_url+ IP).?include=propertiesfor inline property detail. Counts-only v1.Companion SDK work
fetch_agent_authorizations_from_directory(agent_url, directory_url)wrapperAcceptance
direct,authoritative_location,adagents_authoritative,ads_txt_managerdomaindiscovery methodssigning_keys_pinnedsurfaces accurately for publishers that pin keys (e.g., WSJ)revokedtombstones propagate within one refresh cycle of the publisher'srevoked_publisher_domains[]updateIf-None-Match) returns304when nothing changedagent_url+ IP, returns429withRetry-After