mirror of
https://github.com/DeusData/codebase-memory-mcp.git
synced 2026-10-20 05:49:37 +08:00
The complexity pass (transitive_loop_depth / recursive) walked Function and Method nodes in temp-id order and each node's CALLS targets in adjacency order. Under parallel extraction the temp ids come from one shared atomic counter, so id order is worker-scheduling order and differs run to run. The cycle guard flags whichever member of a mutual-recursion cycle the DFS enters first, so `recursive` flipped between the members of a cycle across otherwise identical multi-worker runs while the CALLS edge set stayed identical -- a violation of the MT-byte-identical invariant. Evidence: on a 66-file Python fixture of equal-sized mutual-recursion cycles (24 pairs + 6 triangles, adjacent in the size-ordered work queue) a probe saw 3 distinct outputs in 5 runs at 4 workers. The new regression test is RED on main 5/5 (a 4-worker run diverges from the single-threaded run on the first cycle every time) and GREEN with this change. Fix: order the traversal by content only -- seeds sorted by (qualified_name, file_path, start_line), and each node's CALLS targets sorted the same way before recursing, through one bump-stack scratch sized to the CALLS edge count (a single upfront allocation that bails the way the existing calloc path does). Semantics are unchanged: the DFS entry node of a cycle is the one flagged, as before; which member that is now depends on the inputs alone, identically for sequential and parallel indexing. SCC-based marking of every cycle member is out of scope here. Test: pipeline_complexity_props_independent_of_worker_order indexes the fixture once single-threaded and six times with CBM_WORKERS=4 through the same harness as the sequential/parallel parity test, collects every Function's complexity props sorted by qualified_name, and asserts all parallel runs are identical to the sequential run. Distilled from #1925 with co-author credit. Verification: build/c/test-runner pipeline complexity extraction (ASan/UBSan) 617 passed, 0 failed; revert-check RED 5/5 on main, GREEN with the fix; make -f Makefile.cbm lint-ci clean; scripts/check-no-test-skips.sh OK. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com> Co-authored-by: Zhiyu <zhiyuzhang001@gmail.com>