{"record":{"id":"3dc726e910272e75","repo":"ruvnet/ruflo","slug":"message-sequence-must-be-a-canonical-unsigned-deci","errorCode":null,"errorMessage":"message sequence must be a canonical unsigned decimal integer","messagePattern":"message sequence must be a canonical unsigned decimal integer","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/codex/src/harness/in-memory-inbox-reference.ts","lineNumber":84,"sourceCode":"      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');\n    }\n    if (message.expiresAt !== undefined && !Number.isFinite(Date.parse(message.expiresAt))) {\n      throw new Error('message expiresAt must be an ISO timestamp');\n    }\n\n    const envelopeDigest = sha256(canonicalJson(message));\n    const prior = this.byIdentity.get(identity);\n    if (prior) {\n      if (prior.issuer !== message.issuer || prior.messageId !== message.messageId) {\n        throw new Error('inbox identity hash collision');\n      }\n      if (prior.envelopeDigest !== envelopeDigest) {\n        this.quarantine(message, 'message-id-content-conflict', receivedAt);\n        throw new Error('message ID was reused with different content');\n      }\n      return { messageId: message.messageId, acceptedAt: prior.record.receivedAt, duplicate: true };\n    }\n","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/codex/src/harness/in-memory-inbox-reference.ts#L66-L102","documentation":"Thrown when a message sequence value is not a canonical unsigned decimal integer. Defense: generate sequence numbers from a monotonic counter serialized as a plain decimal string without padding or signs.","triggerScenarios":"Thrown at v3/@claude-flow/codex/src/harness/in-memory-inbox-reference.ts:84 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Pass the sequence as a base-10 unsigned integer string with no leading zeros, signs, or whitespace.","Monotonically increment the sequence per inbox stream rather than reusing or formatting it ad hoc."],"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-14T05:17:10.506Z"}