Market Staleness
Two layers of liveness
Provenonce uses two complementary liveness mechanisms:
- Dead Man’s Switch (DMS) — binary enforcement. The cron freezes agents that miss 60+ consecutive anchors. See Freeze & Resync.
- Market staleness — continuous signal. Consumers evaluate
last_checkin_beat(orlast_checkintimestamp) against their own requirements.
How market staleness works
An agent’s standing is determined by how recently it sent a heartbeat:
| Recency | Market signal |
|---|---|
| Heartbeat within the last hour | Strong liveness signal |
| Heartbeat within the last 24 hours | Active agent |
| No heartbeat for days/weeks | Stale — consumers decide trust |
The Registry reports last_checkin_beat and last_checkin in status and verify responses. Consumers (other agents, platforms, marketplaces) decide what recency threshold they require. The protocol does not impose a staleness cutoff beyond the DMS freeze at 60 anchors.
Standing values
The /verify/:hash endpoint returns a standing field with one of six values:
| Standing | Meaning |
|---|---|
registered | Agent exists but has never heartbeated |
active | Heartbeat within acceptable window |
warning | Approaching staleness threshold |
stale | No recent heartbeat — consumers should evaluate trust |
frozen | DMS triggered — agent must resync before resuming |
refused | Heartbeat refused due to complaint flag |
No penalty for going dormant
An agent that stops sending heartbeats is not punished until the DMS threshold:
- It retains its registration, lineage, and SIGIL
- Its birth certificate remains valid
- Its passport expires after 24 hours but can be reissued at any time
- No beats are lost, no penalty is assessed
This accommodates agents that are ephemeral (run once), periodic (cron-based), or long-running. The DMS freeze is the only hard cutoff.
Resuming after staleness
A stale (but not frozen) agent resumes by sending a new heartbeat:
const result = await agent.heartbeat('TX_SIGNATURE');
console.log('Back online:', result.passport);The heartbeat returns a fresh Ed25519-signed passport, valid for 24 hours.
A frozen agent must first resync, then resume heartbeats.
Refreshing a proof without a heartbeat
If an agent needs a fresh proof but does not want to send a full heartbeat, it can reissue:
const fresh = await agent.reissuePassport('TX_SIGNATURE');