LLPRO

Home / Agents / Signed Run Records

Signed Run Records

Check a long run's records signed by someone other than the agent, with a heartbeat on a clock.

Live

What it does

The host, runner or supervisor of a long run (the recorder, not the agent) signs a record at the start, on every heartbeat, at events and at the end, each chained to the one before by hash. We check every signature against the one recorder key, the chain and order, that the recorder is not the agent, and the heartbeat on the clock: missed beats, and whether an open run is running or silent. The agent's own transcripts and telemetry are untrusted: only their hash rides inside a recorder-signed record. We sign a summary with the time we saw it, checkable offline. Nothing stored, no model.

Where it sits
Agents › Trust › Records
Who it is for
Feeds the standards and regulatory road (AI Act, ISO 42001, procurement): run logs signed by someone other than the agent. For owners, platforms and auditors of agents that run for hours or days.
Price
Free: 60 checks an hour per address. A per-check fee is planned, not charging.
Limits
Up to 160 records, 60,000 bytes. Each record: v 1, type run-record, run_id, recorder_id (1-128 of A-Z a-z 0-9 _.:-), seq 0, 1, 2 .., kind start|heartbeat|event|end, at (UTC like 2026-11-12T09:00:00Z), prev (64 zeros for seq 0, else SHA-256 hex of the canonical JSON of the previous record with sig), recorder_key (Ed25519, canonical base64), sig over the canonical JSON without sig. Start adds agent_id, heartbeat_s (10 to 86400), optional agent_key, task_hash; end adds outcome (completed, failed, stopped, timed-out); any record may add telemetry_hash and a note (280 characters). A beat is missed when records are more than heartbeat_s plus 20 % (at least 5 s) apart; an open run is silent once its last record is that far behind our clock. Raw transcripts or telemetry are refused. Without expected_recorder / expected_agent the result shows only that the keys named signed. A key is not a person: it does not show who the recorder is, that the recorder is independent of the agent's owner, that the records are complete (a recorder can leave records out and re-chain), that the work was done, or that times are true beyond order and not in the future. Whoever holds the records can drop the newest: pin expected_head. Not an audit opinion, not a certification, not a qualified (eIDAS) timestamp, and not evidence of compliance with the EU AI Act, ISO/IEC 42001 or any procurement rule; the time is LLPRO's own clock, not anchored in a public log yet.

For developers: try it

POST https://llpro.ai/mcp  tools/call run_record_verify
{"records":[
 {"v":1,"type":"run-record","run_id":"run-42","seq":0,"kind":"start","at":"2026-11-12T09:00:00Z","prev":"000..0 (64)","recorder_id":"host-1","recorder_key":"<b64>",
  "agent_id":"agent-7","heartbeat_s":60,"sig":"<b64>"},
 {"v":1,"type":"run-record","run_id":"run-42","seq":1,"kind":"end","at":"2026-11-12T09:00:50Z","prev":"<sha256 of record 0>","recorder_id":"host-1","recorder_key":"<b64>","outcome":"completed","sig":"<b64>"}]}
-> verdict valid|invalid, checks, state ended|running|silent, missed beats, signed summary

Offline verifier and test vector: llpro.ai/run-records-verify (run_record_verify.py, runs without our server).

For agents

Tool run_record_verify on https://llpro.ai/mcp and in the tools list. Signed answers are checked with the public key below (signer llpro1:3ig6lb7654pskvkkmaikt3u45a): an Ed25519 signature over the observation as canonical JSON (sorted keys, no spaces).

Public key (base64): WM0Y137VlzvpcK4ehFAdBle7LFHoxgXd7SnBGTMcqZQ=

For agents: this page as Markdown · JSON · llms.txt · MCP endpoint llpro.ai/mcp · agent card