[{"data":1,"prerenderedAt":1674},["ShallowReactive",2],{"docs-nav":3,"docs-article-engineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fruntime":763},[4,18,28,45,55,68,76,83,95,107,115,123,129,135,144,152,160,171,177,183,189,195,200,206,212,218,227,233,238,244,249,256,268,279,288,294,305,315,323,334,341,350,359,368,377,387,397,404,410,418,425,432,438,444,449,459,467,476,481,488,498,505,510,517,525,529,534,541,550,559,570,578,583,590,597,603,610,616,623,635,640,648,654,661,666,673,685,694,704,712,718,726,732,742,748,757],{"path":5,"title":6,"description":7,"group":8,"section":6,"order":9,"tags":10,"lastUpdated":16,"hidden":17},"\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",false,{"path":19,"title":20,"description":21,"group":8,"section":22,"order":23,"tags":24,"lastUpdated":27,"hidden":17},"\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,25,26],"chat","system-design","2026-05-13",{"path":29,"title":30,"description":31,"group":8,"section":32,"order":33,"tags":34,"lastUpdated":44,"hidden":17},"\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,35,36,37,38,39,40,41,42,43],"workflow","enrichment","companies","waterfall","cache","intelligence-database","firmographics","provenance","sonar","2026-06-10",{"path":46,"title":47,"description":48,"group":8,"section":47,"order":9,"tags":49,"lastUpdated":54,"hidden":17},"\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.",[12,35,43,50,51,52,36,53,14],"company-search","signals","agent-sdk","scoring","2026-06-08",{"path":56,"title":57,"description":58,"group":8,"section":47,"order":23,"tags":59,"lastUpdated":67,"hidden":17},"\u002Fagents\u002Fcompany-sonar\u002Fsignal-monitoring","Company Signals Monitoring","Superseded. 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,66],"intel","icp","alerts","monitoring","sse","managed-agents","superseded","2026-06-09",{"path":69,"title":70,"description":71,"group":8,"section":72,"order":23,"tags":73,"lastUpdated":75,"hidden":17},"\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,25,74],"context-engineering","2026-05-14",{"path":77,"title":78,"description":79,"group":8,"section":72,"order":33,"tags":80,"lastUpdated":75,"hidden":17},"\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,81,82],"prompt-engineering","system-prompt",{"path":84,"title":85,"description":86,"group":8,"section":85,"order":9,"tags":87,"lastUpdated":54,"hidden":17},"\u002Fagents\u002Fenvoy","Sequences","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,88,89,90,91,92,93,94,14],"envoy","outreach","sales-engagement","sequences","state-machine","human-in-the-loop","nylas",{"path":96,"title":97,"description":98,"group":8,"section":99,"order":9,"tags":100,"lastUpdated":16,"hidden":17},"\u002Fagents\u002Fheadhunter","Headhunter (legacy)","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,35,101,102,14,26,103,38,104,105,106],"headhunter","recruiting","multi-source","entity-resolution","people-intelligence","flywheel",{"path":108,"title":109,"description":110,"group":8,"section":22,"order":33,"tags":111,"lastUpdated":114,"hidden":17},"\u002Fagents\u002Fpaperclip","Paperclip","Architecture deep dive into the Paperclip orchestration system.",[12,14,112,113],"orchestration","paperclip","2026-04-20",{"path":116,"title":117,"description":118,"group":8,"section":32,"order":23,"tags":119,"lastUpdated":16,"hidden":17},"\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,35,36,120,38,39,40,121,42,101,122],"people","linkedin","people-sonar",{"path":124,"title":125,"description":126,"group":8,"section":125,"order":9,"tags":127,"lastUpdated":54,"hidden":17},"\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.",[12,35,122,128,51,101,36,53,14],"people-search",{"path":130,"title":131,"description":132,"group":8,"section":125,"order":23,"tags":133,"lastUpdated":54,"hidden":17},"\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,120,63,134],"warm-leads",{"path":136,"title":137,"description":138,"group":139,"section":22,"order":140,"tags":141,"lastUpdated":143,"hidden":17},"\u002Fengineering\u002Freference\u002Fagno-to-agent-sdk-migration","Agno → Claude Agent SDK migration","Superseded. Agno stays the agent runtime. 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.","Engineering",10,[12,14,142,52,65,66],"migration","2026-06-06",{"path":145,"title":146,"description":147,"group":139,"section":22,"order":23,"tags":148,"lastUpdated":54,"hidden":17},"\u002Fengineering\u002Freference\u002Fcloudflare-agent-sandbox","Cloudflare agent sandbox","Cloudflare's Workers-based agent platform, evaluated as an alternative sandbox for our Agno workflows.",[12,149,150,151,142],"sandbox","cloudflare","workers",{"path":153,"title":154,"description":155,"group":139,"section":22,"order":33,"tags":156,"lastUpdated":159,"hidden":17},"\u002Fengineering\u002Freference\u002Fvirtual-filesystem-rag","Virtual filesystem for AI assistants","How ChromaFs provides AI agents with structured file access.",[12,157,14,158],"rag","chromafs","2026-04-18",{"path":161,"title":162,"description":163,"group":139,"section":162,"order":9,"tags":164,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra","Agentic infra","The high-level system design of the agentic infra - who starts a run, the one run start, the runtime, what a run can do and know, and where it is stored.",[12,14,165,166,167,168,169],"overview","agentic-infra","inngest","runs","policy","2026-10-15",{"path":172,"title":173,"description":174,"group":139,"section":162,"order":175,"tags":176,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fcapabilities","07 · Capabilities","The business actions a user can request: search, enrich, signals, the CRM question, and the definition builder.",7,[12,14,166],{"path":178,"title":179,"description":180,"group":139,"section":162,"order":181,"tags":182,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fcontext-and-memory","09 · Context and memory","Scoped context packing, memory, and the platform corpus.",9,[12,14,166],{"path":184,"title":185,"description":186,"group":139,"section":162,"order":187,"tags":188,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Ffront-door","03 · Front Door","How a conversation reads scoped context and answers, asks, or selects one Agent or Workflow.",3,[12,14,166],{"path":190,"title":191,"description":192,"group":139,"section":162,"order":193,"tags":194,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fgovernance","11 · Governance","Policy at admission, at every tool call and as cost accrues, plus approvals, budgets and idempotency.",11,[12,14,166],{"path":196,"title":197,"description":198,"group":139,"section":162,"order":140,"tags":199,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fintelligence-and-product-state","10 · Intelligence and product state","Where discovery work lands: global intelligence, then organization prospects, then CRM.",[12,14,166],{"path":201,"title":202,"description":203,"group":139,"section":162,"order":204,"tags":205,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fmodel-provider","06 · Model provider","The LLM vendors behind the agent loop, model choice, and token cost.",6,[12,14,166],{"path":207,"title":208,"description":209,"group":139,"section":162,"order":210,"tags":211,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fobservability-and-cost","12 · Observability and cost","The run row, the spans, the cost meter, and the live events.",12,[12,14,166],{"path":213,"title":214,"description":215,"group":139,"section":162,"order":216,"tags":217,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fruns","04 · Runs","The one run start: RunManager, admission, the frozen definition, and dispatch.",4,[12,14,166],{"path":219,"title":220,"description":221,"group":139,"section":162,"order":222,"tags":223,"lastUpdated":226,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fruntime","05 · Runtime","The one runtime: the durable segment loop on Inngest, the AgentExecutor checks, and the Agno agent loop that reasons, calls tools and answers.",5,[12,14,166,224,167,225],"agno","runtime","2026-10-16",{"path":228,"title":229,"description":230,"group":139,"section":162,"order":231,"tags":232,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fstorage","13 · Storage","Postgres on Supabase, pgvector, and Redis.",13,[12,14,166],{"path":234,"title":235,"description":236,"group":139,"section":162,"order":23,"tags":237,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fsurfaces-and-channels","01 · Surfaces and channels","Where work is asked for: the web app, the ac CLI, the channel gateway, and the planned MCP server.",[12,14,166],{"path":239,"title":240,"description":241,"group":139,"section":162,"order":242,"tags":243,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Ftools-and-integrations","08 · Tools and integrations","The tool registry and the provider jobs that reach third-party data vendors.",8,[12,14,166],{"path":245,"title":246,"description":247,"group":139,"section":162,"order":33,"tags":248,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Ftriggers","02 · Triggers","How events, webhooks and schedules match one rule and start a run without a person.",[12,14,166],{"path":250,"title":251,"description":252,"group":139,"section":162,"order":253,"tags":254,"lastUpdated":170,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Freferences\u002Fglossary","Glossary","The terms the agentic infra pages use, in one place.",100,[12,166,255],"glossary",{"path":257,"title":258,"description":259,"group":139,"section":260,"order":193,"tags":261,"lastUpdated":266,"hidden":267},"\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",[262,263,264,11,265],"context","memory","knowledge","pgvector","2026-10-26",true,{"path":269,"title":270,"description":271,"group":139,"section":260,"order":140,"tags":272,"lastUpdated":278,"hidden":267},"\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.",[273,274,275,224,169,276,277],"tools","integrations","mcp","security","idempotency","2026-10-27",{"path":280,"title":281,"description":282,"group":139,"section":260,"order":23,"tags":283,"lastUpdated":287,"hidden":267},"\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,224,167,273,284,225,285,169,286],"skills","channels","observability","2026-10-09",{"path":289,"title":260,"description":290,"group":139,"section":291,"order":23,"tags":292,"lastUpdated":293,"hidden":267},"\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,165,224,167,168,169],"2026-09-04",{"path":295,"title":296,"description":297,"group":139,"section":260,"order":204,"tags":298,"lastUpdated":304,"hidden":267},"\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.",[299,275,12,300,301,302,303],"cli","claude","access","auth","todo","2026-08-18",{"path":306,"title":307,"description":308,"group":139,"section":260,"order":187,"tags":309,"lastUpdated":314,"hidden":267},"\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.",[285,310,311,312,313,276],"slack","web","identity","sessions","2026-08-30",{"path":316,"title":317,"description":318,"group":139,"section":260,"order":216,"tags":319,"lastUpdated":322,"hidden":267},"\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.",[320,321,224,262,169,168],"front-door","routing","2026-10-06",{"path":324,"title":325,"description":326,"group":139,"section":260,"order":33,"tags":327,"lastUpdated":287,"hidden":267},"\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.",[328,329,25,330,331,332,333,168,64],"surfaces","api","approvals","prospects","saved-searches","builder",{"path":335,"title":336,"description":337,"group":139,"section":260,"order":222,"tags":338,"lastUpdated":287,"hidden":267},"\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.",[339,340,167,277],"triggers","events",{"path":342,"title":343,"description":344,"group":139,"section":260,"order":345,"tags":346,"lastUpdated":349,"hidden":267},"\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,[277,168,273,347,348],"webhooks","reliability","2026-09-03",{"path":351,"title":352,"description":353,"group":139,"section":260,"order":231,"tags":354,"lastUpdated":358,"hidden":267},"\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.",[286,168,355,356,64,357],"spans","usage","sentry","2026-08-26",{"path":360,"title":361,"description":362,"group":139,"section":260,"order":210,"tags":363,"lastUpdated":266,"hidden":267},"\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.",[169,364,330,365,366,367],"permissions","limits","governance","credits",{"path":369,"title":6,"description":370,"group":139,"section":371,"order":23,"tags":372,"lastUpdated":376,"hidden":267},"\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,373,51,374,331,36,375,88],"lead-generation","intelligence","signals-search","2026-09-02",{"path":378,"title":379,"description":380,"group":139,"section":371,"order":222,"tags":381,"lastUpdated":386,"hidden":267},"\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.",[382,383,320,12,384,385,169],"authoring","definitions","workflows","templates","2026-09-13",{"path":388,"title":389,"description":390,"group":139,"section":260,"order":391,"tags":392,"lastUpdated":396,"hidden":267},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fcapability-contracts","Company, People and Signals contracts","The capability products, their bounded inputs, stable references, permissions and results.",21,[393,394,120,51,395],"capabilities","company","contracts","2026-10-13",{"path":398,"title":399,"description":400,"group":139,"section":260,"order":401,"tags":402,"lastUpdated":396,"hidden":267},"\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,[393,403,394,120,51],"validation",{"path":405,"title":406,"description":407,"group":139,"section":371,"order":216,"tags":408,"lastUpdated":322,"hidden":267},"\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.",[25,320,264,262,321,409],"citations",{"path":411,"title":412,"description":413,"group":139,"section":371,"order":204,"tags":414,"lastUpdated":417,"hidden":267},"\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.",[415,330,416,169,12],"human-review","inbox","2026-08-31",{"path":419,"title":420,"description":421,"group":139,"section":371,"order":33,"tags":422,"lastUpdated":424,"hidden":267},"\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.",[375,423,37,120,51,374,331,11,36],"discovery","2026-10-08",{"path":426,"title":427,"description":428,"group":139,"section":371,"order":175,"tags":429,"lastUpdated":417,"hidden":267},"\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.",[384,430,333,383,168,355,431,330],"visualizer","graph",{"path":433,"title":434,"description":435,"group":139,"section":260,"order":242,"tags":436,"lastUpdated":396,"hidden":267},"\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.",[225,383,403,437],"publishing",{"path":439,"title":440,"description":441,"group":139,"section":260,"order":181,"tags":442,"lastUpdated":386,"hidden":267},"\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.",[225,168,224,167,330,443,64],"cancellation",{"path":445,"title":446,"description":447,"group":139,"section":260,"order":175,"tags":448,"lastUpdated":358,"hidden":267},"\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.",[225,168,224,384,284,167],{"path":450,"title":451,"description":452,"group":139,"section":453,"order":216,"tags":454,"lastUpdated":458,"hidden":17},"\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",[455,456,264,263,262,457,11],"mission-control","company-state","retrieval","2026-08-12",{"path":460,"title":461,"description":462,"group":139,"section":453,"order":23,"tags":463,"lastUpdated":458,"hidden":17},"\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.",[455,464,465,330,466],"ui","control-plane","activity",{"path":468,"title":469,"description":470,"group":139,"section":453,"order":204,"tags":471,"lastUpdated":458,"hidden":17},"\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.",[455,472,473,474,340,475,302,286],"infrastructure","database","queue","storage",{"path":477,"title":453,"description":478,"group":139,"section":291,"order":187,"tags":479,"lastUpdated":458,"hidden":17},"\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.",[455,480,14,12,384,169,465],"company-os",{"path":482,"title":483,"description":484,"group":139,"section":453,"order":33,"tags":485,"lastUpdated":458,"hidden":17},"\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.",[455,12,284,486,487],"planning","reasoning",{"path":489,"title":490,"description":491,"group":139,"section":453,"order":242,"tags":492,"lastUpdated":458,"hidden":17},"\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.",[455,493,274,494,495,357,496,497],"metrics","stripe","posthog","ingest","dashboards",{"path":499,"title":500,"description":501,"group":139,"section":453,"order":187,"tags":502,"lastUpdated":458,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Forchestration","Orchestration","L4. Workflow, run, step, trigger and event. Five nouns that turn a decision into durable execution.",[455,384,168,339,340,503,504],"durability","retry",{"path":506,"title":361,"description":507,"group":139,"section":453,"order":175,"tags":508,"lastUpdated":458,"hidden":17},"\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.",[455,169,366,330,364,365,509],"audit",{"path":511,"title":270,"description":512,"group":139,"section":453,"order":222,"tags":513,"lastUpdated":458,"hidden":17},"\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.",[455,273,274,514,515,516],"adapters","registry","credentials",{"path":518,"title":519,"description":520,"group":139,"section":521,"order":23,"tags":522,"lastUpdated":524,"hidden":17},"\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",[394,523,167,43],"search","2026-10-05",{"path":526,"title":32,"description":527,"group":139,"section":521,"order":187,"tags":528,"lastUpdated":376,"hidden":17},"\u002Fengineering\u002Fsystem-design\u002Fworkflows\u002Fenrichment","Reusable company and people enrichment workflows with canonical Intelligence write-back, existing tier freshness and bounded asynchronous email.",[36,394,120,167],{"path":530,"title":531,"description":532,"group":139,"section":521,"order":33,"tags":533,"lastUpdated":349,"hidden":17},"\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.",[120,523,167,101],{"path":535,"title":536,"description":537,"group":139,"section":521,"order":216,"tags":538,"lastUpdated":540,"hidden":17},"\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,167,539,66],"intelligence-databases","2026-08-28",{"path":542,"title":543,"description":544,"group":545,"section":546,"order":33,"tags":547,"lastUpdated":549,"hidden":17},"\u002Fproduct-design\u002Foutreach","Outreach","The design of Outreach, our agentic campaign app: a fresh decision at each step, specialist drafts, human approval of every outbound action, two Inngest workflows and a due sweep.","Product Design",null,[89,548,167,330],"agentic","2026-11-02",{"path":551,"title":552,"description":553,"group":545,"section":546,"order":23,"tags":554,"lastUpdated":558,"hidden":17},"\u002Fproduct-design\u002Fpositioning","Product positioning","How AgencyCore is positioned: an always-on AI business development teammate for founder-led marketing agencies. AgencyCore does the prospecting work; the agency owner keeps the decisions.",[555,61,556,89,557],"positioning","agencies","autonomy","2026-10-14",{"path":560,"title":561,"description":562,"group":563,"section":564,"order":216,"tags":565,"lastUpdated":44,"hidden":17},"\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,566,567,568,569],"activities","tasks","data-model","schema",{"path":571,"title":572,"description":573,"group":563,"section":564,"order":222,"tags":574,"lastUpdated":44,"hidden":17},"\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,575,576,577,568],"communications","email","engagement",{"path":579,"title":580,"description":581,"group":563,"section":564,"order":23,"tags":582,"lastUpdated":44,"hidden":17},"\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,37,568,569,14],{"path":584,"title":585,"description":586,"group":563,"section":564,"order":187,"tags":587,"lastUpdated":44,"hidden":17},"\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,588,589,568,569],"deals","pipeline",{"path":591,"title":592,"description":593,"group":563,"section":564,"order":204,"tags":594,"lastUpdated":44,"hidden":17},"\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,595,596,568,569],"lists","segments",{"path":598,"title":599,"description":600,"group":563,"section":564,"order":33,"tags":601,"lastUpdated":44,"hidden":17},"\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,120,602,568,569],"contacts",{"path":604,"title":605,"description":606,"group":563,"section":564,"order":242,"tags":607,"lastUpdated":44,"hidden":17},"\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,608,609,568,569],"saved-filters","views",{"path":611,"title":612,"description":613,"group":563,"section":564,"order":175,"tags":614,"lastUpdated":615,"hidden":17},"\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,374,568,569],"2026-06-11",{"path":617,"title":618,"description":619,"group":563,"section":620,"order":23,"tags":621,"lastUpdated":44,"hidden":17},"\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,37,51,39,622],"eng-669",{"path":624,"title":625,"description":626,"group":563,"section":620,"order":216,"tags":627,"lastUpdated":615,"hidden":17},"\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,628,53,629,630,631,496,632,633,634],"feed","decay","rls","activation","pull","push","origin",{"path":636,"title":637,"description":638,"group":563,"section":620,"order":33,"tags":639,"lastUpdated":615,"hidden":17},"\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,120,51,39,101],{"path":641,"title":642,"description":643,"group":563,"section":620,"order":187,"tags":644,"lastUpdated":615,"hidden":17},"\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,645,629,646,628,647,42,632,633],"polymorphic","taxonomy","ingests",{"path":649,"title":650,"description":651,"group":563,"section":546,"order":9,"tags":652,"lastUpdated":16,"hidden":17},"\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.",[653,14,60,11,51,39,26,165],"data-layer",{"path":655,"title":656,"description":657,"group":658,"section":546,"order":9,"tags":659,"lastUpdated":54,"hidden":17},"\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",[660,486],"roadmap",{"path":662,"title":663,"description":664,"group":658,"section":546,"order":23,"tags":665,"lastUpdated":54,"hidden":17},"\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.",[660,486],{"path":667,"title":668,"description":669,"group":658,"section":546,"order":33,"tags":670,"lastUpdated":672,"hidden":17},"\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.",[660,486,671],"slides","2026-07-01",{"path":674,"title":675,"description":676,"group":677,"section":8,"order":678,"tags":679,"lastUpdated":16,"hidden":17},"\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",20,[680,310,681,682,683,684],"symphony","devops","production","runbooks","operations",{"path":686,"title":687,"description":688,"group":677,"section":8,"order":140,"tags":689,"lastUpdated":16,"hidden":17},"\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.",[680,357,690,691,692,693],"linear","oncall","incident-response","codex",{"path":695,"title":696,"description":697,"group":677,"section":698,"order":140,"tags":699,"lastUpdated":16,"hidden":17},"\u002Fsymphony\u002Fhousekeeping\u002Fcodex-vacuum","Codex vacuum","Interactive design for the Symphony housekeeping timer that checkpoints and vacuums Codex sqlite stores on the VPS.","Housekeeping",[680,700,701,693,702,703],"timed-jobs","housekeeping","sqlite","vps",{"path":705,"title":706,"description":707,"group":677,"section":698,"order":708,"tags":709,"lastUpdated":16,"hidden":17},"\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.",30,[680,700,701,703,710,711],"disk","cleanup",{"path":713,"title":714,"description":715,"group":677,"section":698,"order":678,"tags":716,"lastUpdated":16,"hidden":17},"\u002Fsymphony\u002Fhousekeeping\u002Fworkspace-cleanup","Workspace cleanup","Interactive design for the Symphony housekeeping timer that prunes idle per-issue workspaces after their TTL.",[680,700,701,717,711,703],"workspaces",{"path":719,"title":720,"description":721,"group":677,"section":546,"order":9,"tags":722,"lastUpdated":67,"hidden":17},"\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.",[680,693,690,723,112,703,724,725],"claude-review","qa","automation",{"path":727,"title":728,"description":729,"group":677,"section":291,"order":23,"tags":730,"lastUpdated":458,"hidden":17},"\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.",[680,14,112,12,693,690,731],"systemd",{"path":733,"title":734,"description":735,"group":677,"section":736,"order":737,"tags":738,"lastUpdated":16,"hidden":17},"\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",40,[680,276,700,693,739,740,741],"semgrep","threat-model","ownership",{"path":743,"title":744,"description":745,"group":677,"section":736,"order":708,"tags":746,"lastUpdated":16,"hidden":17},"\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.",[680,700,357,286,747,690],"triage",{"path":749,"title":750,"description":751,"group":677,"section":736,"order":140,"tags":752,"lastUpdated":16,"hidden":17},"\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.",[680,700,753,754,755,756],"e2e","playwright","staging","frontend",{"path":758,"title":759,"description":760,"group":677,"section":736,"order":678,"tags":761,"lastUpdated":16,"hidden":17},"\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.",[680,700,755,724,762,690],"agent-browser",{"id":764,"title":220,"body":765,"customComponent":546,"description":221,"extension":1663,"group":139,"hidden":17,"lastUpdated":226,"meta":1664,"navigation":267,"order":222,"path":219,"related":1665,"section":162,"seo":1670,"stem":1671,"tags":1672,"__hash__":1673},"docs\u002Fengineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fruntime.md",{"type":766,"value":767,"toc":1643},"minimark",[768,772,781,788,793,798,893,897,908,1007,1013,1017,1022,1031,1070,1073,1077,1098,1180,1183,1187,1196,1280,1283,1286,1350,1354,1360,1461,1468,1472,1479,1483,1513,1519,1523,1538,1543,1547,1565,1570,1574,1587,1591,1600,1604,1640],[769,770,220],"h1",{"id":771},"_05-runtime",[773,774,775,776,780],"p",{},"The runtime executes every run that ",[777,778,779],"a",{"href":213},"Runs"," admits. This page explains the core agent loop: how one agent run becomes durable segments, what one segment checks, and how the Agno agent reasons, calls tools and answers. The workflow executor shares the same durable shell, and its own page will cover it.",[773,782,783,787],{},[784,785,786],"strong",{},"Agno is the only agent brain."," Inngest gives durability, and AgencyCore code gives policy, budgets and storage. Agno owns one job: the model turn and the tool-call loop inside one segment.",[789,790],"doc-diagram",{"caption":791,"name":792},"One Inngest function holds a run. It runs the run as segments, and each segment is one durable step. Inside a segment, AgentExecutor checks the run, and the Agno agent loops on model turns and tool calls until it answers, pauses or reaches a ceiling. Numbered badges mark the issues at the end of this page.","runtime-agent-loop",[794,795,797],"h2",{"id":796},"design-rules","Design rules",[799,800,801,814],"table",{},[802,803,804],"thead",{},[805,806,807,811],"tr",{},[808,809,810],"th",{},"Rule",[808,812,813],{},"Why",[815,816,817,831,850,862,870,881],"tbody",{},[805,818,819,828],{},[820,821,822,823,827],"td",{},"Agno is the only agent framework. One file holds every Agno object: ",[824,825,826],"code",{},"runtime\u002Fagent\u002Fagno\u002Fruntime.py",".",[820,829,830],{},"One brain means one tool loop, one session format and one set of failure modes.",[805,832,833,847],{},[820,834,835,836,839,840,843,844,846],{},"No Agno type crosses ",[824,837,838],{},"AgentRuntime.execute()",". ",[824,841,842],{},"runtime\u002Fagent\u002Fprotocol.py"," holds only AgencyCore types, and a test refuses an ",[824,845,224],{}," import there.",[820,848,849],{},"The rest of the platform does not depend on framework details.",[805,851,852,859],{},[820,853,854,855,858],{},"The run is the session. The Agno ",[824,856,857],{},"session_id"," is the run id.",[820,860,861],{},"A second key can disagree with the first.",[805,863,864,867],{},[820,865,866],{},"A segment is one Inngest step. The step either returns a value or raises.",[820,868,869],{},"A raise writes no session, so the Inngest replay starts from clean history.",[805,871,872,878],{},[820,873,874,875,827],{},"Every tool call goes through ",[824,876,877],{},"ToolInvoker",[820,879,880],{},"Policy, budgets, idempotency and metering apply to every call, and the model cannot bypass them.",[805,882,883,886],{},[820,884,885],{},"A ceiling ends the run as a partial success, not a failure.",[820,887,888,889,892],{},"Work done before the ceiling stays done. ",[824,890,891],{},"partial_reason"," says why the rest did not happen.",[794,894,896],{"id":895},"the-durable-shell","The durable shell",[773,898,899,900,903,904,907],{},"One Inngest function, ",[824,901,902],{},"agent\u002Frun.execute"," in ",[824,905,906],{},"runtime\u002Finngest\u002Fexecute.py",", owns one run from claim to finalize.",[909,910,911,930,948,1001],"ol",{},[912,913,914,917,918,921,922,925,926,929],"li",{},[784,915,916],{},"Admission check and claim."," The function checks admission, then moves the run from ",[824,919,920],{},"queued"," to ",[824,923,924],{},"running",". The claim reads ",[824,927,928],{},"max_segments"," from the frozen snapshot one time, so the loop bound cannot move during a replay.",[912,931,932,935,936,939,940,943,944,947],{},[784,933,934],{},"Segment loop."," Each segment is the step ",[824,937,938],{},"segment.N",". An ",[824,941,942],{},"asyncio"," timer stops the segment at 90 seconds (",[824,945,946],{},"MAX_SEGMENT_DURATION_S","), inside the 120 second step budget. The last 30 seconds let the segment save its session and close its spans.",[912,949,950,953,954,957,958],{},[784,951,952],{},"Outcome."," A segment answers an ",[824,955,956],{},"ExecutionOutcome",":\n",[959,960,961,975,984],"ul",{},[912,962,963,966,967,970,971,974],{},[824,964,965],{},"succeeded",", ",[824,968,969],{},"failed"," or ",[824,972,973],{},"cancelled"," ends the loop.",[912,976,977,979,980,983],{},[824,978,924],{}," means the timer cut the segment. The function runs ",[824,981,982],{},"advance.N"," and starts the next segment, which continues from the saved conversation.",[912,985,986,989,990,993,994,996,997,1000],{},[824,987,988],{},"waiting"," means a tool call needs a person. The function runs ",[824,991,992],{},"wait.mark.N",", then ",[824,995,982],{},", then waits for ",[824,998,999],{},"agent\u002Fapproval.resolved",". The wait times out at the approval expiry.",[912,1002,1003,1006],{},[784,1004,1005],{},"Finalize."," One step applies the terminal status and sends the run end event. A terminal status has one writer.",[773,1008,1009,1010,1012],{},"Each status write is its own step. Three writes in one step are not atomic, and a retry of a half-written step leaves the run at ",[824,1011,988],{}," with no wait and no writer.",[794,1014,1016],{"id":1015},"one-segment","One segment",[1018,1019,1021],"h3",{"id":1020},"agentexecutor-checks","AgentExecutor checks",[773,1023,1024,903,1027,1030],{},[824,1025,1026],{},"AgentExecutor",[824,1028,1029],{},"runtime\u002Fexecution\u002Fagent.py"," runs before every model call of a segment:",[909,1032,1033,1039,1042,1045,1052,1058,1061],{},[912,1034,1035,1036,1038],{},"Re-read the run. Stop if the status is not ",[824,1037,924],{},", so a person who pressed stop does not pay for another turn.",[912,1040,1041],{},"Parse the frozen snapshot and the frozen principal. A defect here is terminal, because every retry reads the same snapshot.",[912,1043,1044],{},"Check accrual: the cost of the whole run tree, and the organization day cap.",[912,1046,1047,1048,1051],{},"Compute the remainders. Turns and tool calls already spent in this run come from the span tree, and wall clock comes from ",[824,1049,1050],{},"started_at",". Each segment gets what is left, never the full ceiling.",[912,1053,1054,1055,827],{},"Build a context brief on segment 0, and again after a wait when the policy says ",[824,1056,1057],{},"refresh_on_resume",[912,1059,1060],{},"Filter the frozen tools by the frozen grant.",[912,1062,1063,1064,1067,1068,827],{},"Build the ",[824,1065,1066],{},"AgentExecutionRequest"," and call ",[824,1069,838],{},[773,1071,1072],{},"After the segment, the executor maps the stop reason to an outcome. It also cancels approvals that no outcome waits on. A model can propose several write calls in one turn, but only one approval can park the run.",[1018,1074,1076],{"id":1075},"the-agno-loop","The Agno loop",[773,1078,1079,1082,1083,1086,1087,1090,1091,1094,1095,827],{},[824,1080,1081],{},"AgnoAgentRuntime.execute()"," builds a new Agno ",[824,1084,1085],{},"Agent"," for each segment. Agno uses an ",[824,1088,1089],{},"InMemoryDb",", and the runtime fills it from ",[824,1092,1093],{},"agent.sessions"," and writes it back at the end. Agno telemetry is off, because the default sends the run id to ",[824,1096,1097],{},"os-api.agno.com",[799,1099,1100,1110],{},[802,1101,1102],{},[805,1103,1104,1107],{},[808,1105,1106],{},"Step",[808,1108,1109],{},"What happens",[815,1111,1112,1142,1157,1172],{},[805,1113,1114,1117],{},[820,1115,1116],{},"1 · Model turn",[820,1118,1119,1122,1123,1126,1127,1130,1131,1134,1135,1138,1139,827],{},[824,1120,1121],{},"arun()"," starts the turn, or ",[824,1124,1125],{},"acontinue_run()"," continues a paused run. The output is streamed. ",[824,1128,1129],{},"AgnoEventBridge"," opens one ",[824,1132,1133],{},"llm"," span and writes one usage row per turn, and it publishes ",[824,1136,1137],{},"text.delta"," and ",[824,1140,1141],{},"tool.updated",[805,1143,1144,1147],{},[820,1145,1146],{},"2a · Read tool",[820,1148,1149,1150,1153,1154,1156],{},"The tool runs inside the Agno loop. ",[824,1151,1152],{},"AgnoToolAdapter"," calls ",[824,1155,877],{},", and the result goes back to the model in the same turn.",[805,1158,1159,1162],{},[820,1160,1161],{},"2b · Write or send tool",[820,1163,1164,1165,1167,1168,1171],{},"The tool is declared for external execution, so Agno pauses. The runtime decides the pause in process through ",[824,1166,877],{},", then continues the run. Only a call that policy sends to a person ends the segment as ",[824,1169,1170],{},"needs_approval",". A denial goes back to the model as the call result.",[805,1173,1174,1177],{},[820,1175,1176],{},"3 · Answer checks",[820,1178,1179],{},"The final answer must pass the output schema, the citation check (every cited id must come from a tool result) and the receipt binding. A failed answer gets up to two correction turns with tools, then one fix turn with no tools.",[773,1181,1182],{},"The ceilings apply before every call, not one time per turn. One turn can hold ten write proposals, and a check per turn would let all ten run on a remainder of one. A bound run that reaches a ceiling while it holds receipts gets one closing turn with no tools, so it can answer from the work it already did.",[1018,1184,1186],{"id":1185},"stop-reasons","Stop reasons",[773,1188,1189,1192,1193,1195],{},[824,1190,1191],{},"AgentExecutionResult.stop"," has five values, and ",[824,1194,1026],{}," branches on nothing else.",[799,1197,1198,1208],{},[802,1199,1200],{},[805,1201,1202,1205],{},[808,1203,1204],{},"Stop",[808,1206,1207],{},"Run outcome",[815,1209,1210,1222,1243,1254,1265],{},[805,1211,1212,1217],{},[820,1213,1214],{},[824,1215,1216],{},"completed",[820,1218,1219,1221],{},[824,1220,965],{}," with the result",[805,1223,1224,1229],{},[820,1225,1226],{},[824,1227,1228],{},"ceiling",[820,1230,1231,1233,1234,1236,1237,970,1240],{},[824,1232,965],{}," with ",[824,1235,891],{}," set to ",[824,1238,1239],{},"limit_reached",[824,1241,1242],{},"budget_exhausted",[805,1244,1245,1249],{},[820,1246,1247],{},[824,1248,1170],{},[820,1250,1251,1253],{},[824,1252,988],{}," on the approval, with its expiry",[805,1255,1256,1260],{},[820,1257,1258],{},[824,1259,973],{},[820,1261,1262,1264],{},[824,1263,973],{},", and nothing more is written",[805,1266,1267,1271],{},[820,1268,1269],{},[824,1270,969],{},[820,1272,1273,1275,1276,1279],{},[824,1274,969],{}," with a named ",[824,1277,1278],{},"RunError"," code",[773,1281,1282],{},"A retryable fault, such as a vendor 5xx or a database outage, raises instead of failing. Inngest replays the whole step, and the idempotency journal stops a tool effect from happening two times.",[794,1284,1285],{"id":475},"Storage",[799,1287,1288,1298],{},[802,1289,1290],{},[805,1291,1292,1295],{},[808,1293,1294],{},"Table",[808,1296,1297],{},"Holds",[815,1299,1300,1314,1323,1336],{},[805,1301,1302,1307],{},[820,1303,1304],{},[824,1305,1306],{},"agent.runs",[820,1308,1309,1310,1313],{},"The status, ",[824,1311,1312],{},"segment_index",", the waiting columns and the frozen snapshot",[805,1315,1316,1320],{},[820,1317,1318],{},[824,1319,1093],{},[820,1321,1322],{},"The Agno session, the composed instructions and the receipt ledger. A write at an older segment index is refused.",[805,1324,1325,1333],{},[820,1326,1327,966,1330],{},[824,1328,1329],{},"agent.spans",[824,1331,1332],{},"ai_usage_log",[820,1334,1335],{},"One span per unit of work, and one usage row per model call. The remainders and the cost meter read them.",[805,1337,1338,1347],{},[820,1339,1340,1343,1344],{},[824,1341,1342],{},"agent.approvals",", the idempotency journal, ",[824,1345,1346],{},"agent.run_control",[820,1348,1349],{},"Approval rows, claims of tool effects, and the cooperative cancel flag that the tool adapter reads",[794,1351,1353],{"id":1352},"where-the-code-lives","Where the code lives",[773,1355,1356,1357,827],{},"Paths are relative to ",[824,1358,1359],{},"ac-python-api\u002Fsrc\u002Fagentic\u002F",[799,1361,1362,1372],{},[802,1363,1364],{},[805,1365,1366,1369],{},[808,1367,1368],{},"Concern",[808,1370,1371],{},"Start here",[815,1373,1374,1383,1404,1413,1423,1431,1441,1451],{},[805,1375,1376,1379],{},[820,1377,1378],{},"The framework-neutral contract",[820,1380,1381],{},[824,1382,842],{},[805,1384,1385,1387],{},[820,1386,1076],{},[820,1388,1389,1391,1392,966,1395,966,1398,1138,1401],{},[824,1390,826],{},", with ",[824,1393,1394],{},"adapter.py",[824,1396,1397],{},"bridge.py",[824,1399,1400],{},"segment.py",[824,1402,1403],{},"session.py",[805,1405,1406,1409],{},[820,1407,1408],{},"Segment checks and outcome mapping",[820,1410,1411],{},[824,1412,1029],{},[805,1414,1415,1418],{},[820,1416,1417],{},"Run kind dispatch",[820,1419,1420],{},[824,1421,1422],{},"runtime\u002Fexecution\u002Fexecutor.py",[805,1424,1425,1427],{},[820,1426,896],{},[820,1428,1429],{},[824,1430,906],{},[805,1432,1433,1436],{},[820,1434,1435],{},"Ceilings and step budgets",[820,1437,1438],{},[824,1439,1440],{},"shared\u002Fceilings.py",[805,1442,1443,1446],{},[820,1444,1445],{},"Model pairs that may publish",[820,1447,1448],{},[824,1449,1450],{},"runtime\u002Fdefinitions\u002Fmodel_registry.py",[805,1452,1453,1456],{},[820,1454,1455],{},"The tool call pipeline",[820,1457,1458],{},[824,1459,1460],{},"services\u002Ftools\u002Fdefault_invoker.py",[773,1462,1463,1464,1467],{},"The Front Door is a second Agno call site, in ",[824,1465,1466],{},"entry_control\u002Ffront_door\u002Fagno.py",". It makes single-turn calls with no tools, so it does not use the segment loop.",[794,1469,1471],{"id":1470},"issues","Issues",[773,1473,1474,1475,1478],{},"The analysis of ",[824,1476,1477],{},"ac-python-api"," on 2026-10-16 found these issues. The numbers match the badges on the diagram.",[1018,1480,1482],{"id":1481},"_1-the-approval-window-is-the-runs-remaining-wall-clock","1 · The approval window is the run's remaining wall clock",[773,1484,1485,1488,1489,1491,1492,903,1495,1497,1498,903,1501,1504,1505,1508,1509,1512],{},[824,1486,1487],{},"max_run_duration"," counts from ",[824,1490,1050],{},", and waits count too (",[824,1493,1494],{},"_elapsed",[824,1496,1029],{},"). ",[824,1499,1500],{},"_expiry",[824,1502,1503],{},"governance\u002Fpolicy\u002Fapprovals\u002Fservice.py"," sets an approval expiry to ",[824,1506,1507],{},"min(now + 24 h, run deadline)",". An agent with ",[824,1510,1511],{},"max_run_duration_s: 300",", such as the CRM question agent or the company finder agent, gives a person less than 5 minutes to answer. After the approval, the next segment gets only the time that is left.",[773,1514,1515,1518],{},[784,1516,1517],{},"Fix:"," stop the wall clock while a run waits, or give each wait its own deadline that the run deadline does not cap.",[1018,1520,1522],{"id":1521},"_2-a-read-tool-cannot-ask-a-person","2 · A read tool cannot ask a person",[773,1524,1525,1526,1529,1530,1533,1534,1537],{},"A read tool runs inside the Agno loop, and that loop has no pause. When policy answers ",[824,1527,1528],{},"require_approval"," for a read tool, the run fails with ",[824,1531,1532],{},"read_tool_needs_approval"," (",[824,1535,1536],{},"runtime\u002Fagent\u002Fagno\u002Fruntime.py:1607",").",[773,1539,1540,1542],{},[784,1541,1517],{}," refuse a policy rule that gates a read tool at publish time, or declare a gated read tool for external execution so that it pauses as a write does.",[1018,1544,1546],{"id":1545},"_3-suspected-the-agno-history-window-can-drop-early-turns","3 · Suspected: the Agno history window can drop early turns",[773,1548,1549,1550,1533,1553,1556,1557,1560,1561,1564],{},"The runtime sets ",[824,1551,1552],{},"num_history_runs = max_segments",[824,1554,1555],{},"runtime\u002Fagent\u002Fagno\u002Fruntime.py:376","), so the window counts Agno runs. One segment can make up to four Agno runs: the first turn, two correction turns, and a fix or closing turn. Agno includes only messages from the last ",[824,1558,1559],{},"num_history_runs"," runs. A long run can then lose its first task and its early tool results. The citation check (",[824,1562,1563],{},"_read_ids",") also reads that history, so it can refuse an id that a dropped turn read. No test or live run has shown this yet.",[773,1566,1567,1569],{},[784,1568,1517],{}," set the window from the number of Agno runs, not segments, or remove the bound. Add a test for a run with corrections across several segments.",[1018,1571,1573],{"id":1572},"_4-no-budget-override-approval","4 · No budget override approval",[773,1575,1576,1577,1579,1580,1533,1583,1586],{},"When accrual answers ",[824,1578,1528],{},", the run stops as it does on ",[824,1581,1582],{},"deny",[824,1584,1585],{},"runtime\u002Fexecution\u002Fagent.py:330","). A person cannot approve extra spend.",[1018,1588,1590],{"id":1589},"_5-agent-runs-wait-on-approvals-only","5 · Agent runs wait on approvals only",[773,1592,1593,1594,1533,1597,1537],{},"Any other wait kind fails the run with ",[824,1595,1596],{},"wait_kind_not_implemented",[824,1598,1599],{},"runtime\u002Finngest\u002Fexecute.py:1534",[1018,1601,1603],{"id":1602},"_6-stale-comments-in-the-runtime","6 · Stale comments in the runtime",[959,1605,1606,1620,1626],{},[912,1607,1608,1611,1612,1615,1616,1619],{},[824,1609,1610],{},"runtime\u002Fagent\u002Fagno\u002Fruntime.py:915"," says ",[824,1613,1614],{},"advance_segment"," has no caller and that every later segment write is refused. ",[824,1617,1618],{},"runtime\u002Finngest\u002Fexecute.py:1726"," calls it.",[912,1621,1622,1625],{},[824,1623,1624],{},"runtime\u002Fagent\u002Fagno\u002Fruntime.py:428"," says no tool executes before ENG-2080. The invoker runs tools today.",[912,1627,1628,1629,1632,1633,1636,1637,1639],{},"The ",[824,1630,1631],{},"_wait_out"," docstring in ",[824,1634,1635],{},"runtime\u002Finngest\u002Fexecute.py:1922"," says that no runtime answers ",[824,1638,1170],{}," and that the recovery sweep is not built. Both exist now.",[773,1641,1642],{},"These comments describe a system that no longer exists, so they mislead the next reader.",{"title":1644,"searchDepth":33,"depth":187,"links":1645},"",[1646,1647,1648,1653,1654,1655],{"id":796,"depth":33,"text":797},{"id":895,"depth":33,"text":896},{"id":1015,"depth":33,"text":1016,"children":1649},[1650,1651,1652],{"id":1020,"depth":187,"text":1021},{"id":1075,"depth":187,"text":1076},{"id":1185,"depth":187,"text":1186},{"id":475,"depth":33,"text":1285},{"id":1352,"depth":33,"text":1353},{"id":1470,"depth":33,"text":1471,"children":1656},[1657,1658,1659,1660,1661,1662],{"id":1481,"depth":187,"text":1482},{"id":1521,"depth":187,"text":1522},{"id":1545,"depth":187,"text":1546},{"id":1572,"depth":187,"text":1573},{"id":1589,"depth":187,"text":1590},{"id":1602,"depth":187,"text":1603},"md",{},[1666,1667,1668,1669],"engineering\u002Fsystem-design\u002Fagentic-infra","engineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fruns","engineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fmodel-provider","engineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fgovernance",{"title":220,"description":221},"engineering\u002Fsystem-design\u002Fagentic-infra\u002Fmodules\u002Fruntime",[12,14,166,224,167,225],"0hzwn43P3W5HD-SiZ8sBfPgBpc1i91_pbzOZNi6Jh74",1793809798866]