Open spec · v0.1 · Apache-2.0
Agent Work Record.
Your agent says it’s done. The record says who let it, what proves it and who said it was good. One JSON file any tool can write.
The spec’s address is agentworkrecord.org. Its source is on GitHub.
Three questions. One file.
Every piece of agent work ends in the same argument. The record settles it before anyone has to ask.
Who was allowed?
Which agent, acting for which person, with what permission, until when. A grant, not a vibe.
What shows it was done?
The pull request, the CI run, the screenshot, the review. Links, commits and digests, not adjectives.
Who said it was good?
A named person accepted or rejected it and cited what they looked at. An agent carries a sign-off only under that person’s grant.
One record, start to finish.
Dana lets Builder work on issue 42 until tomorrow morning. Builder opens a pull request, CI passes, Reviewer finds nothing blocking, and Dana exports a real report before accepting. Fifteen events, append-only.
{
"spec": "agent-work-record/v0",
"work": {
"id": "https://tracker.example.com/w/acme/issues/42",
"title": "Add CSV export to the reports page"
},
"grants": [
{
"id": "urn:uuid:0b6c9f1a-2d3e-4f50-8a61-7b8c9d0e1f20",
"agent": "https://tracker.example.com/w/acme/agents/builder",
"granted_by": {"id": "https://tracker.example.com/w/acme/people/dana", "name": "Dana Reyes"},
"actions": ["read", "write", "open_pull_request"],
"excludes": ["production data changes", "new paid infrastructure"],
"work": "https://tracker.example.com/w/acme/issues/42",
"issued_at": "2026-10-14T09:01:00Z",
"expires_at": "2026-10-15T09:01:00Z",
"note": "Go ahead on #42 and open a PR. Do not merge."
}
],
"evidence": [
{
"id": "urn:uuid:3e9f2c4d-5061-4283-9d94-0e1f20314253",
"kind": "ci_run",
"uri": "https://github.com/acme/app/actions/runs/123456789",
"claim": "ready_for_review",
"by": "https://tracker.example.com/w/acme/agents/builder",
"at": "2026-10-14T11:20:00Z",
"subject": {"gitCommit": "3f2a9c1435b35d5f7909a03b9e61584db41b2143"},
"result": "pass",
"note": "All checks at head 3f2a9c1."
}
],
"signoffs": [
{
"id": "urn:uuid:7cd36081-94a5-46c7-91d8-425364758697",
"by": {"id": "https://tracker.example.com/w/acme/people/dana", "name": "Dana Reyes"},
"decision": "accept",
"claim": "done",
"subject": {"gitCommit": "3f2a9c1435b35d5f7909a03b9e61584db41b2143"},
"evidence": [
"urn:uuid:3e9f2c4d-5061-4283-9d94-0e1f20314253",
"urn:uuid:4fa03d5e-6172-4394-8ea5-1f2031425364",
"urn:uuid:5ab14e6f-7283-44a5-9fb6-203142536475",
"urn:uuid:6bc25f70-8394-45b6-80c7-314253647586"
],
"at": "2026-10-14T15:00:00Z",
"note": "Exported a real report on staging. Looks right."
}
]
}Who writes one.
Trackers
Export one record per unit of work. Read one from any other tool without a migration project.
CI and agent runners
You don’t own the work, so send a fragment: one piece of evidence or one event. The tracker merges it.
Operators
When someone asks who approved the change an agent shipped, hand them a file that names the person.
Built into Hydrant
read_work_record returns the record for any issue, over MCP or the Hydrant CLI. add_work_record_evidence_fragment takes evidence from CI and reviewers.
Implementers.
Shipping it? Add your tool with a pull request. This list grows by merge, not by press release.
| Tool | Kind | Writes | Reads |
|---|---|---|---|
| Hydrant | Tracker | Records (one per issue) | Fragments (CI and review evidence) |
| awr-evidence-action | CI (GitHub Action) | Evidence fragments (CI runs) | No |
Check your output.
One script, Node 24, no dependencies, strict on purpose. It runs every example, proves the broken ones fail, then checks yours.
git clone https://github.com/Background-Craft/agent-work-record cd agent-work-record node spec/validate.mjs … ok spec example "signoff" is valid All checks passed node spec/validate.mjs my-record.json
Questions.
Is this a Hydrant format?
Hydrant wrote it and exports it. The spec has its own address, agentworkrecord.org, and its own repository under Apache-2.0. Nothing in it needs Hydrant.
Do I need keys or a server?
No. A record is plain JSON. Signing is optional: wrap a record in an in-toto DSSE envelope if you want one.
What about the audit log I already have?
Keep it. A record is an export, not a database. Map what you already store.
Is it stable?
It’s v0 with an additive v0.1. Readers ignore fields they don’t know, so a v0 reader keeps working. Changes go in the changelog.
Why trust an agent’s evidence?
Don’t, blindly. Evidence says who added it and when, with commits and digests you can check. The sign-off says who looked.