Verb Atlas
Every verb the platform exposes to an agent, filed at a coordinate, with what it costs to call and whether it can be rehearsed first. Read from the live manifest, not from a list anyone maintains by hand.
Ten classes hold the whole surface. Pick one to drill into its nouns, or search above to jump straight to a verb.
How the Atlas works
Six sections, each closed until you want it. The rules behind the coordinates, the doors a verb can be called through, and what an agent can rehearse before it commits.
Nouns · the address spaceReading a coordinateWhy no digit is ever an ordinal, why none is ever re-sorted, and why money has three.
A name has to be known before it can be used. A coordinate does not: the prefix is the query, so truncating it widens the scope with no filter flag to learn and no enum to memorise.
3_ Customers & CRM class — the first digit 31 Customers & CRM → contact division — the noun solid verbs list 3 272 verbs · the whole class solid verbs list 31 10 verbs · the contact neighbourhood
No digit is ever an ordinal. A digit counted inside its parent renumbers every later sibling the moment something is inserted — which destroys the one property that makes a coordinate worth caching. So every digit is allocated once, written down, and never moved; a verb’s identity stays its name and its coordinate locates the neighbourhood.
A curated class has three digits: class, domain, noun. Money is the first. One word there names several different things — a deposit can be what the processor paid into the bank (541) or what a customer paid up front (513); an invoice can be the business billing its customer (510) or Solid# billing the business (581) — so its nouns are placed by reading what each verb actually touches and whose money it is, not by how the verb is spelled. solid verbs list 5 is all money, 53 is taking payment, 531 is refunds. Every coordinate a class used before it was curated is retired, never reused, and redirects to where its verbs went.
Division digits are allocated once and never re-sorted. They used to be ranked by weight — the busiest noun in a class took digit 0, the next took 1. That read well, and it was the same defect the third digit was refused to prevent, one level up: measured on the live registry, adding a single verb renumbered other verbs’ coordinates for 57 of 116 nouns, and one extra integration verb moved 32 of them. It was also intermittent — a new payment verb moved nothing while a new brand verb moved eleven — so it looked stable right until an agent’s cached coordinate was silently wrong. A noun that has a digit now keeps it forever, and a new noun takes the next free digit in its class.
Overflow is reported, not absorbed. Ten division slots per class is a hard ceiling, and a class with an eleventh noun collapses it onto digit 9 — which is why a coordinate ending in 9 can be a crowd of unrelated verbs rather than an address. That is a curation debt, not a numbering problem: the fix is to merge two nouns or move one to a class that fits it, never to add a digit. The registry names the full classes rather than letting them stay quiet.
Class and division are curated, not counted. Outside a curated class, classification scans every segment of a name, namespace first, against a keyword table — so list_blog_posts files under blog rather than under listing, because listing is not a subject. Inside one, a verb is placed by the noun that claimed it, and a new verb nobody claimed fails the build.
The name “Atlas” is deliberate: Dewey Decimal Classification is an OCLC trademark, so the idea is borrowed and the name is not.
Verbs · who can reach themEvery platform, and what it can callWeb, iOS, Android and the CLI reach all of them. The published manifests carry fewer.
“Is this verb in the catalog” and “can my app call it” are different questions, and only the second one matters to somebody building. The surfaces a verb declares govern the published manifests — they do not govern the dispatch endpoint, which is the door the products themselves use.
The apps are not a special case, and that is the design. The web dashboard, the iOS app and the Android app all post to the same dispatch endpoint against the same verb registry the CLI and the MCP connector use. There are no bespoke mobile endpoints: a tap and an agent’s sentence are the same operation, audited the same way. A verb therefore reaches every product the moment it is registered, whatever its surfaces say, because that path resolves against the registry and does not consult them.
Verbs · the transportsThe doorsThe same capability offered through several transports, which do not carry the same set.
A verb is not one thing an agent calls. It is the same capability offered through several transports, and they do not carry the same set — so “it is in the catalog” and “I can call it from here” are different claims, and only one of them is answered by the total at the top of this page.
The CLI is the widest door because it can reach both halves of the registry: the 1199 dotted verbs that have a real REST route, and the 269 dotless ones that only cli-dispatch can resolve. MCP, WebMCP and UCP carry the dotted half. A verb missing from a door is not necessarily a defect — a destructive write is deliberately kept out of the browser — but it is always a fact a planner needs before it promises a customer something it cannot execute from where it is standing. 307 verbs carry a same_as link to their canonical twin, so the two names resolve to one capability rather than reading as two.
Do not confuse these with the marketing MCP. solidnumber.com/api/mcp answers an unauthenticated tools/list with a much smaller set that sells the platform to a stranger’s agent — pricing, comparisons, industry fit. It touches no tenant data and none of it is on this page.
Nouns · level 1Noun index181 nouns, with how many verbs each carries and how many of those write.
24 of them hold exactly one verb: the tail of the surface, and the honest picture of where the vocabulary is still thin. Every entry here is also a filter in the explorer above — pick a class, then a noun.
70 coordinatepage noun35·25w 35 verbs, 25 write
Verbs · the twelve shapesWhat kind of thing a verb isEvery verb declares a shape. The shape says how an agent should reach for it.
A name says what a verb touches; a shape says what kind of move it is. An agent picking between two verbs that both mention invoices wants to know which one explains, which one previews and which one charges. Counts are live; the definitions are written down because the manifest publishes the label and not the meaning.
aggregatereadcustomer.full_contextexplainreadcrm.explain_contact_statepreviewreadlevel3.previewsuggestreaddeal.suggest_next_actiondiscoveryreadagent.manifestsubscribereadevent.subscribetrailreadagent.trails__lookupreputationreadagent.reliability__scoreboardtransactionwritetransaction.commitreceiptwritevoice.call_outboundrevertwriteaudit.revertmacrowriteagent.macros__executeA thirteenth shape, telemetry, exists on the surface with a single verb behind it and has never been written up. It is listed here rather than quietly omitted.
Verbs · the consent ladderFive classes, five gatesrequires_consent is a boolean. This is what decides which gate that boolean raises.
Every verb record carries requires_consent, and 854 of 1468 set it. That boolean is the shadow of a five-class ladder: the class decides what the caller has to do, and which role is even allowed to try.
| Class | Gate | Minimum role | Example |
|---|---|---|---|
READ | None | read_only | crm.list_recent_activity |
WRITE_REVERSIBLE | Confirmation click | employee | contact.update |
WRITE_FINANCIAL | Typed phrase | admin | payment.charge |
IRREVERSIBLE | Typed phrase | owner | gdpr.delete_data |
BLOCKED | Never | — | subscription cancel-immediate |
A dry run is never gated, whatever the class — rehearsing a write makes no mutation, so demanding consent to preview one would make the safe path harder than the live one.
Playground · the safety planeRehearsal without consequenceWhat an agent can try before it commits, and what an error owes it afterwards.
The third plane. Verbs say what can be done, nouns say where it lives, and the playground answers the question an agent must resolve before touching a real business: what happens if I do this, and can I try it first?
Preview comes before consent, never after
A dry run makes no mutation by definition, so it never needs consent. --confirm stays mandatory for the real call and only for the real call. A gate that demands consent to preview a write makes rehearsal impossible, which is the whole point of the plane.
A preview that validates nothing is worse than no preview
The dry run checks the payload against the verb’s own input_schema before echoing the request. A green sandbox followed by a red production is the one arrangement worse than having no sandbox at all — the agent learns to distrust the safe path and goes straight at the live one.
A preview never reports success
No success:true beside dry_run:true. An agent checking the conventional field must not read a rehearsal as a completed write.
The dry-run response
{"dry_run":true, "valid":false,
"verb":"contact.create",
"missing_required":["company_id"],
"type_errors":[],
"unknown_fields":[],
"would":{"method":"POST","url":"/api/v1/agent/contact/create","body":{...}},
"fix":"solid verbs example contact.create"}
exit 1 — a failing rehearsal fails loudly, and names the next commandOne caveat the schema alone will not tell you: company_id appears in most required arrays and is injected from the caller’s auth. Validating required[] literally fails every dry run — replacing “always yes” with “always no”. Tenant-injected fields are satisfied before the check runs.
The recovery contract
The playground covers the attempt. This covers the miss — one rule generates it: an error must leave the agent one cheap call away from correct.
{"error":{
"code":"VALIDATION_FAILED", never SERVER_ERROR for a client fault
"retryable":false, true only for 408, 429 and 5xx
"message":"contact_id: Field required",
"fix":"solid verbs example contact.relationship_map"
}}Every command named in a fix must exist. A hint that points at a command the CLI has never had costs an agent a full turn and teaches it to ignore the field.
What a cold agent does in its first minute
1. solid map the whole platform · cached once 2. solid find "<the task>" intent → coordinate + name 3. solid verbs describe contact.create exact call shape 4. solid verbs invoke ... --dry-run validated, nothing sent 5. solid verbs invoke ... --confirm committed steps 1–3 are answerable from cache on every task after the first
Nouns · the proposed registryThe Register — who a verb is forProposed, not built. Rank and relabel by industry; never hide.
The Atlas says what a verb is; it does not say who it is for. That fact exists — every company carries an industry identity and a merchant category code — and it drives the money layer, but on the agent surface it reaches only a few places, and some of those hide verbs instead of ranking them.
ours kb_series (~10) -> kb_sub_code (227) stable forever · ours · the identity theirs mcc_class -> mcc (204) ISO 18245 · not ours to renumber join kb_sub_code.mcc + assigned_on + source
Two spines, one join — not one tree. MCC is ambiguous by construction (227 of our codes collapse onto 204 MCCs) and it is revised by the card networks, so our industry identity cannot hang beneath it without inheriting their renumbering.
The payoff is not filtering. Only a small share of verbs are genuinely vertical, so hiding by industry buys a few percent. The prize is the rest: rendering the same verb in the tenant’s own vocabulary — appointment.book as “book a job” for a plumber and “schedule a patient visit” for a clinic — from a terminology service that is already live. Rank and relabel; never hide. A verb hidden by industry is a capability deleted the moment a tenant does something adjacent.
ProvenanceWhere these numbers come fromRead out of the running platform when the page was built. Nothing here is typed by hand.
| Field | Source |
|---|---|
| verbs · schemas · facets | the live manifest at GET https://api.solidnumber.com/api/v1/agent/verbs — unauthenticated metadata, 1468 records, re-read hourly |
| coordinate · noun | published on every manifest record by the Atlas classifier, not derived in this page |
| transport · same_as | 1199 http · 269 dispatch · 307 twin links |
| output shapes | 867 of 1468 verbs publish one; the rest declare nothing rather than guess |
| pack-gated verbs | excluded from the manifest by design; the manifest does not report how many, so this page cannot say |
| infrastructure | not published here at all — this page describes the surface, never where it runs |
Carried by some records, not all — an output shape on 867 of 1468 verbs, a twin link on 307. Partial is the state worth watching: a field nobody populates gets noticed, and a field everybody populates can be planned against. One that is there four times in five teaches an agent to expect it and then drops out without warning.
The one rule that keeps this page honest is the same one that governs the platform’s other counts — change the code, never the number. There is no snapshot behind this page to fall out of date.