{"record":{"id":"54b524e392fa166a","repo":"MemPalace/mempalace","slug":"field-name-exceeds-maximum-length-of-max-routi","errorCode":null,"errorMessage":"{field_name} exceeds maximum length of {_MAX_ROUTING_LENGTH} characters","messagePattern":"(.+?) exceeds maximum length of (.+?) characters","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mempalace/logstream.py","lineNumber":114,"sourceCode":"    return f\"{prefix}_{stamp}_{secrets.token_hex(6)}\"\n\n\ndef _sanitize_routing(value, field_name: str, required: bool = True) -> Optional[str]:\n    \"\"\"Validate a short routing field (stream, room, agent, correlation_id).\n\n    Streams may contain ``/`` (``project/mempalace``), so this is looser\n    than ``config.sanitize_name`` — but null bytes, control characters,\n    and over-length values are still rejected.\n    \"\"\"\n    if value is None or value == \"\":\n        if required:\n            raise ValueError(f\"{field_name} must be a non-empty string\")\n        return None\n    if not isinstance(value, str) or not value.strip():\n        raise ValueError(f\"{field_name} must be a non-empty string\")\n    value = strip_lone_surrogates(value.strip())\n    if len(value) > _MAX_ROUTING_LENGTH:\n        raise ValueError(f\"{field_name} exceeds maximum length of {_MAX_ROUTING_LENGTH} characters\")\n    if any(ord(ch) < 0x20 or ch == \"\\x7f\" for ch in value):\n        raise ValueError(f\"{field_name} contains control characters\")\n    return value\n\n\ndef _sanitize_event_type(value) -> str:\n    if not isinstance(value, str) or not value.strip():\n        raise ValueError(\"type must be a non-empty string\")\n    value = value.strip()\n    if not _EVENT_TYPE_RE.match(value):\n        raise ValueError(\n            f\"type={value!r} is not a valid event type \"\n            \"(lowercase letters, digits, '.', '_', '-'; max 64 chars)\"\n        )\n    return value\n\n\ndef _sanitize_status(value) -> Optional[str]:","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/MemPalace/mempalace/blob/06cb6987f02610784fefbad4b2bd5d026d164ba6/mempalace/logstream.py#L96-L132","documentation":"ValueError raised by _sanitize_routing() when a routing field exceeds _MAX_ROUTING_LENGTH (256 characters). Routing fields become part of stream/room identifiers, so unbounded values are rejected to keep names and any derived paths/files manageable.","triggerScenarios":"Passing a long descriptive string, a full sentence, or concatenated identifiers (e.g. 'wing/room/drawer/uuid/uuid/uuid...') as stream, room, agent, or correlation_id with length > 256.","commonSituations":"Stuffing a path or message snippet into correlation_id; auto-generated names that concatenate many ids; pasting a whole line of output into a routing field by mistake.","solutions":["Shorten the value to <= 256 chars — routing fields are names, not payloads","Move long content into the event payload/body fields, which are not routing-limited","If generating names programmatically, hash the long part: hashlib.sha256(x.encode()).hexdigest()[:16]"],"exampleFix":"# before\nevents.emit(type=\"x\", stream=\"project/\" + \"a\" * 400, room=\"r\")  # exceeds maximum length of 256\n\n# after\nimport hashlib\nshort = hashlib.sha256(long_name.encode()).hexdigest()[:16]\nevents.emit(type=\"x\", stream=f\"project/{short}\", room=\"r\")","handlingStrategy":"validation","validationCode":"MAX_ROUTING = 256\n\ndef routing_ok(value) -> bool:\n    return isinstance(value, str) and 0 < len(value.strip()) <= MAX_ROUTING","typeGuard":null,"tryCatchPattern":"try:\n    events.emit(type=t, stream=s, room=r)\nexcept ValueError as e:\n    if \"exceeds maximum length\" in str(e):\n        s = s[:MAX_ROUTING]\n        events.emit(type=t, stream=s, room=r)\n    else:\n        raise","preventionTips":["Keep routing fields as short stable names, never payloads or paths","Hash long generated identifiers to a fixed length","Assert length limits in tests for anything user-supplied"],"tags":["logstream","validation","length-limit","routing"],"backgroundTag":null,"analyzedSha":"06cb6987f02610784fefbad4b2bd5d026d164ba6","analyzedAt":"2026-08-15T03:03:36.213Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}