[{"data":1,"prerenderedAt":779},["ShallowReactive",2],{"blog-erp-integration-error-agent-en":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":25,"sources":35,"cover":72,"og":73,"expertise":74,"locales":75,"lang":76,"title":79,"description":80,"coverAlt":81,"metaTitle":82,"takeaways":83,"faq":89,"toc":105,"blocks":136,"others":507},"erp-integration-error-agent","2026-10-09",8,"agents",[9,10,11,12,13],"ERP integration","SAP","Error handling","Retries","AI agents",[15,16,17,18,19,20,21,22,23,24],"ERP integration error handling","IDoc status 51","SAP OData error handling","dead letter queue integration","integration retry idempotency","order sync failed shop ERP","AI agent triage logs","SAP Integration Suite JMS retry","integration error taxonomy","incident deduplication",[26,29,32],{"name":27,"url":28},"IDoc","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIDoc",{"name":30,"url":31},"Dead letter queue","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDead_letter_queue",{"name":33,"url":34},"Exponential backoff","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FExponential_backoff",[36,39,42,45,48,51,54,57,60,63,66,69],{"title":37,"url":38},"SAP Library: IDoc interface and ALE exception handling","https:\u002F\u002Fhelp.sap.com\u002Fsaphelp_aii710\u002Fhelpdata\u002Fen\u002F0b\u002F2a6743507d11d18ee90000e8366fc2\u002Fcontent.htm",{"title":40,"url":41},"SAP Community: IDoc status codes","https:\u002F\u002Fcommunity.sap.com\u002Ft5\u002Ftechnology-q-a\u002Fidoc-status-codes\u002Fqaq-p\u002F3961848",{"title":43,"url":44},"SAP CAP: indicating errors (Java)","https:\u002F\u002Fcap.cloud.sap\u002Fdocs\u002Fjava\u002Fevent-handlers\u002Findicating-errors",{"title":46,"url":47},"SAP Community: Cloud Integration asynchronous messaging with retry using JMS (2017)","https:\u002F\u002Fcommunity.sap.com\u002Ft5\u002Fintegration-blog-posts\u002Fcloud-integration-configure-asynchronous-messaging-with-retry-using-jms\u002Fba-p\u002F13315669",{"title":49,"url":50},"SAP Community: Cloud Integration dead-letter handling in the JMS adapter (2017)","https:\u002F\u002Fcommunity.sap.com\u002Ft5\u002Ftechnology-blogs-by-sap\u002Fcloud-integration-configure-dead-letter-handling-in-jms-adapter\u002Fba-p\u002F13325734",{"title":52,"url":53},"Temporal: retry policies","https:\u002F\u002Fdocs.temporal.io\u002Fencyclopedia\u002Fretry-policies",{"title":55,"url":56},"Amazon SQS: dead-letter queues","https:\u002F\u002Fdocs.aws.amazon.com\u002FAWSSimpleQueueService\u002Flatest\u002FSQSDeveloperGuide\u002Fsqs-dead-letter-queues.html",{"title":58,"url":59},"Azure Service Bus: dead-letter queues","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fservice-bus-messaging\u002Fservice-bus-dead-letter-queues",{"title":61,"url":62},"Stripe API reference: idempotent requests","https:\u002F\u002Fdocs.stripe.com\u002Fapi\u002Fidempotent_requests",{"title":64,"url":65},"AWS Architecture Blog: Exponential backoff and jitter","https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Farchitecture\u002Fexponential-backoff-and-jitter\u002F",{"title":67,"url":68},"MuleSoft: 2026 Connectivity Benchmark Report","https:\u002F\u002Fblogs.mulesoft.com\u002Fagentic-perspectives\u002Fconnectivity-benchmark-report\u002F",{"title":70,"url":71},"OWASP GenAI Security Project: LLM06:2025 Excessive Agency","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm062025-excessive-agency\u002F","\u002Fimages\u002Fblog\u002Ferp-integration-error-agent\u002Fcover.webp","\u002Fimages\u002Fblog\u002Ferp-integration-error-agent\u002Fog.jpg","b2b-ecommerce-developer",[76,77,78],"en","de","hu","An agent that triages ERP integration errors: taxonomy, runbooks and safe retries","How to build an agent for ERP integration error handling: an error taxonomy from IDoc and OData contracts, allowlisted runbooks, safe retries and dedup.","A pipe with a warning at one joint, cards sorted into a tray below.","ERP integration error triage agent · Balázs Csorba",[84,85,86,87,88],"Most shop, PIM and ERP integration failures fall into five families: mapping and validation, missing master data, price or customer blocks, availability conflicts, and infrastructure errors.","Build the error taxonomy from real contracts such as IDoc status records and OData error objects, and fingerprint errors so the same class always maps to the same runbook.","Classify rules-first and use the LLM only for unstructured runtime text; the agent acts only through allowlisted, audit-logged runbook actions.","Retry only idempotent operations with bounded attempts and exponential backoff with jitter; data and validation errors go to quarantine and a ticket for the owning team.","MuleSoft’s 2026 benchmark reports that IT teams spend 36% of their time on custom integration work, so measure failed messages per interface, time to resolve and the share resolved without a person.",[90,93,96,99,102],{"q":91,"a":92},"What does IDoc status 51 mean?","Per SAP’s IDoc status list, status 51 means “Application document not posted”: the IDoc reached the application but posting failed, for example because of missing master data, a validation error or a lock. Inbound processing of that IDoc stops; after the cause is fixed it can be resubmitted, for example with report RBDMANI2, which SAP also suggests scheduling for lock problems.",{"q":94,"a":95},"Which ERP integration errors are safe to retry automatically?","Transient infrastructure errors such as timeouts, 5xx responses and locks, and only when the operation is idempotent, with bounded attempts and backoff with jitter. Data and validation errors, such as a missing material or a blocked customer, do not improve with retries; they belong in quarantine with a ticket to the team that owns the data.",{"q":97,"a":98},"Can an AI agent fix ERP integration errors on its own?","It should not change business data. A useful agent reads signals, classifies errors, deduplicates incidents and executes a short allowlist of safe actions such as a bounded retry or opening a ticket with full context. Fixing a customer record or a mapping is a human change, proposed by the agent and approved by the data owner.",{"q":100,"a":101},"What is a dead letter queue in SAP Cloud Integration?","In Cloud Integration’s non-exclusive JMS queues, as documented in 2017, the dead-letter queue holds messages that could not be processed because a worker node crashed: they are retried twice and then parked for manual action. Messages that fail because of a processing error do not go there, so they need their own monitoring.",{"q":103,"a":104},"How do you measure an integration triage agent?","Baseline before the pilot and compare after: failed messages per interface per week, time to resolve per error class, the share resolved without a human, manual touches per failed order, and recurring classes eliminated through mapping fixes. No published benchmark exists for these, so your own logs are the evidence.",[106,109,112,115,118,121,124,127,130,133],{"id":107,"title":108},"what-breaks-between-shop-pim-and-erp","What breaks between shop, PIM and ERP?",{"id":110,"title":111},"taxonomy-from-error-contracts","How do you build an integration error taxonomy?",{"id":113,"title":114},"the-agent-triage-loop","How does the agent’s triage loop work?",{"id":116,"title":117},"safe-retries-and-runbooks","When is a retry safe, and what goes in a runbook?",{"id":119,"title":120},"queue-and-dlq-mechanics","Which queue and dead-letter mechanics should you know?",{"id":122,"title":123},"guardrails-and-audit","Which guardrails does a triage agent need?",{"id":125,"title":126},"what-it-is-worth","What is an integration triage agent worth?",{"id":128,"title":129},"when-not-to-build-an-agent","When should you not build an agent for this?",{"id":131,"title":132},"implementation-checklist","A one-page implementation checklist",{"id":134,"title":135},"sources","Sources",[137,144,153,156,159,162,163,166,213,280,281,284,290,292,299,300,303,307,322,324,331,332,335,380,390,391,397,408,411,412,415,435,438,439,442,443,461,468,469],{"type":138,"content":139},"paragraph",[140,143],{"tag":141,"children":142},"strong",[15]," is the operational side of connecting a shop, a PIM and an ERP: reading failed messages, deciding whether to retry or fix, finding whose system owns the fix, and knowing which orders are affected. An agent can take most of the reading and sorting off the integration team, as long as it classifies against a real error taxonomy, acts only through a short list of safe runbook actions, and leaves every change to business data with people.",{"type":138,"content":145},[146,147,152],"This article covers what breaks between shop, PIM and ERP, a taxonomy built from SAP’s error contracts, the agent’s triage loop, safe retries and runbooks, queue and dead-letter mechanics, guardrails, the business case and when a rules engine is the better answer. The design of the sync itself is in ",{"tag":148,"to":149,"children":150},"link","\u002Fblog\u002Fpimcore-erp-delta-sync",[151],"the Pimcore ERP delta sync",".",{"type":154,"level":155,"id":107,"text":108},"heading",2,{"type":138,"content":157},[158],"Five failure families cover most incidents: mapping and validation errors, missing or blocked master data, price and customer status blocks, availability and allocation conflicts, and authentication, timeout and infrastructure errors. Every triage answers three questions: retry or fix, whose system owns the fix, and how many orders are affected.",{"type":138,"content":160},[161],"The distinction between retry and fix matters most. Only the last family improves with time; a missing material or a blocked customer fails the same way on every retry, and an integration that retries those forever turns one data problem into hundreds of noisy alerts. Working on B2B commerce systems with Spryker and Pimcore, I have found that the part teams keep after a project is not the integration code but the runbook library and the error dashboard, so design for those from the start.",{"type":154,"level":155,"id":110,"text":111},{"type":138,"content":164},[165],"Build it from the error contracts your systems already emit, not from labels you invent. SAP gives you two good ones: IDoc status records and OData error objects.",{"type":167,"ordered":168,"items":169},"list",false,[170,184],[171,174,175,179,180,183],{"tag":141,"children":172},[173],"IDoc status records."," Per SAP’s status list, cross-checked in ",{"tag":176,"href":41,"children":177},"a",[178],"SAP Community",", 51 means “Application document not posted”, 53 “Application document posted”, 64 “IDoc ready to be transferred to application”, 66 “IDoc is waiting for predecessor IDoc” and 68 “Error, no further processing”. SAP’s ALE documentation says inbound processing of a failing IDoc is terminated, a workflow item is raised, and after correction the IDoc is resubmitted; report RBDMANI2 resubmits status 51 and 63 IDocs and can be scheduled to collect those that failed on a lock (",{"tag":176,"href":38,"children":181},[182],"SAP Library",").",[185,188,189,193,194,196,197,200,201,204,205,208,209,212],{"tag":141,"children":186},[187],"OData error objects."," An OData V4 error response is a JSON ",{"tag":190,"children":191},"code",[192],"error"," object with a language-independent ",{"tag":190,"children":195},[190],", a message, an optional ",{"tag":190,"children":198},[199],"target"," pointing at the offending property, and a ",{"tag":190,"children":202},[203],"details"," array. SAP CAP adds a numeric severity, and draws a clear line: throwing a ",{"tag":190,"children":206},[207],"ServiceException"," aborts and rolls back, while messages added through the Messages API do not stop processing (",{"tag":176,"href":44,"children":210},[211],"SAP CAP","). A warning with a target is a report, not a retry candidate.",{"type":214,"head":215,"rows":226},"table",[216,218,220,222,224],[217],"Error class",[219],"Detection signal",[221],"Retryable?",[223],"Safe first action",[225],"Fixing owner",[227,238,248,258,269],[228,230,232,234,236],[229],"Mapping, validation",[231],"IDoc 51 with field message; OData error with target",[233],"no",[235],"quarantine, ticket with field",[237],"integration team",[239,241,243,244,246],[240],"Missing master data",[242],"IDoc 51, “material not found”",[233],[245],"quarantine, ticket",[247],"master data team",[249,251,253,254,256],[250],"Customer or price block",[252],"application message on posting",[233],[255],"notify order desk",[257],"sales, finance",[259,261,263,265,267],[260],"Availability, allocation",[262],"ATP or allocation message",[264],"sometimes",[266],"notify, retry after replenishment",[268],"supply chain",[270,272,274,276,278],[271],"Lock, timeout, 5xx",[273],"IDoc 51 on lock; HTTP 5xx; queue retry",[275],"yes, if idempotent",[277],"bounded retry",[279],"platform team",{"type":154,"level":155,"id":113,"text":114},{"type":138,"content":282},[283],"Normalize every signal into one record, classify with rules first, decide from the taxonomy, act within an allowlist, record what happened, and deduplicate by fingerprint. The LLM is one component of the classifier, used only for unstructured runtime text that no rule matches.",{"type":285,"src":286,"alt":287,"wide":288,"caption":289},"image","\u002Fimages\u002Fblog\u002Ferp-integration-error-agent\u002Fdiagram-11.webp","Integration error triage loop Six stages from left to right: signals from IDoc status records, Cloud Integration logs, queues and dead-letter queues, OData error responses and the shop’s sync queue; a normalizer that turns them into one record shape; a classifier that applies rules first and uses an LLM only for unstructured runtime text; a decision from the taxonomy; an allowlisted action such as retry, quarantine, notify or ticket; and a dedup store that counts fingerprints and links known incidents, feeding runbook and mapping fixes back.",true,"The triage loop: every signal becomes one record shape, rules decide first, and the agent can only take actions from a short allowlist.",{"type":190,"code":291},"\u002F\u002F One record shape for every signal (sketch)\ntype IntegrationError = {\n  source: 'idoc' | 'cpi' | 'odata' | 'queue' | 'shop'\n  interface: string      \u002F\u002F e.g. \"ORDERS inbound\", \"stock sync\"\n  entityKey: string      \u002F\u002F order number, material, customer\n  code: string           \u002F\u002F IDoc status + message class\u002Fnumber, OData error code, DLQ reason\n  target?: string        \u002F\u002F OData target path or IDoc segment\u002Ffield\n  text: string           \u002F\u002F runtime message text: untrusted input for any LLM step\n  retryCount: number\n}\n\n\u002F\u002F Same class, same runbook: fingerprint without volatile values\nconst fingerprint = (e: IntegrationError) =>\n  sha256([e.source, e.interface, e.code, e.target ?? '', stripVolatile(e.text)].join('|'))\n\u002F\u002F stripVolatile removes ids, numbers and timestamps, so\n\u002F\u002F \"material 4711 not found\" and \"material 4712 not found\" share one fingerprint",{"type":138,"content":293},[294,295,298],"The fingerprint is what turns a flood into a list. Two hundred failed order IDocs with the same missing material become one incident with a count and a list of affected orders, linked to one ticket. Treat the runtime text as untrusted input: it can contain customer-supplied strings, so the LLM step only classifies and summarizes, and never decides an action outside the taxonomy. My own ",{"tag":190,"children":296},[297],"jev-decide"," skill has the same shape, a typed decision with a confidence where low confidence goes to a human, and the triage classifier should return exactly that: error class, retryable, owner, confidence.",{"type":154,"level":155,"id":116,"text":117},{"type":138,"content":301},[302],"A retry is safe when the error is transient and the operation is idempotent, and it stays safe only when attempts are bounded and spread out. Everything else is quarantine plus a ticket. A runbook is a short list of named actions per error class: auto-retry, quarantine and assign an owner, notify, open a ticket with context, or propose a mapping change.",{"type":285,"src":304,"alt":305,"wide":288,"caption":306},"\u002Fimages\u002Fblog\u002Ferp-integration-error-agent\u002Fdiagram-16.webp","Retry decision tree for integration errors A failed message branches into four classes. Transient errors such as timeouts, 5xx responses and locks get a bounded retry with backoff and jitter, for idempotent operations only. Data and validation errors such as a missing material go to quarantine with a ticket for the owning team. Business-rule errors such as a credit block notify the order desk with context. Unknown errors from free-text messages are classified by an LLM, and low-confidence results go to a human.","The retry decision tree: only transient errors on idempotent operations are retried; data and business errors go to the people who own the fix, and unknown errors are classified with a confidence threshold.",{"type":138,"content":308},[309,310,313,314,318,319,183],"Idempotency is a receiver-side contract. Stripe’s API is the clean reference: an idempotency key lets a caller repeat a request without performing the operation twice, and reusing a key with different parameters returns an error (",{"tag":176,"href":62,"children":311},[312],"Stripe","). Any call that creates a sales order, delivery or invoice needs the same contract before an agent may retry it; the duplicate sales order is the failure that costs real money, which is why ",{"tag":148,"to":315,"children":316},"\u002Fblog\u002Fb2b-email-order-entry-llm",[317],"email order entry automation"," puts the key on the create call. Backoff alone is not enough either: in AWS’s simulation of 100 contending clients, adding full jitter to capped exponential backoff cut the call count by more than half (",{"tag":176,"href":65,"children":320},[321],"AWS",{"type":190,"code":323},"\u002F\u002F Capped exponential backoff with full jitter, for idempotent operations only\nfunction retryDelayMs(attempt: number, baseMs = 1_000, capMs = 60_000): number {\n  const ceiling = Math.min(capMs, baseMs * 2 ** attempt)\n  return Math.random() * ceiling\n}\n\nconst MAX_ATTEMPTS = 5   \u002F\u002F bounded: after that, quarantine and open a ticket",{"type":138,"content":325},[326,327,152],"The runbook library is also the feedback loop. When the same fingerprint keeps landing in quarantine, the agent proposes a mapping fix as a ticket to the data owner, with the count, the affected orders and the example payload. That is how recurring classes disappear instead of being handled forever. Retrying LLM API calls follows similar rules but a different failure mode, covered in ",{"tag":148,"to":328,"children":329},"\u002Fblog\u002Fllm-rate-limits-retries-provider-fallback",[330],"LLM rate limits, retries and provider fallback",{"type":154,"level":155,"id":119,"text":120},{"type":138,"content":333},[334],"Know exactly what lands in each dead-letter queue, because the rules differ per platform and an agent that assumes the wrong one misses failures. Three examples cover most stacks.",{"type":167,"ordered":168,"items":336},[337,348,359],[338,341,342,344,345,347],{"tag":141,"children":339},[340],"SAP Cloud Integration JMS queues:"," for non-exclusive JMS queues, as documented by SAP in 2017, the retry interval defaults to one minute, exponential backoff doubles it after each failure, and a maximum interval of 60 minutes or more is recommended (",{"tag":176,"href":47,"children":343},[178],"). The dead-letter queue there is narrow: it holds messages that could not be processed because a node crashed, retried twice and then parked for manual action; messages that fail because of a processing error do not go there (",{"tag":176,"href":50,"children":346},[178],"). Newer exclusive queues behave differently, so check which kind an interface uses.",[349,352,353,356,357,183],{"tag":141,"children":350},[351],"Amazon SQS:"," a redrive policy with ",{"tag":190,"children":354},[355],"maxReceiveCount"," moves messages to a dead-letter queue, whose expiry is based on the original enqueue time, so its retention must be longer than the source queue’s (",{"tag":176,"href":56,"children":358},[321],[360,363,364,367,368,371,372,375,376,379],{"tag":141,"children":361},[362],"Azure Service Bus:"," dead-lettered messages carry ",{"tag":190,"children":365},[366],"DeadLetterReason"," and ",{"tag":190,"children":369},[370],"DeadLetterDescription",", for example ",{"tag":190,"children":373},[374],"MaxDeliveryCountExceeded"," after the default of 10 deliveries, and Microsoft recommends putting the exception type and stack trace into those fields (",{"tag":176,"href":59,"children":377},[378],"Microsoft Learn","). That is free input for the classifier.",{"type":138,"content":381},[382,383,386,387,152],"Durable execution engines encode the same rules as defaults. Temporal retries activities with exponential backoff, a coefficient of 2.0 from a one-second initial interval up to 100 seconds, treats a maximum of zero attempts as unlimited, and its documentation names bad input data as the reasonable case for a non-retryable error (",{"tag":176,"href":53,"children":384},[385],"Temporal","). If you run order workflows on it, the agent reads its failures like any other signal; the platform itself is reviewed in ",{"tag":148,"to":388,"children":389},"\u002Fblog\u002Ftemporal",[385],{"type":154,"level":155,"id":122,"text":123},{"type":138,"content":392},[393,394,183],"Read-only by default, actions from an allowlist only, a dry-run mode, approval gates per action class, and a full audit trail. OWASP’s Top 10 for LLM applications lists excessive agency, giving an LLM-driven system more functionality, permissions or autonomy than its task needs, as LLM06 in its 2025 edition (",{"tag":176,"href":71,"children":395},[396],"OWASP GenAI",{"type":398,"variant":399,"title":400,"body":401},"callout","warn","“Fix the customer record” is never an agent action",[402],[403,404,152],"The agent may retry an idempotent call, quarantine a message, notify someone or open a ticket with context. It may not change master data, mappings or order contents, even when it is confident about the fix. Those changes go to the owning team as a proposal. The patterns for that handoff are in ",{"tag":148,"to":405,"children":406},"\u002Fblog\u002Fhuman-in-the-loop-ai-agents",[407],"human-in-the-loop AI agents",{"type":138,"content":409},[410],"A good ticket is half the value. It carries the interface, the IDoc number or message ID, the message class and number, the entity key, the fingerprint count, the affected orders and a link to the runbook. I open tickets like that every day through a Jira MCP server with 20 tools, and the difference between a ticket with context and one without is measured in analyst minutes.",{"type":154,"level":155,"id":125,"text":126},{"type":138,"content":413},[414],"It is worth the integration time it frees and the failed orders it surfaces before customers notice. No published figure exists for analyst hours saved by triage automation or for the cost of a failed B2B order, so the business case rests on context numbers and your own baseline.",{"type":167,"ordered":168,"items":416},[417,425],[418,421,422,183],{"tag":141,"children":419},[420],"Integration load:"," MuleSoft’s 2026 Connectivity Benchmark, a survey of 1,050 IT leaders from October to November 2025, reports that IT teams spend 36% of their time designing, building and testing custom integrations, that the average organization runs 957 applications with 27% connected, and that 26% of IT projects missed their deadline (",{"tag":176,"href":68,"children":423},[424],"MuleSoft",[426,429,430,434],{"tag":141,"children":427},[428],"Order errors drive churn:"," in a Sana Commerce study of 750 B2B buyers from September 2024, 33% reported order errors caused by inaccurate web-store data and 75% would consider switching suppliers for a better experience (",{"tag":176,"href":431,"children":432},"https:\u002F\u002Fprocurementmag.com\u002Fprocurement-strategy\u002Fsana-real-time-data-key-to-persuading-b2b-buyers",[433],"Procurement Magazine","; vendor survey).",{"type":138,"content":436},[437],"For a head of e-commerce operations or an ERP integration lead, baseline four numbers before the pilot: failed messages per interface per week, time to resolve per error class, the share resolved without a person, and manual touches per failed order. Then count the recurring classes that disappear through mapping fixes; that number is the one a COO understands.",{"type":154,"level":155,"id":128,"text":129},{"type":138,"content":440},[441],"Do not build one when message volume is low, when every signal is already structured, when there is no observability to read from, or when the real problem is an unresolved design flaw upstream. In those cases a rules engine plus alerting wins, and an LLM adds cost and a new failure mode without adding signal.",{"type":154,"level":155,"id":131,"text":132},{"type":167,"ordered":288,"items":444},[445,447,449,451,453,455,457,459],[446],"Pick one interface and one error class for the pilot, such as inbound order IDocs.",[448],"Write the taxonomy from real status codes and error objects, with an owner per class.",[450],"Normalize all signals into one record shape and fingerprint without volatile values.",[452],"Classify rules-first; send only unmatched free text to the LLM, with a confidence threshold.",[454],"Allowlist the actions, start in dry-run mode, and require approval per action class.",[456],"Retry only idempotent calls, bounded, with backoff and jitter.",[458],"Log every decision and action with the fingerprint, the rule or model version and the outcome.",[460],"Baseline the four metrics and review recurring classes monthly with the data owners.",{"type":138,"content":462},[463,464,152],"A fixed-scope triage pilot on one interface, with a written taxonomy, a runbook library, dedup reporting and a before-and-after from your own logs, is a well-defined project. If you want help scoping one, see my ",{"tag":148,"to":465,"children":466},"\u002Fexpertise\u002Fb2b-ecommerce-developer",[467],"B2B e-commerce work",{"type":154,"level":155,"id":134,"text":135},{"type":167,"ordered":288,"items":470},[471,474,477,480,483,486,489,492,495,498,501,504],[472],{"tag":176,"href":38,"children":473},[37],[475],{"tag":176,"href":41,"children":476},[40],[478],{"tag":176,"href":44,"children":479},[43],[481],{"tag":176,"href":47,"children":482},[46],[484],{"tag":176,"href":50,"children":485},[49],[487],{"tag":176,"href":53,"children":488},[52],[490],{"tag":176,"href":56,"children":491},[55],[493],{"tag":176,"href":59,"children":494},[58],[496],{"tag":176,"href":62,"children":497},[61],[499],{"tag":176,"href":65,"children":500},[64],[502],{"tag":176,"href":68,"children":503},[67],[505],{"tag":176,"href":71,"children":506},[70],[508,567,640,710],{"slug":509,"published":510,"minutes":511,"category":7,"tags":512,"keywords":517,"about":528,"sources":538,"cover":560,"og":561,"expertise":562,"locales":563,"lang":76,"title":564,"description":565,"coverAlt":566},"agent-tool-design-descriptions-errors","2026-10-17",11,[13,513,514,515,516],"Tool use","Function calling","MCP","Agent design",[518,519,520,521,522,523,524,525,526,527],"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",[529,532,535],{"name":530,"url":531},"Intelligent agent","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIntelligent_agent",{"name":533,"url":534},"Model Context Protocol","https:\u002F\u002Fmodelcontextprotocol.io\u002F",{"name":536,"url":537},"Poka-yoke","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPoka-yoke",[539,542,545,548,551,554,557],{"title":540,"url":541},"Anthropic Engineering: Writing effective tools for agents, with agents (Sep 2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fwriting-tools-for-agents",{"title":543,"url":544},"Anthropic Engineering: Building effective agents (Dec 2024)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fbuilding-effective-agents",{"title":546,"url":547},"Claude Platform Docs: Define tools","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Fdefine-tools",{"title":549,"url":550},"Claude Platform Docs: Handle tool calls","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Fhandle-tool-calls",{"title":552,"url":553},"Claude Platform Docs: Tool search tool","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Ftool-search-tool",{"title":555,"url":556},"Model Context Protocol specification 2025-11-25: Tools","https:\u002F\u002Fmodelcontextprotocol.io\u002Fspecification\u002F2025-11-25\u002Fserver\u002Ftools",{"title":558,"url":559},"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","ai-engineer",[76,77,78],"Designing tools for AI agents: names, descriptions, schemas and error messages","How to design agent tools that get picked and called correctly: task-shaped tools, descriptions, schemas, compact responses and errors a model can act on.","Three rectangular slots in a base, with a block of matching width lined up over the middle slot and two wrong-width blocks beside it.",{"slug":568,"published":510,"minutes":511,"category":7,"tags":569,"keywords":575,"about":588,"sources":598,"cover":634,"og":635,"expertise":562,"locales":636,"lang":76,"title":637,"description":638,"coverAlt":639},"coding-agents-legacy-codebase-migration",[570,571,572,573,574],"Legacy migration","Coding agents","Strangler fig","Testing","Code review",[576,577,578,579,580,581,582,583,584,585,586,587],"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",[589,592,595],{"name":590,"url":591},"Legacy code","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLegacy_code",{"name":593,"url":594},"Characterization test","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCharacterization_test",{"name":596,"url":597},"Strangler fig pattern","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FStrangler_fig_pattern",[599,602,604,607,610,613,616,619,622,625,628,631],{"title":600,"url":601},"Martin Fowler: Strangler Fig (2024)","https:\u002F\u002Fmartinfowler.com\u002Fbliki\u002FStranglerFigApplication.html",{"title":603,"url":594},"Wikipedia: Characterization test",{"title":605,"url":606},"Google Research: Accelerating code migrations with AI (2024)","https:\u002F\u002Fresearch.google\u002Fblog\u002Faccelerating-code-migrations-with-ai\u002F",{"title":608,"url":609},"Ziftci et al.: Migrating Code At Scale With LLMs At Google (arXiv 2504.09691)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2504.09691",{"title":611,"url":612},"Anthropic: Effective harnesses for long-running agents (2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Feffective-harnesses-for-long-running-agents",{"title":614,"url":615},"Anthropic: Redesigning source control at Anthropic (2026)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fredesigning-source-control",{"title":617,"url":618},"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":620,"url":621},"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":623,"url":624},"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":626,"url":627},"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":629,"url":630},"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":632,"url":633},"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",[76,77,78],"Migrating a legacy codebase with coding agents: a strangler fig playbook","How to use coding agents on a legacy migration: characterization tests first, one seam per task, review gates and differential verification.","A stack of slabs with the top two replaced by fresh ones beside a seam and a check.",{"slug":641,"published":510,"minutes":642,"category":7,"tags":643,"keywords":647,"about":659,"sources":669,"cover":704,"og":705,"expertise":562,"locales":706,"lang":76,"title":707,"description":708,"coverAlt":709},"background-agents-async-pr-workflow",12,[571,644,645,574,646],"Pull requests","CI","Automation",[648,649,650,651,652,653,654,655,656,657,658],"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",[660,663,666],{"name":661,"url":662},"Software agent","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_agent",{"name":664,"url":665},"Pull request","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDistributed_version_control",{"name":667,"url":668},"Continuous integration","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FContinuous_integration",[670,671,674,677,680,683,686,689,692,695,698,701],{"title":632,"url":633},{"title":672,"url":673},"GitHub Docs: Risks and mitigations for Copilot cloud agent","https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Fconcepts\u002Fagents\u002Fcloud-agent\u002Frisks-and-mitigations",{"title":675,"url":676},"OpenAI Developers: Codex cloud environments","https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fcloud\u002Fenvironments",{"title":678,"url":679},"Anthropic: Use Claude Code in the cloud","https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fclaude-code-on-the-web",{"title":681,"url":682},"Google Jules: Limits and plans","https:\u002F\u002Fjules.google\u002Fdocs\u002Fusage-limits\u002F",{"title":684,"url":685},"Google Jules: Getting started","https:\u002F\u002Fjules.google\u002Fdocs\u002F",{"title":687,"url":688},"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":690,"url":691},"GitHub Docs: Models and pricing for GitHub Copilot","https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Freference\u002Fcopilot-billing\u002Fmodels-and-pricing",{"title":693,"url":694},"OpenAI Developers: Codex pricing","https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fpricing",{"title":696,"url":697},"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":699,"url":700},"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":702,"url":703},"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",[76,77,78],"Background coding agents that open PRs: a practical async workflow","How async coding agents queue tasks, run in sandboxes, open draft PRs and pass CI. Provider limits, cost controls, review design and failure modes.","One card in a tray fanning out to five pads, all arrows leading to one page behind a gate.",{"slug":711,"published":712,"minutes":713,"category":7,"tags":714,"keywords":720,"about":732,"sources":740,"cover":773,"og":774,"expertise":562,"locales":775,"lang":76,"title":776,"description":777,"coverAlt":778},"context-rot-compaction-long-running-agents","2026-10-16",10,[715,716,717,718,719],"Context rot","Compaction","Context engineering","Long-running agents","Agent memory",[721,722,723,724,725,726,727,728,729,730,731],"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",[733,736,739],{"name":734,"url":735},"Context window","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLarge_language_model#Context_window",{"name":737,"url":738},"Attention (machine learning)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAttention_(machine_learning)",{"name":530,"url":531},[741,744,747,750,753,755,758,761,764,767,770],{"title":742,"url":743},"Chroma: Context Rot: How Increasing Input Tokens Impacts LLM Performance (Jul 2025)","https:\u002F\u002Fresearch.trychroma.com\u002Fcontext-rot",{"title":745,"url":746},"Liu et al.: Lost in the Middle: How Language Models Use Long Contexts (2023)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2307.03172",{"title":748,"url":749},"Modarressi et al.: NoLiMa: Long-Context Evaluation Beyond Literal Matching (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.05167",{"title":751,"url":752},"Anthropic: Effective context engineering for AI agents (Sep 2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Feffective-context-engineering-for-ai-agents",{"title":754,"url":612},"Anthropic: Effective harnesses for long-running agents (Nov 2025)",{"title":756,"url":757},"Claude API docs: Compaction at a token threshold","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcompaction-threshold",{"title":759,"url":760},"Claude API docs: Compaction on demand","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcompaction-on-demand",{"title":762,"url":763},"Claude API docs: Context editing","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcontext-editing",{"title":765,"url":766},"Claude API docs: Memory tool","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Fmemory-tool",{"title":768,"url":769},"OpenAI API docs: Compaction","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fcompaction",{"title":771,"url":772},"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",[76,77,78],"Context rot in long-running agents: clearing, compaction, memory and sub-agents","Why LLM accuracy drops as context grows, and how clearing tool results, compaction, notes and sub-agents keep long-running agents on track.","A small square press squeezing a tall stack of sheets into a short one, two notes branching off.",1792337027485]