[{"data":1,"prerenderedAt":3810},["ShallowReactive",2],{"docs-nav":3,"docs-article-engineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fsignals-search":797},[4,17,27,44,55,67,75,82,94,106,114,122,129,135,144,153,161,169,177,189,202,211,218,229,240,248,260,268,276,286,296,305,314,323,331,337,343,350,356,364,371,378,383,393,401,410,415,422,432,439,444,451,458,462,467,475,487,499,509,516,525,533,539,545,551,557,563,567,579,593,603,614,621,626,633,640,646,653,658,665,673,678,686,692,699,704,710,721,730,740,747,753,761,767,776,782,791],{"path":5,"title":6,"description":7,"group":8,"section":6,"order":9,"tags":10,"lastUpdated":16},"\u002Fagents\u002Fagentic-crm","Agentic CRM","Research brief and build plan for an AgencyCore agentic CRM layer, rendered as an interactive page — the core operating loop, the target architecture, the typed-tool risk gateway, the proposed-actions review queue, and the four-slice MVP.","Agents",0,[11,12,13,14,15],"crm","agents","ai","architecture","research","2026-06-12",{"path":18,"title":19,"description":20,"group":8,"section":21,"order":22,"tags":23,"lastUpdated":26},"\u002Fagents\u002Fchat","Chat agent","High-level system design of the AgencyCore chat agent — core components, data flow, and the two abstractions that hold it together.","Reference",1,[12,14,24,25],"chat","system-design","2026-05-13",{"path":28,"title":29,"description":30,"group":8,"section":31,"order":32,"tags":33,"lastUpdated":43},"\u002Fagents\u002Fcompany-enrichment","Company Enrichment","The company enrichment workflow - a cache-first read in front of the company intelligence database that fills firmographic, contact and technographic facts via a fixed-order provider waterfall, and writes every resolved fact back with provenance so the first org pays once and every later search rides free.","Enrichment",2,[12,34,35,36,37,38,39,40,41,42],"workflow","enrichment","companies","waterfall","cache","intelligence-database","firmographics","provenance","sonar","2026-06-10",{"path":45,"title":46,"description":47,"group":8,"section":48,"order":9,"tags":49,"lastUpdated":54},"\u002Fagents\u002Fcompany-sonar","Company Signals","Signal-first company discovery for marketing agencies, on the Claude Agent SDK, with a global intelligence cache and deterministic composite scoring.","Company Sonar",[12,34,42,50,51,52,35,53,14],"company-search","signals","agent-sdk","scoring","2026-06-08",{"path":56,"title":57,"description":58,"group":8,"section":48,"order":22,"tags":59,"lastUpdated":66},"\u002Fagents\u002Fcompany-sonar\u002Fsignal-monitoring","Company Signals Monitoring","Realtime signal capture layer on top of the data graph. Detects hot events, scores them with a Claude managed agent against each agency's ICP, fans out alerts.",[14,51,60,61,62,63,64,65],"intel","icp","alerts","monitoring","sse","managed-agents","2026-06-09",{"path":68,"title":69,"description":70,"group":8,"section":71,"order":22,"tags":72,"lastUpdated":74},"\u002Fagents\u002Fconcepts\u002Fchat-agent-design-principles","Designing chat agents","The 2026 playbook for production chat agents that reach into internal systems via tools — context engineering, memory, tool design, when to add complexity.","Concepts",[12,14,24,73],"context-engineering","2026-05-14",{"path":76,"title":77,"description":78,"group":8,"section":71,"order":32,"tags":79,"lastUpdated":74},"\u002Fagents\u002Fconcepts\u002Fsystem-prompt-architecture","System prompt architecture","How to structure a production chat agent system prompt — eight sections, what each one does, and the rules vendors converge on.",[12,80,81],"prompt-engineering","system-prompt",{"path":83,"title":84,"description":85,"group":8,"section":84,"order":9,"tags":86,"lastUpdated":54},"\u002Fagents\u002Fenvoy","Envoy","High-level system design for the AI outreach engine — the sequence step state machine, the human-in-the-loop draft approval gate, multi-source context enrichment, and the inbox sentiment flow, rendered as an interactive page.",[12,87,88,89,90,91,92,93,14],"envoy","outreach","sales-engagement","sequences","state-machine","human-in-the-loop","nylas",{"path":95,"title":96,"description":97,"group":8,"section":98,"order":9,"tags":99,"lastUpdated":16},"\u002Fagents\u002Fheadhunter","Headhunter","The AI talent-search pipeline on one page - the production six-step design with its current-title relevance gate, and the 2.0 system design with internal-first waterfall sourcing, a pluggable source registry, automatic entity resolution, and a people intelligence graph that compounds every run.","General Search",[12,34,100,101,14,25,102,37,103,104,105],"headhunter","recruiting","multi-source","entity-resolution","people-intelligence","flywheel",{"path":107,"title":108,"description":109,"group":8,"section":21,"order":32,"tags":110,"lastUpdated":113},"\u002Fagents\u002Fpaperclip","Paperclip","Architecture deep dive into the Paperclip orchestration system.",[12,14,111,112],"orchestration","paperclip","2026-04-20",{"path":115,"title":116,"description":117,"group":8,"section":31,"order":22,"tags":118,"lastUpdated":16},"\u002Fagents\u002Fpeople-enrichment","People Enrichment","The people enrichment workflow - a cache-first read in front of the people intelligence database that fills profile, contact and employment facts via a fixed-order provider waterfall, keyed on the LinkedIn URL, and writes every resolved fact back with provenance so the first org pays once and every later search rides free. The fill step Headhunter and People Signals both call.",[12,34,35,119,37,38,39,120,41,100,121],"people","linkedin","people-sonar",{"path":123,"title":124,"description":125,"group":8,"section":126,"order":9,"tags":127,"lastUpdated":54},"\u002Fagents\u002Fpeople-sonar","People Signals","Signal-first people discovery for marketing agencies, built on the headhunter pipeline, with a composite score weighted by signal strength, source reputation, recency, and ICP fit.","People Sonar",[12,34,121,128,51,100,35,53,14],"people-search",{"path":130,"title":131,"description":132,"group":8,"section":126,"order":22,"tags":133,"lastUpdated":54},"\u002Fagents\u002Fpeople-sonar\u002Fpeople-signal-monitoring","People Signals Monitoring","Forward-looking design for the push layer that tracks known people - champions, past contacts, target-company decision-makers - and fires a warm lead the moment they change jobs, get promoted, or their company has an event.",[14,51,60,119,63,134],"warm-leads",{"path":136,"title":137,"description":138,"group":139,"section":140,"order":22,"tags":141,"lastUpdated":143},"\u002Fengineering\u002Fguides\u002Fagent-execution-stack","The Agent Execution Stack","Durable workflows over pluggable agent backends — how AgencyCore runs AI agents on Inngest over a webhook-driven Claude Managed Agents backend.","Engineering","Guides",[12,142,14,25],"inngest","2026-06-25",{"path":145,"title":146,"description":147,"group":139,"section":140,"order":9,"tags":148,"lastUpdated":143},"\u002Fengineering\u002Fguides\u002Fagent-runtime","Agent runtime","How AgencyCore runs AI agents on a provider-neutral runtime — the abstraction layer that lets us swap the agent backend, with Claude managed agents as the current provider.",[12,149,14,150,151,152,25],"runtime","anthropic","claude","providers",{"path":154,"title":155,"description":156,"group":139,"section":21,"order":157,"tags":158,"lastUpdated":160},"\u002Fengineering\u002Freference\u002Fagno-to-agent-sdk-migration","Agno → Claude Agent SDK migration","System-design spec for moving the ac-python-api workflow engine off Agno onto Anthropic's Claude Agent SDK \u002F Managed Agents, tiered by control-flow shape.",10,[12,14,159,52,65],"migration","2026-06-06",{"path":162,"title":163,"description":164,"group":139,"section":21,"order":22,"tags":165,"lastUpdated":54},"\u002Fengineering\u002Freference\u002Fcloudflare-agent-sandbox","Cloudflare agent sandbox","Cloudflare's Workers-based agent platform, evaluated as an alternative sandbox for our Agno workflows.",[12,166,167,168,159],"sandbox","cloudflare","workers",{"path":170,"title":171,"description":172,"group":139,"section":21,"order":32,"tags":173,"lastUpdated":176},"\u002Fengineering\u002Freference\u002Fvirtual-filesystem-rag","Virtual filesystem for AI assistants","How ChromaFs provides AI agents with structured file access.",[12,174,14,175],"rag","chromafs","2026-04-18",{"path":178,"title":179,"description":180,"group":139,"section":181,"order":182,"tags":183,"lastUpdated":188},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fcapabilities\u002Fstate-and-knowledge","State and knowledge","What a run may know. One deterministic context builder over application state, knowledge and memory, one owner for every fact, and memory that is written through a tool.","Agentic platform",11,[184,185,186,11,187],"context","memory","knowledge","pgvector","2026-08-31",{"path":190,"title":191,"description":192,"group":139,"section":181,"order":157,"tags":193,"lastUpdated":201},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fcapabilities\u002Ftools-and-integrations","Tools and integrations","A tool is the one way an agent reaches the world. AgencyCore owns the model facing contract, the invoke path, the credentials and the result boundary.",[194,195,196,197,198,199,200],"tools","integrations","mcp","agno","policy","security","idempotency","2026-09-04",{"path":203,"title":204,"description":205,"group":139,"section":181,"order":22,"tags":206,"lastUpdated":210},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fcontract","Platform contract","One platform behind chat, interactive channels, triggers, approvals and background runs, with one Agno runtime, one tool layer, one state layer, and three cross-cutting planes.",[12,14,197,142,194,207,149,208,198,209],"skills","channels","observability","2026-09-02",{"path":212,"title":181,"description":213,"group":139,"section":214,"order":22,"tags":215,"lastUpdated":201},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform","The whole agentic platform on one page - who starts a run, the one boundary every run passes, how the work executes, and what comes back.","System design",[12,14,216,197,142,217,198],"overview","runs",{"path":219,"title":220,"description":221,"group":139,"section":181,"order":222,"tags":223,"lastUpdated":228},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Fagent-access","Agent access (CLI and MCP)","How an outside AI agent reaches AgencyCore. The ac CLI works today as a user seat. An MCP server is planned and not designed.",6,[224,196,12,151,225,226,227],"cli","access","auth","todo","2026-08-18",{"path":230,"title":231,"description":232,"group":139,"section":181,"order":233,"tags":234,"lastUpdated":239},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Fchannel-gateway","Channel gateway","The only layer that knows both an interactive channel and the platform. One message shape converges inbound, one intent shape diverges outbound, and no model call happens here.",3,[208,235,236,237,238,199],"slack","web","identity","sessions","2026-08-30",{"path":241,"title":242,"description":243,"group":139,"section":181,"order":244,"tags":245,"lastUpdated":210},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Ffront-door","Front door","The conversational control layer. It turns a request into one structured decision, then deterministic application code answers or hands work to RunManager.",4,[246,247,197,184,198,217],"front-door","routing",{"path":249,"title":250,"description":251,"group":139,"section":181,"order":32,"tags":252,"lastUpdated":259},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Fsurfaces","Surfaces","Every product surface and its API contract. Web chat goes through the gateway; every schema-native surface calls the domain API.",[253,254,24,255,256,257,258,217,64],"surfaces","api","approvals","prospects","saved-searches","builder","2026-09-03",{"path":261,"title":262,"description":263,"group":139,"section":181,"order":264,"tags":265,"lastUpdated":188},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Ftriggers","Triggers","A Run with no person. Every producer emits one Event, matching is deterministic, and dispatch reuses RunManager, Policy and Inngest.",5,[266,267,142,200],"triggers","events",{"path":269,"title":270,"description":271,"group":139,"section":181,"order":272,"tags":273,"lastUpdated":259},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fplanes\u002Fidempotency","Idempotency","One durable PostgreSQL key service prevents duplicate effects and freezes mutable input before selected Run starts. A Run start is guarded by a unique index on the Run row.",14,[200,217,194,274,275],"webhooks","reliability",{"path":277,"title":278,"description":279,"group":139,"section":181,"order":280,"tags":281,"lastUpdated":285},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fplanes\u002Fobservability-and-operations","Observability and operations","One run row, one span tree and one usage meter. Sentry reports system failure; AgencyCore spans explain what the agent did.",13,[209,217,282,283,64,284],"spans","usage","sentry","2026-08-26",{"path":287,"title":288,"description":289,"group":139,"section":181,"order":290,"tags":291,"lastUpdated":295},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fplanes\u002Fpolicy-and-governance","Policy and governance","One deterministic plane answers may this happen, at three checkpoints, with one grant model, one approval model and one decision log.",12,[198,292,255,293,294],"permissions","limits","governance","2026-08-25",{"path":297,"title":6,"description":298,"group":139,"section":299,"order":22,"tags":300,"lastUpdated":210},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fagentic-crm","The AgencyCore CRM loop for turning signals and discovery into qualified organization prospects, CRM relationships and outreach.","Agentic products",[11,301,51,302,256,35,303,304,87],"lead-generation","intelligence","signals-search","email-sequence",{"path":306,"title":307,"description":308,"group":139,"section":299,"order":264,"tags":309,"lastUpdated":188},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fbuilder-chat","Front door builder chat","Conversational authoring for organization-specific Agent and Workflow definitions, entered through the normal Front Door and backed by the existing DefinitionService.",[310,311,246,12,312,313,198],"authoring","definitions","workflows","templates",{"path":315,"title":316,"description":317,"group":139,"section":181,"order":318,"tags":319,"lastUpdated":201},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fcapability-contracts","Company, People and Signals contracts","The five Phase 7 product capabilities, their bounded inputs, stable references, permissions and results.",21,[320,321,119,51,322],"capabilities","company","contracts",{"path":324,"title":325,"description":326,"group":139,"section":181,"order":327,"tags":328,"lastUpdated":330},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fcapability-scenarios","Capability design scenarios","Normal, failure and recovery cases for the Phase 7 capability contracts, with implementation owners.",22,[320,329,321,119,51],"validation","2026-09-05",{"path":332,"title":333,"description":334,"group":139,"section":299,"order":233,"tags":335,"lastUpdated":210},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Femail-sequence","Email sequence workflow","Envoy durable outreach for one or many people, with fresh context, approvals, reply waits, follow-ups and Nylas transport.",[336,87,34,142,93,255],"email",{"path":338,"title":339,"description":340,"group":139,"section":299,"order":244,"tags":341,"lastUpdated":188},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fgeneral-chat","Front door general chat","The default conversational answer path for AgencyCore. It answers from supplied context, cites what it used, asks when context is insufficient, and delegates real work through the normal Front Door.",[24,246,186,184,247,342],"citations",{"path":344,"title":345,"description":346,"group":139,"section":299,"order":222,"tags":347,"lastUpdated":188},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fhuman-review","Human review inbox","One product page for every agentic action that is paused because a person must authorize an exact proposal. It is a view over the shared approval primitive, not a second review system.",[348,255,349,198,12],"human-review","inbox",{"path":351,"title":352,"description":353,"group":139,"section":299,"order":32,"tags":354,"lastUpdated":259},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fsignals-search","Signals Search","One bounded discovery workflow that finds companies, verifies signals, finds relevant people, and produces evidence-backed organization prospects without prematurely creating CRM records.",[303,355,36,119,51,302,256,11,35],"discovery",{"path":357,"title":358,"description":359,"group":139,"section":299,"order":360,"tags":361,"lastUpdated":188},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fworkflow-visualizer","Workflow visualizer","One constrained workflow graph, reused to author a draft, read a published definition, and watch a Run. Build mode edits the draft; run mode overlays Run and span state on the frozen snapshot.",7,[312,362,258,311,217,282,363,255],"visualizer","graph",{"path":365,"title":366,"description":367,"group":139,"section":181,"order":368,"tags":369,"lastUpdated":201},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fruntime\u002Fdefinitions","Runtime definitions","Editable drafts, one published configuration per definition, template forks, deterministic validation, and the Run snapshot that keeps in flight work stable.",8,[149,311,329,370],"publishing",{"path":372,"title":373,"description":374,"group":139,"section":181,"order":375,"tags":376,"lastUpdated":259},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fruntime\u002Fexecution","Runtime execution","The Run record, the Inngest step boundaries, agent segments, workflow nodes, approvals, cancellation, failure handling and live events.",9,[149,217,197,142,255,377,64],"cancellation",{"path":379,"title":380,"description":381,"group":139,"section":181,"order":360,"tags":382,"lastUpdated":285},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fruntime","Agentic runtime","One Run contract, one Agno agent runtime, one deterministic workflow model, and the component boundaries that keep the framework replaceable.",[149,217,197,312,207,142],{"path":384,"title":385,"description":386,"group":139,"section":387,"order":244,"tags":388,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Fcompany-context","Company context","L3. Company state, knowledge and memory are three different things. One deterministic builder turns them into one brief.","Mission Control",[389,390,186,185,184,391,11],"mission-control","company-state","retrieval","2026-08-12",{"path":394,"title":395,"description":396,"group":139,"section":387,"order":22,"tags":397,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Fexperience","Experience","L6. Where a person observes and controls the company, and the one rule that keeps the UI out of the business.",[389,398,399,255,400],"ui","control-plane","activity",{"path":402,"title":403,"description":404,"group":139,"section":387,"order":222,"tags":405,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Ffoundation","Foundation","L1. Generic infrastructure with no business logic in it. The test is that another product could run on it unchanged.",[389,406,407,408,267,409,226,209],"infrastructure","database","queue","storage",{"path":411,"title":387,"description":412,"group":139,"section":214,"order":233,"tags":413,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control","The internal Company OS. Six layers and one policy plane put a person in control of company state and of autonomous execution.",[389,414,14,12,312,198,399],"company-os",{"path":416,"title":417,"description":418,"group":139,"section":387,"order":32,"tags":419,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Fintelligence","Intelligence","L5. The agent is the primitive. A skill is how it works, a tool is how it reaches the world, and the two are never the same thing.",[389,12,207,420,421],"planning","reasoning",{"path":423,"title":424,"description":425,"group":139,"section":387,"order":368,"tags":426,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Fmetrics-and-connectors","Metrics and connectors","A worked example across every layer. Three vendors, one metric pipeline, three views, and the rule that decides what we store.",[389,427,195,428,429,284,430,431],"metrics","stripe","posthog","ingest","dashboards",{"path":433,"title":434,"description":435,"group":139,"section":387,"order":233,"tags":436,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Forchestration","Orchestration","L4. Workflow, run, step, trigger and event. Five nouns that turn a decision into durable execution.",[389,312,217,266,267,437,438],"durability","retry",{"path":440,"title":288,"description":441,"group":139,"section":387,"order":360,"tags":442,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Fpolicy-and-governance","A plane, not a layer. One place decides what an agent may do, under what conditions, and how much. Human approval is one of its three answers.",[389,198,294,255,292,293,443],"audit",{"path":445,"title":191,"description":446,"group":139,"section":387,"order":264,"tags":447,"lastUpdated":392},"\u002Fengineering\u002Fsystem-design\u002Fmission-control\u002Ftools-and-integrations","L2. One contract for every capability. The tool is the only route to the world, and it is where policy, audit and tenancy meet.",[389,194,195,448,449,450],"adapters","registry","credentials",{"path":452,"title":453,"description":454,"group":139,"section":455,"order":22,"tags":456,"lastUpdated":210},"\u002Fengineering\u002Fsystem-design\u002Fworkflows\u002Fcompany-search","Company search","Implementation notes for company.search. Search resolves and gates company identities; enrichment is a separate capability.","Workflows",[321,457,142,42],"search",{"path":459,"title":31,"description":460,"group":139,"section":455,"order":233,"tags":461,"lastUpdated":210},"\u002Fengineering\u002Fsystem-design\u002Fworkflows\u002Fenrichment","Reusable company and people enrichment workflows with canonical Intelligence write-back, existing tier freshness and bounded asynchronous email.",[35,321,119,142],{"path":463,"title":464,"description":465,"group":139,"section":455,"order":32,"tags":466,"lastUpdated":259},"\u002Fengineering\u002Fsystem-design\u002Fworkflows\u002Fpeople-search","People search","Implementation notes for people.search. Bounded company scope and persona gates return selectable person identities without enrichment.",[119,457,142,100],{"path":468,"title":469,"description":470,"group":139,"section":455,"order":244,"tags":471,"lastUpdated":474},"\u002Fengineering\u002Fsystem-design\u002Fworkflows\u002Fsignals-search","Signals search","Superseded. The earlier on-demand buying-signal search component, kept as a record of the design that the agentic platform Signals Search workflow replaces.",[51,12,142,472,473],"intelligence-databases","superseded","2026-08-28",{"path":476,"title":477,"description":478,"group":479,"section":480,"order":481,"tags":482,"lastUpdated":66},"\u002Flearnings\u002Fagentic-sdlc","The agentic SDLC","How AI agents move from autocomplete to owning the loop across the software lifecycle, and why that shifts the bottleneck from coding to verification.","Learnings",null,30,[12,483,484,485,486],"sdlc","engineering","verification","review",{"path":488,"title":489,"description":490,"group":479,"section":480,"order":491,"tags":492,"lastUpdated":498},"\u002Flearnings\u002Fagi-to-asi","From AGI to ASI","What lies beyond human-level AI. The four technological pathways from AGI to artificial superintelligence, the formal ceiling that bounds them, and the six bottlenecks that could stall the climb - distilled from the DeepMind report.",50,[493,494,495,496,497],"ai-futures","asi","agi","scaling","recursive-self-improvement","2026-06-19",{"path":500,"title":501,"description":502,"group":479,"section":480,"order":503,"tags":504,"lastUpdated":66},"\u002Flearnings\u002Fai-native-company-playbook","AI native company playbook","Why AI should be the operating system your company runs on, not a tool it uses, and the concrete practices that follow - closed loops, a queryable org, software factories, and token maxing.",40,[505,506,12,507,508],"ai-native","company-building","gtm","founders",{"path":510,"title":511,"description":512,"group":479,"section":480,"order":157,"tags":513,"lastUpdated":54},"\u002Flearnings\u002Fbuying-intent-signals","Buying intent signals","How buyers leak their intent before they ever fill in a form, and how to read those signals before the window closes.",[514,51,507,515],"intent","sales",{"path":517,"title":518,"description":519,"group":479,"section":480,"order":520,"tags":521,"lastUpdated":54},"\u002Flearnings\u002Fcold-outbound-system","Cold outbound system","A high-level study of an open-source 29-skill cold email system, organized into five sequential tracks from ICP to iteration.",20,[522,523,507,524],"outbound","cold-email","systems",{"path":526,"title":527,"description":528,"group":479,"section":480,"order":529,"tags":530,"lastUpdated":532},"\u002Flearnings\u002Fswan-gtm-skills-architecture","Swan GTM skills architecture","A research note on Swan AI's foundations and maps model for GTM agents, with ASCII diagrams and ideas AgencyCore can borrow.",60,[507,12,73,531,14],"swan","2026-07-01",{"path":534,"title":535,"description":536,"group":387,"section":480,"order":272,"tags":537,"lastUpdated":43},"\u002Fmission-control\u002Fciops-agent","CIOps agent","High-level system architecture and design notes for the Mission Control CIOps agent.",[389,12,538,14],"ciops",{"path":540,"title":541,"description":542,"group":387,"section":480,"order":182,"tags":543,"lastUpdated":43},"\u002Fmission-control\u002Fcostops-agent","CostOps agent","High-level system architecture and design notes for the Mission Control CostOps agent.",[389,12,544,14],"finops",{"path":546,"title":547,"description":548,"group":387,"section":480,"order":520,"tags":549,"lastUpdated":54},"\u002Fmission-control\u002Fdashboard","Dashboard","The Mission Control product UI - a dark cockpit with a fleet-nav rail, company-state grid, a working escalation queue, live ledger and a global kill switch.",[389,12,550,398],"dashboard",{"path":552,"title":553,"description":554,"group":387,"section":480,"order":280,"tags":555,"lastUpdated":43},"\u002Fmission-control\u002Fproduct-analytics-agent","ProductAnalytics agent","High-level system architecture and design notes for the Mission Control ProductAnalytics agent.",[389,12,556,14],"product-analytics",{"path":558,"title":559,"description":560,"group":387,"section":480,"order":290,"tags":561,"lastUpdated":43},"\u002Fmission-control\u002Frevenueops-agent","RevenueOps agent","High-level system architecture and design notes for the Mission Control RevenueOps agent.",[389,12,562,14],"revops",{"path":564,"title":214,"description":565,"group":387,"section":480,"order":157,"tags":566,"lastUpdated":54},"\u002Fmission-control\u002Fsystem-design","One screen for the whole company, watched by a guardrailed fleet of ops agents that explain, propose, act and learn overnight.",[389,12,544,14],{"path":568,"title":569,"description":570,"group":571,"section":480,"order":32,"tags":572,"lastUpdated":578},"\u002Fproduct-design\u002Fonboarding-flow","Onboarding flow","Product design for the signup wizard and how TAM building folds into it. Analyzes the flow today (account, profile, company), the gap (no ICP, empty dashboard), and the integration of a new \"who you sell to\" ICP step plus a build-and-reveal screen that lands the user on a populated, ranked list.","Product Design",[573,61,574,575,576,577],"onboarding","tam","activation","ux","user-journey","2026-06-11",{"path":580,"title":581,"description":582,"group":571,"section":480,"order":233,"tags":583,"lastUpdated":592},"\u002Fproduct-design\u002Fpricing-entitlements","Pricing tiers, entitlements and usage credits","Specification for subscription tiers with gated platform access: composable plan entitlements, a unified usage-credit currency, plan-sourced limits, per-module trials and a two-ticket delivery plan built on the Stripe billing foundation. Written for discussion; the Linear document is the canonical copy with ticket links.",[584,585,586,587,588,589,590,591],"pricing","entitlements","billing","credits","subscriptions","plans","seats","trials","2026-07-06",{"path":594,"title":595,"description":596,"group":571,"section":480,"order":233,"tags":597,"lastUpdated":578},"\u002Fproduct-design\u002Fsales-signals-ux","Designing Signals","Product design for the sales-signals experience in ac-frontend: the 14-type taxonomy and its color system, the anatomy of a signal card across four densities, the 0-10 lead score scale, the origin tag (sonar pull vs proactive push), the seven surfaces where signals render (launchpad, sonar app, company detail, timeline, activities, data layer, Envoy), and the interaction rules that keep them consistent.",[51,576,598,11,42,599,600,601,602],"design-system","lead-score","origin","pull","push",{"path":604,"title":605,"description":606,"group":607,"section":608,"order":244,"tags":609,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Factivities","Activities","Deep dive on crm_activities, the interaction + task log of the CRM — where it is served from, how a row is born and read, and its full schema, relationships and rules.","Proprietary data","CRM",[11,610,611,612,613],"activities","tasks","data-model","schema",{"path":615,"title":616,"description":617,"group":607,"section":608,"order":264,"tags":618,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Fcommunications","Communications","Deep dive on crm_communications and crm_communication_events, the unified email\u002Fcall\u002Fmessage log and its per-message engagement tracking — where it is served from, the outbound message lifecycle, and the full schema, relationships and rules.",[11,619,336,620,612],"communications","engagement",{"path":622,"title":623,"description":624,"group":607,"section":608,"order":22,"tags":625,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Fcompanies","Companies","Deep dive on crm_companies, the account record at the centre of the CRM — where it is served from, how a row is born and read, and its full schema, relationships and rules.",[11,36,612,613,14],{"path":627,"title":628,"description":629,"group":607,"section":608,"order":233,"tags":630,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Fdeals","Deals","Deep dive on the deal pipeline — crm_deals, crm_pipeline_stages and crm_pipeline_config. Where it is served from, the life of a deal, and its full schema, relationships and rules.",[11,631,632,612,613],"deals","pipeline",{"path":634,"title":635,"description":636,"group":607,"section":608,"order":222,"tags":637,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Flists","Lists","Deep dive on crm_lists and crm_list_members, the static or dynamic member collections of the CRM — where they are served from, how a list and its members come to be and are read, and their schema, relationships and rules.",[11,638,639,612,613],"lists","segments",{"path":641,"title":642,"description":643,"group":607,"section":608,"order":32,"tags":644,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Fpeople","People","Deep dive on crm_people, the contact record of the CRM — where it is served from, how a row is born and read, and its full schema, relationships and rules.",[11,119,645,612,613],"contacts",{"path":647,"title":648,"description":649,"group":607,"section":608,"order":368,"tags":650,"lastUpdated":43},"\u002Fproprietary-data\u002Fcrm\u002Fsaved-filters","Saved filters","Deep dive on crm_saved_filters, the named reusable filter snapshots over the company, person and signal list views — where it is served from, how a saved view is born and applied, and its full schema, relationships and rules.",[11,651,652,612,613],"saved-filters","views",{"path":654,"title":655,"description":656,"group":607,"section":608,"order":360,"tags":657,"lastUpdated":578},"\u002Fproprietary-data\u002Fcrm\u002Fsignals","Signals","Deep dive on the signals tables - signals, company_signals and person_signals, the CRM's sales-intelligence layer. Where signals are served from, how one is born and attached, and the full schema, relationships and rules.",[11,51,302,612,613],{"path":659,"title":660,"description":661,"group":607,"section":662,"order":22,"tags":663,"lastUpdated":43},"\u002Fproprietary-data\u002Fintelligence-databases\u002Fcompany-intelligence-database","Company Intelligence Database","Decided architecture for ENG-669, the cross-org company intelligence layer that acts as a read-through cache in front of enrichment providers, with public-facts-only privacy and provenance-tracked write-back.","Intelligence databases",[14,60,36,51,38,664],"eng-669",{"path":666,"title":667,"description":668,"group":607,"section":662,"order":244,"tags":669,"lastUpdated":578},"\u002Fproprietary-data\u002Fintelligence-databases\u002Forg-signal-feed","Org Signal Feed","The per-org activation layer on top of the shared signals store. One immutable intel_signals row fans out to many orgs through scoring (signal-type weight times ICP fit times recency decay) and materializes as ranked, tiered rows in intel_org_signal_feed - the only org-scoped, RLS-per-org table of the signal stack, the door the launchpad, inbox and digest all read through. Signals enter by two ingest classes - a user's sonar pull (ungated) or an automated push (gated by threshold plus an optional competitor-ICP check) - logged in intel_signal_ingests, and each feed row records its origin.",[14,60,51,670,53,671,672,575,430,601,602,600],"feed","decay","rls",{"path":674,"title":675,"description":676,"group":607,"section":662,"order":32,"tags":677,"lastUpdated":578},"\u002Fproprietary-data\u002Fintelligence-databases\u002Fpeople-intelligence-database","People Intelligence Database","Decided architecture for the cross-org people intelligence layer - a read-through cache in front of headhunter research and Hunter email lookups, with LinkedIn-URL identity, append-only employment edges, per-tier freshness stamps on the flat profile, shared intel_sources provenance, unified intel_signals, and a GDPR erasure path.",[14,60,119,51,38,100],{"path":679,"title":680,"description":681,"group":607,"section":662,"order":233,"tags":682,"lastUpdated":578},"\u002Fproprietary-data\u002Fintelligence-databases\u002Fsignals-intelligence-database","Signals Intelligence Database","Decided v1 architecture for the unified signal store - one polymorphic append-only intel_signals table that holds both company and person signals, with a shared taxonomy, source-ranked provenance, an intel_signal_ingests log that records which pipeline found each signal, decay at read time, and a person-to-company rollup so a champion job change surfaces on the company feed.",[14,60,51,683,671,684,670,685,41,601,602],"polymorphic","taxonomy","ingests",{"path":687,"title":688,"description":689,"group":607,"section":480,"order":9,"tags":690,"lastUpdated":16},"\u002Fproprietary-data\u002Foverview","Data Layer Overview","The AgencyCore data layer in one map - the org-scoped CRM plane in production today and the global intelligence plane designed to sit in front of it, with interactive diagrams of both, the end-to-end data flow, freshness and precedence rules, the privacy seam, and the rollout path.",[691,14,60,11,51,38,25,216],"data-layer",{"path":693,"title":694,"description":695,"group":696,"section":480,"order":9,"tags":697,"lastUpdated":54},"\u002Froadmap","Roadmap - June 2026","June 2026 product plan across four themes. The spine is moving our agents onto an isolated sandbox runtime and rebuilding the core agents and workflows on it, then standing up a read-through intelligence data store and shipping the Stripe billing system. Knowledge base, assistant, and credit tracking carry into the July roadmap.","Roadmap",[698,420],"roadmap",{"path":700,"title":701,"description":702,"group":696,"section":480,"order":22,"tags":703,"lastUpdated":54},"\u002Froadmap\u002Fjuly-2026","Roadmap - July 2026","July 2026 product plan across three themes, all carried over from June. Building on June's sandbox runtime, July grounds the agents in a knowledge base, launches the AI chat assistant, and meters every action with per-action credit tracking that reconciles into the Stripe billing system shipped in June.",[698,420],{"path":705,"title":706,"description":707,"group":696,"section":480,"order":32,"tags":708,"lastUpdated":532},"\u002Froadmap\u002Fjune-2026-slides","Roadmap slides - June 2026","Board-review slide deck for the June 2026 product roadmap, rendered directly from the original PPTX in the docs site.",[698,420,709],"slides",{"path":711,"title":712,"description":713,"group":714,"section":8,"order":520,"tags":715,"lastUpdated":16},"\u002Fsymphony\u002Fagents\u002Fdevops-agent","DevOps agent","Interactive design for a Slack-first Symphony DevOps agent that wraps production promotion, rollback, audit, and operational jobs behind policy gates, typed runbooks, and an auditable ledger.","Symphony",[716,235,717,718,719,720],"symphony","devops","production","runbooks","operations",{"path":722,"title":723,"description":724,"group":714,"section":8,"order":157,"tags":725,"lastUpdated":16},"\u002Fsymphony\u002Fagents\u002Foncall-agent","Oncall agent","Interactive design for a Symphony oncall agent that turns Sentry incidents into rich Linear tickets, investigates with Codex, opens fix PRs, and resolves Sentry after merge.",[716,284,726,727,728,729],"linear","oncall","incident-response","codex",{"path":731,"title":732,"description":733,"group":714,"section":734,"order":157,"tags":735,"lastUpdated":16},"\u002Fsymphony\u002Fhousekeeping\u002Fcodex-vacuum","Codex vacuum","Interactive design for the Symphony housekeeping timer that checkpoints and vacuums Codex sqlite stores on the VPS.","Housekeeping",[716,736,737,729,738,739],"timed-jobs","housekeeping","sqlite","vps",{"path":741,"title":742,"description":743,"group":714,"section":734,"order":481,"tags":744,"lastUpdated":16},"\u002Fsymphony\u002Fhousekeeping\u002Fhost-cleanup","Host cleanup","Interactive design for the Symphony housekeeping timer that removes stale \u002Ftmp debris, vacuums the journal, and optionally cleans the apt package cache.",[716,736,737,739,745,746],"disk","cleanup",{"path":748,"title":749,"description":750,"group":714,"section":734,"order":520,"tags":751,"lastUpdated":16},"\u002Fsymphony\u002Fhousekeeping\u002Fworkspace-cleanup","Workspace cleanup","Interactive design for the Symphony housekeeping timer that prunes idle per-issue workspaces after their TTL.",[716,736,737,752,746,739],"workspaces",{"path":754,"title":755,"description":756,"group":714,"section":480,"order":9,"tags":757,"lastUpdated":66},"\u002Fsymphony","Symphony orchestration","How AgencyCore runs OpenAI Symphony as a long-running daemon that turns Linear tickets into isolated, autonomous Codex runs, reviewed by Claude and merged by humans. High-level workflow, system architecture, and the engineer playbook.",[716,729,726,758,111,739,759,760],"claude-review","qa","automation",{"path":762,"title":763,"description":764,"group":714,"section":214,"order":22,"tags":765,"lastUpdated":392},"\u002Fsymphony\u002Fsystem-design\u002Fhigh-level-design","High-level design","The Symphony daemon end to end — the standing agent workforce and its label-routed workflows, then the runtime that polls, dispatches, runs and writes back.",[716,14,111,12,729,726,766],"systemd",{"path":768,"title":769,"description":770,"group":714,"section":771,"order":503,"tags":772,"lastUpdated":16},"\u002Fsymphony\u002Ftimed-jobs\u002Fdaily-security-agent","Daily security agent","Interactive design for a report-only Symphony timed job that reviews the last 24h of commits, scans the system for vulnerabilities, and opens focused follow-up tickets.","Timed jobs",[716,199,736,729,773,774,775],"semgrep","threat-model","ownership",{"path":777,"title":778,"description":779,"group":714,"section":771,"order":481,"tags":780,"lastUpdated":16},"\u002Fsymphony\u002Ftimed-jobs\u002Fdaily-sentry-triage","Daily Sentry triage","Interactive design for the Symphony timed job that performs read-only Sentry triage, deduplicates existing tracked clusters, and creates focused ENG bugs for new actionable errors.",[716,736,284,209,781,726],"triage",{"path":783,"title":784,"description":785,"group":714,"section":771,"order":157,"tags":786,"lastUpdated":16},"\u002Fsymphony\u002Ftimed-jobs\u002Fnightly-local-staging-e2e","Nightly local staging E2E","Interactive design for the Symphony timed job that seeds local Supabase, runs ac-frontend Playwright E2E against the local staging stack, uploads evidence, and cleans artifacts.",[716,736,787,788,789,790],"e2e","playwright","staging","frontend",{"path":792,"title":793,"description":794,"group":714,"section":771,"order":520,"tags":795,"lastUpdated":16},"\u002Fsymphony\u002Ftimed-jobs\u002Fnightly-staging-qa","Nightly staging QA","Interactive design for the Symphony timed job that seeds a staging QA Linear issue, runs an agent-browser crawl, validates feature-map coverage, and files focused follow-up work.",[716,736,789,759,796,726],"agent-browser",{"id":798,"title":352,"body":799,"customComponent":480,"description":353,"extension":3803,"group":139,"lastUpdated":259,"meta":3804,"navigation":3805,"order":32,"path":351,"related":480,"section":299,"seo":3806,"stem":3807,"tags":3808,"__hash__":3809},"docs\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fsignals-search.md",{"type":800,"value":801,"toc":3764},"minimark",[802,805,818,825,828,833,840,851,857,861,872,889,892,895,903,908,915,918,937,947,954,957,1003,1006,1009,1012,1016,1019,1043,1046,1060,1063,1097,1116,1134,1142,1146,1149,1205,1208,1232,1235,1238,1241,1245,1261,1264,1271,1275,1278,1281,1292,1296,1299,1372,1387,1394,1398,1404,1407,1417,1421,1424,1956,1959,1969,2178,2181,2185,2190,2293,2296,2305,2314,2323,2327,2341,2347,2358,2365,2375,2384,2388,2391,2396,2406,2410,2413,2463,2466,2483,2490,2494,2497,2522,2528,2531,2590,2599,2605,2609,2612,2615,2638,2641,2645,2656,2662,2665,2685,2694,2701,2707,2710,2714,2717,2723,2726,2739,2742,2746,2749,2752,2755,2761,2782,2787,2797,2800,2803,2809,2813,2816,2860,2863,2874,2877,2880,2883,2890,2893,2896,2900,2906,2912,2915,2939,2943,2946,2952,2955,2981,2985,2988,3017,3024,3027,3031,3034,3040,3043,3061,3068,3095,3100,3104,3107,3113,3116,3120,3127,3130,3208,3211,3214,3218,3225,3317,3326,3342,3352,3362,3368,3384,3402,3409,3413,3416,3422,3425,3431,3442,3445,3449,3455,3458,3462,3586,3590,3638,3642,3760],[803,804,352],"h1",{"id":303},[806,807,808,809,813,814,817],"p",{},"Signals Search is the canonical discovery workflow for Agentic CRM. It replaces the older split between ",[810,811,812],"strong",{},"Sonar company discovery"," and ",[810,815,816],{},"Headhunter people discovery",".",[806,819,820,821,824],{},"The workflow starts from an ICP\u002Fquery, a bounded company set, or a saved monitoring scope. It finds companies and evidence, verifies meaningful signals, finds the relevant people inside the strongest companies, and returns one reviewable ",[810,822,823],{},"Organization Prospect"," result.",[806,826,827],{},"It consumes the shared Runtime, Tools, Context, Trigger, Policy, Idempotency and Observability layers. It owns no private scheduler, queue, intelligence store, people store, CRM, runtime or policy engine.",[829,830,832],"h2",{"id":831},"product-boundary","Product boundary",[806,834,835,836,839],{},"Signals Search owns the discovery experience and its product state. The ",[837,838,6],"a",{"href":297}," design owns the three-state boundary:",[841,842,848],"pre",{"className":843,"code":845,"language":846,"meta":847},[844],"language-text","Signals Search\n     │\n     ▼\nGlobal Intelligence\ncompanies + people + evidence + signals\n     │\n     ▼\nOrganization Prospect\nfit + scores + relevant people + review state\n     │\n     ├── watch \u002F dismiss\n     │\n     └── promote ──> CRM\n","text","",[849,850,845],"code",{"__ignoreMap":847},[806,852,853,856],{},[810,854,855],{},"Discovery is not CRM creation."," A company or person may be fully researched and reviewable before the organization chooses to manage that relationship in CRM.",[829,858,860],{"id":859},"phase-7-capability-composition","Phase 7 capability composition",[806,862,863,866,867,871],{},[849,864,865],{},"signals.search"," is the stable product ID. The ",[837,868,870],{"href":869},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fcapability-contracts#signals-search-composition","capability contract"," owns its registry and version rules.\nThe three root source shapes and existing product outputs remain compatible.\nThe published node list below includes both Phase 7 composition lanes.",[806,873,874,875,813,878,881,882,813,885,888],{},"ENG-2282 replaces company mechanics with explicit ",[849,876,877],{},"company.search",[849,879,880],{},"company.enrich"," children.\nENG-2302 replaces people mechanics with explicit ",[849,883,884],{},"people.search",[849,886,887],{},"people.enrich"," children.\nPublished subworkflow nodes hold executor UUIDs resolved from tenant bindings. A running graph does not query the registry again.",[806,890,891],{},"Signals keeps bounded web and thesis research. It passes discovered company or person identities through the supplied child search path.\nDirect Company\u002FPeople Search does not gain web sources from this composition.\nCompany-set and saved-search starts retain their scope confinement, including their existing smaller limits.\nThe larger direct-search limits never widen a Signals Run implicitly.",[806,893,894],{},"Scoring, persona-fit evaluation, signal evidence, smart-feed publication, saved-search diffs and prospect promotion remain Signals responsibilities.\nThe compile steps adapt child results to the existing scoring and publication contracts.\nNo capability child adds automatic CRM writes or outreach.",[806,896,897,898,902],{},"People Enrich replaces private profile\u002Fcontact mechanics. Request only the fields required by the published Signals lane.\nIf email is requested, profile results can appear early, but the root remains live until the email child ends.\nPending email is distinct from no email found. The provider-job contract governs replay, cancellation and settlement.\nThe ",[837,899,901],{"href":900},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fcapability-scenarios#composition-and-product-surfaces","design scenarios"," define the regression cases.",[904,905,907],"h3",{"id":906},"company-lane-contract","Company lane contract",[806,909,910,911,914],{},"The research Agent keeps web discovery, source verification, canonical identity writes and signal recording.\nA signal needs a canonical company ID before the Agent can store its evidence.\nThe Agent and its Skills do not declare ",[849,912,913],{},"research.enrich_company",".\nCompany Enrich owns the profile provider calls.",[806,916,917],{},"The company lane runs after research and before signal scoring:",[919,920,921,925,928,931,934],"ol",{},[922,923,924],"li",{},"Compile at most ten researched companies into supplied Company Search references.",[922,926,927],{},"Run the Company Search child through an empty-input wrapper.",[922,929,930],{},"Match returned rows to the supplied canonical IDs and compile Company Enrich subjects.",[922,932,933],{},"Run the Company Enrich child through an empty-input wrapper.",[922,935,936],{},"Validate the child result and pass the admitted company and signal IDs to the existing scoring steps.",[806,938,939,940,813,943,946],{},"Each wrapper uses an existing ",[849,941,942],{},"branch",[849,944,945],{},"subworkflow"," node.\nIts empty arm returns an explicit empty batch without starting a capability.\nThe wrapper returns the existing node-output map. The next compile step accepts only the expected empty or product result shape.\nThis avoids references to skipped nodes. It does not change the direct capability schemas or the workflow DSL.",[806,948,949,950,953],{},"Company Search uses ",[849,951,952],{},"sources: [supplied]",", no firmographic filters and a target of ten.\nSignals keeps free-text criteria in its opportunity scorer. It does not translate thesis text into Explorium filters.\nThe compile step preserves each company's signal IDs, citations and gaps through both children.\nIt matches by canonical ID and validated input indexes, never by result order.\nConflicting, replaced or unknown IDs cannot reach enrichment or promotion.",[806,955,956],{},"For a company-set start, resolve each unnamed seed domain after research.\nOnly the canonical ID for that exact domain can enter the child input.\nA missing or conflicting domain admits no company. It never grants a spare position to an unrelated company.\nSaved searches keep the five-company rotation and can discover new companies within the ten-company total.",[806,958,959,960,963,964,963,967,963,970,963,973,963,976,979,980,963,983,963,986,963,989,813,992,995,996,999,1000,1002],{},"Enrichment uses the Standard preset with an explicit field selection:\n",[849,961,962],{},"name",", ",[849,965,966],{},"description",[849,968,969],{},"industry",[849,971,972],{},"business_model",[849,974,975],{},"country_code",[849,977,978],{},"location",",\n",[849,981,982],{},"employee_count_exact",[849,984,985],{},"employee_count_band",[849,987,988],{},"annual_revenue",[849,990,991],{},"funding_round",[849,993,994],{},"funding_amount",".\nUse ",[849,997,998],{},"refresh: stale",". The existing scorer reads canonical facts after the child completes.\nRetained facts and partial field failures remain usable. A missing canonical identity does not.\nFor a warm row with only ",[849,1001,975],{},", the scorer derives the country name with the shared country converter.\nAn existing country name takes precedence. The projection does not write to Intelligence.",[806,1004,1005],{},"Child inputs and complete wrapper results must fit the existing 32 KiB boundaries.\nCompile steps measure their complete payloads and refuse overflow before the next child starts.\nThey reject a truncation marker, a missing product result and an invalid product contract.\nThey do not report a malformed or incomplete child result as an empty search.\nCancellation, budget stops and platform faults stop the lane. A partial Run cannot publish a Smart Feed result.\nAn ordinary per-field provider failure can preserve other company results.",[806,1007,1008],{},"The runtime owns child keys, parent spans, root budgets, retries and usage accounting.\nEach child uses the existing parent Run ID and node ID key. Compile steps add no aggregate charge.\nCompleted child results replay from durable state. Interrupted external calls retain the existing uncertain-charge limitation.",[806,1010,1011],{},"Publication validates active tenant child definitions and their exact V1 capability bindings.\nThe bundle accepts resolved executor UUIDs. ENG-2275 owns registry resolution; ENG-2277 owns installation.\nThe bundle publishes the two wrappers before the root definition and reports partial publication failures.\nENG-2303 owns upgrades and rollback. Existing published Run snapshots remain unchanged.\nRoot, wrapper and capability occupy all three supported workflow levels.\nA custom workflow cannot add another enclosing level. Publication reports the existing depth refusal.",[904,1013,1015],{"id":1014},"people-lane-contract","People lane contract",[806,1017,1018],{},"Signals keeps its bounded Exa and Parallel research. The capability boundary starts after that research:",[919,1020,1021,1024,1027,1034,1037,1040],{},[922,1022,1023],{},"Build one stable list of at most 75 valid LinkedIn person references from at most three companies.",[922,1025,1026],{},"Use a root branch to run supplied People Search directly only for a nonempty list.",[922,1028,1029,1030,1033],{},"Match returned rows by validated ",[849,1031,1032],{},"input_indexes",", then run one tool-less persona-fit agent.",[922,1035,1036],{},"Compile the selected rows into People Enrich subjects.",[922,1038,1039],{},"Use a nested root branch to run People Enrich directly only for a nonempty selection.",[922,1041,1042],{},"Persist selected Exa and Parallel observations in Intelligence, compile settled attachments and write one bounded prospect batch.",[806,1044,1045],{},"People Search already includes Company Search, and People Enrich already includes People Email.\nBoth capability workflows must therefore run directly from the Signals root.\nA wrapper around either capability would create a fourth workflow level.\nEach branch arm uses a unique attachment node ID.\nThe branches need no joined output because the final Smart Feed step reads durable prospect rows.",[806,1047,1048,1049,1051,1052,1055,1056,1059],{},"People Search uses ",[849,1050,952],{},", the shared persona and no company scope.\nSignals retains a stable side table from each supplied input index to one prospect and its provider evidence.\nThe Search result may reorder or merge rows, so the adapter never joins by result position.\nEvery returned row needs at least one owning input index.\nEvery returned input index must exist, appear under one result only and resolve to one prospect.\nA merged identity that points to several prospects is ambiguous and is attached to none.\nThe adapter decides complete, partial and empty separately for each prospect from that prospect's provider calls and Search diagnostics.\nA global partial outcome for another prospect does not change this decision.\nThe supplied Search contract returns identity evidence, not the complete Signals research record.\nAfter Enrich resolves selected people, one workflow-only ",[849,1053,1054],{},"intelligence.upsert_people_batch"," writes their original Exa and Parallel observations to the canonical Intelligence people.\nIt accepts at most 75 people, reuses the existing Intelligence person service in stable order and refuses a canonical identity mismatch.\nEach source write carries a UUIDv5 ",[849,1057,1058],{},"ProviderFetch.id"," from the frozen root Run ID, discover-people node ID, fan-out position and provider-result position.\nThe frozen provider payload and this ID do not change on retry, so a lost acknowledgement or partial batch retry cannot add a second provenance row.\nThe 75-person evidence writer can use the complete 120-second step budget.\nProvider search completion and failure records stay in the durable tool journal and determine the prospect people state and reason.",[806,1061,1062],{},"People Search applies the deterministic persona gate first.\nIts unknown-value diagnostics remain visible to the persona-fit agent.\nThe agent has no Tools or Skills and returns only selected Search result IDs, scores and evidence-based reasons.\nA deterministic compiler rejects unknown or repeated selections, invalid scores, missing reasons and an oversized result.\nThe model cannot write Intelligence or Prospect rows and cannot call contact providers.",[806,1064,1065,1066,1068,1069,963,1072,963,1075,963,1078,963,1080,979,1082,963,1085,963,1087,813,1090,1093,1094,1096],{},"People Enrich uses the Standard preset, ",[849,1067,998],{},", and only these fields:\n",[849,1070,1071],{},"full_name",[849,1073,1074],{},"current_title",[849,1076,1077],{},"current_company_text",[849,1079,978],{},[849,1081,975],{},[849,1083,1084],{},"avatar_url",[849,1086,336],{},[849,1088,1089],{},"email_source",[849,1091,1092],{},"email_score",".\nUse the canonical person reference when Search returns one. Otherwise use its normalized LinkedIn reference.\nPeople Enrich resolves a valid canonical reference to its stored LinkedIn identity before email work.\nThe adapter validates ",[849,1095,1032],{}," again, rejects a changed canonical ID and attaches only rows with a canonical person ID.\nOne identity-invalid row in a schema-valid Enrich envelope does not remove unrelated valid siblings.\nA schema-invalid row invalidates the complete child envelope.",[806,1098,1099,1100,1103,1104,1107,1108,1111,1112,1115],{},"A newly created or still-pending prospect keeps ",[849,1101,1102],{},"people_state: pending"," while the Enrich child and its email child run.\nA completed People Enrich result contains no pending selected field state.\nThe adapter rejects a final pending state instead of mapping it to a prospect contact state.\nMap a safe, exact-address verified result to ",[849,1105,1106],{},"verified",", a settled not-found email to ",[849,1109,1110],{},"unavailable",", and every other settled result to ",[849,1113,1114],{},"unverified",".\nDo not copy or construct an email in Signals. People Enrich owns the stored value and verification lineage.",[806,1117,1118,1119,1122,1123,1126,1127,1129,1130,1133],{},"A complete search with no selected person can attach ",[849,1120,1121],{},"no_matching_people"," with complete search evidence.\nA partial search with no usable person writes an exact reason only when the prospect is still pending; an existing ",[849,1124,1125],{},"found"," or ",[849,1128,1121],{}," state wins.\nA partial search with valid people attaches those people and retains the incomplete search evidence.\nThe bounded attachment service publishes one ",[849,1131,1132],{},"result.item_ready"," event for each changed prospect, including complete-empty and partial-pending changes.\nThe lane measures each complete capability input, agent input, agent output, evidence input and attachment input before its next consumer.\nIt never trims persona criteria, identities or evidence silently.",[806,1135,1136,1137,813,1139,1141],{},"Publication validates active tenant ",[849,1138,884],{},[849,1140,887],{}," V1 bindings before it writes a definition.\nIt also validates an active tenant persona-fit Agent with no Tools, Skills or context sources before it writes a company wrapper.\nIt writes only the root for the people lane; there is no people wrapper to publish or recover.\nThe runtime owns child keys, lineage, budgets, retries and usage once for the root tree.\nThe root duration is three hours. It holds the 4,800-second People Enrich child after the earlier children and leaves time for evidence, attachment and the final Smart Feed step.\nOld published snapshots and admitted Run payloads remain unchanged.",[829,1143,1145],{"id":1144},"inputs","Inputs",[806,1147,1148],{},"A Signals Search Run may start from one of three source shapes.",[1150,1151,1152,1168],"table",{},[1153,1154,1155],"thead",{},[1156,1157,1158,1162,1165],"tr",{},[1159,1160,1161],"th",{},"Source",[1159,1163,1164],{},"Example",[1159,1166,1167],{},"Workflow behavior",[1169,1170,1171,1183,1194],"tbody",{},[1156,1172,1173,1177,1180],{},[1174,1175,1176],"td",{},"Discovery brief",[1174,1178,1179],{},"ICP, geography, company criteria, signal criteria, buyer persona",[1174,1181,1182],{},"discover companies\u002Fsignals first, then relevant people",[1156,1184,1185,1188,1191],{},[1174,1186,1187],{},"Bounded company set",[1174,1189,1190],{},"selected prospects, CRM list, selected CRM companies, normalized CSV\u002Fimport",[1174,1192,1193],{},"skip broad company discovery; refresh signals and find relevant people",[1156,1195,1196,1199,1202],{},[1174,1197,1198],{},"Saved monitoring scope",[1174,1200,1201],{},"saved search, watched prospects, target list",[1174,1203,1204],{},"look for new\u002Fmaterially changed evidence and refresh only what changed",[806,1206,1207],{},"The brief may contain:",[1209,1210,1211,1214,1217],"ul",{},[922,1212,1213],{},"an ICP text that states the target-company and signal thesis;",[922,1215,1216],{},"company criteria;",[922,1218,1219,1220,963,1223,963,1226,813,1229,817],{},"buyer persona with ",[849,1221,1222],{},"titles",[849,1224,1225],{},"departments",[849,1227,1228],{},"seniority",[849,1230,1231],{},"country_codes",[806,1233,1234],{},"V1 has no separate signal-theme or result-limit field. The workflow passes the\nICP text and company criteria to opportunity scoring and signal research. A\nsurface must not collect a separate value that the Run input would discard.",[806,1236,1237],{},"Every source shape carries a brief. The brief must contain an ICP or company criteria, because the opportunity score reads them, and it must contain a persona with one criterion, because the people plan reads it. A bounded company set names which companies to research; it does not answer how valuable acting on one is. Phase 4 does not read Knowledge as a fallback.",[806,1239,1240],{},"The Front Door or product UI may help construct the brief. The Signals Search workflow owns execution.",[904,1242,1244],{"id":1243},"shared-persona-contract","Shared persona contract",[806,1246,1247,1248,1251,1252,963,1254,963,1256,813,1258,1260],{},"ENG-2324 owns this input change. ENG-2302 owns people capability composition.\nImport People Search's ",[849,1249,1250],{},"PersonaCriteria","; do not copy its schema or weaken its filters.\nThe persona contains ",[849,1253,1222],{},[849,1255,1225],{},[849,1257,1228],{},[849,1259,1231],{},".\nAt least one field is required. Each supplied list contains 1 to 20 unique values.\nOmit unused fields. Reject null, empty lists, unknown keys and duplicates after whitespace and case normalization.\nText values contain 1 to 1,000 characters. Country codes use the existing ISO alpha-2 contract.\nThe full Run input must also fit the platform byte limit. Field limits do not replace that limit.",[806,1262,1263],{},"Use OR within each list and AND between fields. Match text without case differences.\nUse the person's country. Do not substitute the employer's country or infer a country from free-text location.\nKeep missing facts unknown. Any observed contradiction excludes the merged identity, including a later duplicate observation.\nUse the same deterministic gate as People Search before persona-fit scoring.\nUnknown department or seniority vocabulary remains unknown under the supplied-source rules.\nExplorium-specific vocabulary checks remain at the Explorium boundary; Signals web research does not select that source here.\nKeep unknown diagnostics and source evidence so the scorer cannot claim verified fit from missing facts.\nPersona-fit scores and evidence-based reasons remain separate from signal scores.",[806,1265,1266,1267,1270],{},"Validate the brief before company reads or paid work for discovery and company-set starts.\nSaved-search create, corrected-brief patch, manual start and scheduled dispatch use the same reader.\nA rejected scheduled dispatch records ",[849,1268,1269],{},"input_unbuildable"," and starts no Run. Keep the schedule unchanged.\nProvider queries carry all persona alternatives explicitly. Do not select the first value, truncate a list, or expand related titles.\nKeep the existing company\u002Fprovider call count. Do not create a Cartesian product of criteria.\nBefore company work, preflight the full six-call people plan with bounded company fields and the complete persona.\nCheck the exact scope output and company research input before their first consumer. Refuse overflow before paid work.\nCheck the complete plan again before provider fan-out. Never let the platform truncate a call or a criterion.\nThese resource checks can refuse a schema-valid persona. Return an actionable size error.\nMeasure the complete persona child input, including Unicode bytes, before starting that child.\nReduce the existing candidate budget by the persona envelope size. Never trim persona criteria to fit.",[904,1272,1274],{"id":1273},"legacy-persona-correction","Legacy persona correction",[806,1276,1277],{},"Inspect stored briefs before a write. Export a private dry-run report for each selected organization.\nInclude the original brief, saved-search ID, update token, field errors and proposed correction.\nA valid shared persona needs no write. Do not guess an equivalent for title families, functions, regions or combined criteria.\nEven a legacy title can represent a broader search. Require a reviewed replacement when equivalent meaning cannot be proved.\nKeep the original brief in the migration report before applying a confirmed correction.\nApply only the reviewed persona to that original brief through the existing organization boundary and update-token check.\nReject a changed or deleted row. If the exact corrected brief is already stored, report it without another write.\nKeep saved-search IDs, watch membership, schedules and unrelated brief fields unchanged.\nAn incompatible brief remains readable. Permit name-only edits; require a valid shared persona when the brief itself changes.\nA new execution returns actionable persona field errors until the brief is corrected.",[806,1279,1280],{},"Do not rewrite admitted Run inputs, snapshots, results or replay data.\nBefore rollout, stop new legacy admissions and let admitted legacy Runs finish, or cancel them through the normal Run API.\nDo not deploy changed live tool contracts while such Runs can resume. Preserve historical reads after rollout.\nCapability installation and definition upgrades remain ENG-2303 responsibilities.",[806,1282,1283,1284,1288,1289,1291],{},"The ",[837,1285,1287],{"href":1286},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Fsurfaces#signals-search-journey","Signals Search journey","\nowns direct launch, saved-search management, correction and diff review.\nThe saved-search route composes its private source fields and resolves the\nstable ",[849,1290,865],{}," capability. The frontend never accepts an executor UUID.",[904,1293,1295],{"id":1294},"one-run-input-three-shapes","One Run input, three shapes",[806,1297,1298],{},"The Run input names its own source. Only the first node reads it.",[841,1300,1304],{"className":1301,"code":1302,"language":1303,"meta":847,"style":847},"language-json shiki shiki-themes github-dark","{\n  \"source\": \"discovery | company_set | saved_search\",\n  \"brief\": {},\n  \"companies\": [],\n  \"saved_search_id\": null,\n  \"baseline_run_id\": null\n}\n","json",[849,1305,1306,1314,1329,1337,1345,1357,1367],{"__ignoreMap":847},[1307,1308,1310],"span",{"class":1309,"line":22},"line",[1307,1311,1313],{"class":1312},"s95oV","{\n",[1307,1315,1316,1320,1323,1327],{"class":1309,"line":32},[1307,1317,1319],{"class":1318},"sDLfK","  \"source\"",[1307,1321,1322],{"class":1312},": ",[1307,1324,1326],{"class":1325},"sU2Wk","\"discovery | company_set | saved_search\"",[1307,1328,979],{"class":1312},[1307,1330,1331,1334],{"class":1309,"line":233},[1307,1332,1333],{"class":1318},"  \"brief\"",[1307,1335,1336],{"class":1312},": {},\n",[1307,1338,1339,1342],{"class":1309,"line":244},[1307,1340,1341],{"class":1318},"  \"companies\"",[1307,1343,1344],{"class":1312},": [],\n",[1307,1346,1347,1350,1352,1355],{"class":1309,"line":264},[1307,1348,1349],{"class":1318},"  \"saved_search_id\"",[1307,1351,1322],{"class":1312},[1307,1353,1354],{"class":1318},"null",[1307,1356,979],{"class":1312},[1307,1358,1359,1362,1364],{"class":1309,"line":222},[1307,1360,1361],{"class":1318},"  \"baseline_run_id\"",[1307,1363,1322],{"class":1312},[1307,1365,1366],{"class":1318},"null\n",[1307,1368,1369],{"class":1309,"line":360},[1307,1370,1371],{"class":1312},"}\n",[806,1373,1374,1376,1377,813,1380,1383,1384,1386],{},[849,1375,36],{}," belongs to a bounded company set and holds at most ten members. Each member names a company by canonical Intelligence id, prospect id, domain or organization LinkedIn URL. These references are top-level source fields, not brief fields. V1 accepts no person reference. A name is evidence and never an entity key. ",[849,1378,1379],{},"saved_search_id",[849,1381,1382],{},"baseline_run_id"," belong to a saved monitoring scope, and ",[837,1385,253],{"href":249}," owns the route that composes them.",[806,1388,1389,1390,1393],{},"The Run freezes one ",[849,1391,1392],{},"as_of"," time. The first node freezes it, so no caller supplies it, and the workflow step memo keeps it stable across a retry. Scoring and prospect writes use this time as their source-observation time.",[829,1395,1397],{"id":1396},"the-workflow","The workflow",[841,1399,1402],{"className":1400,"code":1401,"language":846,"meta":847},[844],"input brief \u002F company set \u002F saved scope\n        │\n        ▼\n0. Resolve the source shape into one search scope\n        │\n        ▼\n1. Discover or resolve companies + signals\n        │\n        ▼\n2. Normalize entities + dedupe evidence\n        │\n        ▼\n3. Fill coverage gaps \u002F verify strong candidates\n        │\n        ▼\n4. Grade signal evidence\n        │\n        ▼\n5. Grade opportunity from the brief\n        │\n        ▼\n6. Rank, prune, and upsert the kept prospects\n        │\n        ▼\n7. Find relevant people for bounded top companies\n        │\n        ▼\n8. Verify \u002F dedupe \u002F attach people\n   final Organization Prospect\n   company + signals + relevant people + reasons\n        │\n        ▼\n9. Freeze the saved-search publication projection\n   other source shapes -> not applicable\n        │\n        ├── watch \u002F dismiss\n        ├── promote selected records to CRM\n        └── hand selected people to the email sequence workflow\n",[849,1403,1401],{"__ignoreMap":847},[806,1405,1406],{},"This is one product workflow, not two chained product Runs. Internal units may be Agents, Skills, Tools or deterministic workflow steps depending on the job.",[806,1408,1409,1412,1413,1416],{},[810,1410,1411],{},"The three research rounds are not three workflow nodes."," A workflow has no loops, so the rounds happen inside the company and signals ",[810,1414,1415],{},"agent step",", which decides whether another bounded round is useful and stops on its own judgement inside the runtime ceilings. The workflow owns the order of the stages; the agent owns how many rounds a stage takes.",[904,1418,1420],{"id":1419},"the-published-node-list","The published node list",[806,1422,1423],{},"The root sequence serves all three source shapes. The people branch contains its own selected child nodes.",[1150,1425,1426,1442],{},[1153,1427,1428],{},[1156,1429,1430,1433,1436,1439],{},[1159,1431,1432],{},"#",[1159,1434,1435],{},"Node",[1159,1437,1438],{},"Kind",[1159,1440,1441],{},"Width",[1169,1443,1444,1459,1474,1488,1502,1516,1530,1544,1558,1572,1586,1600,1615,1629,1644,1658,1673,1687,1702,1717,1732,1747,1761,1776,1791,1808,1822,1839,1857,1874,1891,1908,1925,1942],{},[1156,1445,1446,1449,1454,1457],{},[1174,1447,1448],{},"1",[1174,1450,1451],{},[849,1452,1453],{},"signals.compile_search_scope",[1174,1455,1456],{},"tool, read",[1174,1458,1448],{},[1156,1460,1461,1464,1469,1472],{},[1174,1462,1463],{},"2",[1174,1465,1466],{},[849,1467,1468],{},"company-signals",[1174,1470,1471],{},"agent",[1174,1473,1448],{},[1156,1475,1476,1479,1484,1486],{},[1174,1477,1478],{},"3",[1174,1480,1481],{},[849,1482,1483],{},"signals.compile_company_search",[1174,1485,1456],{},[1174,1487,1448],{},[1156,1489,1490,1493,1497,1500],{},[1174,1491,1492],{},"4",[1174,1494,1495],{},[849,1496,50],{},[1174,1498,1499],{},"subworkflow wrapper",[1174,1501,1448],{},[1156,1503,1504,1507,1512,1514],{},[1174,1505,1506],{},"5",[1174,1508,1509],{},[849,1510,1511],{},"signals.compile_company_enrich",[1174,1513,1456],{},[1174,1515,1448],{},[1156,1517,1518,1521,1526,1528],{},[1174,1519,1520],{},"6",[1174,1522,1523],{},[849,1524,1525],{},"company-enrich",[1174,1527,1499],{},[1174,1529,1448],{},[1156,1531,1532,1535,1540,1542],{},[1174,1533,1534],{},"7",[1174,1536,1537],{},[849,1538,1539],{},"signals.compile_company_result",[1174,1541,1456],{},[1174,1543,1448],{},[1156,1545,1546,1549,1554,1556],{},[1174,1547,1548],{},"8",[1174,1550,1551],{},[849,1552,1553],{},"signals.compile_signal_batch",[1174,1555,1456],{},[1174,1557,1448],{},[1156,1559,1560,1563,1568,1570],{},[1174,1561,1562],{},"9",[1174,1564,1565],{},[849,1566,1567],{},"score-signals",[1174,1569,1471],{},[1174,1571,1448],{},[1156,1573,1574,1577,1582,1584],{},[1174,1575,1576],{},"10",[1174,1578,1579],{},[849,1580,1581],{},"signals.compile_opportunity_batch",[1174,1583,1456],{},[1174,1585,1448],{},[1156,1587,1588,1591,1596,1598],{},[1174,1589,1590],{},"11",[1174,1592,1593],{},[849,1594,1595],{},"score-opportunities",[1174,1597,1471],{},[1174,1599,1448],{},[1156,1601,1602,1605,1610,1613],{},[1174,1603,1604],{},"12",[1174,1606,1607],{},[849,1608,1609],{},"prospect.promote_batch",[1174,1611,1612],{},"tool, write",[1174,1614,1448],{},[1156,1616,1617,1620,1625,1627],{},[1174,1618,1619],{},"13",[1174,1621,1622],{},[849,1623,1624],{},"signals.plan_people_search",[1174,1626,1456],{},[1174,1628,1448],{},[1156,1630,1631,1634,1639,1641],{},[1174,1632,1633],{},"14",[1174,1635,1636],{},[849,1637,1638],{},"research.discover_people",[1174,1640,1456],{},[1174,1642,1643],{},"fan out",[1156,1645,1646,1649,1654,1656],{},[1174,1647,1648],{},"15",[1174,1650,1651],{},[849,1652,1653],{},"signals.compile_people_search",[1174,1655,1456],{},[1174,1657,1448],{},[1156,1659,1660,1663,1668,1671],{},[1174,1661,1662],{},"16",[1174,1664,1665],{},[849,1666,1667],{},"people-lane",[1174,1669,1670],{},"root branch",[1174,1672,1448],{},[1156,1674,1675,1678,1682,1685],{},[1174,1676,1677],{},"17",[1174,1679,1680],{},[849,1681,128],{},[1174,1683,1684],{},"direct subworkflow in the nonempty arm",[1174,1686,1448],{},[1156,1688,1689,1692,1697,1700],{},[1174,1690,1691],{},"18",[1174,1693,1694],{},[849,1695,1696],{},"signals.compile_search_persona",[1174,1698,1699],{},"tool, read in the nonempty arm",[1174,1701,1448],{},[1156,1703,1704,1707,1712,1715],{},[1174,1705,1706],{},"19",[1174,1708,1709],{},[849,1710,1711],{},"has-persona-candidates",[1174,1713,1714],{},"nested root branch",[1174,1716,1448],{},[1156,1718,1719,1722,1727,1730],{},[1174,1720,1721],{},"20",[1174,1723,1724],{},[849,1725,1726],{},"persona-fit",[1174,1728,1729],{},"tool-less agent in the candidate arm",[1174,1731,1448],{},[1156,1733,1734,1737,1742,1745],{},[1174,1735,1736],{},"21",[1174,1738,1739],{},[849,1740,1741],{},"signals.compile_people_enrich",[1174,1743,1744],{},"tool, read in the candidate arm",[1174,1746,1448],{},[1156,1748,1749,1752,1757,1759],{},[1174,1750,1751],{},"22",[1174,1753,1754],{},[849,1755,1756],{},"has-people-enrich",[1174,1758,1714],{},[1174,1760,1448],{},[1156,1762,1763,1766,1771,1774],{},[1174,1764,1765],{},"23",[1174,1767,1768],{},[849,1769,1770],{},"people-enrich",[1174,1772,1773],{},"direct subworkflow in the selected arm",[1174,1775,1448],{},[1156,1777,1778,1781,1786,1789],{},[1174,1779,1780],{},"24",[1174,1782,1783],{},[849,1784,1785],{},"signals.compile_person_evidence",[1174,1787,1788],{},"tool, read in the selected arm",[1174,1790,1448],{},[1156,1792,1793,1796,1801,1806],{},[1174,1794,1795],{},"25",[1174,1797,1798],{},[849,1799,1800],{},"persist-person-evidence",[1174,1802,1803,1805],{},[849,1804,1054],{},", write in the selected arm",[1174,1807,1448],{},[1156,1809,1810,1813,1818,1820],{},[1174,1811,1812],{},"26",[1174,1814,1815],{},[849,1816,1817],{},"signals.compile_people_result",[1174,1819,1788],{},[1174,1821,1448],{},[1156,1823,1824,1827,1832,1837],{},[1174,1825,1826],{},"27",[1174,1828,1829],{},[849,1830,1831],{},"attach-selected-people",[1174,1833,1834,1805],{},[849,1835,1836],{},"prospect.attach_people_batch",[1174,1838,1448],{},[1156,1840,1841,1844,1849,1855],{},[1174,1842,1843],{},"28",[1174,1845,1846],{},[849,1847,1848],{},"compile-enrich-empty",[1174,1850,1851,1854],{},[849,1852,1853],{},"signals.compile_empty_people",", read in the Enrich-empty arm",[1174,1856,1448],{},[1156,1858,1859,1862,1867,1872],{},[1174,1860,1861],{},"29",[1174,1863,1864],{},[849,1865,1866],{},"attach-enrich-empty",[1174,1868,1869,1871],{},[849,1870,1836],{},", write in the Enrich-empty arm",[1174,1873,1448],{},[1156,1875,1876,1879,1884,1889],{},[1174,1877,1878],{},"30",[1174,1880,1881],{},[849,1882,1883],{},"compile-persona-empty",[1174,1885,1886,1888],{},[849,1887,1853],{},", read in the persona-empty arm",[1174,1890,1448],{},[1156,1892,1893,1896,1901,1906],{},[1174,1894,1895],{},"31",[1174,1897,1898],{},[849,1899,1900],{},"attach-persona-empty",[1174,1902,1903,1905],{},[849,1904,1836],{},", write in the persona-empty arm",[1174,1907,1448],{},[1156,1909,1910,1913,1918,1923],{},[1174,1911,1912],{},"32",[1174,1914,1915],{},[849,1916,1917],{},"compile-search-empty",[1174,1919,1920,1922],{},[849,1921,1853],{},", read in the Search-empty arm",[1174,1924,1448],{},[1156,1926,1927,1930,1935,1940],{},[1174,1928,1929],{},"33",[1174,1931,1932],{},[849,1933,1934],{},"attach-search-empty",[1174,1936,1937,1939],{},[849,1938,1836],{},", write in the Search-empty arm",[1174,1941,1448],{},[1156,1943,1944,1947,1952,1954],{},[1174,1945,1946],{},"34",[1174,1948,1949],{},[849,1950,1951],{},"signals.compile_smart_feed_observations",[1174,1953,1456],{},[1174,1955,1448],{},[806,1957,1958],{},"The root reads one normalized scope. Each company wrapper branches on a\nvalidated nonempty batch and returns either the child output or an explicit\nempty result. The root therefore never refers to a skipped node.",[806,1960,1961,1962,813,1965,1968],{},"Deterministic read tools carry data between reasoning steps. A node input\nnames ",[849,1963,1964],{},"input.*",[849,1966,1967],{},"steps.\u003Cid>.output.*"," only. The language has no expression,\narray index or list join. Each reshape is therefore a tool.",[1150,1970,1971,1984],{},[1153,1972,1973],{},[1156,1974,1975,1978,1981],{},[1159,1976,1977],{},"Tool",[1159,1979,1980],{},"Reads",[1159,1982,1983],{},"Answers",[1169,1985,1986,1998,2010,2022,2034,2047,2059,2071,2086,2098,2110,2122,2134,2146,2158],{},[1156,1987,1988,1992,1995],{},[1174,1989,1990],{},[849,1991,1453],{},[1174,1993,1994],{},"the whole Run input, Intelligence company identity, the prospects and the saved-search membership of this organization",[1174,1996,1997],{},"the scope every later node reads",[1156,1999,2000,2004,2007],{},[1174,2001,2002],{},[849,2003,1483],{},[1174,2005,2006],{},"researched companies and exact seed identities",[1174,2008,2009],{},"confined canonical references for supplied Search",[1156,2011,2012,2016,2019],{},[1174,2013,2014],{},[849,2015,1511],{},[1174,2017,2018],{},"complete Search output and research evidence",[1174,2020,2021],{},"admitted companies and selected-field Enrich input",[1156,2023,2024,2028,2031],{},[1174,2025,2026],{},[849,2027,1539],{},[1174,2029,2030],{},"complete Enrich output and research evidence",[1174,2032,2033],{},"validated companies for scoring",[1156,2035,2036,2041,2044],{},[1174,2037,2038],{},[849,2039,2040],{},"signals.empty_company_batch",[1174,2042,2043],{},"no data",[1174,2045,2046],{},"an explicit empty wrapper result",[1156,2048,2049,2053,2056],{},[1174,2050,2051],{},[849,2052,1553],{},[1174,2054,2055],{},"admitted companies, Intelligence signals and sources, stored prospect grades",[1174,2057,2058],{},"the signal scoring input, holding ungraded signals only",[1156,2060,2061,2065,2068],{},[1174,2062,2063],{},[849,2064,1581],{},[1174,2066,2067],{},"the new grades, the stored grades, Intelligence company facts, the seed",[1174,2069,2070],{},"the opportunity scoring input, with the resolved grades under each company",[1156,2072,2073,2077,2080],{},[1174,2074,2075],{},[849,2076,1624],{},[1174,2078,2079],{},"the kept prospects and the buyer persona",[1174,2081,2082,2083,2085],{},"one ordered ",[849,2084,1638],{}," argument list",[1156,2087,2088,2092,2095],{},[1174,2089,2090],{},[849,2091,1653],{},[1174,2093,2094],{},"that argument list and the fan-out results",[1174,2096,2097],{},"a branch flag, stable supplied Search input and index-to-prospect evidence map",[1156,2099,2100,2104,2107],{},[1174,2101,2102],{},[849,2103,1696],{},[1174,2105,2106],{},"the Search result and the index-to-prospect evidence map",[1174,2108,2109],{},"a bounded persona-fit input grouped by prospect, with per-prospect completeness",[1156,2111,2112,2116,2119],{},[1174,2113,2114],{},[849,2115,1741],{},[1174,2117,2118],{},"the persona-fit result and Search rows",[1174,2120,2121],{},"a branch flag, selected Enrich subjects and selected source observations",[1156,2123,2124,2128,2131],{},[1174,2125,2126],{},[849,2127,1785],{},[1174,2129,2130],{},"selected source observations and complete Enrich results",[1174,2132,2133],{},"canonical-checked Intelligence person evidence writes",[1156,2135,2136,2140,2143],{},[1174,2137,2138],{},[849,2139,1817],{},[1174,2141,2142],{},"selected evidence, evidence-write results and the complete Enrich result",[1174,2144,2145],{},"one validated attachment argument for each attempted prospect",[1156,2147,2148,2152,2155],{},[1174,2149,2150],{},[849,2151,1853],{},[1174,2153,2154],{},"exactly one empty Search, persona or Enrich stage",[1174,2156,2157],{},"one complete-empty or partial-pending attachment argument for each attempted prospect",[1156,2159,2160,2164,2167],{},[1174,2161,2162],{},[849,2163,1951],{},[1174,2165,2166],{},"the source, frozen time, promoted prospect ids, and their current signal grades and people",[1174,2168,2169,2170,963,2173,1126,2175],{},"one frozen publication projection, or ",[849,2171,2172],{},"not_applicable",[849,2174,473],{},[849,2176,2177],{},"overflow",[806,2179,2180],{},"No Agent declares one of them. They are workflow plumbing, and a model never\ncalls them.",[904,2182,2184],{"id":2183},"the-scope-step-answers-one-key-set","The scope step answers one key set",[806,2186,2187,2188,817],{},"A node input that names an absent key fails, and a null fails the same way. So\nthe scope step answers the same nine fields whichever shape started the Run,\nand variance lives inside a value rather than in the presence of a key. Every\nlater node reads that step and never ",[849,2189,1964],{},[1150,2191,2192,2202],{},[1153,2193,2194],{},[1156,2195,2196,2199],{},[1159,2197,2198],{},"Field",[1159,2200,2201],{},"Holds",[1169,2203,2204,2214,2223,2233,2243,2253,2263,2273,2283],{},[1156,2205,2206,2211],{},[1174,2207,2208],{},[849,2209,2210],{},"source",[1174,2212,2213],{},"the Run input source",[1156,2215,2216,2220],{},[1174,2217,2218],{},[849,2219,1392],{},[1174,2221,2222],{},"the frozen observation time",[1156,2224,2225,2230],{},[1174,2226,2227],{},[849,2228,2229],{},"brief",[1174,2231,2232],{},"the ICP and the company criteria, and nothing else",[1156,2234,2235,2240],{},[1174,2236,2237],{},[849,2238,2239],{},"persona",[1174,2241,2242],{},"the buyer persona",[1156,2244,2245,2250],{},[1174,2246,2247],{},[849,2248,2249],{},"seed_companies",[1174,2251,2252],{},"the companies the Run starts from. It is empty for a discovery brief",[1156,2254,2255,2260],{},[1174,2256,2257],{},[849,2258,2259],{},"confine_to_seed",[1174,2261,2262],{},"whether a company outside the seed may become a prospect",[1156,2264,2265,2270],{},[1174,2266,2267],{},[849,2268,2269],{},"unresolved_inputs",[1174,2271,2272],{},"each supplied reference that names no company",[1156,2274,2275,2280],{},[1174,2276,2277],{},[849,2278,2279],{},"dropped",[1174,2281,2282],{},"supplied references a company already in the seed had claimed",[1156,2284,2285,2290],{},[1174,2286,2287],{},[849,2288,2289],{},"watched_total",[1174,2291,2292],{},"how many companies the saved search watches",[806,2294,2295],{},"The step also reads the brief, so a Run with no ICP and no persona stops at\nthe first node, before it pays a vendor.",[806,2297,2298,2301,2302,2304],{},[810,2299,2300],{},"The step writes nothing."," A supplied domain that Global Intelligence does\nnot hold yet is research work: the seed keeps the domain and no id, and the\nAgent writes the canonical row. A reference with no strong key becomes an\nunresolved input, and no entity is created for it. The Run result carries\n",[849,2303,2269],{},", so a reviewer sees which imported rows never became\ncompanies.",[806,2306,2307,2310,2311,2313],{},[810,2308,2309],{},"A bounded company set is a promise about the answer."," The Agent is told to\nsearch inside the seed, and ",[849,2312,1581],{}," proves it: a\ncompany outside the seed never reaches the scorer, so it cannot become a\nprospect row. A seed entry with no id admits one company the seed could not\nname, because the Agent created that row during the Run. The kept set is never\nwider than the seed.",[806,2315,2316,2319,2320,2322],{},[810,2317,2318],{},"A saved scope refreshes and discovers."," It seeds the companies the search\nalready surfaced, oldest observation first, and it does not confine, because a\nnew company is one of the changes the Smart Feed reports. The Agent answers at\nmost ten companies, so the seed takes at most five and a wider watch list\nrotates across Runs. ",[849,2321,2289],{}," records how many the search watches.",[904,2324,2326],{"id":2325},"the-final-node-freezes-publication-input","The final node freezes publication input",[806,2328,2329,2331,2332,2334,2335,2338,2339,817],{},[849,2330,1951],{}," is always the last node. A discovery\nor company-set Run returns ",[849,2333,2172],{}," and reads no publication rows. A\nsaved-search Run reads all promoted prospects, their signal grades and their\nattached people in one database statement. The same snapshot requires each\nprospect ",[849,2336,2337],{},"last_seen_run_id"," to name this Run. Any mismatch returns\n",[849,2340,473],{},[806,2342,2343,2344,2346],{},"The statement orders each embedded relation by its Intelligence id and asks\nfor at most 100 signal grades and 100 people per prospect. V1 supports 99 of\neach. A relation that returns 100 makes the result ",[849,2345,2177],{},"; the node hashes\nnothing and cannot publish a partial relation. This explicit sentinel stays\ninside the Data API ceiling at the maximum ten-prospect width and detects a\nprospect that has outgrown the V1 projection bound.",[806,2348,2349,2350,2352,2353,2357],{},"A ready answer holds the scope's frozen ",[849,2351,1392],{}," time and one versioned digest\nenvelope for each prospect. The immutable Run result therefore holds the\ncomplete comparison input. A later Run can change mutable prospect state, but\nit cannot change this projection. The node moves no saved-search pointer and\nwrites no publication row. ",[837,2354,2356],{"href":2355},"\u002Fengineering\u002Fsystem-design\u002Fagentic-platform\u002Finterfaces\u002Fsurfaces#the-latest-smart-feed-diff","Saved-search surfaces","\nown the durable publisher and the digest rules.",[806,2359,2360,2361,2364],{},"The workflow selects this node as its completed result under the single\n",[849,2362,2363],{},"smart_feed"," key. It does not carry the eleven earlier node outputs into the\ncompleted Run result. A partial Run keeps the normal diagnostic map and cannot\npublish.",[806,2366,2367,2368,2370,2371,2374],{},"This final node never prunes. The promoted set has at most ten prospects, and\neach digest envelope has fixed-size identifiers, counts and hashes. The\nhandler measures the complete serialized answer before it returns. An answer\nover the tool-output limit also returns ",[849,2369,2177],{},", not ",[849,2372,2373],{},"ready",". The publisher\nthen writes nothing. Boundary tests prove that 99 components are ready, 100\nare not, that ten maximum relations return every sentinel, and that ten\nmaximum digest envelopes fit the current output limit and remain intact after\nthe Run-result boundary.",[806,2376,2377,813,2380,2383],{},[849,2378,2379],{},"intelligence.upsert_company",[849,2381,2382],{},"intelligence.record_signal"," resolve identity\nand cluster evidence in their handlers. The Agent returns canonical IDs.\nCompany Search validates those IDs against current Intelligence before enrichment.\nCompany Enrich owns the single profile provider path.",[904,2385,2387],{"id":2386},"every-compile-tool-bounds-its-own-answer","Every compile tool bounds its own answer",[806,2389,2390],{},"A tool result over the tool output limit is bounded, and the call still\nsucceeds. A compile tool that relies on that boundary reports success on a\nbatch it silently cut. Each one therefore prunes to its own declared limit,\nin a stable order, and reports the count it dropped.",[806,2392,2393,2394,824],{},"Company capability handoffs preserve the whole batch or refuse overflow.\nThey never trim signal evidence. The final Smart Feed projection also preserves\nthe whole bounded set or returns a non-ready ",[849,2395,2177],{},[806,2397,2398,2399,2402,2403,2405],{},"The same rule holds at the two run boundaries. A Run input over the refusal\nlimit is refused, so the scoring and persona inputs must fit it. A default Run\nresult over the result limit is bounded and marked ",[849,2400,2401],{},"truncated",". Signals Search\nuses the workflow result selector to keep the final Smart Feed projection as\none top-level item. Its saved prospect rows and ",[849,2404,1132],{}," stream\nremain the record for the other product surfaces.",[829,2407,2409],{"id":2408},"bounded-research-rounds","Bounded research rounds",[806,2411,2412],{},"The research portion may perform up to three purposeful rounds. They are not three repeats of the same query.",[1150,2414,2415,2428],{},[1153,2416,2417],{},[1156,2418,2419,2422,2425],{},[1159,2420,2421],{},"Round",[1159,2423,2424],{},"Purpose",[1159,2426,2427],{},"Typical work",[1169,2429,2430,2441,2452],{},[1156,2431,2432,2435,2438],{},[1174,2433,2434],{},"1. Discovery",[1174,2436,2437],{},"Find candidate companies\u002Fsignals with useful recall",[1174,2439,2440],{},"focused ICP queries, category search, news\u002Fweb search, existing-intelligence lookup",[1156,2442,2443,2446,2449],{},[1174,2444,2445],{},"2. Coverage",[1174,2447,2448],{},"Fill meaningful gaps",[1174,2450,2451],{},"missing signal categories, weak company attributes, stale evidence, missing geography",[1156,2453,2454,2457,2460],{},[1174,2455,2456],{},"3. Verification",[1174,2458,2459],{},"Confirm strongest or ambiguous candidates",[1174,2461,2462],{},"identity\u002Fdomain validation, date verification, source agreement, conflicting evidence",[806,2464,2465],{},"Stop after round 1 or 2 when evidence is sufficient. Stop searching when any one is true:",[1209,2467,2468,2471,2474,2477,2480],{},[922,2469,2470],{},"required evidence is sufficient for the decision;",[922,2472,2473],{},"another round is producing little new information;",[922,2475,2476],{},"the result limit is reached;",[922,2478,2479],{},"no candidates survive verification;",[922,2481,2482],{},"maximum round count is reached.",[806,2484,2485,2486,2489],{},"The Runtime and Policy limits for tools, tokens, spend, turns, and duration are hard ceilings. If one stops the segment, the Run records its ",[849,2487,2488],{},"partial_reason",". The Agent decides only whether another bounded round is useful inside those ceilings.",[904,2491,2493],{"id":2492},"company-and-signals-agent-result","Company and signals agent result",[806,2495,2496],{},"The company\u002Fsignals Agent has three Skills: discover companies, search signals, and verify evidence. Its tool set is:",[1209,2498,2499,2504,2509,2514,2518],{},[922,2500,2501],{},[849,2502,2503],{},"research.search_web",[922,2505,2506],{},[849,2507,2508],{},"research.search_company",[922,2510,2511],{},[849,2512,2513],{},"research.fetch_page",[922,2515,2516],{},[849,2517,2379],{},[922,2519,2520],{},[849,2521,2382],{},[806,2523,2524,2525,2527],{},"Company enrichment runs through the ",[849,2526,880],{}," child.\nThe compile boundary preserves the following bounded Agent output for scoring.",[806,2529,2530],{},"The Agent returns one structured object. It contains:",[1209,2532,2533,2540,2546,2568,2574],{},[922,2534,2535,2536,2539],{},"a ",[849,2537,2538],{},"summary"," of at most 100 characters;",[922,2541,2542,2545],{},[849,2543,2544],{},"rounds_completed",", from 1 through 3;",[922,2547,2548,1322,2551,963,2554,963,2557,963,2560,2563,2564,2567],{},[849,2549,2550],{},"stop_reason",[849,2552,2553],{},"evidence_sufficient",[849,2555,2556],{},"diminishing_returns",[849,2558,2559],{},"result_limit",[849,2561,2562],{},"max_rounds",", or ",[849,2565,2566],{},"no_candidates",";",[922,2569,2570,2571,2573],{},"at most ten ",[849,2572,36],{},", each with one canonical company ID, one to ten unique canonical signal IDs, one to three source URLs, and zero to three evidence gaps;",[922,2575,2576,2577,2580,2581,2584,2585,1126,2587,817],{},"at most three ",[849,2578,2579],{},"unresolved"," candidates, each with one to three sources, one to three ",[849,2582,2583],{},"evidence"," notes, and the reason ",[849,2586,2579],{},[849,2588,2589],{},"conflict",[806,2591,2592,2593,2595,2596,2598],{},"An unresolved or conflicting identity cannot enter ",[849,2594,36],{},". It stays in ",[849,2597,2579],{},". A company or signal without source evidence cannot enter the result. The result uses no extra fields and stays inside the 32 KiB Run result limit.",[806,2600,2601,2602,2604],{},"A runtime or Policy ceiling can stop the segment before the Agent returns this object. That path reports the exact ",[849,2603,2488],{}," from the runtime. It does not create an incomplete structured result.",[829,2606,2608],{"id":2607},"deterministic-processing-between-rounds","Deterministic processing between rounds",[806,2610,2611],{},"Reasoning may be agentic. Identity and duplicate handling should not be.",[806,2613,2614],{},"Between batches use deterministic domain services\u002FTools for:",[1209,2616,2617,2620,2623,2626,2629,2632,2635],{},[922,2618,2619],{},"canonical company\u002Fdomain normalization;",[922,2621,2622],{},"company and person entity resolution;",[922,2624,2625],{},"deduplication across providers and queries;",[922,2627,2628],{},"signal\u002Fevidence clustering and deduplication;",[922,2630,2631],{},"freshness comparison and provenance retention;",[922,2633,2634],{},"CRM lookup and existing-state projection;",[922,2636,2637],{},"duplicate-safe Intelligence\u002FProspect writes.",[806,2639,2640],{},"Do not ask the model whether two rows with the same canonical domain or known person identity are separate entities when deterministic resolution can answer it.",[904,2642,2644],{"id":2643},"identity-and-cluster-contract","Identity and cluster contract",[806,2646,2647,2648,2650,2651,2653,2654,817],{},"Use conservative strong keys. A company first uses its exact normalized domain. One domain resolves the company. Different domains return ",[849,2649,2589],{},". When no domain exists, one organization LinkedIn key resolves the company. Different organization LinkedIn keys return ",[849,2652,2589],{},". A person uses one normalized LinkedIn profile key. Different profile keys return ",[849,2655,2589],{},[806,2657,2658,2659,2661],{},"Names, email addresses and brand roots are evidence. They are not entity keys. A missing strong key returns ",[849,2660,2579],{},". The resolver does not select one key from a conflict.",[806,2663,2664],{},"Every resolved signal observation carries:",[1209,2666,2667,2670,2673,2676,2679,2682],{},[922,2668,2669],{},"one canonical subject key;",[922,2671,2672],{},"one signal type;",[922,2674,2675],{},"one source-independent event key;",[922,2677,2678],{},"one source reference;",[922,2680,2681],{},"the observed and fetched times when known;",[922,2683,2684],{},"one or more claims.",[806,2686,2687,2688,2690,2691,2693],{},"The subject key, signal type and event key identify one cluster. A UTC date alone cannot identify an event. Two distinct events on the same date must stay separate. A missing subject stays ",[849,2689,2579],{},". A conflicting subject stays ",[849,2692,2589],{},". Neither subject can form a resolved cluster.",[806,2695,2696,2697,2700],{},"The Intelligence write boundary keeps the same identity. It derives ",[849,2698,2699],{},"dedup_key"," from the canonical subject, signal type and event key. A repeated cluster returns the existing signal and adds only new source links. It never derives event identity from the observed date.",[806,2702,2703,2704,817],{},"A cluster deduplicates source references and keeps each distinct claim. A newer claim does not remove an older conflicting claim. Freshness compares valid timestamps in UTC. Missing or invalid time returns ",[849,2705,2706],{},"unknown",[806,2708,2709],{},"Resolution and clustering are pure batch operations. Reordering or repeating the same input must not change the result. The operations must not mutate their input.",[829,2711,2713],{"id":2712},"light-scan-then-deep-scan","Light scan, then deep scan",[806,2715,2716],{},"Use bounded signal verification on selected candidates. This section does not define a Deep enrichment preset.\nCompany and People Enrich support only the Basic and Standard field sets.\nDo not fully enrich every candidate.",[841,2718,2721],{"className":2719,"code":2720,"language":846,"meta":847},[844],"many candidate companies\n      │\n      ▼\nlight evidence + basic fit\n      │\n      ▼\nrank \u002F prune\n      │\n      ▼\ndeep company verification on strongest \u002F ambiguous candidates\n      │\n      ▼\npeople discovery only for bounded top companies\n      │\n      ▼\ncontact enrichment \u002F verification only where useful\n",[849,2722,2720],{"__ignoreMap":847},[806,2724,2725],{},"A broad search might cheaply scan dozens of companies, deeply research only the strongest subset, then search people inside those companies.",[806,2727,2728,2729,813,2732,2735,2736,817],{},"The limits are product configuration, and two of them are declared on the workflow rather than chosen at run time. The people discovery step is a fan out, so it carries ",[849,2730,2731],{},"max_fanout",[849,2733,2734],{},"fanout_concurrency",": the first bounds the step against the Inngest step budget, and the second bounds how hard the step hits a search vendor at one instant. See ",[837,2737,2738],{"href":365},"runtime definitions",[806,2740,2741],{},"They are configuration, not a new execution mechanism.",[829,2743,2745],{"id":2744},"people-discovery-is-part-of-the-same-prospect","People discovery is part of the same prospect",[806,2747,2748],{},"Signals attaches relevant people to each opportunity. Standalone People Search also exists as a separate Phase 7 product capability.",[806,2750,2751],{},"The mechanics below describe the Phase 4 research baseline. Phase 7 keeps the web discovery and replaces private identity, enrichment, contact and attachment decisions with the child composition above.\nIdentity gates, candidate bounds, verification meaning and prospect attachment remain required.",[806,2753,2754],{},"For each bounded company that survives company\u002Fsignal qualification:",[841,2756,2759],{"className":2757,"code":2758,"language":846,"meta":847},[844],"company + buyer persona\n  -> find candidate people\n  -> resolve\u002Fdedupe identity against Intelligence + CRM + current batch\n  -> cap the merged candidate observations\n  -> score\u002Fexplain persona fit\n  -> verify available contact data for selected people\n  -> attach relevant people to the Organization Prospect\n",[849,2760,2758],{"__ignoreMap":847},[806,2762,2763,2764,2768,2769,963,2772,963,2775,2778,2779,2781],{},"The persona uses the ",[837,2765,2767],{"href":2766},"#shared-persona-contract","shared contract",".\nLegacy ",[849,2770,2771],{},"title",[849,2773,2774],{},"title_family",[849,2776,2777],{},"function"," and free-text ",[849,2780,978],{}," are not new Signals inputs.",[806,2783,2784,2786],{},[849,2785,1638],{}," runs one company and provider pair per call. The workflow owns the bounded fan out across companies and providers. This keeps each paid vendor call linked to one tool span and one usage row.",[806,2788,2789,2790,813,2793,2796],{},"The workflow fans in every provider call before People Search. A fan-out item returns ",[849,2791,2792],{},"ok",[849,2794,2795],{},"data"," only. It does not echo its own arguments, so position is the only link back to the company and provider pair. One deterministic step reads the argument list and result list together, preserves each observation as one supplied input, and joins them by position. Each provider has a fixed position in the fan-out input, and each result keeps its provider and result positions. The earliest position pair ranks an observation, and the normalized profile key is the final sort value. People Search owns identity merging and the deterministic persona gate. The child input can contain at most 32 KB and at most 25 candidate observations for each company. A candidate without a valid profile key stays unresolved and cannot enter People Search in V1.",[806,2798,2799],{},"The persona-fit agent runs once for one bounded set of at most three companies. A workflow has no loop and an agent step has width one, so one Run covers every kept company. The deterministic input separates candidates by prospect and preserves stable Search result IDs. The agent returns structured judgments only. It does not call discovery, contact, Intelligence or Prospect Tools.",[806,2801,2802],{},"People Enrich owns profile writes, email lookup and safe verification. The deterministic attachment step maps only settled Enrich results into the three prospect contact states. It never constructs or stores an address.",[806,2804,2805,2806,2808],{},"A company with no matching person is still a valid company prospect; it carries a clear ",[849,2807,1121],{}," result rather than disappearing.",[829,2810,2812],{"id":2811},"two-scores-separate-meanings","Two scores, separate meanings",[806,2814,2815],{},"Do not collapse evidence strength and customer fit into one number.",[1150,2817,2818,2830],{},[1153,2819,2820],{},[1156,2821,2822,2825,2828],{},[1159,2823,2824],{},"Score",[1159,2826,2827],{},"Scope",[1159,2829,1983],{},[1169,2831,2832,2848],{},[1156,2833,2834,2839,2842],{},[1174,2835,2836],{},[810,2837,2838],{},"Signal score",[1174,2840,2841],{},"Organization Prospect signal",[1174,2843,2844,2845,2847],{},"How well does the linked evidence support this observed event at the frozen ",[849,2846,1392],{}," time?",[1156,2849,2850,2855,2857],{},[1174,2851,2852],{},[810,2853,2854],{},"Lead \u002F opportunity score",[1174,2856,823],{},[1174,2858,2859],{},"Given this organization's ICP and context, how valuable is acting on this company now?",[806,2861,2862],{},"Two tool-less scoring agents enforce the boundary through their inputs:",[1209,2864,2865,2871],{},[922,2866,2867,2868,2870],{},"The signal agent receives the Intelligence signal, its linked sources and ",[849,2869,1392],{},". It receives no ICP, persona, Knowledge or opportunity data. Relevance means direct support for the event. It does not mean customer fit.",[922,2872,2873],{},"The opportunity agent receives the brief criteria, company facts and resolved signal grades. A resolved grade is new output or a stored grade. The agent does not read Knowledge. Persona fit stays separate from both V1 scores.",[806,2875,2876],{},"Both agents return bounded structured output. Scores use one 0-100 scale: 0-39 weak, 40-69 moderate and 70-100 strong. An explicit hard ICP mismatch caps the opportunity score at 39. A strong-fit company with a moderate signal can therefore outrank a poor-fit company with a strong signal.",[806,2878,2879],{},"One scoring batch contains at most ten companies and ten signals for each company. Each compact signal keeps at most three sources and three evidence statements. A reason and a recommended action each contain at most 200 characters.",[806,2881,2882],{},"A scoring batch may be empty, and an empty batch answers an empty result. A workflow has no loop and no way to skip a node and still feed the node after it, so a retry that reuses every stored grade, and a search that resolves no company, both reach the scorer with nothing to grade.",[806,2884,2885,2886,2889],{},"The workflow scores only an ungraded signal. It reuses the stored grade when a retry or another search finds the same organization and ",[849,2887,2888],{},"intel_signal_id",". This keeps the immutable grade stable when model output or the brief changes. The grade is a first-observation snapshot. The review shows current evidence freshness separately. A new Intelligence signal gets a new grade.",[806,2891,2892],{},"Missing linked source evidence refuses a signal score. Missing ICP and company criteria refuses an opportunity score. A scorer never substitutes a Knowledge source or an inferred default.",[806,2894,2895],{},"Every score keeps a short reason. Every opportunity keeps one short recommended next action. The action is a recommendation and causes no side effect.",[829,2897,2899],{"id":2898},"result-shape","Result shape",[806,2901,2902,2903,2905],{},"The workflow returns results grouped around the ",[810,2904,823],{},", not separate company and people products.",[841,2907,2910],{"className":2908,"code":2909,"language":846,"meta":847},[844],"Organization Prospect\n  company\n    name \u002F domain \u002F location \u002F size\n    fit + opportunity score + reason\n    CRM state\n\n  signals\n    signal score + reason\n    evidence + provenance + freshness\n\n  relevant people\n    Person A: role, seniority, location, persona-fit reason,\n              evidence, contact verification state\n    Person B: ...\n\n  review state\n    new \u002F watching \u002F dismissed \u002F promoted\n\n  recommended next action\n",[849,2911,2909],{"__ignoreMap":847},[806,2913,2914],{},"The result should be useful without opening raw Run traces.",[806,2916,1283,2917,2920,2921,2924,2925,2928,2929,2932,2933,2935,2936,2938],{},[849,2918,2919],{},"prospect"," ref kind names one ",[849,2922,2923],{},"public.prospects"," row. The future ",[849,2926,2927],{},"prospect.person"," kind names one ",[849,2930,2931],{},"public.prospect_people"," row. A discovery Run reports ready company results with ",[849,2934,2919],{}," refs. A selected person can move to outreach with a ",[849,2937,2927],{}," ref before CRM promotion.",[829,2940,2942],{"id":2941},"incremental-results","Incremental results",[806,2944,2945],{},"Signals Search streams useful stable updates while later work continues.",[841,2947,2950],{"className":2948,"code":2949,"language":846,"meta":847},[844],"company discovered\u002Fresolved\n  -> preliminary evidence\n  -> signal\u002Ffit updated\n  -> company verified\n  -> relevant people discovered\n  -> contact\u002Fperson evidence improved\n  -> final prospect ready\n",[849,2951,2949],{"__ignoreMap":847},[806,2953,2954],{},"The same visible prospect card may improve during the Run. SSE is live transport; durable Intelligence, Prospect rows, Runs and spans remain the record.",[806,2956,2957,2958,2961,2962,2964,2965,963,2968,963,2971,813,2973,2976,2977,2980],{},"Each successful prospect write Tool reads the current durable ",[849,2959,2960],{},"ProspectSummary"," and publishes it as ",[849,2963,1132],{},". This includes ",[849,2966,2967],{},"prospect.upsert",[849,2969,2970],{},"prospect.attach_people",[849,2972,1836],{},[849,2974,2975],{},"prospect.set_review_state",". A batch publishes one event for each changed prospect. The event uses the prospect id as its stable item key and ",[849,2978,2979],{},"updated_at"," as its revision. A repeated, lost or out-of-order event cannot change the durable result.",[829,2982,2984],{"id":2983},"saved-search-and-smart-feed","Saved search and Smart Feed",[806,2986,2987],{},"The discovery surface keeps product state needed for repeat use:",[1209,2989,2990,2993,2996,2999,3002,3005,3008,3011,3014],{},[922,2991,2992],{},"saved discovery query \u002F ICP reference;",[922,2994,2995],{},"Search History;",[922,2997,2998],{},"companies already surfaced for that search;",[922,3000,3001],{},"review state: new \u002F watching \u002F dismissed \u002F promoted;",[922,3003,3004],{},"evidence and signal references;",[922,3006,3007],{},"latest signal score;",[922,3009,3010],{},"latest opportunity score and reasons;",[922,3012,3013],{},"relevant people snapshot\u002Freference set;",[922,3015,3016],{},"Smart Feed diff state.",[806,3018,3019,3020,3023],{},"The Smart Feed emphasizes ",[810,3021,3022],{},"diffs",": new prospects, new signals, new relevant people, materially changed evidence or meaningful score changes. A scheduled Run must not replay the same unchanged list.",[806,3025,3026],{},"V1 serves the diff for the latest published successful Run. Each Run writes\nimmutable observation rows and compares them with the published Run that its\ninput names. Only one Run can publish from a given baseline. A successful\noverlapping Run whose baseline became stale remains in Run Explorer and does\nnot replay the same delta. The API accepts no historical Run id, and the\nobservation-row retention period is not a product promise. Run Explorer remains\nthe product Run-history surface.",[829,3028,3030],{"id":3029},"scheduled-monitoring","Scheduled monitoring",[806,3032,3033],{},"A saved search may own a Trigger. The Trigger starts the same published Signals Search workflow used by an active search.",[841,3035,3038],{"className":3036,"code":3037,"language":846,"meta":847},[844],"saved search + schedule\n  -> Trigger\n  -> RunManager\n  -> Signals Search\n  -> compare with existing Intelligence \u002F Prospect state\n  -> Smart Feed: new or materially changed opportunities\n",[849,3039,3037],{"__ignoreMap":847},[806,3041,3042],{},"There is no product-specific scheduler.",[806,3044,3045,3048,3049,3052,3053,3056,3057,3060],{},[810,3046,3047],{},"The Trigger cannot carry the baseline in a static template."," A Run publishes\na Smart Feed diff only when ",[849,3050,3051],{},"run.input['baseline_run_id']"," equals the saved\nsearch's current ",[849,3054,3055],{},"last_run_id",", and that value changes on every run. A fixed\ntemplate therefore publishes once and answers ",[849,3058,3059],{},"stale"," for ever after.",[806,3062,3063,3064,3067],{},"The trigger row names the ",[849,3065,3066],{},"saved_search"," input builder instead. The builder\nreads the saved search at dispatch and returns the same frozen input the\ninteractive start route builds.",[841,3069,3073],{"className":3070,"code":3071,"language":3072,"meta":847,"style":847},"language-python shiki shiki-themes github-dark","{'source': 'saved_search',\n 'saved_search_id': str(search.id),\n 'baseline_run_id': str(search.last_run_id) if search.last_run_id else None,\n 'brief': search.brief}\n","python",[849,3074,3075,3080,3085,3090],{"__ignoreMap":847},[1307,3076,3077],{"class":1309,"line":22},[1307,3078,3079],{},"{'source': 'saved_search',\n",[1307,3081,3082],{"class":1309,"line":32},[1307,3083,3084],{}," 'saved_search_id': str(search.id),\n",[1307,3086,3087],{"class":1309,"line":233},[1307,3088,3089],{}," 'baseline_run_id': str(search.last_run_id) if search.last_run_id else None,\n",[1307,3091,3092],{"class":1309,"line":244},[1307,3093,3094],{}," 'brief': search.brief}\n",[806,3096,3097,3098,817],{},"The builder lives with this product and registers itself. The trigger layer\nimports the registry alone. See ",[837,3099,266],{"href":261},[829,3101,3103],{"id":3102},"signal-driven-refresh","Signal-driven refresh",[806,3105,3106],{},"Signals may arrive for watched prospects or existing CRM entities.",[841,3108,3111],{"className":3109,"code":3110,"language":846,"meta":847},[844],"new evidence \u002F signal\n  -> normalize + signal dedupe\n  -> update Intelligence\n  -> evaluate organization relevance\n  -> targeted verification when needed\n  -> refresh relevant people only when stale\u002Fmissing\u002Fmaterially affected\n  -> update Prospect \u002F Smart Feed\n     or recommend action on existing CRM entity\n",[849,3112,3110],{"__ignoreMap":847},[806,3114,3115],{},"Do not rerun a broad discovery workflow when one targeted verification or people refresh is enough.",[829,3117,3119],{"id":3118},"agent-workflow-skill-tool-shape","Agent \u002F Workflow \u002F Skill \u002F Tool shape",[806,3121,3122,3123,3126],{},"A clean V1 shape is one published ",[810,3124,3125],{},"Signals Search Workflow Definition"," coordinating bounded deterministic stages, with reasoning inside focused Agents.",[806,3128,3129],{},"Example internal responsibilities:",[1150,3131,3132,3142],{},[1153,3133,3134],{},[1156,3135,3136,3139],{},[1159,3137,3138],{},"Unit",[1159,3140,3141],{},"Responsibility",[1169,3143,3144,3152,3160,3168,3176,3184,3192,3200],{},[1156,3145,3146,3149],{},[1174,3147,3148],{},"Company\u002Fsignals Agent",[1174,3150,3151],{},"search strategy, evidence gaps and canonical company\u002Fsignal references",[1156,3153,3154,3157],{},[1174,3155,3156],{},"Signal scoring Agent",[1174,3158,3159],{},"evidence strength and freshness for each ungraded signal",[1156,3161,3162,3165],{},[1174,3163,3164],{},"Opportunity scoring Agent",[1174,3166,3167],{},"company value from the brief, company facts and resolved signal grades",[1156,3169,3170,3173],{},[1174,3171,3172],{},"People Agent",[1174,3174,3175],{},"tool-less persona-fit judgment after supplied People Search",[1156,3177,3178,3181],{},[1174,3179,3180],{},"Deterministic steps",[1174,3182,3183],{},"normalization, entity resolution, dedupe, limits, fan-out\u002Ffan-in",[1156,3185,3186,3189],{},[1174,3187,3188],{},"Skills",[1174,3190,3191],{},"discover companies, search signals and verify evidence",[1156,3193,3194,3197],{},[1174,3195,3196],{},"Capability children",[1174,3198,3199],{},"company\u002Fpeople search and enrichment, including requested email completion",[1156,3201,3202,3205],{},[1174,3203,3204],{},"Tools",[1174,3206,3207],{},"signal research, scoped CRM reads, Intelligence\u002FProspect persistence and provenance; no CRM writes",[806,3209,3210],{},"The workflow defines order and bounded fan-out. Agents reason inside steps. Tools own safe effects, credentials, policy checks, idempotency, vendor limits and result limits.",[806,3212,3213],{},"Do not create a separate Sonar runtime, Headhunter runtime, people database or discovery queue.",[829,3215,3217],{"id":3216},"prospect-write-contract","Prospect write contract",[806,3219,3220,3221,3224],{},"V1 has three model-facing prospect write tools and three workflow-only batch\nwrites. Each tool declares ",[849,3222,3223],{},"repeatable = False",". A repeated call returns the\nfirst result through the tool journal.",[1150,3226,3227,3236],{},[1153,3228,3229],{},[1156,3230,3231,3233],{},[1159,3232,1977],{},[1159,3234,3235],{},"Contract",[1169,3237,3238,3255,3264,3287,3299,3308],{},[1156,3239,3240,3244],{},[1174,3241,3242],{},[849,3243,2967],{},[1174,3245,3246,3247,3250,3251,3254],{},"Resolve one ",[849,3248,3249],{},"(organization_id, intel_company_id)"," row. Upsert at most 25 signal grades. Preserve ",[849,3252,3253],{},"first_seen_at",", CRM references and review state.",[1156,3256,3257,3261],{},[1174,3258,3259],{},[849,3260,2970],{},[1174,3262,3263],{},"Add or improve at most 25 relevant people. An empty list requires a reason and is valid only when the prospect has no person row.",[1156,3265,3266,3270],{},[1174,3267,3268],{},[849,3269,2975],{},[1174,3271,3272,3273,963,3276,1126,3279,3282,3283,3286],{},"Set ",[849,3274,3275],{},"new",[849,3277,3278],{},"watching",[849,3280,3281],{},"dismissed",". Refuse ",[849,3284,3285],{},"promoted",", because the promotion tool owns that state.",[1156,3288,3289,3293],{},[1174,3290,3291],{},[849,3292,1609],{},[1174,3294,3295,3296,3298],{},"Rank scored companies, prune them to the result limit, then apply the ",[849,3297,2967],{}," contract to at most ten of them in one call. It returns one ordered row for each kept company. No Agent declares it.",[1156,3300,3301,3305],{},[1174,3302,3303],{},[849,3304,1054],{},[1174,3306,3307],{},"Persist original source observations for at most 75 selected people in stable order. Reuse the existing Intelligence person service, return canonical IDs and refuse identity changes. No Agent declares it.",[1156,3309,3310,3314],{},[1174,3311,3312],{},[849,3313,1836],{},[1174,3315,3316],{},"Apply a found, complete-empty or partial-pending people outcome to at most three prospects in stable order. It returns one row for each attempted prospect and emits one item-ready event for each changed row. No Agent declares it.",[806,3318,3319,3322,3323,3325],{},[810,3320,3321],{},"Why batch writes, and not a write fan out."," A wide step must be read\nonly, because a partial write has no recovery rule yet. A batch write inside\none step needs no new rule. Each row keys on ",[849,3324,3249],{}," and is idempotent on its own, and the invoker releases the\nidempotency claim when a handler raises. A retry therefore repeats the whole\nbatch and resolves the same rows. The handler writes each row independently. It\nnever opens one transaction over the batch.",[806,3327,3328,3330,3331,3334,3335,3337,3338,3341],{},[849,3329,1609],{}," deduplicates by ",[849,3332,3333],{},"intel_company_id"," before it writes.\nThe company and signals Agent result marks its ",[849,3336,36],{}," array\n",[849,3339,3340],{},"uniqueItems",", and that rule compares whole objects. Two entries that name one\ncompany with different sources both satisfy it.",[806,3343,3344,3345,3348,3349,3351],{},"The invocation supplies the organization and Run. No tool argument supplies\neither value. A signal score requires its short reason. A people batch with\nitems sets ",[849,3346,3347],{},"people_state"," to ",[849,3350,1125],{}," and clears the empty reason.",[806,3353,3354,3355,3357,3358,3361],{},"The workflow fans in before each batch write. Each prospect and person write\nincludes the time of its source observation. A newer observation can replace\nits score, reason and contact state. An older observation cannot. Equal-time\nwrites must have the same values or the tool refuses the conflict. The write\nkeeps ",[849,3356,3253],{}," and advances ",[849,3359,3360],{},"last_seen_at"," only to the greater value.",[806,3363,3364,3365,3367],{},"A signal grade is immutable for one ",[849,3366,2888],{},", because that identity\nnames one observed event. A repeated grade must have the same values. A\ncorrection creates a new Intelligence signal instead of changing the old\nevent. Before scoring, the workflow reads existing prospect signal grades and\npasses only ungraded signals to the signal agent. A retry or another search\nreuses the stored grade. These rules make the merge independent of Run\ncompletion order.",[806,3369,3370,3371,3373,3374,3376,3377,3379,3380,3383],{},"People attachment is additive in V1. The workflow can write an empty result\nonly after every bounded provider call for that prospect succeeds and People\nSearch settles each owned input. A partial outcome with no usable person keeps\n",[849,3372,1102],{}," and writes the exact failure reason only while the\nstored state is still pending. It cannot regress an existing ",[849,3375,1125],{}," or\n",[849,3378,1121],{}," state. The batch carries\none result record for each provider search of that prospect. Its result count\nrecords the candidates that the search found. It can be positive when no\ncandidate matches the buyer persona. ",[849,3381,3382],{},"people_state_reason"," is required plain\ntext, not a second state enum.",[806,3385,3386,3387,1126,3390,3392,3393,3395,3396,3398,3399,3401],{},"The empty path first confirms that the prospect has no person row. It then\nupdates only a ",[849,3388,3389],{},"pending",[849,3391,1121],{}," prospect. A non-empty path\nwrites ",[849,3394,1125],{}," after its people rows. Therefore, ",[849,3397,1125],{}," wins a concurrent\nempty write. An empty result never deletes an earlier person result.\nA partial-pending path also confirms that the prospect has no person row, then\nupdates only ",[849,3400,1102],{},". If that compare-and-set changes no row,\nit reads and preserves the current complete state.",[806,3403,3404,3405,3408],{},"The tool handlers and the product endpoints call one platform-local prospect\nservice. A product endpoint never passes through ",[849,3406,3407],{},"ToolInvoker",". Prospect curation writes\nproduct state and does not write an approval row by itself.",[829,3410,3412],{"id":3411},"crm-promotion","CRM promotion",[806,3414,3415],{},"Promotion is explicit and can happen after the combined prospect is reviewed.",[841,3417,3420],{"className":3418,"code":3419,"language":846,"meta":847},[844],"Organization Prospect\n  + selected relevant people\n  -> user \u002F policy-approved promotion\n  -> CRM domain Tools\n  -> canonical company upsert \u002F resolve\n  -> selected person upserts \u002F relationships\n  -> optional list membership\n  -> CRM references returned\n",[849,3421,3419],{"__ignoreMap":847},[806,3423,3424],{},"If company\u002Fperson records already exist, promotion resolves to the canonical records. Discovery never silently populates CRM merely because a company or person was found.",[806,3426,3427,3428,3430],{},"Promotion uses recovery, not a business-logic database function. It writes\neach canonical CRM reference after its idempotent upsert. It sets the prospect\nstate to ",[849,3429,3285],{}," only after every selected reference is linked. A retry\nresolves the same CRM rows and completes the missing links. A partial attempt\ncan leave canonical CRM rows present while the prospect keeps its earlier\nreview state.",[806,3432,3433,3434,3437,3438,3441],{},"Two callers share one promotion service: the ",[849,3435,3436],{},"prospect.promote"," tool, and\n",[849,3439,3440],{},"POST \u002Fapi\u002Fv1\u002Fagentic\u002Fprospects\u002F{id}\u002Fpromote",". A person promotes over the\nroute and an agent promotes over the tool, and the two cannot diverge. The\noptional list receives the company. A selected person who already holds a\ndifferent CRM company link is a conflict that names that person; the reviewer\ndeselects that person and retries.",[806,3443,3444],{},"Existing CRM companies may use Signals Search without re-promoting the company; newly discovered people still require the normal explicit\u002Fdomain write path when the organization chooses to manage them.",[829,3446,3448],{"id":3447},"outreach-handoff","Outreach handoff",[841,3450,3453],{"className":3451,"code":3452,"language":846,"meta":847},[844],"selected relevant people\n  + canonical company\u002Fperson context\n  + current signals \u002F prospect reasons\n  -> email sequence workflow\n  -> personalized draft(s) -> approval -> send\n",[849,3454,3452],{"__ignoreMap":847},[806,3456,3457],{},"The handoff may use Intelligence\u002FProspect identities when records are not yet promoted, plus CRM references when available. It does not require premature CRM creation and does not copy prompt blobs into another product store.",[829,3459,3461],{"id":3460},"failure-edge-cases","Failure \u002F edge cases",[1150,3463,3464,3474],{},[1153,3465,3466],{},[1156,3467,3468,3471],{},[1159,3469,3470],{},"Case",[1159,3472,3473],{},"Behavior",[1169,3475,3476,3484,3492,3500,3508,3516,3524,3532,3540,3551,3559,3567,3575],{},[1156,3477,3478,3481],{},[1174,3479,3480],{},"Same company returned by multiple searches",[1174,3482,3483],{},"one canonical entity; merge evidence\u002Fprovenance",[1156,3485,3486,3489],{},[1174,3487,3488],{},"Same signal appears in several sources",[1174,3490,3491],{},"one logical signal\u002Fevidence cluster with source references",[1156,3493,3494,3497],{},[1174,3495,3496],{},"Duplicate person found from several sources",[1174,3498,3499],{},"merge\u002Fdedupe and preserve provenance",[1156,3501,3502,3505],{},[1174,3503,3504],{},"Company already exists in CRM",[1174,3506,3507],{},"project CRM state; update Intelligence; never duplicate company",[1156,3509,3510,3513],{},[1174,3511,3512],{},"Person already exists in CRM",[1174,3514,3515],{},"resolve canonical person; do not duplicate on promotion",[1156,3517,3518,3521],{},[1174,3519,3520],{},"Company has no matching people",[1174,3522,3523],{},"keep company prospect with explicit empty people result",[1156,3525,3526,3529],{},[1174,3527,3528],{},"Contact data cannot be verified",[1174,3530,3531],{},"keep person; mark verification state; never fabricate",[1156,3533,3534,3537],{},[1174,3535,3536],{},"One candidate\u002Fcompany fails",[1174,3538,3539],{},"independent candidates continue unless workflow semantics require stop",[1156,3541,3542,3545],{},[1174,3543,3544],{},"CSV\u002Fimported company cannot be resolved",[1174,3546,3547,3548,3550],{},"the scope step reports it in ",[849,3549,2269],{},"; no entity is created for it",[1156,3552,3553,3556],{},[1174,3554,3555],{},"Evidence conflicts",[1174,3557,3558],{},"verification round or lower confidence; preserve disagreement",[1156,3560,3561,3564],{},[1174,3562,3563],{},"Scheduled Run finds nothing new",[1174,3565,3566],{},"successful Run with empty Smart Feed diff",[1156,3568,3569,3572],{},[1174,3570,3571],{},"Search\u002Fpersona too broad",[1174,3573,3574],{},"enforce bounded result limits; return best set \u002F ask user to narrow next Run",[1156,3576,3577,3580],{},[1174,3578,3579],{},"Budget exhausted",[1174,3581,3582,3583,3585],{},"a Run that already produced node output succeeds with ",[849,3584,2488],{}," and truncation metadata; a Run that produced none fails and still names the clock",[829,3587,3589],{"id":3588},"v1-rules","V1 rules",[1209,3591,3592,3598,3601,3604,3607,3610,3613,3616,3623,3626,3629,3635],{},[922,3593,3594,3595,3597],{},"One canonical ",[810,3596,352],{}," workflow replaces separate Sonar and Headhunter execution flows.",[922,3599,3600],{},"Company discovery, signal research and relevant-people discovery produce one Organization Prospect result.",[922,3602,3603],{},"Search is bounded to at most three purposeful research rounds.",[922,3605,3606],{},"Use light signal research before selective verification. Company\u002FPeople enrichment uses only Basic or Standard targets.",[922,3608,3609],{},"Entity resolution, dedupe, provenance and CRM identity projection are deterministic.",[922,3611,3612],{},"Signals are evidence, not leads; signal score and opportunity score remain separate.",[922,3614,3615],{},"A discovered company\u002Fperson is not automatically a CRM record.",[922,3617,3618,3619,3622],{},"Scheduled work uses Trigger + ",[849,3620,3621],{},"RunManager"," + Inngest.",[922,3624,3625],{},"Stream useful partial prospect updates.",[922,3627,3628],{},"CRM promotion is explicit and idempotent through CRM Tools.",[922,3630,3631,3632,817],{},"A separate explicit Phase 8 action can hand selected people to the ",[837,3633,3634],{"href":332},"email sequence workflow",[922,3636,3637],{},"No Sonar→Headhunter Run chaining, separate discovery scheduler, people database, queue or runtime.",[829,3639,3641],{"id":3640},"minimum-scenarios","Minimum scenarios",[1150,3643,3644,3654],{},[1153,3645,3646],{},[1156,3647,3648,3651],{},[1159,3649,3650],{},"Scenario",[1159,3652,3653],{},"Expected behavior",[1169,3655,3656,3664,3672,3680,3688,3699,3707,3715,3723,3733,3744,3752],{},[1156,3657,3658,3661],{},[1174,3659,3660],{},"Broad ICP search",[1174,3662,3663],{},"bounded company\u002Fsignal rounds → strongest companies → relevant people → combined prospect results; no CRM writes",[1156,3665,3666,3669],{},[1174,3667,3668],{},"Existing CRM target list",[1174,3670,3671],{},"skip broad company discovery; refresh signals + relevant people against canonical CRM companies; no company outside the set becomes a prospect",[1156,3673,3674,3677],{},[1174,3675,3676],{},"Same company from five searches",[1174,3678,3679],{},"one normalized entity with merged evidence, not five prospects",[1156,3681,3682,3685],{},[1174,3683,3684],{},"Strong funding signal on poor-fit company",[1174,3686,3687],{},"high signal score may coexist with low opportunity score; people search may be skipped after pruning",[1156,3689,3690,3693],{},[1174,3691,3692],{},"Strong-fit company with no people found",[1174,3694,3695,3696,3698],{},"prospect remains reviewable with ",[849,3697,1121],{}," state",[1156,3700,3701,3704],{},[1174,3702,3703],{},"Person found by three providers",[1174,3705,3706],{},"one person result with merged provenance\u002Fcontact state",[1156,3708,3709,3712],{},[1174,3710,3711],{},"New signal on existing CRM customer",[1174,3713,3714],{},"update Intelligence and recommend action against existing CRM entity; no duplicate CRM record",[1156,3716,3717,3720],{},[1174,3718,3719],{},"Scheduled run finds no material change",[1174,3721,3722],{},"success with no Smart Feed additions",[1156,3724,3725,3728],{},[1174,3726,3727],{},"Discovery or company-set Run reaches the final node",[1174,3729,3730,3732],{},[849,3731,2172],{},"; no publication rows are read or written",[1156,3734,3735,3738],{},[1174,3736,3737],{},"Another Run writes during the final saved-search read",[1174,3739,3740,3741,3743],{},"one ready snapshot or ",[849,3742,473],{},"; never mixed prospect state",[1156,3745,3746,3749],{},[1174,3747,3748],{},"User promotes prospect + two people",[1174,3750,3751],{},"idempotent CRM Tools resolve\u002Fcreate canonical company and selected people only",[1156,3753,3754,3757],{},[1174,3755,3756],{},"User selects person for outreach before CRM promotion",[1174,3758,3759],{},"the email sequence workflow can use authorized Intelligence\u002FProspect context; CRM creation is not forced",[3761,3762,3763],"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":847,"searchDepth":32,"depth":233,"links":3765},[3766,3767,3771,3776,3782,3785,3788,3789,3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802],{"id":831,"depth":32,"text":832},{"id":859,"depth":32,"text":860,"children":3768},[3769,3770],{"id":906,"depth":233,"text":907},{"id":1014,"depth":233,"text":1015},{"id":1144,"depth":32,"text":1145,"children":3772},[3773,3774,3775],{"id":1243,"depth":233,"text":1244},{"id":1273,"depth":233,"text":1274},{"id":1294,"depth":233,"text":1295},{"id":1396,"depth":32,"text":1397,"children":3777},[3778,3779,3780,3781],{"id":1419,"depth":233,"text":1420},{"id":2183,"depth":233,"text":2184},{"id":2325,"depth":233,"text":2326},{"id":2386,"depth":233,"text":2387},{"id":2408,"depth":32,"text":2409,"children":3783},[3784],{"id":2492,"depth":233,"text":2493},{"id":2607,"depth":32,"text":2608,"children":3786},[3787],{"id":2643,"depth":233,"text":2644},{"id":2712,"depth":32,"text":2713},{"id":2744,"depth":32,"text":2745},{"id":2811,"depth":32,"text":2812},{"id":2898,"depth":32,"text":2899},{"id":2941,"depth":32,"text":2942},{"id":2983,"depth":32,"text":2984},{"id":3029,"depth":32,"text":3030},{"id":3102,"depth":32,"text":3103},{"id":3118,"depth":32,"text":3119},{"id":3216,"depth":32,"text":3217},{"id":3411,"depth":32,"text":3412},{"id":3447,"depth":32,"text":3448},{"id":3460,"depth":32,"text":3461},{"id":3588,"depth":32,"text":3589},{"id":3640,"depth":32,"text":3641},"md",{},true,{"title":352,"description":353},"engineering\u002Fsystem-design\u002Fagentic-platform\u002Fproducts\u002Fsignals-search",[303,355,36,119,51,302,256,11,35],"PiSi7MvakDZzuRMsG1A_dz9JiqaxDtTAJcgTxNrC1oU",1788650195101]