ruvnet/ruflo · error

Inbound rejected: no sourceNodeId in metadata (from ${addres

Error message

Inbound rejected: no sourceNodeId in metadata (from ${address})

What it means

Log warning in dispatchInbound: an incoming federation message carries no metadata.sourceNodeId, so its claimed cryptographic identity is absent; the message is audited and rejected with reason MISSING_METADATA.

Source

Thrown at v3/@claude-flow/plugin-agent-federation/src/application/inbound-dispatcher.ts:284

 * `address` is the wire-level remote (e.g. `192.168.1.42:54321`).
 * `message.metadata.sourceNodeId` is the cryptographic identity claim.
 * The two MAY differ (e.g. behind NAT) — we trust `sourceNodeId` for
 * peer lookup since it's bound to the Ed25519 keypair.
 */
export async function dispatchInbound(
  address: string,
  message: AgentMessage,
  deps: InboundDispatchDeps,
): Promise<InboundDispatchOutcome> {
  const meta = (message.metadata ?? {}) as Record<string, unknown>;
  const sourceNodeId = typeof meta.sourceNodeId === 'string' ? meta.sourceNodeId : null;

  if (!sourceNodeId) {
    await deps.audit.log('message_rejected', {
      sourceNodeId: undefined,
      metadata: { address, reason: 'MISSING_METADATA' },
    });
    deps.logger.warn(`Inbound rejected: no sourceNodeId in metadata (from ${address})`);
    return { accepted: false, reason: 'MISSING_METADATA' };
  }

  const peer = deps.discovery.getPeer(sourceNodeId);
  if (!peer) {
    await deps.audit.log('message_rejected', {
      sourceNodeId,
      metadata: { address, reason: 'PEER_UNKNOWN' },
    });
    deps.logger.warn(`Inbound rejected: ${sourceNodeId} not in discovery (from ${address})`);
    return { accepted: false, reason: 'PEER_UNKNOWN' };
  }

  if (peer.state === FederationNodeState.SUSPENDED) {
    await deps.audit.log('message_rejected', {
      sourceNodeId,
      metadata: { address, reason: 'PEER_SUSPENDED' },
    });

View on GitHub (pinned to fa13ee4ad6)

Solutions

  1. Fix the sending peer to include sourceNodeId in message metadata; messages without it are rejected.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at v3/@claude-flow/plugin-agent-federation/src/application/inbound-dispatcher.ts:284 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18). Data as JSON: /api/errors/10447e9e22608f59. Report an issue: GitHub.