{"collectionById":{"ae4ddc7c-d16f-497a-8ca5-c44ef0ea38f4":{"id":"ae4ddc7c-d16f-497a-8ca5-c44ef0ea38f4","name":"Blog","fieldSchemas":[{"id":"42b6c1cc-d636-4b0b-a42f-139fc5680cd1","name":"Article thumbnail","type":"image"},{"id":"9968938c-1e5c-4555-9913-5bec74638466","name":"Category","type":"plain_text"},{"id":"a4d53820-9a8e-4129-9a19-3aeb454fe540","name":"Time to read","type":"plain_text"},{"id":"f292d9ac-ccc5-4252-a8e4-0d6491a9ba7e","name":"Description (displayed in list view)","type":"plain_text"},{"id":"ad9ef6c8-8d94-40ef-8da8-4f302b9e2eb8","name":"Article content","type":"rich_text"},{"id":"93a6d692-64a7-44d7-bce5-fac95153019d","name":"Title","type":"plain_text","role":"primary"},{"id":"0dcf8a7e-bbd6-452b-8b72-313a6860f60f","name":"Article hero image","type":"image"},{"id":"144b2a2b-75a1-44f9-9d7a-bbf54d1dfb6d","name":"Author","type":"plain_text"},{"id":"f1c0a374-a507-4949-8d40-a57b0516ebfd","name":"Article intro","type":"plain_text"},{"id":"88f20cec-9c1c-4729-8801-17487ff95253","name":"Date published","type":"date"},{"id":"b5582fba-71f0-4acb-92f8-ec8c64421de1","name":"Slug","type":"slug","role":"slug"}],"itemById":{"21f8846b-92aa-42fa-9777-421d97313dd1":{"id":"21f8846b-92aa-42fa-9777-421d97313dd1","index":"!","collectionId":"ae4ddc7c-d16f-497a-8ca5-c44ef0ea38f4","fields":[{"id":"e8e4516f-1e49-4aed-b6d6-dbf81c58081d","value":"stop-feeding-your-agent-junk-food","itemId":"21f8846b-92aa-42fa-9777-421d97313dd1","fieldSchemaId":"b5582fba-71f0-4acb-92f8-ec8c64421de1"},{"id":"82c710d7-6e28-4941-b52c-4f0f0385a1b0","value":"8 min","itemId":"21f8846b-92aa-42fa-9777-421d97313dd1","fieldSchemaId":"a4d53820-9a8e-4129-9a19-3aeb454fe540"},{"id":"13dbe189-b671-42c5-98d9-c53e00e0deb8","value":"Stop Feeding Your Agent Junk Food","itemId":"21f8846b-92aa-42fa-9777-421d97313dd1","fieldSchemaId":"93a6d692-64a7-44d7-bce5-fac95153019d"},{"id":"3a8d22ce-77b8-4f98-a328-1db2392b72bf","value":"Insights","itemId":"21f8846b-92aa-42fa-9777-421d97313dd1","fieldSchemaId":"9968938c-1e5c-4555-9913-5bec74638466"},{"id":"729f266c-45fe-4bca-8360-e4e30c1aa365","value":"Context Engineering Lessons from Manus, OpenClaw, and Lusha","itemId":"21f8846b-92aa-42fa-9777-421d97313dd1","fieldSchemaId":"f292d9ac-ccc5-4252-a8e4-0d6491a9ba7e"},{"id":"2fb50ad0-ff75-4f6c-873b-1d85a3268058","value":"{\"image\":\"cbe17c9d76df0445c9ec08de550c95ab926da852\",\"imageThumbnail\":\"2cbe371a9154d07454dec729a9bc73e5b4c61ced\",\"originalImageHeight\":884,\"originalImageWidth\":1520,\"altText\":\"\",\"fileName\":\"Stop Feeding Your Agent Junk Food.png\"}","itemId":"21f8846b-92aa-42fa-9777-421d97313dd1","fieldSchemaId":"42b6c1cc-d636-4b0b-a42f-139fc5680cd1"}]},"470c1259-80d3-4d82-aa59-9bd8e12943a6":{"id":"470c1259-80d3-4d82-aa59-9bd8e12943a6","index":"#","collectionId":"ae4ddc7c-d16f-497a-8ca5-c44ef0ea38f4","fields":[{"id":"e288762a-34ca-4e7f-a989-39e5761f7ccd","value":"Insights","itemId":"470c1259-80d3-4d82-aa59-9bd8e12943a6","fieldSchemaId":"9968938c-1e5c-4555-9913-5bec74638466"},{"id":"08e1e7af-688f-4823-9fee-71708d80a34e","value":"5 min","itemId":"470c1259-80d3-4d82-aa59-9bd8e12943a6","fieldSchemaId":"a4d53820-9a8e-4129-9a19-3aeb454fe540"},{"id":"e98b3778-64c5-4089-b29a-ca9c4e0690a7","value":"A behind-the-scenes look at our platform logic, system architecture, and sustainability reasoning.","itemId":"470c1259-80d3-4d82-aa59-9bd8e12943a6","fieldSchemaId":"f292d9ac-ccc5-4252-a8e4-0d6491a9ba7e"},{"id":"4600b7ee-1906-4fc2-8f0a-4cbd706fbfac","value":"specs-are-your-features-memory","itemId":"470c1259-80d3-4d82-aa59-9bd8e12943a6","fieldSchemaId":"b5582fba-71f0-4acb-92f8-ec8c64421de1"},{"id":"9fe0ad75-3f85-4229-b231-7838f70a6b5b","value":"Specs Are Your Feature's Memory","itemId":"470c1259-80d3-4d82-aa59-9bd8e12943a6","fieldSchemaId":"93a6d692-64a7-44d7-bce5-fac95153019d"},{"id":"8041670c-4c02-423a-a903-4e5d5377f3f6","value":"{\"image\":\"7fcfd8ef9bc7d04d9d21b4bdd4782492c67d7fd8\",\"imageThumbnail\":\"ed9f51aa6b41cefe5d301d4a0f1fa3a971658170\",\"originalImageHeight\":884,\"originalImageWidth\":1520,\"altText\":\"\",\"fileName\":\"Specs Are Your Feature's Memory.png\"}","itemId":"470c1259-80d3-4d82-aa59-9bd8e12943a6","fieldSchemaId":"42b6c1cc-d636-4b0b-a42f-139fc5680cd1"}]},"a18dbe09-cbc8-4708-8979-f19a6a375a3c":{"id":"a18dbe09-cbc8-4708-8979-f19a6a375a3c","index":"%","collectionId":"ae4ddc7c-d16f-497a-8ca5-c44ef0ea38f4","fields":[{"id":"1e2f57b2-98b1-4255-b187-8eaf537ab697","value":"Predicting the Buying Committee","itemId":"a18dbe09-cbc8-4708-8979-f19a6a375a3c","fieldSchemaId":"93a6d692-64a7-44d7-bce5-fac95153019d"},{"id":"435034fc-2539-4b83-9e17-4736789166bb","value":"The same job title means different things at different companies. Here's how we turned a noisy Salesforce table into a real-time ranking of who a sales rep should actually call first - and why the hardest decisions were architectural, not statistical.","itemId":"a18dbe09-cbc8-4708-8979-f19a6a375a3c","fieldSchemaId":"f1c0a374-a507-4949-8d40-a57b0516ebfd"},{"id":"e65e26d9-79a6-43e3-978d-7708c6df91ba","value":"2026-06-14","itemId":"a18dbe09-cbc8-4708-8979-f19a6a375a3c","fieldSchemaId":"88f20cec-9c1c-4729-8801-17487ff95253"},{"id":"5eb97fa7-02dc-4171-9360-88ebdd1c8279","value":"Stav Rozenfeld","itemId":"a18dbe09-cbc8-4708-8979-f19a6a375a3c","fieldSchemaId":"144b2a2b-75a1-44f9-9d7a-bbf54d1dfb6d"},{"id":"ecce2944-1ca5-4ec9-9c7b-1b38ee101105","value":"ML \u0026 Systems","itemId":"a18dbe09-cbc8-4708-8979-f19a6a375a3c","fieldSchemaId":"9968938c-1e5c-4555-9913-5bec74638466"},{"id":"6a5d6a07-a060-4531-aca7-08c3e51e7dfb","value":"8","itemId":"a18dbe09-cbc8-4708-8979-f19a6a375a3c","fieldSchemaId":"a4d53820-9a8e-4129-9a19-3aeb454fe540"},{"id":"d317be2e-107f-4f72-b5a4-10727669fe10","value":"{\"image\":\"2f7897714893a542dcebea80d458c0a2d095ec62\",\"imageThumbnail\":\"c5ae2518b74b288d91cc5a5637ba54da9f674521\",\"originalImageHeight\":884,\"originalImageWidth\":1520,\"altText\":\"\",\"fileName\":\"Predicting the Buying Committee.png\"}","itemId":"a18dbe09-cbc8-4708-8979-f19a6a375a3c","fieldSchemaId":"0dcf8a7e-bbd6-452b-8b72-313a6860f60f"},{"id":"e7709159-6508-4c21-bfe3-fef90329002a","value":"{\"root\":{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"A B2B deal is never closed by one person. Five to seven stakeholders shape every meaningful purchase - a decision maker who signs, a champion who pushes internally, influencers who advise, evaluators who vet. For years sales tooling pretended otherwise: find one \\\"lead,\\\" work that single thread, hope it holds. It rarely does. The champion changes roles, leaves, or simply can't move the committee, and the deal stalls.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"At Lusha our job is sales intelligence, not just data enrichment - so the question we set out to answer was deceptively simple: \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"given a company and the people inside it, who should the rep talk to first?\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" This is the story of the Buying Committee Engine - the dead ends, the reframe that made it tractable, and the one architectural decision that turned a 14-second prototype into a sub-100-millisecond production service.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The puzzle: three people, one buyer\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1,\"tag\":\"h2\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Picture a rep - call him Jim - who sells office paper. A company lands on his site, and three of its people reply to his outreach: \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Bob\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\", the owner; \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Linda\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\", the office manager; \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Mike\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\", ops manager. One of them actually buys paper. Who?\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Most people pick Bob - he's the owner, obviously the most senior. But Bob signs big cheques and never touches office supplies. Linda orders the paper, every week. From the job titles alone, you can't tell. And neither can a model, if all it has is the title string.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"That's the whole problem, distilled: \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"the same title means a different thing depending on the company you're selling into.\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" A \\\"Director of IT\\\" at a fifty-person startup is the primary buyer for the entire stack - flat org, reports to the founder, signs the cheque. The same string at a five-thousand-person enterprise sits two layers below the CIO, peer to a dozen other directors, able to recommend but not to sign.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Ask a global model to translate title into role and it has to pick one answer - and it's wrong about half the time.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Where the labels come from\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1,\"tag\":\"h2\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Supervised learning needs ground truth, and ours was hiding in plain sight. Salesforce has a native object called \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Opportunity Contact Roles\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" (OCR): on every closed opportunity, reps tag which contacts actually drove the deal and what role each played - Decision Maker, Champion, Influencer, Evaluator.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The relationship is defined at the \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"opportunity\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" level, not on the contact. So one contact can hold different roles across different deals, and one deal involves many contacts. That many-to-many structure \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"is\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" the buying committee - and it's exactly the supervisory signal we get to learn from, across millions of human-tagged rows. No external dataset can replace reps tagging real deals.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Raw OCR isn't a training set, though. We ran it through a cleaning pipeline: closed opportunities only; accounts that meaningfully differentiate roles across deals (not bulk-taggers); a binary collapse to \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"DM vs. not-DM\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"; and - crucially - explicit negative sampling, because the table only records who \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"did\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" drive each deal, never who didn't. For every buyer with a tagged DM, we sampled contacts from departments the seller doesn't even target, so the model learns the boundary. We ended with a golden set of \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"1.94M labelled rows\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\".\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The reframe that made it work\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1,\"tag\":\"h2\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Our first instinct was the obvious one: a global classifier mapping title → role. It failed almost immediately, for exactly the reason above - it has no idea who's asking.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The fix was to change the question. We stopped asking \\\"is this person a Decision Maker?\\\" and started asking \\\"is this person a Decision Maker \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"for this seller\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"?\\\"\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The core principle.\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" Power is \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"relational\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\". Every prediction is conditioned on who is selling. The same person can be a DM for a security vendor and an Influencer for an HR-tech vendor - and that's not noise, it's the signal. P(DM) = f(contact, seller), not f(title).\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":1,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Binary, relational, conditioned. Once the problem was framed this way, every downstream decision fell out of it - starting with the shape of the input, which is now a \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"pair\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\".\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Turning text into geometry: embeddings\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1,\"tag\":\"h2\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Most of what we know about a person and a company is text: seniority, normalized title, department, the buyer's industry and size; on the seller side, their industry, size, and the personas and industries they target. Models don't eat text - they eat numbers. The bridge is an embedding.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"An embedding is a fixed-length array of floats - 384 of them, in our case - produced by a small sentence encoder (all-MiniLM-L6-v2, ~23 MB, happily CPU-bound). Two properties matter to an engineer. First, it's a \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"pure, deterministic function\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\": same input string, same vector, every time - no parsing, no lookup table. Second, the encoder was trained on hundreds of millions of sentence pairs so that \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"texts with similar meaning land near each other\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" in the 384-dimensional space. \\\"Head of Engineering\\\" and \\\"VP of R\u0026D\\\" come out close; \\\"Head of Engineering\\\" and \\\"janitor\\\" come out far. We get that semantic context for free, just by writing structured fields as a short sentence.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"In the first version we fused everything into a single sentence and encoded it once:\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"type\":\"image\",\"version\":1,\"hash\":\"5e59b77714fc2928ab5f1c0d0258ef35c8b15097\",\"src\":\"https://s3-alpha-sig.figma.com/img/5e59/b777/14fc2928ab5f1c0d0258ef35c8b15097?Expires=1782691200\u0026Key-Pair-Id=APKAQ4GOSFWCW27IBOMQ\u0026Signature=ogazh88LkkgZMyH9pgaLS7kVJh3bk6aHJXpCmvXi2Xq4iWtSF-1yZEMci~YfCBCGcbTnt6MBZChhy9FVbXqkAHsf5Fh3Ox-S4TafDwy~BWyAj8f8B6Tswk~5wMjJrs58zq-Rr8cOfKx6vZcY7LZXKV4IanrZNEKFsMpomPtOo5yVK-wkaDJmXG0yEvn4ACDblxPJGNAt-frFQlwzFw0KBYist4XymlB3~4c5ggNgBmh2Ad7RxSD0b1jcbMkC4t2xuOhCOhTHOg577S7bSX2~40RP~rrybH-Y2j70WWoywrlDRVJaLb1MK7elDL8uXh7CgiyvLDcNlYR7DS1lvrBDZQ__\",\"altText\":\"\",\"originalImageWidth\":1390,\"originalImageHeight\":264,\"isFillWidth\":false}],\"direction\":null,\"format\":\"left\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Remember this shape - it's elegant, and it's also the thing we had to tear apart later for performance. More on that below.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The model: XGBoost, not a transformer\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1,\"tag\":\"h2\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The scorer is \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"XGBoost\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\". Each tree asks a question about one of the input numbers - \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"is feature 142 \u003e 0.10?\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" - routes left or right, and lands at a leaf with a small score. One tree is a deliberately weak guesser. \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Boosting\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" grows hundreds of them in sequence, each trained to correct the previous trees' mistakes. At inference you sum every leaf score and squash the total through a sigmoid into a probability.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Why not just fine-tune a transformer end-to-end? We tried. In one line:\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"XGBoost vs LightGBM vs BERT.\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"XGBoost\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" - gradient-boosted trees, runs on CPU, fast and great with hundreds of individual numeric features. \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"LightGBM\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" - same idea, leaf-wise growth instead of level-wise, a bit faster to train and lighter on memory (within a hair of XGBoost on our data). \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"BERT\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" - a transformer that understands language deeply, but needs a GPU and is ~50× slower at inference.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":1,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"On the held-out test set we get \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ROC-AUC 0.818\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" and - the number we actually optimize for, since the product is a ranked list - \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"NDCG@10 of 0.888\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\". We deliberately don't lead with accuracy or F1: the rep sees a \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"ranking\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\", so what matters is whether the right people land at the top, not a single yes/no verdict.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The decision that actually mattered: get the encoder out of the request path\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1,\"tag\":\"h2\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The model story is only half the work. The product scores contacts in the user's interactive path, under a \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"3-second p95 SLO\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\". Our journey there came in two phases.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Phase 1 - model optimisation\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1,\"tag\":\"h3\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The original architecture ran a BERT classifier with the encoder firing at request time. Under a gentle 1 RPS load, average response was \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"14 seconds\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"; push to 2 RPS and it fell over. Swapping BERT for XGBoost, parallelizing the seller/contact fetches, and filtering low-tier contacts got us to \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"~4 seconds\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" average. Better - but the encoder was still running on every request. We were optimizing around the wrong bottleneck.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Phase 2 - get the slow thing offline\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1,\"tag\":\"h3\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The move that made this a real product was \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"decoupling the embeddings\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\". Instead of one fused vector computed live, we keep two independent vectors - one per seller, one per contact-in-buyer - pre-compute both offline on a nightly job, and only concatenate at serve time. The encoder never runs on the request path again. A hash-skip means we only re-encode rows whose input text actually changed.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"type\":\"image\",\"version\":1,\"hash\":\"b236801ed0623b58a61b38698a0e3acd300e85d5\",\"src\":\"https://s3-alpha-sig.figma.com/img/b236/801e/d0623b58a61b38698a0e3acd300e85d5?Expires=1782691200\u0026Key-Pair-Id=APKAQ4GOSFWCW27IBOMQ\u0026Signature=LBfG66~-UqXLYubZ96g5sU3VqkPTXrjnflTHXZSEBccdHEHMN6rvV0AgGt4mwhTTX0PGpOtdgkIPCsmNNkCsbKOIhMzEbShEY3sJLhV0t3RWeL8T8b-~Jj609OwNWvQY7TdYR8d6rZMfN~9dwu~ftRR6dvorl1vj-UTfnrp92c9onGCB8GaM079P5yhojhVp6p5BXzpihsZYsh8H5xzg2PdJH7oYViGNBgsHWg6Il4i49LmeeY8Q292BbshCOF0B~WoLhYSLKKbQo~1IYzGOvLohvnJcTS~jSa0N4lSnhLtB6LeDCbFPw0HNK-jWBajhr0AnFKR5c40kJot9wh33Iw__\",\"altText\":\"\",\"originalImageWidth\":1402,\"originalImageHeight\":312,\"isFillWidth\":false}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Result: average response dropped to \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"60 ms\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\". A later storage pass - embeddings stored as a Postgres \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"bytea\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" column decoded with a single \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"np.frombuffer\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\", plus a b-tree index on the company id - got us to a \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"p95 of 1.9 s on a batch of 10 buyers\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\", comfortably under the SLO.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"type\":\"image\",\"version\":1,\"hash\":\"32a46fc95f03ee5fc148049ee351ca7f38e5bc27\",\"src\":\"https://s3-alpha-sig.figma.com/img/32a4/6fc9/5f03ee5fc148049ee351ca7f38e5bc27?Expires=1782691200\u0026Key-Pair-Id=APKAQ4GOSFWCW27IBOMQ\u0026Signature=Zzsjx3M~Z8CfFIt-uDm7AeuaJV7RXRF2qoBpxQgpBMBQJISlJ1bTWLbZ0el~MJYc3Wse9~f0pi4LvzRi8WK22K5DbSDY~FOJ0zN~VhnjwNhf8cC~m59TYfUcnpwzrIwdBt5NWykEA~fdALRnjdec4R7T3dBQBYYTeRad44wLzbTm7T3B4vVh9oiR43O8IbYVcP3QRHJZuNEsUfVr06DGbL30rjqEvgVn8ttcf8tT8A5DUl7Nq65LrIw7wOL2DGvS7eZuYKkFtgeczfAYTAYi5HEIw85XBhc7OCH2B5D2O2Hh~pGiLRN6U4KuAP1uMetwU2SH76KJGJjDDgOkU2pElA__\",\"altText\":\"\",\"originalImageWidth\":1390,\"originalImageHeight\":322,\"isFillWidth\":false}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":1,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":1,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The lesson generalizes past this project: the model swap bought us roughly a 3× speed-up; the \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"architecture\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" swap bought us ~200×. When something is slow, ask whether it belongs in the request path at all before you reach for a faster model.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Drawing the line: recall over precision, on purpose\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1,\"tag\":\"h2\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The model outputs a probability; we still have to choose a threshold above which we surface a contact. The naive move is to pick the threshold that maximizes F1 - around 0.46 on our data. It looks great on paper and is quietly catastrophic: at that cut, ~15.6% of buyers receive \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"zero\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" contacts. The rep sees an empty list and never reaches the person they should have called. That's the invisible miss, and it's the worst failure mode for a sales product.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The two errors aren't symmetric. A noisy contact costs one wasted outreach - the rep moves on. A missing decision maker costs the entire deal. So we optimize for \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"recall\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\", not F1, and set the production threshold at \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"0.30\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\": we capture \",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"89% of true DMs\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\", only ~3% of buyers get an empty list, and the median buyer surfaces two contacts.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Pick the threshold for the cost of the wrong miss - not for the prettiest number on the validation curve.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"What I'd tell past-me\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1,\"tag\":\"h2\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Frame the problem relationally before writing a line of code.\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" The model only works because every prediction is conditioned on who's selling. Months of dead ends came from asking \\\"is this a DM?\\\" without the seller in the question.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":1,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Keep the slow thing out of the request path.\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" The decoupled-embedding move is the entire performance story; everything else is a rounding error on top of it.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":1,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":1,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Choose your metric - and your threshold - for the failure that actually hurts.\",\"type\":\"text\",\"version\":1},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" Max-F1 was the wrong objective. Recall-optimzsed was the right one. The lowest-confidence contacts we surface are the safety net, not the noise.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":1,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":2,\"mode\":\"normal\",\"style\":\"\",\"text\":\"The Buying Committee Engine runs today across 58.7M contacts, 6.68M buyer companies, and 155K seller accounts - one XGBoost call per request, no encoder in sight. Next up: predicting the full committee, not just the decision maker.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":2,\"textStyle\":\"\"},{\"children\":[],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"root\",\"version\":1}}","itemId":"a18dbe09-cbc8-4708-8979-f19a6a375a3c","fieldSchemaId":"ad9ef6c8-8d94-40ef-8da8-4f302b9e2eb8"}]},"db8a51e6-8639-4663-ba54-22ede0613956":{"id":"db8a51e6-8639-4663-ba54-22ede0613956","index":"\"","collectionId":"ae4ddc7c-d16f-497a-8ca5-c44ef0ea38f4","fields":[{"id":"2e428a3e-6466-4e45-9044-c67b2fb3befe","value":"Strategy","itemId":"db8a51e6-8639-4663-ba54-22ede0613956","fieldSchemaId":"9968938c-1e5c-4555-9913-5bec74638466"},{"id":"88421d90-ade1-42b5-afd9-50af08730627","value":"uno-orchestrator-scaling-distributed-workflows-with-temporal","itemId":"db8a51e6-8639-4663-ba54-22ede0613956","fieldSchemaId":"b5582fba-71f0-4acb-92f8-ec8c64421de1"},{"id":"ed3d249a-79e0-4c7d-9788-def1624011a4","value":"8 min","itemId":"db8a51e6-8639-4663-ba54-22ede0613956","fieldSchemaId":"a4d53820-9a8e-4129-9a19-3aeb454fe540"},{"id":"0b1e228a-3f80-4b57-94d7-9635e73c6168","value":"Uno Orchestrator: Scaling Distributed Workflows with Temporal","itemId":"db8a51e6-8639-4663-ba54-22ede0613956","fieldSchemaId":"93a6d692-64a7-44d7-bce5-fac95153019d"},{"id":"861e93eb-21c9-432d-8c30-4fae46902d31","value":"{\"image\":\"8a7e8e578f64d754145ad80405d4e6217ba46818\",\"imageThumbnail\":\"bf85813f8121d74adb4cbdf12b432fab088ee185\",\"originalImageHeight\":884,\"originalImageWidth\":1520,\"altText\":\"\",\"fileName\":\"Uno Orchestrator_ Scaling Distributed Workflows with Temporal.png\"}","itemId":"db8a51e6-8639-4663-ba54-22ede0613956","fieldSchemaId":"42b6c1cc-d636-4b0b-a42f-139fc5680cd1"},{"id":"5d27baa9-c2bc-4c7a-bdbf-b2dde3815f8d","value":"Uno Orchestrator: Scaling Distributed Workflows with Temporal","itemId":"db8a51e6-8639-4663-ba54-22ede0613956","fieldSchemaId":"f292d9ac-ccc5-4252-a8e4-0d6491a9ba7e"}]}}}},"slugByItemId":{"db8a51e6-8639-4663-ba54-22ede0613956":"uno-orchestrator-scaling-distributed-workflows-with-temporal","f9eb9d2a-ee79-4c8c-b5b9-e75e2f9c3865":"can-kafka-be-used-as-a-message-queue-lessons-from-building-an-ai-job-processor","802cc046-2fc6-4462-8e28-05807223fd71":"from-vibe-coding-to-production-ready-by-design","21f8846b-92aa-42fa-9777-421d97313dd1":"stop-feeding-your-agent-junk-food","470c1259-80d3-4d82-aa59-9bd8e12943a6":"specs-are-your-features-memory","a18dbe09-cbc8-4708-8979-f19a6a375a3c":"predicting-the-buying-committee"}}