LearnNewsExamplesServices
Frontmatter
id16790
titleWake-routes identity join: adopt the canonicalizer, not a blind prefix
stateClosed
labels
bugaiagent-os
assigneesneo-kimi-phoebe
createdAtAug 9, 2026, 3:39 PM
updatedAtAug 9, 2026, 5:36 PM
githubUrlhttps://github.com/neomjs/neo/issues/16790
authorneo-kimi-phoebe
commentsCount2
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 9, 2026, 5:36 PM

Wake-routes identity join: adopt the canonicalizer, not a blind prefix

Closed Backlog/active-chunk-14 bugaiagent-os
neo-kimi-phoebe
neo-kimi-phoebe commented on Aug 9, 2026, 3:39 PM

Context

Second instance of the identity-join defect class proven by @neo-gpt's exact-head falsifier on PR #16781 (reviews PRR_kwDODSospM8AAAABI43aRg / cycle-3 RC): the wake axis carries the SAME blind-prefix join the presence axis just had repaired at 15e44712bc. The repair substrate already exists — presenceIdentityForAgent was EXPORTED from fleetPresenceStateAdapter.mjs precisely so the sibling can adopt one canonicalization instead of growing a divergent twin (its JSDoc says so). This leaf is that adoption.

The Problem

fleetWakeRoutesSource.mjs:78 defaults wakeIdentityFor = agent => \@${agent.githubUsername ?? agent.id}`— a blind prefix over the registry's full production input domain.FleetRegistryService.defineAgentstoresgithubUsername unchanged with truthiness as its only requirement (FleetRegistryService.mjs:294, :345), so a persisted @neo-gptis an ACCEPTED production spelling. For such a row the wake join produces@@neo-gpt, misses the plane's healthy @neo-gptrow, and emitsunknown` — an ANSWERED plane observation converted into fabricated absence by spelling alone, the exact class the truth-preserving contract forbids (D#16720 Concept 4).

The Architectural Reality

  • ai/services/fleet/fleetWakeRoutesSource.mjs:78 — the blind-prefix wakeIdentityFor default
  • ai/services/fleet/fleetPresenceStateAdapter.mjs — exports presenceIdentityForAgent (strips leading @s, single canonical prefix, id-fallback) with spec-pinned witnesses for @neo-gpt, degenerate @@, and id-only rows (merged shape at 15e44712bc)
  • ai/services/fleet/FleetRegistryService.mjs:294 / :345 — the production input domain proof

The Fix

One import + one default swap: wakeIdentityFor defaults to the exported presenceIdentityForAgent (or a renamed shared home if the reviewer prefers a neutral module — the function is join-pure, not presence-specific). Plus the sibling spec rows mirroring the presence adapter's: persisted @-prefixed githubUsername joins to the plane's healthy row; degenerate @@; id-fallback.

Acceptance Criteria

  • wakeIdentityFor defaults to the shared canonicalizer (no second divergent join implementation)
  • Spec witness: registry @-prefixed row + healthy plane row → the seat's wake row joins (never fabricated unknown by spelling); degenerate @@ and id-fallback pinned
  • Sibling suites green (fleetWakeRoutesSource, fleetPresenceStateAdapter specs)

Out of Scope

  • Re-homing the canonicalizer into a neutral module (acceptable at review time, not required)
  • The StateOptions declaration/write semantics mismatch — that is #16786
  • Any registry-side input validation change (defineAgent's truthiness contract is production behavior, not this leaf's to tighten)

Decision Record impact

none — join canonicalization at the consumer boundary; no config or contract surface changes.

Related

PR #16781 (the falsifier + the exported repair substrate) · #16787 (presence leaf) · #16786 (sibling family-pattern leaf, StateOptions) · D#16720 Concept 4

Live latest-open sweep: checked latest 12 open issues at 2026-08-09T13:3xZ; no equivalent found. A2A in-flight sweep: no claim on the wake-join repair scope.

Origin Session ID: 3167a938-5173-471d-b8ee-2c5f603f5c92

Retrieval Hint: "wake routes identity join blind prefix canonicalize registry githubUsername spelling"