[{"data":1,"prerenderedAt":3854},["ShallowReactive",2],{"docs-nav":3,"docs-article-engineering\u002Fsystem-design\u002Fagentic-platform\u002Fruntime":797},[4,17,27,44,55,67,75,82,94,106,114,122,129,135,144,153,161,169,177,189,202,211,218,229,240,248,260,268,276,286,296,305,314,323,331,337,343,350,356,364,371,378,383,393,401,410,415,422,432,439,444,451,458,462,467,475,487,499,509,516,525,533,539,545,551,557,563,567,579,593,603,614,621,626,633,640,646,653,658,665,673,678,686,692,699,704,710,721,730,740,747,753,761,767,776,782,791],{"path":5,"title":6,"description":7,"group":8,"section":6,"order":9,"tags":10,"lastUpdated":16},"\u002Fagents\u002Fagentic-crm","Agentic CRM","Research brief and build plan for an AgencyCore agentic CRM layer, rendered as an interactive page — the core operating loop, the target architecture, the typed-tool risk gateway, the proposed-actions review queue, and the four-slice MVP.","Agents",0,[11,12,13,14,15],"crm","agents","ai","architecture","research","2026-06-12",{"path":18,"title":19,"description":20,"group":8,"section":21,"order":22,"tags":23,"lastUpdated":26},"\u002Fagents\u002Fchat","Chat agent","High-level system design of the AgencyCore chat agent — core components, data flow, and the two abstractions that hold it together.","Reference",1,[12,14,24,25],"chat","system-design","2026-05-13",{"path":28,"title":29,"description":30,"group":8,"section":31,"order":32,"tags":33,"lastUpdated":43},"\u002Fagents\u002Fcompany-enrichment","Company Enrichment","The company enrichment workflow - a cache-first read in front of the company intelligence database that fills firmographic, contact and technographic facts via a fixed-order provider waterfall, and writes every resolved fact back with provenance so the first org pays once and every later search rides free.","Enrichment",2,[12,34,35,36,37,38,39,40,41,42],"workflow","enrichment","companies","waterfall","cache","intelligence-database","firmographics","provenance","sonar","2026-06-10",{"path":45,"title":46,"description":47,"group":8,"section":48,"order":9,"tags":49,"lastUpdated":54},"\u002Fagents\u002Fcompany-sonar","Company Signals","Signal-first company discovery for marketing agencies, on the Claude Agent SDK, with a global intelligence cache and deterministic composite scoring.","Company Sonar",[12,34,42,50,51,52,35,53,14],"company-search","signals","agent-sdk","scoring","2026-06-08",{"path":56,"title":57,"description":58,"group":8,"section":48,"order":22,"tags":59,"lastUpdated":66},"\u002Fagents\u002Fcompany-sonar\u002Fsignal-monitoring","Company Signals Monitoring","Realtime signal capture layer on top of the data graph. Detects hot events, scores them with a Claude managed agent against each agency's ICP, fans out alerts.",[14,51,60,61,62,63,64,65],"intel","icp","alerts","monitoring","sse","managed-agents","2026-06-09",{"path":68,"title":69,"description":70,"group":8,"section":71,"order":22,"tags":72,"lastUpdated":74},"\u002Fagents\u002Fconcepts\u002Fchat-agent-design-principles","Designing chat agents","The 2026 playbook for production chat agents that reach into internal systems via tools — context engineering, memory, tool design, when to add complexity.","Concepts",[12,14,24,73],"context-engineering","2026-05-14",{"path":76,"title":77,"description":78,"group":8,"section":71,"order":32,"tags":79,"lastUpdated":74},"\u002Fagents\u002Fconcepts\u002Fsystem-prompt-architecture","System prompt architecture","How to structure a production chat agent system prompt — eight sections, what each one does, and the rules vendors converge on.",[12,80,81],"prompt-engineering","system-prompt",{"path":83,"title":84,"description":85,"group":8,"section":84,"order":9,"tags":86,"lastUpdated":54},"\u002Fagents\u002Fenvoy","Envoy","High-level system design for the AI outreach engine — the sequence step state machine, the human-in-the-loop draft approval gate, multi-source context enrichment, and the inbox sentiment flow, rendered as an interactive page.",[12,87,88,89,90,91,92,93,14],"envoy","outreach","sales-engagement","sequences","state-machine","human-in-the-loop","nylas",{"path":95,"title":96,"description":97,"group":8,"section":98,"order":9,"tags":99,"lastUpdated":16},"\u002Fagents\u002Fheadhunter","Headhunter","The AI talent-search pipeline on one page - the production six-step design with its current-title relevance gate, and the 2.0 system design with internal-first waterfall sourcing, a pluggable source registry, automatic entity resolution, and a people intelligence graph that compounds every run.","General Search",[12,34,100,101,14,25,102,37,103,104,105],"headhunter","recruiting","multi-source","entity-resolution","people-intelligence","flywheel",{"path":107,"title":108,"description":109,"group":8,"section":21,"order":32,"tags":110,"lastUpdated":113},"\u002Fagents\u002Fpaperclip","Paperclip","Architecture deep dive into the Paperclip orchestration system.",[12,14,111,112],"orchestration","paperclip","2026-04-20",{"path":115,"title":116,"description":117,"group":8,"section":31,"order":22,"tags":118,"lastUpdated":16},"\u002Fagents\u002Fpeople-enrichment","People Enrichment","The people enrichment workflow - a cache-first read in front of the people intelligence database that fills profile, contact and employment facts via a fixed-order provider waterfall, keyed on the LinkedIn URL, and writes every resolved fact back with provenance so the first org pays once and every later search rides free. The fill step Headhunter and People Signals both call.",[12,34,35,119,37,38,39,120,41,100,121],"people","linkedin","people-sonar",{"path":123,"title":124,"description":125,"group":8,"section":126,"order":9,"tags":127,"lastUpdated":54},"\u002Fagents\u002Fpeople-sonar","People Signals","Signal-first people discovery for marketing agencies, built on the headhunter pipeline, with a composite score weighted by signal strength, source reputation, recency, and ICP fit.","People Sonar",[12,34,121,128,51,100,35,53,14],"people-search",{"path":130,"title":131,"description":132,"group":8,"section":126,"order":22,"tags":133,"lastUpdated":54},"\u002Fagents\u002Fpeople-sonar\u002Fpeople-signal-monitoring","People Signals Monitoring","Forward-looking design for the push layer that tracks known people - champions, past contacts, target-company decision-makers - and fires a warm lead the moment they change jobs, get promoted, or their company has an event.",[14,51,60,119,63,134],"warm-leads",{"path":136,"title":137,"description":138,"group":139,"section":140,"order":22,"tags":141,"lastUpdated":143},"\u002Fengineering\u002Fguides\u002Fagent-execution-stack","The Agent Execution Stack","Durable workflows over pluggable agent backends — how AgencyCore runs AI agents on Inngest over a webhook-driven Claude Managed Agents backend.","Engineering","Guides",[12,142,14,25],"inngest","2026-06-25",{"path":145,"title":146,"description":147,"group":139,"section":140,"order":9,"tags":148,"lastUpdated":143},"\u002Fengineering\u002Fguides\u002Fagent-runtime","Agent runtime","How AgencyCore runs AI agents on a provider-neutral runtime — the abstraction layer that lets us swap the agent backend, with Claude managed agents as the current provider.",[12,149,14,150,151,152,25],"runtime","anthropic","claude","providers",{"path":154,"title":155,"description":156,"group":139,"section":21,"order":157,"tags":158,"lastUpdated":160},"\u002Fengineering\u002Freference\u002Fagno-to-agent-sdk-migration","Agno → Claude Agent SDK migration","System-design spec for moving the ac-python-api workflow engine off Agno onto Anthropic's Claude Agent SDK \u002F Managed Agents, tiered by control-flow shape.",10,[12,14,159,52,65],"migration","2026-06-06",{"path":162,"title":163,"description":164,"group":139,"section":21,"order":22,"tags":165,"lastUpdated":54},"\u002Fengineering\u002Freference\u002Fcloudflare-agent-sandbox","Cloudflare agent sandbox","Cloudflare's Workers-based agent platform, evaluated as an alternative sandbox for our Agno workflows.",[12,166,167,168,159],"sandbox","cloudflare","workers",{"path":170,"title":171,"description":172,"group":139,"section":21,"order":32,"tags":173,"lastUpdated":176},"\u002Fengineering\u002Freference\u002Fvirtual-filesystem-rag","Virtual filesystem for AI assistants","How ChromaFs provides AI agents with structured file access.",[12,174,14,175],"rag","chromafs","2026-04-18",{"path":178,"title":179,"description":180,"group":139,"section":181,"order":182,"tags":183,"lastUpdated":188},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fcapabilities\u002Fstate-and-knowledge","State and knowledge","What a run may know. One deterministic context builder over application state, knowledge and memory, one owner for every fact, and memory that is written through a tool.","Agentic platform",11,[184,185,186,11,187],"context","memory","knowledge","pgvector","2026-08-31",{"path":190,"title":191,"description":192,"group":139,"section":181,"order":157,"tags":193,"lastUpdated":201},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fcapabilities\u002Ftools-and-integrations","Tools and integrations","A tool is the one way an agent reaches the world. AgencyCore owns the model facing contract, the invoke path, the credentials and the result boundary.",[194,195,196,197,198,199,200],"tools","integrations","mcp","agno","policy","security","idempotency","2026-09-04",{"path":203,"title":204,"description":205,"group":139,"section":181,"order":22,"tags":206,"lastUpdated":210},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fcontract","Platform contract","One platform behind chat, interactive channels, triggers, approvals and background runs, with one Agno runtime, one tool layer, one state layer, and three cross-cutting planes.",[12,14,197,142,194,207,149,208,198,209],"skills","channels","observability","2026-09-02",{"path":212,"title":181,"description":213,"group":139,"section":214,"order":22,"tags":215,"lastUpdated":201},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform","The whole agentic platform on one page - who starts a run, the one boundary every run passes, how the work executes, and what comes back.","System design",[12,14,216,197,142,217,198],"overview","runs",{"path":219,"title":220,"description":221,"group":139,"section":181,"order":222,"tags":223,"lastUpdated":228},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Fagent-access","Agent access (CLI and MCP)","How an outside AI agent reaches AgencyCore. The ac CLI works today as a user seat. An MCP server is planned and not designed.",6,[224,196,12,151,225,226,227],"cli","access","auth","todo","2026-08-18",{"path":230,"title":231,"description":232,"group":139,"section":181,"order":233,"tags":234,"lastUpdated":239},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Fchannel-gateway","Channel gateway","The only layer that knows both an interactive channel and the platform. One message shape converges inbound, one intent shape diverges outbound, and no model call happens here.",3,[208,235,236,237,238,199],"slack","web","identity","sessions","2026-08-30",{"path":241,"title":242,"description":243,"group":139,"section":181,"order":244,"tags":245,"lastUpdated":210},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Ffront-door","Front door","The conversational control layer. It turns a request into one structured decision, then deterministic application code answers or hands work to RunManager.",4,[246,247,197,184,198,217],"front-door","routing",{"path":249,"title":250,"description":251,"group":139,"section":181,"order":32,"tags":252,"lastUpdated":259},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Fsurfaces","Surfaces","Every product surface and its API contract. Web chat goes through the gateway; every schema-native surface calls the domain API.",[253,254,24,255,256,257,258,217,64],"surfaces","api","approvals","prospects","saved-searches","builder","2026-09-03",{"path":261,"title":262,"description":263,"group":139,"section":181,"order":264,"tags":265,"lastUpdated":188},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Ftriggers","Triggers","A Run with no person. Every producer emits one Event, matching is deterministic, and dispatch reuses RunManager, Policy and Inngest.",5,[266,267,142,200],"triggers","events",{"path":269,"title":270,"description":271,"group":139,"section":181,"order":272,"tags":273,"lastUpdated":259},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fplanes\u002Fidempotency","Idempotency","One durable PostgreSQL key service prevents duplicate effects and freezes mutable input before selected Run starts. A Run start is guarded by a unique index on the Run row.",14,[200,217,194,274,275],"webhooks","reliability",{"path":277,"title":278,"description":279,"group":139,"section":181,"order":280,"tags":281,"lastUpdated":285},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fplanes\u002Fobservability-and-operations","Observability and operations","One run row, one span tree and one usage meter. Sentry reports system failure; AgencyCore spans explain what the agent did.",13,[209,217,282,283,64,284],"spans","usage","sentry","2026-08-26",{"path":287,"title":288,"description":289,"group":139,"section":181,"order":290,"tags":291,"lastUpdated":295},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fplanes\u002Fpolicy-and-governance","Policy and governance","One deterministic plane answers may this happen, at three checkpoints, with one grant model, one approval model and one decision log.",12,[198,292,255,293,294],"permissions","limits","governance","2026-08-25",{"path":297,"title":6,"description":298,"group":139,"section":299,"order":22,"tags":300,"lastUpdated":210},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fagentic-crm","The AgencyCore CRM loop for turning signals and discovery into qualified organization prospects, CRM relationships and outreach.","Agentic products",[11,301,51,302,256,35,303,304,87],"lead-generation","intelligence","signals-search","email-sequence",{"path":306,"title":307,"description":308,"group":139,"section":299,"order":264,"tags":309,"lastUpdated":188},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fbuilder-chat","Front door builder chat","Conversational authoring for organization-specific Agent and Workflow definitions, entered through the normal Front Door and backed by the existing DefinitionService.",[310,311,246,12,312,313,198],"authoring","definitions","workflows","templates",{"path":315,"title":316,"description":317,"group":139,"section":181,"order":318,"tags":319,"lastUpdated":201},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fcapability-contracts","Company, People and Signals contracts","The five Phase 7 product capabilities, their bounded inputs, stable references, permissions and results.",21,[320,321,119,51,322],"capabilities","company","contracts",{"path":324,"title":325,"description":326,"group":139,"section":181,"order":327,"tags":328,"lastUpdated":330},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fcapability-scenarios","Capability design scenarios","Normal, failure and recovery cases for the Phase 7 capability contracts, with implementation owners.",22,[320,329,321,119,51],"validation","2026-09-05",{"path":332,"title":333,"description":334,"group":139,"section":299,"order":233,"tags":335,"lastUpdated":210},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Femail-sequence","Email sequence workflow","Envoy durable outreach for one or many people, with fresh context, approvals, reply waits, follow-ups and Nylas transport.",[336,87,34,142,93,255],"email",{"path":338,"title":339,"description":340,"group":139,"section":299,"order":244,"tags":341,"lastUpdated":188},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fgeneral-chat","Front door general chat","The default conversational answer path for AgencyCore. It answers from supplied context, cites what it used, asks when context is insufficient, and delegates real work through the normal Front Door.",[24,246,186,184,247,342],"citations",{"path":344,"title":345,"description":346,"group":139,"section":299,"order":222,"tags":347,"lastUpdated":188},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fhuman-review","Human review inbox","One product page for every agentic action that is paused because a person must authorize an exact proposal. It is a view over the shared approval primitive, not a second review system.",[348,255,349,198,12],"human-review","inbox",{"path":351,"title":352,"description":353,"group":139,"section":299,"order":32,"tags":354,"lastUpdated":259},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fsignals-search","Signals Search","One bounded discovery workflow that finds companies, verifies signals, finds relevant people, and produces evidence-backed organization prospects without prematurely creating CRM records.",[303,355,36,119,51,302,256,11,35],"discovery",{"path":357,"title":358,"description":359,"group":139,"section":299,"order":360,"tags":361,"lastUpdated":188},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fworkflow-visualizer","Workflow visualizer","One constrained workflow graph, reused to author a draft, read a published definition, and watch a Run. Build mode edits the draft; run mode overlays Run and span state on the frozen snapshot.",7,[312,362,258,311,217,282,363,255],"visualizer","graph",{"path":365,"title":366,"description":367,"group":139,"section":181,"order":368,"tags":369,"lastUpdated":201},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fruntime\u002Fdefinitions","Runtime definitions","Editable drafts, one published configuration per definition, template forks, deterministic validation, and the Run snapshot that keeps in flight work stable.",8,[149,311,329,370],"publishing",{"path":372,"title":373,"description":374,"group":139,"section":181,"order":375,"tags":376,"lastUpdated":259},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fruntime\u002Fexecution","Runtime execution","The Run record, the Inngest step boundaries, agent segments, workflow nodes, approvals, cancellation, failure handling and live events.",9,[149,217,197,142,255,377,64],"cancellation",{"path":379,"title":380,"description":381,"group":139,"section":181,"order":360,"tags":382,"lastUpdated":285},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fruntime","Agentic runtime","One Run contract, one Agno agent runtime, one deterministic workflow model, and the component boundaries that keep the framework replaceable.",[149,217,197,312,207,142],{"path":384,"title":385,"description":386,"group":139,"section":387,"order":244,"tags":388,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Fcompany-context","Company context","L3. Company state, knowledge and memory are three different things. One deterministic builder turns them into one brief.","Mission Control",[389,390,186,185,184,391,11],"mission-control","company-state","retrieval","2026-08-12",{"path":394,"title":395,"description":396,"group":139,"section":387,"order":22,"tags":397,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Fexperience","Experience","L6. Where a person observes and controls the company, and the one rule that keeps the UI out of the business.",[389,398,399,255,400],"ui","control-plane","activity",{"path":402,"title":403,"description":404,"group":139,"section":387,"order":222,"tags":405,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Ffoundation","Foundation","L1. Generic infrastructure with no business logic in it. The test is that another product could run on it unchanged.",[389,406,407,408,267,409,226,209],"infrastructure","database","queue","storage",{"path":411,"title":387,"description":412,"group":139,"section":214,"order":233,"tags":413,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control","The internal Company OS. Six layers and one policy plane put a person in control of company state and of autonomous execution.",[389,414,14,12,312,198,399],"company-os",{"path":416,"title":417,"description":418,"group":139,"section":387,"order":32,"tags":419,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Fintelligence","Intelligence","L5. The agent is the primitive. A skill is how it works, a tool is how it reaches the world, and the two are never the same thing.",[389,12,207,420,421],"planning","reasoning",{"path":423,"title":424,"description":425,"group":139,"section":387,"order":368,"tags":426,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Fmetrics-and-connectors","Metrics and connectors","A worked example across every layer. Three vendors, one metric pipeline, three views, and the rule that decides what we store.",[389,427,195,428,429,284,430,431],"metrics","stripe","posthog","ingest","dashboards",{"path":433,"title":434,"description":435,"group":139,"section":387,"order":233,"tags":436,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Forchestration","Orchestration","L4. Workflow, run, step, trigger and event. Five nouns that turn a decision into durable execution.",[389,312,217,266,267,437,438],"durability","retry",{"path":440,"title":288,"description":441,"group":139,"section":387,"order":360,"tags":442,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Fpolicy-and-governance","A plane, not a layer. One place decides what an agent may do, under what conditions, and how much. Human approval is one of its three answers.",[389,198,294,255,292,293,443],"audit",{"path":445,"title":191,"description":446,"group":139,"section":387,"order":264,"tags":447,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Ftools-and-integrations","L2. One contract for every capability. The tool is the only route to the world, and it is where policy, audit and tenancy meet.",[389,194,195,448,449,450],"adapters","registry","credentials",{"path":452,"title":453,"description":454,"group":139,"section":455,"order":22,"tags":456,"lastUpdated":210},"\u002Fengineering\u002Fsystem-design\u002Fworkflows\u002Fcompany-search","Company search","Implementation notes for company.search. Search resolves and gates company identities; enrichment is a separate capability.","Workflows",[321,457,142,42],"search",{"path":459,"title":31,"description":460,"group":139,"section":455,"order":233,"tags":461,"lastUpdated":210},"\u002Fengineering\u002Fsystem-design\u002Fworkflows\u002Fenrichment","Reusable company and people enrichment workflows with canonical Intelligence write-back, existing tier freshness and bounded asynchronous email.",[35,321,119,142],{"path":463,"title":464,"description":465,"group":139,"section":455,"order":32,"tags":466,"lastUpdated":259},"\u002Fengineering\u002Fsystem-design\u002Fworkflows\u002Fpeople-search","People search","Implementation notes for people.search. Bounded company scope and persona gates return selectable person identities without enrichment.",[119,457,142,100],{"path":468,"title":469,"description":470,"group":139,"section":455,"order":244,"tags":471,"lastUpdated":474},"\u002Fengineering\u002Fsystem-design\u002Fworkflows\u002Fsignals-search","Signals search","Superseded. The earlier on-demand buying-signal search component, kept as a record of the design that the agentic platform Signals Search workflow replaces.",[51,12,142,472,473],"intelligence-databases","superseded","2026-08-28",{"path":476,"title":477,"description":478,"group":479,"section":480,"order":481,"tags":482,"lastUpdated":66},"\u002Flearnings\u002Fagentic-sdlc","The agentic SDLC","How AI agents move from autocomplete to owning the loop across the software lifecycle, and why that shifts the bottleneck from coding to verification.","Learnings",null,30,[12,483,484,485,486],"sdlc","engineering","verification","review",{"path":488,"title":489,"description":490,"group":479,"section":480,"order":491,"tags":492,"lastUpdated":498},"\u002Flearnings\u002Fagi-to-asi","From AGI to ASI","What lies beyond human-level AI. The four technological pathways from AGI to artificial superintelligence, the formal ceiling that bounds them, and the six bottlenecks that could stall the climb - distilled from the DeepMind report.",50,[493,494,495,496,497],"ai-futures","asi","agi","scaling","recursive-self-improvement","2026-06-19",{"path":500,"title":501,"description":502,"group":479,"section":480,"order":503,"tags":504,"lastUpdated":66},"\u002Flearnings\u002Fai-native-company-playbook","AI native company playbook","Why AI should be the operating system your company runs on, not a tool it uses, and the concrete practices that follow - closed loops, a queryable org, software factories, and token maxing.",40,[505,506,12,507,508],"ai-native","company-building","gtm","founders",{"path":510,"title":511,"description":512,"group":479,"section":480,"order":157,"tags":513,"lastUpdated":54},"\u002Flearnings\u002Fbuying-intent-signals","Buying intent signals","How buyers leak their intent before they ever fill in a form, and how to read those signals before the window closes.",[514,51,507,515],"intent","sales",{"path":517,"title":518,"description":519,"group":479,"section":480,"order":520,"tags":521,"lastUpdated":54},"\u002Flearnings\u002Fcold-outbound-system","Cold outbound system","A high-level study of an open-source 29-skill cold email system, organized into five sequential tracks from ICP to iteration.",20,[522,523,507,524],"outbound","cold-email","systems",{"path":526,"title":527,"description":528,"group":479,"section":480,"order":529,"tags":530,"lastUpdated":532},"\u002Flearnings\u002Fswan-gtm-skills-architecture","Swan GTM skills architecture","A research note on Swan AI's foundations and maps model for GTM agents, with ASCII diagrams and ideas AgencyCore can borrow.",60,[507,12,73,531,14],"swan","2026-07-01",{"path":534,"title":535,"description":536,"group":387,"section":480,"order":272,"tags":537,"lastUpdated":43},"\u002Fmission-control\u002Fciops-agent","CIOps agent","High-level system architecture and design notes for the Mission Control CIOps agent.",[389,12,538,14],"ciops",{"path":540,"title":541,"description":542,"group":387,"section":480,"order":182,"tags":543,"lastUpdated":43},"\u002Fmission-control\u002Fcostops-agent","CostOps agent","High-level system architecture and design notes for the Mission Control CostOps agent.",[389,12,544,14],"finops",{"path":546,"title":547,"description":548,"group":387,"section":480,"order":520,"tags":549,"lastUpdated":54},"\u002Fmission-control\u002Fdashboard","Dashboard","The Mission Control product UI - a dark cockpit with a fleet-nav rail, company-state grid, a working escalation queue, live ledger and a global kill switch.",[389,12,550,398],"dashboard",{"path":552,"title":553,"description":554,"group":387,"section":480,"order":280,"tags":555,"lastUpdated":43},"\u002Fmission-control\u002Fproduct-analytics-agent","ProductAnalytics agent","High-level system architecture and design notes for the Mission Control ProductAnalytics agent.",[389,12,556,14],"product-analytics",{"path":558,"title":559,"description":560,"group":387,"section":480,"order":290,"tags":561,"lastUpdated":43},"\u002Fmission-control\u002Frevenueops-agent","RevenueOps agent","High-level system architecture and design notes for the Mission Control RevenueOps agent.",[389,12,562,14],"revops",{"path":564,"title":214,"description":565,"group":387,"section":480,"order":157,"tags":566,"lastUpdated":54},"\u002Fmission-control\u002Fsystem-design","One screen for the whole company, watched by a guardrailed fleet of ops agents that explain, propose, act and learn overnight.",[389,12,544,14],{"path":568,"title":569,"description":570,"group":571,"section":480,"order":32,"tags":572,"lastUpdated":578},"\u002Fproduct-design\u002Fonboarding-flow","Onboarding flow","Product design for the signup wizard and how TAM building folds into it. Analyzes the flow today (account, profile, company), the gap (no ICP, empty dashboard), and the integration of a new \"who you sell to\" ICP step plus a build-and-reveal screen that lands the user on a populated, ranked list.","Product Design",[573,61,574,575,576,577],"onboarding","tam","activation","ux","user-journey","2026-06-11",{"path":580,"title":581,"description":582,"group":571,"section":480,"order":233,"tags":583,"lastUpdated":592},"\u002Fproduct-design\u002Fpricing-entitlements","Pricing tiers, entitlements and usage credits","Specification for subscription tiers with gated platform access: composable plan entitlements, a unified usage-credit currency, plan-sourced limits, per-module trials and a two-ticket delivery plan built on the Stripe billing foundation. Written for discussion; the Linear document is the canonical copy with ticket links.",[584,585,586,587,588,589,590,591],"pricing","entitlements","billing","credits","subscriptions","plans","seats","trials","2026-07-06",{"path":594,"title":595,"description":596,"group":571,"section":480,"order":233,"tags":597,"lastUpdated":578},"\u002Fproduct-design\u002Fsales-signals-ux","Designing Signals","Product design for the sales-signals experience in ac-frontend: the 14-type taxonomy and its color system, the anatomy of a signal card across four densities, the 0-10 lead score scale, the origin tag (sonar pull vs proactive push), the seven surfaces where signals render (launchpad, sonar app, company detail, timeline, activities, data layer, Envoy), and the interaction rules that keep them consistent.",[51,576,598,11,42,599,600,601,602],"design-system","lead-score","origin","pull","push",{"path":604,"title":605,"description":606,"group":607,"section":608,"order":244,"tags":609,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Factivities","Activities","Deep dive on crm_activities, the interaction + task log of the CRM — where it is served from, how a row is born and read, and its full schema, relationships and rules.","Proprietary data","CRM",[11,610,611,612,613],"activities","tasks","data-model","schema",{"path":615,"title":616,"description":617,"group":607,"section":608,"order":264,"tags":618,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Fcommunications","Communications","Deep dive on crm_communications and crm_communication_events, the unified email\u002Fcall\u002Fmessage log and its per-message engagement tracking — where it is served from, the outbound message lifecycle, and the full schema, relationships and rules.",[11,619,336,620,612],"communications","engagement",{"path":622,"title":623,"description":624,"group":607,"section":608,"order":22,"tags":625,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Fcompanies","Companies","Deep dive on crm_companies, the account record at the centre of the CRM — where it is served from, how a row is born and read, and its full schema, relationships and rules.",[11,36,612,613,14],{"path":627,"title":628,"description":629,"group":607,"section":608,"order":233,"tags":630,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Fdeals","Deals","Deep dive on the deal pipeline — crm_deals, crm_pipeline_stages and crm_pipeline_config. Where it is served from, the life of a deal, and its full schema, relationships and rules.",[11,631,632,612,613],"deals","pipeline",{"path":634,"title":635,"description":636,"group":607,"section":608,"order":222,"tags":637,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Flists","Lists","Deep dive on crm_lists and crm_list_members, the static or dynamic member collections of the CRM — where they are served from, how a list and its members come to be and are read, and their schema, relationships and rules.",[11,638,639,612,613],"lists","segments",{"path":641,"title":642,"description":643,"group":607,"section":608,"order":32,"tags":644,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Fpeople","People","Deep dive on crm_people, the contact record of the CRM — where it is served from, how a row is born and read, and its full schema, relationships and rules.",[11,119,645,612,613],"contacts",{"path":647,"title":648,"description":649,"group":607,"section":608,"order":368,"tags":650,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Fsaved-filters","Saved filters","Deep dive on crm_saved_filters, the named reusable filter snapshots over the company, person and signal list views — where it is served from, how a saved view is born and applied, and its full schema, relationships and rules.",[11,651,652,612,613],"saved-filters","views",{"path":654,"title":655,"description":656,"group":607,"section":608,"order":360,"tags":657,"lastUpdated":578},"\u002Fproprietary-data\u002Fcrm\u002Fsignals","Signals","Deep dive on the signals tables - signals, company_signals and person_signals, the CRM's sales-intelligence layer. Where signals are served from, how one is born and attached, and the full schema, relationships and rules.",[11,51,302,612,613],{"path":659,"title":660,"description":661,"group":607,"section":662,"order":22,"tags":663,"lastUpdated":43},"\u002Fproprietary-data\u002Fintelligence-databases\u002Fcompany-intelligence-database","Company Intelligence Database","Decided architecture for ENG-669, the cross-org company intelligence layer that acts as a read-through cache in front of enrichment providers, with public-facts-only privacy and provenance-tracked write-back.","Intelligence databases",[14,60,36,51,38,664],"eng-669",{"path":666,"title":667,"description":668,"group":607,"section":662,"order":244,"tags":669,"lastUpdated":578},"\u002Fproprietary-data\u002Fintelligence-databases\u002Forg-signal-feed","Org Signal Feed","The per-org activation layer on top of the shared signals store. One immutable intel_signals row fans out to many orgs through scoring (signal-type weight times ICP fit times recency decay) and materializes as ranked, tiered rows in intel_org_signal_feed - the only org-scoped, RLS-per-org table of the signal stack, the door the launchpad, inbox and digest all read through. Signals enter by two ingest classes - a user's sonar pull (ungated) or an automated push (gated by threshold plus an optional competitor-ICP check) - logged in intel_signal_ingests, and each feed row records its origin.",[14,60,51,670,53,671,672,575,430,601,602,600],"feed","decay","rls",{"path":674,"title":675,"description":676,"group":607,"section":662,"order":32,"tags":677,"lastUpdated":578},"\u002Fproprietary-data\u002Fintelligence-databases\u002Fpeople-intelligence-database","People Intelligence Database","Decided architecture for the cross-org people intelligence layer - a read-through cache in front of headhunter research and Hunter email lookups, with LinkedIn-URL identity, append-only employment edges, per-tier freshness stamps on the flat profile, shared intel_sources provenance, unified intel_signals, and a GDPR erasure path.",[14,60,119,51,38,100],{"path":679,"title":680,"description":681,"group":607,"section":662,"order":233,"tags":682,"lastUpdated":578},"\u002Fproprietary-data\u002Fintelligence-databases\u002Fsignals-intelligence-database","Signals Intelligence Database","Decided v1 architecture for the unified signal store - one polymorphic append-only intel_signals table that holds both company and person signals, with a shared taxonomy, source-ranked provenance, an intel_signal_ingests log that records which pipeline found each signal, decay at read time, and a person-to-company rollup so a champion job change surfaces on the company feed.",[14,60,51,683,671,684,670,685,41,601,602],"polymorphic","taxonomy","ingests",{"path":687,"title":688,"description":689,"group":607,"section":480,"order":9,"tags":690,"lastUpdated":16},"\u002Fproprietary-data\u002Foverview","Data Layer Overview","The AgencyCore data layer in one map - the org-scoped CRM plane in production today and the global intelligence plane designed to sit in front of it, with interactive diagrams of both, the end-to-end data flow, freshness and precedence rules, the privacy seam, and the rollout path.",[691,14,60,11,51,38,25,216],"data-layer",{"path":693,"title":694,"description":695,"group":696,"section":480,"order":9,"tags":697,"lastUpdated":54},"\u002Froadmap","Roadmap - June 2026","June 2026 product plan across four themes. The spine is moving our agents onto an isolated sandbox runtime and rebuilding the core agents and workflows on it, then standing up a read-through intelligence data store and shipping the Stripe billing system. Knowledge base, assistant, and credit tracking carry into the July roadmap.","Roadmap",[698,420],"roadmap",{"path":700,"title":701,"description":702,"group":696,"section":480,"order":22,"tags":703,"lastUpdated":54},"\u002Froadmap\u002Fjuly-2026","Roadmap - July 2026","July 2026 product plan across three themes, all carried over from June. Building on June's sandbox runtime, July grounds the agents in a knowledge base, launches the AI chat assistant, and meters every action with per-action credit tracking that reconciles into the Stripe billing system shipped in June.",[698,420],{"path":705,"title":706,"description":707,"group":696,"section":480,"order":32,"tags":708,"lastUpdated":532},"\u002Froadmap\u002Fjune-2026-slides","Roadmap slides - June 2026","Board-review slide deck for the June 2026 product roadmap, rendered directly from the original PPTX in the docs site.",[698,420,709],"slides",{"path":711,"title":712,"description":713,"group":714,"section":8,"order":520,"tags":715,"lastUpdated":16},"\u002Fsymphony\u002Fagents\u002Fdevops-agent","DevOps agent","Interactive design for a Slack-first Symphony DevOps agent that wraps production promotion, rollback, audit, and operational jobs behind policy gates, typed runbooks, and an auditable ledger.","Symphony",[716,235,717,718,719,720],"symphony","devops","production","runbooks","operations",{"path":722,"title":723,"description":724,"group":714,"section":8,"order":157,"tags":725,"lastUpdated":16},"\u002Fsymphony\u002Fagents\u002Foncall-agent","Oncall agent","Interactive design for a Symphony oncall agent that turns Sentry incidents into rich Linear tickets, investigates with Codex, opens fix PRs, and resolves Sentry after merge.",[716,284,726,727,728,729],"linear","oncall","incident-response","codex",{"path":731,"title":732,"description":733,"group":714,"section":734,"order":157,"tags":735,"lastUpdated":16},"\u002Fsymphony\u002Fhousekeeping\u002Fcodex-vacuum","Codex vacuum","Interactive design for the Symphony housekeeping timer that checkpoints and vacuums Codex sqlite stores on the VPS.","Housekeeping",[716,736,737,729,738,739],"timed-jobs","housekeeping","sqlite","vps",{"path":741,"title":742,"description":743,"group":714,"section":734,"order":481,"tags":744,"lastUpdated":16},"\u002Fsymphony\u002Fhousekeeping\u002Fhost-cleanup","Host cleanup","Interactive design for the Symphony housekeeping timer that removes stale \u002Ftmp debris, vacuums the journal, and optionally cleans the apt package cache.",[716,736,737,739,745,746],"disk","cleanup",{"path":748,"title":749,"description":750,"group":714,"section":734,"order":520,"tags":751,"lastUpdated":16},"\u002Fsymphony\u002Fhousekeeping\u002Fworkspace-cleanup","Workspace cleanup","Interactive design for the Symphony housekeeping timer that prunes idle per-issue workspaces after their TTL.",[716,736,737,752,746,739],"workspaces",{"path":754,"title":755,"description":756,"group":714,"section":480,"order":9,"tags":757,"lastUpdated":66},"\u002Fsymphony","Symphony orchestration","How AgencyCore runs OpenAI Symphony as a long-running daemon that turns Linear tickets into isolated, autonomous Codex runs, reviewed by Claude and merged by humans. High-level workflow, system architecture, and the engineer playbook.",[716,729,726,758,111,739,759,760],"claude-review","qa","automation",{"path":762,"title":763,"description":764,"group":714,"section":214,"order":22,"tags":765,"lastUpdated":392},"\u002Fsymphony\u002Fsystem-design\u002Fhigh-level-design","High-level design","The Symphony daemon end to end — the standing agent workforce and its label-routed workflows, then the runtime that polls, dispatches, runs and writes back.",[716,14,111,12,729,726,766],"systemd",{"path":768,"title":769,"description":770,"group":714,"section":771,"order":503,"tags":772,"lastUpdated":16},"\u002Fsymphony\u002Ftimed-jobs\u002Fdaily-security-agent","Daily security agent","Interactive design for a report-only Symphony timed job that reviews the last 24h of commits, scans the system for vulnerabilities, and opens focused follow-up tickets.","Timed jobs",[716,199,736,729,773,774,775],"semgrep","threat-model","ownership",{"path":777,"title":778,"description":779,"group":714,"section":771,"order":481,"tags":780,"lastUpdated":16},"\u002Fsymphony\u002Ftimed-jobs\u002Fdaily-sentry-triage","Daily Sentry triage","Interactive design for the Symphony timed job that performs read-only Sentry triage, deduplicates existing tracked clusters, and creates focused ENG bugs for new actionable errors.",[716,736,284,209,781,726],"triage",{"path":783,"title":784,"description":785,"group":714,"section":771,"order":157,"tags":786,"lastUpdated":16},"\u002Fsymphony\u002Ftimed-jobs\u002Fnightly-local-staging-e2e","Nightly local staging E2E","Interactive design for the Symphony timed job that seeds local Supabase, runs ac-frontend Playwright E2E against the local staging stack, uploads evidence, and cleans artifacts.",[716,736,787,788,789,790],"e2e","playwright","staging","frontend",{"path":792,"title":793,"description":794,"group":714,"section":771,"order":520,"tags":795,"lastUpdated":16},"\u002Fsymphony\u002Ftimed-jobs\u002Fnightly-staging-qa","Nightly staging QA","Interactive design for the Symphony timed job that seeds a staging QA Linear issue, runs an agent-browser crawl, validates feature-map coverage, and files focused follow-up work.",[716,736,789,759,796,726],"agent-browser",{"id":798,"title":380,"body":799,"customComponent":480,"description":381,"extension":3845,"group":139,"lastUpdated":285,"meta":3846,"navigation":1565,"order":360,"path":379,"related":3847,"section":181,"seo":3850,"stem":3851,"tags":3852,"__hash__":3853},"docs\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fruntime\u002Findex.md",{"type":800,"value":801,"toc":3821},"minimark",[802,806,819,822,869,876,881,886,897,904,920,954,972,1002,1025,1044,1048,1234,1238,1241,1247,1332,1344,1347,1372,1379,1383,1389,1413,1416,1425,1431,1435,1438,1454,1457,1480,1515,1521,1526,1805,1818,1840,1843,1852,1869,1878,1894,1898,1927,1942,1945,1954,1958,1961,2033,2058,2086,2099,2109,2125,2144,2148,2154,2198,2210,2216,2236,2258,2285,2292,2334,2343,2415,2421,2427,2430,2439,2449,2463,2476,2497,2501,2504,2572,2581,2625,2649,2673,2682,2775,2798,2821,2827,2837,2847,2857,2860,2864,2867,2876,2915,2924,2927,2948,2953,2964,2973,2976,2982,2997,3001,3008,3018,3022,3025,3028,3150,3153,3157,3164,3171,3174,3177,3180,3197,3200,3204,3210,3227,3233,3246,3278,3285,3337,3350,3354,3545,3549,3817],[803,804,380],"h1",{"id":805},"agentic-runtime",[807,808,809,810,814,815,818],"p",{},"The front door and the triggers decide ",[811,812,813],"strong",{},"what"," must run. The runtime decides ",[811,816,817],{},"how"," to run it.",[807,820,821],{},"This page holds the architecture: the components, the boundaries, and the Run contract. Two sibling pages hold the rest.",[823,824,825,838],"table",{},[826,827,828],"thead",{},[829,830,831,835],"tr",{},[832,833,834],"th",{},"Page",[832,836,837],{},"Owns",[839,840,841,850,860],"tbody",{},[829,842,843,847],{},[844,845,846],"td",{},"Agentic runtime (this page)",[844,848,849],{},"Components, boundaries, Run contract, Agno boundary, workflow model",[829,851,852,857],{},[844,853,854],{},[855,856,366],"a",{"href":365},[844,858,859],{},"Draft, validate, publish, snapshot",[829,861,862,866],{},[844,863,864],{},[855,865,373],{"href":372},[844,867,868],{},"Run record, Inngest steps, waits, approvals, cancellation, failure, live events",[807,870,871,872,875],{},"V1 has ",[811,873,874],{},"one agent runtime: Agno",". There is no runtime registry and no backend router.",[877,878],"doc-diagram",{"caption":879,"name":880},"The runtime layer on one page, in four acts. A definition becomes runnable only by being published, and the run freezes it — which is why in-flight work is stable and why a revocation still bites at once. RunManager is the only component that may create or control a run, and the run insert is its own duplicate guard. Inngest owns the durability: one function per run, one step per segment or node, and two lanes so a batch cannot starve a person. The agent side is built to survive a restart; the workflow side coordinates. The last band is everything that ends a run, including the three backstops that each cover what the others cannot.","2-runtime",[882,883,885],"h2",{"id":884},"component-map","Component map",[887,888,894],"pre",{"className":889,"code":891,"language":892,"meta":893},[890],"language-text","Front door \u002F Trigger\n      │  StartRunCommand\n      ▼\n  RunManager ──────────► agent.runs\n      │  dispatch event\n      ▼\n   Inngest  (one function: run.execute)\n      │\n      ▼\n  RunExecutor\n   ┌──┴──────────────────┐\n   ▼                     ▼\nAgentExecutor       WorkflowExecutor\n   │                     │\n   ▼                     ▼\nAgentRuntime        WorkflowStepExecutor\n   │                     │\n   ▼                     ├──► ToolInvoker\nAgnoAgentRuntime         └──► child Run (Inngest invoke)\n   │\n   └──► ToolInvoker\n","text","",[895,896,891],"code",{"__ignoreMap":893},[807,898,899,900,903],{},"Both executors reach the world through the same ",[895,901,902],{},"ToolInvoker",". Nothing else calls a tool handler.",[807,905,906,916,917,919],{},[811,907,908,911,912,915],{},[895,909,910],{},"RunExecutor"," holds no loop, so it answers no ",[895,913,914],{},"ExecutionOutcome","."," The Inngest\nfunction owns the segment loop, and each segment step answers its own outcome.\n",[895,918,910],{}," therefore has two jobs and two methods.",[887,921,925],{"className":922,"code":923,"language":924,"meta":893,"style":893},"language-python shiki shiki-themes github-dark","class RunExecutor:\n    async def claim(self, run_id: UUID, organization_id: UUID,\n                    execution_ref: dict) -> Run | None: ...\n    def executor_for(self, run: Run, *,\n                     steps: WorkflowSteps | None = None) -> SegmentExecutor: ...\n","python",[895,926,927,934,939,944,949],{"__ignoreMap":893},[928,929,931],"span",{"class":930,"line":22},"line",[928,932,933],{},"class RunExecutor:\n",[928,935,936],{"class":930,"line":32},[928,937,938],{},"    async def claim(self, run_id: UUID, organization_id: UUID,\n",[928,940,941],{"class":930,"line":233},[928,942,943],{},"                    execution_ref: dict) -> Run | None: ...\n",[928,945,946],{"class":930,"line":244},[928,947,948],{},"    def executor_for(self, run: Run, *,\n",[928,950,951],{"class":930,"line":264},[928,952,953],{},"                     steps: WorkflowSteps | None = None) -> SegmentExecutor: ...\n",[807,955,956,959,960,963,964,967,968,971],{},[895,957,958],{},"claim()"," answering ",[895,961,962],{},"None"," ends the function, which is why nothing here returns a\nvalue meaning \"do nothing\". ",[895,965,966],{},"executor_for()"," reads ",[895,969,970],{},"run.kind",", and both kinds\nresolve. There is no second dispatch protocol.",[807,973,974,977,978,981,982,985,986,989,990,993,994,998,999,1001],{},[811,975,976],{},"The workflow side is a factory, and the agent side is not."," ",[895,979,980],{},"AgentExecutor"," is\none object for the whole worker. A workflow coordinator cannot be, because\n",[895,983,984],{},"WorkflowSteps"," closes over ",[895,987,988],{},"ctx.step"," and ",[895,991,992],{},"ctx"," exists only inside one function\ncall. So the cached graph holds what ",[995,996,997],"em",{},"builds"," a coordinator, and ",[895,1000,966],{},"\ntakes the seam of this function run and passes it through. A workflow Run arriving\nwith no seam names a defect in the caller, because the function reads the kind off\nthe memoized claim before it creates any step.",[807,1003,1004,1007,1008,1011,1012,1014,1015,1018,1019,1021,1022,915],{},[811,1005,1006],{},"The function owns the segment loop. It does not own the node walk."," A workflow\nis a tree, so a walk in the function would need a durable stack of its own.\n",[895,1009,1010],{},"WorkflowExecutor"," holds the recursion, and it creates one durable step per node\nthrough the ",[895,1013,984],{}," seam. A node answers a ",[895,1016,1017],{},"NodeOutcome",", never an\n",[895,1020,914],{},": only the run ends, so only the run names a ",[895,1023,1024],{},"next_status",[807,1026,1027,1028,1031,1032,1035,1036,1039,1040,1043],{},"⚠️ ",[811,1029,1030],{},"The walk cannot sit inside a step of the function."," The SDK refuses a nested\nstep: it answers ",[895,1033,1034],{},"STEP_NESTED",", which is ",[811,1037,1038],{},"not retriable",". So ",[895,1041,1042],{},"run.execute"," reads\nthe kind off the claim and branches above every step. An agent segment is one step\nthis function creates; a workflow walk creates its own, between the claim and the\nfinalize.",[882,1045,1047],{"id":1046},"core-ownership","Core ownership",[823,1049,1050,1060],{},[826,1051,1052],{},[829,1053,1054,1057],{},[832,1055,1056],{},"Owner",[832,1058,1059],{},"Responsibility",[839,1061,1062,1091,1099,1108,1133,1142,1154,1163,1173,1188,1202,1210,1218],{},[829,1063,1064,1069],{},[844,1065,1066],{},[895,1067,1068],{},"RunManager",[844,1070,1071,1072,1075,1076,1075,1079,1075,1082,1075,1085,989,1088],{},"Run lifecycle, admission, and the start and control boundary. The only writer of ",[895,1073,1074],{},"status",", ",[895,1077,1078],{},"waiting_on",[895,1080,1081],{},"waiting_ref_id",[895,1083,1084],{},"ended_at",[895,1086,1087],{},"segment_index",[895,1089,1090],{},"resumed_from_wait",[829,1092,1093,1096],{},[844,1094,1095],{},"Inngest",[844,1097,1098],{},"Durable dispatch, retry, wait, timeout, concurrency, cancellation",[829,1100,1101,1105],{},[844,1102,1103],{},[895,1104,910],{},[844,1106,1107],{},"Claim the Run and dispatch it by kind. Once per function run, and nothing else. The workflow side is a factory, because a coordinator closes over the step seam of one call",[829,1109,1110,1114],{},[844,1111,1112],{},[895,1113,980],{},[844,1115,1116,1117,1120,1121,1123,1124,1075,1127,989,1130,1132],{},"Re-read the Run, check accrual, subtract the ceilings, build the context brief, call ",[895,1118,1119],{},"AgentRuntime",", and map its result to an ",[895,1122,914],{},". Its seams are ",[895,1125,1126],{},"AccrualChecker",[895,1128,1129],{},"ContextBuilder",[895,1131,1119],{},". The tool contracts are the frozen snapshot, so nothing builds them",[829,1134,1135,1139],{},[844,1136,1137],{},[895,1138,1119],{},[844,1140,1141],{},"Framework neutral agent loop interface",[829,1143,1144,1149],{},[844,1145,1146],{},[895,1147,1148],{},"AgnoAgentRuntime",[844,1150,1151,1152],{},"The V1 implementation of ",[895,1153,1119],{},[829,1155,1156,1160],{},[844,1157,1158],{},[895,1159,1010],{},[844,1161,1162],{},"Walk the node tree of one workflow deterministically, and create one durable step per node",[829,1164,1165,1170],{},[844,1166,1167],{},[895,1168,1169],{},"WorkflowStepExecutor",[844,1171,1172],{},"Execute one workflow node by type, and check accrual and cancellation before it",[829,1174,1175,1179],{},[844,1176,1177],{},[895,1178,984],{},[844,1180,1181,1182,989,1184,1187],{},"The durable step seam. One implementation wraps ",[895,1183,988],{},[895,1185,1186],{},"ctx.group","; the test one runs in process",[829,1189,1190,1195],{},[844,1191,1192],{},[895,1193,1194],{},"RunControlRepository",[844,1196,1197,1198,1201],{},"Read and write the ",[895,1199,1200],{},"agent.run_control"," cancellation row",[829,1203,1204,1207],{},[844,1205,1206],{},"Tool layer",[844,1208,1209],{},"Every external action and every on demand action",[829,1211,1212,1215],{},[844,1213,1214],{},"Policy",[844,1216,1217],{},"Admission, action and accrual decisions",[829,1219,1220,1223],{},[844,1221,1222],{},"Observability",[844,1224,1225,1226,1229,1230,1233],{},"Spans and usage. ",[895,1227,1228],{},"SpanRecorder"," is the one writer of ",[895,1231,1232],{},"heartbeat_at",", which is the single documented exception to the line above",[882,1235,1237],{"id":1236},"one-run-contract","One Run contract",[807,1239,1240],{},"A Run is the durable product unit. A span is one unit of work inside a Run.",[887,1242,1245],{"className":1243,"code":1244,"language":892,"meta":893},[890],"Workflow Run\n  ├─ span: tool, branch, wait, approval, parallel\n  └─ child Run: an agent or a nested workflow with its own lifecycle\n",[895,1246,1244],{"__ignoreMap":893},[823,1248,1249,1263],{},[826,1250,1251],{},[829,1252,1253,1256,1260],{},[832,1254,1255],{},"Unit",[832,1257,1259],{"align":1258},"right","Run row",[832,1261,1262],{"align":1258},"Span",[839,1264,1265,1275,1284,1299,1309,1321],{},[829,1266,1267,1270,1273],{},[844,1268,1269],{},"Top level agent",[844,1271,1272],{"align":1258},"yes",[844,1274,1272],{"align":1258},[829,1276,1277,1280,1282],{},[844,1278,1279],{},"Top level workflow",[844,1281,1272],{"align":1258},[844,1283,1272],{"align":1258},[829,1285,1286,1289,1292],{},[844,1287,1288],{},"Agent node or subworkflow node",[844,1290,1291],{"align":1258},"child Run",[844,1293,1294,1295,1298],{"align":1258},"yes, the child's own ",[895,1296,1297],{},"run"," span",[829,1300,1301,1304,1307],{},[844,1302,1303],{},"Tool, wait, branch, approval",[844,1305,1306],{"align":1258},"no",[844,1308,1272],{"align":1258},[829,1310,1311,1317,1319],{},[844,1312,1313,1316],{},[895,1314,1315],{},"parallel"," container",[844,1318,1306],{"align":1258},[844,1320,1272],{"align":1258},[829,1322,1323,1328,1330],{},[844,1324,1325,1316],{},[895,1326,1327],{},"sequence",[844,1329,1306],{"align":1258},[844,1331,1306],{"align":1258},[807,1333,1334,1337,1338,1340,1341,915],{},[811,1335,1336],{},"The node itself opens no span, and the third row is the child's."," None of the eight span kinds names such a node, and the set is closed. The child's ",[895,1339,1297],{}," span carries the node ID as its name and hangs from whatever span was current at the node, so the tree reads the same and there is no ninth kind. See ",[855,1342,1343],{"href":277},"observability and operations",[807,1345,1346],{},"Create a child Run when independent retry, cancellation, ownership or status matters. Do not create a Run row for every small deterministic step.",[807,1348,1349,1359,1360,1362,1363,1365,1366,1368,1369,1371],{},[811,1350,1351,1352,1355,1356,1358],{},"There is no ",[895,1353,1354],{},"merge"," node and no ",[895,1357,1354],{}," span."," The node table below holds eight types and none of them is a merge, and ",[855,1361,209],{"href":277}," lists eight span kinds and none of them is either. A ",[895,1364,1315],{}," node settles when its last branch settles, and the ",[895,1367,1315],{}," span already covers that join with its own start and end. A ",[895,1370,1327],{}," writes no span at all, because ordering adds no timing a person can use.",[807,1373,1374,1375,1378],{},"Every Run carries ",[895,1376,1377],{},"root_run_id",". A top level Run points at itself. This is what lets one client subscription follow a whole Run tree.",[882,1380,1382],{"id":1381},"product-state","Product state",[887,1384,1387],{"className":1385,"code":1386,"language":892,"meta":893},[890],"status:     queued | running | waiting | succeeded | failed | cancelled\nwaiting_on: approval | event | delay          null unless status is waiting\n",[895,1388,1386],{"__ignoreMap":893},[807,1390,1391,1392,1395,1396,1075,1399,1075,1402,989,1405,1408,1409,1412],{},"One enum carries the lifecycle, and one field says what a waiting Run waits for. There is no second ",[895,1393,1394],{},"phase"," enum. A phase whose values were ",[895,1397,1398],{},"initializing",[895,1400,1401],{},"executing",[895,1403,1404],{},"waiting_for_approval",[895,1406,1407],{},"finalizing"," only ever told a person something new inside ",[895,1410,1411],{},"waiting",", and it made every writer keep two fields agreeing.",[807,1414,1415],{},"Inngest attempt IDs, worker identity and queue state stay infrastructure telemetry. A surface may show the attempt count. It must not treat the attempt count as product state.",[807,1417,1351,1418,1421,1422,915],{},[895,1419,1420],{},"retrying"," status. A retry is worker state, and the worker that would write it is the one that died. Writing it on the next attempt means reading the Inngest attempt number, which is the exact leak this rule forbids. Retry stays visible in two honest places: the failed span in the tree, and the attempt correlation field. See ",[855,1423,1424],{"href":372},"runtime execution",[807,1426,1351,1427,1430],{},[895,1428,1429],{},"waiting_for_input"," value in V1. An agent that needs more information ends the Run and states what it needs. The person answers, and the front door starts a new Run.",[882,1432,1434],{"id":1433},"the-agno-boundary","The Agno boundary",[807,1436,1437],{},"Agno owns:",[1439,1440,1441,1445,1448,1451],"ul",{},[1442,1443,1444],"li",{},"the model loop and the reasoning;",[1442,1446,1447],{},"the model interaction;",[1442,1449,1450],{},"the tool selection;",[1442,1452,1453],{},"the session identity that lets its loop continue.",[807,1455,1456],{},"AgencyCore owns:",[1439,1458,1459,1462,1465,1468,1471,1474,1477],{},[1442,1460,1461],{},"the Run state and the Run snapshot;",[1442,1463,1464],{},"authorization, policy and approvals;",[1442,1466,1467],{},"credentials and tool execution;",[1442,1469,1470],{},"context ownership;",[1442,1472,1473],{},"workflow durability;",[1442,1475,1476],{},"idempotency;",[1442,1478,1479],{},"spans and usage.",[887,1481,1483],{"className":922,"code":1482,"language":924,"meta":893,"style":893},"class AgentRuntime(Protocol):\n    async def execute(\n        self,\n        request: AgentExecutionRequest,\n        event_sink: AgentEventSink,\n    ) -> AgentExecutionResult: ...\n",[895,1484,1485,1490,1495,1500,1505,1510],{"__ignoreMap":893},[928,1486,1487],{"class":930,"line":22},[928,1488,1489],{},"class AgentRuntime(Protocol):\n",[928,1491,1492],{"class":930,"line":32},[928,1493,1494],{},"    async def execute(\n",[928,1496,1497],{"class":930,"line":233},[928,1498,1499],{},"        self,\n",[928,1501,1502],{"class":930,"line":244},[928,1503,1504],{},"        request: AgentExecutionRequest,\n",[928,1506,1507],{"class":930,"line":264},[928,1508,1509],{},"        event_sink: AgentEventSink,\n",[928,1511,1512],{"class":930,"line":222},[928,1513,1514],{},"    ) -> AgentExecutionResult: ...\n",[807,1516,1517,1520],{},[895,1518,1519],{},"execute()"," is the whole interface. It returns when the agent finishes, when it needs an approval, or when it reaches a ceiling.",[1522,1523,1525],"h3",{"id":1524},"the-three-contracts-of-that-signature","The three contracts of that signature",[887,1527,1529],{"className":922,"code":1528,"language":924,"meta":893,"style":893},"@dataclass(frozen=True)\nclass ModelConfig:\n    provider: str\n    model: str\n    temperature: float | None = None\n    max_output_tokens: int | None = None\n\n\n@dataclass(frozen=True)\nclass RunCeilings:\n    \"\"\"Four loop bounds this Run owns, plus the one budget its tree shares.\"\"\"\n\n    max_segments: int             # this Run\n    max_agent_turns: int          # this Run, less what earlier segments used\n    max_tool_calls: int           # this Run, less what earlier segments used\n    max_run_duration: timedelta   # this Run, LESS the time already spent\n    max_cost_cents: int           # the ROOT Run's; a child ignores its own\n\n\n@dataclass(frozen=True)\nclass SegmentInput:\n    \"\"\"What starts a segment. Agno's arun(input=...) has no default.\"\"\"\n\n    kind: Literal['run_input', 'approval_resolved', 'segment_resumed']\n    text: str | None = None       # original Run input; fallback after a yield\n    approval_id: UUID | None = None   # approval proof; kept across a timed yield\n\n\n@dataclass(frozen=True)\nclass AgentExecutionRequest:\n    run_id: UUID                  # also the Agno session identity\n    segment_index: int\n    principal: Principal\n    model: ModelConfig            # frozen in the snapshot\n    instructions: str             # definition instructions plus the rendered skills\n    input: SegmentInput           # every segment starts on something\n    context: ContextBrief | None  # a fresh brief, or None to reuse the stored one\n    tools: list[ToolSpec]         # model facing contracts, frozen in the snapshot\n    ceilings: RunCeilings         # what is LEFT for this segment, not the Run total\n\n\n@dataclass(frozen=True)\nclass AgentExecutionResult:\n    stop: Literal['completed', 'needs_approval', 'ceiling', 'cancelled', 'failed']\n    result: RunResult | None = None          # stop = completed\n    approval_id: UUID | None = None          # stop = needs_approval\n    approval_expires_at: datetime | None = None\n    ceiling: str | None = None               # stop = ceiling; the field that was reached\n    error: RunError | None = None            # stop = failed\n    turns_used: int = 0\n    tool_calls_used: int = 0\n",[895,1530,1531,1536,1541,1546,1551,1556,1561,1567,1571,1575,1580,1585,1589,1594,1599,1605,1611,1617,1622,1627,1631,1636,1641,1646,1652,1658,1664,1669,1674,1679,1684,1690,1696,1702,1708,1714,1720,1726,1732,1738,1742,1747,1752,1758,1764,1770,1776,1782,1788,1794,1799],{"__ignoreMap":893},[928,1532,1533],{"class":930,"line":22},[928,1534,1535],{},"@dataclass(frozen=True)\n",[928,1537,1538],{"class":930,"line":32},[928,1539,1540],{},"class ModelConfig:\n",[928,1542,1543],{"class":930,"line":233},[928,1544,1545],{},"    provider: str\n",[928,1547,1548],{"class":930,"line":244},[928,1549,1550],{},"    model: str\n",[928,1552,1553],{"class":930,"line":264},[928,1554,1555],{},"    temperature: float | None = None\n",[928,1557,1558],{"class":930,"line":222},[928,1559,1560],{},"    max_output_tokens: int | None = None\n",[928,1562,1563],{"class":930,"line":360},[928,1564,1566],{"emptyLinePlaceholder":1565},true,"\n",[928,1568,1569],{"class":930,"line":368},[928,1570,1566],{"emptyLinePlaceholder":1565},[928,1572,1573],{"class":930,"line":375},[928,1574,1535],{},[928,1576,1577],{"class":930,"line":157},[928,1578,1579],{},"class RunCeilings:\n",[928,1581,1582],{"class":930,"line":182},[928,1583,1584],{},"    \"\"\"Four loop bounds this Run owns, plus the one budget its tree shares.\"\"\"\n",[928,1586,1587],{"class":930,"line":290},[928,1588,1566],{"emptyLinePlaceholder":1565},[928,1590,1591],{"class":930,"line":280},[928,1592,1593],{},"    max_segments: int             # this Run\n",[928,1595,1596],{"class":930,"line":272},[928,1597,1598],{},"    max_agent_turns: int          # this Run, less what earlier segments used\n",[928,1600,1602],{"class":930,"line":1601},15,[928,1603,1604],{},"    max_tool_calls: int           # this Run, less what earlier segments used\n",[928,1606,1608],{"class":930,"line":1607},16,[928,1609,1610],{},"    max_run_duration: timedelta   # this Run, LESS the time already spent\n",[928,1612,1614],{"class":930,"line":1613},17,[928,1615,1616],{},"    max_cost_cents: int           # the ROOT Run's; a child ignores its own\n",[928,1618,1620],{"class":930,"line":1619},18,[928,1621,1566],{"emptyLinePlaceholder":1565},[928,1623,1625],{"class":930,"line":1624},19,[928,1626,1566],{"emptyLinePlaceholder":1565},[928,1628,1629],{"class":930,"line":520},[928,1630,1535],{},[928,1632,1633],{"class":930,"line":318},[928,1634,1635],{},"class SegmentInput:\n",[928,1637,1638],{"class":930,"line":327},[928,1639,1640],{},"    \"\"\"What starts a segment. Agno's arun(input=...) has no default.\"\"\"\n",[928,1642,1644],{"class":930,"line":1643},23,[928,1645,1566],{"emptyLinePlaceholder":1565},[928,1647,1649],{"class":930,"line":1648},24,[928,1650,1651],{},"    kind: Literal['run_input', 'approval_resolved', 'segment_resumed']\n",[928,1653,1655],{"class":930,"line":1654},25,[928,1656,1657],{},"    text: str | None = None       # original Run input; fallback after a yield\n",[928,1659,1661],{"class":930,"line":1660},26,[928,1662,1663],{},"    approval_id: UUID | None = None   # approval proof; kept across a timed yield\n",[928,1665,1667],{"class":930,"line":1666},27,[928,1668,1566],{"emptyLinePlaceholder":1565},[928,1670,1672],{"class":930,"line":1671},28,[928,1673,1566],{"emptyLinePlaceholder":1565},[928,1675,1677],{"class":930,"line":1676},29,[928,1678,1535],{},[928,1680,1681],{"class":930,"line":481},[928,1682,1683],{},"class AgentExecutionRequest:\n",[928,1685,1687],{"class":930,"line":1686},31,[928,1688,1689],{},"    run_id: UUID                  # also the Agno session identity\n",[928,1691,1693],{"class":930,"line":1692},32,[928,1694,1695],{},"    segment_index: int\n",[928,1697,1699],{"class":930,"line":1698},33,[928,1700,1701],{},"    principal: Principal\n",[928,1703,1705],{"class":930,"line":1704},34,[928,1706,1707],{},"    model: ModelConfig            # frozen in the snapshot\n",[928,1709,1711],{"class":930,"line":1710},35,[928,1712,1713],{},"    instructions: str             # definition instructions plus the rendered skills\n",[928,1715,1717],{"class":930,"line":1716},36,[928,1718,1719],{},"    input: SegmentInput           # every segment starts on something\n",[928,1721,1723],{"class":930,"line":1722},37,[928,1724,1725],{},"    context: ContextBrief | None  # a fresh brief, or None to reuse the stored one\n",[928,1727,1729],{"class":930,"line":1728},38,[928,1730,1731],{},"    tools: list[ToolSpec]         # model facing contracts, frozen in the snapshot\n",[928,1733,1735],{"class":930,"line":1734},39,[928,1736,1737],{},"    ceilings: RunCeilings         # what is LEFT for this segment, not the Run total\n",[928,1739,1740],{"class":930,"line":503},[928,1741,1566],{"emptyLinePlaceholder":1565},[928,1743,1745],{"class":930,"line":1744},41,[928,1746,1566],{"emptyLinePlaceholder":1565},[928,1748,1750],{"class":930,"line":1749},42,[928,1751,1535],{},[928,1753,1755],{"class":930,"line":1754},43,[928,1756,1757],{},"class AgentExecutionResult:\n",[928,1759,1761],{"class":930,"line":1760},44,[928,1762,1763],{},"    stop: Literal['completed', 'needs_approval', 'ceiling', 'cancelled', 'failed']\n",[928,1765,1767],{"class":930,"line":1766},45,[928,1768,1769],{},"    result: RunResult | None = None          # stop = completed\n",[928,1771,1773],{"class":930,"line":1772},46,[928,1774,1775],{},"    approval_id: UUID | None = None          # stop = needs_approval\n",[928,1777,1779],{"class":930,"line":1778},47,[928,1780,1781],{},"    approval_expires_at: datetime | None = None\n",[928,1783,1785],{"class":930,"line":1784},48,[928,1786,1787],{},"    ceiling: str | None = None               # stop = ceiling; the field that was reached\n",[928,1789,1791],{"class":930,"line":1790},49,[928,1792,1793],{},"    error: RunError | None = None            # stop = failed\n",[928,1795,1796],{"class":930,"line":491},[928,1797,1798],{},"    turns_used: int = 0\n",[928,1800,1802],{"class":930,"line":1801},51,[928,1803,1804],{},"    tool_calls_used: int = 0\n",[807,1806,1807,1813,1814,1817],{},[811,1808,1809,1812],{},[895,1810,1811],{},"approval_resolved"," carries no text, because the segment is a continue."," A segment\nafter approval does not start the loop again. The runtime rehydrates the paused run, resolves\nthe requirement the approval names, and continues from there, so the approved outcome\nfills that call's own result slot. See\n",[855,1815,1816],{"href":190},"tools and integrations","\nfor the measurement behind that.",[807,1819,1820,1826,1827,1830,1831,1833,1834,1837,1838,915],{},[811,1821,1822,1825],{},[895,1823,1824],{},"segment_resumed"," carries the original Run input as a fallback, not as the\nusual next prompt."," The wall clock can interrupt the session write at any\npoint. The Agno runtime continues a paused run when the stored session holds\none. With saved history and no pause, it starts one stable continuation turn\nwith ",[895,1828,1829],{},"Continue the task from the saved conversation."," With no saved session,\nit restarts from ",[895,1832,892],{},". The runtime alone reads this framework state. A timed\napproval continuation can also carry ",[895,1835,1836],{},"approval_id",". The runtime applies it\nonly when it continues the saved paused run. It drops the proof before it\nstarts a fresh turn from saved history or ",[895,1839,892],{},[807,1841,1842],{},"Every field is an AgencyCore concept. No Agno type appears, which is the whole point of the protocol.",[807,1844,1845,1848,1849,1851],{},[895,1846,1847],{},"stop"," is a closed set, and it is the only thing ",[895,1850,980],{}," branches on. An implementation that cannot say why it stopped cannot satisfy this contract.",[807,1853,1854,1860,1861,1864,1865,1868],{},[811,1855,1351,1856,1859],{},[895,1857,1858],{},"session_id"," field, because the Run is the session."," The runtime passes ",[895,1862,1863],{},"str(run_id)"," to Agno, and ",[895,1866,1867],{},"agent.sessions"," is keyed on the Run. A second identifier would be a second unique key that can disagree with the first.",[807,1870,1871,1874,1877],{},[811,1872,1873],{},"Every fresh framework run carries text, because the framework demands it.",[895,1875,1876],{},"Agent.arun(input=...)"," has no default on Agno 2.5.10. Segment 0 carries the\nRun input. A segment after a wall-clock yield carries either the stable\ncontinuation prompt or the original Run input. A segment after an approval\ncontinues the paused framework run instead of starting a fresh one.",[807,1879,1880,1886,1887,1889,1890,1893],{},[811,1881,1882,1885],{},[895,1883,1884],{},"cancelled"," is a stop reason, because the adapter is the code that sits at the safe boundary."," Cancellation is read before and after a tool call, and inside a segment only the tool adapter reaches that point. Without this member the adapter would have to report a cancel as a failure, and ",[895,1888,1068],{}," would then write ",[895,1891,1892],{},"failed"," over a Run a person stopped.",[1522,1895,1897],{"id":1896},"the-event-sink","The event sink",[887,1899,1901],{"className":922,"code":1900,"language":924,"meta":893,"style":893},"class AgentEventSink(Protocol):\n    \"\"\"The one way the agent loop reports progress. Spans come from SpanRecorder.\"\"\"\n\n    async def text_delta(self, text: str) -> None: ...\n    async def tool_proposed(self, tool_name: str, arguments_preview: str) -> None: ...\n",[895,1902,1903,1908,1913,1917,1922],{"__ignoreMap":893},[928,1904,1905],{"class":930,"line":22},[928,1906,1907],{},"class AgentEventSink(Protocol):\n",[928,1909,1910],{"class":930,"line":32},[928,1911,1912],{},"    \"\"\"The one way the agent loop reports progress. Spans come from SpanRecorder.\"\"\"\n",[928,1914,1915],{"class":930,"line":233},[928,1916,1566],{"emptyLinePlaceholder":1565},[928,1918,1919],{"class":930,"line":244},[928,1920,1921],{},"    async def text_delta(self, text: str) -> None: ...\n",[928,1923,1924],{"class":930,"line":264},[928,1925,1926],{},"    async def tool_proposed(self, tool_name: str, arguments_preview: str) -> None: ...\n",[807,1928,1929,1930,989,1933,1936,1937,1939,1940,915],{},"Two methods, and they map to the two live events a span cannot produce: ",[895,1931,1932],{},"text.delta",[895,1934,1935],{},"tool.updated",". Everything else on the wire is a projection of the span lifecycle, so it belongs to ",[895,1938,1228],{},". See ",[855,1941,1343],{"href":277},[807,1943,1944],{},"The sink is best effort. It never blocks the loop, and it never raises into it. A dropped delta costs a repaint, and the durable record is unaffected.",[807,1946,1947,1950,1951,915],{},[811,1948,1949],{},"The sink is wrapped, because an exception into the loop is invisible."," Agno turns any exception raised inside a tool call into a tool result and continues, so a sink that raises does not fail the segment. It teaches the model something false instead. Every sink call sits inside a ",[895,1952,1953],{},"try",[1522,1955,1957],{"id":1956},"what-the-runtime-owes-besides-the-loop","What the runtime owes besides the loop",[807,1959,1960],{},"The event sink is not the whole duty. Three durable facts about a model turn have no other writer, because the model call happens inside Agno.",[823,1962,1963,1976],{},[826,1964,1965],{},[829,1966,1967,1970,1973],{},[832,1968,1969],{},"Fact",[832,1971,1972],{},"Written by",[832,1974,1975],{},"What breaks without it",[839,1977,1978,1997,2015],{},[829,1979,1980,1987,1991],{},[844,1981,1982,1983,1986],{},"One ",[895,1984,1985],{},"llm"," span per model turn",[844,1988,1989],{},[895,1990,1148],{},[844,1992,1993,1996],{},[895,1994,1995],{},"max_agent_turns"," reads the span tree, so the turn ceiling never fires",[829,1998,1999,2005,2009],{},[844,2000,1982,2001,2004],{},[895,2002,2003],{},"ai_usage_log"," row per model call",[844,2006,2007],{},[895,2008,1148],{},[844,2010,2011,2014],{},[895,2012,2013],{},"max_cost_cents"," reads the meter, so the money ceiling never fires. This is cross document invariant 13",[829,2016,2017,2022,2026],{},[844,2018,2019,2021],{},[895,2020,1232],{},", through the span open",[844,2023,2024],{},[895,2025,1228],{},[844,2027,2028,2029,2032],{},"A segment whose model turn runs longer than ",[895,2030,2031],{},"stale_after"," is failed by the reaper while it is healthy",[807,2034,2035,2038,2039,2042,2043,2045,2046,2049,2050,2053,2054,2057],{},[811,2036,2037],{},"The span opens when the turn starts, not when the segment ends."," A span written after the fact proves nothing about a worker that died, and it writes no heartbeat while the turn is running. So the segment runs in streaming mode and the bridge maps the Agno event stream onto both duties: ",[895,2040,2041],{},"ModelRequestStarted"," opens the ",[895,2044,1985],{}," span, ",[895,2047,2048],{},"ModelRequestCompleted"," closes it and writes the usage row, and ",[895,2051,2052],{},"RunContent"," feeds ",[895,2055,2056],{},"text_delta",". One mechanism serves the sink, the spans, the meter and the heartbeat.",[807,2059,2060,2063,2064,2067,2068,2071,2072,1075,2075,989,2078,2081,2082,2085],{},[811,2061,2062],{},"Every call into the framework streams, and the continue streams too."," A\nsegment reaches the model through ",[895,2065,2066],{},"arun()"," and through one ",[895,2069,2070],{},"acontinue_run()"," per\ndrained pause. Stream the first and not the second and the heartbeat stops at the\nfirst write tool, which is exactly the long segment the reaper is watching for.\nBoth take ",[895,2073,2074],{},"stream=True",[895,2076,2077],{},"stream_events=True",[895,2079,2080],{},"yield_run_output=True","; the\nlast one is what returns the ",[895,2083,2084],{},"RunOutput"," at the end of the event stream, and\nwithout it the runtime has the events and not the pause.",[807,2087,2088,977,2091,2094,2095,2098],{},[811,2089,2090],{},"The span pair spans two events, so the bridge holds it open.",[895,2092,2093],{},"span()"," is a\ncontext manager and the open and the close arrive on two iterations of one event\nloop. The bridge keeps the handle in an ",[895,2096,2097],{},"AsyncExitStack"," between them. It does\nnot open the span at the close and read the timestamps back.",[807,2100,2101,2106,2107,915],{},[811,2102,2103,2105],{},[895,2104,2048],{}," carries tokens and no price and no duration."," The\nruntime prices the call from the one pricer, and it times the turn itself. See\n",[855,2108,1343],{"href":277},[807,2110,2111,2113,2114,1075,2117,989,2120,1939,2123,915],{},[895,2112,1228],{}," needs no new parameter. Span identity is ambient, read through ",[895,2115,2116],{},"current_run_id()",[895,2118,2119],{},"current_root_run_id()",[895,2121,2122],{},"current_span_id()",[855,2124,1343],{"href":277},[807,2126,2127,977,2130,2133,2134,2136,2137,2139,2140,2143],{},[811,2128,2129],{},"Agno bounds tool calls and does not bound turns.",[895,2131,2132],{},"Agent(tool_call_limit=...)"," exists on 2.5.10 and no turn limit does, so ",[895,2135,1995],{}," is enforced by the runtime's own counter over the ",[895,2138,1985],{}," spans it opens. ",[895,2141,2142],{},"tool_call_limit"," is not used at all: a replayed tool call counts nothing everywhere else in the platform, and it would still spend that limit. One ceiling gets one mechanism.",[1522,2145,2147],{"id":2146},"what-ends-the-loop-early-and-how","What ends the loop early, and how",[807,2149,2150,2151,2153],{},"Counting a ceiling is not stopping one. The framework gives the runtime two\nplaces to act, and every early ending below uses one of them. Nothing abandons\nthe event iterator: an abandoned iterator leaves an ",[895,2152,1985],{}," span open, writes no\nsession, and leaves the framework holding a run nobody finishes.",[823,2155,2156,2169],{},[826,2157,2158],{},[829,2159,2160,2163,2166],{},[832,2161,2162],{},"Point",[832,2164,2165],{},"Reached by",[832,2167,2168],{},"How it leaves",[839,2170,2171,2185],{},[829,2172,2173,2176,2179],{},[844,2174,2175],{},"The adapter, before a read tool call",[844,2177,2178],{},"every read tool",[844,2180,2181,2182],{},"it records the segment stop, then raises ",[895,2183,2184],{},"StopAgentRun",[829,2186,2187,2190,2193],{},[844,2188,2189],{},"The drain loop, before every paused call",[844,2191,2192],{},"every write and send tool",[844,2194,2195,2197],{},[895,2196,1519],{}," returns",[807,2199,2200,2203,2204,989,2206,2209],{},[811,2201,2202],{},"A ceiling stops at the adapter."," A model turn only follows a tool call, so\none check before every call bounds both ",[895,2205,1995],{},[895,2207,2208],{},"max_tool_calls",".\nA paused write call never reaches the adapter, so the drain loop checks the same\ntwo remainders itself.",[807,2211,1027,2212,2215],{},[811,2213,2214],{},"The drain loop checks before every call, not once per pause."," One turn can\nhold ten write proposals. Checked once at the top of the pause, a remainder of\none sends ten emails and the ceiling stops only the next pass. This is the side\neffecting path, so it is the one that must not overshoot.",[807,2217,2218,2224,2225,2228,2229,2232,2233,2235],{},[811,2219,2220,2221,915],{},"The segment stop is read before ",[895,2222,2223],{},"is_paused"," One turn can hold a read tool\nthat failed and a write tool that paused. ",[895,2226,2227],{},"RunOutput.status"," then reads ",[895,2230,2231],{},"PAUSED","\nwhile the adapter already recorded ",[895,2234,1892],{},". Read the pause first and the runtime\ndrains a segment that is already over.",[807,2237,2238,977,2241,2243,2244,2247,2248,2251,2252,2254,2255,2257],{},[811,2239,2240],{},"A cancel in the drain loop is a stop and not a fault.",[895,2242,902],{}," raises\n",[895,2245,2246],{},"CancelRequested"," at the same boundary whether the call paused or not, and\noutside the loop that is an ordinary raise. The runtime maps it to\n",[895,2249,2250],{},"stop = cancelled",". Left to propagate, it reaches Inngest as a failure and\n",[895,2253,1068],{}," writes ",[895,2256,1892],{}," over a run a person stopped.",[807,2259,2260,2263,2264,2267,2268,2271,2272,2275,2276,2279,2280,977,2282,2284],{},[811,2261,2262],{},"A model fault is swallowed too, and the type is what decides the retry.","\nAgno catches every exception a model call raises. Measured on 2.5.10 with a\nscripted model: a ",[895,2265,2266],{},"ModelProviderError",", a ",[895,2269,2270],{},"RetryableModelProviderError"," and a\nplain ",[895,2273,2274],{},"RuntimeError"," each end the stream with a ",[895,2277,2278],{},"RunErrorEvent"," carrying a\nstring, and ",[811,2281,1306],{},[895,2283,2084],{}," follows. By then the type is gone, and the three\nneed three different answers.",[807,2286,2287,2288,2291],{},"So the runtime wraps the model's two async entry points for the segment, keeps\nthe first exception in a ",[895,2289,2290],{},"ModelFault"," beside the segment stop, and classifies\nonce the stream has ended.",[807,2293,1027,2294,2297,2298,2301,977,2304,2306,2307,2310,2311,2314,2315,2318,2319,2321,2322,2325,2326,2329,2330,2333],{},[811,2295,2296],{},"The type names do not answer the retry question, and reading them that way\ninverts it three ways."," Measured on 2.5.10: ",[895,2299,2300],{},"ModelRateLimitError",[811,2302,2303],{},"subclasses",[895,2305,2266],{},", so a rule written against the parent\ncatches every 429 and ends a run one replay would have saved.\n",[895,2308,2309],{},"ModelAuthenticationError"," does ",[811,2312,2313],{},"not"," subclass it, and ",[895,2316,2317],{},"OpenAIChat"," re-raises\nthat one un-wrapped, so the same rule misses a 401 and replays a bad key for\never. ",[895,2320,2270],{}," is not an ",[895,2323,2324],{},"AgnoError"," at all, and only the\nGemini class raises it, so a rule written against it answers no for every\nprovider this platform builds. ",[895,2327,2328],{},"Model.retries"," defaults to ",[895,2331,2332],{},"0",", so the framework\nretries nothing on its own either.",[807,2335,2336,2338,2339,2342],{},[895,2337,2324],{}," is the base all of them share except the last, and it always carries\n",[895,2340,2341],{},"status_code",". That status is the one rule.",[823,2344,2345,2355],{},[826,2346,2347],{},[829,2348,2349,2352],{},[832,2350,2351],{},"What was raised",[832,2353,2354],{},"What the runtime does",[839,2356,2357,2373,2383,2395,2403],{},[829,2358,2359,2364],{},[844,2360,2361,2363],{},[895,2362,2324],{},", status 4xx other than 429",[844,2365,2366,1075,2369,2372],{},[895,2367,2368],{},"stop = failed",[895,2370,2371],{},"retryable = False","; the vendor answers the same way every time",[829,2374,2375,2380],{},[844,2376,2377,2379],{},[895,2378,2324],{},", any other status",[844,2381,2382],{},"re-raise it; Inngest replays the step",[829,2384,2385,2389],{},[844,2386,2387],{},[895,2388,2270],{},[844,2390,2391,2392,2394],{},"re-raise it; it is not an ",[895,2393,2324],{},", so the rule above never sees it",[829,2396,2397,2400],{},[844,2398,2399],{},"anything else",[844,2401,2402],{},"re-raise it; a platform fault must reach Inngest",[829,2404,2405,2408],{},[844,2406,2407],{},"nothing recorded",[844,2409,2410,1075,2412],{},[895,2411,2368],{},[895,2413,2414],{},"runtime_contract",[807,2416,2417,2418,2420],{},"A malformed body, a bad key and a model that does not exist are all 4xx, and all\nthree are refused identically on every attempt. A rate limit is the one 4xx that\nis not, and ",[895,2419,2300],{}," carries 429 by default, so the named clause in\nthe rule is what replays it. That clause is not dead code: drop it and every\nrate limit becomes terminal.",[807,2422,1027,2423,2426],{},[811,2424,2425],{},"The fault is cleared before every framework call."," A segment that drains\ntwo pauses makes three, and the framework recovers from a retryable fault on its\nown. Kept across those calls, a rate limit the first call recovered from decides\nthe answer for a refusal on the third, and Inngest replays a segment that fails\nidentically every time. The mirror is worse: a recovered refusal makes a genuine\nrate limit terminal, and a run one replay would have saved ends for good.",[807,2428,2429],{},"Without the wrapper a rate limit ends the run instead of replaying the step, and\na database outage during a model call does the same.",[807,2431,2432,2435,2436,2438],{},[811,2433,2434],{},"The turn is the fault window, and the framework call opens one too."," The\nbridge clears the fault at every ",[895,2437,2041],{},", because one framework\ncall holds many turns and the framework recovers from a retryable fault in\nplace. A call that fails before it reaches a turn emits no start event, so the\nruntime clears it at the call boundary as well.",[807,2440,2441,2444,2445,2448],{},[811,2442,2443],{},"A turn that failed closes its span as an error."," The bridge raises inside the\nspan's own block rather than after it. Recorded and raised afterwards, the block\nwould exit with no exception, the recorder would write ",[895,2446,2447],{},"ok"," with no error, and a\nrun that ended on a refused request would show every model turn green with no\nusage row and nothing to read.",[807,2450,2451,2454,2455,2458,2459,2462],{},[811,2452,2453],{},"A segment after an approval continues the paused run and never starts the\nloop."," The runtime finds the paused run in the stored session and enters the\ndrain loop on it. A fresh ",[895,2456,2457],{},"arun"," pays for every earlier turn a second time, and\nthe approved call's own empty result slot stays empty, so the effect a person\nallowed never reaches the model. A session that holds no paused run ends the\nrun on ",[895,2460,2461],{},"paused_run_absent",", which no retry can fix.",[807,2464,2465,2468,2469,2472,2473,2475],{},[811,2466,2467],{},"A segment after a wall-clock yield is defensive."," A saved paused run also\ncontinues through ",[895,2470,2471],{},"acontinue_run",". If the yield followed an approval, that\nsaved pause gets the approval proof. A saved session with no pause starts a new\n",[895,2474,2457],{}," with one stable continuation prompt and no old proof. No saved session\nrestarts the original Run input, also with no old proof. A matching completed\ntool journal entry returns its stored result; an interrupted entry keeps the\njournal's existing lease behavior.",[807,2477,2478,977,2484,2486,2487,2489,2490,2493,2494,2496],{},[811,2479,2480,2481,915],{},"A completed segment always carries a ",[895,2482,2483],{},"RunResult",[895,2485,980],{}," answers\n",[895,2488,2414],{}," and fails the run when ",[895,2491,2492],{},"completed"," arrives with no result, so\na model that answered an empty string would fail a healthy run. The runtime\nbuilds the result from what it holds and never returns ",[895,2495,962],{}," there.",[1522,2498,2500],{"id":2499},"three-result-types-and-why-each-exists","Three result types, and why each exists",[807,2502,2503],{},"They are easy to confuse, so name the question each one answers.",[823,2505,2506,2519],{},[826,2507,2508],{},[829,2509,2510,2513,2516],{},[832,2511,2512],{},"Type",[832,2514,2515],{},"Answers",[832,2517,2518],{},"Lives",[839,2520,2521,2538,2557],{},[829,2522,2523,2528,2535],{},[844,2524,2525],{},[895,2526,2527],{},"AgentExecutionResult",[844,2529,2530,2531,2534],{},"Why did this ",[811,2532,2533],{},"segment"," stop?",[844,2536,2537],{},"inside the agent runtime boundary",[829,2539,2540,2544,2554],{},[844,2541,2542],{},[895,2543,914],{},[844,2545,2546,2547,2549,2550,2553],{},"What must ",[895,2548,1068],{}," do ",[811,2551,2552],{},"next","?",[844,2555,2556],{},"between any executor and the manager",[829,2558,2559,2563,2569],{},[844,2560,2561],{},[895,2562,2483],{},[844,2564,2565,2566,2568],{},"What did the ",[811,2567,1297],{}," produce?",[844,2570,2571],{},"on the run row, durable",[807,2573,2574,2575,2577,2578,2580],{},"A workflow produces no ",[895,2576,2527],{},", and both executors produce an ",[895,2579,914],{},". That is why the middle one is not redundant.",[887,2582,2584],{"className":922,"code":2583,"language":924,"meta":893,"style":893},"@dataclass(frozen=True)\nclass ExecutionOutcome:\n    next_status: Literal['running', 'succeeded', 'waiting', 'failed', 'cancelled']\n    result: RunResult | None = None\n    error: RunError | None = None\n    waiting_on: WaitingOn | None = None      # set when next_status is waiting\n    waiting_ref_id: UUID | None = None\n    waiting_expires_at: datetime | None = None   # the Inngest wait timeout\n",[895,2585,2586,2590,2595,2600,2605,2610,2615,2620],{"__ignoreMap":893},[928,2587,2588],{"class":930,"line":22},[928,2589,1535],{},[928,2591,2592],{"class":930,"line":32},[928,2593,2594],{},"class ExecutionOutcome:\n",[928,2596,2597],{"class":930,"line":233},[928,2598,2599],{},"    next_status: Literal['running', 'succeeded', 'waiting', 'failed', 'cancelled']\n",[928,2601,2602],{"class":930,"line":244},[928,2603,2604],{},"    result: RunResult | None = None\n",[928,2606,2607],{"class":930,"line":264},[928,2608,2609],{},"    error: RunError | None = None\n",[928,2611,2612],{"class":930,"line":222},[928,2613,2614],{},"    waiting_on: WaitingOn | None = None      # set when next_status is waiting\n",[928,2616,2617],{"class":930,"line":360},[928,2618,2619],{},"    waiting_ref_id: UUID | None = None\n",[928,2621,2622],{"class":930,"line":368},[928,2623,2624],{},"    waiting_expires_at: datetime | None = None   # the Inngest wait timeout\n",[807,2626,2627,2630,2631,2634,2635,2638,2639,2641,2642,2644,2645,2648],{},[811,2628,2629],{},"The wait carries its own deadline, because nothing else on this side holds\nit."," The Inngest wait computes ",[895,2632,2633],{},"timeout"," from the approval expiry, and the\nsegment that raised the approval is the only code that read it.\n",[895,2636,2637],{},"AgentExecutionResult.approval_expires_at"," holds it inside the agent boundary,\nand ",[895,2640,980],{}," answers an ",[895,2643,914],{},", so a type without this field\ndrops the value at exactly the boundary the function needs it. The alternative\nis a second query over ",[895,2646,2647],{},"agent.approvals"," for a fact the raiser already held,\nwhich is the same trade the agent boundary already refused one layer down.",[807,2650,2651,2653,2654,2657,2658,2661,2662,2665,2666,2669,2670,2672],{},[895,2652,1024],{}," says what the durable function does next. It is a subset of\n",[895,2655,2656],{},"RunStatus",". ",[895,2659,2660],{},"queued"," is absent because ",[895,2663,2664],{},"start()"," owns it. ",[895,2667,2668],{},"running"," is the\nsegment wall-clock yield: it asks the loop to advance and start another\nsegment, and it asks ",[895,2671,1068],{}," to write nothing.",[807,2674,2675,2678,2679,2681],{},[811,2676,2677],{},"Two values name lifecycle writes, and three do not."," Reading every value as\na ",[895,2680,1068],{}," instruction is how code writes a status another boundary owns.",[823,2683,2684,2700],{},[826,2685,2686],{},[829,2687,2688,2692,2697],{},[832,2689,2690],{},[895,2691,1024],{},[832,2693,2694,2696],{},[895,2695,1068],{}," call",[832,2698,2699],{},"Why",[839,2701,2702,2714,2729,2742,2761],{},[829,2703,2704,2708,2711],{},[844,2705,2706],{},[895,2707,2668],{},[844,2709,2710],{},"none",[844,2712,2713],{},"the segment loop advances and continues",[829,2715,2716,2721,2726],{},[844,2717,2718],{},[895,2719,2720],{},"succeeded",[844,2722,2723],{},[895,2724,2725],{},"succeed(run_id, result)",[844,2727,2728],{},"the executor is the only writer",[829,2730,2731,2735,2740],{},[844,2732,2733],{},[895,2734,1892],{},[844,2736,2737],{},[895,2738,2739],{},"fail(run_id, error)",[844,2741,2728],{},[829,2743,2744,2748,2751],{},[844,2745,2746],{},[895,2747,1411],{},[844,2749,2750],{},"none, or an idempotent re-assert",[844,2752,2753,2756,2757,2760],{},[895,2754,2755],{},"mark_waiting()"," already ran ",[811,2758,2759],{},"inside"," the segment, before it returned",[829,2762,2763,2767,2769],{},[844,2764,2765],{},[895,2766,1884],{},[844,2768,2710],{},[844,2770,2771,2774],{},[895,2772,2773],{},"cancel()"," already wrote the status",[807,2776,2777,2779,2780,2783,2784,2787,2788,2790,2791,2793,2794,2797],{},[895,2778,2773],{}," takes an ",[895,2781,2782],{},"ActorIdentity"," the executor does not hold, so an implementer who reaches for it has to invent an actor, and it would overwrite ",[895,2785,2786],{},"cancel_requested_by"," with a machine where a person belongs. ",[895,2789,1411],{}," is the subtler of the two: the approval row, ",[895,2792,2755],{}," and the wait all happen before the segment step returns, so the outcome reports a transition that is already durable. Re-asserting it is legal, because ",[895,2795,2796],{},"waiting -> waiting"," is a legal cell, but it writes nothing new.",[807,2799,2800,2811,2812,2814,2815,2817,2818,2820],{},[811,2801,2802,2804,2805,2807,2808,2810],{},[895,2803,958],{}," returning ",[895,2806,962],{}," produces no ",[895,2809,914],{}," at all."," A Run\ncancelled between the dispatch and the claim is no longer claimable, and there\nis nothing for ",[895,2813,1068],{}," to be told. ",[895,2816,910],{}," returns and the Inngest\nfunction ends. ",[895,2819,2668],{}," is not this absence: it is an explicit instruction to\nadvance the bounded segment loop.",[887,2822,2825],{"className":2823,"code":2824,"language":892,"meta":893},[890],"Source                              ExecutionOutcome.next_status\n  outer segment timer          ->     running\n  runtime: completed           ->     succeeded\n  runtime: ceiling             ->     succeeded, with RunResult.partial_reason\n  runtime: needs_approval      ->     waiting, waiting_on = approval\n  runtime: cancelled           ->     cancelled\n  runtime: failed              ->     failed\n",[895,2826,2824],{"__ignoreMap":893},[807,2828,2829,2830,2833,2834,2836],{},"The outer timer does not add an ",[895,2831,2832],{},"AgentExecutionResult.stop"," value. It wraps the\nagent executor at the durable step boundary and produces ",[895,2835,2668],{}," directly.",[807,2838,1351,2839,2841,2842,2844,2845,915],{},[895,2840,2773],{}," method on this protocol. Cancellation is cooperative and durable, and the executor reads the ",[895,2843,1200],{}," row at safe boundaries. An in memory handle does not survive a worker restart, so it cannot be the control boundary. Steering is deferred to V2, so nothing on this protocol carries it either. See ",[855,2846,1424],{"href":372},[807,2848,2849,2852,2853,2856],{},[895,2850,2851],{},"AgentExecutionRequest"," carries AgencyCore concepts only: the Run ID, the model configuration, the instructions, the authorized ",[895,2854,2855],{},"ContextBrief",", the rendered skills, the model facing tool contracts, the Principal and the ceilings.",[807,2858,2859],{},"If a second runtime is ever added, it must satisfy this contract. Do not build the selection machinery before that need exists.",[1522,2861,2863],{"id":2862},"where-the-session-lives","Where the session lives",[807,2865,2866],{},"An agent Run can span several segments, and a segment can be separated from the next one by a three day approval. The next segment continues the same Agno session, so the message history must survive a worker that no longer exists.",[807,2868,2869,2870,2872,2873,2875],{},"That store is real, and it needs a name. It is ",[895,2871,1867],{},", one row per Run, and ",[855,2874,1424],{"href":372}," owns its schema. Do not restate the columns here.",[823,2877,2878,2887],{},[826,2879,2880],{},[829,2881,2882,2885],{},[832,2883,2884],{},"Concern",[832,2886,1056],{},[839,2888,2889,2899,2907],{},[829,2890,2891,2894],{},[844,2892,2893],{},"Write",[844,2895,2896,2898],{},[895,2897,1148],{},", at the end of every segment that produced an outcome",[829,2900,2901,2904],{},[844,2902,2903],{},"Read",[844,2905,2906],{},"the next segment, before it continues the loop",[829,2908,2909,2912],{},[844,2910,2911],{},"Delete",[844,2913,2914],{},"Run retention, with the Run it belongs to",[807,2916,2917,2920,2921,2923],{},[811,2918,2919],{},"A segment that will be retried writes nothing."," A retryable failure leaves a half finished turn in the session, and Inngest replays the whole step. Writing it makes that wreckage the baseline the retry rehydrates. Not writing it leaves the clean pre-segment session in place, which is what a replay is for. ",[855,2922,373],{"href":372}," lists the exit paths and which of them write.",[807,2925,2926],{},"Two consequences follow, and both are already relied on elsewhere.",[1439,2928,2929,2942],{},[1442,2930,2931,2932,2934,2935,2938,2939,915],{},"The earlier ",[895,2933,2855],{}," is still in that history. That is why a rebuilt brief ",[811,2936,2937],{},"replaces"," the system block instead of appending. See ",[855,2940,2941],{"href":178},"state and knowledge",[1442,2943,2944,2945,2947],{},"It is Agno's state, not ours, so nothing above ",[895,2946,1148],{}," reads it. The rejected alternative was rebuilding the history from spans. Spans are bounded and redacted, so they cannot reconstruct a model conversation.",[2949,2950,2952],"h4",{"id":2951},"the-stored-row-carries-the-instructions-too","The stored row carries the instructions too",[807,2954,2955,2956,2959,2960,2963],{},"Replacement is native, and it has a cost that is easy to miss. Agno rebuilds the system message from ",[895,2957,2958],{},"instructions"," on ",[811,2961,2962],{},"every"," run, and it never replays the stored one. So the system block is not a thing the session keeps. It is a thing the caller supplies again each time.",[807,2965,2966,2968,2969,2972],{},[895,2967,980],{}," sends ",[895,2970,2971],{},"context = None"," on an ordinary later segment, meaning \"the world did not move\". If the runtime then passed instructions without a brief, the brief would simply be gone from segment 1 onward. Nothing would fail. The agent would forget the rows it was shown, and the run would look healthy.",[807,2974,2975],{},"So the runtime stores what it composed, beside the state it stored.",[887,2977,2980],{"className":2978,"code":2979,"language":892,"meta":893},[890],"agent.sessions.agno_state = {\n  'agno':         \u003CAgentSession.to_dict()>,   # Agno owns this half\n  'instructions': '\u003Cthe composed system block>',\n}\n",[895,2981,2979],{"__ignoreMap":893},[807,2983,2984,2986,2987,2990,2991,2993,2994,2996],{},[895,2985,2971],{}," therefore means ",[811,2988,2989],{},"reuse the stored instructions",", and the column is a runtime owned envelope rather than a raw Agno dictionary. ",[895,2992,1867],{}," needs no second column and no migration, and rule 2 below is unchanged: nothing above ",[895,2995,1148],{}," opens either half.",[2949,2998,3000],{"id":2999},"the-history-is-a-setting-and-it-has-a-floor","The history is a setting, and it has a floor",[807,3002,3003,3004,3007],{},"Rehydrating the session is not the whole answer. Agno replays a stored history\ninto the model only when the agent asks for it, so the runtime builds every\nagent with ",[895,3005,3006],{},"add_history_to_context=True",". Leave it at its default and a resumed\nsegment reads a session it never uses, and the model answers a question it was\nalready told the answer to.",[807,3009,3010,3013,3014,3017],{},[895,3011,3012],{},"num_history_runs"," bounds how many earlier runs come back. One segment is one\nAgno run, so the bound is a segment count and it must be at least\n",[895,3015,3016],{},"max_segments",". Set it lower and a long run silently loses its oldest segments\nwhile every ceiling still reads healthy.",[882,3019,3021],{"id":3020},"workflow-model","Workflow model",[807,3023,3024],{},"A workflow is deterministic coordination. It is not a second reasoning hop.",[807,3026,3027],{},"Eight node types. Two of them are containers.",[823,3029,3030,3043],{},[826,3031,3032],{},[829,3033,3034,3037,3040],{},[832,3035,3036],{},"Node",[832,3038,3039],{},"Kind",[832,3041,3042],{},"Behavior",[839,3044,3045,3057,3068,3083,3095,3107,3126,3138],{},[829,3046,3047,3051,3054],{},[844,3048,3049],{},[895,3050,1327],{},[844,3052,3053],{},"container",[844,3055,3056],{},"Run the children in order",[829,3058,3059,3063,3065],{},[844,3060,3061],{},[895,3062,1315],{},[844,3064,3053],{},[844,3066,3067],{},"Run a fixed set of children at the same time",[829,3069,3070,3075,3078],{},[844,3071,3072],{},[895,3073,3074],{},"tool",[844,3076,3077],{},"step",[844,3079,3080,3081],{},"Call one tool through ",[895,3082,902],{},[829,3084,3085,3090,3092],{},[844,3086,3087],{},[895,3088,3089],{},"agent",[844,3091,3077],{},[844,3093,3094],{},"Run one agent as a child Run",[829,3096,3097,3102,3104],{},[844,3098,3099],{},[895,3100,3101],{},"subworkflow",[844,3103,3077],{},[844,3105,3106],{},"Run one workflow as a child Run",[829,3108,3109,3114,3116],{},[844,3110,3111],{},[895,3112,3113],{},"branch",[844,3115,3077],{},[844,3117,3118,3119,3122,3123],{},"Pick one child with the shared ",[895,3120,3121],{},"ConditionEvaluator",". It declares a ",[895,3124,3125],{},"default",[829,3127,3128,3133,3135],{},[844,3129,3130],{},[895,3131,3132],{},"wait",[844,3134,3077],{},[844,3136,3137],{},"Hold for an event or for a delay",[829,3139,3140,3145,3147],{},[844,3141,3142],{},[895,3143,3144],{},"approval",[844,3146,3077],{},[844,3148,3149],{},"Hold for a person",[807,3151,3152],{},"A workflow has no loops, no expression language, no private schedule and no model planning between steps.",[1522,3154,3156],{"id":3155},"where-runtime-fan-out-lives","Where runtime fan out lives",[807,3158,3159,3160,3163],{},"The node set of a workflow is ",[811,3161,3162],{},"static",". The workload of a node is not.",[807,3165,3166,3167,3170],{},"A step may process many items that only exist at run time. That fan out lives ",[811,3168,3169],{},"inside one tool step or one agent step",", and the step reports one result. Signals Search uses this: one step searches for people across the companies that survived pruning.",[807,3172,3173],{},"This keeps the workflow shape checkable at publish time. It also keeps bounded fan out possible. Do not add a dynamic fan out node type to get it.",[882,3175,3176],{"id":207},"Skills",[807,3178,3179],{},"A skill is reusable guidance. The runtime renders it into the agent instructions.",[1439,3181,3182,3185,3188,3191,3194],{},[1442,3183,3184],{},"Prefer a skill when the responsibility stays the same and the procedure is reusable.",[1442,3186,3187],{},"The tool IDs of a skill must be a subset of the tool IDs of the agent.",[1442,3189,3190],{},"A skill cannot grant a capability.",[1442,3192,3193],{},"A skill is not a workflow node type.",[1442,3195,3196],{},"V1 stores short procedure text in Postgres. There are no scripts, no sandbox and no Agno filesystem skill packages.",[807,3198,3199],{},"The runtime renders skills once, when it freezes the Run snapshot. Execution reads the rendered text. It does not render again.",[882,3201,3203],{"id":3202},"code-layout","Code layout",[887,3205,3208],{"className":3206,"code":3207,"language":892,"meta":893},[890],"runtime\u002F\n  runs\u002F\n    models.py        Run, RunSnapshot, RunResult, RunStatus, WaitingOn,\n                     StartRunCommand, StartRunResult, ExecutionOutcome\n    repository.py    RunRepository: one conditional transition primitive\n    transitions.py   the legal from-states for every lifecycle method\n    manager.py       RunManager\n    admission.py     AdmissionGate: one policy method either side of the insert\n    control.py       RunControlRepository: the cancellation row\n    start_key.py     the start key of a run\n    dispatch.py      the Inngest carrier for a dispatch and a cancel\n  definitions\u002F       draft, validate, publish, snapshot. The definitions page\n                     owns this package\n  execution\u002F\n    executor.py      RunExecutor\n    agent.py         AgentExecutor\n    workflow.py      WorkflowExecutor, the deterministic node walk\n    workflow_step.py WorkflowStepExecutor, NodeOutcome, the child start\n    tool_node.py     what a workflow `tool` node hands the tool layer\n    child_actor.py   the actor a node starts its child run with\n    definitions.py   the run time reader of the subworkflow targets\n    steps.py         WorkflowSteps, the durable step seam\n    outcome.py       ExecutionOutcome -> RunManager calls\n  agent\u002F\n    protocol.py      AgentRuntime, AgentExecutionRequest\u002FResult\u002FSegmentInput,\n                     AgentEventSink. RunCeilings is NOT here: three packages\n                     read it, so it lives at shared\u002Fceilings.py beside bound()\n    agno\u002F\n      runtime.py     AgnoAgentRuntime\n      segment.py     the mutable state of one segment\n      adapter.py     AgnoToolAdapter: the declaration and the stop signal\n      bridge.py      Agno event and result normalization\n      session.py     agent.sessions: the envelope read and the envelope write\n  events\u002F\n    publisher.py     RedisRunEventPublisher, the channel scheme and the mirror\n    agent_sink.py    the agent events a span cannot produce\n  inngest\u002F\n    wiring.py              build_platform(), the composition root of the worker\n    execute.py             run.execute, the two lanes and the segment loop\n    failure.py             run.failed, the inngest\u002Ffunction.failed backstop\n    reaper.py              run.reaper, the cron and the two orphan sweeps\n    idempotency_sweeper.py idempotency.sweeper, the cron that forgets a claim\n    retention_sweeper.py   retention.sweeper, the cron and the three windows\n",[895,3209,3207],{"__ignoreMap":893},[807,3211,3212,3213,3216,3217,989,3220,3222,3223,3226],{},"The node models are not in ",[895,3214,3215],{},"execution\u002F",". Both ",[895,3218,3219],{},"definitions\u002F",[895,3221,3215],{},"\nread them, so they sit beside ",[895,3224,3225],{},"RunCeilings"," in the package that imports neither.",[887,3228,3231],{"className":3229,"code":3230,"language":892,"meta":893},[890],"shared\u002F\n  ceilings.py             RunCeilings, the five bounds one run may spend\n  bounds.py               bound(), the one payload boundary\n  workflow_nodes.py       the eight node types, and the reader of the tree\n  workflow_graph.py       the reference graph: one cycle guard, and one depth\n  workflow_references.py  what a node may read, and how it reads it\n  conditions.py           ConditionEvaluator, the one condition language\n  identity.py             Principal and ActorIdentity\n  refs.py                 a pointer to a row, where a payload carries no body\n  database.py             the PostgREST transport facts: SERVER_NOW, the\n                          row cap, the filter batch size\n  retry.py                retried(), the one transient retry both planes share\n  ttl_cache.py            the bounded per-process cache the policy reads share\n",[895,3232,3230],{"__ignoreMap":893},[807,3234,3235,3238,3239,3242,3243,3245],{},[895,3236,3237],{},"LiveEventPublisher"," is declared in ",[895,3240,3241],{},"governance\u002Fobservability\u002Frecorder.py",",\nbeside the caller that writes the span half. Phase 1 ships the Protocol and a\ndefault that publishes nothing, and a recorder built with ",[895,3244,962],{}," still\npublishes nothing today.",[807,3247,3248,3249,3252,3253,3256,3257,3259,3260,3263,3264,3267,3268,3271,3272,3274,3275,3277],{},"Phase 2 added the one implementation, ",[895,3250,3251],{},"RedisRunEventPublisher",", in the\n",[895,3254,3255],{},"runtime\u002Fevents\u002F"," package above. Three classes call it. ",[895,3258,1228],{}," writes\nthe span half. ",[895,3261,3262],{},"PublishingAgentEventSink"," writes the two events a span cannot\nproduce, and ",[895,3265,3266],{},"runtime\u002Fagent\u002Fagno\u002Fbridge.py"," reports them to it through the\n",[895,3269,3270],{},"AgentEventSink"," port ",[895,3273,980],{}," owns. ",[895,3276,1068],{}," writes the run\nlifecycle events.",[807,3279,3280,3281,3284],{},"Only ",[895,3282,3283],{},"runtime\u002Fagent\u002Fagno\u002F"," imports Agno. Everything above it works on the neutral contracts.",[807,3286,3287,3296,3297,3299,3300,3302,3303,989,3306,3308,3309,3311,3312,3314,3315,3317,3318,3321,3322,3325,3326,3329,3330,3333,3334,3336],{},[811,3288,3289,3291,3292,3295],{},[895,3290,3225],{}," lives in ",[895,3293,3294],{},"shared\u002F",", and the reason is a package cycle."," The\nagent protocol carries it, ",[895,3298,1126],{}," takes it, and ",[895,3301,902],{}," checks a\nmetered call against it. Declare it inside ",[895,3304,3305],{},"runtime\u002Fagent\u002F",[895,3307,294],{},"\nimports ",[895,3310,149],{},", while ",[895,3313,1068],{}," already imports ",[895,3316,294],{}," for\n",[895,3319,3320],{},"PolicyDecision",". Two forbidden contracts pin the direction: nothing under\n",[895,3323,3324],{},"services\u002F"," or ",[895,3327,3328],{},"governance\u002F"," imports ",[895,3331,3332],{},"runtime\u002F",", and ",[895,3335,3294],{}," imports none\nof the three.",[807,3338,3339,3345,3346,3349],{},[811,3340,3341,3344],{},[895,3342,3343],{},"AgnoToolAdapter"," lives here and not in the tool package."," It declares an Agno callable and it raises an Agno exception, so it is framework code. The tool page already says the adapter is the piece replaced when the framework changes, while the registry, the invoker, the policy and the handlers do not move. Putting it under ",[895,3347,3348],{},"services\u002Ftools\u002F"," would put Agno in two packages, and the import contract could then no longer name one.",[882,3351,3353],{"id":3352},"rules","Rules",[1439,3355,3356,3359,3362,3367,3376,3387,3390,3399,3405,3410,3418,3433,3438,3441,3447,3452,3455,3458,3461,3467,3470,3475,3478,3481,3484,3489,3492,3495,3500,3506,3515,3527,3530,3536,3539,3542],{},[1442,3357,3358],{},"One Agno agent runtime in V1.",[1442,3360,3361],{},"No backend selector, no runtime registry, no capability matrix.",[1442,3363,3364,3366],{},[895,3365,1068],{}," owns the product lifecycle. Inngest owns the durability.",[1442,3368,3369,3371,3372,989,3374,915],{},[895,3370,910],{}," claims and dispatches, once per function run. The per-segment and per-node work belongs to ",[895,3373,980],{},[895,3375,1169],{},[1442,3377,3378,3380,3381,3383,3384,3386],{},[895,3379,980],{}," maps ",[895,3382,2527],{}," to ",[895,3385,914],{},". It never returns the first where the second is declared.",[1442,3388,3389],{},"A segment re-reads the Run row before it does anything else. The claimed Run is one snapshot of two columns that move.",[1442,3391,3392,3393,3395,3396,3398],{},"A status other than ",[895,3394,2668],{}," ends the segment. ",[895,3397,1200],{}," is the boundary inside a segment, not between two.",[1442,3400,3401,3402,915],{},"A stop before the first model call fails the Run. The same stop after one succeeds with a ",[895,3403,3404],{},"partial_reason",[1442,3406,3407,3408,915],{},"A retryable platform fault leaves the executor as an exception. Only a terminal failure becomes an ",[895,3409,914],{},[1442,3411,3412,3414,3415,3417],{},[895,3413,910],{}," answers a claimed Run and an executor. It answers no ",[895,3416,914],{},", because it holds no loop.",[1442,3419,3420,989,3422,3424,3425,3427,3428,989,3430,3432],{},[895,3421,2720],{},[895,3423,1892],{}," name a ",[895,3426,1068],{}," method. ",[895,3429,1411],{},[895,3431,1884],{}," are reports of a write that already happened.",[1442,3434,3435,3437],{},[895,3436,2668],{}," is a segment yield. It advances the durable loop and writes no Run status.",[1442,3439,3440],{},"A per-Run ceiling counts spans of that Run. Only the cost ceiling sums the tree.",[1442,3442,3443,3444,3446],{},"Agno types stay inside ",[895,3445,3283],{},", which holds the runtime, the tool adapter and the bridge.",[1442,3448,3449,3450,915],{},"The agent session is durable, scoped to one Run, and read only by ",[895,3451,1148],{},[1442,3453,3454],{},"The session row carries the composed instructions, because Agno rebuilds the system block from them on every run.",[1442,3456,3457],{},"A segment that will be retried writes no session.",[1442,3459,3460],{},"The stop signal lives on the segment, never on the runtime instance.",[1442,3462,3463,3464,3466],{},"The runtime opens one ",[895,3465,1985],{}," span per model turn and writes one usage row per model call.",[1442,3468,3469],{},"The loop is left at the adapter or at the drain loop. Nothing abandons the event iterator.",[1442,3471,2220,3472,3474],{},[895,3473,2223],{},", because one turn can hold both.",[1442,3476,3477],{},"One pricer answers the cost of a model call, and the non-cached input count is provider specific.",[1442,3479,3480],{},"Every call into the framework streams, including each continue.",[1442,3482,3483],{},"One ceiling gets one mechanism. The runtime counts; the framework's own limit is unused.",[1442,3485,3486,3487,915],{},"Every agent action goes through ",[895,3488,902],{},[1442,3490,3491],{},"Not every workflow step becomes a Run.",[1442,3493,3494],{},"The node set of a workflow is static. Fan out lives inside a step.",[1442,3496,3497,3499],{},[895,3498,1010],{}," owns the node walk. The Inngest function owns the segment loop only.",[1442,3501,3502,3503,3505],{},"The function branches on ",[895,3504,970],{}," above every step. A workflow walk creates its own steps, and a nested step is refused with a non-retriable error.",[1442,3507,3508,3510,3511,3514],{},[895,3509,1042],{}," answers the status, the result and the error. A parent node reads that mapping to settle its child node, so the status alone empties every ",[895,3512,3513],{},"steps.\u003Cid>.output"," in the tree.",[1442,3516,3517,3518,3520,3521,3523,3524,3526],{},"A workflow ",[895,3519,3074],{}," node counts against ",[895,3522,2208],{}," by the ",[895,3525,3074],{}," spans of its own Run, exactly as an agent segment subtracts them.",[1442,3528,3529],{},"One node body is one durable step, and every write a node makes sits inside one. The SDK re-executes the function body once per step, so a write outside a step happens again on every pass.",[1442,3531,3532,3533,3535],{},"A ",[895,3534,1315],{}," node runs its branches through the parallel primitive of the SDK, in race mode. A plain loop over the branches serialises the node in silence.",[1442,3537,3538],{},"A business failure inside a node is a returned value. Only a retryable platform fault raises.",[1442,3540,3541],{},"Workflow nesting is validated and capped before publish, and the same function re-checks it when a subworkflow node starts a child Run.",[1442,3543,3544],{},"Every Inngest function runs on the Connect worker. The web process serves no Inngest function, whatever the function costs.",[882,3546,3548],{"id":3547},"minimum-contract-tests","Minimum contract tests",[1439,3550,3551,3557,3560,3563,3566,3572,3578,3581,3587,3593,3599,3605,3608,3611,3617,3620,3623,3626,3629,3632,3635,3640,3643,3646,3649,3655,3658,3663,3666,3673,3684,3687,3697,3706,3711,3716,3719,3722,3725,3734,3740,3746,3751,3757,3760,3767,3773,3779,3785,3792,3799,3803,3811],{},[1442,3552,3553,3556],{},[895,3554,3555],{},"RunManager.start()"," is idempotent for the same command key.",[1442,3558,3559],{},"A terminal Run stays terminal, whatever transition arrives afterwards.",[1442,3561,3562],{},"An edit to a published definition after start does not change the Run snapshot.",[1442,3564,3565],{},"A policy change does reach the next checkpoint of an in flight Run.",[1442,3567,3568,3569,3571],{},"The ",[895,3570,1119],{}," conformance suite normalizes output and events without Agno types.",[1442,3573,3574,3575,3577],{},"A second segment still carries the brief, even when ",[895,3576,184],{}," is None.",[1442,3579,3580],{},"Two segments running at once in one process do not read each other's stop signal.",[1442,3582,3583,3584,3586],{},"A model turn opens an ",[895,3585,1985],{}," span while it runs, so a long turn keeps the heartbeat fresh.",[1442,3588,3589,3590,915],{},"A turn ceiling reached inside a segment stops the loop at the adapter, and the segment ends ",[895,3591,3592],{},"ceiling",[1442,3594,3595,3596,3598],{},"A read tool that fails beside a write tool that pauses ends the segment ",[895,3597,1892],{},", not paused.",[1442,3600,3601,3602,3604],{},"A cancel raised in the drain loop ends the segment ",[895,3603,1884],{},", and raises nothing at Inngest.",[1442,3606,3607],{},"A request the vendor refuses fails the run once, and Inngest replays no step for it.",[1442,3609,3610],{},"A rate limit and a connection fault both replay, whatever the exception class is called.",[1442,3612,3613,3614,915],{},"A model turn that failed leaves a span whose status is ",[895,3615,3616],{},"error",[1442,3618,3619],{},"A tool contract the snapshot froze and the runtime cannot declare fails the run once.",[1442,3621,3622],{},"A rate limit and a platform fault inside a model call both leave the runtime as exceptions, so Inngest replays the step.",[1442,3624,3625],{},"A segment after an approval continues the paused run, and the framework makes no second first turn.",[1442,3627,3628],{},"A segment after a wall-clock yield handles a saved pause, saved history, and no saved session.",[1442,3630,3631],{},"A timed approval continuation keeps its proof for a saved pause and drops it before a fresh turn.",[1442,3633,3634],{},"A model call priced from an OpenAI response prices its cache reads one time.",[1442,3636,3637,3638,915],{},"A completed segment whose model answered nothing still carries a ",[895,3639,2483],{},[1442,3641,3642],{},"A platform fault inside a tool ends the segment, and the model claims nothing.",[1442,3644,3645],{},"A paused write call is decided by policy before it runs, and an allowed one never reaches Inngest.",[1442,3647,3648],{},"A segment after an approval continues the paused run; it never starts the loop again.",[1442,3650,3651,3652,3654],{},"A workflow tool node uses ",[895,3653,902],{},". An agent node and a subworkflow node use child Runs.",[1442,3656,3657],{},"A workflow node walk is deterministic, so a replay produces the same node order and the same step IDs.",[1442,3659,3532,3660,3662],{},[895,3661,1315],{}," node of two branches runs both at once, and a branch that parks does not hold its siblings.",[1442,3664,3665],{},"A failing branch settles its siblings rather than cancelling them, and the node body raises nothing for it.",[1442,3667,3668,3669,3672],{},"A retried child node meets ",[895,3670,3671],{},"duplicate"," and the tree ends with one child.",[1442,3674,3532,3675,3677,3678,3680,3681,3683],{},[895,3676,3074],{}," node produces one ",[895,3679,3074],{}," span, written by ",[895,3682,902],{},", and no second one.",[1442,3685,3686],{},"A workflow run creates its node steps at the body level of the function, and never inside a segment step.",[1442,3688,3689,3690,3692,3693,3696],{},"A successful ",[895,3691,3089],{}," node reads its child's output into ",[895,3694,3695],{},"steps.\u003Cnode id>.output",", and a failed one reads the child's own error code.",[1442,3698,3699,3700,3702,3703,3705],{},"A fan out of ",[895,3701,3074],{}," nodes stops at ",[895,3704,2208],{},", and the calls already in flight are the only overshoot.",[1442,3707,3532,3708,3710],{},[895,3709,3101],{}," node re-checks the depth cap against the live published definitions, not against the parent's frozen snapshot.",[1442,3712,3713,3714,915],{},"Every Run in a tree carries the same ",[895,3715,1377],{},[1442,3717,3718],{},"Cancellation is safe and idempotent.",[1442,3720,3721],{},"A Run of several segments spends its turn ceiling once, not once per segment.",[1442,3723,3724],{},"A workflow of ten agent children gives each child its own turn and tool ceilings and one shared cost ceiling, and the tenth is not handed zero.",[1442,3726,3727,3730,3731,3733],{},[895,3728,3729],{},"AgentExecutor.execute()"," returns an ",[895,3732,914],{}," for every stop reason.",[1442,3735,3736,3737,3739],{},"A Run cancelled between dispatch and claim ends the function with no ",[895,3738,914],{}," and no further write.",[1442,3741,3742,3743,3745],{},"An outcome of ",[895,3744,1411],{}," carries the deadline the Inngest wait times out on, and the function reads no approval row.",[1442,3747,3742,3748,3750],{},[895,3749,1411],{}," writes no new status, because the segment already did.",[1442,3752,3753,3754,3756],{},"Accrual is checked at the top of every segment, on a Run whose ",[895,3755,910],{}," returned long before.",[1442,3758,3759],{},"A segment resumed by a fresh worker reads the same agent session.",[1442,3761,3762,3763,3766],{},"A segment reads the Run row itself, so segment 4 sees ",[895,3764,3765],{},"segment_index = 4"," and not the value the claim answered.",[1442,3768,3769,3770,3772],{},"A Run cancelled between two segments ends ",[895,3771,1884],{}," before the runtime is called.",[1442,3774,3775,3776,3778],{},"A segment that follows a resolved approval receives the approval id, on a Run whose ",[895,3777,1081],{}," is already null.",[1442,3780,3781,3782,3784],{},"A timed segment returns ",[895,3783,2668],{},", advances once, and starts the next segment without a wait.",[1442,3786,3787,3788,3791],{},"A nested ",[895,3789,3790],{},"TimeoutError"," is not a segment yield unless the outer timer expired.",[1442,3793,3794,3795,3798],{},"A yield on the last allowed segment keeps the existing ",[895,3796,3797],{},"limit_reached"," ending.",[1442,3800,3401,3801,915],{},[895,3802,3404],{},[1442,3804,3805,3806,3808,3809,915],{},"A retryable platform fault leaves ",[895,3807,1519],{}," as an exception, and produces no ",[895,3810,914],{},[1442,3812,3813,3814,915],{},"The tool call remainder ignores a span marked ",[895,3815,3816],{},"replayed",[3818,3819,3820],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":893,"searchDepth":32,"depth":233,"links":3822},[3823,3824,3825,3826,3827,3838,3841,3842,3843,3844],{"id":884,"depth":32,"text":885},{"id":1046,"depth":32,"text":1047},{"id":1236,"depth":32,"text":1237},{"id":1381,"depth":32,"text":1382},{"id":1433,"depth":32,"text":1434,"children":3828},[3829,3830,3831,3832,3833,3834],{"id":1524,"depth":233,"text":1525},{"id":1896,"depth":233,"text":1897},{"id":1956,"depth":233,"text":1957},{"id":2146,"depth":233,"text":2147},{"id":2499,"depth":233,"text":2500},{"id":2862,"depth":233,"text":2863,"children":3835},[3836,3837],{"id":2951,"depth":244,"text":2952},{"id":2999,"depth":244,"text":3000},{"id":3020,"depth":32,"text":3021,"children":3839},[3840],{"id":3155,"depth":233,"text":3156},{"id":207,"depth":32,"text":3176},{"id":3202,"depth":32,"text":3203},{"id":3352,"depth":32,"text":3353},{"id":3547,"depth":32,"text":3548},"md",{},[3848,3849],"engineering\u002Fsystem-design\u002Fagentic-platform\u002Fruntime\u002Fdefinitions","engineering\u002Fsystem-design\u002Fagentic-platform\u002Fruntime\u002Fexecution",{"title":380,"description":381},"engineering\u002Fsystem-design\u002Fagentic-platform\u002Fruntime\u002Findex",[149,217,197,312,207,142],"h8dNiznsJRXkpktDTZ5wbxHynBL7YrXJXU2_H9d0_Ys",1788650193221]