Sensitivity is a label that survives delegation
@jhrozek is already working on this.
Since Aug 12, 2026.
- Dominant language
- Go
- Stars
- 152
- Forks
- 16
- Avg merge
- 14h 48m
- Merged PRs (30d)
- 536
Description
A labelled session's children carry the label, and the four labels that exist today stop silently
dropping.
mecatl. After #367.
Hazards
Facts that were expensive to find and that nobody re-derives on the way to implementing. Each is verified against code.
- The label mechanism already exists and already fails open:
Profile,ProviderID,ModelIDand
ReasoningEffortpropagate onForkSessionand on no other child-mint path, of which there are
eight inengine/agent. - A label is mecatl's own vocabulary, not a set of IdP group names. The sibling's normalised
Groupsfield is dead — never populated, never read — because group claim names vary by provider.
Persisting them freezes at create time, so revoking a group leaves old sessions readable. - The model must not author the rationale a human reads when approving a release. That is
justification capture, and the repo already solves the shape once in the ask-reviewer discipline.
Acceptance criteria
- Every object-creation path stamps the label. One propagation path, and a test that enumerates all
of them rather than sampling. - The durable label is mecatl's own closed vocabulary. Provider claim names appear in exactly one
config table and nowhere downstream. - The caller's labels are computed per request and never persisted, so revocation takes effect
without rewriting stored objects. - Access is a set-dominance check with no sensitivity ladder and no policy engine.
- The model can neither lower a label nor author the text a human relies on when releasing
something, and a test proves the instruction saying so reaches the system prompt.
Proof
The same properties, adversarially, with an actor and an ordering. A property-level criterion can go green while being false; these are what stop that.
- A labelled session spawns a subagent, a parallel branch and a team member; each carries the label.
- A caller whose live labels do not dominate the session's is refused.
- Revoking a caller's group takes effect on the next request, with no store rewrite.
- The model attempts to lower a label and to write its own release justification; both refused.
Slices
Decomposition is the implementer's job; these are the natural seams, not a mandate.
- The label itself, propagated at every creation seam.
- The transitions that are not session creation.
Reasoning
The design this comes from, both on main:
- docs/agent-identity-model.md — the inbound side: who is acting, and how mecatl would identify them.
- docs/agent-identity-outbound.md — the outbound boundary: acting for a user against an external system.
Every hazard above is stated in full here rather than linked, so this issue stands on its own.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.