fix(mcp): flag source drift in get_code_snippet and search_code (#1750) - #1788
fix(mcp): flag source drift in get_code_snippet and search_code (#1750)#1788umi008 wants to merge 1 commit into
Conversation
The snippet and full-mode search tools slice the live file on disk using line coordinates recorded at index time. After the file is edited without re-indexing, those ranges are stale: the tools returned shifted source text, or a grep hit attributed to an adjacent function, with no signal that the answer was drifting (everything after a small edit looked like current source). Both tools now consult the same freshness oracle check_index_coverage already exposes. When the file no longer matches the recorded metadata (metadata_changed/missing) they skip the stale live slice and report source_drift/freshness instead; the healthy path (metadata_match) is byte-identical to before. No index-format change: the recorded metadata is unchanged, only the read tools consult it. Fixes DeusData#1750 Signed-off-by: Ulises Millan Guerrero <ulises.millanguerrero@gmail.com>
|
Thanks for opening this — it has been seen, and it is queued. This note is automated, but it is not a brush-off: it exists so you know where your PR stands instead of having to guess from silence. Current review status: working through a backlog. What that means for this PR, concretely:
Things that will genuinely speed it up whenever review does happen:
If this fixes a bug, a reproduction we can run is worth more than a description of the symptom. Thanks for contributing, and sorry in advance for the wait. |
|
Thank you for identifying a correctness problem that can make stale coordinates look authoritative, and for covering both snippet and search paths. I checked current There is one mechanical scope blocker before code review. This PR adds 196 lines across seven new |
What does this PR do?
get_code_snippetandsearch_codesliced the live file on disk using line coordinates recorded at index time. After the file was edited without re-indexing those ranges are stale, and the tools returned shifted source text — a grep hit misattributed to an adjacent function, or a snippet of the wrong symbol — presented as though it were current source.Both tools now consult the same freshness oracle
check_index_coveragealready exposes. When the recorded metadata no longer matches the file on disk (metadata_changed/missing), they skip the stale live slice and reportsource_drift: trueplus the freshness state instead. The healthy path (metadata_match) is byte-identical to before; re-indexing remains the remedy.Tested with two reproduce-first regression tests: a snippet request and a full-mode search after a file is modified on disk (asserting
source_driftand no stale text), plus the unchanged clean-metadata path.Checklist
git commit -s) — required, CI rejects unsigned commits (DCO, see CONTRIBUTING.md)make -f Makefile.cbm test)make -f Makefile.cbm lint-ci)