Mentu

Agents acting for people

Every observation says how much it can be trusted. This page explains the ladder, the one rule the protocol defends hardest, and how an agent that works for you acts at your level without a second password.

The design goal is trust that is light, but explicit. The protocol does not invent a new identity system. It starts from a relationship that already exists, the monitor and the person who owns it, and it records every step a claim takes.

The ladder

Tier What it means Who can assert it
src A person checked it against the source Only with a person behind the observation
measured An instrument measured it: a probe, a webhook, a system Machines and people
derived Worked out from other observations Anyone
unverified Reported, not yet checked. An agent's own claims start here. Anyone
falsified Checked, and found untrue. Kept so nobody checks it again. Anyone

Two fields sit beside the tier. origin says what kind of source made the observation: human, agent, webhook, probe or system. verified says how it was checked, and its top two values, human_verified and certified, follow the same rule as src.

A machine cannot rate itself

The rule is short: a machine cannot claim a person's level of certainty.

  • A probe or a webhook can report measured.
  • An agent's own claims start at unverified. A person promotes them after review.
  • An agent that asserts src is refused with TIER_NOT_ASSERTABLE.
  • On a monitor owned by a machine, nothing reaches src, human_verified or certified. The server refuses with PROVENANCE_CEILING.
  • Leaving a field out never reaches the top. With no tier stated, an observation stops at measured. With no verification stated, it stops at reported. Whoever means src has to say so.

Every refusal is kept. The server appends an ai.mentu.monitor.rejected observation with the reason and the raw input, so an attempt to climb the ladder is itself part of the record.

An agent acts at its owner's level

Agents work for people, and a rule that locks out a person's own agent is not a good rule. So an agent can act at the level of the person it works for, and say so in one field.

That person is the monitor's owner. The owner gave the agent the monitor's token, and that is the relationship the protocol trusts. The agent names the owner in on_behalf_of:

{
  "type": "com.example.ci.review",
  "subject": "release-0.1.2",
  "actor": "agent:claude",
  "on_behalf_of": "human:you",
  "origin": "human",
  "tier": "src",
  "data": { "status": "approved" }
}

The observation is accepted at your level, and the record keeps both names. actor says the agent saw it. on_behalf_of says it was for you. Anyone reading later can tell the machine and the person apart, and nothing forces the record to choose one of them.

What an agent cannot do

on_behalf_of can only name the monitor's owner. An agent borrows the level of the person whose token it holds, never the level of someone it merely names.

The agent sends The server answers
origin: human with nobody named PROVENANCE_CEILING: a machine cannot carry a human origin unless it names the person it acts for
on_behalf_of naming someone other than the owner PROVENANCE_CEILING: an agent works at the level of the person whose token it holds, not of anyone it names
tier: src on a monitor owned by a machine PROVENANCE_CEILING: the top of the ladder needs a person behind the observation
tier: src with an agent origin TIER_NOT_ASSERTABLE: a machine cannot assert src

The refusal is for a claim that contradicts itself. The server cannot see who is at the keyboard, and it does not pretend to. What it can refuse is a record that says two incompatible things at once.

Where the protocol cannot verify, it discloses

A server can check who owns a monitor, or it can take the owner's word for it. Both are allowed, and the difference is always visible.

  • A server started with --registration-token requires that token to create a monitor. Its monitors are marked attested: the server established who owns them.
  • A server started without one is open. Its monitors work exactly the same way, and every state they serve carries the gap unattested_origin, which says plainly that nobody independent vouched for the owner.

Every observation also carries attested in its provenance, copied from its monitor at the moment it was written. The two fields divide the work: attested says whether the owner was established or declared, and on_behalf_of adds nothing a reader must trust beyond that, because it can only repeat the owner's name.

A refusal that people route around teaches a reader nothing. A disclosure they cannot route around tells the reader what a claim is worth.

Why it is built this way

The first version of this rule was a gate that a request could open by itself: it read the right to make a claim out of the same request that made the claim. An independent audit showed five ways through it, and only one of them was being tested. The rule is now enforced where the owner is decided, not in the request, and the conformance check C26 probes five ways to inflate a claim, checks that defaults stop below the top, and checks that a real delegation is honoured.

The full reasoning is principle P1 in the specification, and every change to it is in the decision log.

Next steps

© 2026 Mentu.