Hvorfor din AI-kodende agent hallucinerer filstier
> AI-kodende agenter opfinder filstier, når de ikke har et ægte kort over repoet. Her er hvorfor det sker, og hvordan forankring fører til færre hallucinerede ændringer.
Kendetegnet er ikke en forkert funktionskrop. Det er en selvsikker ændring i en fil, der ikke findes, eller i en fil, der findes, men ikke er den, der implementerer adfærden.
Du bad om en fix til sessionsudløb. Agenten åbnede src/auth/session.ts. Den sti er plausibel. Den er også forkert. Den ægte handler lever i apps/api/src/middleware/expiry.ts, omdøbt to refaktoreringer siden. Agenten løj ikke for dig. Den fuldførte en stiformet streng ud fra træningspriorer plus alt det, der allerede var i kontekstvinduet.
Dette er det almindelige fejlmønster på et ægte repository. Modellen kan skrive kode. Fejlen ligger i at vælge det forkerte sted at skrive den.
Hvorfor agenter opfinder stier
En kodende agent er en model til forudsigelse af det næste token med værktøjer. Når du siger ‘fiks sessionsudløb’, skal den navngive en fil, før den kan læse eller patche noget. Hvis den ikke allerede har et forankret kort, konstruerer den en sti ud fra:
- Navngivningskonventioner, den har set i andre repositorier.
src/auth/session.tser en hyppig form. - Filer allerede i samtalen, som måske er dem, du indsatte sidste uge, ikke dem, der betyder noget nu.
- Mappelister, den tilfældigt kørte, ufuldstændige på et stort træ.
- Instruktionsfiler.
CLAUDE.mdogAGENTS.mdfortæller agenten, hvordan den skal opføre sig. De er ikke et levende indeks over symboler, kaldere, eller aktuelle stier.
Ingen af disse kilder er et kort over dette repository, i dag. Modellen udfylder hullet på samme måde, som den udfylder ethvert hul: med en fortsættelse med høj sandsynlighed. Den fortsættelse ligner ofte en ægte sti. Nogle gange findes filen og ligger ved siden af den rigtige. Nogle gange fandtes den på en gren, der blev merget sidste måned. Nogle gange fandtes den aldrig.
Grep redder dig ikke her, hvis agenten slet ikke søger efter den rigtige streng. Agenten gættede en sti, læste derefter hvad den sti returnerede, og redigerede den så. Det første forkerte skridt var stien, ikke patchen.
At læse filer er heller ikke det samme som at finde de rigtige. Claude Code, Cursor, Codex, og lignende værktøjer kan åbne, hvad end du peger dem mod. Spørgsmålet er, om de pålideligt finder de rigtige filer, de vigtige symboler, afhængighederne, testene, og blast radius, før de redigerer. Filadgang uden et kort begynder stadig med et gæt.
Redigering af den forkerte fil er et hentningsproblem
Behandl den opdigtede sti som en hentningsfejl, ikke som en personlighedsbrist.
Hvis agenten skulle returnere path/file.ext:line, før den fik lov til at redigere, ville to ting ske. For det første kunne du åbne citatet og afvise arbejdet på ti sekunder. For det andet ville agenten skulle spørge noget, der rent faktisk kender træet.
Det er jobbet for et kodebasekontekstlag. Semantisk søgning alene er ikke nok. Et uddrag, der ‘lyder som sessionsudløb’, kan stadig lande i en udfaset pakke. Du har også brug for præcis tekst, når du kender strengen, symbolsøgning, når du kender navnet, strukturel søgning, når du kender formen, og en afhængighedsgraf, når du har brug for kaldere og blast radius.
Maguyva er det lag til MCP-kompatible kodende agenter. Det er ikke en editor. Claude Code, Cursor, Codex CLI, VS Code, Windsurf, og andre MCP-klienter bliver, hvor de er. Agenten spørger et rangeret kort, før den rører en linje.
Påstanden er bevidst beskeden: færre hallucinerede ændringer. Maguyva fjerner ikke modellens evne til at gætte. Det ændrer det første standardskridt fra ‘opfind en plausibel sti’ til ‘bed om rangerede, citerede steder’.
Sådan ser et underbygget svar ud
Et nyttigt svar på ‘hvor håndteres sessionsudløb’ er ikke et afsnit. Det er en kort liste over steder:
apps/api/src/middleware/expiry.ts:48- handlerenapps/web/src/lib/auth-client.ts:112- kalderenapps/api/tests/expiry.test.ts:20- testen, der fejler, hvis ændringen er forkert
Du kan åbne disse linjer. Hvis de er forkerte, stopper du. Hvis de er rigtige, kan agenten redigere. Verifikationen er pointen, ikke et slogan.
Maguyva eksponerer 11 kundevendte MCP-værktøjer på tværs af søgning, symboler, afhængighedsanalyse, filhentning, repo-kontekst og deterministiske hjælpeværktøjs-workflows. Fire hentningstilstande (semantisk, strukturel, graf/afhængighed, og tekst) smeltes sammen til rangerede resultater; symbolsøgning er et separat MCP-værktøj (find_symbol). Underbyggede svar kommer tilbage med filstier og linjenumre, så du kan vurdere dem mod træet foran dig.
Dokumentationen beskriver den korteste vej: start gratis, indekser et repo, du allerede kender, forbind klienten, stil derefter ét spørgsmål, du kan verificere.
En løkke, der ændrer den første ændring
Du har ikke brug for en ny workflow-religion. Du har brug for ét ekstra skridt før den første skrivning.
- Stil et spørgsmål, du allerede kan vurdere. ‘Hvilken kode håndterer login og sessionsudløb?’ er bedre end ‘fiks auth’.
- Kræv citater. Filsti og linjenummer, ikke et resumé af ‘auth-modulet’.
- Åbn de citerede filer. Følg symbolet. Bekræft den afhængighed, du er ved at røre.
- Først da lader du agenten patche.
Hvis trin 2 ikke returnerer noget nyttigt, har agenten ikke ret til at improvisere en sti. Den søger igen, eller du peger den. Netop denne ene port er, hvad der giver færre hallucinerede ændringer. Modellen er den samme model. Kortet er det, der har ændret sig.
Instruktionsfiler betyder stadig noget. Behold dem. Brug dem til konventioner, gennemgangsregler, og det, der ikke skal røres. Bed dem ikke om at være indekset. En CLAUDE.md, der lister tre vigtige kataloger, vil være forældet ugen efter en pakke-opdeling. Et søgbart kort opdateres, når repoet opdateres.
En beslægtet fejl er den næsten-rigtige fil: agenten åbner auth.ts, når adfærden lever i auth-client.ts, eller patcher en genereret fil i stedet for kilden, eller redigerer kopien i packages/legacy, fordi navnet matchede. Citater gør ikke disse fejl umulige. De gør dem synlige, før diffet lander.
Hvad et kort ikke løser for dig
Vær nøgtern om, hvad du får. Et underbygget kort gør ikke enhver ændring korrekt — din agent kan stadig skrive en dårlig patch i præcis den rigtige fil. Hvis din kodebase læner sig op ad dynamisk dispatch, refleksion, eller monkey-patching, vil nogle symbolsøgninger komme tilbage tyndere, end du ville ønske, fordi det er, hvad kørselstidsindirektion gør ved ethvert statisk indeks. Og hvis du håber på en procentdel — ‘hallucinerede stier reduceret med X%’ — finder du den ikke her, fordi ingen ærligt kan måle det tal for dit repo undtagen dig selv.
Det, du kan forvente, er smallere og mere nyttigt: agenten holder op med at åbne sine ændringer med en gættet sti. Det første skridt bliver forankret i et ægte kort, og det er derfra, færre hallucinerede ændringer kommer. Alt efter citatet — at læse diffet, vurdere patchen — er stadig dit job, ligesom det altid har været.
Testen koster dig næsten intet: indekser et repo, du allerede kender, og stil ét spørgsmål, du kan verificere. Start med en sti, du allerede er blevet brændt af. Hvis citaterne er forkerte, ser du det med det samme. Hvis de er rigtige, har din agents næste ændring et bedre sted at lande.
// it doesn't know the file. it knows how to find it.
Relateret læsning
Mere fra Maguyva-byggeloggen
Giv en AI-agent kontekst om et stort repo uden en lokal indekser_
Hvordan du giver en kodende agent et søgbart kort over et stort repository fra skyen, uden at køre en lokal indekser på din bærbare.
Kontekst der rejser med dig_
Cursors indekser er fremragende inde i Cursor. Maguyva er det hostede MCP-kort, som den samme agent kan spørge fra andre editorer, CLI'er og CI.
Kort først, gennemgang bagefter_
Forankr den kodende agent i et repo-kort, før den skriver. Lad Greptile gennemgå pull requesten bagefter. Et komplementært par, ikke en erstatning.