Operate the pilot¶
The operator runs the pilot and is not entitled to read private content. Everything on this page
is reachable with the operator role, and none of it shows a participant's words.
Staff accounts¶
Roles live in the identity provider; Voice holds only what the issuer cannot. After an account is created in the realm, the operator writes its display name and, for a representative, the authority they act under, which is copied onto every action they record:
curl -s -X PUT localhost:9000/staff/accounts/$SUBJECT -H "Authorization: Bearer $OP" -H 'Content-Type: application/json' \
-d '{"displayName":"Councillor A. Example","authority":"Northfield Council transport committee (illustrative)","active":true}'
curl -s localhost:9000/staff/accounts -H "Authorization: Bearer $OP"
Setting active to false deprovisions the person: every staff command from them is refused with
403 and staff.inactive, and the records they wrote keep their name and authority as recorded. A
principal without the operator role is refused with staff.not-operator.
The access log¶
curl -s 'localhost:9000/staff/access-log?since=2026-10-18T00:00:00Z' -H "Authorization: Bearer $OP"
[ { "principal": "representative@voice-staff", "route": "GET /staff/issues/{issue}", "record": "iss-01M57P…", "at": "2026-10-18T14:28:47Z" } ]
Every staff read of a restricted record, and every refused staff request, is an entry: the principal, the route, the record's id and the time. The log is a view over one entity per day, so an entry can follow its request by a moment.
Erasure requests¶
A request made without the recovery credential waits for the operator. Erasure shows the list, the verification with its evidence, and the receipt. The evidence of how identity was verified is read once and not kept, so the pilot keeps its own record of it if one is needed.
Settings an operator changes¶
| Variable | Default | Effect of a change |
|---|---|---|
VOICE_DORMANCY_PERIOD |
180d |
the next session start, recovery or renewal schedules the participant's timer for the new period; timers already scheduled keep theirs |
VOICE_SUPPRESSION_THRESHOLD |
5 |
takes effect on the next read of an aggregate |
VOICE_SESSION_HOURS |
12 |
tokens issued afterwards |
VOICE_INVITE_CODES |
the next session start; running instances need ankka services restart voice to see a new secret value |
Every setting is on Configuration.
Logs¶
Logs carry identifiers, rule names and timings: a sealed value prints as its subject, and no message
text, prompt or contact detail is logged. ankka services logs voice -p voice reads them in a
deployment; locally they are on the console. A line with a rule is a refusal, which is normal
operation, not a failure.
What a backup can undo¶
The secret store that holds participant keys is a table in the service's own database. A backup taken before an erasure holds the destroyed key, and restoring it makes that participant's sealed fields readable again. Backups must therefore expire within the erasure deadline the pilot promises, and a restore must be followed by re-running every erasure completed since the backup, which the receipts list. Limitations has the other bounds.
The model provider¶
Conversations, proposals, derivatives under review and research prompts are sent to the model
provider, and nothing else is. Before any real resident's words reach it, the operator reads the
provider's data terms for the account in use: retention, training use and where requests are
processed. Removing ANTHROPIC_API_KEY stops every conversation turn and research run and nothing
else: reading, sharing already-approved text, following and erasure keep working.