Dedupe and merge
These pages describe checker version VeronikAI/0.1+attestations.1 (signing.py). A2A card checks use suite veronikai-a2a-get-card version 1. MCP checks use suite veronikai-mcp-conformance version 2. If the code changes, the version string on a signed result should change too.
What is checked
The same agent can appear in more than one public list — for example the official MCP Registry and Hugging Face Spaces. If we counted every listing as a new agent, the directory would look bigger than it is, and the same shop would get many report cards.
Dedupe asks: are these listings the same public endpoint (or the same official MCP name), and should they share one history?
This step does not knock on the agent. It only rearranges records we already fetched from allowed registries (dedupe.py).
How it works
Each listing gets a key:
- A2A: a2a: plus the normalized card URL, with /.well-known/agent-card.json or /.well-known/agent.json removed when present (or the endpoint, if there is no card).
- MCP: mcp: plus the normalized https endpoint.
Listings from different registries that share that key are merged into one agents row. If a non-official listing publishes an MCP server name that already exists in the official MCP Registry, it is folded into that official entry's endpoint key (a "name alias").
When several listings remain after the merge, we pick display fields in a fixed source order: mcp-registry, then a2a-registry, then hf-spaces, then neuronto, then smithery, then allagents. The first non-empty name, description, endpoint, and card URL win. The agent remembers every source that still lists it.
We usually regroup only keys that changed in the current run. A full regroup happens if VERONIKAI_FULL_DEDUPE=1, or the first time effective keys have never been filled in.
If every listing for a key disappears, the agent is marked inactive. Its history stays, unless the listings were removed because of a policy exclusion (for example an upstream we are not allowed to use). Policy exclusions also delete the public agent row so we do not keep serving those details.
What pass and fail mean
Dedupe is not a grade.
- Merged means we believe two listings point at the same public agent. They share one key and one check history.
- Kept apart means the endpoints (or official names) differ. Two weather agents on two hosts stay two agents, even if they chose the same display name.
- Inactive means no remaining allowed listing still points at that key. It does not mean the server is down.
Limits
- Keys come from URLs and official names, not from "these descriptions sound alike". We will not merge two different servers just because both say they translate text.
- Descriptions stored on the agent are trimmed to 500 characters.
- A failed registry fetch (0 rows this run) does not wipe yesterday's listings. The last good copy stays until a successful fetch says they are gone. That is why a source that reads 0 rows because of robots usually does not, by itself, shrink the active-agent count.
- Source preference can hide a nicer description from a lower-ranked registry if a higher-ranked one already provided one.
Checker version
Dedupe is part of building the directory, not part of a signed per-check suite. Signed checks still name VeronikAI/0.1+attestations.1. The merge rules above are the ones in dedupe.py as of Nov 9, 2026.