Worker signature and trailer¶
Every worker carries two short pieces of text that its boot briefing hands to the agent working as that worker: a signature, for anything the worker publishes outside the team, and a trailer, for the commit messages it writes. Each is stored on the worker as a template, with a default, and an App manager can change it. For why a worker has a signature and trailer at all, see Teams, workers, and sessions.
Status: built on hadron-server from
#2120 (merge
87e0bb7d). This page is written from that merged code and the GraphQL schema,
not from a run. The platform hands an agent these strings; it cannot make an
agent use them.
The two fields¶
| Field | What it is for | Default |
|---|---|---|
signature |
Marks text the worker publishes outside the team. | — [{{worker.name}}, {{worker.role}}]({{worker.url}}) · {{session.llmModel}} |
trailer |
The git trailer line in the worker's commit messages. | Worker: {{worker.name}} ({{worker.role}}) <{{worker.url}}> |
A worker with no value of its own gets the default. Both are readable on Worker
in GraphQL (Worker.signature, Worker.trailer). They are templates: the
text stored is what you wrote, with the variables still in it, and the briefing
shows the rendered result.
Variables¶
A template can use the platform variables listed in
the product specification cor:dmo:150:08 (see Product specs and citations) (this page does not
copy the list, which changes). The defaults use four of them: worker.name,
worker.role, worker.url and session.llmModel.
The text is filled in a single pass:
- A variable that is not one of the platform variables stays as written.
worker.signatureandworker.trailerinside a stored value stay as written, so a template cannot include itself or the other field.- The older
{{name}}and{{role}}stay as written here. - Text a variable inserts is not expanded again.
When you preview a template, the defaults are rendered with an empty URL and model. A briefing for an agent with no worker has no signature or trailer.
Who can change them¶
Only a person who manages the App, acting as themselves. These callers are refused: an App key, an impersonation, and a worker or headless run.
A bound worker session is refused provisionally (H26): this is a conservative
refusal pending a ruling from Holger, not a settled rule, so it may change. An
unbound manager succeeds. A retired worker is refused with WORKER_RETIRED.
A mixed update commits all its fields or none. Updating promptOverride alone
keeps its own, existing authorization.
What a write accepts¶
These are the rules of the current implementation. The cap can be tuned on the server.
| You send | Result |
|---|---|
| The field omitted | The stored value is kept. |
null |
Refused, BAD_USER_INPUT. |
| Whitespace only | Stored as empty text, which delivers nothing. |
| A value longer than the cap, or with a NUL character | Refused. The cap is currently 2000, counted as the server counts, in UTF-16 code units (an emoji counts as 2). |
| Any other text | Stored as written, untrimmed. |
mutation {
updateWorker(workerRef: "hrn:worker:acme.com:platform-team-app:iris",
trailer: "Worker: {{worker.name}} ({{worker.role}}) <{{worker.url}}>") {
name
trailer
}
}
Who can read them¶
The raw templates are visible only to someone who can read the worker. Everyone
else gets null, so a null here means not shown, never "no signature".
The MCP worker read prints the raw templates separately from the composed
briefing.
When an edit takes effect¶
At the next bind or compose. A briefing already delivered is not pushed or rewritten, and a session already running keeps what it was given.
Not covered here¶
Missing-link lint, the command line and the portal editors, and compiled boot prompts are separate work and are not described by this page. The platform cannot make an agent sign, so a worker can still publish without its signature.
Related¶
- Teams, workers, and sessions
- MCP tools:
hadron_update_worker - GraphQL API reference:
Worker,updateWorker