[{"data":1,"prerenderedAt":2518},["ShallowReactive",2],{"docs-nav":3,"docs-article-agents\u002Fpaperclip":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":108,"body":518,"customComponent":182,"description":109,"extension":2511,"group":8,"lastUpdated":113,"meta":2512,"navigation":2513,"order":32,"path":107,"related":182,"section":21,"seo":2514,"stem":2515,"tags":2516,"__hash__":2517},"docs\u002Fagents\u002Fpaperclip\u002Findex.md",{"type":519,"value":520,"toc":2500},"minimark",[521,526,534,557,571,582,587,610,613,666,669,704,708,714,717,832,835,839,845,852,855,983,989,992,1010,1014,1020,1050,1055,1096,1101,1156,1196,1234,1238,1244,1247,1516,1545,1572,1577,1699,1720,1741,1744,1767,1771,1777,1786,1800,1841,1862,1870,1944,1970,2001,2004,2029,2033,2039,2042,2091,2096,2179,2212,2218,2270,2273,2275,2315,2319,2360,2364,2496],[522,523,525],"h1",{"id":524},"how-paperclip-orchestrates-ai-companies","How Paperclip Orchestrates AI Companies",[527,528,529],"p",{},[530,531],"img",{"alt":532,"src":533},"Paperclip mental model — company made of agents","\u002Fdiagrams\u002Fpaperclip-model.png",[527,535,536,542,543,547,548,552,553,556],{},[537,538,108],"a",{"href":539,"rel":540},"https:\u002F\u002Fgithub.com\u002Fpaperclipai\u002Fpaperclip",[541],"nofollow"," is an open-source control plane for ",[544,545,546],"em",{},"autonomous AI companies",". You define a company, give it a goal, hire a tree of AI agents, and Paperclip coordinates their work through tickets, heartbeats, budgets, and board approvals. Unlike a chat framework or a workflow builder, Paperclip is unopinionated about ",[549,550,551],"strong",{},"how"," your agents run — Claude Code, Codex, Cursor, OpenClaw, a bare shell script — and opinionated about ",[549,554,555],{},"how they collaborate",".",[527,558,559,560,563,564,567,568,556],{},"This guide walks through Paperclip's model, a worked example, the core architecture, the repo layout, and then dives into the three subsystems that do most of the heavy lifting: ",[549,561,562],{},"adapters",", ",[549,565,566],{},"heartbeats",", and ",[549,569,570],{},"tickets",[572,573,574],"blockquote",{},[527,575,576,577,581],{},"Verified against ",[578,579,580],"code",{},"paperclipai\u002Fpaperclip @ 1266954a"," (2026-04-20). File paths are stable, function line numbers drift — grep by name if they've moved.",[583,584,586],"h2",{"id":585},"the-mental-model-a-company-made-of-agents","The Mental Model: A Company Made of Agents",[527,588,589,590,593,594,597,598,601,602,605,606,609],{},"Paperclip models the real-world metaphor it's named after. A ",[549,591,592],{},"company"," has one ",[549,595,596],{},"human board"," on top, a single ",[549,599,600],{},"goal"," that gives everything meaning, and an ",[549,603,604],{},"org tree"," of AI agents hanging below. Agents report to other agents (",[578,607,608],{},"agents.reportsTo","), and every piece of work traces back through a chain of parent issues to the company's top-level goal. The board doesn't write prompts; it approves hires, sets budgets, and signs off on strategic directions.",[527,611,612],{},"Three properties are worth internalizing:",[614,615,616,639,657],"ul",{},[617,618,619,622,623,563,626,563,629,563,632,563,635,638],"li",{},[549,620,621],{},"Every employee is an agent."," The CEO is an agent. The CTO reporting to the CEO is an agent. The designer two levels down is an agent. They all have the same shape — ",[578,624,625],{},"name",[578,627,628],{},"adapterType",[578,630,631],{},"adapterConfig",[578,633,634],{},"reportsTo",[578,636,637],{},"budgetMonthlyCents"," — just different configurations.",[617,640,641,644,645,648,649,652,653,656],{},[549,642,643],{},"Every ticket traces to the goal."," An issue is linked to a ",[578,646,647],{},"goalId"," and can have a ",[578,650,651],{},"parentId"," pointing to a broader issue. Agents can always answer ",[544,654,655],{},"\"why am I doing this?\""," by walking the chain up.",[617,658,659,662,663,556],{},[549,660,661],{},"The board remains in control."," Approvals gate hiring decisions and strategy changes. Budgets cap monthly spend and auto-pause agents at the ceiling. Every state change is audited via ",[578,664,665],{},"activity_log",[527,667,668],{},"Key schema files to read if you want to go deeper:",[614,670,671,677,683,693],{},[617,672,673,676],{},[578,674,675],{},"packages\u002Fdb\u002Fsrc\u002Fschema\u002Fcompanies.ts"," — company, budget, issue prefix",[617,678,679,682],{},[578,680,681],{},"packages\u002Fdb\u002Fsrc\u002Fschema\u002Fagents.ts"," — adapter config, reporting tree, budget",[617,684,685,688,689,692],{},[578,686,687],{},"packages\u002Fdb\u002Fsrc\u002Fschema\u002Fgoals.ts"," — hierarchical goals (",[578,690,691],{},"parentGoalId",")",[617,694,695,698,699,701,702],{},[578,696,697],{},"packages\u002Fdb\u002Fsrc\u002Fschema\u002Fissues.ts"," — the work unit, linked to both ",[578,700,647],{}," and ",[578,703,651],{},[583,705,707],{"id":706},"worked-example-ship-a-facebook-ads-campaign","Worked Example: \"Ship a Facebook Ads Campaign\"",[527,709,710],{},[530,711],{"alt":712,"src":713},"End-to-end workflow example","\u002Fdiagrams\u002Fpaperclip-workflow-example.png",[527,715,716],{},"Abstract models don't stick — here's the same scenario end-to-end so you can see every subsystem fire.",[718,719,720,733,747,757,781,787,801,818],"ol",{},[617,721,722,725,726,729,730],{},[549,723,724],{},"Board sets the goal."," You create a company, give it the goal ",[544,727,728],{},"\"$1M MRR in 3 months\""," with a monthly budget. The board creates a top-level issue: ",[544,731,732],{},"\"Run Facebook ads campaign to hit 100 signups this week.\"",[617,734,735,738,739,742,743,746],{},[549,736,737],{},"CEO proposes the breakdown."," The CEO agent's heartbeat fires, it reads the new issue, and proposes child issues: landing page, creative, ad copy, launch. It files an ",[578,740,741],{},"approvals"," row with status ",[578,744,745],{},"pending"," and stops.",[617,748,749,752,753,756],{},[549,750,751],{},"Board approves."," You click approve in the UI. The child issues flip from drafts to ",[578,754,755],{},"todo",", each assigned to a subordinate agent (CTO, designer, CMO).",[617,758,759,762,763,766,767,770,771,774,775,701,778,556],{},[549,760,761],{},"CMO is auto-waked."," The ",[578,764,765],{},"issues.assigneeAgentId"," write triggers an ",[549,768,769],{},"assignment"," wake. The heartbeat service enqueues a new ",[578,772,773],{},"heartbeat_runs"," row with ",[578,776,777],{},"status='queued'",[578,779,780],{},"source='assignment'",[617,782,783,786],{},[549,784,785],{},"Marketer gets the sub-issue."," The CMO heartbeat runs, reads its top issue, decides it needs an operator, and creates a sub-issue assigned to the marketer agent. Another assignment wake fires.",[617,788,789,792,793,796,797,800],{},[549,790,791],{},"Scheduler dispatches."," ",[578,794,795],{},"executeRun()"," pulls the queued run, atomically calls ",[578,798,799],{},"issues.checkout()"," to lock the issue against anyone else, and realizes an execution workspace (a git worktree or the shared repo).",[617,802,803,792,806,809,810,813,814,817],{},[549,804,805],{},"Adapter runs.",[578,807,808],{},"getServerAdapter(\"claude_local\")"," returns the Claude Local adapter; Paperclip builds an ",[578,811,812],{},"AdapterExecutionContext"," with the workspace path, decrypted secrets, relevant skills, and the session ID from the previous heartbeat. The adapter spawns Claude Code, streams stdout through ",[578,815,816],{},"onLog",", and captures usage + cost.",[617,819,820,823,824,827,828,831],{},[549,821,822],{},"Result is recorded."," Paperclip parses the ",[578,825,826],{},"AdapterExecutionResult",", writes a ",[578,829,830],{},"cost_events"," row, checks the budget ceiling, posts a human-readable comment to the issue, and on success promotes the parent issue — which wakes the CMO again to review the work.",[527,833,834],{},"Every step in that narrative maps to a concrete function you can grep for. No magic, just bookkeeping.",[583,836,838],{"id":837},"the-core-system-control-plane-at-a-glance","The Core System: Control Plane at a Glance",[527,840,841],{},[530,842],{"alt":843,"src":844},"Control plane architecture","\u002Fdiagrams\u002Fpaperclip-core-system.png",[527,846,847,848,851],{},"Paperclip is deliberately a ",[549,849,850],{},"control plane",", not an execution plane. Agents run wherever they run — locally, in a container, behind a webhook — and Paperclip coordinates their schedule, context, cost, and state. The whole thing is one Node.js process plus an embedded Postgres database you never have to configure.",[527,853,854],{},"The stack, top to bottom:",[614,856,857,867,877,911,928,966],{},[617,858,859,862,863,866],{},[549,860,861],{},"Surface"," — React + Vite board UI (served by the same dev server), the ",[578,864,865],{},"paperclipai"," Commander CLI, and external agent webhooks.",[617,868,869,872,873,876],{},[549,870,871],{},"API"," — Express REST endpoints in ",[578,874,875],{},"server\u002Fsrc\u002Findex.ts",". Auth, rate limiting, and a live-event bus for UI streaming.",[617,878,879,882,883,886,887,563,890,563,893,563,896,563,899,563,901,563,904,563,907,910],{},[549,880,881],{},"Services"," — the business logic layer under ",[578,884,885],{},"server\u002Fsrc\u002Fservices\u002F",". Key ones: ",[578,888,889],{},"heartbeat",[578,891,892],{},"issues",[578,894,895],{},"costs",[578,897,898],{},"budgets",[578,900,741],{},[578,902,903],{},"execution-workspaces",[578,905,906],{},"skills",[578,908,909],{},"activity-log",", and the plugin event bus.",[617,912,913,916,917,920,921,923,924,927],{},[549,914,915],{},"Dispatch"," — the adapter registry (",[578,918,919],{},"server\u002Fsrc\u002Fadapters\u002Fregistry.ts",") turns an agent's ",[578,922,628],{}," string into an ",[578,925,926],{},"execute()"," function.",[617,929,930,933,934,563,937,563,940,563,943,563,946,563,949,563,952,563,955,958,959,701,962,965],{},[549,931,932],{},"Execution"," — the actual agent processes: ",[578,935,936],{},"claude_local",[578,938,939],{},"codex_local",[578,941,942],{},"cursor",[578,944,945],{},"gemini_local",[578,947,948],{},"opencode_local",[578,950,951],{},"pi_local",[578,953,954],{},"hermes_local",[578,956,957],{},"openclaw_gateway",", plus generic ",[578,960,961],{},"process",[578,963,964],{},"http"," fallbacks.",[617,967,968,971,972,975,976,979,980,556],{},[549,969,970],{},"Storage"," — PostgreSQL via Drizzle ORM. In dev it's the bundled ",[578,973,974],{},"@embedded-postgres\u002Fdarwin-arm64"," running under ",[578,977,978],{},"~\u002F.paperclip\u002Finstances\u002Fdefault\u002Fdb","; in prod you point it at your own Postgres via ",[578,981,982],{},"DATABASE_URL",[527,984,985,986],{},"The principle that ties it together: ",[544,987,988],{},"Paperclip never writes the agent's code or runs its loop — it just schedules, hands context, captures output, and writes the ledger.",[527,990,991],{},"Useful entry points:",[614,993,994,999,1005],{},[617,995,996,998],{},[578,997,875],{}," — API bootstrap, service wiring, scheduler start",[617,1000,1001,1004],{},[578,1002,1003],{},"server\u002Fsrc\u002Fservices\u002Fheartbeat.ts"," — the scheduler and execution engine",[617,1006,1007,1009],{},[578,1008,919],{}," — bundled adapter registration",[583,1011,1013],{"id":1012},"inside-the-repo-high-level-system-design","Inside the Repo: High-Level System Design",[527,1015,1016],{},[530,1017],{"alt":1018,"src":1019},"Paperclip repo layout","\u002Fdiagrams\u002Fpaperclip-repo-map.png",[527,1021,1022,1023,1026,1027,1030,1031,563,1034,563,1036,1039,1040,563,1043,567,1046,1049],{},"Paperclip is a ",[578,1024,1025],{},"pnpm"," monorepo. The top-level ",[578,1028,1029],{},"pnpm-workspace.yaml"," pulls in three apps (",[578,1032,1033],{},"server",[578,1035,257],{},[578,1037,1038],{},"cli",") and every ",[578,1041,1042],{},"packages\u002F*",[578,1044,1045],{},"packages\u002Fadapters\u002F*",[578,1047,1048],{},"packages\u002Fplugins\u002F*"," member.",[527,1051,1052],{},[549,1053,1054],{},"Apps (entry points).",[614,1056,1057,1065,1074],{},[617,1058,1059,1062,1063,556],{},[578,1060,1061],{},"server\u002F"," — Express API, embedded Postgres, heartbeat scheduler, service layer, adapter registry. Start here at ",[578,1064,875],{},[617,1066,1067,1070,1071,556],{},[578,1068,1069],{},"ui\u002F"," — React dashboard. In dev it's middleware-served by the same server on ",[578,1072,1073],{},"http:\u002F\u002Flocalhost:3100",[617,1075,1076,1079,1080,1082,1083,563,1086,563,1089,563,1092,1095],{},[578,1077,1078],{},"cli\u002F"," — the ",[578,1081,865],{}," Commander program. Covers ",[578,1084,1085],{},"onboard",[578,1087,1088],{},"doctor",[578,1090,1091],{},"configure",[578,1093,1094],{},"heartbeat-run",", plus issue\u002Fagent\u002Fapproval\u002Fcompany admin commands.",[527,1097,1098],{},[549,1099,1100],{},"Shared packages.",[614,1102,1103,1113,1126,1140,1150],{},[617,1104,1105,1108,1109,1112],{},[578,1106,1107],{},"packages\u002Fdb\u002F"," — Drizzle schema and 60+ migration files. ",[578,1110,1111],{},"packages\u002Fdb\u002Fsrc\u002Fschema\u002F*.ts"," is the authoritative data model.",[617,1114,1115,1118,1119,701,1122,1125],{},[578,1116,1117],{},"packages\u002Fshared\u002F"," — zod validators and shared constants like ",[578,1120,1121],{},"ISSUE_STATUSES",[578,1123,1124],{},"HEARTBEAT_RUN_STATUSES",". Any type used across server\u002Fui\u002Fcli goes here.",[617,1127,1128,1131,1132,563,1134,563,1136,1139],{},[578,1129,1130],{},"packages\u002Fadapter-utils\u002F"," — the interface every adapter implements (",[578,1133,812],{},[578,1135,826],{},[578,1137,1138],{},"AdapterSessionCodec","), plus billing helpers, log redaction, session compaction.",[617,1141,1142,1145,1146,1149],{},[578,1143,1144],{},"packages\u002Fplugins\u002Fsdk\u002F"," — the plugin SDK. Third parties call ",[578,1147,1148],{},"definePlugin()"," to contribute adapters, jobs, event handlers, and UI panels over a JSON-RPC bridge.",[617,1151,1152,1155],{},[578,1153,1154],{},"packages\u002Fmcp-server\u002F"," — a built-in MCP endpoint agents can hit to pull Paperclip context.",[527,1157,1158,1161,1162,1165,1166,563,1169,563,1172,563,1175,563,1178,563,1181,563,1184,1187,1188,701,1190,1192,1193,556],{},[549,1159,1160],{},"Bundled adapters"," live under ",[578,1163,1164],{},"packages\u002Fadapters\u002F"," — one sub-package per runtime (",[578,1167,1168],{},"claude-local",[578,1170,1171],{},"codex-local",[578,1173,1174],{},"cursor-local",[578,1176,1177],{},"gemini-local",[578,1179,1180],{},"opencode-local",[578,1182,1183],{},"pi-local",[578,1185,1186],{},"openclaw-gateway","). The generic ",[578,1189,961],{},[578,1191,964],{}," adapters are small enough to live inside ",[578,1194,1195],{},"server\u002Fsrc\u002Fadapters\u002F",[527,1197,1198,792,1201,1204,1205,563,1208,563,1211,1214,1215,1218,1219,701,1222,1225,1226,1229,1230,1233],{},[549,1199,1200],{},"Ops.",[578,1202,1203],{},"doc\u002F"," has the authoritative design spec (",[578,1206,1207],{},"PRODUCT.md",[578,1209,1210],{},"SPEC.md",[578,1212,1213],{},"execution-semantics.md","). ",[578,1216,1217],{},"skills\u002F"," ships Claude Code skills Paperclip injects into agents at runtime. ",[578,1220,1221],{},"tests\u002F",[578,1223,1224],{},"evals\u002F"," hold Vitest, Playwright, and PromptFoo suites. ",[578,1227,1228],{},"scripts\u002F"," holds dev-runner and smoke tests. ",[578,1231,1232],{},"docker\u002F"," has a quickstart compose file.",[583,1235,1237],{"id":1236},"deep-dive-the-adapter-system","Deep Dive: The Adapter System",[527,1239,1240],{},[530,1241],{"alt":1242,"src":1243},"Adapter system data flow","\u002Fdiagrams\u002Fpaperclip-adapter-system.png",[527,1245,1246],{},"The adapter system is the single most important boundary in Paperclip. Everything above it is control plane; everything below it is someone else's agent. The only contract an adapter has to honor:",[1248,1249,1254],"pre",{"className":1250,"code":1251,"language":1252,"meta":1253,"style":1253},"language-ts shiki shiki-themes github-dark","export interface AdapterExecutionContext {\n  runId: string;\n  agent: AdapterAgent;\n  runtime: AdapterRuntime;\n  config: Record\u003Cstring, unknown>;\n  context: Record\u003Cstring, unknown>;\n  onLog: (stream: \"stdout\" | \"stderr\", chunk: string) => Promise\u003Cvoid>;\n  onMeta?: (meta: AdapterInvocationMeta) => Promise\u003Cvoid>;\n  onSpawn?: (meta: { pid: number; processGroupId: number | null; startedAt: string }) => Promise\u003Cvoid>;\n  authToken?: string;\n}\n","ts","",[578,1255,1256,1275,1291,1303,1315,1339,1358,1408,1438,1500,1511],{"__ignoreMap":1253},[1257,1258,1260,1264,1267,1271],"span",{"class":1259,"line":22},"line",[1257,1261,1263],{"class":1262},"snl16","export",[1257,1265,1266],{"class":1262}," interface",[1257,1268,1270],{"class":1269},"svObZ"," AdapterExecutionContext",[1257,1272,1274],{"class":1273},"s95oV"," {\n",[1257,1276,1277,1281,1284,1288],{"class":1259,"line":32},[1257,1278,1280],{"class":1279},"s9osk","  runId",[1257,1282,1283],{"class":1262},":",[1257,1285,1287],{"class":1286},"sDLfK"," string",[1257,1289,1290],{"class":1273},";\n",[1257,1292,1293,1296,1298,1301],{"class":1259,"line":293},[1257,1294,1295],{"class":1279},"  agent",[1257,1297,1283],{"class":1262},[1257,1299,1300],{"class":1269}," AdapterAgent",[1257,1302,1290],{"class":1273},[1257,1304,1305,1308,1310,1313],{"class":1259,"line":320},[1257,1306,1307],{"class":1279},"  runtime",[1257,1309,1283],{"class":1262},[1257,1311,1312],{"class":1269}," AdapterRuntime",[1257,1314,1290],{"class":1273},[1257,1316,1317,1320,1322,1325,1328,1331,1333,1336],{"class":1259,"line":330},[1257,1318,1319],{"class":1279},"  config",[1257,1321,1283],{"class":1262},[1257,1323,1324],{"class":1269}," Record",[1257,1326,1327],{"class":1273},"\u003C",[1257,1329,1330],{"class":1286},"string",[1257,1332,563],{"class":1273},[1257,1334,1335],{"class":1286},"unknown",[1257,1337,1338],{"class":1273},">;\n",[1257,1340,1341,1344,1346,1348,1350,1352,1354,1356],{"class":1259,"line":351},[1257,1342,1343],{"class":1279},"  context",[1257,1345,1283],{"class":1262},[1257,1347,1324],{"class":1269},[1257,1349,1327],{"class":1273},[1257,1351,1330],{"class":1286},[1257,1353,563],{"class":1273},[1257,1355,1335],{"class":1286},[1257,1357,1338],{"class":1273},[1257,1359,1360,1363,1365,1368,1371,1373,1377,1380,1383,1385,1388,1390,1392,1395,1398,1401,1403,1406],{"class":1259,"line":373},[1257,1361,1362],{"class":1269},"  onLog",[1257,1364,1283],{"class":1262},[1257,1366,1367],{"class":1273}," (",[1257,1369,1370],{"class":1279},"stream",[1257,1372,1283],{"class":1262},[1257,1374,1376],{"class":1375},"sU2Wk"," \"stdout\"",[1257,1378,1379],{"class":1262}," |",[1257,1381,1382],{"class":1375}," \"stderr\"",[1257,1384,563],{"class":1273},[1257,1386,1387],{"class":1279},"chunk",[1257,1389,1283],{"class":1262},[1257,1391,1287],{"class":1286},[1257,1393,1394],{"class":1273},") ",[1257,1396,1397],{"class":1262},"=>",[1257,1399,1400],{"class":1269}," Promise",[1257,1402,1327],{"class":1273},[1257,1404,1405],{"class":1286},"void",[1257,1407,1338],{"class":1273},[1257,1409,1410,1413,1416,1418,1421,1423,1426,1428,1430,1432,1434,1436],{"class":1259,"line":365},[1257,1411,1412],{"class":1269},"  onMeta",[1257,1414,1415],{"class":1262},"?:",[1257,1417,1367],{"class":1273},[1257,1419,1420],{"class":1279},"meta",[1257,1422,1283],{"class":1262},[1257,1424,1425],{"class":1269}," AdapterInvocationMeta",[1257,1427,1394],{"class":1273},[1257,1429,1397],{"class":1262},[1257,1431,1400],{"class":1269},[1257,1433,1327],{"class":1273},[1257,1435,1405],{"class":1286},[1257,1437,1338],{"class":1273},[1257,1439,1441,1444,1446,1448,1450,1452,1455,1458,1460,1463,1466,1469,1471,1473,1475,1478,1480,1483,1485,1487,1490,1492,1494,1496,1498],{"class":1259,"line":1440},9,[1257,1442,1443],{"class":1269},"  onSpawn",[1257,1445,1415],{"class":1262},[1257,1447,1367],{"class":1273},[1257,1449,1420],{"class":1279},[1257,1451,1283],{"class":1262},[1257,1453,1454],{"class":1273}," { ",[1257,1456,1457],{"class":1279},"pid",[1257,1459,1283],{"class":1262},[1257,1461,1462],{"class":1286}," number",[1257,1464,1465],{"class":1273},"; ",[1257,1467,1468],{"class":1279},"processGroupId",[1257,1470,1283],{"class":1262},[1257,1472,1462],{"class":1286},[1257,1474,1379],{"class":1262},[1257,1476,1477],{"class":1286}," null",[1257,1479,1465],{"class":1273},[1257,1481,1482],{"class":1279},"startedAt",[1257,1484,1283],{"class":1262},[1257,1486,1287],{"class":1286},[1257,1488,1489],{"class":1273}," }) ",[1257,1491,1397],{"class":1262},[1257,1493,1400],{"class":1269},[1257,1495,1327],{"class":1273},[1257,1497,1405],{"class":1286},[1257,1499,1338],{"class":1273},[1257,1501,1502,1505,1507,1509],{"class":1259,"line":157},[1257,1503,1504],{"class":1279},"  authToken",[1257,1506,1415],{"class":1262},[1257,1508,1287],{"class":1286},[1257,1510,1290],{"class":1273},[1257,1512,1513],{"class":1259,"line":248},[1257,1514,1515],{"class":1273},"}\n",[527,1517,1518,1519,1522,1523,1525,1526,563,1529,563,1532,563,1535,563,1538,1541,1542,556],{},"Source: ",[578,1520,1521],{},"packages\u002Fadapter-utils\u002Fsrc\u002Ftypes.ts",". The adapter gets everything it needs to do its job — the agent's config, the runtime's session state, the resolved workspace, skills, decrypted secrets — and three callbacks to report log lines, process metadata, and spawn info back to Paperclip. It returns an ",[578,1524,826],{}," with ",[578,1527,1528],{},"exitCode",[578,1530,1531],{},"usage",[578,1533,1534],{},"sessionParams",[578,1536,1537],{},"costUsd",[578,1539,1540],{},"billingType",", and a human-readable ",[578,1543,1544],{},"summary",[527,1546,1547,792,1550,1552,1553,1556,1557,1559,1560,1563,1564,1567,1568,1571],{},[549,1548,1549],{},"The registry is a mutable map.",[578,1551,919],{}," imports every bundled adapter, wraps it in a ",[578,1554,1555],{},"ServerAdapterModule"," record, and writes it into a per-process map keyed by the ",[578,1558,628],{}," string. ",[578,1561,1562],{},"registerServerAdapter(adapter)"," is also called by ",[578,1565,1566],{},"plugin-loader.ts"," when a plugin registers a new type at load time, so third-party runtimes slot in without recompiling the server. Look at ",[578,1569,1570],{},"server\u002Fsrc\u002Fadapters\u002Fbuiltin-adapter-types.ts"," for the canonical list.",[527,1573,1574],{},[549,1575,1576],{},"Bundled adapters at a glance.",[1578,1579,1580,1596],"table",{},[1581,1582,1583],"thead",{},[1584,1585,1586,1590,1593],"tr",{},[1587,1588,1589],"th",{},"Adapter type",[1587,1591,1592],{},"What it does",[1587,1594,1595],{},"Session handling",[1597,1598,1599,1621,1633,1645,1664,1676,1688],"tbody",{},[1584,1600,1601,1606,1612],{},[1602,1603,1604],"td",{},[578,1605,936],{},[1602,1607,1608,1609,1611],{},"Spawns the ",[578,1610,151],{}," CLI in the workspace, streams JSON output, parses usage and cost",[1602,1613,1614,1615,1618,1619],{},"Resumes via ",[578,1616,1617],{},"sessionId"," written into ",[578,1620,1534],{},[1584,1622,1623,1627,1630],{},[1602,1624,1625],{},[578,1626,939],{},[1602,1628,1629],{},"Same pattern for OpenAI Codex",[1602,1631,1632],{},"Codex-specific codec",[1584,1634,1635,1639,1642],{},[1602,1636,1637],{},[578,1638,942],{},[1602,1640,1641],{},"Bridges to Cursor's CLI",[1602,1643,1644],{},"Cursor codec",[1584,1646,1647,1658,1661],{},[1602,1648,1649,1651,1652,1651,1654,1651,1656],{},[578,1650,945],{}," \u002F ",[578,1653,948],{},[578,1655,951],{},[578,1657,954],{},[1602,1659,1660],{},"One process adapter per runtime",[1602,1662,1663],{},"Runtime-specific codec",[1584,1665,1666,1670,1673],{},[1602,1667,1668],{},[578,1669,957],{},[1602,1671,1672],{},"POSTs context to a managed OpenClaw webhook and handles async callbacks",[1602,1674,1675],{},"Gateway tracks external run IDs",[1584,1677,1678,1682,1685],{},[1602,1679,1680],{},[578,1681,961],{},[1602,1683,1684],{},"Runs any configured shell command with the agent's env",[1602,1686,1687],{},"None — stateless",[1584,1689,1690,1694,1697],{},[1602,1691,1692],{},[578,1693,964],{},[1602,1695,1696],{},"POSTs JSON to a configurable webhook",[1602,1698,1687],{},[527,1700,1701,1704,1705,1708,1709,1712,1713,1715,1716,1719],{},[549,1702,1703],{},"Session codecs"," are the trick that makes long-running, multi-heartbeat work possible. ",[578,1706,1707],{},"AdapterSessionCodec.serialize()"," takes the adapter's private session state and returns a JSON blob Paperclip stores as ",[578,1710,1711],{},"heartbeat_runs.sessionIdAfter","\u002F",[578,1714,1534],{},". On the next heartbeat, ",[578,1717,1718],{},"deserialize()"," hydrates it back, and the Claude Code session (or Codex session, or …) picks up where it left off. Without this, every heartbeat would start fresh.",[527,1721,1722,1725,1726,1729,1730,1733,1734,1736,1737,1740],{},[549,1723,1724],{},"Plugin adapters"," register at load time through the plugin worker process. The SDK ships in ",[578,1727,1728],{},"packages\u002Fplugins\u002Fsdk"," and the full protocol is documented in ",[578,1731,1732],{},"adapter-plugin.md"," at the repo root — the short version is: plugin author writes a ",[578,1735,1148],{}," module, Paperclip spawns it as a Node child process, they talk JSON-RPC 2.0 over stdio, and the plugin's ",[578,1738,1739],{},"ctx.registerAdapter()"," call lands on the server-side registry.",[527,1742,1743],{},"Files worth reading:",[614,1745,1746,1751,1756,1762],{},[617,1747,1748,1750],{},[578,1749,1521],{}," — the contract (types only; no drizzle dependency)",[617,1752,1753,1755],{},[578,1754,919],{}," — wiring",[617,1757,1758,1761],{},[578,1759,1760],{},"packages\u002Fadapters\u002Fclaude-local\u002Fsrc\u002Fserver\u002Fexecute.ts"," — a worked example with streaming, cost parsing, session management",[617,1763,1764,1766],{},[578,1765,1732],{}," — plugin contribution path",[583,1768,1770],{"id":1769},"deep-dive-the-heartbeat-system","Deep Dive: The Heartbeat System",[527,1772,1773],{},[530,1774],{"alt":1775,"src":1776},"Heartbeat lifecycle","\u002Fdiagrams\u002Fpaperclip-heartbeat-system.png",[527,1778,1779,1780,1782,1783,1785],{},"A ",[549,1781,889],{}," is a single agent execution. Heartbeats are the universal unit of work in Paperclip — timer-fired, assignment-fired, webhook-fired, or cron-fired, they all flow through the same pipeline and produce a ",[578,1784,773],{}," row.",[527,1787,1788,1791,1792,1795,1796,1799],{},[549,1789,1790],{},"Wake reasons."," Four sources (see ",[578,1793,1794],{},"services\u002Fheartbeat.ts"," around the ",[578,1797,1798],{},"source"," union):",[614,1801,1802,1819,1827,1836],{},[617,1803,1804,1807,1808,1811,1812,1815,1816,556],{},[578,1805,1806],{},"timer"," — the scheduler's ",[578,1809,1810],{},"tickTimers()"," loop walks every agent and checks whether ",[578,1813,1814],{},"intervalSec"," has elapsed since ",[578,1817,1818],{},"lastHeartbeatAt",[617,1820,1821,1823,1824,1826],{},[578,1822,769],{}," — writing ",[578,1825,765],{}," triggers an assignment wake so the agent picks up its new work immediately.",[617,1828,1829,1079,1832,1835],{},[578,1830,1831],{},"on_demand",[578,1833,1834],{},"\u002Fapi\u002Fagents\u002F:id\u002Fwakeup"," HTTP endpoint (used by webhooks and manual \"nudge\" buttons in the UI).",[617,1837,1838,1840],{},[578,1839,483],{}," — plugin jobs or scheduled routines.",[527,1842,1843,792,1846,1849,1850,1852,1853,1856,1857,774,1859,1861],{},[549,1844,1845],{},"Enqueue is atomic.",[578,1847,1848],{},"enqueueWakeup(agentId, opts)"," (around line 5231 of ",[578,1851,1794],{},") writes two rows in a transaction: an ",[578,1854,1855],{},"agent_wakeup_requests"," row that lets Paperclip deduplicate identical wakes, and a ",[578,1858,773],{},[578,1860,777],{},". Nothing else executes agent code — everything else just reads from the queue.",[527,1863,1864,1869],{},[549,1865,1866,1868],{},[578,1867,795],{}," is the main loop"," (around line 3961). For each queued run, it:",[718,1871,1872,1883,1897,1907,1913,1922],{},[617,1873,1874,1875,1878,1879,1882],{},"Claims the run by flipping ",[578,1876,1877],{},"status"," to ",[578,1880,1881],{},"running"," with a process lease.",[617,1884,1885,1886,1888,1889,1892,1893,1896],{},"Calls ",[578,1887,799],{}," — an atomic write that sets ",[578,1890,1891],{},"checkoutRunId"," on the issue and flips it to ",[578,1894,1895],{},"in_progress",". If another run has already claimed the issue, checkout fails and this run bails out cleanly.",[617,1898,1899,1900,1903,1904,556],{},"Realizes the execution workspace: either reuses the shared checkout or creates a git worktree, runs ",[578,1901,1902],{},"setupCommand",", exports the project ",[578,1905,1906],{},"env",[617,1908,1909,1910,1912],{},"Builds the ",[578,1911,812],{}," — workspace path, decrypted secrets, relevant skills, prior session params, task state.",[617,1914,1885,1915,1918,1919,1921],{},[578,1916,1917],{},"adapter.execute(ctx)"," and streams logs via ",[578,1920,816],{}," into the live event bus.",[617,1923,1924,1925,1928,1929,1931,1932,1935,1936,1939,1940,1943],{},"On return: ",[578,1926,1927],{},"recordCost()"," writes a ",[578,1930,830],{}," row, ",[578,1933,1934],{},"checkBudgetAndEnforce()"," pauses the agent if the monthly ceiling is hit, ",[578,1937,1938],{},"buildHeartbeatRunIssueComment()"," posts a human-readable summary to the issue, and ",[578,1941,1942],{},"releaseIssueExecutionAndPromote()"," unblocks dependents or wakes the parent issue.",[527,1945,1946,1949,1950,563,1953,563,1956,563,1959,1962,1963,1965,1966,1969],{},[549,1947,1948],{},"Terminal statuses"," are ",[578,1951,1952],{},"succeeded",[578,1954,1955],{},"failed",[578,1957,1958],{},"timed_out",[578,1960,1961],{},"cancelled"," (enforced by ",[578,1964,1124],{}," in ",[578,1967,1968],{},"packages\u002Fshared\u002Fsrc\u002Fconstants.ts"," line 352).",[527,1971,1972,1975,1976,1979,1980,1982,1983,1985,1986,1989,1990,1982,1993,1996,1997,2000],{},[549,1973,1974],{},"Crash recovery"," is the piece most orchestrators get wrong. On boot, ",[578,1977,1978],{},"reconcileStrandedAssignedIssues()"," (line 3703) scans for issues in ",[578,1981,755],{}," or ",[578,1984,1895],{}," that have no active or queued heartbeat run — these are the ones that fell through the cracks when the server died mid-execution. It queues ",[549,1987,1988],{},"exactly one"," auto-wake per stranded issue, tagged with ",[578,1991,1992],{},"retryReason='assignment_recovery'",[578,1994,1995],{},"retryReason='issue_continuation_needed'",". If that recovery wake also fails, the issue transitions to ",[578,1998,1999],{},"blocked"," and a comment is posted so a human notices. The deliberate choice to surface stranded work instead of silently retrying forever is one of the most quietly important parts of Paperclip.",[527,2002,2003],{},"Files:",[614,2005,2006,2011,2017,2023],{},[617,2007,2008,2010],{},[578,2009,1003],{}," — the whole scheduler and execution engine (~6000 lines, single file by design)",[617,2012,2013,2016],{},[578,2014,2015],{},"packages\u002Fdb\u002Fsrc\u002Fschema\u002Fheartbeat_runs.ts"," — the run row, including session fields, liveness, cost, log refs",[617,2018,2019,2022],{},[578,2020,2021],{},"packages\u002Fdb\u002Fsrc\u002Fschema\u002Fagent_wakeup_requests.ts"," — wake queue",[617,2024,2025,2028],{},[578,2026,2027],{},"doc\u002Fexecution-semantics.md"," — the canonical spec",[583,2030,2032],{"id":2031},"deep-dive-the-ticket-system","Deep Dive: The Ticket System",[527,2034,2035],{},[530,2036],{"alt":2037,"src":2038},"Issue lifecycle and relations","\u002Fdiagrams\u002Fpaperclip-ticket-system.png",[527,2040,2041],{},"Issues (Paperclip calls them issues, but they're tickets in the project-management sense) are the universal work unit. Every heartbeat's context ultimately resolves to an issue, and every piece of work an agent does is attached to one. The lifecycle:",[614,2043,2044,2050,2055,2072,2078,2083],{},[617,2045,2046,2049],{},[578,2047,2048],{},"backlog"," — not ready for work. Parked safely.",[617,2051,2052,2054],{},[578,2053,755],{}," — actionable, assigned or not, not yet locked.",[617,2056,2057,2059,2060,2063,2064,2067,2068,2071],{},[578,2058,1895],{}," — checked out by a specific run. For agents this is ",[549,2061,2062],{},"execution-backed",": an active or queued-continuation ",[578,2065,2066],{},"heartbeat_run"," must exist, or ",[578,2069,2070],{},"reconcileStrandedAssignedIssues"," will notice.",[617,2073,2074,2077],{},[578,2075,2076],{},"in_review"," — waiting for an approval gate. The next executor is paused until the board or a reviewing agent resolves it.",[617,2079,2080,2082],{},[578,2081,1999],{}," — waiting on a relation (another issue, a human decision, a dependency).",[617,2084,2085,1651,2088,2090],{},[578,2086,2087],{},"done",[578,2089,1961],{}," — terminal states.",[527,2092,2093,2094,1283],{},"The set is defined and validated in ",[578,2095,1968],{},[1248,2097,2099],{"className":1250,"code":2098,"language":1252,"meta":1253,"style":1253},"export const ISSUE_STATUSES = [\n  \"backlog\",\n  \"todo\",\n  \"in_progress\",\n  \"in_review\",\n  \"done\",\n  \"blocked\",\n  \"cancelled\",\n] as const;\n",[578,2100,2101,2117,2125,2132,2139,2146,2153,2160,2167],{"__ignoreMap":1253},[1257,2102,2103,2105,2108,2111,2114],{"class":1259,"line":22},[1257,2104,1263],{"class":1262},[1257,2106,2107],{"class":1262}," const",[1257,2109,2110],{"class":1286}," ISSUE_STATUSES",[1257,2112,2113],{"class":1262}," =",[1257,2115,2116],{"class":1273}," [\n",[1257,2118,2119,2122],{"class":1259,"line":32},[1257,2120,2121],{"class":1375},"  \"backlog\"",[1257,2123,2124],{"class":1273},",\n",[1257,2126,2127,2130],{"class":1259,"line":293},[1257,2128,2129],{"class":1375},"  \"todo\"",[1257,2131,2124],{"class":1273},[1257,2133,2134,2137],{"class":1259,"line":320},[1257,2135,2136],{"class":1375},"  \"in_progress\"",[1257,2138,2124],{"class":1273},[1257,2140,2141,2144],{"class":1259,"line":330},[1257,2142,2143],{"class":1375},"  \"in_review\"",[1257,2145,2124],{"class":1273},[1257,2147,2148,2151],{"class":1259,"line":351},[1257,2149,2150],{"class":1375},"  \"done\"",[1257,2152,2124],{"class":1273},[1257,2154,2155,2158],{"class":1259,"line":373},[1257,2156,2157],{"class":1375},"  \"blocked\"",[1257,2159,2124],{"class":1273},[1257,2161,2162,2165],{"class":1259,"line":365},[1257,2163,2164],{"class":1375},"  \"cancelled\"",[1257,2166,2124],{"class":1273},[1257,2168,2169,2172,2175,2177],{"class":1259,"line":1440},[1257,2170,2171],{"class":1273},"] ",[1257,2173,2174],{"class":1262},"as",[1257,2176,2107],{"class":1262},[1257,2178,1290],{"class":1273},[527,2180,2181,2184,2185,2188,2189,2192,2193,2196,2197,2199,2200,2202,2203,2205,2206,2208,2209,2211],{},[549,2182,2183],{},"Invariants worth understanding."," Each issue has ",[549,2186,2187],{},"one"," assignee at a time — ",[578,2190,2191],{},"assigneeAgentId"," XOR ",[578,2194,2195],{},"assigneeUserId",", enforced by the schema. Checkout is atomic: ",[578,2198,799],{}," sets ",[578,2201,1891],{}," and flips status to ",[578,2204,1895],{}," in one transaction, and conflicting writers fail fast rather than quietly double-executing. Goal ancestry via ",[578,2207,647],{}," and sub-task threading via ",[578,2210,651],{}," (a self-FK) guarantee every issue traces up to the company goal.",[527,2213,2214,2217],{},[549,2215,2216],{},"Relations."," An issue is the hub in a small constellation:",[614,2219,2220,2230,2238,2244,2256,2264],{},[617,2221,2222,2225,2226,2229],{},[578,2223,2224],{},"issue_comments"," — progress updates and the auto-posted heartbeat summaries, both tagged with ",[578,2227,2228],{},"createdByRunId"," so you can trace any comment back to the exact heartbeat that wrote it.",[617,2231,2232,2234,2235,2237],{},[578,2233,741],{}," — hires and strategy changes; an issue can be ",[578,2236,2076],{}," pending approval.",[617,2239,2240,2243],{},[578,2241,2242],{},"issue_work_products"," — files, documents, previews, links, screenshots — the artifacts a run produced.",[617,2245,2246,2248,2249,2251,2252,2255],{},[578,2247,773],{}," — pointed to by ",[578,2250,1891],{}," (the current lock) and ",[578,2253,2254],{},"executionRunId"," (the current active run).",[617,2257,2258,2260,2261,556],{},[578,2259,830],{}," — one row per billable call, attributed back to the issue via ",[578,2262,2263],{},"billingCode",[617,2265,2266,2269],{},[578,2267,2268],{},"execution_workspaces"," — the git worktree or shared checkout the work ran in.",[527,2271,2272],{},"The ticket system looks mundane — and it is, by design. The control plane's job is to be boring enough that you can trust it with 20 agents running unattended.",[527,2274,2003],{},[614,2276,2277,2282,2288,2294,2300,2310],{},[617,2278,2279,2281],{},[578,2280,697],{}," — the root schema",[617,2283,2284,2287],{},[578,2285,2286],{},"packages\u002Fdb\u002Fsrc\u002Fschema\u002Fissue_comments.ts"," — comment threading",[617,2289,2290,2293],{},[578,2291,2292],{},"packages\u002Fdb\u002Fsrc\u002Fschema\u002Fapprovals.ts"," — approval gates",[617,2295,2296,2299],{},[578,2297,2298],{},"packages\u002Fdb\u002Fsrc\u002Fschema\u002Fissue_work_products.ts"," — artifacts",[617,2301,2302,2304,2305,563,2307,2309],{},[578,2303,1968],{}," — ",[578,2306,1121],{},[578,2308,1124],{},", priority enums",[617,2311,2312,2314],{},[578,2313,2027],{}," — status transition rules with examples",[583,2316,2318],{"id":2317},"key-takeaways","Key Takeaways",[614,2320,2321,2327,2339,2348,2354],{},[617,2322,2323,2326],{},[549,2324,2325],{},"Paperclip is a control plane, not a runtime."," It schedules, provides context, captures output, and writes the ledger. It does not write your agent's loop.",[617,2328,2329,2332,2333,2335,2336,2338],{},[549,2330,2331],{},"Adapters are the boundary."," A single typed contract (",[578,2334,812],{}," → ",[578,2337,826],{},") lets Paperclip drive Claude Code, Codex, Cursor, OpenClaw, or anything else that can receive a shell command or a webhook.",[617,2340,2341,2344,2345,2347],{},[549,2342,2343],{},"Heartbeats are atomic."," Every agent execution is one queued-then-executed ",[578,2346,773],{}," row with a checkout lock, cost event, and terminal status. Budgets are enforced on the way out; stranded work is surfaced, not retried silently.",[617,2349,2350,2353],{},[549,2351,2352],{},"Tickets trace to the goal."," Every piece of work is an issue linked to a goal and optionally a parent issue, with a single assignee and an atomic checkout. Agents can always explain what they're doing and why.",[617,2355,2356,2359],{},[549,2357,2358],{},"The board retains control."," Approvals gate hires and strategy, budgets cap spend with hard stops, and the activity log records every state change.",[583,2361,2363],{"id":2362},"where-to-look-in-the-code","Where to look in the code",[1578,2365,2366,2376],{},[1581,2367,2368],{},[1584,2369,2370,2373],{},[1587,2371,2372],{},"Topic",[1587,2374,2375],{},"File",[1597,2377,2378,2387,2396,2405,2414,2423,2433,2442,2451,2463,2474,2483],{},[1584,2379,2380,2383],{},[1602,2381,2382],{},"Adapter contract (types only)",[1602,2384,2385],{},[578,2386,1521],{},[1584,2388,2389,2392],{},[1602,2390,2391],{},"Adapter registry + bundled wiring",[1602,2393,2394],{},[578,2395,919],{},[1584,2397,2398,2401],{},[1602,2399,2400],{},"Builtin adapter type list",[1602,2402,2403],{},[578,2404,1570],{},[1584,2406,2407,2410],{},[1602,2408,2409],{},"Worked adapter implementation",[1602,2411,2412],{},[578,2413,1760],{},[1584,2415,2416,2419],{},[1602,2417,2418],{},"Heartbeat scheduler + executor",[1602,2420,2421],{},[578,2422,1003],{},[1584,2424,2425,2427],{},[1602,2426,1974],{},[1602,2428,2429,2335,2431],{},[578,2430,1003],{},[578,2432,2070],{},[1584,2434,2435,2438],{},[1602,2436,2437],{},"Issue schema",[1602,2439,2440],{},[578,2441,697],{},[1584,2443,2444,2447],{},[1602,2445,2446],{},"Heartbeat-run schema",[1602,2448,2449],{},[578,2450,2015],{},[1584,2452,2453,2456],{},[1602,2454,2455],{},"Status constants + zod validators",[1602,2457,2458,563,2460],{},[578,2459,1968],{},[578,2461,2462],{},"packages\u002Fshared\u002Fsrc\u002Fvalidators\u002Fissue.ts",[1584,2464,2465,2468],{},[1602,2466,2467],{},"Plugin SDK + adapter contribution",[1602,2469,2470,563,2472],{},[578,2471,1144],{},[578,2473,1732],{},[1584,2475,2476,2479],{},[1602,2477,2478],{},"Canonical execution semantics spec",[1602,2480,2481],{},[578,2482,2027],{},[1584,2484,2485,2488],{},[1602,2486,2487],{},"Product model and scope",[1602,2489,2490,563,2493],{},[578,2491,2492],{},"doc\u002FPRODUCT.md",[578,2494,2495],{},"doc\u002FSPEC.md",[2497,2498,2499],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}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":1253,"searchDepth":32,"depth":293,"links":2501},[2502,2503,2504,2505,2506,2507,2508,2509,2510],{"id":585,"depth":32,"text":586},{"id":706,"depth":32,"text":707},{"id":837,"depth":32,"text":838},{"id":1012,"depth":32,"text":1013},{"id":1236,"depth":32,"text":1237},{"id":1769,"depth":32,"text":1770},{"id":2031,"depth":32,"text":2032},{"id":2317,"depth":32,"text":2318},{"id":2362,"depth":32,"text":2363},"md",{},true,{"title":108,"description":109},"agents\u002Fpaperclip\u002Findex",[12,14,111,112],"D72dsb19c9Z7FYlTR-r_yYualFq6Hx5qcVIMJsWq7Rw",1783345923174]