{"record":{"id":"77b56d935ea135fb","repo":"MemPalace/mempalace","slug":"chunk-size-must-be-a-positive-int-got-chunk-size","errorCode":null,"errorMessage":"chunk_size must be a positive int, got {chunk_size!r}","messagePattern":"chunk_size must be a positive int, got (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mempalace/miner.py","lineNumber":664,"sourceCode":"    whole drawer.\n\n    Optional params override module-level defaults when provided.\n    \"\"\"\n    if chunk_size is None:\n        chunk_size = CHUNK_SIZE\n    if chunk_overlap is None:\n        chunk_overlap = CHUNK_OVERLAP\n    if min_chunk_size is None:\n        min_chunk_size = MIN_CHUNK_SIZE\n\n    # Defensive invariant guard. ``MempalaceConfig.chunk_*`` already\n    # enforces these and falls back to defaults on bad config.json\n    # values, but ``chunk_text`` is a public function — direct callers\n    # (tests, library users, future caller paths) might still pass\n    # values that would loop forever. Fail fast and loud rather than\n    # hang. See review feedback on #1024.\n    if not isinstance(chunk_size, int) or chunk_size <= 0:\n        raise ValueError(f\"chunk_size must be a positive int, got {chunk_size!r}\")\n    if not isinstance(chunk_overlap, int) or chunk_overlap < 0:\n        raise ValueError(f\"chunk_overlap must be a non-negative int, got {chunk_overlap!r}\")\n    if chunk_overlap > chunk_size // 2:\n        # The windowing loop pulls ``end`` back to a boundary only when that\n        # boundary is past ``start + chunk_size // 2`` (the rfind guards below),\n        # so a pulled chunk always spans more than ``chunk_size // 2`` chars.\n        # ``start = end - chunk_overlap`` therefore advances only while\n        # ``chunk_overlap <= chunk_size // 2``; a larger overlap makes ``start``\n        # stall or move backward and the loop spins forever on short-line\n        # content (#2056). The largest safe value is ``chunk_size // 2`` (half,\n        # rounded down for odd sizes), which still advances and stays allowed.\n        raise ValueError(\n            f\"chunk_overlap ({chunk_overlap}) must be at most chunk_size // 2 \"\n            f\"({chunk_size // 2}); a larger overlap can loop forever on \"\n            f\"short-line content (#2056)\"\n        )\n    if not isinstance(min_chunk_size, int) or min_chunk_size < 0:\n        raise ValueError(f\"min_chunk_size must be a non-negative int, got {min_chunk_size!r}\")","sourceCodeStart":646,"sourceCodeEnd":682,"githubUrl":"https://github.com/MemPalace/mempalace/blob/06cb6987f02610784fefbad4b2bd5d026d164ba6/mempalace/miner.py#L646-L682","documentation":"Error \"chunk_size must be a positive int, got {chunk_size!r}\" thrown in MemPalace/mempalace.","triggerScenarios":"Thrown at mempalace/miner.py:664 when the library encounters an invalid state.","commonSituations":"chunk_size was zero, negative, or not an int.","solutions":["Pass a positive integer chunk_size"],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"06cb6987f02610784fefbad4b2bd5d026d164ba6","analyzedAt":"2026-08-15T03:03:36.213Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}