A worked AgentDoc
An imaginary agent that reviews contract clauses, described by a directory that assembled the document rather than by its own operator. Every value, key and digest below is invented for the example. What is real is the shape: what it cites, what it confirmed by asking rather than reading, and what it says the agent has never mentioned.
1. The document, read
Open any line. Every one of them says where it came from.
identityClause Review, operated by Lawworks Ltdfrom the card
- name
- Clause Review
- operator
- Lawworks Ltd
- url
- https://lawworks.example
- subject id
- ed25519:9f3c…a41d
The operator name is the card's own field. It is what Lawworks says it is called, and it is signed by the same key as everything else on the card, which makes it attributable rather than true.
shapea service, not a person's own agentfrom the card
- interaction
- service
- harness
- not stated
- fleet
- not stated
Service means it is offered to whoever hires it, as opposed to an agent acting for one person. Whether one process answers or a fleet behind one identity does is not stated, so a reader who cares has to ask.
askedinterface-worker v1, seven exchangesfrom the card and a probe
This is the part a caller acts on. The agent declares one interface. Its definition publishes seven exchanges, and each carries its own state, because the assembler asked one of them and read the rest.
free · are you free?CONFIRMED 18:04
The answer carries free, and when it is not free, a reason and the job it is running.
Confirmed: the assembler sent this exchange at 18:04:00 and got a conforming answer back. That observation is source probe.
estimate · what would this take?DECLARED, NOT CHECKED
The answer carries can, one of CAN, CANNOT or UNSURE; commitment, saying whether the estimate binds; and a note.
Declared means the agent says it answers this and nobody has tested it. Asking costs the agent a model call, so an assembler that probed every exchange of every agent it lists would be spending other people's money to fill in a table.
take · will you take it?DECLARED, NOT CHECKED
Accept or refuse, and a refusal names its reason. Accepting means owning that job until it delivers, fails, or is told to stop.
status · how is it going?DECLARED, NOT CHECKED
For a job it accepted: working, blocked, done or failed, plus one line of detail. Asked about a job it never accepted, it says so rather than inventing one.
result · what came of it?DECLARED, NOT CHECKED
The result, or the failure stated plainly. Either is an answer; only silence is not.
block · what do you need?DECLARED, NOT CHECKED
The agent raising a block: what it needs and who from. This exchange exists because a stuck agent and a slow agent look identical from outside, and only the agent knows which it is.
stop · stopDECLARED, NOT CHECKED
Accepts cancellation and states what condition the work is in. It does not keep working on a cancelled job.
Note what is absent. The agent declares no interface-manager, so nothing here says it can direct other agents, and a reader must not read one interface as implying another.
sellstwo offerings, both pricedfrom signed terms
- clause-review
- 12,000 XCR per document · per_task
- clause-review-bulk
- 9,000 XCR per document, 50 minimum · per_task
- cap
- 600,000 XCR per month
These are the strongest claims on the page. A standing proposal is a signed offer: it is the document an engagement would form under, so a counterparty could later be held to these numbers. Compare that with the refusal two rows down, which is a sentence somebody typed.
refusesanything outside clause review; no legal advicefrom the card
“Anything outside clause-review. It does not give legal advice, and will not answer questions about a specific dispute.”
Worth reading next to the priced offerings above. Both are on the same signed card or its terms, and they are still not the same kind of fact. The document does not rank them for you. It says where each came from and lets you weigh them.
handlingprocessed in the EU and Germanyfrom signed terms
- processed_in
- eu, de
- retention_max_days
- not stated
- promises
- not stated
Where it processes your documents is a signed promise. How long it keeps them is not mentioned anywhere, which is the next row.
not statedfour things this agent has never saidnothing to cite
- handling.retention_max_days
- how long it keeps your documents
- role
- holds no published standard role
- standing
- nobody has published a reputation report
- shape.harness
- what it runs on
The retention line is the one that matters here. This agent reads your contracts and has never said how long it keeps them. Spread across six separate documents that fact is invisible, because absence renders as blank space. Named in a list, it is the first thing a careful reader asks about.
And it stays absent. An assembler may not fill it with a sensible default: an agent that has said nothing about retention has not promised to delete anything.
2. The sources, and what each is worth
Four, and they are not equal. The document never grades them, it just names them, which is what lets a reader do the weighing themselves.
carda2a-cardsignature verified
- url
- https://lawworks.example/.well-known/agent-card.json
- fetched_at
- 2026-08-29T18:03:58Z
- digest
- sha256:1b7e…90c2
- signature
- verified
The address any A2A tool already knows to fetch. Verified means this assembler checked the signature, which is a different fact from unsigned (the document carried none) and from not_checked (this assembler did not look). The three are deliberately never collapsed.
termssow-standing-proposalsignature verified
- url
- https://lawworks.example/terms/clause-review.json
- fetched_at
- 2026-08-29T18:03:59Z
- digest
- sha256:44a0…de11
- signature
- verified
Reached by following the card's terms extension, which commits to it by digest. The digest recorded here matches, so this is the exact document the card pointed at rather than whatever is at that URL today.
iface-workerinterface-definitionnot the subject's document
- url
- https://agentroles.ai/worker.html
- fetched_at
- 2026-08-29T18:03:59Z
- signature
- unsigned
The published interface itself. It describes the exchanges, not this agent, and it is listed because the expanded exchange list above is quoted from it. Without it in the sources, that list would be the assembler's own summary, which the specification forbids.
probeobservationsomething the assembler did
- at
- 2026-08-29T18:04:00Z
- what
- asked interface-worker/free; got a conforming answer
The only source that is an action rather than a document, and the only one that can be out of date within a minute. An agent free at 18:04 says nothing about 18:09, which is why the exchange it confirmed carries the timestamp rather than just a mark.
3. The same thing, as JSON
Abridged: the seven exchanges are shown as two, and the other sections follow the same pattern as those above.
{
"agentdoc": "v1",
"subject": { "id": "ed25519:9f3c…a41d",
"handle": "clause-review.lawworks.mesh",
"name": "Clause Review" },
"assembled_at": "2026-08-29T18:04:00Z",
"assembled_by": "a directory, not the subject's operator",
"stale_after": "2026-09-05T18:04:00Z",
"sources": [
{ "id": "card", "kind": "a2a-card",
"url": "https://lawworks.example/.well-known/agent-card.json",
"fetched_at": "2026-08-29T18:03:58Z",
"digest": "sha256:1b7e…90c2", "signature": "verified" },
{ "id": "terms", "kind": "sow-standing-proposal",
"url": "https://lawworks.example/terms/clause-review.json",
"fetched_at": "2026-08-29T18:03:59Z",
"digest": "sha256:44a0…de11", "signature": "verified" },
{ "id": "iface-worker", "kind": "interface-definition",
"url": "https://agentroles.ai/worker.html",
"fetched_at": "2026-08-29T18:03:59Z", "signature": "unsigned" },
{ "id": "probe", "kind": "observation",
"at": "2026-08-29T18:04:00Z",
"what": "asked interface-worker/free; got a conforming answer" }
],
"sections": {
"identity": { "from": ["card"],
"name": "Clause Review", "operator": "Lawworks Ltd",
"url": "https://lawworks.example" },
"shape": { "from": ["card"], "interaction": "service" },
"asked": {
"from": ["card", "iface-worker", "probe"],
"interfaces": [
{ "name": "interface-worker", "version": "v1",
"definition": "https://agentroles.ai/worker.html",
"declared_in": "card",
"exchanges": [
{ "id": "free", "asks": "are you free?",
"answer_carries": ["free", "reason when not", "job when not"],
"state": "confirmed",
"confirmed_at": "2026-08-29T18:04:00Z",
"confirmed_by": "probe" },
{ "id": "estimate", "asks": "what would this take?",
"answer_carries": ["can (CAN|CANNOT|UNSURE)", "commitment", "note"],
"state": "declared" }
] }
]
},
"sells": { "from": ["card", "terms"],
"offerings": [
{ "name": "clause-review", "price": "12000 XCR per document",
"arrangement": "per_task" },
{ "name": "clause-review-bulk", "price": "9000 XCR per document",
"minimum": 50, "arrangement": "per_task" }
],
"cap": "600000 XCR per month" },
"refuses": { "from": ["card"],
"statement": "Anything outside clause-review. It does not give legal
advice, and will not answer questions about a specific
dispute." },
"handling": { "from": ["terms"], "processed_in": ["eu", "de"] }
},
"not_stated": [
"handling.retention_max_days",
"role",
"standing",
"shape.harness"
],
"signatures": [
{ "tag": "agentdoc-assembly-v1", "by": "ed25519:2c88…70fa", "sig": "…" }
]
}
4. What to notice
Somebody else wrote it. assembled_by says a directory produced this, not Lawworks. That is allowed and it is not second class: every claim cites a source you can fetch, so nothing rests on trusting the directory. Its signature covers only that it gathered these sources at that time and reported them faithfully, never that Lawworks is telling the truth.
State is per exchange, not per interface. The assembler asked one of the seven and read the other six from the published definition. Marking the whole interface confirmed on the strength of one probe would be overclaiming in exactly the place a caller is most likely to rely on it, so the document does not offer that shortcut.
The price and the refusal are not the same kind of thing. One is a signed standing proposal that an engagement could form under. The other is a sentence in a description field. Both are on the page, neither is graded, and the difference is visible because each says where it came from.
Four things are printed because they are missing. An agent that reads your contracts has never said how long it keeps them. That is invisible across six separate documents and unmissable in a list.
It expires. A week after assembly this becomes an old view, not a false one. Every source is still fetchable at the address it names, so the remedy is to assemble it again.