[{"data":1,"prerenderedAt":1458},["ShallowReactive",2],{"docs-nav":3,"docs-article-engineering\u002Freference\u002Fvirtual-filesystem-rag":516},[4,17,27,44,55,67,75,82,94,106,114,122,129,135,144,153,161,169,177,189,201,211,218,227,235,244,251,258,265,272,277,289,304,314,326,335,340,347,355,361,369,376,383,392,397,405,412,420,425,431,443,453,463,470,476,484,494,501,510],{"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":181,"section":182,"order":183,"tags":184,"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,185,186,187,188],"sdlc","engineering","verification","review",{"path":190,"title":191,"description":192,"group":181,"section":182,"order":193,"tags":194,"lastUpdated":200},"\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,[195,196,197,198,199],"ai-futures","asi","agi","scaling","recursive-self-improvement","2026-06-19",{"path":202,"title":203,"description":204,"group":181,"section":182,"order":205,"tags":206,"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,[207,208,12,209,210],"ai-native","company-building","gtm","founders",{"path":212,"title":213,"description":214,"group":181,"section":182,"order":157,"tags":215,"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.",[216,51,209,217],"intent","sales",{"path":219,"title":220,"description":221,"group":181,"section":182,"order":222,"tags":223,"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,[224,225,209,226],"outbound","cold-email","systems",{"path":228,"title":229,"description":230,"group":181,"section":182,"order":231,"tags":232,"lastUpdated":234},"\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,[209,12,73,233,14],"swan","2026-07-01",{"path":236,"title":237,"description":238,"group":239,"section":182,"order":240,"tags":241,"lastUpdated":43},"\u002Fmission-control\u002Fciops-agent","CIOps agent","High-level system architecture and design notes for the Mission Control CIOps agent.","Mission Control",14,[242,12,243,14],"mission-control","ciops",{"path":245,"title":246,"description":247,"group":239,"section":182,"order":248,"tags":249,"lastUpdated":43},"\u002Fmission-control\u002Fcostops-agent","CostOps agent","High-level system architecture and design notes for the Mission Control CostOps agent.",11,[242,12,250,14],"finops",{"path":252,"title":253,"description":254,"group":239,"section":182,"order":222,"tags":255,"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.",[242,12,256,257],"dashboard","ui",{"path":259,"title":260,"description":261,"group":239,"section":182,"order":262,"tags":263,"lastUpdated":43},"\u002Fmission-control\u002Fproduct-analytics-agent","ProductAnalytics agent","High-level system architecture and design notes for the Mission Control ProductAnalytics agent.",13,[242,12,264,14],"product-analytics",{"path":266,"title":267,"description":268,"group":239,"section":182,"order":269,"tags":270,"lastUpdated":43},"\u002Fmission-control\u002Frevenueops-agent","RevenueOps agent","High-level system architecture and design notes for the Mission Control RevenueOps agent.",12,[242,12,271,14],"revops",{"path":273,"title":274,"description":275,"group":239,"section":182,"order":157,"tags":276,"lastUpdated":54},"\u002Fmission-control\u002Fsystem-design","System design","One screen for the whole company, watched by a guardrailed fleet of ops agents that explain, propose, act and learn overnight.",[242,12,250,14],{"path":278,"title":279,"description":280,"group":281,"section":182,"order":32,"tags":282,"lastUpdated":288},"\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",[283,61,284,285,286,287],"onboarding","tam","activation","ux","user-journey","2026-06-11",{"path":290,"title":291,"description":292,"group":281,"section":182,"order":293,"tags":294,"lastUpdated":303},"\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.",3,[295,296,297,298,299,300,301,302],"pricing","entitlements","billing","credits","subscriptions","plans","seats","trials","2026-07-06",{"path":305,"title":306,"description":307,"group":281,"section":182,"order":293,"tags":308,"lastUpdated":288},"\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,286,309,11,42,310,311,312,313],"design-system","lead-score","origin","pull","push",{"path":315,"title":316,"description":317,"group":318,"section":319,"order":320,"tags":321,"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",4,[11,322,323,324,325],"activities","tasks","data-model","schema",{"path":327,"title":328,"description":329,"group":318,"section":319,"order":330,"tags":331,"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.",5,[11,332,333,334,324],"communications","email","engagement",{"path":336,"title":337,"description":338,"group":318,"section":319,"order":22,"tags":339,"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,324,325,14],{"path":341,"title":342,"description":343,"group":318,"section":319,"order":293,"tags":344,"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,345,346,324,325],"deals","pipeline",{"path":348,"title":349,"description":350,"group":318,"section":319,"order":351,"tags":352,"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.",6,[11,353,354,324,325],"lists","segments",{"path":356,"title":357,"description":358,"group":318,"section":319,"order":32,"tags":359,"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,360,324,325],"contacts",{"path":362,"title":363,"description":364,"group":318,"section":319,"order":365,"tags":366,"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.",8,[11,367,368,324,325],"saved-filters","views",{"path":370,"title":371,"description":372,"group":318,"section":319,"order":373,"tags":374,"lastUpdated":288},"\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.",7,[11,51,375,324,325],"intelligence",{"path":377,"title":378,"description":379,"group":318,"section":380,"order":22,"tags":381,"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,382],"eng-669",{"path":384,"title":385,"description":386,"group":318,"section":380,"order":320,"tags":387,"lastUpdated":288},"\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,388,53,389,390,285,391,312,313,311],"feed","decay","rls","ingest",{"path":393,"title":394,"description":395,"group":318,"section":380,"order":32,"tags":396,"lastUpdated":288},"\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":398,"title":399,"description":400,"group":318,"section":380,"order":293,"tags":401,"lastUpdated":288},"\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,402,389,403,388,404,41,312,313],"polymorphic","taxonomy","ingests",{"path":406,"title":407,"description":408,"group":318,"section":182,"order":9,"tags":409,"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.",[410,14,60,11,51,38,25,411],"data-layer","overview",{"path":413,"title":414,"description":415,"group":416,"section":182,"order":9,"tags":417,"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",[418,419],"roadmap","planning",{"path":421,"title":422,"description":423,"group":416,"section":182,"order":22,"tags":424,"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.",[418,419],{"path":426,"title":427,"description":428,"group":416,"section":182,"order":32,"tags":429,"lastUpdated":234},"\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.",[418,419,430],"slides",{"path":432,"title":433,"description":434,"group":435,"section":8,"order":222,"tags":436,"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",[437,438,439,440,441,442],"symphony","slack","devops","production","runbooks","operations",{"path":444,"title":445,"description":446,"group":435,"section":8,"order":157,"tags":447,"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.",[437,448,449,450,451,452],"sentry","linear","oncall","incident-response","codex",{"path":454,"title":455,"description":456,"group":435,"section":457,"order":157,"tags":458,"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",[437,459,460,452,461,462],"timed-jobs","housekeeping","sqlite","vps",{"path":464,"title":465,"description":466,"group":435,"section":457,"order":183,"tags":467,"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.",[437,459,460,462,468,469],"disk","cleanup",{"path":471,"title":472,"description":473,"group":435,"section":457,"order":222,"tags":474,"lastUpdated":16},"\u002Fsymphony\u002Fhousekeeping\u002Fworkspace-cleanup","Workspace cleanup","Interactive design for the Symphony housekeeping timer that prunes idle per-issue workspaces after their TTL.",[437,459,460,475,469,462],"workspaces",{"path":477,"title":478,"description":479,"group":435,"section":182,"order":9,"tags":480,"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.",[437,452,449,481,111,462,482,483],"claude-review","qa","automation",{"path":485,"title":486,"description":487,"group":435,"section":488,"order":205,"tags":489,"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",[437,490,459,452,491,492,493],"security","semgrep","threat-model","ownership",{"path":495,"title":496,"description":497,"group":435,"section":488,"order":183,"tags":498,"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.",[437,459,448,499,500,449],"observability","triage",{"path":502,"title":503,"description":504,"group":435,"section":488,"order":157,"tags":505,"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.",[437,459,506,507,508,509],"e2e","playwright","staging","frontend",{"path":511,"title":512,"description":513,"group":435,"section":488,"order":222,"tags":514,"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.",[437,459,508,482,515,449],"agent-browser",{"id":517,"title":171,"body":518,"customComponent":182,"description":172,"extension":1451,"group":139,"lastUpdated":176,"meta":1452,"navigation":1453,"order":32,"path":170,"related":182,"section":21,"seo":1454,"stem":1455,"tags":1456,"__hash__":1457},"docs\u002Fengineering\u002Freference\u002Fvirtual-filesystem-rag.md",{"type":519,"value":520,"toc":1421},"minimark",[521,526,534,542,553,558,581,586,599,603,609,614,629,633,685,689,704,707,711,718,722,741,745,799,802,806,812,818,823,827,853,857,864,882,885,889,893,900,1020,1023,1044,1059,1066,1073,1093,1100,1104,1110,1117,1122,1137,1142,1153,1156,1160,1167,1184,1187,1191,1211,1231,1235,1241,1327,1331,1335,1376,1380,1383,1387,1417],[522,523,525],"h1",{"id":524},"virtual-filesystem-for-ai-assistants-replacing-rag-with-chromafs","Virtual Filesystem for AI Assistants: Replacing RAG with ChromaFs",[527,528,529],"p",{},[530,531],"img",{"alt":532,"src":533},"ChromaFs High-Level Architecture","\u002Fdiagrams\u002Fvfs-overview.png",[527,535,536,537,541],{},"This guide breaks down how Mintlify replaced traditional RAG with a virtual filesystem called ",[538,539,540],"strong",{},"ChromaFs"," to power their documentation assistant. The result: 460x faster session creation, zero marginal compute cost, and 30,000+ daily conversations served.",[527,543,544,545,552],{},"Based on the article by ",[546,547,551],"a",{"href":548,"rel":549},"https:\u002F\u002Fx.com\u002Fdensumesh",[550],"nofollow","Dens Sumesh"," (formerly Trieve, now Mintlify).",[554,555,557],"h2",{"id":556},"why-this-matters","Why This Matters",[527,559,560,561,564,565,569,570,569,573,576,577,580],{},"Traditional RAG (Retrieval-Augmented Generation) has been the default approach for giving AI assistants access to documentation. But as scale increases, its limitations become painfully obvious. Mintlify discovered that agents work better when they can ",[538,562,563],{},"explore"," documentation like developers explore code — using familiar tools like ",[566,567,568],"code",{},"grep",", ",[566,571,572],{},"ls",[566,574,575],{},"cat",", and ",[566,578,579],{},"find",".",[527,582,583],{},[538,584,585],{},"Key numbers:",[587,588,589,593,596],"ul",{},[590,591,592],"li",{},"850,000 monthly conversations",[590,594,595],{},"30,000+ daily sessions",[590,597,598],{},"Hundreds of thousands of users across different documentation sites",[554,600,602],{"id":601},"the-problem-with-traditional-rag","The Problem with Traditional RAG",[527,604,605],{},[530,606],{"alt":607,"src":608},"RAG vs Filesystem Approach","\u002Fdiagrams\u002Fvfs-problem.png",[610,611,613],"h3",{"id":612},"how-rag-typically-works","How RAG typically works",[615,616,617,620,623,626],"ol",{},[590,618,619],{},"User asks a question",[590,621,622],{},"The query is embedded into a vector",[590,624,625],{},"Top-K most similar chunks are retrieved",[590,627,628],{},"Those chunks are fed to the LLM as context",[610,630,632],{"id":631},"where-it-breaks-down","Where it breaks down",[634,635,636,649],"table",{},[637,638,639],"thead",{},[640,641,642,646],"tr",{},[643,644,645],"th",{},"Failure Mode",[643,647,648],{},"Example",[650,651,652,661,669,677],"tbody",{},[640,653,654,658],{},[655,656,657],"td",{},"Multi-page answers",[655,659,660],{},"\"How do I set up OAuth end-to-end?\" spans 3 pages",[640,662,663,666],{},[655,664,665],{},"Exact syntax needs",[655,667,668],{},"Looking for a specific API endpoint URL that doesn't match semantically",[640,670,671,674],{},[655,672,673],{},"Exploration",[655,675,676],{},"\"What authentication options exist?\" requires browsing, not searching",[640,678,679,682],{},[655,680,681],{},"Flat retrieval",[655,683,684],{},"Embeddings lose hierarchical structure of documentation",[610,686,688],{"id":687},"the-core-insight","The core insight",[690,691,692],"blockquote",{},[527,693,694,695,569,697,569,699,576,701,703],{},"Agents converge on filesystems as their primary interface. ",[566,696,568],{},[566,698,575],{},[566,700,572],{},[566,702,579],{}," are all an agent needs. If each doc page is a file and each section is a directory, the agent can search for exact strings, read full pages, and traverse the structure on its own.",[527,705,706],{},"LLMs are extensively trained on shell interactions. They already know how to use UNIX commands. Why fight this?",[554,708,710],{"id":709},"the-sandbox-attempt-and-why-it-failed","The Sandbox Attempt (and Why It Failed)",[527,712,713,714,717],{},"The obvious first attempt: give agents access to a ",[538,715,716],{},"real"," filesystem inside an isolated sandbox container.",[610,719,721],{"id":720},"how-it-worked","How it worked",[615,723,724,727,730,733],{},[590,725,726],{},"Spin up a sandbox container for each conversation",[590,728,729],{},"Clone the documentation repo from GitHub",[590,731,732],{},"Mount it as a filesystem",[590,734,735,736,569,738,740],{},"Let the agent use ",[566,737,568],{},[566,739,575],{},", etc. on actual files",[610,742,744],{"id":743},"why-it-was-too-expensive","Why it was too expensive",[634,746,747,757],{},[637,748,749],{},[640,750,751,754],{},[643,752,753],{},"Metric",[643,755,756],{},"Value",[650,758,759,767,775,783,791],{},[640,760,761,764],{},[655,762,763],{},"P90 session creation time",[655,765,766],{},"~46 seconds",[640,768,769,772],{},[655,770,771],{},"Resources per session",[655,773,774],{},"1 vCPU, 2GB RAM",[640,776,777,780],{},[655,778,779],{},"Session duration",[655,781,782],{},"~5 minutes",[640,784,785,788],{},[655,786,787],{},"Monthly conversations",[655,789,790],{},"850,000",[640,792,793,796],{},[655,794,795],{},"Annual infrastructure cost",[655,797,798],{},"~$70,000+",[527,800,801],{},"The startup latency alone (cloning repos, installing dependencies) made it unacceptable for a chat-like UX. Users expect near-instant responses.",[554,803,805],{"id":804},"the-solution-chromafs","The Solution: ChromaFs",[527,807,808],{},[530,809],{"alt":810,"src":811},"ChromaFs Architecture","\u002Fdiagrams\u002Fvfs-architecture.png",[527,813,814],{},[530,815],{"alt":816,"src":817},"ChromaFs System Architecture","\u002Fdiagrams\u002Fvfs-system-architecture.webp",[527,819,820,822],{},[538,821,540],{}," is a virtual filesystem that intercepts UNIX commands and translates them into queries against an existing Chroma vector database — where documentation is already indexed, chunked, and stored.",[610,824,826],{"id":825},"key-design-decisions","Key design decisions",[615,828,829,835,841,847],{},[590,830,831,834],{},[538,832,833],{},"No new infrastructure"," — reuses the Chroma DB that already powers search",[590,836,837,840],{},[538,838,839],{},"Built on just-bash"," — Vercel Labs' TypeScript reimplementation of bash",[590,842,843,846],{},[538,844,845],{},"Pluggable interface"," — just-bash handles parsing\u002Fpiping\u002Fflags; ChromaFs only implements the filesystem layer",[590,848,849,852],{},[538,850,851],{},"Read-only"," — agents can explore but never modify",[610,854,856],{"id":855},"the-ifilesystem-interface","The IFileSystem interface",[527,858,859,860,863],{},"just-bash exposes a pluggable ",[566,861,862],{},"IFileSystem"," interface. This means:",[587,865,866,876],{},[590,867,868,871,872,875],{},[538,869,870],{},"just-bash handles",": command parsing, piping (",[566,873,874],{},"|","), flag logic, output formatting",[590,877,878,881],{},[538,879,880],{},"ChromaFs implements",": file reads, directory listings, search queries",[527,883,884],{},"The agent thinks it's using a normal filesystem. Under the hood, every operation becomes a database query.",[554,886,888],{"id":887},"how-it-works-key-mechanisms","How It Works: Key Mechanisms",[610,890,892],{"id":891},"directory-tree-bootstrap","Directory Tree Bootstrap",[527,894,895,896,899],{},"Documentation structure is stored as gzipped JSON in Chroma under a special key (",[566,897,898],{},"__path_tree__","):",[901,902,907],"pre",{"className":903,"code":904,"language":905,"meta":906,"style":906},"language-json shiki shiki-themes github-dark","{\n  \"auth\u002Foauth\": { \"isPublic\": true, \"groups\": [] },\n  \"auth\u002Fsaml\": { \"isPublic\": true, \"groups\": [] },\n  \"internal\u002Fbilling\": { \"isPublic\": false, \"groups\": [\"admin\", \"billing\"] },\n  \"api\u002Fendpoints\": { \"isPublic\": true, \"groups\": [] }\n}\n","json","",[566,908,909,917,943,962,995,1015],{"__ignoreMap":906},[910,911,913],"span",{"class":912,"line":22},"line",[910,914,916],{"class":915},"s95oV","{\n",[910,918,919,923,926,929,932,935,937,940],{"class":912,"line":32},[910,920,922],{"class":921},"sDLfK","  \"auth\u002Foauth\"",[910,924,925],{"class":915},": { ",[910,927,928],{"class":921},"\"isPublic\"",[910,930,931],{"class":915},": ",[910,933,934],{"class":921},"true",[910,936,569],{"class":915},[910,938,939],{"class":921},"\"groups\"",[910,941,942],{"class":915},": [] },\n",[910,944,945,948,950,952,954,956,958,960],{"class":912,"line":293},[910,946,947],{"class":921},"  \"auth\u002Fsaml\"",[910,949,925],{"class":915},[910,951,928],{"class":921},[910,953,931],{"class":915},[910,955,934],{"class":921},[910,957,569],{"class":915},[910,959,939],{"class":921},[910,961,942],{"class":915},[910,963,964,967,969,971,973,976,978,980,983,987,989,992],{"class":912,"line":320},[910,965,966],{"class":921},"  \"internal\u002Fbilling\"",[910,968,925],{"class":915},[910,970,928],{"class":921},[910,972,931],{"class":915},[910,974,975],{"class":921},"false",[910,977,569],{"class":915},[910,979,939],{"class":921},[910,981,982],{"class":915},": [",[910,984,986],{"class":985},"sU2Wk","\"admin\"",[910,988,569],{"class":915},[910,990,991],{"class":985},"\"billing\"",[910,993,994],{"class":915},"] },\n",[910,996,997,1000,1002,1004,1006,1008,1010,1012],{"class":912,"line":330},[910,998,999],{"class":921},"  \"api\u002Fendpoints\"",[910,1001,925],{"class":915},[910,1003,928],{"class":921},[910,1005,931],{"class":915},[910,1007,934],{"class":921},[910,1009,569],{"class":915},[910,1011,939],{"class":921},[910,1013,1014],{"class":915},": [] }\n",[910,1016,1017],{"class":912,"line":351},[910,1018,1019],{"class":915},"}\n",[527,1021,1022],{},"On initialization, ChromaFs decompresses this into two in-memory structures:",[587,1024,1025,1033],{},[590,1026,1027,1032],{},[538,1028,1029],{},[566,1030,1031],{},"Set\u003Cstring>"," — all file paths (for existence checks)",[590,1034,1035,1040,1041,1043],{},[538,1036,1037],{},[566,1038,1039],{},"Map\u003Cstring, string[]>"," — directory-to-children mapping (for ",[566,1042,572],{},")",[527,1045,1046,1047,569,1049,576,1052,1054,1055,1058],{},"This means ",[566,1048,572],{},[566,1050,1051],{},"cd",[566,1053,579],{}," resolve ",[538,1056,1057],{},"locally in memory"," with zero network calls.",[610,1060,1062,1063,1065],{"id":1061},"chunk-reassembly-how-cat-works","Chunk Reassembly (how ",[566,1064,575],{}," works)",[527,1067,1068,1069,1072],{},"When the agent runs ",[566,1070,1071],{},"cat \u002Fauth\u002Foauth.mdx",":",[615,1074,1075,1081,1087,1090],{},[590,1076,1077,1078],{},"ChromaFs queries Chroma for all chunks where ",[566,1079,1080],{},"page_slug = \"auth\u002Foauth\"",[590,1082,1083,1084],{},"Results are sorted by ",[566,1085,1086],{},"chunk_index",[590,1088,1089],{},"Chunks are joined into the complete page content",[590,1091,1092],{},"Result is cached to prevent redundant DB hits on re-reads",[527,1094,1095,1096,1099],{},"For large files (like OpenAPI specs stored in S3), ChromaFs registers ",[538,1097,1098],{},"lazy file pointers"," — content is only fetched on actual access, not during tree initialization.",[610,1101,1103],{"id":1102},"two-stage-grep-optimization","Two-Stage Grep Optimization",[527,1105,1106],{},[530,1107],{"alt":1108,"src":1109},"Grep Optimization Flow","\u002Fdiagrams\u002Fvfs-grep-optimization.png",[527,1111,1112,1113,1116],{},"Recursive grep (",[566,1114,1115],{},"grep -r \"pattern\" .",") is the most expensive operation. ChromaFs uses a clever two-stage approach:",[527,1118,1119],{},[538,1120,1121],{},"Stage 1 — Coarse filter (Chroma)",[587,1123,1124,1131,1134],{},[590,1125,1126,1127,1130],{},"Translate the grep pattern into a Chroma ",[566,1128,1129],{},"$contains"," or regex query",[590,1132,1133],{},"Database returns only candidate files that might match",[590,1135,1136],{},"This eliminates 90%+ of files immediately",[527,1138,1139],{},[538,1140,1141],{},"Stage 2 — Fine filter (in-memory)",[587,1143,1144,1147,1150],{},[590,1145,1146],{},"Bulk-prefetch matched chunks into Redis",[590,1148,1149],{},"Rewrite the grep command to target only candidate files",[590,1151,1152],{},"Run actual pattern matching in memory",[527,1154,1155],{},"Result: millisecond-scale performance instead of scanning every document page over the network.",[610,1157,1159],{"id":1158},"rbac-at-the-filesystem-level","RBAC at the Filesystem Level",[527,1161,1162,1163,1166],{},"Access control is enforced ",[538,1164,1165],{},"before"," the file tree is built:",[615,1168,1169,1172,1175,1181],{},[590,1170,1171],{},"User's session token is read",[590,1173,1174],{},"Permission groups are extracted",[590,1176,1177,1178,1180],{},"The ",[566,1179,898],{}," JSON is filtered — only accessible paths are included",[590,1182,1183],{},"The in-memory tree is built from the filtered result",[527,1185,1186],{},"Agents literally cannot see, reference, or access pruned paths. It's as if restricted files don't exist.",[610,1188,1190],{"id":1189},"read-only-safety","Read-Only Safety",[527,1192,1193,1194,569,1197,569,1200,569,1203,1206,1207,1210],{},"All write operations (",[566,1195,1196],{},"mkdir",[566,1198,1199],{},"touch",[566,1201,1202],{},"echo >",[566,1204,1205],{},"rm",") throw ",[566,1208,1209],{},"EROFS"," (Read-Only File System) errors. This provides:",[587,1212,1213,1219,1225],{},[590,1214,1215,1218],{},[538,1216,1217],{},"Stateless sessions"," — no cleanup needed after conversations end",[590,1220,1221,1224],{},[538,1222,1223],{},"No interference"," — agents can't modify docs or affect other users",[590,1226,1227,1230],{},[538,1228,1229],{},"Simplicity"," — no need for copy-on-write or snapshotting",[554,1232,1234],{"id":1233},"performance-results","Performance Results",[527,1236,1237],{},[530,1238],{"alt":1239,"src":1240},"Performance Comparison","\u002Fdiagrams\u002Fvfs-performance.png",[634,1242,1243,1257],{},[637,1244,1245],{},[640,1246,1247,1249,1252,1254],{},[643,1248,753],{},[643,1250,1251],{},"Sandbox",[643,1253,540],{},[643,1255,1256],{},"Improvement",[650,1258,1259,1272,1286,1299,1313],{},[640,1260,1261,1264,1266,1269],{},[655,1262,1263],{},"P90 boot time",[655,1265,766],{},[655,1267,1268],{},"~100 milliseconds",[655,1270,1271],{},"460x faster",[640,1273,1274,1277,1280,1283],{},[655,1275,1276],{},"Marginal cost per conversation",[655,1278,1279],{},"~$0.0137",[655,1281,1282],{},"~$0",[655,1284,1285],{},"Effectively free",[640,1287,1288,1291,1293,1296],{},[655,1289,1290],{},"Annual infra cost (850k\u002Fmo)",[655,1292,798],{},[655,1294,1295],{},"$0 (reuses existing DB)",[655,1297,1298],{},"100% savings",[640,1300,1301,1304,1307,1310],{},[655,1302,1303],{},"Search mechanism",[655,1305,1306],{},"Linear disk scans",[655,1308,1309],{},"Database queries",[655,1311,1312],{},"Orders of magnitude",[640,1314,1315,1318,1321,1324],{},[655,1316,1317],{},"Session cleanup",[655,1319,1320],{},"Required (containers)",[655,1322,1323],{},"Not needed (stateless)",[655,1325,1326],{},"Zero ops burden",[554,1328,1330],{"id":1329},"key-takeaways","Key Takeaways",[610,1332,1334],{"id":1333},"for-ai-agent-builders","For AI agent builders",[615,1336,1337,1352,1358,1364,1370],{},[590,1338,1339,1342,1343,569,1345,569,1347,569,1349,1351],{},[538,1340,1341],{},"Filesystem interfaces are natural for agents"," — LLMs are trained on massive amounts of shell interaction data. They already know ",[566,1344,568],{},[566,1346,575],{},[566,1348,572],{},[566,1350,579],{},". Don't invent custom tool APIs when standard UNIX commands work better.",[590,1353,1354,1357],{},[538,1355,1356],{},"Agentic search beats one-shot retrieval"," — Instead of \"query once, hope for the best,\" let agents iteratively explore. They can refine searches, follow leads, and build understanding progressively.",[590,1359,1360,1363],{},[538,1361,1362],{},"Exact matching still matters"," — Embeddings flatten information and lose precision for technical terms, acronyms, and exact syntax. A hybrid approach (or filesystem grep) preserves what semantic search loses.",[590,1365,1366,1369],{},[538,1367,1368],{},"Virtual > Real for read-only workloads"," — If agents only need to read, don't spin up real filesystems. Map the interface they expect to the storage you already have.",[590,1371,1372,1375],{},[538,1373,1374],{},"RBAC belongs at the data layer"," — Don't try to teach agents about permissions. Just make unauthorized data invisible at the filesystem level.",[610,1377,1379],{"id":1378},"the-bigger-picture","The bigger picture",[527,1381,1382],{},"This represents a shift from \"RAG finds context for the AI\" to \"AI discovers context on its own.\" The retrieval isn't the bottleneck — the abstraction is. Give agents familiar tools and hierarchical structure, and they'll find what they need.",[554,1384,1386],{"id":1385},"further-reading","Further Reading",[587,1388,1389,1396,1403,1410],{},[590,1390,1391],{},[546,1392,1395],{"href":1393,"rel":1394},"https:\u002F\u002Fwww.mintlify.com\u002Fblog\u002Fhow-we-built-a-virtual-filesystem-for-our-assistant",[550],"Original blog post: How we built a virtual filesystem for our Assistant",[590,1397,1398],{},[546,1399,1402],{"href":1400,"rel":1401},"https:\u002F\u002Fnews.ycombinator.com\u002Fitem?id=47618223",[550],"Hacker News discussion",[590,1404,1405],{},[546,1406,1409],{"href":1407,"rel":1408},"https:\u002F\u002Fgithub.com\u002Fnichochar\u002Fjust-bash",[550],"just-bash by Vercel Labs",[590,1411,1412],{},[546,1413,1416],{"href":1414,"rel":1415},"https:\u002F\u002Fwww.trieve.ai\u002F",[550],"Trieve: All-in-one search, RAG & recommendations",[1418,1419,1420],"style",{},"html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}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":906,"searchDepth":32,"depth":293,"links":1422},[1423,1424,1429,1433,1437,1445,1446,1450],{"id":556,"depth":32,"text":557},{"id":601,"depth":32,"text":602,"children":1425},[1426,1427,1428],{"id":612,"depth":293,"text":613},{"id":631,"depth":293,"text":632},{"id":687,"depth":293,"text":688},{"id":709,"depth":32,"text":710,"children":1430},[1431,1432],{"id":720,"depth":293,"text":721},{"id":743,"depth":293,"text":744},{"id":804,"depth":32,"text":805,"children":1434},[1435,1436],{"id":825,"depth":293,"text":826},{"id":855,"depth":293,"text":856},{"id":887,"depth":32,"text":888,"children":1438},[1439,1440,1442,1443,1444],{"id":891,"depth":293,"text":892},{"id":1061,"depth":293,"text":1441},"Chunk Reassembly (how cat works)",{"id":1102,"depth":293,"text":1103},{"id":1158,"depth":293,"text":1159},{"id":1189,"depth":293,"text":1190},{"id":1233,"depth":32,"text":1234},{"id":1329,"depth":32,"text":1330,"children":1447},[1448,1449],{"id":1333,"depth":293,"text":1334},{"id":1378,"depth":293,"text":1379},{"id":1385,"depth":32,"text":1386},"md",{},true,{"title":171,"description":172},"engineering\u002Freference\u002Fvirtual-filesystem-rag",[12,174,14,175],"h2KHwrhLm_a_IEunFs4IIS4OUxjyu64i3uf0BDl4Bgk",1783345924371]