{"record":{"id":"c861b561b341ba12","repo":"HKUDS/Vibe-Trading","slug":"dag-contains-a-cycle-processed-processed-len-t","errorCode":null,"errorMessage":"DAG contains a cycle: processed {processed}/{len(tasks)} tasks","messagePattern":"DAG contains a cycle: processed (.+?)/(.+?) tasks","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/swarm/task_store.py","lineNumber":244,"sourceCode":"    )\n\n    layers: list[list[str]] = []\n    processed = 0\n\n    while queue:\n        layer: list[str] = list(queue)\n        queue.clear()\n        layers.append(layer)\n        processed += len(layer)\n\n        for tid in layer:\n            for downstream in dependents[tid]:\n                in_degree[downstream] -= 1\n                if in_degree[downstream] == 0:\n                    queue.append(downstream)\n\n    if processed != len(tasks):\n        raise ValueError(\n            f\"DAG contains a cycle: processed {processed}/{len(tasks)} tasks\"\n        )\n\n    return layers\n","sourceCodeStart":226,"sourceCodeEnd":249,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/swarm/task_store.py#L226-L249","documentation":"topological_layers uses Kahn's algorithm; if the processed count is less than the total task count, in-degree never reached zero for some tasks, which can only happen when the dependency graph contains a cycle. ValueError reports processed vs total counts.","triggerScenarios":"Executing a run (or inspect_preset) whose task set has a circular depends_on chain; validate_dag was skipped so the cycle survived to layering.","commonSituations":"Hand-edited presets bypassing validation; dynamic task injection at runtime creating a loop.","solutions":["Run validate_dag on the same task list to get the exact cycle path and break it","Audit recently added depends_on entries for backward-pointing edges","Prevent unvalidated task lists from reaching _execute_run"],"exampleFix":"# before\ntopological_layers([t_a_depends_on_b, t_b_depends_on_a])\n# after\nvalidate_dag(tasks)  # run first; fix reported cycle, then:\ntopological_layers([t_a, t_b_depends_on_a])","handlingStrategy":"validation","validationCode":"validate_dag(tasks)  # raises with exact cycle path before layering\nlayers = topological_layers(tasks)","typeGuard":null,"tryCatchPattern":"try:\n    layers = topological_layers(tasks)\nexcept ValueError as e:\n    if 'DAG contains a cycle' in str(e): validate_dag(tasks)  # get precise path, then fix\n    else: raise","preventionTips":["Never let unvalidated task lists reach _execute_run","Validate at preset load (inspect_preset) and again before scheduling","Test dynamic task injection paths with cyclic fixtures"],"tags":["python","dag","cycle-detection","scheduling"],"backgroundTag":"dependency-cycle-detected","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}