LearnNewsExamplesServices
Frontmatter
id16743
titleWire-only Fleet client contract — versioned vocabulary, zero trust imports
stateClosed
labels
enhancementai
assigneesneo-gpt-emmy
createdAtAug 8, 2026, 9:57 PM
updatedAtAug 9, 2026, 5:45 PM
githubUrlhttps://github.com/neomjs/neo/issues/16743
authorneo-fable-clio
commentsCount1
parentIssue13015
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[x] 16710 Split the SDK barrel so a host entrypoint cannot construct a store
blocking[ ] 16746 Harness demotion — dissolve loadFleetRuntimeContracts; FM stops supervising the organism
closedAtAug 9, 2026, 5:45 PM
milestonev13.2

Wire-only Fleet client contract — versioned vocabulary, zero trust imports

Closed Backlog/active-chunk-14 enhancementai
neo-fable-clio
neo-fable-clio commented on Aug 8, 2026, 9:57 PM

Wire-only Fleet client contract — versioned vocabulary, zero trust imports

Graduated from D#16720 (body v12 @ 2026-08-08T19:52:47Z). Concept 6 — the wire-only client contract. Parent: #13015 (Brain-side Fleet services + bridge contract).

Context

The client must speak the versioned Fleet protocol without importing or reconstructing any server trust decision. Today the server authority is ai/services/fleet/fleetWireMethods.mjs; the no-Brain-import browser twin is apps/agentos/config/fleetWireMethods.mjs; ai/scripts/lint/lint-fleet-vocabulary-parity.mjs binds them mechanically. harness/brain.mjs#loadFleetRuntimeContracts still imports that server authority together with identity/bearer trust primitives from a checkout tree; C5 #16746 retires the harness half only after C2 and C1 exist.

Live dependency correction (2026-08-09)

D#16720 described #16710 as the future Fleet “SDK vocabulary home.” The merged delivery is narrower and orthogonal: PR #16728 (a742bdd23dec8a26bee64be7fde050335d206218) created ai/services.host.mjs, the host executable-plane service barrel, and proved that importing it cannot reach a durable cloud store. At current origin/dev@df1da97fad291366ed903c1b53056c336b274e82 that barrel exports no Fleet wire vocabulary and is not loadable by a no-checkout browser client. It is a boundary precedent and a satisfied sequencing dependency, not C2's delivered producer.

This carrier resolves the OQ at the existing realm boundary: extend the dependency-free Brain wire authority with protocol/schema vocabulary and an identical operable-cold app twin, with the parity gate as the publication mechanism. The host service barrel remains a host-service composition root; no client is made to import it merely to obtain constants.

Acceptance Criteria

  • The dependency-free Fleet wire authority carries the complete client-safe vocabulary: operation names, request/response envelope schema, protocol version set, capability vocabulary, and a finite response-state vocabulary.
  • Both client factories (createFleetRegistryBridge and installFleetBridge) emit the version/capability offer and validate the server's selected contract before accepting a result. Server dispatch selects a compatible version/capability set or returns a named closed state; skew can never masquerade as an operation failure or empty data.
  • Server-side identity normalization, bearer validation, ownership, authorization, credential classification decisions, and lifecycle authority NEVER cross into the client vocabulary. A static negative witness pins that boundary.
  • Existing bridge consumers are sequenced in the same change: Brain dispatcher/policy, Node client factory, browser bridge, Electron capability transport, and the vocabulary-parity gate. C5 consumes the published client-safe vocabulary later; C2 does not prematurely dissolve loadFleetRuntimeContracts.
  • The app twin remains operable-cold and importable with zero local ai/ modules. The parity comparator checks every new constant and helper outcome and stays mutation-proved against an induced protocol drift.
  • The Contract Ledger below holds at merge time; all legacy unversioned request paths named in it are migrated or fail closed with an explicit state.

Contract Ledger (T3)

# Surface (live anchor) Source of authority Terminal C2 disposition Failure / degraded behavior Docs / JSDoc disposition Executable evidence
1 ai/services/fleet/fleetWireMethods.mjs — method + credential arrays only ADR 0038 §2.8 wire-only contract Extend this dependency-free authority with envelope schema, supported protocol versions, client-safe capabilities, closed response states, and pure offer/selection/validation helpers; no trust primitive enters the module No common version or missing required capability returns a named closed response before bridge dispatch Module summary becomes the canonical wire-contract explanation and names the trust-policy exclusion Focused authority specs cover compatible selection, version skew, capability skew, malformed envelopes, and closed-state exhaustiveness
2 apps/agentos/config/fleetWireMethods.mjs — operable-cold browser twin Brain authority + existing parity discipline Mirror only the client-safe contract and pure helpers; the no-checkout client imports this twin, never ai/services.host.mjs Twin drift fails CI; browser startup remains importable without a checkout or Node service graph Header explains why duplication is intentional and mechanically bound fleetVocabularyParity.spec.mjs compares all constants/helpers and red-proves an induced version/capability drift
3 dispatchFleetRequest.mjs + fleetServerPolicy.mjs Brain authority + ADR 0038 §2.8 Negotiate/validate the wire offer before method policy or bridge execution; every response carries the selected contract + one finite response state Unsupported protocol, missing capability, unknown method, unavailable slice, and operation failure are distinct closed states; none falls through to a guessed method list JSDoc documents ordering: contract gate → method policy → operation Unit witnesses prove incompatible requests never touch the bridge and every failure class is sanitized + named
4 createFleetRegistryBridge.mjs + apps/agentos/fleet/installFleetBridge.mjs client-safe contract in the matching realm Both factories create versioned requests and reject malformed, unselected, or unknown-state responses before returning operation data Skew fails closed with bounded remediation text; never renders empty data as success Both factory summaries point to ADR 0038 §2.8 and the matching vocabulary source Node and app bridge specs cover success, each skew class, malformed server responses, and no raw trust/error leakage
5 harness/fleetCapability.mjs and harness/main.mjs Electron main is a credential custodian, not policy authority Transport preserves the Body-authored {method,params} surface but attaches/validates the client-safe protocol metadata inside main; C5 later replaces the remaining checkout-loaded producer Renderer cannot inject protocol/capability/trust fields; main returns a closed client-contract state on skew or malformed response Capability JSDoc separates renderer intent from main-owned protocol envelope Harness spec proves over-wide renderer fields are dropped, outbound contract metadata is main-owned, and a skewed reply never reaches the Body as success
6 ai/services.host.mjs from #16710 / PR #16728 ADR 0039 executable-plane service-barrel boundary No Fleet vocabulary import required. It remains a host-service barrel; D#16720's anticipated producer wording is resolved here by the existing authority+twin publication pattern A no-checkout client never needs this barrel; its absence cannot remove the Fleet vocabulary This ticket and its PR record the dependency correction; ADR 0039 remains unchanged Existing host-barrel reachability witnesses stay green; the C2 negative import witness proves the client surfaces do not reach that barrel or server trust roots

Sequencing

PR #16728 / #16710 is merged, so the executable-plane dependency is satisfied. C2 is now actionable after this contract alignment. It publishes the client-safe producer C5 #16746 waits for; it does not claim C1 credential-profile custody or S7 wake delivery.

ADR / Successor Risk

  • ADR 0038: aligned; this is its §2.8 executable leaf.
  • ADR 0039: unchanged; the host/cloud service-barrel boundary is not the browser/client wire boundary.
  • No current PR or open duplicate resolves the version/capability/closed-state contract.

Signal Ledger

Family-keyed at D#16720 final filed state (body v12 @ 2026-08-08T19:52:47Z): fable AUTHOR_SIGNAL + APPROVED · Opus APPROVED · GPT [GRADUATION_APPROVED]. Full ledger: D#16720 closing comments.

Unresolved Dissent

None. The prior GPT parent-authority deferral was repaired at v11 and re-approved at the filed state. This body's dependency correction is the C2 carrier resolving the post-merge #16710 reality, not a reopening of the graduated control-plane decisions.

Unresolved Liveness

@neo-gemini-pro benched; Kimi supplied a production wire-only seat witness without a final-anchor signal — recorded, never implied consent.

Discussion Criteria Mapping

D#16720 criteria (1)–(9): closing comment. This carrier owns Concept 6 / OQ7's protocol-contract portion; S7 #16741 owns wake delivery over the ingress.

Origin: D#16720 · Retrieval Hint: "wire-only Fleet client contract protocol version capability negotiation closed response states zero trust imports"

tobiu referenced in commit 949303b - "feat(fleet): version the client wire contract (#16743) (#16793) on Aug 9, 2026, 5:45 PM
tobiu closed this issue on Aug 9, 2026, 5:45 PM