[{"data":1,"prerenderedAt":671},["ShallowReactive",2],{"blog-coding-agents-legacy-codebase-migration-hu":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":27,"sources":37,"cover":73,"og":74,"expertise":75,"locales":76,"lang":79,"title":80,"description":81,"coverAlt":82,"metaTitle":83,"takeaways":84,"faq":90,"toc":109,"blocks":146,"others":427},"coding-agents-legacy-codebase-migration","2026-10-17",11,"agents",[9,10,11,12,13],"Legacy migration","Coding agents","Strangler fig","Testing","Code review",[15,16,17,18,19,20,21,22,23,24,25,26],"legacy code migration ai","coding agent legacy codebase","strangler fig pattern ai","characterization tests legacy code","ai code migration review","agent assisted refactoring","legacy modernization coding agent","differential testing migration","shadow traffic migration","ai code review gate","test harness before migration","llm code migration",[28,31,34],{"name":29,"url":30},"Legacy code","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLegacy_code",{"name":32,"url":33},"Characterization test","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCharacterization_test",{"name":35,"url":36},"Strangler fig pattern","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FStrangler_fig_pattern",[38,41,43,46,49,52,55,58,61,64,67,70],{"title":39,"url":40},"Martin Fowler: Strangler Fig (2024)","https:\u002F\u002Fmartinfowler.com\u002Fbliki\u002FStranglerFigApplication.html",{"title":42,"url":33},"Wikipedia: Characterization test",{"title":44,"url":45},"Google Research: Accelerating code migrations with AI (2024)","https:\u002F\u002Fresearch.google\u002Fblog\u002Faccelerating-code-migrations-with-ai\u002F",{"title":47,"url":48},"Ziftci et al.: Migrating Code At Scale With LLMs At Google (arXiv 2504.09691)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2504.09691",{"title":50,"url":51},"Anthropic: Effective harnesses for long-running agents (2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Feffective-harnesses-for-long-running-agents",{"title":53,"url":54},"Anthropic: Redesigning source control at Anthropic (2026)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fredesigning-source-control",{"title":56,"url":57},"METR: Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity","https:\u002F\u002Fmetr.org\u002Fblog\u002F2025-07-10-early-2025-ai-experienced-os-dev-study\u002F",{"title":59,"url":60},"Chand et al.: Why Industry Migrates and When It Trusts LLMs (ESEM 2026)","https:\u002F\u002Fdrops.dagstuhl.de\u002Fentities\u002Fdocument\u002F10.4230\u002FLIPIcs.ESEM.2026.85",{"title":62,"url":63},"Li et al.: Environment-in-the-Loop: Rethinking Code Migration with LLM-based Agents (arXiv 2602.09944)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2602.09944",{"title":65,"url":66},"AWS: Amazon Q Developer just reached a $260 million dollar milestone (2024)","https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fdevops\u002Famazon-q-developer-just-reached-a-260-million-dollar-milestone\u002F",{"title":68,"url":69},"OpenAI: Why SWE-bench Verified no longer measures frontier coding capabilities (2026)","https:\u002F\u002Fopenai.com\u002Findex\u002Fwhy-we-no-longer-evaluate-swe-bench-verified\u002F",{"title":71,"url":72},"GitHub Docs: About GitHub Copilot cloud agent","https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Fconcepts\u002Fagents\u002Fcoding-agent\u002Fabout-coding-agent","\u002Fimages\u002Fblog\u002Fcoding-agents-legacy-codebase-migration\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fcoding-agents-legacy-codebase-migration\u002Fog.jpg","ai-engineer",[77,78,79],"en","de","hu","Legacy kódbázis migrálása coding agentekkel: strangler fig playbook","Hogyan dolgozik coding agent egy legacy migráción: characterization tesztek először, egy seam feladatonként, review gate-ek és differenciális ellenőrzés.","Rétegek halmaza, a felső kettőt újak váltják, mellettük varrat és pipa.","Legacy migráció coding agentekkel · Balázs Csorba",[85,86,87,88,89],"Az agentek a migráció repetitív közepének költségét csökkentik, nem annak munkáját, hogy kiderítsük, mit tesz a régi rendszer.","Az első agent feladat előtt futtatható környezet és characterization tesztek kellenek; orákulum nélkül csak hihető kód születik.","Minden feladat egy seamre vagy fájlcsoportra szóljon; a gyakorlatban az egyfájlos agentes migráció sokkal elfogadottabb, mint a teljes projekté.","Review gate diff budgettel, no-test-edits szabállyal és explicit bizonyítékokkal; az agent soha nem hagyja jóvá a saját migrációját.","Replayjel, shadow forgalommal és invariánsokkal ellenőrizz, és csak paritás után töröld a régi utat.",[91,94,97,100,103,106],{"q":92,"a":93},"Képes egy coding agent egyedül migrálni egy teljes legacy kódbázist?","Megbízhatóan nem. Egy 2026-os felmérésben 61 gyakorlati szakemberből csak 4,9% tartotta elfogadhatónak az LLM-segítséget teljes projekt migrációjára legtöbbször vagy mindig, szemben a 62,3%-kal egyfájlos migrációnál. Az agentet szeletenként használd, harness-szel és reviewerrel.",{"q":95,"a":96},"Mit építsek az első agent feladat előtt?","Futtatható környezetet és orákulumot: build CI-ben, indítás valódi függőségekkel, reprezentatív kérések és válaszok rögzítése, characterization tesztek az első seam köré. Enélkül az agent hihető kódot gyárt, és nincs módja eldönteni, változott-e a viselkedés.",{"q":98,"a":99},"Mekkora legyen egy agent feladat?","Egy seam vagy fájlcsoport, egy pull request, egy deployolható eredmény. A GitHub cloud agentje egy branchen és egy pull requesten dolgozik feladatonként, 59 perces session limittel; ez termékkorlát, nem cél, de jó emlékeztető arra, hogy a hosszú feladatokban nő a scope.",{"q":101,"a":102},"Hogyan bizonyítom, hogy nem változott a viselkedés?","Rögzített bemeneteket replayelj a régi és az új kódon, diffeld a normalizált kimeneteket, futtass shadow forgalmat az arány emelése előtt, és állíts invariánsokat, amelyeknek implementációtól függetlenül teljesülniük kell. A zöld unit tesztek szükségesek, de nem elégségesek.",{"q":104,"a":105},"Jó becslés a coding benchmark a migrációs munkára?","Nem. Az OpenAI 2026 februárjában leállította a SWE-bench Verified jelentését, miután az audit a vizsgált esetek nagy részében hibás teszteket és trainingadat-szennyeződés jeleit találta. A benchmark pontszámok kicsi, jól specifikált feladatokat írnak le; a te migrációd kontextusprobléma.",{"q":107,"a":108},"Mikor jobb választás a rewrite?","Amikor a régi rendszerben kevés a megőrzésre érdemes viselkedés, amikor a határ elég kicsi az egy lépésben cseréhez, vagy amikor a harness többe kerülne, mint a rewrite. Ez kockázat és érték kérdése, nem azé, milyen gyorsan gépel az agent.",[110,113,116,119,122,125,128,131,134,137,140,143],{"id":111,"title":112},"the-real-bottleneck","A szűk keresztmetszet elmozdult, de nem tűnt el",{"id":114,"title":115},"why-rewrites-fail","Miért bukik meg a big-bang rewrite",{"id":117,"title":118},"harness-first","Előbb a harness, aztán az első agent feladat",{"id":120,"title":121},"scope-one-seam","Egy seam, egy feladat",{"id":123,"title":124},"strangler-loop","A ciklus: route, kiemelés, ellenőrzés, kivezetés",{"id":126,"title":127},"what-agents-do-well","Amiben az agentek tényleg jók",{"id":129,"title":130},"what-agents-get-wrong","Amit az agentek elrontanak a legacy kódon",{"id":132,"title":133},"review-gates","Review gate-ek, amelyek elkapják a migrációs hibákat",{"id":135,"title":136},"verification","Ellenőrzés a zöld teszteken túl",{"id":138,"title":139},"when-not-to","Amikor nem érdemes agentet használni",{"id":141,"title":142},"playbook","Migrációs playbook kilenc lépésben",{"id":144,"title":145},"sources","Források",[147,151,154,157,160,163,166,167,170,173,176,177,180,183,186,228,237,244,245,248,251,254,257,260,261,270,273,276,279,280,283,286,289,290,293,296,299,302,305,306,309,324,332,333,336,339,342,345,347,350,351,354,357,365,366,387,388],{"type":148,"content":149},"paragraph",[150],"A legacy migráció a szoftverfejlesztés legkevésbé romantikus része: egy framework-frissítés négyezer fájlon át, egy nyelvi port, amit senki nem akar vállalni, egy API-változás, amit már három release óta halogatunk. 2025-2026-ban a coding agentek pontosan erre a munkára váltak használhatóvá. A Google arról számolt be, hogy 39 migráció során tizenkét hónap alatt a benyújtott kódváltozások 74,45%-át és az editek 69,46%-át a saját LLM-es eszköze generálta, a mérnökök pedig 50%-os teljes időmegtakarítást becsültek. Az Amazon azt állítja, hogy kódtranszformációs agentjével több tízezer Java termelési alkalmazást vitt át Java 17-re, és több mint 4500 fejlesztőévet takarított meg.",{"type":148,"content":152},[153],"A csapda: a migráció nem gépelési probléma. Az agent hihető diffet gyárt olyan kódról, amit nem ért, a legacy kód pedig pont az, amit senki nem ért teljesen. Az agentes migrációt nem a jobb prompt teszi működőképessé, hanem az agent körüli állványzat: egy harness, amely megmutatja, változott-e a viselkedés, seam-ek, amelyek kicsiben tartják a változást, és review gate-ek, amelyek elkapják, amit a tesztek nem. Ezt a folyamatot használnám, és itt nem vetnék be agentet.",{"type":155,"level":156,"id":111,"text":112},"heading",2,{"type":148,"content":158},[159],"A Google számai gyakran úgy hangzanak, mintha a migráció megoldott probléma lenne. Ha elolvasod a tanulmányt, a kép konkrétabb: az eszköz a statikus elemzés és a mérnökök által talált helyekre mutatott, szimbólumhivatkozásokkal bővítette a fájlhalmazt, fájlcsoportonként diffet generált, fordított és unit teszteket futtatott, hiba esetén pedig repair loopot indított. A modell az editelést végezte. A mérnökök továbbra is kiválasztották a migrációt, megtalálták a fájlokat, review-zták a változásokat és kigördítették őket. Az 50% a teljes idő csökkenése, nem a rendszer megértésével járó munka csökkenése.",{"type":148,"content":161},[162],"Az Amazon Java-története ugyanilyen alakú. Az agent a függőségek migrációját és a build-and-test ciklust automatizálja egy olyan alkalmazásnál, amelynek a határai már ismertek: egy Java 8-ról vagy 11-ről 17-re lépő Java-alkalmazásnál. Ez nagy, repetitív, jól specifikált transzformáció. Nem egy üzleti folyamat újraírása.",{"type":148,"content":164},[165],"A használható állítás tehát szűk: az agentek a migráció repetitív közepének költségét csökkentik. Nem csökkentik annak költségét, hogy kiderítsük, mit tesz a régi rendszer, eldöntsük, mit tegyen az új, és bizonyítsuk, hogy a kettő megegyezik. A folyamatot erre a három feladatra kell tervezni.",{"type":155,"level":156,"id":114,"text":115},{"type":148,"content":168},[169],"Martin Fowler strangler fig patternje húszéves, és még mindig a jó alapértelmezés. A kudarcmódot kíméletlenül írja le: az egyszerű csereprogram „most of the time” lángokba borul, mert egy komoly rendszer lecserélése sokáig tart, a felhasználók nem várhatnak az új funkciókra, a meglévő viselkedés részleteit pedig nehéz specifikálni. A viselkedés egy része nem is kívánatos, így az újraépítése pazarlás.",{"type":148,"content":171},[172],"A coding agentek olcsóbbnak mutatják a cserét, mint amilyen. Egy képernyő vagy egy endpoint újraimplementálása egy délután; a maradék 80% az a rész, ahol a számlák szökőnapon másképp kerekítenek, egy riport egy archivált táblától függ, és egy háttérjob olyan mezőt ír, amit három másik szolgáltatás olvas. Ebből semmi nincs a demóban.",{"type":148,"content":174},[175],"A strangler fig válasz: az új rendszert a régi köré növeszteni. Egy viselkedés elé seam-et tenni, azt a viselkedést új kódba mozgatni, a forgalmat fokozatosan átirányítani, és a régi utat addig tartani, amíg az új ki nem érdemli a bizalmat. Fowler a ragasztót „transitional architecture”-nek nevezi, és megjegyzi, hogy pazarlásnak látszik; valójában annak az ára, hogy nem tesszük fel a vállalkozást egy cutover hétvégére.",{"type":155,"level":156,"id":117,"text":118},{"type":148,"content":178},[179],"Michael Feathers characterization tesztje az az eszköz, ami lehetővé teszi a legacy munkát: olyan teszt, amely a meglévő kód tényleges viselkedését írja le, nem azt, amit a dokumentáció állít. Ez egy változásdetektor. Nem azt mondja, hogy a régi viselkedés helyes; azt mondja, hogy mikor változott meg. A golden master teszt ugyanez egy teljes válasz szintjén: rögzítsd a kimenetet egy bemenethalmazra, normalizáld a volatilis részeket, és hasonlítsd össze.",{"type":148,"content":181},[182],"Egy migráció első agent feladata nem kódváltozás. Hanem az, hogy a rendszer futtatható és megfigyelhető legyen: build CI-ben, indítás valódi függőségekkel, reprezentatív kérések rögzítése, és annak feljegyzése, mit ad vissza a régi rendszer. Egy 2026-os environment-in-the-loop migrációs tanulmány szerint a kód és a környezet együtt mozog; a célkörnyezet statikus elemzése nem elég, a lassú visszacsatolás pedig újramunkát okoz. Az agent, amely nem tudja elindítani a régi rendszert, tippel.",{"type":148,"content":184},[185],"Aztán építsd fel az orákulumot rétegenként. Az alábbi táblázat az általam használt sorrend; minden réteg kevesebbe kerül, mint az incidens, amit megelőz.",{"type":187,"head":188,"rows":192},"table",[189,190,191],[77],[78],[79],[193,200,207,214,221],[194,196,198],[195],"Characterization teszt \u002F golden master",[197],"Nem szándékos kimenetváltozás egy uniton vagy endpointon",[199],"Mielőtt hozzányúlsz ahhoz az unithoz",[201,203,205],[202],"Contract teszt a seamnél",[204],"A régi és az új közötti interfész alakja és szemantikája",[206],"Mielőtt forgalmat irányítasz",[208,210,212],[209],"Rögzített kérések replayje",[211],"Valós payloadok, edge case-ek, kódolás és null kezelés",[213],"Amint tudsz termelési forgalmat rögzíteni",[215,217,219],[216],"Shadow forgalom diff",[218],"Eltérés éles terhelés és sorrend mellett",[220],"Mielőtt a forgalom a canary fölé nő",[222,224,226],[223],"Invariáns ellenőrzések",[225],"Tulajdonságok, amelyeknek implementációtól függetlenül teljesülniük kell",[227],"Mielőtt a régi utat kivezetnéd",{"type":148,"content":229},[230,231,236],"Ebben nincs semmi új: ugyanaz a harness-érv, mint a",{"tag":232,"to":233,"children":234},"link","\u002Fblog\u002Fharness-engineering-coding-agents",[235],"harness engineering"," cikkben, csak olyan kódbázisra alkalmazva, amit soha nem erre terveztek. De az agent készséggel generál ezer sort egy gyenge orákulum ellen, így a harness nem nice-to-have többé, hanem az, ami őszintén tartja a migrációt.",{"type":238,"variant":239,"title":240,"body":241},"callout","warn","A zöld tesztcsomag nem specifikáció",[242],[243],"A characterization tesztek azt rögzítik, amit a régi rendszer tesz, a bugjait is beleértve. Mielőtt befagyasztod ezt a viselkedést, döntsd el, mely részek szerződésesek és melyek véletlenek. Az agent mindkettőt hűen megőrzi, és a reviewer, aki csak egy zöld tesztcsomagot lát, nem veszi észre a különbséget.",{"type":155,"level":156,"id":120,"text":121},{"type":148,"content":246},[247],"A kis hatókör melletti legerősebb bizonyíték egy 2026-os gyakorlati felmérés: 61 iparági válaszadóból 62,3% tartotta az LLM-segítséget legtöbbször vagy szinte mindig elfogadhatónak egyfájlos migrációnál, de csak 4,9% mondta ugyanezt teljes projekt migrációjára. A bizalom szemantikai helyességen, projektkontextuson, biztonságon, ellenőrzési bizonyítékokon és provenance-on múlott. A gyakorlati szakemberek nem utasítják el az agenteket; korlátok közé szorítják őket.",{"type":148,"content":249},[250],"A GitHub Copilot cloud agent egyszerre egy branchen dolgozik, feladatonként egy pull requestet nyit, és a session hossza legfeljebb 59 perc. Az Anthropic hosszú futású harness-e feature listát ad az agentnek, egyszerre egy feature-rel dolgoztatja, és tiszta állapotot kér tőle committal és haladási feljegyzéssel. A közös szabály: egy feladat, egy ellenőrizhető eredmény, egy átnézhető diff.",{"type":148,"content":252},[253],"Egy task kártya többet ér, mint egy hosszú prompt:",{"type":255,"code":256},"code","# migrate-invoice-total\nscope: src\u002Fbilling\u002Finvoice-total.ts + its tests only\ngoal: replace the legacy rounding helper with the new money library\ninvariants:\n  - totals for existing fixtures are byte-identical\n  - currency is never coerced to float\n  - the public function signature does not change\nout of scope: invoice PDF rendering, tax rules, database schema\ndone when: golden tests pass, contract test passes, no new lint warnings\nevidence: test output, diff summary, list of intentionally changed fixtures",{"type":148,"content":258},[259],"Két sor végzi a legtöbb munkát: a fájllista és az out-of-scope lista. Határt adnak az agentnek, és a review-nek módot arra, hogy visszautasítsa az elkóborolt diffet. Az Anthropic harness-e tovább megy: megtiltja az agentnek, hogy a feature listát vagy a teszteket szerkessze; ha egy teszt hibás, azt ember javítja külön commitban. Ez az egy szabály akadályozza meg a leggyakoribb hibát, amit agentes migrációkban láttam: az agent addig igazítja az orákulumot, amíg az egyet nem ért az új kóddal.",{"type":155,"level":156,"id":123,"text":124},{"type":262,"attrs":263,"inner":267,"caption":268},"diagram",{"viewBox":264,"role":265,"aria-labelledby":266},"0 0 720 300","img","clm1-t clm1-d","\u003Ctitle id=\"clm1-t\">Strangler fig routing\u003C\u002Ftitle>\u003Cdesc id=\"clm1-d\">Bal oldalon egy legacy monolit, középen egy router, amely a forgalom egyre nagyobb részét küldi a jobbra kiemelt szeletnek, alatta egy összehasonlító harness, amely a régi és az új kimenetet rögzíti.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"clm1-ah\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\u003Cpath d=\"M0 0L10 5L0 10z\" class=\"d-head\" \u002F>\u003C\u002Fmarker>\u003C\u002Fdefs>\u003Crect x=\"20\" y=\"60\" width=\"230\" height=\"200\" rx=\"12\" class=\"d-box\" \u002F>\u003Ctext x=\"135\" y=\"90\" text-anchor=\"middle\" class=\"d-title\">Legacy rendszer\u003C\u002Ftext>\u003Crect x=\"38\" y=\"106\" width=\"92\" height=\"40\" rx=\"6\" class=\"d-fill-muted\" \u002F>\u003Ctext x=\"84\" y=\"131\" text-anchor=\"middle\" class=\"d-small\">számlázás\u003C\u002Ftext>\u003Crect x=\"140\" y=\"106\" width=\"92\" height=\"40\" rx=\"6\" class=\"d-fill-muted\" \u002F>\u003Ctext x=\"186\" y=\"131\" text-anchor=\"middle\" class=\"d-small\">riportok\u003C\u002Ftext>\u003Crect x=\"38\" y=\"158\" width=\"194\" height=\"40\" rx=\"6\" class=\"d-fill-muted\" \u002F>\u003Ctext x=\"135\" y=\"183\" text-anchor=\"middle\" class=\"d-small\">dokumentálatlan szabályok\u003C\u002Ftext>\u003Ctext x=\"135\" y=\"222\" text-anchor=\"middle\" class=\"d-small\">még kiszolgál\u003C\u002Ftext>\u003Ctext x=\"135\" y=\"240\" text-anchor=\"middle\" class=\"d-small\">minden más forgalmat\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"26\" text-anchor=\"middle\" class=\"d-label\">Kérések\u003C\u002Ftext>\u003Cpath d=\"M360 36V58\" class=\"d-line\" marker-end=\"url(#clm1-ah)\" \u002F>\u003Crect x=\"300\" y=\"60\" width=\"120\" height=\"64\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"360\" y=\"88\" text-anchor=\"middle\" class=\"d-text\">Router\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"108\" text-anchor=\"middle\" class=\"d-small\">10%-tól 100%-ig\u003C\u002Ftext>\u003Crect x=\"470\" y=\"60\" width=\"230\" height=\"110\" rx=\"12\" class=\"d-mint\" \u002F>\u003Ctext x=\"585\" y=\"93\" text-anchor=\"middle\" class=\"d-text\">Kiemelt szelet\u003C\u002Ftext>\u003Ctext x=\"585\" y=\"116\" text-anchor=\"middle\" class=\"d-small\">új kód, régi szerződés\u003C\u002Ftext>\u003Ctext x=\"585\" y=\"138\" text-anchor=\"middle\" class=\"d-small\">egy seam PR-onként\u003C\u002Ftext>\u003Cpath d=\"M250 92H298\" class=\"d-line\" marker-end=\"url(#clm1-ah)\" \u002F>\u003Cpath d=\"M420 92H468\" class=\"d-line\" marker-end=\"url(#clm1-ah)\" \u002F>\u003Crect x=\"250\" y=\"240\" width=\"340\" height=\"48\" rx=\"10\" class=\"d-sky\" \u002F>\u003Ctext x=\"420\" y=\"268\" text-anchor=\"middle\" class=\"d-small\">Golden tesztek + kimenet diff\u003C\u002Ftext>\u003Cpath d=\"M585 170V238\" class=\"d-dash\" marker-end=\"url(#clm1-ah)\" \u002F>\u003Cpath d=\"M250 264H135V262\" class=\"d-dash\" marker-end=\"url(#clm1-ah)\" \u002F>",[269],"A régi rendszer tovább szolgál, amíg egy szelet átköltözik. A szaggatott út az összehasonlító harness, nem második termelési útvonal.",{"type":148,"content":271},[272],"A mechanika elfér egy oldalon. Tegyél routert vagy facade-ot a legacy út elé. Válassz egy vertikális szeletet tiszta szerződéssel. Emeld ki ugyanazon interfész mögé, hogy a hívók ne változzanak. Irányítsd a forgalom kis részét az új implementációra, és hasonlítsd össze az eredményeket. Növeld az arányt, ahogy nő a bizalom. Amikor az új út egy teljes üzleti cikluson át vitte a szeletet, töröld a régi kódot.",{"type":148,"content":274},[275],"Az összehasonlítás a fontos lépés, és többet kell összevetnie status kódoknál. Naplózd a régi és az új kimenetet ugyanarra a bemenetre, normalizáld az időbélyegeket és azonosítókat, a többit pedig diffeld. Ha eltérnek, döntsd el, hogy a különbség az új kód bugja, vagy a régi viselkedés bugja, amit szándékosan javítasz. Írd le a döntést; ez lesz a migráció specifikációja.",{"type":148,"content":277},[278],"Fowler transitional architecture figyelmeztetése érvényes: a router és a dual-write kód ideiglenes, kell nekik tulajdonos és eltávolítási dátum. Az agent jó e ragasztó termelésében; abban is jó, hogy többet termeljen belőle, mint kell. Tartsd unalmasnak a ragasztót, és töröld határidőre.",{"type":155,"level":156,"id":126,"text":127},{"type":148,"content":281},[282],"Az agentek ott a legerősebbek, ahol a munka széles, repetitív és lokálisan ellenőrizhető. API átnevezése több száz hívási helyen, importok és típusannotációk frissítése, tesztcsomag portolása, ugyanaz a hibakezelés húsz handlerben, vagy egy ismeretlen modul elolvasása és szerződéseinek összefoglalása: ezek gyors orákulumú, editenként kis robbanási sugarú feladatok.",{"type":148,"content":284},[285],"A Google munkafolyamata a legvilágosabb példa: fájlcsoportonként diffet generálni, fordítani, teszteket futtatni, a hibákat visszatáplálni javításra. Az agentnek nem kell elsőre jónak lennie, ha a ciklus meg tudja mondani, hogy rossz. Ugyanez az elv magyaráz egy feltűnő belső eredményt az Anthropicnál: az újraírt ingestion pipeline 20-szor kevesebb memóriát fogyasztott és 4-szer gyorsabb lett, miközben megőrizte a sorrendre és adatszerkezetekre vonatkozó implicit invariánsokat. Ez egy szállító beszámolója, nem kontrollált vizsgálat, de a mechanizmus hihető: szoros helyességi ciklus és tiszta invariáns az a terep, ahol az agentek ragyognak.",{"type":148,"content":287},[288],"A gyakorlati teszt: tudsz-e adni az agentnek egy parancsot, ami elbukik, ha téved? Ha igen, delegálj agresszívan. Ha az egyetlen visszacsatolás az ember, aki a diffet olvassa, tartsd kicsiben a feladatot.",{"type":155,"level":156,"id":129,"text":130},{"type":148,"content":291},[292],"Három hibatípus számít többet a benchmark pontszámoknál.",{"type":148,"content":294},[295],"Először: az agent nem tudja, melyik viselkedés teherhordó. A METR 2025-ös randomizált vizsgálata szerint tapasztalt open-source fejlesztők 19%-kal lassabbak voltak AI-eszközökkel a saját érett repójaikban, pedig 24% gyorsulást vártak, és utólag azt hitték, gyorsabbak voltak. A feladatoknak implicit követelményei voltak: stílus, tesztek, dokumentáció és soha le nem írt konvenciók. A legacy migrációk pontosan ezekből állnak.",{"type":148,"content":297},[298],"Másodszor: az agentek a lokális mintát optimalizálják, és megsértik a rendszerszintű megkötést. Az Anthropic beszámolója a source control migrációról szokatlanul őszinte: az agentek néha úgy próbáltak megfelelni egy mintának, hogy közben eltörtek egy alapvető invariánst, és a mérnököknek nemet kellett mondaniuk. Az adversarial review ezt ronthatja, túlmérnökölt védelmet gyártva hipotetikus problémák ellen. A csapat továbbra is minden change requestet review-zott, de a szándékot, nem minden sort.",{"type":148,"content":300},[301],"Harmadszor: a benchmark nem a te kódbázisod. 2026 februárjában az OpenAI leállította a SWE-bench Verified jelentését, mert egy audit a 27,6%-os minta legalább 59,4%-ában hibás teszteket talált, és a modellek a training adatból reprodukálni tudták a gold patcheket. A magas pontszám azt jelenti, hogy a modell sok kicsi, jól specifikált Python issue-t látott. Nem azt, hogy tudja, milyen volt a számlakerekítési szabályod 2013-ban.",{"type":148,"content":303},[304],"A legacy-specifikus veszélyek: még ütemezett holt kód, szolgáltatások közötti implicit szerződések, nem visszafordítható adatmigrációk, concurrency- és sorrend-feltevések, és olyan teljesítmény, amely egy konkrét query plantől függ. Az agent mindezt magabiztosan megváltoztatja. Hogy biztonságos volt-e, csak a harness és a reviewer tudja megmondani.",{"type":155,"level":156,"id":132,"text":133},{"type":148,"content":307},[308],"A review az agentes migráció átbocsátóképességének korlátja, és a rossz review folyamat a gyorsulást várakozássá változtatja. A gate-jeim:",{"type":310,"items":311},"list",[312,314,316,318,320,322],[313],"Egy seam pull requestenként, diff budgettel. Ha a diff túllépi a budgetet, a feladatot oszd fel, ne a review-t.",[315],"Semmilyen tesztmódosítás a migrációs commitban. A tesztek külön commitban változnak, írásos indoklással.",[317],"Két kulcs mindenhez, ami pénzt, identitást vagy törlést érint. Az agent javasolhat; ember hagyja jóvá.",[319],"Bizonyíték a pull requestben: a lefuttatott parancs, a golden diff, a shadow összehasonlítás, a szándékosan megváltoztatott viselkedések listája.",[321],"A szándékot review-zd, ne a formázást. Kérdezd meg, mit kell megőriznie a változásnak, és hogy a diff bizonyítja-e.",[323],"Rollback útvonal, amit a forgalom átirányítása előtt kipróbáltok, nem az incidens után.",{"type":148,"content":325},[326,327,331],"A GitHub saját dokumentációja kimondja, hogy az agent session logok nem helyettesítik a saját review-t és tesztelést. A review szűk keresztmetszete valódi, és rosszabb lesz, ha az agentek több diffet termelnek, mint amennyit a reviewerek fel tudnak dolgozni; a megoldás kisebb batchek és jobb bizonyítékok, nem a gyorsabb gumibélyegzés. A queue problémáról külön cikket írtam a",{"tag":232,"to":328,"children":329},"\u002Fblog\u002Fai-generated-pr-review-bottleneck",[330],"review szűk keresztmetszetről",".",{"type":155,"level":156,"id":135,"text":136},{"type":148,"content":334},[335],"A zöld tesztcsomag azt bizonyítja, hogy a meglévő tesztek továbbra is átmennek. Nem azt, hogy az új út ugyanúgy viselkedik, mint a régi, olyan bemenetekre, amikre nem gondoltál. Három technika zárja be a rést.",{"type":148,"content":337},[338],"Replay: rögzíts valódi kéréseket és a régi válaszokat, futtasd őket az új implementáción, és diffeld a normalizált kimenetet. Ez a legolcsóbb nagy értékű ellenőrzés, és elkapja a kódolási, null- és kerekítési eltéréseket, amelyeket a unit tesztek kihagynak.",{"type":148,"content":340},[341],"Shadow: élő forgalom másolatát küldd az új útra anélkül, hogy a válaszát kiszolgálnád. Hasonlíts aszinkron. Ez elkapja a sorrendi, concurrency- és volumeneffektusokat, amiket a replay nem.",{"type":148,"content":343},[344],"Invariánsok: olyan tulajdonságokat állíts, amelyeknek mindenképp teljesülniük kell, például „a tételek összege a végösszeg” vagy „egy számla nem megy ki kétszer”. Az invariánsok túlélik az implementációváltást; a golden fájlok nem.",{"type":255,"code":346},"const cases = await loadRecordedRequests(\"invoices\u002F2026-q2\");\nfor (const c of cases) {\n  const before = normalize(await legacyTotal(c));\n  const after = normalize(await nextTotal(c));\n  expect(after, `case ${c.id}`).toEqual(before);\n}",{"type":148,"content":348},[349],"Normalizálj agresszívan: időbélyegek, id-k, sorrend, whitespace, locale formázás. Minden normalizált mező olyan mező, amelyet úgy döntöttél, hogy nem ellenőrzöl; tartsd rövid listán, és nézd át. Ha egy diff szándékos, jegyezd fel a migráció viselkedés-changelogjában, és adj hozzá tesztet, amely az új viselkedést állítja.",{"type":155,"level":156,"id":138,"text":139},{"type":148,"content":352},[353],"Az agent rossz választás, ha az orákulum hiányzik és nem építhető olcsón. Egy 15 éves rendszer tesztek, forgalomrögzítés, staging és befagyasztott szabályozási határ mellett nem migráció, hanem régészet; az első szállítható dolog a harness, nem a diff. Rossz választás egy egyszeri, 200 soros változtatáshoz is, ahol a scope és a review több munkával jár, mint maga a változtatás.",{"type":148,"content":355},[356],"Rossz választás akkor is, ha a valódi feladat döntés: melyik rendszer birtokolja az adatot, maradjon-e a szállító, változzon-e a folyamat. Az agent implementálja a promptba tett választ, és nem figyelmeztet, hogy rossz volt a kérdés.",{"type":148,"content":358},[359,360,364],"Végül légy szkeptikus a szállítói aritmetikával. A 4500 fejlesztőév és az 50%-os csökkenés konkrét programokból származik, konkrét határokkal. Nem előrejelzés a te repódra. Mérd a szeletenkénti cycle time-ot, a kiszökött hibákat, a review órákat és a rollbackek számát. Ha az agent megduplázza a diff mennyiségét, a review idő pedig nem változik, nem gyorsítottad a migrációt, hanem áthelyezted a sort. A trade-off szélesebb ökonómiája az",{"tag":232,"to":361,"children":362},"\u002Fblog\u002Fai-assisted-development-economics",[363],"AI-assisted development economics"," cikkben van.",{"type":155,"level":156,"id":141,"text":142},{"type":310,"ordered":367,"items":368},true,[369,371,373,375,377,379,381,383,385],[370],"Írd le az eredményt és a határt: melyik viselkedés költözik, melyik nem, és honnan fogod tudni.",[372],"Tedd futtathatóvá a régi rendszert CI-ben, valódi függőségekkel.",[374],"Rögzíts reprezentatív bemeneteket és kimeneteket; maszkold a titkokat és a volatilis mezőket.",[376],"Tegyél characterization teszteket az első seam köré; fogadd el, hogy a jelenlegi viselkedést írják le, nem jóváhagyják.",[378],"Tegyél routert vagy facade-ot a seam elé.",[380],"Szeletenként task kártya fájlokkal, invariánsokkal, out-of-scope-pal és bizonyítékokkal.",[382],"Az agent branchen dolgozzon; ahol lehet, először bukó tesztet kérj.",[384],"Review diff budgettel, no-test-edits szabállyal és explicit rollbackkel.",[386],"Növeld fokozatosan a forgalmat, hasonlíts, majd töröld a régi utat és a ragasztót.",{"type":155,"level":156,"id":144,"text":145},{"type":310,"ordered":367,"items":389},[390,394,397,400,403,406,409,412,415,418,421,424],[391],{"tag":392,"href":40,"children":393},"a",[39],[395],{"tag":392,"href":33,"children":396},[42],[398],{"tag":392,"href":45,"children":399},[44],[401],{"tag":392,"href":48,"children":402},[47],[404],{"tag":392,"href":51,"children":405},[50],[407],{"tag":392,"href":54,"children":408},[53],[410],{"tag":392,"href":57,"children":411},[56],[413],{"tag":392,"href":60,"children":414},[59],[416],{"tag":392,"href":63,"children":417},[62],[419],{"tag":392,"href":66,"children":420},[65],[422],{"tag":392,"href":69,"children":423},[68],[425],{"tag":392,"href":72,"children":426},[71],[428,485,555,624],{"slug":429,"published":5,"minutes":6,"category":7,"tags":430,"keywords":436,"about":447,"sources":457,"cover":479,"og":480,"expertise":75,"locales":481,"lang":79,"title":482,"description":483,"coverAlt":484},"agent-tool-design-descriptions-errors",[431,432,433,434,435],"AI agents","Tool use","Function calling","MCP","Agent design",[437,438,439,440,441,442,443,444,445,446],"agent tool design","writing tool descriptions for llm","function calling best practices","tool use error handling","mcp tool design","tool calling is_error","how many tools should an agent have","tool search defer_loading","agent computer interface","llm tool schema design",[448,451,454],{"name":449,"url":450},"Intelligent agent","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIntelligent_agent",{"name":452,"url":453},"Model Context Protocol","https:\u002F\u002Fmodelcontextprotocol.io\u002F",{"name":455,"url":456},"Poka-yoke","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPoka-yoke",[458,461,464,467,470,473,476],{"title":459,"url":460},"Anthropic Engineering: Writing effective tools for agents, with agents (Sep 2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fwriting-tools-for-agents",{"title":462,"url":463},"Anthropic Engineering: Building effective agents (Dec 2024)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fbuilding-effective-agents",{"title":465,"url":466},"Claude Platform Docs: Define tools","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Fdefine-tools",{"title":468,"url":469},"Claude Platform Docs: Handle tool calls","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Fhandle-tool-calls",{"title":471,"url":472},"Claude Platform Docs: Tool search tool","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Ftool-search-tool",{"title":474,"url":475},"Model Context Protocol specification 2025-11-25: Tools","https:\u002F\u002Fmodelcontextprotocol.io\u002Fspecification\u002F2025-11-25\u002Fserver\u002Ftools",{"title":477,"url":478},"OpenAI API Docs: Function calling","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Ffunction-calling","\u002Fimages\u002Fblog\u002Fagent-tool-design-descriptions-errors\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fagent-tool-design-descriptions-errors\u002Fog.jpg",[77,78,79],"Eszközök tervezése AI-ágenseknek: nevek, leírások, sémák és hibaüzenetek","Ágenseszközök, amelyeket jól választ és hív a modell: feladatra szabott eszközök, leírások, sémák, tömör válaszok és használható hibaüzenetek.","Három réssel ellátott alapzat; a középső rés fölött pontosan illeszkedő blokk áll, mellette két rossz szélességű blokk.",{"slug":486,"published":5,"minutes":487,"category":7,"tags":488,"keywords":492,"about":504,"sources":514,"cover":549,"og":550,"expertise":75,"locales":551,"lang":79,"title":552,"description":553,"coverAlt":554},"background-agents-async-pr-workflow",12,[10,489,490,13,491],"Pull requests","CI","Automation",[493,494,495,496,497,498,499,500,501,502,503],"background coding agent","async coding agent","cloud coding agent pull request","copilot coding agent limits","codex cloud tasks","claude code cloud sessions","jules coding agent limits","agent pull request review","coding agent sandbox","agent CI gating","cost per merged pull request",[505,508,511],{"name":506,"url":507},"Software agent","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_agent",{"name":509,"url":510},"Pull request","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDistributed_version_control",{"name":512,"url":513},"Continuous integration","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FContinuous_integration",[515,516,519,522,525,528,531,534,537,540,543,546],{"title":71,"url":72},{"title":517,"url":518},"GitHub Docs: Risks and mitigations for Copilot cloud agent","https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Fconcepts\u002Fagents\u002Fcloud-agent\u002Frisks-and-mitigations",{"title":520,"url":521},"OpenAI Developers: Codex cloud environments","https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fcloud\u002Fenvironments",{"title":523,"url":524},"Anthropic: Use Claude Code in the cloud","https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fclaude-code-on-the-web",{"title":526,"url":527},"Google Jules: Limits and plans","https:\u002F\u002Fjules.google\u002Fdocs\u002Fusage-limits\u002F",{"title":529,"url":530},"Google Jules: Getting started","https:\u002F\u002Fjules.google\u002Fdocs\u002F",{"title":532,"url":533},"GitHub Docs: About protected branches","https:\u002F\u002Fdocs.github.com\u002Fen\u002Frepositories\u002Fconfiguring-branches-and-merges-in-your-repository\u002Fmanaging-protected-branches\u002Fabout-protected-branches",{"title":535,"url":536},"GitHub Docs: Models and pricing for GitHub Copilot","https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Freference\u002Fcopilot-billing\u002Fmodels-and-pricing",{"title":538,"url":539},"OpenAI Developers: Codex pricing","https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fpricing",{"title":541,"url":542},"Ehsani et al.: Where Do AI Coding Agents Fail? An Empirical Study of Failed Agentic Pull Requests in GitHub (MSR 2026, arXiv 2601.15195)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2601.15195",{"title":544,"url":545},"Peralta et al.: Why Are Agentic Pull Requests Merged or Rejected? An Empirical Study (MSR 2026, arXiv 2605.22534)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2605.22534",{"title":547,"url":548},"DORA: State of AI-assisted Software Development 2025","https:\u002F\u002Fdora.dev\u002Fdora-report-2025","\u002Fimages\u002Fblog\u002Fbackground-agents-async-pr-workflow\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fbackground-agents-async-pr-workflow\u002Fog.jpg",[77,78,79],"Háttérben futó kódoló ügynökök: PR-ek, sorok és review","Hogyan sorakoztatnak feladatokba az aszinkron kódoló ügynökök, hogyan futnak sandboxban, nyitnak draft PR-t és mennek át a CI-n. Limitek, költségek, review.","Egy kártya a tálcán öt mezőre ágazik, a nyilak egy kapu mögötti laphoz vezetnek.",{"slug":556,"published":557,"minutes":558,"category":7,"tags":559,"keywords":565,"about":577,"sources":585,"cover":618,"og":619,"expertise":75,"locales":620,"lang":79,"title":621,"description":622,"coverAlt":623},"context-rot-compaction-long-running-agents","2026-10-16",10,[560,561,562,563,564],"Context rot","Compaction","Context engineering","Long-running agents","Agent memory",[566,567,568,569,570,571,572,573,574,575,576],"context rot","context rot LLM","compaction AI agents","context engineering","long-running agents context window","Claude compaction API","context editing clear tool results","OpenAI responses compaction","lost in the middle LLM","agent context management","sub-agents context isolation",[578,581,584],{"name":579,"url":580},"Context window","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLarge_language_model#Context_window",{"name":582,"url":583},"Attention (machine learning)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAttention_(machine_learning)",{"name":449,"url":450},[586,589,592,595,598,600,603,606,609,612,615],{"title":587,"url":588},"Chroma: Context Rot: How Increasing Input Tokens Impacts LLM Performance (Jul 2025)","https:\u002F\u002Fresearch.trychroma.com\u002Fcontext-rot",{"title":590,"url":591},"Liu et al.: Lost in the Middle: How Language Models Use Long Contexts (2023)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2307.03172",{"title":593,"url":594},"Modarressi et al.: NoLiMa: Long-Context Evaluation Beyond Literal Matching (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.05167",{"title":596,"url":597},"Anthropic: Effective context engineering for AI agents (Sep 2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Feffective-context-engineering-for-ai-agents",{"title":599,"url":51},"Anthropic: Effective harnesses for long-running agents (Nov 2025)",{"title":601,"url":602},"Claude API docs: Compaction at a token threshold","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcompaction-threshold",{"title":604,"url":605},"Claude API docs: Compaction on demand","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcompaction-on-demand",{"title":607,"url":608},"Claude API docs: Context editing","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcontext-editing",{"title":610,"url":611},"Claude API docs: Memory tool","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Fmemory-tool",{"title":613,"url":614},"OpenAI API docs: Compaction","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fcompaction",{"title":616,"url":617},"Cognition: Don't Build Multi-Agents","https:\u002F\u002Fcognition.ai\u002Fblog\u002Fdont-build-multi-agents","\u002Fimages\u002Fblog\u002Fcontext-rot-compaction-long-running-agents\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fcontext-rot-compaction-long-running-agents\u002Fog.jpg",[77,78,79],"Kontextusromlás hosszan futó ügynököknél: törlés, tömörítés, memória és al-ügynökök","Miért romlik az LLM pontossága a kontextus növekedésével, és hogyan tartja pályán a hosszú ügynökfutást a törlés, a tömörítés, a jegyzet és az al-ügynök.","Egy kis négyzetes prés magas lappköteget nyom rövidre, közben két jegyzet ágazik le.",{"slug":625,"published":557,"minutes":626,"category":7,"tags":627,"keywords":631,"about":642,"sources":649,"cover":665,"og":666,"expertise":75,"locales":667,"lang":79,"title":668,"description":669,"coverAlt":670},"browser-agents-e2e-testing-playwright",7,[628,629,10,434,630],"Playwright","E2E testing","Test automation",[632,633,634,635,636,637,638,639,640,641],"playwright test agents","playwright planner generator healer","ai e2e testing","playwright mcp","llm generated playwright tests","self-healing tests","browser agent testing","playwright init-agents","ai test automation 2026","playwright cli skills",[643,645,648],{"name":628,"url":644},"https:\u002F\u002Fplaywright.dev\u002F",{"name":646,"url":647},"End-to-end testing","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSystem_testing",{"name":452,"url":453},[650,653,656,659,662],{"title":651,"url":652},"Playwright docs: Test agents (planner, generator, healer)","https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Ftest-agents",{"title":654,"url":655},"Microsoft: Playwright MCP README (MCP vs CLI, accessibility snapshots)","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fplaywright-mcp",{"title":657,"url":658},"Playwright docs: Best practices","https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fbest-practices",{"title":660,"url":661},"Playwright docs: Locators","https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Flocators",{"title":663,"url":664},"Browserbase: Stagehand README (act, extract, observe)","https:\u002F\u002Fgithub.com\u002Fbrowserbase\u002Fstagehand","\u002Fimages\u002Fblog\u002Fbrowser-agents-e2e-testing-playwright\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fbrowser-agents-e2e-testing-playwright\u002Fog.jpg",[77,78,79],"Böngészőágensek E2E-teszteléshez: írják az ágensek a Playwright-teszteket, ne futtassák","Hol segítenek az AI-ágensek E2E-teszteknél: Playwright planner, generator és healer, MCP vagy CLI, és a korlátok, melyek őszintén tartják a javított teszteket.","Bal oldali kis négyzetek adnak át egy lapos téglalapot a jobb oldali zárt huroknak.",1792245343917]