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
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"
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 at15e44712bc. The repair substrate already exists —presenceIdentityForAgentwas EXPORTED fromfleetPresenceStateAdapter.mjsprecisely 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:78defaultswakeIdentityFor = agent => \@${agent.githubUsername ?? agent.id}`— a blind prefix over the registry's full production input domain.FleetRegistryService.defineAgentstoresgithubUsernameunchanged 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-prefixwakeIdentityFordefaultai/services/fleet/fleetPresenceStateAdapter.mjs— exportspresenceIdentityForAgent(strips leading@s, single canonical prefix, id-fallback) with spec-pinned witnesses for@neo-gpt, degenerate@@, and id-only rows (merged shape at15e44712bc)ai/services/fleet/FleetRegistryService.mjs:294/:345— the production input domain proofThe Fix
One import + one default swap:
wakeIdentityFordefaults to the exportedpresenceIdentityForAgent(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@-prefixedgithubUsernamejoins to the plane's healthy row; degenerate@@; id-fallback.Acceptance Criteria
wakeIdentityFordefaults to the shared canonicalizer (no second divergent join implementation)@-prefixed row + healthy plane row → the seat's wake row joins (never fabricatedunknownby spelling); degenerate@@and id-fallback pinnedfleetWakeRoutesSource,fleetPresenceStateAdapterspecs)Out of Scope
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 4Live 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"