Actor.id was an
unconstrained string, and since most brains are hydrated through an agent, the record of who actually did
the work was missing entirely.
Three things answer it now, and they are deliberately separate.
The protocol assigns no responsibility. There is an actor, and there is whoever assisted. Who answers
for a piece of knowledge is a matter for the deployment, the jurisdiction and the people involved — a
field claiming to settle it would be one every implementation had to interpret, and none of them would
agree.
Identifying an actor
A provenance record is a block, so the identifier is hashed intoblock_id. Two spellings of one person
are two names for one fact — see Actor identifiers
for the grammar and why it is refused rather than normalized.
Recording who assisted
Set it once on the handle and every entry it writes carries it:model; naming one is refused, because it reads as “this person is a model” to
everything that groups by model — including a batch invalidation, which would then reach a person’s work.
What it costs to record nobody
Nothing, and that is the design. A record naming no one stays at schema version 1 with the bytes — and theblock_id — it had before any of this existed:
A removal never leaves version 1, even in a session that names assisting parties. It is the one record
a verifier must decode to decide a blocking question — the removal invariant asks whether every absent
block has a reachable record explaining it. A client without the v2 schema would read a valid brain, miss
the record, and reject the snapshot for violating an invariant it satisfies. Not being able to read
something must never be reported as that thing being wrong.
Which names a signature stands behind
Until a key stands behind it, an actor is a declared identifier: whoever can write to a brain can write any name into its audit trail.TrustedKey.subject
is what makes it checkable.
asserted and legacy are kept apart because the remedies differ: one needs
a governance act, the other needs a rewrite nobody can perform on bytes already published.