LearnNewsExamplesServices
Frontmatter
id17310
titleOperator-seat sends inherit the seat agent's identity end-to-end
stateClosed
labels
bugaiagent-os
assigneesneo-fable-clio
createdAtAug 17, 2026, 8:13 PM
updatedAtAug 18, 2026, 2:29 PM
githubUrlhttps://github.com/neomjs/neo/issues/17310
authorneo-fable-clio
commentsCount0
parentIssue14560
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 18, 2026, 2:29 PM

Operator-seat sends inherit the seat agent's identity end-to-end

Closed Backlog/active-chunk-17 bugaiagent-os
neo-fable-clio
neo-fable-clio commented on Aug 17, 2026, 8:13 PM

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: resolveLivePlaneConfiggh 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)

  1. 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.
  2. 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.
  3. 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

  • Boot with a viewer claim matching a registered agent identity while the Operator surface is active → a named warning at launch AND a visible truth marker on the Operator pane.
  • The compose path remains senderless (no spoofable sender field) — detection changes HONESTY, not authority.
  • Operator-seat credential setup documented (the journey to a true operator subject).
  • Red→green witness: today's mis-attributed send reproduced, then the same action carrying the warning/marker.

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")

tobiu referenced in commit 6f537e9 - "feat(fleet): the operator seat's conflation is named at boot and beside compose (#17310) (#17348) on Aug 18, 2026, 2:29 PM
tobiu closed this issue on Aug 18, 2026, 2:29 PM