{"record":{"id":"d466ab6d971233d4","repo":"ruvnet/ruflo","slug":"message-id-issuer-and-audience-are-required","errorCode":null,"errorMessage":"message ID, issuer, and audience are required","messagePattern":"message ID, issuer, and audience are required","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/codex/src/harness/in-memory-inbox-reference.ts","lineNumber":66,"sourceCode":" * reference.\n */\nexport class InMemoryInboxReference {\n  readonly referenceOnly = true;\n  private readonly records: InMemoryInboxRecord[] = [];\n  private readonly byIdentity = new Map<string, {\n    issuer: string;\n    messageId: string;\n    envelopeDigest: string;\n    record: InMemoryInboxRecord;\n  }>();\n  private readonly quarantined: InMemoryQuarantinedMessage[] = [];\n  private nextCursor = 1n;\n\n  constructor(private readonly now: () => number = Date.now) {}\n\n  send(message: HarnessMessage): MessageReceipt {\n    if (!message.messageId.trim() || !message.issuer.trim() || !message.audience.trim()) {\n      throw new Error('message ID, issuer, and audience are required');\n    }\n    const identity = inMemoryInboxIdentityKey(message.issuer, message.messageId);\n    const receivedAt = new Date(this.now()).toISOString();\n    let suppliedDigest: string;\n    try {\n      suppliedDigest = harnessMessageContentDigest(message.content);\n    } catch {\n      this.quarantine(message, 'content-digest-mismatch', receivedAt);\n      throw new Error('message content is not canonical JSON');\n    }\n    if (suppliedDigest !== message.contentDigest) {\n      this.quarantine(message, 'content-digest-mismatch', receivedAt);\n      throw new Error('message contentDigest does not match canonical content');\n    }\n    try {\n      parseCanonicalUnsigned(message.sequence, 'message sequence');\n    } catch {\n      throw new Error('message sequence must be a canonical unsigned decimal integer');","sourceCodeStart":48,"sourceCodeEnd":84,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/codex/src/harness/in-memory-inbox-reference.ts#L48-L84","documentation":"send() on the in-memory inbox reference requires the three identity fields — messageId, issuer, and audience — to be non-blank strings. The guard fires when any of them is missing or whitespace-only, because the dedup identity key and delivery routing both depend on them.","triggerScenarios":"Thrown at v3/@claude-flow/codex/src/harness/in-memory-inbox-reference.ts:66 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Populate messageId, issuer, and audience on the message before sending it to the inbox.","Validate the message shape at the producer so incomplete messages fail before reaching the inbox."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","contentChangedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}