{"record":{"id":"c1cb81e6ce08fef3","repo":"sgl-project/sglang","slug":"dsv4-target-and-draft-pools-must-share-paged-swa-g","errorCode":null,"errorMessage":"DSV4 target and draft pools must share paged SWA geometry: target={target_geometry}, draft={draft_geometry}","messagePattern":"DSV4 target and draft pools must share paged SWA geometry: target=(.+?), draft=(.+?)","errorType":"validation","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/disaggregation/utils.py","lineNumber":1192,"sourceCode":"            draft_state_type = StateType.SWA_RING\n        else:\n            if (\n                token_to_kv_pool.full_to_swa_index_mapping\n                is not draft_token_to_kv_pool.full_to_swa_index_mapping\n            ):\n                raise RuntimeError(\n                    \"DSV4 target and draft pools must share the SWA index mapping\"\n                )\n            target_geometry = (\n                token_to_kv_pool.page_size,\n                token_to_kv_pool.sliding_window,\n            )\n            draft_geometry = (\n                draft_token_to_kv_pool.page_size,\n                draft_token_to_kv_pool.sliding_window,\n            )\n            if target_geometry != draft_geometry:\n                raise RuntimeError(\n                    \"DSV4 target and draft pools must share paged SWA geometry: \"\n                    f\"target={target_geometry}, draft={draft_geometry}\"\n                )\n            draft_ptrs, draft_lens, draft_item_lens = (\n                draft_token_to_kv_pool.get_state_buf_infos()\n            )\n            draft_state_type = StateType.SWA\n\n        if draft_ptrs:\n            append_state_component(\n                kv_args,\n                draft_state_type,\n                draft_ptrs,\n                draft_lens,\n                draft_item_lens,\n            )\n\n    if (","sourceCodeStart":1174,"sourceCodeEnd":1210,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/disaggregation/utils.py#L1174-L1210","documentation":"In the non-unified-KV DSV4 path, target and draft pools must have identical (page_size, sliding_window) tuples. Mismatched paged SWA geometry would make transferred state unusable, so setup_state_kv_args raises RuntimeError showing both geometry tuples.","triggerScenarios":"DSV4 disaggregation with spec decoding where the draft pool's page_size or sliding_window differs from the target pool's (e.g. --page-size set per pool, or draft config with a different window).","commonSituations":"Different --page-size applied to target vs draft; NextN draft model with its own sliding_window in config; changing chunked-prefix/page-size args only for one pool.","solutions":["Set identical page_size and sliding_window for target and draft pools (align server args / model configs)","Remove draft-specific page-size or window overrides","Disable speculative decoding or disaggregation if they cannot be aligned"],"exampleFix":"# before\ntarget: (page_size=1, sliding_window=4096); draft: (page_size=32, sliding_window=4096)\n# after\ntarget: (page_size=32, sliding_window=4096); draft: (page_size=32, sliding_window=4096)","handlingStrategy":"type-guard","validationCode":"assert (target_pool.page_size, target_pool.sliding_window) == (draft_pool.page_size, draft_pool.sliding_window)","typeGuard":"def paged_swa_geometry_equal(a, b) -> bool:\n    return (a.page_size, a.sliding_window) == (b.page_size, b.sliding_window)","tryCatchPattern":null,"preventionTips":["Use a single --page-size and window config for target and draft","Smoke-test disaggregation + spec decoding after any config change"],"tags":["disaggregation","deepseek-v4","page-size","sliding-window"],"backgroundTag":"configuration-mismatch","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}