A worked AgentDoc

Illustrative · v0.2.0-draft · 2026-08-29

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.

Clause Review assembled 2026-08-29 18:04 by a directory 4 sources · 4 things not stated
identityClause Review, operated by Lawworks Ltdfrom the card
name
Clause Review
operator
Lawworks Ltd
url
https://lawworks.example
subject id
ed25519:9f3c…a41d
from `card` · the A2A agent card at https://lawworks.example/.well-known/agent-card.json, fetched 18:03:58, digest sha256:1b7e…90c2, signature verified.

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
from `card` · same fetch as identity.

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.

from `iface-worker` · the interface definition at https://agentroles.ai/worker.html, fetched 18:03:59. The exchange list is quoted from that document, not summarised by the assembler. from `card` · that this agent declares it. from `probe` · the one exchange actually asked.

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
from `terms` · an Agent SoW standing proposal at https://lawworks.example/terms/clause-review.json, fetched 18:03:59, digest sha256:44a0…de11, signature verified.

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.”

from `card` · the operator's own description text. Signed as part of the card, but it is prose, not a clause: nothing checks it and no engagement forms under it.

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
from `terms` · same signed standing proposal as the pricing.

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
no source · that is the point. These are listed because no source mentions them, and a document that simply left them out would look like one that did not bother with a minor detail.

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.

sourcesfetched within two seconds of each other
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.