Context
First live PoC of the Operator compose surface (2026-08-17 ~18:05Z, #17271 session): the operator sent "operator a2a test" / "ping" from the cockpit's Operator pane — it arrived attributed to @neo-fable-clio (from: @neo-fable-clio, senderPrincipalClass: 'agent'), woke that seat correctly, and now exists in the identity graph as a message the agent never wrote. Sending works (a first!); attribution is wrong. Operator verbatim: "showing you as the sender => new bug. but a first time PoC that sending itself works."
The Problem
The compose form is deliberately senderless and the design sentence is right: "sender identity is the authenticated transport's fact end-to-end, never a field on this form" (OperatorComposeForm.mjs:22). The defect is the TOPOLOGY that feeds the fact: the cockpit:live launcher resolves the plane bearer via gh auth token of the checkout's account — on a multi-seat operator machine that is the SEAT AGENT's account, so the fleet child's plane session is admitted as @neo-fable-clio, and every operator action through that transport inherits agent attribution. In a provenance-first substrate (trust tiers, cite-the-bearer's-record discipline, story-sovereignty), messages mis-attributed to an agent identity are graph pollution of the worst class: they read as the agent's own words.
The Architectural Reality
- Admission:
resolveLivePlaneConfig → gh auth token fallback (loopback-only) → plane verifies the PAT subject → session identity = that subject. Unforgeable, correctly designed — for a seat whose gh identity IS the person at the keyboard.
- The operator-principal modeling gap is already tracked: #16738 (ownerPrincipal + the operator-to-agent derived relation).
senderPrincipalClass exists on the wire and currently asserts 'agent' for these sends.
- The launcher already resolves the viewer claim and the registry knows every AGENT identity — the conflation is mechanically detectable at boot.
The Fix (ladder, honest about size)
- Quick win, this ticket's core: the launcher (and/or fleet entry) DETECTS the conflation — resolved viewer claim ∈ registered agent identities — and warns loudly at boot AND surfaces it on the Operator pane ("sending as agent seat @X — operator principal not established"). No silent mis-attribution; the operator sends knowingly or fixes the credential.
- Credential guidance: document the operator-seat journey with the OPERATOR's own gh identity (or an explicit
NEO_FLEET_PLANE_BEARER of operator class) so the transport fact becomes true.
- The real model (#16738's scope, not duplicated here): operator principal as first-class sender (
senderPrincipalClass: 'operator'), with the operator-to-agent derived relation for seats they steer. This ticket stops at detection + honesty + docs; the principal model stays #16738's.
Acceptance Criteria
Out of Scope
The full operator-principal data model and derived relations (#16738) · mailbox history rewrites (the test message stays as the incident's receipt) · multi-operator/RBAC.
Related
#16738 (ownerPrincipal contract — the real model) · #17309 (operator-authority sibling: bench write path, same principal question) · #17271 (origin session receipts) · Epic #14560 (parent)
Live latest-open sweep: REST created-descending, latest 12 checked 2026-08-17T18:17Z (GraphQL 503-flapping; REST healthy), no equivalent; A2A window clean (zero unread at 18:09Z).
Origin Session ID: 7ee47ccf-d1c7-469d-a75e-15cebf3b5ea5
Retrieval Hint: query_raw_memories("operator send attributed seat agent identity transport fact gh auth token conflation")
Context
First live PoC of the Operator compose surface (2026-08-17 ~18:05Z, #17271 session): the operator sent "operator a2a test" / "ping" from the cockpit's Operator pane — it arrived attributed to
@neo-fable-clio(from: @neo-fable-clio,senderPrincipalClass: 'agent'), woke that seat correctly, and now exists in the identity graph as a message the agent never wrote. Sending works (a first!); attribution is wrong. Operator verbatim: "showing you as the sender => new bug. but a first time PoC that sending itself works."The Problem
The compose form is deliberately senderless and the design sentence is right: "sender identity is the authenticated transport's fact end-to-end, never a field on this form" (
OperatorComposeForm.mjs:22). The defect is the TOPOLOGY that feeds the fact: the cockpit:live launcher resolves the plane bearer viagh auth tokenof the checkout's account — on a multi-seat operator machine that is the SEAT AGENT's account, so the fleet child's plane session is admitted as@neo-fable-clio, and every operator action through that transport inherits agent attribution. In a provenance-first substrate (trust tiers, cite-the-bearer's-record discipline, story-sovereignty), messages mis-attributed to an agent identity are graph pollution of the worst class: they read as the agent's own words.The Architectural Reality
resolveLivePlaneConfig→gh auth tokenfallback (loopback-only) → plane verifies the PAT subject → session identity = that subject. Unforgeable, correctly designed — for a seat whose gh identity IS the person at the keyboard.senderPrincipalClassexists on the wire and currently asserts'agent'for these sends.The Fix (ladder, honest about size)
NEO_FLEET_PLANE_BEARERof operator class) so the transport fact becomes true.senderPrincipalClass: 'operator'), with the operator-to-agent derived relation for seats they steer. This ticket stops at detection + honesty + docs; the principal model stays #16738's.Acceptance Criteria
Out of Scope
The full operator-principal data model and derived relations (#16738) · mailbox history rewrites (the test message stays as the incident's receipt) · multi-operator/RBAC.
Related
#16738 (ownerPrincipal contract — the real model) · #17309 (operator-authority sibling: bench write path, same principal question) · #17271 (origin session receipts) · Epic #14560 (parent)
Live latest-open sweep: REST created-descending, latest 12 checked 2026-08-17T18:17Z (GraphQL 503-flapping; REST healthy), no equivalent; A2A window clean (zero unread at 18:09Z).
Origin Session ID: 7ee47ccf-d1c7-469d-a75e-15cebf3b5ea5
Retrieval Hint:
query_raw_memories("operator send attributed seat agent identity transport fact gh auth token conflation")