[{"data":1,"prerenderedAt":3752},["ShallowReactive",2],{"docs-nav":3,"docs-article-engineering\u002Fsystem-design\u002Fagentic-platform\u002Fcapabilities\u002Fstate-and-knowledge":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":179,"body":799,"customComponent":480,"description":180,"extension":3741,"group":139,"lastUpdated":188,"meta":3742,"navigation":1153,"order":182,"path":178,"related":3743,"section":181,"seo":3748,"stem":3749,"tags":3750,"__hash__":3751},"docs\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fcapabilities\u002Fstate-and-knowledge.md",{"type":800,"value":801,"toc":3708},"minimark",[802,806,810,818,823,890,901,908,915,920,923,949,953,956,962,1034,1037,1051,1062,1072,1081,1084,1088,1091,1097,1101,1107,1110,1485,1508,1522,1532,1583,1596,1638,1651,1676,1679,1682,1685,1688,1750,1754,1757,1776,1779,1792,1798,1801,1808,1815,1819,1825,1831,1837,1855,1869,1872,1875,1879,1882,1914,1921,1940,1982,1989,1993,2007,2021,2067,2074,2092,2110,2112,2168,2178,2181,2187,2191,2197,2201,2207,2214,2224,2230,2233,2239,2245,2251,2272,2275,2281,2284,2286,2292,2331,2334,2340,2345,2359,2377,2381,2388,2397,2403,2406,2426,2432,2450,2464,2468,2483,2486,2492,2504,2509,2512,2518,2530,2538,2548,2554,2558,2566,2573,2581,2594,2603,2609,2617,2620,2627,2634,2654,2708,2711,2715,2718,2725,2760,2776,2799,2820,2835,2838,2852,2856,2863,2868,2872,2879,2888,2894,2897,2901,2904,2911,2914,2928,2938,2948,2954,2967,2973,2976,2979,2995,3002,3007,3013,3019,3023,3026,3099,3102,3106,3166,3170,3354,3358,3479,3483,3503,3507,3704],[803,804,179],"h1",{"id":805},"state-and-knowledge",[807,808,809],"p",{},"The runtime decides how to run work. This layer decides what the work may know.",[807,811,812,813,817],{},"Reading is this layer. Acting is a ",[814,815,816],"a",{"href":190},"tool",".",[819,820,822],"h2",{"id":821},"fact-owners","Fact owners",[824,825,826,842],"table",{},[827,828,829],"thead",{},[830,831,832,836,839],"tr",{},[833,834,835],"th",{},"Kind",[833,837,838],{},"Question",[833,840,841],{},"Authority",[843,844,845,857,868,879],"tbody",{},[830,846,847,851,854],{},[848,849,850],"td",{},"Conversation",[848,852,853],{},"What did this person just say?",[848,855,856],{},"The conversation itself",[830,858,859,862,865],{},[848,860,861],{},"Application and CRM state",[848,863,864],{},"What is true about the business now?",[848,866,867],{},"The owning domain",[830,869,870,873,876],{},[848,871,872],{},"Knowledge",[848,874,875],{},"What does a published document say?",[848,877,878],{},"Platform and organization knowledge sources",[830,880,881,884,887],{},[848,882,883],{},"Memory",[848,885,886],{},"What happened before, and what does this person prefer?",[848,888,889],{},"Observations from earlier runs",[891,892,898],"pre",{"className":893,"code":895,"language":896,"meta":897},[894],"language-text","conversation > application state > definition summaries > knowledge > memory > run history\n","text","",[899,900,895],"code",{"__ignoreMap":897},[807,902,903,904,907],{},"Six classes, because ",[899,905,906],{},"ContextItem.kind"," has six values. Definition summaries sit\nbetween application state and knowledge: they explain published Agents,\nWorkflows and Skills, but they do not override current application rows. Run\nhistory sits last: it is the weakest claim about what is true now, since it says\nonly what an earlier run believed. A shorter order would leave the packer with\nno rule for the rest.",[807,909,910,911,914],{},"Conversation sits first, and it is the one class that is never cut. It is what the\nperson said, so a brief that dropped it would answer a question nobody asked. It\ncreates no ",[899,912,913],{},"subject_key",", so it never wins or loses a dedupe.",[916,917,919],"h3",{"id":918},"what-precedence-actually-does","What precedence actually does",[807,921,922],{},"Precedence is a packer rule, not a sentence in a prompt. It does three things, and nothing else.",[924,925,926,934,940],"ol",{},[927,928,929,933],"li",{},[930,931,932],"strong",{},"Section order."," The brief renders the conversation first, then application state, then definition summaries, then knowledge, then memory.",[927,935,936,939],{},[930,937,938],{},"Budget order."," The packer spends the token budget from the top. Lower-priority classes are cut before higher-priority classes.",[927,941,942,945,946,948],{},[930,943,944],{},"Same subject wins upward."," When two items share a ",[899,947,913],{},", the higher class stays and the lower class is dropped, and the drop is counted.",[916,950,952],{"id":951},"the-key-format-because-precedence-is-nothing-without-it","The key format, because precedence is nothing without it",[807,954,955],{},"Rule 3 fires only when two items create the same string. The source contract defines each attribute namespace, so a key collision is deliberate.",[891,957,960],{"className":958,"code":959,"language":896,"meta":897},[894],"subject_key = \u003Centity kind>:\u003Centity id>:\u003Cattribute>\n\ncrm.company:8f21…:lifecycle_stage\ncrm.person:4a09…:current_title\nuser:3b7c…:preference.language\n",[899,961,959],{"__ignoreMap":897},[824,963,964,974],{},[827,965,966],{},[830,967,968,971],{},[833,969,970],{},"Source",[833,972,973],{},"Creates it from",[843,975,976,984,992,1002,1020,1027],{},[830,977,978,981],{},[848,979,980],{},"conversation",[848,982,983],{},"nothing",[830,985,986,989],{},[848,987,988],{},"application",[848,990,991],{},"the row it returned, and the field it is about",[830,993,994,997],{},[848,995,996],{},"definition_summary",[848,998,999],{},[899,1000,1001],{},"agent.definition:\u003Cdefinition id>:summary",[830,1003,1004,1006],{},[848,1005,185],{},[848,1007,1008,1011,1012,1015,1016,1019],{},[899,1009,1010],{},"subject_refs"," plus a namespaced ",[899,1013,1014],{},"observation."," or ",[899,1017,1018],{},"preference."," attribute",[830,1021,1022,1024],{},[848,1023,186],{},[848,1025,1026],{},"usually nothing; a document is rarely about one field",[830,1028,1029,1032],{},[848,1030,1031],{},"run history",[848,1033,983],{},[807,1035,1036],{},"A key is optional, and an item without one never collides. That is correct: most knowledge chunks are about a subject too broad to name.",[807,1038,1039,1040,1043,1044,1047,1048,817],{},"One ",[899,1041,1042],{},"make_subject_key()"," helper creates every key from a ",[899,1045,1046],{},"ResourceRef"," and an attribute. It returns no key when the ref or attribute is ",[899,1049,1050],{},"None",[807,1052,1053,1054,1057,1058,1061],{},"It raises ",[899,1055,1056],{},"ValueError"," when a part is empty or contains ",[899,1059,1060],{},":",". These rules make the delimiter unambiguous.",[807,1063,1064,1067,1068,1071],{},[930,1065,1066],{},"The attribute half is what makes it work."," ",[899,1069,1070],{},"crm.company:8f21…"," alone would merge unrelated facts about one company. Two items collide only when the full key matches.",[807,1073,1074,1075,1077,1078,1080],{},"Application attributes are exact field names. Memory attributes stay in the ",[899,1076,1014],{}," and ",[899,1079,1018],{}," namespaces. These keys do not collide by accident.",[807,1082,1083],{},"The packer cannot detect that a memory sentence contradicts a CRM row in free text. It can enforce these three rules. Do not claim more.",[819,1085,1087],{"id":1086},"context-builder","Context builder",[807,1089,1090],{},"The context builder is deterministic infrastructure. It is not an agent, and it makes no model call.",[891,1092,1095],{"className":1093,"code":1094,"language":896,"meta":897},[894],"ContextRequest + ContextPolicy\n             │\n             ▼\n       ContextBuilder\n             │\n      concurrent retrieve\n     ┌───────┬────────┼────────┬────────┬──────────┐\n     ▼       ▼        ▼        ▼        ▼          ▼\nConversation Application Definitions Knowledge Memory Run history\n     └───────┴────────┼────────┴────────┴──────────┘\n             ▼\n        ContextItem[]\n             │\n             ▼\n        ContextPacker\n             │\n             ▼\n        ContextBrief\n",[899,1096,1094],{"__ignoreMap":897},[819,1098,1100],{"id":1099},"core-code","Core code",[891,1102,1105],{"className":1103,"code":1104,"language":896,"meta":897},[894],"services\u002F\n  crm.py          the CRM projections, the ref normalizer and the scoped read\nservices\u002Fcontext\u002F\n  models.py       ContextRequest, ContextPolicy, ContextSourceSpec, ContextItem, ContextBrief\n  builder.py      ContextBuilder\n  packer.py       ContextPacker\n  registry.py     ContextSourceRegistry\n  sources\u002F\n    application.py    CRM and product rows already in scope\n    conversation.py   the recent messages and summary of one conversation\n    definition_summary.py  safe summaries of visible Agents, Workflows and Skills\n    knowledge.py      hybrid search over knowledge chunks\n    memory.py         agent.live_memories\n    run_history.py    earlier runs for this subject or entity\nservices\u002Fmemory\u002F\n  models.py       MemoryCandidate, AgentMemory\n  repository.py   service-role memory reads and inserts\n  service.py      MemoryService\n",[899,1106,1104],{"__ignoreMap":897},[916,1108,1109],{"id":322},"Contracts",[891,1111,1115],{"className":1112,"code":1113,"language":1114,"meta":897,"style":897},"language-python shiki shiki-themes github-dark","@dataclass(frozen=True)\nclass ContextSubject:\n    organization_id: UUID             # the tenancy every source filters by\n    user_id: UUID | None\n    trigger_id: UUID | None\n    definition_id: UUID | None        # None for a front door turn\n\n\n@dataclass(frozen=True)\nclass ContextRequest:\n    subject: ContextSubject           # every source filters through this\n    query: str                        # user text, or the run input summary\n    entities: list[ResourceRef]       # what is already in scope\n    run_id: UUID | None = None\n    conversation_id: UUID | None = None\n\n\nclass ContextSourceSpec(BaseModel):\n    name: str                         # the registered source name\n    enabled: bool = True\n    required: bool = False            # a failure here fails the run\n    token_budget: int = Field(ge=0, strict=True)\n    limit: int | None = Field(default=None, ge=0, le=MAX_CONTEXT_ITEM_LIMIT, strict=True)  # None uses the source default\n    options: dict = {}                # validated against the source's declared schema\n\n\nclass ContextPolicy(BaseModel):\n    sources: list[ContextSourceSpec]\n    total_token_budget: int = Field(default=0, ge=0, strict=True)\n    refresh_on_resume: bool = True\n\n\nclass ContextItem(BaseModel):\n    source: str                       # which source produced it\n    kind: Literal['application', 'conversation', 'definition_summary', 'knowledge', 'memory', 'run_history']\n    title: str\n    body: str\n    subject_key: str | None = None    # precedence and dedupe\n    ref: ResourceRef | None = None    # the row behind the item\n    recorded_at: datetime | None = None\n    tokens: int = 0\n\n\ndef make_subject_key(ref: ResourceRef | None, attribute: str | None) -> str | None: ...\n\n\nclass ContextBrief(BaseModel):\n    text: str\n    items: list[ResourceRef]          # what the model was shown, for audit and citation\n    tokens: int\n    per_source_tokens: dict[str, int]\n    dropped: dict[str, int]\n    failed_sources: list[str]\n\n\nclass ContextBuilder:\n    async def build(self, request: ContextRequest, policy: ContextPolicy) -> ContextBrief: ...\n\n\nclass DefaultContextBuilder:\n    def __init__(\n        self,\n        registry: ContextSourceRegistry,\n        packer: ContextPacker,\n        *,\n        source_timeout_s: float = 1.0,\n    ) -> None: ...\n","python",[899,1116,1117,1124,1129,1134,1139,1144,1149,1155,1159,1163,1168,1173,1178,1183,1188,1194,1199,1204,1210,1216,1221,1226,1231,1237,1243,1248,1253,1259,1265,1271,1276,1281,1286,1292,1298,1304,1310,1316,1322,1328,1333,1339,1344,1349,1355,1360,1365,1371,1377,1383,1388,1394,1400,1406,1411,1416,1422,1428,1433,1438,1443,1449,1455,1461,1467,1473,1479],{"__ignoreMap":897},[1118,1119,1121],"span",{"class":1120,"line":22},"line",[1118,1122,1123],{},"@dataclass(frozen=True)\n",[1118,1125,1126],{"class":1120,"line":32},[1118,1127,1128],{},"class ContextSubject:\n",[1118,1130,1131],{"class":1120,"line":233},[1118,1132,1133],{},"    organization_id: UUID             # the tenancy every source filters by\n",[1118,1135,1136],{"class":1120,"line":244},[1118,1137,1138],{},"    user_id: UUID | None\n",[1118,1140,1141],{"class":1120,"line":264},[1118,1142,1143],{},"    trigger_id: UUID | None\n",[1118,1145,1146],{"class":1120,"line":222},[1118,1147,1148],{},"    definition_id: UUID | None        # None for a front door turn\n",[1118,1150,1151],{"class":1120,"line":360},[1118,1152,1154],{"emptyLinePlaceholder":1153},true,"\n",[1118,1156,1157],{"class":1120,"line":368},[1118,1158,1154],{"emptyLinePlaceholder":1153},[1118,1160,1161],{"class":1120,"line":375},[1118,1162,1123],{},[1118,1164,1165],{"class":1120,"line":157},[1118,1166,1167],{},"class ContextRequest:\n",[1118,1169,1170],{"class":1120,"line":182},[1118,1171,1172],{},"    subject: ContextSubject           # every source filters through this\n",[1118,1174,1175],{"class":1120,"line":290},[1118,1176,1177],{},"    query: str                        # user text, or the run input summary\n",[1118,1179,1180],{"class":1120,"line":280},[1118,1181,1182],{},"    entities: list[ResourceRef]       # what is already in scope\n",[1118,1184,1185],{"class":1120,"line":272},[1118,1186,1187],{},"    run_id: UUID | None = None\n",[1118,1189,1191],{"class":1120,"line":1190},15,[1118,1192,1193],{},"    conversation_id: UUID | None = None\n",[1118,1195,1197],{"class":1120,"line":1196},16,[1118,1198,1154],{"emptyLinePlaceholder":1153},[1118,1200,1202],{"class":1120,"line":1201},17,[1118,1203,1154],{"emptyLinePlaceholder":1153},[1118,1205,1207],{"class":1120,"line":1206},18,[1118,1208,1209],{},"class ContextSourceSpec(BaseModel):\n",[1118,1211,1213],{"class":1120,"line":1212},19,[1118,1214,1215],{},"    name: str                         # the registered source name\n",[1118,1217,1218],{"class":1120,"line":520},[1118,1219,1220],{},"    enabled: bool = True\n",[1118,1222,1223],{"class":1120,"line":318},[1118,1224,1225],{},"    required: bool = False            # a failure here fails the run\n",[1118,1227,1228],{"class":1120,"line":327},[1118,1229,1230],{},"    token_budget: int = Field(ge=0, strict=True)\n",[1118,1232,1234],{"class":1120,"line":1233},23,[1118,1235,1236],{},"    limit: int | None = Field(default=None, ge=0, le=MAX_CONTEXT_ITEM_LIMIT, strict=True)  # None uses the source default\n",[1118,1238,1240],{"class":1120,"line":1239},24,[1118,1241,1242],{},"    options: dict = {}                # validated against the source's declared schema\n",[1118,1244,1246],{"class":1120,"line":1245},25,[1118,1247,1154],{"emptyLinePlaceholder":1153},[1118,1249,1251],{"class":1120,"line":1250},26,[1118,1252,1154],{"emptyLinePlaceholder":1153},[1118,1254,1256],{"class":1120,"line":1255},27,[1118,1257,1258],{},"class ContextPolicy(BaseModel):\n",[1118,1260,1262],{"class":1120,"line":1261},28,[1118,1263,1264],{},"    sources: list[ContextSourceSpec]\n",[1118,1266,1268],{"class":1120,"line":1267},29,[1118,1269,1270],{},"    total_token_budget: int = Field(default=0, ge=0, strict=True)\n",[1118,1272,1273],{"class":1120,"line":481},[1118,1274,1275],{},"    refresh_on_resume: bool = True\n",[1118,1277,1279],{"class":1120,"line":1278},31,[1118,1280,1154],{"emptyLinePlaceholder":1153},[1118,1282,1284],{"class":1120,"line":1283},32,[1118,1285,1154],{"emptyLinePlaceholder":1153},[1118,1287,1289],{"class":1120,"line":1288},33,[1118,1290,1291],{},"class ContextItem(BaseModel):\n",[1118,1293,1295],{"class":1120,"line":1294},34,[1118,1296,1297],{},"    source: str                       # which source produced it\n",[1118,1299,1301],{"class":1120,"line":1300},35,[1118,1302,1303],{},"    kind: Literal['application', 'conversation', 'definition_summary', 'knowledge', 'memory', 'run_history']\n",[1118,1305,1307],{"class":1120,"line":1306},36,[1118,1308,1309],{},"    title: str\n",[1118,1311,1313],{"class":1120,"line":1312},37,[1118,1314,1315],{},"    body: str\n",[1118,1317,1319],{"class":1120,"line":1318},38,[1118,1320,1321],{},"    subject_key: str | None = None    # precedence and dedupe\n",[1118,1323,1325],{"class":1120,"line":1324},39,[1118,1326,1327],{},"    ref: ResourceRef | None = None    # the row behind the item\n",[1118,1329,1330],{"class":1120,"line":503},[1118,1331,1332],{},"    recorded_at: datetime | None = None\n",[1118,1334,1336],{"class":1120,"line":1335},41,[1118,1337,1338],{},"    tokens: int = 0\n",[1118,1340,1342],{"class":1120,"line":1341},42,[1118,1343,1154],{"emptyLinePlaceholder":1153},[1118,1345,1347],{"class":1120,"line":1346},43,[1118,1348,1154],{"emptyLinePlaceholder":1153},[1118,1350,1352],{"class":1120,"line":1351},44,[1118,1353,1354],{},"def make_subject_key(ref: ResourceRef | None, attribute: str | None) -> str | None: ...\n",[1118,1356,1358],{"class":1120,"line":1357},45,[1118,1359,1154],{"emptyLinePlaceholder":1153},[1118,1361,1363],{"class":1120,"line":1362},46,[1118,1364,1154],{"emptyLinePlaceholder":1153},[1118,1366,1368],{"class":1120,"line":1367},47,[1118,1369,1370],{},"class ContextBrief(BaseModel):\n",[1118,1372,1374],{"class":1120,"line":1373},48,[1118,1375,1376],{},"    text: str\n",[1118,1378,1380],{"class":1120,"line":1379},49,[1118,1381,1382],{},"    items: list[ResourceRef]          # what the model was shown, for audit and citation\n",[1118,1384,1385],{"class":1120,"line":491},[1118,1386,1387],{},"    tokens: int\n",[1118,1389,1391],{"class":1120,"line":1390},51,[1118,1392,1393],{},"    per_source_tokens: dict[str, int]\n",[1118,1395,1397],{"class":1120,"line":1396},52,[1118,1398,1399],{},"    dropped: dict[str, int]\n",[1118,1401,1403],{"class":1120,"line":1402},53,[1118,1404,1405],{},"    failed_sources: list[str]\n",[1118,1407,1409],{"class":1120,"line":1408},54,[1118,1410,1154],{"emptyLinePlaceholder":1153},[1118,1412,1414],{"class":1120,"line":1413},55,[1118,1415,1154],{"emptyLinePlaceholder":1153},[1118,1417,1419],{"class":1120,"line":1418},56,[1118,1420,1421],{},"class ContextBuilder:\n",[1118,1423,1425],{"class":1120,"line":1424},57,[1118,1426,1427],{},"    async def build(self, request: ContextRequest, policy: ContextPolicy) -> ContextBrief: ...\n",[1118,1429,1431],{"class":1120,"line":1430},58,[1118,1432,1154],{"emptyLinePlaceholder":1153},[1118,1434,1436],{"class":1120,"line":1435},59,[1118,1437,1154],{"emptyLinePlaceholder":1153},[1118,1439,1440],{"class":1120,"line":529},[1118,1441,1442],{},"class DefaultContextBuilder:\n",[1118,1444,1446],{"class":1120,"line":1445},61,[1118,1447,1448],{},"    def __init__(\n",[1118,1450,1452],{"class":1120,"line":1451},62,[1118,1453,1454],{},"        self,\n",[1118,1456,1458],{"class":1120,"line":1457},63,[1118,1459,1460],{},"        registry: ContextSourceRegistry,\n",[1118,1462,1464],{"class":1120,"line":1463},64,[1118,1465,1466],{},"        packer: ContextPacker,\n",[1118,1468,1470],{"class":1120,"line":1469},65,[1118,1471,1472],{},"        *,\n",[1118,1474,1476],{"class":1120,"line":1475},66,[1118,1477,1478],{},"        source_timeout_s: float = 1.0,\n",[1118,1480,1482],{"class":1120,"line":1481},67,[1118,1483,1484],{},"    ) -> None: ...\n",[807,1486,1487,1488,1067,1494,1496,1497,1077,1500,1503,1504,1507],{},"⚠️ ",[930,1489,1490,1491,817],{},"The request carries a subject, and it does not carry a ",[899,1492,1493],{},"Principal",[899,1495,1493],{}," is the frozen authority of one run, so ",[899,1498,1499],{},"run_id",[899,1501,1502],{},"definition_id"," are required on it. The ",[814,1505,1506],{"href":241},"Front Door"," builds context before any run exists, and it must never mint a principal, because a fake authority is what the policy plane exists to refuse.",[807,1509,1510,1513,1514,1517,1518,1521],{},[899,1511,1512],{},"ContextSubject"," is the four fields the sources actually read, and nothing else. ",[899,1515,1516],{},"Principal.subject"," answers one, so the run path is unchanged and the tenancy still has one writer. ",[899,1519,1520],{},"ContextSubject.of_actor()"," answers one for a turn.",[807,1523,1524,1525,1528,1529,1531],{},"A source that needs a field the turn cannot supply must say so. ",[899,1526,1527],{},"MemoryContextSource"," filters on ",[899,1530,1502],{},", because a memory belongs to the agent that wrote it, so it retrieves nothing for a null definition rather than widening the read.",[891,1533,1535],{"className":1112,"code":1534,"language":1114,"meta":897,"style":897},"\n\nclass ContextPacker:\n    def pack(\n        self,\n        items: list[ContextItem],\n        policy: ContextPolicy,\n        *,\n        failed_sources: Sequence[str] = (),\n    ) -> ContextBrief: ...\n",[899,1536,1537,1541,1545,1550,1555,1559,1564,1569,1573,1578],{"__ignoreMap":897},[1118,1538,1539],{"class":1120,"line":22},[1118,1540,1154],{"emptyLinePlaceholder":1153},[1118,1542,1543],{"class":1120,"line":32},[1118,1544,1154],{"emptyLinePlaceholder":1153},[1118,1546,1547],{"class":1120,"line":233},[1118,1548,1549],{},"class ContextPacker:\n",[1118,1551,1552],{"class":1120,"line":244},[1118,1553,1554],{},"    def pack(\n",[1118,1556,1557],{"class":1120,"line":264},[1118,1558,1454],{},[1118,1560,1561],{"class":1120,"line":222},[1118,1562,1563],{},"        items: list[ContextItem],\n",[1118,1565,1566],{"class":1120,"line":360},[1118,1567,1568],{},"        policy: ContextPolicy,\n",[1118,1570,1571],{"class":1120,"line":368},[1118,1572,1472],{},[1118,1574,1575],{"class":1120,"line":375},[1118,1576,1577],{},"        failed_sources: Sequence[str] = (),\n",[1118,1579,1580],{"class":1120,"line":157},[1118,1581,1582],{},"    ) -> ContextBrief: ...\n",[807,1584,1585,1588,1589,1592,1593,817],{},[930,1586,1587],{},"The subject travels in the request, not in the spec."," A ",[899,1590,1591],{},"ContextPolicy"," is authored by an admin and frozen in the run snapshot. If a source read its tenancy filter from the spec, an author could widen it. Every source therefore filters through ",[899,1594,1595],{},"request.subject",[807,1597,1598,1067,1601,1077,1604,1607,1608,1611,1612,1615,1616,1619,1620,1623,1624,1627,1628,1631,1632,1634,1635,1637],{},[930,1599,1600],{},"The spec fields are bounded at publish time.",[899,1602,1603],{},"token_budget",[899,1605,1606],{},"total_token_budget"," are non-negative strict integers. A negative budget names an amount the packer cannot spend. ",[899,1609,1610],{},"limit"," is a non-negative strict integer up to ",[899,1613,1614],{},"MAX_CONTEXT_ITEM_LIMIT",", which is ",[899,1617,1618],{},"MAX_ROWS - 1",", or 999. A source reads its rows in one PostgREST request, and PostgREST truncates a read at ",[899,1621,1622],{},"MAX_ROWS"," and reports the truncation only in ",[899,1625,1626],{},"Content-Range",". A cap at that bound therefore asks for rows the read cannot answer. The ceiling is one constant in ",[899,1629,1630],{},"services\u002Fcontext\u002Fmodels.py",", and no source repeats the number. A zero budget, a zero limit and ",[899,1633,1050],{}," stay parseable. Admission is a separate rule: the publish check rejects an enabled source under a zero total budget, and it rejects an enabled source that holds a zero ",[899,1636,1603],{}," of its own. A disabled source may hold a zero budget, because it reads nothing.",[807,1639,1640,1646,1647,1650],{},[930,1641,1642,1645],{},[899,1643,1644],{},"options"," is validated, not trusted."," An untyped dictionary guarded only by a sentence is the one hole in an otherwise closed tenancy story. Each source declares an options schema. ",[899,1648,1649],{},"ContextSourceRegistry"," validates the options when the definition is published.",[891,1652,1654],{"className":1112,"code":1653,"language":1114,"meta":897,"style":897},"class ContextSource(Protocol):\n    name: str\n    options_schema: type[BaseModel]   # KnowledgeOptions(include_platform: bool = False, include_organization: bool = False)\n    async def retrieve(self, request: ContextRequest, spec: ContextSourceSpec) -> list[ContextItem]: ...\n",[899,1655,1656,1661,1666,1671],{"__ignoreMap":897},[1118,1657,1658],{"class":1120,"line":22},[1118,1659,1660],{},"class ContextSource(Protocol):\n",[1118,1662,1663],{"class":1120,"line":32},[1118,1664,1665],{},"    name: str\n",[1118,1667,1668],{"class":1120,"line":233},[1118,1669,1670],{},"    options_schema: type[BaseModel]   # KnowledgeOptions(include_platform: bool = False, include_organization: bool = False)\n",[1118,1672,1673],{"class":1120,"line":244},[1118,1674,1675],{},"    async def retrieve(self, request: ContextRequest, spec: ContextSourceSpec) -> list[ContextItem]: ...\n",[807,1677,1678],{},"An unknown key fails the publish. A wrong type also fails without coercion.",[807,1680,1681],{},"No source schema declares an organization, a user, or a row filter. A policy that names one fails. The check costs nothing at run time.",[807,1683,1684],{},"A policy names each source once. Duplicate names would run one source twice and overwrite the accounting maps. The publish rejects them.",[807,1686,1687],{},"The registry also accepts each source name once. A duplicate declaration fails registry construction. It never replaces the first source by insertion order.",[824,1689,1690,1700],{},[827,1691,1692],{},[830,1693,1694,1697],{},[833,1695,1696],{},"Component",[833,1698,1699],{},"Job",[843,1701,1702,1711,1721,1730,1740],{},[830,1703,1704,1708],{},[848,1705,1706],{},[899,1707,1591],{},[848,1709,1710],{},"Enabled sources, per source budget, total budget",[830,1712,1713,1718],{},[848,1714,1715],{},[899,1716,1717],{},"ContextSource",[848,1719,1720],{},"Structured retrieval. Never final prose",[830,1722,1723,1727],{},[848,1724,1725],{},[899,1726,1649],{},[848,1728,1729],{},"Source name to implementation map, and options schema validation",[830,1731,1732,1737],{},[848,1733,1734],{},[899,1735,1736],{},"ContextBuilder",[848,1738,1739],{},"Concurrent orchestration and failure handling",[830,1741,1742,1747],{},[848,1743,1744],{},[899,1745,1746],{},"ContextPacker",[848,1748,1749],{},"Precedence, dedupe, budget, rendering",[916,1751,1753],{"id":1752},"source-failure","Source failure",[807,1755,1756],{},"A source failure is a context decision, not a policy decision.",[1758,1759,1760,1766],"ul",{},[927,1761,1762,1765],{},[899,1763,1764],{},"required: true"," and the source fails: the run fails with a clear error.",[927,1767,1768,1771,1772,1775],{},[899,1769,1770],{},"required: false"," and the source fails: the name goes into ",[899,1773,1774],{},"failed_sources",", the brief says the source was unavailable, and the run continues.",[807,1777,1778],{},"Silence is the one unacceptable answer. An agent that reasons over a silently empty CRM read looks confident and is wrong.",[807,1780,1781,1784,1785,1787,1788,1791],{},[899,1782,1783],{},"DefaultContextBuilder"," schedules each enabled source before it waits for the\ncombined results. The default source timeout is one second, and the builder\napplies it independently to each read.\nThe timeout must be a positive, finite number. The constructor raises\n",[899,1786,1056],{}," for zero, a negative value, ",[899,1789,1790],{},"NaN",", or infinity. This timeout is\nan operational guard, not a policy field and not the latency target. A disabled\nsource is not resolved and is not read.",[807,1793,1794,1797],{},[899,1795,1796],{},"asyncio.gather"," returns the results in policy order, even when the reads finish\nin another order. The packer therefore receives one deterministic item order.",[807,1799,1800],{},"An exception, a timeout, or a source that is missing from the process registry\nis a source failure. A source also fails when one of its items names another\nsource. Without that check, the packer drops the item because it has no budget,\nand the brief reports no failure.",[807,1802,1803,1804,1807],{},"The builder collects all source results before it decides. If one or more\nrequired sources failed, it raises ",[899,1805,1806],{},"RequiredContextSourceError"," before the\nmodel runs. The error names each failed required source in policy order. The\nInngest segment step can retry the error. If all attempts fail, the run failure\nmessage keeps the source names.",[807,1809,1810,1811,1814],{},"An outer cancellation is not a source failure. ",[899,1812,1813],{},"CancelledError"," stops the\nbuilder and cancels the reads that are still active.",[819,1816,1818],{"id":1817},"when-the-brief-is-built","When the brief is built",[807,1820,1821,1822,1824],{},"The snapshot freezes the ",[899,1823,1591],{},". The content is always fresh.",[891,1826,1829],{"className":1827,"code":1828,"language":896,"meta":897},[894],"segment 0        build the brief, and put it in the system block\nlater segment    rebuild only when refresh_on_resume is true and a wait happened\n",[899,1830,1828],{"__ignoreMap":897},[807,1832,1833,1836],{},[930,1834,1835],{},"A rebuilt brief replaces the system block. It is never appended."," An agent continues the same Agno session across a segment, so the earlier brief is still in the message history. Appending a second brief gives the model two versions of the same CRM row, with no way to tell which is current. Replacement keeps one truth in the window.",[807,1838,1839,1840,1843,1844,1847,1848,1851,1852,817],{},"The builder does not do the replacing. It returns a ",[899,1841,1842],{},"ContextBrief",", the brief travels in ",[899,1845,1846],{},"AgentExecutionRequest",", and ",[899,1849,1850],{},"AgnoAgentRuntime"," composes it into the instructions it hands the framework. This layer never opens the stored session, because that would need Agno's message shape and put it above the boundary that keeps the framework replaceable. See ",[814,1853,1854],{"href":372},"runtime execution",[807,1856,1857,1860,1861,1864,1865,1868],{},[930,1858,1859],{},"Replacement needs no surgery, and it needs the caller to supply the block every time."," Agno rebuilds the system message from ",[899,1862,1863],{},"instructions"," on every run, and it never replays the stored one. That is what makes replacement free. It is also what makes a missing brief silent: pass instructions without one and the block is simply gone, with nothing failing and an agent that has forgotten the rows it was shown. The runtime therefore stores the block it composed beside the session, and ",[899,1866,1867],{},"context = None"," means reuse that block rather than trust the framework to keep it.",[807,1870,1871],{},"After a long approval wait the world has moved, so a refresh is right.",[807,1873,1874],{},"A replay of a completed segment uses the memoized segment result and does not\nrun the builder. A retry of a failed segment can run the builder again because\nthe segment did not commit. This can also happen for segment 0. The sources are\nread only, and the agent session is not written on the failed attempt. Adding a\nsecond context checkpoint or store would add durable state only to avoid this\nbounded read.",[819,1876,1878],{"id":1877},"tenancy","Tenancy",[807,1880,1881],{},"The API uses the service key. RLS does not filter a service-key read.",[1758,1883,1884,1898,1908,1911],{},[927,1885,1886,1887,1890,1891,1894,1895,817],{},"A public-schema source calls ",[899,1888,1889],{},"scoped_db(request.subject.organization_id)",". ",[899,1892,1893],{},"OrgScopedClient"," adds the organization filter for tables in ",[899,1896,1897],{},"ORG_SCOPED_TABLES",[927,1899,1900,1901,1904,1905,817],{},"An agent-schema source filters by ",[899,1902,1903],{},"organization_id"," on the owning row, or through a joined owner such as ",[899,1906,1907],{},"agent.knowledge_sources",[927,1909,1910],{},"A source never uses the admin client for an organization-scoped read.",[927,1912,1913],{},"A context policy never carries an organization, user, or row filter.",[807,1915,1916,1917,1920],{},"The knowledge match function stays ",[899,1918,1919],{},"SECURITY INVOKER",", so a future user-key caller remains subject to RLS. Its query also filters the organization explicitly. The explicit filter protects the service-key path.",[807,1922,1923,1924,1927,1928,1931,1932,1935,1936,1939],{},"Platform rows have ",[899,1925,1926],{},"organization_id IS NULL",". The query includes them only when ",[899,1929,1930],{},"include_platform"," is true. Organization rows are filtered by ",[899,1933,1934],{},"request.subject.organization_id"," and join only when ",[899,1937,1938],{},"include_organization"," is true. The Front Door policy enables platform knowledge only.",[891,1941,1945],{"className":1942,"code":1943,"language":1944,"meta":897,"style":897},"language-sql shiki shiki-themes github-dark","knowledge_search(\n  p_organization_id uuid,\n  p_query_embedding vector,\n  p_include_platform boolean,\n  p_include_organization boolean,\n  p_limit int\n) -- SECURITY INVOKER\n","sql",[899,1946,1947,1952,1957,1962,1967,1972,1977],{"__ignoreMap":897},[1118,1948,1949],{"class":1120,"line":22},[1118,1950,1951],{},"knowledge_search(\n",[1118,1953,1954],{"class":1120,"line":32},[1118,1955,1956],{},"  p_organization_id uuid,\n",[1118,1958,1959],{"class":1120,"line":233},[1118,1960,1961],{},"  p_query_embedding vector,\n",[1118,1963,1964],{"class":1120,"line":244},[1118,1965,1966],{},"  p_include_platform boolean,\n",[1118,1968,1969],{"class":1120,"line":264},[1118,1970,1971],{},"  p_include_organization boolean,\n",[1118,1973,1974],{"class":1120,"line":222},[1118,1975,1976],{},"  p_limit int\n",[1118,1978,1979],{"class":1120,"line":360},[1118,1980,1981],{},") -- SECURITY INVOKER\n",[807,1983,1984,1985,1988],{},"An unfiltered vector query is never acceptable. ",[899,1986,1987],{},"SECURITY DEFINER"," is also not acceptable.",[819,1990,1992],{"id":1991},"application-state","Application state",[807,1994,1995,1998,1999,2002,2003,2006],{},[899,1996,1997],{},"ApplicationContextSource"," resolves ",[899,2000,2001],{},"request.entities",". It never searches ",[899,2004,2005],{},"request.query",". A search is task work and uses a tool.",[807,2008,2009,2010,2013,2014,2016,2017,2020],{},"Run input can carry ",[899,2011,2012],{},"refs",", a list of ",[899,2015,1046],{}," shaped objects. The executor keeps valid objects and drops malformed entries from ",[899,2018,2019],{},"ContextRequest.entities",". It does not change the stored run input.",[807,2022,2023,2024,2027,2028,2027,2031,2027,2034,1077,2037,2040,2041,2043,2044,2047,2048,2027,2051,2027,2054,2027,2057,2027,2060,1077,2063,2066],{},"The source supports ",[899,2025,2026],{},"crm.company",", ",[899,2029,2030],{},"crm.person",[899,2032,2033],{},"crm.deal",[899,2035,2036],{},"crm.activity",[899,2038,2039],{},"prospect",". CRM projections contain scalar fields from the named row only. Deal and activity projections include owner, state, timing and relationship ids, but they do not join the related company, person, communication or activity history. A ",[899,2042,2039],{}," ref names ",[899,2045,2046],{},"public.prospects.id",". Its projection contains ",[899,2049,2050],{},"review_state",[899,2052,2053],{},"opportunity_score",[899,2055,2056],{},"opportunity_reason",[899,2058,2059],{},"recommended_action",[899,2061,2062],{},"people_state",[899,2064,2065],{},"people_state_reason",". It does not join global Intelligence rows. The table has no label field, so the resolved ref keeps the input label when one exists.",[807,2068,2069,2070,2073],{},"The source removes duplicate refs by ",[899,2071,2072],{},"(kind, id)"," and keeps the first request occurrence, even when a later ref has another label. It drops unsupported refs and ignores a ref that does not resolve for the subject. It batches each supported kind in one query and restores the request order after the database read.",[807,2075,2076,2077,2080,2081,2084,2085,1077,2088,2091],{},"Every public-schema read uses ",[899,2078,2079],{},"scoped_db",". Soft-deleted CRM rows exclude ",[899,2082,2083],{},"deleted_at"," rows. ",[899,2086,2087],{},"public.prospects",[899,2089,2090],{},"public.crm_activities"," have no soft-delete column, so their resolvers do not add that filter.",[807,2093,2094,2095,2098,2099,2102,2103,2106,2107,2109],{},"Each non-null projected field becomes one ",[899,2096,2097],{},"ContextItem",". The row ID stays in ",[899,2100,2101],{},"ContextItem.ref",", not in a second field item. The exact column name forms the subject key. ",[899,2104,2105],{},"spec.limit"," caps the returned items in ref order and projection order. A zero limit returns no item and does not read the database. A negative limit fails policy validation. ",[899,2108,1050],{}," means no item-count cap; the token budgets still cap the packed brief.",[819,2111,872],{"id":186},[824,2113,2114,2123],{},[827,2115,2116],{},[830,2117,2118,2120],{},[833,2119,970],{},[833,2121,2122],{},"Storage and owner",[843,2124,2125,2136,2144,2152,2160],{},[830,2126,2127,2130],{},[848,2128,2129],{},"AgencyCore product documentation",[848,2131,2132,2133],{},"Knowledge rows, scope ",[899,2134,2135],{},"platform",[830,2137,2138,2141],{},[848,2139,2140],{},"Organization documents and uploads",[848,2142,2143],{},"The same tables, organization scoped",[830,2145,2146,2149],{},[848,2147,2148],{},"Company and people research",[848,2150,2151],{},"Attached to the entity it describes",[830,2153,2154,2157],{},[848,2155,2156],{},"Files",[848,2158,2159],{},"Object storage, with a database row that points at the object",[830,2161,2162,2165],{},[848,2163,2164],{},"Live web",[848,2166,2167],{},"A tool call. Never a store",[807,2169,2170,2173,2174,2177],{},[930,2171,2172],{},"A file enters through an admin upload, never through a conversation."," An organization document uploads to the ordinary upload API and becomes an organization scoped knowledge source. A file dropped into a chat does not: ",[814,2175,2176],{"href":230},"Channel Gateway"," counts the attachment, drops it, and answers once that the platform reads text only.",[807,2179,2180],{},"That holds for web chat too. A conversation scoped knowledge source is deferred, so V1 has one ingestion path and one retention rule instead of two.",[807,2182,2183,2186],{},[930,2184,2185],{},"Platform documentation is shared knowledge, not organization memory."," That is what lets the front door answer \"what does lifecycle mean in CRM?\" without a product manual inside its prompt.",[916,2188,2190],{"id":2189},"tables","Tables",[891,2192,2195],{"className":2193,"code":2194,"language":896,"meta":897},[894],"agent.knowledge_sources\n  id, organization_id (null = platform), kind, title, uri, object_key,\n  status: pending | ready | failed, updated_at\n\nagent.knowledge_chunks\n  id, source_id, ordinal, text, tokens,\n  embedding vector(N), embedding_model\n",[899,2196,2194],{"__ignoreMap":897},[916,2198,2200],{"id":2199},"ingestion","Ingestion",[891,2202,2205],{"className":2203,"code":2204,"language":896,"meta":897},[894],"upload or sync -> extract text -> chunk -> embed -> insert chunks -> mark the source ready\n",[899,2206,2204],{"__ignoreMap":897},[807,2208,2209,2210,2213],{},"Only a ",[899,2211,2212],{},"ready"," source is searched. A half embedded document that answers half a question is worse than no answer.",[807,2215,2216,2223],{},[930,2217,2218,2219,2222],{},"A source stuck in ",[899,2220,2221],{},"pending"," needs an owner, or it is invisible for ever."," An embedding job that dies leaves a document an admin uploaded, believes is searchable, and never sees in a result. Nothing fails, and nothing alerts.",[891,2225,2228],{"className":2226,"code":2227,"language":896,"meta":897},[894],"pending for longer than 1 hour  ->  status = failed, with the reason\n                               ->  the connections UI shows it, and the admin retries\n",[899,2229,2227],{"__ignoreMap":897},[807,2231,2232],{},"It is one more clause in the same scheduled sweep as the run reaper, and it is the same principle: a silent no-op looks exactly like a working system.",[807,2234,2235,2238],{},[930,2236,2237],{},"Pin the embedding model on the row."," One query must never mix two models, because their vectors are not comparable.",[807,2240,2241,2244],{},[930,2242,2243],{},"One setting says which model is live."," Without it, \"switch the search\" has no mechanism: the search would have to guess which of two model families to embed the query with, and a guess here returns plausible nonsense rather than an error.",[891,2246,2249],{"className":2247,"code":2248,"language":896,"meta":897},[894],"knowledge_settings\n  organization_id         null = the platform default\n  active_embedding_model  every search embeds its query with this, and filters chunks to it\n\n  UNIQUE NULLS NOT DISTINCT (organization_id)\n",[899,2250,2248],{"__ignoreMap":897},[807,2252,2253,2256,2257,2260,2261,2263,2264,2267,2268,2271],{},[930,2254,2255],{},"The organization cannot be the primary key here."," A primary key is ",[899,2258,2259],{},"NOT NULL",", and\nthe platform default row is the one that needs ",[899,2262,1903],{}," to be null. Postgres 15\nadded ",[899,2265,2266],{},"UNIQUE NULLS NOT DISTINCT",", which treats two nulls as equal and so allows exactly\none platform row. A plain ",[899,2269,2270],{},"UNIQUE"," would allow any number of them, and the search would\npick a model by chance.",[807,2273,2274],{},"To change model:",[891,2276,2279],{"className":2277,"code":2278,"language":896,"meta":897},[894],"1  write the new chunks under the new embedding_model; the old ones keep serving\n2  wait until every source is ready under the new model\n3  flip active_embedding_model                      \u003C- one row, one instant\n4  delete the old rows\n",[899,2280,2278],{"__ignoreMap":897},[807,2282,2283],{},"Step 3 is the switch, and it is atomic because it is one column. Storage carries both sets between steps 1 and 4, which is the cost of not breaking retrieval. This is the operation that breaks retrieval quietly, so make it explicit.",[819,2285,883],{"id":185},[807,2287,2288,2289,2291],{},"ENG-2180 adds the durable store and the two write tools. ENG-2181 adds\n",[899,2290,1527],{}," and reads stored memory into a brief. The write unit does\nnot make stored memory available to a prompt on its own.",[824,2293,2294,2303],{},[827,2295,2296],{},[830,2297,2298,2300],{},[833,2299,835],{},[833,2301,2302],{},"Storage",[843,2304,2305,2313,2321],{},[830,2306,2307,2310],{},[848,2308,2309],{},"Working",[848,2311,2312],{},"The conversation summary and the recent messages",[830,2314,2315,2318],{},[848,2316,2317],{},"Episodic",[848,2319,2320],{},"A query over run history",[830,2322,2323,2326],{},[848,2324,2325],{},"Durable observation or preference",[848,2327,2328],{},[899,2329,2330],{},"agent.memories",[807,2332,2333],{},"Working memory and episodic memory already have a source. Do not build a store for either.",[891,2335,2338],{"className":2336,"code":2337,"language":896,"meta":897},[894],"agent.memories\n  id, organization_id, definition_id, scope: user | organization,\n  user_id, subject_key, text, subject_refs jsonb,\n  proposed_by_run_id, supersedes_id, forgotten_at, created_at\n\nagent.memory_heads\n  the current revision of each memory chain, including a tombstone\n\nagent.live_memories\n  the current non-tombstone revision of each memory chain\n",[899,2339,2337],{"__ignoreMap":897},[807,2341,2342,2344],{},[899,2343,1502],{}," is the agent definition that owns the memory. An organization\nmemory is shared by the users of that definition. A user memory is visible only\nto that user in that definition. A trigger has no user, so it can write an\norganization memory only.",[807,2346,2347,2348,2350,2351,2354,2355,2358],{},"V1 stores zero or one entry in ",[899,2349,1010],{},". With one ref, the service creates\nthe key from that ref and the attribute. With no ref, it creates the key from the\nscope owner and the attribute: ",[899,2352,2353],{},"organization:\u003Cid>:\u003Cattribute>"," or\n",[899,2356,2357],{},"user:\u003Cid>:\u003Cattribute>",". A list with two subjects would make the service choose\none without a rule, so it is refused. The storage stays a JSON array so a later\ncontract can add a relation key without a table rewrite.",[807,2360,2361,2362,2365,2366,2369,2370,2372,2373,2376],{},"The table and both views are closed to ",[899,2363,2364],{},"authenticated",". Writers read\n",[899,2367,2368],{},"agent.memory_heads"," on the service role. ",[899,2371,1527],{}," reads\n",[899,2374,2375],{},"agent.live_memories"," on the service role and applies the subject filters. A\nbroad RLS policy on an organization memory would expose its text before the\nsource resolves the subject reference through the owning domain.",[916,2378,2380],{"id":2379},"the-write-path-is-a-tool","The write path is a tool",[807,2382,2383,2384,2387],{},"An agent writes memory by calling ",[899,2385,2386],{},"memory.remember",", which is an ordinary write tool.",[807,2389,2390,2391,1015,2393,2396],{},"Only an agent definition can own memory. A workflow tool node cannot call\n",[899,2392,2386],{},[899,2394,2395],{},"memory.forget","; publish validation refuses that node.",[891,2398,2401],{"className":2399,"code":2400,"language":896,"meta":897},[894],"agent -> memory.remember -> ToolInvoker -> policy -> MemoryService -> agent.memories\n",[899,2402,2400],{"__ignoreMap":897},[807,2404,2405],{},"This replaces the separate propose and commit services. The gate a proposal needed is exactly what policy already is: it can allow, deny, or require a person. The idempotency claim, the span and the count limit come with it. A second pipeline beside the tool layer adds a parallel approval path and a parallel audit trail, and answers nothing new.",[891,2407,2409],{"className":1112,"code":2408,"language":1114,"meta":897,"style":897},"class MemoryService:\n    async def remember(self, inv: ToolInvocation, candidate: MemoryCandidate) -> AgentMemory: ...\n    async def forget(self, inv: ToolInvocation, memory_id: UUID) -> AgentMemory: ...\n",[899,2410,2411,2416,2421],{"__ignoreMap":897},[1118,2412,2413],{"class":1120,"line":22},[1118,2414,2415],{},"class MemoryService:\n",[1118,2417,2418],{"class":1120,"line":32},[1118,2419,2420],{},"    async def remember(self, inv: ToolInvocation, candidate: MemoryCandidate) -> AgentMemory: ...\n",[1118,2422,2423],{"class":1120,"line":233},[1118,2424,2425],{},"    async def forget(self, inv: ToolInvocation, memory_id: UUID) -> AgentMemory: ...\n",[807,2427,2428,2431],{},[899,2429,2430],{},"MemoryService"," refuses a write when:",[1758,2433,2434,2442,2445],{},[927,2435,2436,2437,1015,2439,2441],{},"the attribute does not use the ",[899,2438,1014],{},[899,2440,1018],{}," memory namespace;",[927,2443,2444],{},"a trigger asks for user scope;",[927,2446,2447,2448,817],{},"the text duplicates a live memory with the same ",[899,2449,913],{},[807,2451,2452,2453,2455,2456,2459,2460,2463],{},"Duplicate and supersede are the same check with two answers, so state which fires.\nIdentical text under a live ",[899,2454,913],{}," is a ",[930,2457,2458],{},"refusal",", because nothing changed and\na second row would only split the audit trail. Different text under that key is a\n",[930,2461,2462],{},"supersede",", because the fact moved.",[916,2465,2467],{"id":2466},"revisions-are-append-only","Revisions are append only",[807,2469,2470,2479,2480,2482],{},[930,2471,2472,2473,2475,2476,817],{},"A new memory with the same ",[899,2474,913],{}," points back with ",[899,2477,2478],{},"supersedes_id","\n\"Write in British English\" then \"write in American English\" produces a chain\nof two rows. ",[899,2481,2375],{}," returns the second row alone.",[807,2484,2485],{},"The chain has two database constraints. One chain has one root, and one revision\nhas one child. The self-reference also carries the chain identity, so a child\ncannot change the organization, the definition, the scope, the user or the\nsubject key.",[891,2487,2490],{"className":2488,"code":2489,"language":896,"meta":897},[894],"root revision \u003C- changed revision \u003C- tombstone\n",[899,2491,2489],{"__ignoreMap":897},[807,2493,2494,2496,2497,2500,2501,2503],{},[899,2495,2395],{}," appends the tombstone. The tombstone has no text and carries\n",[899,2498,2499],{},"forgotten_at",", so the live view returns no row for that chain. A later remember\ncan append after the tombstone and make the memory live again. Both writers read\nthe exact head from ",[899,2502,2368],{},". They do not infer lineage from a time\nsort because two revisions can have the same timestamp.",[807,2505,2506,2508],{},[899,2507,2395],{}," accepts a current live memory id only. It refuses an old revision\nor a tombstone. The service checks the invoking principal before it appends the\ntombstone.",[807,2510,2511],{},"Each state transition is one insert. Two writers can read the same head, but\nonly one can attach to it. The loser reloads the new head. Identical text then\nanswers a refusal. Different text appends after that head. A worker crash can\nleave a complete revision or no revision, and never half a supersede.",[807,2513,2514,2515,2517],{},"The tool span and the idempotency journal already record the call. The revision\nchain records the memory history. ",[899,2516,2386],{}," is not metered, so it writes\nno usage row.",[807,2519,2520,2523,2524,2526,2527,2529],{},[930,2521,2522],{},"The guard is exactly as good as the key, and no better."," Two observations of one fact filed under two keys both survive, and the model reads both. ",[899,2525,2430],{}," creates the key from ",[899,2528,1010],{}," and the attribute rather than taking a free string from the model, which removes the common case. It does not remove the hard one, and V1 does not add a model call to find near duplicates. Say what it does, and do not claim more.",[807,2531,2532,2533,1077,2535,2537],{},"The input gate accepts attributes in the ",[899,2534,1014],{},[899,2536,1018],{},"\nnamespaces only. Application sources use their field names without either\nprefix. This refuses a direct memory write to an application-owned attribute.\nIt cannot detect that free text restates the same fact under another attribute.",[807,2539,2540,2541,2543,2544,2547],{},"A model cannot supply ",[899,2542,913],{},". The strict input model rejects that extra\nfield as ",[899,2545,2546],{},"invalid_input","; it never ignores an argument in silence.",[807,2549,2550,2551,2553],{},"A model never writes ",[899,2552,2330],{}," directly, and never through a repository.",[916,2555,2557],{"id":2556},"reading-memory","Reading memory",[807,2559,2560,2562,2563,2565],{},[899,2561,1527],{}," returns ",[899,2564,2375],{}," rows for the organization,\nthe user and the definition. It ranks them by recency alone. Phase 3 has no\nrelevance signal, because embeddings stay out of scope.",[807,2567,2568,2569,2572],{},"The order is ",[899,2570,2571],{},"(created_at DESC, id DESC)",". Two revisions can carry one\ntimestamp, so the id breaks the tie and keeps the cap deterministic. A trigger\nrun reads organization scope alone: an organization row stores a null user, so\na user filter would exclude every row.",[807,2574,2575,2577,2578,2580],{},[899,2576,2105],{}," caps the database read. A zero limit returns no item and does not\nread the database. ",[899,2579,1050],{}," reads 20, because memory has no entity list to bound\nit, unlike application state.",[807,2582,2583,2584,1077,2587,2589,2590,2593],{},"The view drops ",[899,2585,2586],{},"scope_owner_id",[899,2588,2499],{},", so ",[899,2591,2592],{},"AgentMemory"," cannot\nvalidate a live row. The read path declares its own row shape.",[807,2595,2596,2599,2600,2602],{},[930,2597,2598],{},"An organization memory that names an entity is filtered by that entity."," A memory row keeps ",[899,2601,1010],{},", and the owning resolver applies its tenant guard. When a ref does not resolve for this subject, the item is dropped.",[807,2604,2605,2606,2608],{},"A model supplies ",[899,2607,1010],{},", and the write path stores the value without\nresolving it. The guard therefore drops a ref that names another tenant, a\ndeleted row, a row that never existed, and a kind no resolver owns.",[807,2610,1487,2611,1067,2614,2616],{},[930,2612,2613],{},"The guard is a tenant guard, not a per-user guard.",[899,2615,2079],{}," filters\nby organization, and the CRM read policy grants each member of an organization\nthe same rows. Two users of one organization therefore read the same memories.\nThe guard inherits a narrower CRM rule the day one exists. Until then, do not\nclaim it separates two people of one tenant.",[807,2618,2619],{},"The source resolves the distinct subjects in one query for each ref kind. It\nnever reads one query for each memory. A ref list splits into batches of 100,\nbecause no source bounds its ref count and a long URL is answered 414.",[807,2621,2622,2623,2626],{},"V1 resolves one subject for each memory. ",[899,2624,2625],{},"MemoryCandidate"," and a table CHECK\nboth bound the list to one entry, and the read path refuses a second entry\nrather than rest on either.",[807,2628,2629,2630,2633],{},"The read path fails closed. ",[899,2631,2632],{},"MemorySubjectRef"," accepts any kind string, so a\nstored ref can name a kind no resolver owns. That ref resolves to nothing and\nthe memory is dropped, which makes such a write a memory nobody reads.",[807,2635,2636,2639,2640,2643,2644,2646,2647,2649,2650,2653],{},[930,2637,2638],{},"A malformed stored element costs its own memory, never the page."," The table\nchecks the array and not the element, so a row can hold an element with no id.\n",[899,2641,2642],{},"parse_stored_refs"," reads each element, ignores a key it does not know, and\ncounts what it refuses. The source then drops that one memory and logs the\ndrop, because an unfiltered memory would otherwise reach every member of the\ntenant. The write path keeps the row instead, so ",[899,2645,2386],{}," and\n",[899,2648,2395],{}," still serve the chain. A ",[899,2651,2652],{},"CHECK"," constraint stops a new row of\nthat shape. The parser stays, because a read must not wait for the constraint\nto reach every environment.",[807,2655,2656,1067,2659,2646,2662,2665,2666,2669,2670,2672,2673,2646,2675,2677,2678,2681,2682,2685,2686,2688,2689,2692,2693,2696,2697,2700,2701,2704,2705,2707],{},[930,2657,2658],{},"One element is well formed when all three validators say so.",[899,2660,2661],{},"kind",[899,2663,2664],{},"id"," join the subject key, so each one follows the rules ",[899,2667,2668],{},"MemorySubjectKeyPart","\nstates: a non-blank string that holds no ",[899,2671,1060],{}," and no null byte. The ",[899,2674,2652],{},[899,2676,2642],{}," state the same two rules, and ",[899,2679,2680],{},"jsonb"," refuses a null byte\non its own. ",[930,2683,2684],{},"Blank means every blank character, not the space alone."," The\n",[899,2687,2652],{}," therefore reads ",[899,2690,2691],{},"~ '[^[:space:]]'","; ",[899,2694,2695],{},"btrim"," removes the space and\nnothing else, so a tab or a no-break space would pass the write and fail every\nlater read. ",[899,2698,2699],{},"label"," joins no key, so it stays free text and may hold a colon.\nThe three must agree, because ",[899,2702,2703],{},"_answer"," rebuilds ",[899,2706,2632],{}," from a\nstored element: a part the parser accepts and the model type refuses raises\ninside a tool result instead of dropping the one memory.",[807,2709,2710],{},"The guard drops a memory after the cap selected it, and no second query\nrefills the answer. The result can hold fewer rows than the cap. A refill would\nspend a query on rows the packer may cut anyway.",[819,2712,2714],{"id":2713},"run-history","Run history",[807,2716,2717],{},"Run history is the retrieval mechanism for episodic memory. It is not a fourth authority.",[807,2719,2720,2721,2724],{},"It reads ",[899,2722,2723],{},"agent.runs"," once. The query has these filters:",[1758,2726,2727,2733,2743,2753],{},[927,2728,2729,2730,2732],{},"the organization equals ",[899,2731,1934],{},";",[927,2734,2735,2738,2739,2742],{},[899,2736,2737],{},"created_at"," is inside ",[899,2740,2741],{},"lookback_hours",", which defaults to 24 and accepts 1 through 720;",[927,2744,2745,2746,2748,2749,1077,2751,2732],{},"the row belongs to the same user or trigger, or its result refs contain an entity in ",[899,2747,2001],{}," by ",[899,2750,2661],{},[899,2752,2664],{},[927,2754,2755,2756,2759],{},"the row id is not ",[899,2757,2758],{},"request.run_id",", when the request names a current run.",[807,2761,2762,2763,2765,2766,2768,2769,2771,2772,2775],{},"The query reads root runs and child runs. Either run can produce an entity. It orders the rows by ",[899,2764,2571],{},". It applies ",[899,2767,2105],{},", or a default of 5 when the limit is ",[899,2770,1050],{},". A zero limit returns no item and does not read the database. ",[899,2773,2774],{},"ContextSourceSpec"," rejects a negative limit. The source adds no second item-cap option.",[807,2777,2778,2781,2782,2785,2786,1890,2789,2792,2793,2796,2797,817],{},[899,2779,2780],{},"ContextItem.body"," names the run status first. It then names the parent run, the valid result summary and the result refs, and it ends with the waiting reason or the failure reason when the status is one of those. ",[899,2783,2784],{},"title"," is ",[899,2787,2788],{},"Run \u003Cstatus>",[899,2790,2791],{},"ref"," points at the run, and ",[899,2794,2795],{},"recorded_at"," is the run creation time. The item mints no ",[899,2798,913],{},[807,2800,2801,2802,2805,2806,1847,2809,2811,2812,2815,2816,2819],{},"Result refs select relevant runs, and the item body also names them. The body is the one field ",[899,2803,2804],{},"_prompt"," reads, so a request about the rows of an earlier run needs the ids there. The body renders each ref as ",[899,2807,2808],{},"\u003Ckind> \u003Cid>",[899,2810,2661],{}," is the word the capability input accepts, not the word the tool stored. ",[899,2813,2814],{},"capability_ref_kind"," in ",[899,2817,2818],{},"src\u002Fagentic\u002Fshared\u002Frefs.py"," owns that map and states which kinds it joins (ENG-2345).",[807,2821,2822,2823,2825,2826,2829,2830,1077,2832,2834],{},"The body authorizes nothing. ",[899,2824,2101],{}," stays the run, so ",[899,2827,2828],{},"ContextBrief.items"," holds run refs alone and a reply can cite no row of a result. Ref matching and deduplication use ",[899,2831,2661],{},[899,2833,2664],{},"; they never use the optional label, and a stored ref carries no label.",[807,2836,2837],{},"The organization is the current run-read boundary. It is the same boundary that the run explorer applies, so the run ref resolves for this subject. The actor and entity tests select relevant rows; they do not grant access. A future narrower run-read rule must apply here and in the run explorer together.",[807,2839,2840,2841,2027,2843,2027,2846,1077,2849,2851],{},"The query selects only ",[899,2842,2664],{},[899,2844,2845],{},"status",[899,2847,2848],{},"result",[899,2850,2737],{},". It never returns a span tree, input, principal or snapshot into a prompt. It adds no table or rollup.",[819,2853,2855],{"id":2854},"front-door-context","Front door context",[807,2857,2858,2859,2862],{},"The front door uses this same builder with one fixed platform policy named ",[899,2860,2861],{},"front_door",", and it gets no builder of its own. It must not run a fresh exploratory CRM, email, web or research search, because that is task work, and task work is delegated.",[807,2864,2865,2867],{},[814,2866,242],{"href":241}," owns the policy values and the list of sources it allows.",[819,2869,2871],{"id":2870},"reuse-isolated-application-readers","Reuse isolated application readers",[807,2873,2874,2875,2878],{},"The CRM domain services import the legacy agent stack through their current dependency graph. ",[899,2876,2877],{},"src.agentic"," cannot import those services while the isolation contract is active.",[807,2880,2881,2882,2884,2885,2887],{},"An application source and an internal tool handler can share projection models and pure filters inside ",[899,2883,2877],{},". Both read public CRM tables through ",[899,2886,2079],{},". Neither uses the admin client.",[891,2889,2892],{"className":2890,"code":2891,"language":896,"meta":897},[894],"ApplicationContextSource ─┐\n                          ├-> shared projection -> scoped_db -> Postgres\nCRM tool handler ─────────┘\n",[899,2893,2891],{"__ignoreMap":897},[807,2895,2896],{},"The builder reads state as infrastructure. The same tenant filter, soft-delete rule, and projection still apply.",[819,2898,2900],{"id":2899},"budgets-and-metadata","Budgets and metadata",[807,2902,2903],{},"Token counts are estimated with a cheap heuristic, and the total budget is a hard cap. Precision is not worth a tokenizer call per item.",[807,2905,2906,2907,2910],{},"The estimate is one token for each four ",[930,2908,2909],{},"bytes"," of the UTF-8 rendered block. The count is bytes, not characters: one CJK character costs three bytes and one emoji costs four, so a character count under-reports those scripts by three to four times. It is never zero for a block that has text. A zero estimate would let an unlimited number of short items pass a budget that never binds.",[807,2912,2913],{},"The packer spends in one pass, and it charges four costs to the total:",[924,2915,2916,2919,2922,2925],{},[927,2917,2918],{},"the section heading, once, when the first item of that class is admitted;",[927,2920,2921],{},"each admitted item, against the total and against its own source budget;",[927,2923,2924],{},"nothing for a dropped item;",[927,2926,2927],{},"the unavailable-source line, before any item, because a run must never read a silently short brief.",[807,2929,2930,2933,2934,2937],{},[930,2931,2932],{},"The unavailable-source line is the one cost the total does not cap."," Every item stays inside the total, and inside its own source budget. The notice does not, because a brief that omits it makes the run reason over a gap it cannot see. ",[899,2935,2936],{},"ContextBrief.tokens"," reports the true cost either way.",[807,2939,2940,2943,2944,2947],{},[930,2941,2942],{},"The packer drops a whole item. It never truncates a body."," A half fact reads as a whole fact, and the model cannot see the cut. ",[899,2945,2946],{},"ContextBrief.dropped"," is an item count, so a partial item would have no honest value to report.",[807,2949,2950,2953],{},[899,2951,2952],{},"ContextItem.tokens"," states what a source already measured. The packer uses it when it is above zero, and it estimates the block when it is zero.",[807,2955,2956,2959,2960,2963,2964,2966],{},[930,2957,2958],{},"The packer renders each item on one line. It collapses every run of whitespace in a title and a body to one space."," A source supplies extracted document text and agent-written memory text. A body that kept its line breaks could start a line with ",[899,2961,2962],{},"## ",", and that line forges a section that outranks the section it sits in. The collapse covers every whitespace character, not the newline alone: a carriage return, a form feed, and the Unicode line separators forge the same heading. A source name in ",[899,2965,1774],{}," is normalised the same way. A source returns data, and only the packer writes the section structure.",[807,2968,2969,2970,2972],{},"A ",[899,2971,913],{}," is never the empty string. An empty key is no key, and it must not gather every keyless item into one collision group.",[807,2974,2975],{},"The packer applies precedence before it spends. A lower-class item that loses a subject key must not first eat budget that a higher-class item then cannot use.",[807,2977,2978],{},"Two items of one class can share one complete key. The first item in the pack order stays, and the second is counted as dropped. The packer sorts by class order and then by policy source order, so a concurrent builder that answers out of order still packs one brief. One source keeps the order it returned. The order covers the enabled sources only.",[807,2980,2981,1077,2984,2987,2988,2991,2992,2994],{},[899,2982,2983],{},"per_source_tokens",[899,2985,2986],{},"dropped"," carry one entry for every source that appears in ",[899,2989,2990],{},"items",". A source that returned no item appears in neither map. ",[899,2993,1774],{}," is the record of a source that did not answer.",[807,2996,2997,2998,3001],{},"An item whose source no enabled spec names is dropped and counted, ",[930,2999,3000],{},"before precedence runs",". The packer never spends a budget it was not given, and an item it will drop must never win a subject key first. A disabled source is dropped by the same rule, whatever its policy index.",[807,3003,3004,3006],{},[899,3005,1842],{}," reports the pressure without storing the prompt:",[891,3008,3011],{"className":3009,"code":3010,"language":896,"meta":897},[894],"tokens, per_source_tokens, dropped counts, failed_sources, item refs\n",[899,3012,3010],{"__ignoreMap":897},[807,3014,3015,3016,817],{},"The full prompt is not stored by default. See ",[814,3017,3018],{"href":277},"observability and operations",[819,3020,3022],{"id":3021},"latency-target","Latency target",[807,3024,3025],{},"Independent sources are read concurrently. These are design targets to confirm in production.",[824,3027,3028,3039],{},[827,3029,3030],{},[830,3031,3032,3035],{},[833,3033,3034],{},"Step",[833,3036,3038],{"align":3037},"right","Target",[843,3040,3041,3049,3057,3065,3071,3079,3087],{},[830,3042,3043,3046],{},[848,3044,3045],{},"Resolve the policy and sources",[848,3047,3048],{"align":3037},"under 5 ms",[830,3050,3051,3054],{},[848,3052,3053],{},"Application read",[848,3055,3056],{"align":3037},"10 to 40 ms",[830,3058,3059,3062],{},[848,3060,3061],{},"Memory read",[848,3063,3064],{"align":3037},"10 to 30 ms",[830,3066,3067,3069],{},[848,3068,2714],{},[848,3070,3056],{"align":3037},[830,3072,3073,3076],{},[848,3074,3075],{},"Knowledge hybrid search",[848,3077,3078],{"align":3037},"30 to 100 ms",[830,3080,3081,3084],{},[848,3082,3083],{},"Precedence, dedupe and packing",[848,3085,3086],{"align":3037},"3 to 15 ms",[830,3088,3089,3094],{},[848,3090,3091],{},[930,3092,3093],{},"Total, concurrent",[848,3095,3096],{"align":3037},[930,3097,3098],{},"40 to 120 ms",[807,3100,3101],{},"The default one-second source timeout is an outage ceiling. It is not an\nacceptable steady-state duration. Optimize a slow source. Never turn retrieval\ninto a second agent hop.",[819,3103,3105],{"id":3104},"physical-storage","Physical storage",[824,3107,3108,3121],{},[827,3109,3110],{},[830,3111,3112,3115,3118],{},[833,3113,3114],{},"Store",[833,3116,3117],{},"Holds",[833,3119,3120],{},"Rule",[843,3122,3123,3134,3144,3155],{},[830,3124,3125,3128,3131],{},[848,3126,3127],{},"PostgreSQL and Supabase",[848,3129,3130],{},"Domain data, runs, memory, knowledge, definitions",[848,3132,3133],{},"The source of truth. Each access path applies its tenant guard",[830,3135,3136,3138,3141],{},[848,3137,187],{},[848,3139,3140],{},"Embeddings in the same database",[848,3142,3143],{},"Not a separate vector database",[830,3145,3146,3149,3152],{},[848,3147,3148],{},"Redis and Upstash",[848,3150,3151],{},"Caches, counters, live transport",[848,3153,3154],{},"A loss must not lose truth",[830,3156,3157,3160,3163],{},[848,3158,3159],{},"Object storage and R2",[848,3161,3162],{},"Files and attachments",[848,3164,3165],{},"A database row points at the object",[819,3167,3169],{"id":3168},"scenarios-that-shaped-this-design","Scenarios that shaped this design",[824,3171,3172,3182],{},[827,3173,3174],{},[830,3175,3176,3179],{},[833,3177,3178],{},"Scenario",[833,3180,3181],{},"What answers it",[843,3183,3184,3192,3202,3213,3221,3229,3237,3245,3253,3261,3271,3281,3292,3303,3311,3322,3330,3338,3346],{},[830,3185,3186,3189],{},[848,3187,3188],{},"Organization A searches and organization B has similar documents",[848,3190,3191],{},"An explicit organization filter, with RLS retained for user-key callers",[830,3193,3194,3197],{},[848,3195,3196],{},"A user asks what lifecycle means in the CRM",[848,3198,3199,3200],{},"Platform scope knowledge, opted in with ",[899,3201,1930],{},[830,3203,3204,3207],{},[848,3205,3206],{},"An agent resumes after a 20 hour approval",[848,3208,3209,3212],{},[899,3210,3211],{},"refresh_on_resume"," rebuilds the brief, and replaces the system block",[830,3214,3215,3218],{},[848,3216,3217],{},"A rebuilt brief meets the earlier brief in the same session",[848,3219,3220],{},"Replacement, never append. One truth in the window",[830,3222,3223,3226],{},[848,3224,3225],{},"Two source items use the same complete key",[848,3227,3228],{},"The higher context class wins, and the drop is counted",[830,3230,3231,3234],{},[848,3232,3233],{},"The user changes a stated preference",[848,3235,3236],{},"The new revision points to the current one, and the live view returns the new head",[830,3238,3239,3242],{},[848,3240,3241],{},"Two workers change one preference",[848,3243,3244],{},"One attaches to the head; the other reloads and attaches after it",[830,3246,3247,3250],{},[848,3248,3249],{},"A worker dies while changing a preference",[848,3251,3252],{},"One insert commits or rolls back, so the chain keeps one head",[830,3254,3255,3258],{},[848,3256,3257],{},"A user forgets a preference",[848,3259,3260],{},"A tombstone becomes the head, and the live view returns no row",[830,3262,3263,3266],{},[848,3264,3265],{},"An agent proposes 40 memories in one run",[848,3267,3268,3270],{},[899,3269,2386],{}," is a tool, so the count limit and policy apply",[830,3272,3273,3276],{},[848,3274,3275],{},"A memory names a company of another tenant, or one since deleted",[848,3277,3278,3280],{},[899,3279,1010],{}," are resolved per subject, and the item is dropped",[830,3282,3283,3286],{},[848,3284,3285],{},"Knowledge search returns 40k tokens of chunks",[848,3287,3288,3289,3291],{},"The per source budget cuts it, and ",[899,3290,2986],{}," records the loss",[830,3293,3294,3297],{},[848,3295,3296],{},"pgvector times out during a run",[848,3298,3299,3300,3302],{},"Optional source: recorded in ",[899,3301,1774],{},". Required source: the run fails",[830,3304,3305,3308],{},[848,3306,3307],{},"One source stalls while another answers",[848,3309,3310],{},"Each read has its own timeout, so the successful result is still available",[830,3312,3313,3316],{},[848,3314,3315],{},"An admin uploads a 200 page PDF",[848,3317,3318,3319,3321],{},"The source stays ",[899,3320,2221],{}," until every chunk is embedded",[830,3323,3324,3327],{},[848,3325,3326],{},"We change the embedding model",[848,3328,3329],{},"Chunks are pinned per model, and the search switches only when every source is ready",[830,3331,3332,3335],{},[848,3333,3334],{},"A person attaches a file in any channel",[848,3336,3337],{},"The gateway counts it, drops it, and answers that it reads text only",[830,3339,3340,3343],{},[848,3341,3342],{},"An admin writes a wide scope into the context policy",[848,3344,3345],{},"No source declares such an option, so the publish fails",[830,3347,3348,3351],{},[848,3349,3350],{},"An admin names one source twice",[848,3352,3353],{},"Publish fails before the builder can run it twice or overwrite its accounting",[819,3355,3357],{"id":3356},"rules","Rules",[1758,3359,3360,3363,3366,3369,3375,3378,3381,3384,3387,3390,3393,3396,3399,3402,3405,3410,3413,3419,3427,3430,3433,3436,3439,3445,3455,3458,3461,3464,3467,3470,3473,3476],{},[927,3361,3362],{},"Context construction is deterministic and model free.",[927,3364,3365],{},"The subject travels in the request. A policy never carries a tenancy filter.",[927,3367,3368],{},"Application state resolves explicit refs only. It never searches the request query.",[927,3370,3371,3372,3374],{},"Public CRM reads use ",[899,3373,2079],{}," with the subject organization. The service key bypasses RLS.",[927,3376,3377],{},"Independent sources are read concurrently.",[927,3379,3380],{},"Each enabled source has an independent timeout. The default is one second.",[927,3382,3383],{},"Concurrent results keep policy order, and cancellation stops the build.",[927,3385,3386],{},"A source returns structured items. Only the packer writes prose.",[927,3388,3389],{},"Precedence is section order, budget order, and same subject wins upward.",[927,3391,3392],{},"Precedence covers all six kinds, and run history ranks last.",[927,3394,3395],{},"One row names the live embedding model per organization, and exactly one names the platform default.",[927,3397,3398],{},"A required source failure fails the run. An optional one is reported, never hidden.",[927,3400,3401],{},"An item that names the wrong source fails that source, so it never disappears silently.",[927,3403,3404],{},"Platform documents use an explicit shared scope. Organization documents stay tenant scoped.",[927,3406,2209,3407,3409],{},[899,3408,2212],{}," knowledge source is searched, and the embedding model is pinned per chunk.",[927,3411,3412],{},"The live web is a tool, not a store.",[927,3414,3415,3416,3418],{},"Memory is written through the ",[899,3417,2386],{}," tool, and revisions are append only.",[927,3420,3421,3422,1015,3424,3426],{},"A memory attribute uses ",[899,3423,1014],{},[899,3425,1018],{},", never an application field name.",[927,3428,3429],{},"Memory ranks by recency alone in V1, and a subject ref no resolver owns drops the memory.",[927,3431,3432],{},"The memory subject guard is a tenant guard. Per-user CRM visibility does not exist yet.",[927,3434,3435],{},"One chain has one root, one child per revision and one current head.",[927,3437,3438],{},"A tombstone forgets a memory without making an old revision current again.",[927,3440,3441,3442,3444],{},"A rebuilt brief replaces the system block, and ",[899,3443,1850],{}," is what replaces it.",[927,3446,2969,3447,2785,3449,1890,3452,3454],{},[899,3448,913],{},[899,3450,3451],{},"\u003Centity kind>:\u003Centity id>:\u003Cattribute>",[899,3453,1042],{}," creates it from one subject reference, or from the scope owner when there is no reference.",[927,3456,3457],{},"A policy and the registry each accept one entry per source name.",[927,3459,3460],{},"A policy that enables a source states a total token budget above zero.",[927,3462,3463],{},"The packer drops a whole item, and it never truncates a body.",[927,3465,3466],{},"The packer renders one item on one line, so no body can forge a section heading.",[927,3468,3469],{},"The token estimate counts UTF-8 bytes, never characters.",[927,3471,3472],{},"One setting names the live embedding model, and a search filters chunks to it.",[927,3474,3475],{},"A source pending for more than an hour is failed, never left invisible.",[927,3477,3478],{},"No new store because a concept needs retrieval.",[819,3480,3482],{"id":3481},"open-decisions","Open decisions",[924,3484,3485,3491,3500],{},[927,3486,3487,3488,3490],{},"Does memory retrieval need embeddings in the first release, or are scope, recency and ",[899,3489,913],{}," enough?",[927,3492,3493,1067,3497],{},[3494,3495,3496],"del",{},"How large may the front door knowledge budget be per turn before the turn feels slow?",[930,3498,3499],{},"Decided for the Front Door: 1,500 tokens across up to eight chunks.",[927,3501,3502],{},"When conversation attachments arrive, is a chat file embedded by default, or only when a person asks a question about it?",[819,3504,3506],{"id":3505},"minimum-contract-tests","Minimum contract tests",[1758,3508,3509,3512,3515,3518,3521,3524,3527,3530,3535,3538,3544,3547,3550,3553,3559,3562,3565,3568,3571,3577,3580,3583,3586,3589,3592,3598,3601,3604,3609,3615,3618,3621,3624,3627,3630,3633,3641,3644,3647,3650,3653,3656,3659,3662,3665,3668,3671,3674,3679,3682,3685,3688,3695,3698,3701],{},[927,3510,3511],{},"A context policy naming an undeclared source option fails to publish.",[927,3513,3514],{},"A context policy naming an option with the wrong type fails without coercion.",[927,3516,3517],{},"A context policy naming one source twice fails to publish.",[927,3519,3520],{},"Registry construction refuses two sources with one name.",[927,3522,3523],{},"An organization A vector search cannot return organization B chunks.",[927,3525,3526],{},"Platform documents are reachable without weakening a tenant rule.",[927,3528,3529],{},"A context policy cannot widen the organization or user scope.",[927,3531,3532,3533,817],{},"Malformed run-input refs are dropped, and valid refs reach ",[899,3534,2019],{},[927,3536,3537],{},"Application state reads only explicit, distinct, supported refs.",[927,3539,3540,3541,3543],{},"Two refs with the same ",[899,3542,2072],{}," and different labels keep the first ref.",[927,3545,3546],{},"A missing, deleted or cross-organization CRM ref returns no item.",[927,3548,3549],{},"Application state uses at most one subject-scoped query per supported kind.",[927,3551,3552],{},"The application item cap keeps deterministic ref and projection order.",[927,3554,3555,3556,3558],{},"A zero item cap reads no row, a negative cap fails validation, and ",[899,3557,1050],{}," applies no item-count cap.",[927,3560,3561],{},"A higher context class beats a lower class when two items have the same complete key.",[927,3563,3564],{},"Two items of one class with one key keep the first, and count the second.",[927,3566,3567],{},"The pack stays inside the total and per source budgets, and the section headings are charged.",[927,3569,3570],{},"A policy that enables a source under a zero total budget fails to publish.",[927,3572,3573,3574,3576],{},"An enabled source with a zero ",[899,3575,1603],{}," fails to publish, at its own path. A disabled one publishes.",[927,3578,3579],{},"An item whose source the policy does not enable is dropped before it can win a subject key.",[927,3581,3582],{},"A disabled source that sits first in the policy never displaces an enabled one.",[927,3584,3585],{},"An item body that holds a section heading cannot open a second section.",[927,3587,3588],{},"The pack order does not depend on the order the builder answered.",[927,3590,3591],{},"A brief names every unavailable optional source before its first item.",[927,3593,3594,3595,3597],{},"An optional source failure lands in ",[899,3596,1774],{},", and the run continues.",[927,3599,3600],{},"A required source failure fails the run.",[927,3602,3603],{},"A blocked source does not stop another source from starting, and results keep policy order.",[927,3605,3606,3607,817],{},"An optional timeout and a missing optional source both land in ",[899,3608,1774],{},[927,3610,3611,3612,3614],{},"A zero, negative, ",[899,3613,1790],{},", or infinite source timeout fails construction.",[927,3616,3617],{},"Every failed required source is named in one error.",[927,3619,3620],{},"A disabled source is never resolved or read.",[927,3622,3623],{},"A source item that names another source fails its source.",[927,3625,3626],{},"Cancelling the builder cancels active reads and does not create a brief.",[927,3628,3629],{},"An empty or all-disabled policy returns an empty brief.",[927,3631,3632],{},"A segment after approval holds one brief, not two.",[927,3634,3635,3636,3638,3639,817],{},"A model cannot write ",[899,3637,2330],{}," except through ",[899,3640,2386],{},[927,3642,3643],{},"An old revision and a tombstone never reach a brief.",[927,3645,3646],{},"A memory naming an entity of another tenant is dropped for that subject.",[927,3648,3649],{},"A knowledge query never mixes two embedding models.",[927,3651,3652],{},"An object-backed knowledge source has the same per-organization idempotency boundary as a URI-backed source.",[927,3654,3655],{},"A chunk inherits tenancy from its source rather than storing a second organization field.",[927,3657,3658],{},"An application field and a namespaced memory attribute do not create the same key.",[927,3660,3661],{},"Missing subject data creates no key. Empty or colon-delimited key parts fail.",[927,3663,3664],{},"A memory about a company's buying process is not dropped by a CRM row about its lifecycle.",[927,3666,3667],{},"A completed segment replay rebuilds no brief. A failed segment retry can rebuild one.",[927,3669,3670],{},"A segment that resumes from a wait rebuilds one when the policy asks.",[927,3672,3673],{},"A source stuck pending is failed within the hour, and the admin can see why.",[927,3675,3676,3677,817],{},"A run history item creates no ",[899,3678,913],{},[927,3680,3681],{},"A memory whose stored ref names a kind no resolver owns is dropped.",[927,3683,3684],{},"One memory read resolves each ref kind once, never one query for each row.",[927,3686,3687],{},"A trigger run reads organization memory alone.",[927,3689,3690,3691,3694],{},"A second platform row in ",[899,3692,3693],{},"knowledge_settings"," is refused by the database.",[927,3696,3697],{},"Re-observing unchanged text writes no second memory row.",[927,3699,3700],{},"Concurrent changes form one linear chain with one current head.",[927,3702,3703],{},"Forgetting a memory appends one tombstone and exposes no older revision.",[3705,3706,3707],"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":897,"searchDepth":32,"depth":233,"links":3709},[3710,3714,3715,3719,3720,3721,3722,3726,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740],{"id":821,"depth":32,"text":822,"children":3711},[3712,3713],{"id":918,"depth":233,"text":919},{"id":951,"depth":233,"text":952},{"id":1086,"depth":32,"text":1087},{"id":1099,"depth":32,"text":1100,"children":3716},[3717,3718],{"id":322,"depth":233,"text":1109},{"id":1752,"depth":233,"text":1753},{"id":1817,"depth":32,"text":1818},{"id":1877,"depth":32,"text":1878},{"id":1991,"depth":32,"text":1992},{"id":186,"depth":32,"text":872,"children":3723},[3724,3725],{"id":2189,"depth":233,"text":2190},{"id":2199,"depth":233,"text":2200},{"id":185,"depth":32,"text":883,"children":3727},[3728,3729,3730],{"id":2379,"depth":233,"text":2380},{"id":2466,"depth":233,"text":2467},{"id":2556,"depth":233,"text":2557},{"id":2713,"depth":32,"text":2714},{"id":2854,"depth":32,"text":2855},{"id":2870,"depth":32,"text":2871},{"id":2899,"depth":32,"text":2900},{"id":3021,"depth":32,"text":3022},{"id":3104,"depth":32,"text":3105},{"id":3168,"depth":32,"text":3169},{"id":3356,"depth":32,"text":3357},{"id":3481,"depth":32,"text":3482},{"id":3505,"depth":32,"text":3506},"md",{},[3744,3745,3746,3747],"engineering\u002Fsystem-design\u002Fagentic-platform\u002Fcontract","engineering\u002Fsystem-design\u002Fagentic-platform\u002Fcapabilities\u002Ftools-and-integrations","engineering\u002Fsystem-design\u002Fagentic-platform\u002Fruntime\u002Fexecution","engineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Ffront-door",{"title":179,"description":180},"engineering\u002Fsystem-design\u002Fagentic-platform\u002Fcapabilities\u002Fstate-and-knowledge",[184,185,186,11,187],"qTw45bXUiAZ4OCGSIxWmuNMJwAhKMHhGYUT-9WCmtvc",1788650193560]