ruvnet/ruflo · error

Inbound rejected: non-canonical payload from ${sourceNodeId}

Error message

Inbound rejected: non-canonical payload from ${sourceNodeId} (addr=${address})

What it means

Log warning in dispatchInbound: canonicalizing the envelope for verification failed (disabled/unknown signature version or malformed payload), so signature verification is impossible; the message is rejected as INVALID_PAYLOAD.

Source

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

    });
    return { accepted: false, reason: 'PEER_EVICTED' };
  }

  let signatureVersion: EnvelopeSignatureVersion;
  let canonicalEnvelope: string;
  try {
    signatureVersion = envelopeSignatureVersion(message);
    const accepted = deps.acceptedSignatureVersions ?? ['legacy-v1', 'jcs-v1'];
    if (!accepted.includes(signatureVersion)) {
      throw new TypeError(`Signature version ${signatureVersion} is disabled`);
    }
    canonicalEnvelope = canonicalizeEnvelopeForVerify(message, signatureVersion);
  } catch {
    await deps.audit.log('message_rejected', {
      sourceNodeId,
      metadata: { address, reason: 'INVALID_PAYLOAD' },
    });
    deps.logger.warn(`Inbound rejected: non-canonical payload from ${sourceNodeId} (addr=${address})`);
    return { accepted: false, reason: 'INVALID_PAYLOAD' };
  }

  // Cryptographic signature verification (closes the trust gate that
  // peer-state checks alone don't provide — without this, a malicious
  // sender could just claim sourceNodeId='known-peer' in metadata and
  // pass the previous gates).
  if (deps.verifyEnvelope) {
    const sig = typeof meta.signature === 'string' ? meta.signature : null;
    let ok = false;
    try {
      ok = deps.verifyEnvelope(canonicalEnvelope, sig, peer.publicKey);
    } catch {
      await deps.audit.log('message_rejected', {
        sourceNodeId,
        metadata: { address, reason: 'INVALID_PAYLOAD' },
      });
      deps.logger.warn(`Inbound rejected: non-canonical payload from ${sourceNodeId} (addr=${address})`);

View on GitHub (pinned to fa13ee4ad6)

Solutions

  1. Fix the sending peer to produce canonical payloads (field order/encoding); non-canonical payloads are rejected.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at v3/@claude-flow/plugin-agent-federation/src/application/inbound-dispatcher.ts:328 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/4a378e1a82fdade8. Report an issue: GitHub.