[{"data":1,"prerenderedAt":810},["ShallowReactive",2],{"insight-insights_en-testing-a-campaign-on-customers-who-dont-exist":3,"insight-related-insights_en-testing-a-campaign-on-customers-who-dont-exist":193},{"id":4,"title":5,"author":6,"blobHue":10,"body":11,"category":168,"date":169,"description":17,"draft":170,"extension":171,"featured":170,"headline":172,"hue":173,"letter":174,"meta":175,"navigation":176,"path":177,"readMinutes":178,"related":179,"seo":183,"stem":184,"summary":185,"toc":186,"__hash__":192},"insights_en\u002Finsights\u002Ftesting-a-campaign-on-customers-who-dont-exist.md","Testing a campaign on customers who don’t exist",{"name":7,"role":8,"bio":9},"André","Founder & CTO","André is the founder and CTO of WizardingCode. Eight years building the software companies run on, now putting agents into production.",null,{"type":12,"value":13,"toc":159},"minimark",[14,18,21,26,29,32,36,39,62,65,69,72,75,78,84,88,91,143,146,149,153,156],[15,16,17],"p",{},"Our founder also runs a fashion marketplace. We built its Agentic OS the way we build one for any client, inside its own CRM: 90 agents in eight departments, each team checked by a judge. There, a campaign to the whole base is the kind of action we keep with a person. Once it is out, it is out. A tone that lands badly or an offer that confuses reaches everyone at once, and the unsubscribes do not come back.",[15,19,20],{},"So before a send, we test it on customers who don’t exist. These are notes on how the synthetic customers are built, what they are good for, and where we have learned not to trust them.",[22,23,25],"h2",{"id":24},"why-simulate-a-send","Why simulate a send",[15,27,28],{},"A\u002FB tests are the honest way to compare messages, but they test on real people. Half your audience gets the weaker version, and you learn after the fact. For a weekly campaign in four languages, across email, SMS and push, there are more variants than there is audience to test them on.",[15,30,31],{},"A simulation is a cheap first filter. It does not replace the real result. It helps decide which variants deserve to reach real people at all, and it catches the obvious mistakes before anyone sees them.",[22,33,35],{"id":34},"how-a-synthetic-customer-is-built","How a synthetic customer is built",[15,37,38],{},"We do not invent personas from a marketing brief. Each one is built from real buyers.",[40,41,42,50,56],"ol",{},[43,44,45,49],"li",{},[46,47,48],"strong",{},"Split the base into strata."," Groups of buyers that behave alike: how often they buy, what they buy, how they respond to discounts, which channels they use, which language they read.",[43,51,52,55],{},[46,53,54],{},"Describe each stratum from its data."," Order history, categories, return behaviour, past campaign responses. The description is written from what these buyers did, not from what we imagine they want.",[43,57,58,61],{},[46,59,60],{},"Give each persona a voice."," A persona model reads the description and answers as that kind of buyer would, when shown a subject line, a message and an offer.",[15,63,64],{},"Every stratum gets its own persona, so the simulation reflects the mix of your actual audience, not an average customer who does not exist either.",[22,66,68],{"id":67},"two-models-one-prediction","Two models, one prediction",[15,70,71],{},"Each persona is played by two different persona models, working as an ensemble. For every variant of a campaign, both predict whether that buyer would open, click, convert or unsubscribe, and each gives the objection it would have: “the discount isn’t worth the shipping”, “I bought this last week”, “this doesn’t sound like you”.",[15,73,74],{},"Using two models matters for the same reason judges run on a different model family from the agents they check. When the two agree, the signal is stronger. When they disagree, the disagreement is itself useful: it usually points at a message that could be read two ways.",[15,76,77],{},"The predictions are calibrated against real results, stratum by stratum: what the personas predicted is compared with what actual buyers did, and the simulation is adjusted. A simulation that is never checked against reality drifts into fiction.",[79,80,81],"blockquote",{},[15,82,83],{},"A synthetic customer is a hypothesis about real ones. It has to be tested against them.",[22,85,87],{"id":86},"what-they-get-right-and-wrong","What they get right, and wrong",[15,89,90],{},"After enough sends, the pattern is clear.",[92,93,94,107],"table",{},[95,96,97],"thead",{},[98,99,100,104],"tr",{},[101,102,103],"th",{},"GOOD AT",[101,105,106],{},"BAD AT",[108,109,110,119,127,135],"tbody",{},[98,111,112,116],{},[113,114,115],"td",{},"Ranking variants against each other",[113,117,118],{},"Predicting absolute open or click rates",[98,120,121,124],{},[113,122,123],{},"Catching an obvious tone miss",[113,125,126],{},"Anything genuinely new to the audience",[98,128,129,132],{},[113,130,131],{},"Spotting a confusing offer or subject line",[113,133,134],{},"Price sensitivity in the moment",[98,136,137,140],{},[113,138,139],{},"Surfacing the objection nobody wrote down",[113,141,142],{},"Events outside the data, like the weather or the news",[15,144,145],{},"Ranking is what they are built for: which variant is likely to do better, not by how much.",[15,147,148],{},"The absolute rates are the weak point. Models are not good at saying exactly how many people will open something, and we do not use them that way. Novelty is another: a type of campaign the audience has never seen has no history for the personas to draw on. And price sensitivity is hard. What a buyer says about a discount and what they do on a Friday night are not the same.",[22,150,152],{"id":151},"the-rule-that-blocks-a-launch","The rule that blocks a launch",[15,154,155],{},"The simulation is part of the launch. A newsletter or SMS launch without a recent simulation behind it is flagged, and it can be blocked until a new one has run. If the content has changed since the last run, the simulation is out of date.",[15,157,158],{},"The personas do not decide whether a campaign goes out. A person does, with the predictions, the objections and the disagreements on one screen. The synthetic customers only make sure that nobody sends a campaign to real ones without asking the question first.",{"title":160,"searchDepth":161,"depth":161,"links":162},"",2,[163,164,165,166,167],{"id":24,"depth":161,"text":25},{"id":34,"depth":161,"text":35},{"id":67,"depth":161,"text":68},{"id":86,"depth":161,"text":87},{"id":151,"depth":161,"text":152},"case-notes","2026-08-25",false,"md","Testing a campaign on customers who don’t ==exist.==","aqua","S",{},true,"\u002Finsights\u002Ftesting-a-campaign-on-customers-who-dont-exist",4,[180,181,182],"cart-recovery-with-agents-notes-from-our-own-store","every-agent-needs-a-judge","what-agents-should-never-do-alone",{"title":5,"description":17},"insights\u002Ftesting-a-campaign-on-customers-who-dont-exist","Synthetic personas built from real buyers: what they predict well, and what they get wrong.",[187,188,189,190,191],{"id":24,"label":25},{"id":34,"label":35},{"id":67,"label":68},{"id":86,"label":87},{"id":151,"label":152},"FOFAwqeMsuY8POjF0OqFXdwG1XrLGeDBiMZwOLpdldQ",[194,377,569],{"id":195,"title":196,"author":197,"blobHue":10,"body":198,"category":168,"date":358,"description":202,"draft":170,"extension":171,"featured":170,"headline":359,"hue":360,"letter":361,"meta":362,"navigation":176,"path":363,"readMinutes":178,"related":364,"seo":367,"stem":368,"summary":369,"toc":370,"__hash__":376},"insights_en\u002Finsights\u002Fcart-recovery-with-agents-notes-from-our-own-store.md","Cart recovery with agents: notes from our own store",{"name":7,"role":8,"bio":9},{"type":12,"value":199,"toc":351},[200,203,206,210,213,216,220,223,226,246,249,253,256,259,263,266,269,338,342,345,348],[15,201,202],{},"Our founder also runs a fashion marketplace. We built its Agentic OS the way we build one for any client, inside its own CRM: 90 agents in eight departments, each team checked by a judge. Cart recovery is one of the places where the data was already there and the problem was obvious. People fill a cart, and then life happens.",[15,204,205],{},"These are notes on what changed, what we measure, and what did not work. We have left out revenue and percentages on purpose. They depend on the season, the catalogue and the traffic, and a number without that context would tell you less than the method does.",[22,207,209],{"id":208},"where-we-started","Where we started",[15,211,212],{},"Before agents, cart recovery was like most stores’: a fixed sequence. One email after a few hours, another a day later, sometimes a discount in the third. The same words for everyone, in the language of the store, whatever the customer had been looking at.",[15,214,215],{},"It worked. It just spoke to nobody in particular, and got the results of that.",[22,217,219],{"id":218},"one-person-one-message","One person, one message",[15,221,222],{},"The first real change was writing each message for the person who left the cart. Every night, the system refreshes a profile for every buyer: a persona, a churn risk and a next best action. The recovery agent reads that profile, the cart and the customer’s history before it writes anything.",[15,224,225],{},"That changes three things.",[40,227,228,234,240],{},[43,229,230,233],{},[46,231,232],{},"Timing."," A customer who usually buys late in the evening is not reminded at nine in the morning. Someone who comes back within the hour is left alone for a while.",[43,235,236,239],{},[46,237,238],{},"Channel."," Email, SMS, push or WhatsApp, depending on what that person has agreed to and has actually responded to before. Not every channel, and not the loudest one.",[43,241,242,245],{},[46,243,244],{},"Tone."," A first-time visitor and a customer with years of orders do not get the same message. The first needs reassurance about sizes and returns. The second needs a short reminder, in their language, about the pieces they chose.",[15,247,248],{},"A judge checks the messages: the facts about the product and the policy must match the catalogue and the shared memory, and the tone must fit the brand.",[22,250,252],{"id":251},"vouchers-only-inside-limits","Vouchers, only inside limits",[15,254,255],{},"The easiest way to recover a cart is to give money away. That is also the easiest way to lose margin on a sale that might have happened anyway.",[15,257,258],{},"So the recovery agent can propose a voucher, but only inside limits the commerce team has set, and only after a margin guardrail has checked it. The guardrail is plain code, not a model. It works out the floor for each product after returns, fees and shipping, and anything below it is vetoed. No agent ever writes a price. A voucher is a tool for a specific person, not a default.",[22,260,262],{"id":261},"a-proposal-every-week-a-verdict-28-days-later","A proposal every week, a verdict 28 days later",[15,264,265],{},"Once a week, the system proposes how to recover more: change the timing for a segment, try a different channel, adjust the wording, tighten or loosen a voucher rule. A person reviews each proposal and decides whether to apply it.",[15,267,268],{},"Then comes the part we care about most. Every applied change is measured 28 days later, against what was happening before. Not the next morning, when a change always looks good or bad by chance. Twenty-eight days is long enough to see whether customers actually came back and bought, and whether the orders held once returns had come in.",[92,270,271,284],{},[95,272,273],{},[98,274,275,278,281],{},[101,276,277],{},"STEP",[101,279,280],{},"WHO",[101,282,283],{},"WHEN",[108,285,286,299,312,325],{},[98,287,288,293,296],{},[113,289,290],{},[46,291,292],{},"Propose a change",[113,294,295],{},"The recovery agent",[113,297,298],{},"Every week",[98,300,301,306,309],{},[113,302,303],{},[46,304,305],{},"Approve or reject",[113,307,308],{},"A person on the commerce team",[113,310,311],{},"Before anything changes",[98,313,314,319,322],{},[113,315,316],{},[46,317,318],{},"Measure the result",[113,320,321],{},"The system, against the baseline",[113,323,324],{},"28 days after it goes live",[98,326,327,332,335],{},[113,328,329],{},[46,330,331],{},"Keep, change or drop",[113,333,334],{},"The same person",[113,336,337],{},"After the measurement",[22,339,341],{"id":340},"what-didnt-work","What didn’t work",[15,343,344],{},"Not every proposal earns its place. Some changes made no measurable difference after 28 days and were dropped. That is the point of measuring: without it, they would still be running, and we would still believe in them.",[15,346,347],{},"A profile is only as good as the history behind it. For a first-time visitor there is little to go on, and the message is closer to the generic one than we would like. We treat that as a limit to be honest about, not something to paper over with guesses.",[15,349,350],{},"And a better message does not fix a bad reason for leaving. When a cart is abandoned because of shipping costs, a sold-out size or a confusing returns policy, the right move is to fix the store. The recovery agent’s most useful output is sometimes not a message at all, but a pattern for someone to look at.",{"title":160,"searchDepth":161,"depth":161,"links":352},[353,354,355,356,357],{"id":208,"depth":161,"text":209},{"id":218,"depth":161,"text":219},{"id":251,"depth":161,"text":252},{"id":261,"depth":161,"text":262},{"id":340,"depth":161,"text":341},"2026-08-11","Cart recovery with agents: notes from our own ==store.==","sun","R",{},"\u002Finsights\u002Fcart-recovery-with-agents-notes-from-our-own-store",[365,182,366],"testing-a-campaign-on-customers-who-dont-exist","getting-cited-by-chatgpt-and-claude",{"title":196,"description":202},"insights\u002Fcart-recovery-with-agents-notes-from-our-own-store","Timing, channel and tone. What changed when the message was written for one person.",[371,372,373,374,375],{"id":208,"label":209},{"id":218,"label":219},{"id":251,"label":252},{"id":261,"label":262},{"id":340,"label":341},"KH3Tvoi1FzHdhgydQOS66KG25jDv5Q_dCBEpLT85Ztc",{"id":378,"title":379,"author":380,"blobHue":10,"body":381,"category":550,"date":551,"description":385,"draft":170,"extension":171,"featured":170,"headline":552,"hue":553,"letter":554,"meta":555,"navigation":176,"path":556,"readMinutes":178,"related":557,"seo":559,"stem":560,"summary":561,"toc":562,"__hash__":568},"insights_en\u002Finsights\u002Fevery-agent-needs-a-judge.md","Every agent needs a judge",{"name":7,"role":8,"bio":9},{"type":12,"value":382,"toc":543},[383,386,389,393,396,399,402,406,409,477,480,483,487,490,512,515,519,522,525,528,533,537,540],[15,384,385],{},"A language model is very good at sounding right. That is the problem. An answer with a wrong refund amount reads exactly as confidently as one with the right amount, and a person skimming a queue of drafts will not catch it every time.",[15,387,388],{},"So we don’t ask people to catch it. In the marketplace system we built, 90 agents work across eight departments, and every team has a judge: 9 judges in all. A judge is a second model whose only job is to check another agent’s answer before anyone relies on it.",[22,390,392],{"id":391},"why-a-second-model","Why a second model",[15,394,395],{},"Asking the same model to review its own work helps less than you would think. It tends to agree with itself, and it shares the blind spots that produced the mistake in the first place.",[15,397,398],{},"That is why our judges run on a different model family from the agents they check. Different training, different habits, different failure modes. When two unrelated models agree that an answer is grounded and within policy, that means much more than one model agreeing with itself twice.",[15,400,401],{},"A judge also sees the answer differently. The agent was trying to be helpful. The judge is only trying to find what is wrong. Giving it a narrow brief, and nothing else to do, is what makes it useful.",[22,403,405],{"id":404},"block-or-grade-later","Block or grade later",[15,407,408],{},"There are two ways to put a judge in the path, and choosing between them is the main design decision.",[92,410,411,423],{},[95,412,413],{},[98,414,415,417,420],{},[101,416],{},[101,418,419],{},"BLOCK AND REPAIR",[101,421,422],{},"SHIP, THEN GRADE",[108,424,425,438,451,464],{},[98,426,427,432,435],{},[113,428,429],{},[46,430,431],{},"When the judge runs",[113,433,434],{},"Before the answer leaves",[113,436,437],{},"After it has gone out",[98,439,440,445,448],{},[113,441,442],{},[46,443,444],{},"If it fails",[113,446,447],{},"Sent back once with the reasons, then shipped with reservations",[113,449,450],{},"Flagged, counted, fed into the next lessons",[98,452,453,458,461],{},[113,454,455],{},[46,456,457],{},"Cost to the user",[113,459,460],{},"Some extra seconds",[113,462,463],{},"None",[98,465,466,471,474],{},[113,467,468],{},[46,469,470],{},"Use it for",[113,472,473],{},"Anything a customer sees, anything with money",[113,475,476],{},"High volume, low risk, easy to correct",[15,478,479],{},"In the blocking path, a failed answer is not simply rejected. It goes back to the agent once, with the judge’s reasons, and the agent gets a chance to repair it. If the repaired answer still fails, it goes out marked with the judge’s reservations, or, where the rules require it, to a person. Nothing leaves without a verdict.",[15,481,482],{},"In the grading path, the answer goes out and the judge scores it afterwards. The scores show where an agent drifts, and they feed the lessons the system learns overnight. Those lessons are not applied on their own: a person approves each one before agents use it.",[22,484,486],{"id":485},"what-a-judge-checks","What a judge checks",[15,488,489],{},"A judge with a vague brief (“is this a good answer?”) is expensive noise. Ours check specific things, and each check can fail on its own:",[491,492,494],"prose-checklist",{"title":493},"What a judge checks, every time",[495,496,497,500,503,506,509],"ul",{},[43,498,499],{},"Can every number in the answer be traced to data the agent actually read in this run?",[43,501,502],{},"Does it contradict a policy in the shared memory?",[43,504,505],{},"Does it answer the question that was asked, completely?",[43,507,508],{},"Does it propose an action the approval rules do not allow?",[43,510,511],{},"Is the tone right for who will read it?",[15,513,514],{},"The first check is the one that matters most. A refund amount, a delivery date or a stock figure that does not appear in any tool result is treated as invented, however plausible it looks.",[22,516,518],{"id":517},"what-it-costs-and-when-to-skip-it","What it costs, and when to skip it",[15,520,521],{},"A judge is another model call on every answer. It adds tokens, and in the blocking path it adds seconds. For a customer reply that is cheap insurance. For some work, it is waste.",[15,523,524],{},"We skip the judge, or move it to grading later, when the output is low stakes, reversible and cheap to check. An internal tag suggestion that a person sees anyway, or a draft that someone always edits before sending, does not need a second model standing in front of it.",[15,526,527],{},"We also never ask a model to check what code can check. Whether a price is above its floor, whether a date is in the future or whether an order exists are deterministic questions. They get deterministic answers, which are faster and do not have opinions.",[79,529,530],{},[15,531,532],{},"A judge is for judgement. If a rule can be written as code, write it as code.",[22,534,536],{"id":535},"fail-loudly-not-silently","Fail loudly, not silently",[15,538,539],{},"Judges fail too. They time out, or their provider is down for a few minutes. The worst thing a system can do then is pretend the check happened.",[15,541,542],{},"When a judge cannot run, the answer is shown with a visible “not validated” mark, and the person reading it decides whether to rely on it. A silent pass is how a system loses the trust of the people who work with it, and that trust is much harder to rebuild than a timeout is to fix.",{"title":160,"searchDepth":161,"depth":161,"links":544},[545,546,547,548,549],{"id":391,"depth":161,"text":392},{"id":404,"depth":161,"text":405},{"id":485,"depth":161,"text":486},{"id":517,"depth":161,"text":518},{"id":535,"depth":161,"text":536},"engineering","2026-09-01","Every agent needs a ==judge.==","blue","J",{},"\u002Finsights\u002Fevery-agent-needs-a-judge",[182,558,365],"what-an-agentic-os-is-and-what-it-isnt",{"title":379,"description":385},"insights\u002Fevery-agent-needs-a-judge","Why we put a second model in front of every answer, and when it isn’t worth the cost.",[563,564,565,566,567],{"id":391,"label":392},{"id":404,"label":405},{"id":485,"label":486},{"id":517,"label":518},{"id":535,"label":536},"XzL5diXOtcDslArv3P74XXRkQd_4qZoVSP7GUPDaC8E",{"id":570,"title":571,"author":572,"blobHue":10,"body":573,"category":792,"date":793,"description":577,"draft":170,"extension":171,"featured":170,"headline":794,"hue":360,"letter":795,"meta":796,"navigation":176,"path":797,"readMinutes":178,"related":798,"seo":800,"stem":801,"summary":802,"toc":803,"__hash__":809},"insights_en\u002Finsights\u002Fwhat-agents-should-never-do-alone.md","What agents should never do alone",{"name":7,"role":8,"bio":9},{"type":12,"value":574,"toc":785},[575,578,581,585,591,597,603,606,610,613,616,619,623,626,646,649,653,656,764,767,772,776,779,782],[15,576,577],{},"The question we hear most from operations leads is not “can the agent do this?”. It is “what stops it doing something stupid?”. The honest answer is not a better prompt. It is a short list of rules, written by the people who own the risk, that the agent cannot talk its way around.",[15,579,580],{},"Writing those rules is less work than it sounds. Almost everything that should stay with a person falls into three kinds of decision.",[22,582,584],{"id":583},"three-kinds-of-decisions","Three kinds of decisions",[15,586,587,590],{},[46,588,589],{},"Money."," Refunds, credits, discounts, prices, payments. Anything that moves money in or out of the business, or changes what a customer pays.",[15,592,593,596],{},[46,594,595],{},"Promises."," A delivery date, a replacement, an exception to the policy, anything that commits the company to a customer or a supplier. A wrong answer is fixable. A wrong promise has to be honoured or broken.",[15,598,599,602],{},[46,600,601],{},"Anything you can’t undo."," Deleting records, sending to your whole customer base, cancelling or changing an order that is already moving. If the mistake cannot be reversed by clicking something, a person decides.",[15,604,605],{},"Everything else, like reading, classifying, drafting, looking up, summarising and routing, is usually safe for an agent to do alone, provided it is visible afterwards.",[22,607,609],{"id":608},"draft-then-apply","Draft, then apply",[15,611,612],{},"The most useful distinction in approval rules is between preparing an action and executing it. An agent can do all the work of a refund: find the order, check the policy, calculate the amount, write the reply. Then it stops, and a person applies it with one tap.",[15,614,615],{},"This keeps most of the time saving and almost none of the risk. The person is not doing the work. They are checking a finished proposal, with the order, the policy and the amount on one screen.",[15,617,618],{},"Over time, some drafts earn the right to apply themselves. When a person has approved the same kind of action enough times without changes, you can move it below the threshold. That is a decision for the team that owns it, not for the agent.",[22,620,622],{"id":621},"thresholds-not-feelings","Thresholds, not feelings",[15,624,625],{},"“Ask me when it’s important” is not a rule. An agent cannot know what feels important to you. A rule needs a number, a category or a list:",[495,627,628,634,640],{},[43,629,630,633],{},[46,631,632],{},"A number."," Refunds up to a limit are applied; above it, they go to the ops lead.",[43,635,636,639],{},[46,637,638],{},"A category."," Any change to a contract goes to legal, whatever the value.",[43,641,642,645],{},[46,643,644],{},"A list."," New suppliers, key accounts and anything to the press always go to a person.",[15,647,648],{},"Every rule names who decides and where they are asked: in Slack, Teams or email, wherever that person already works. A rule that sends approvals to a dashboard nobody opens is a rule that stops the business.",[22,650,652],{"id":651},"a-worked-example","A worked example",[15,654,655],{},"This is the shape of a rule set for an online store’s support and commerce agents. The limits are yours to set; the structure is what matters.",[92,657,658,671],{},[95,659,660],{},[98,661,662,665,668],{},[101,663,664],{},"ACTION",[101,666,667],{},"AGENT ALONE",[101,669,670],{},"GOES TO A PERSON",[108,672,673,686,699,712,725,738,751],{},[98,674,675,680,683],{},[113,676,677],{},[46,678,679],{},"Order status, tracking, policy questions",[113,681,682],{},"Answers",[113,684,685],{},"Never, unless the customer asks for one",[98,687,688,693,696],{},[113,689,690],{},[46,691,692],{},"Refund",[113,694,695],{},"Drafts every one, applies small ones",[113,697,698],{},"Above €500 in this example, the ops lead",[98,700,701,706,709],{},[113,702,703],{},[46,704,705],{},"Voucher or discount",[113,707,708],{},"Proposes, inside the margin floor",[113,710,711],{},"Anything outside the agreed limits",[98,713,714,719,722],{},[113,715,716],{},[46,717,718],{},"Price change",[113,720,721],{},"Never writes a price",[113,723,724],{},"The pricing owner, after the margin check",[98,726,727,732,735],{},[113,728,729],{},[46,730,731],{},"Delivery date",[113,733,734],{},"Quotes what the courier data says",[113,736,737],{},"Any exception or guarantee",[98,739,740,745,748],{},[113,741,742],{},[46,743,744],{},"Order change or cancellation",[113,746,747],{},"Drafts",[113,749,750],{},"Always applied by a person",[98,752,753,758,761],{},[113,754,755],{},[46,756,757],{},"Campaign to the whole base",[113,759,760],{},"Prepares and simulates",[113,762,763],{},"Always sent by a person",[15,765,766],{},"Start with the right-hand column. The right-hand column is the list of things your team has decided to keep. Everything to its left is work they no longer have to do.",[79,768,769],{},[15,770,771],{},"If you can’t undo it, a person does it.",[22,773,775],{"id":774},"the-veto-that-isnt-a-model","The veto that isn’t a model",[15,777,778],{},"Some rules are too important to leave to a language model, even one that is being checked. Margin is the clearest case.",[15,780,781],{},"In the marketplace system we built, no agent ever writes a price. Agents can propose a discount or a clearance offer, but every proposal passes through a margin guardrail first. The guardrail is plain code, not a model. It calculates the floor for that product after returns, fees and shipping, and anything below it is vetoed. There is nothing to persuade and no prompt to get wrong.",[15,783,784],{},"That is the pattern we use wherever a rule can be expressed as arithmetic or a lookup. The model proposes, deterministic code checks, and a person approves what the rules say a person approves. Each layer does the thing it is good at, and none of them is asked to be the last line of defence alone.",{"title":160,"searchDepth":161,"depth":161,"links":786},[787,788,789,790,791],{"id":583,"depth":161,"text":584},{"id":608,"depth":161,"text":609},{"id":621,"depth":161,"text":622},{"id":651,"depth":161,"text":652},{"id":774,"depth":161,"text":775},"playbooks","2026-09-08","What agents should never do ==alone.==","!",{},"\u002Finsights\u002Fwhat-agents-should-never-do-alone",[181,799,558],"the-30-day-playbook-week-by-week",{"title":571,"description":577},"insights\u002Fwhat-agents-should-never-do-alone","A practical way to write approval rules: money, promises and anything you can’t undo.",[804,805,806,807,808],{"id":583,"label":584},{"id":608,"label":609},{"id":621,"label":622},{"id":651,"label":652},{"id":774,"label":775},"mWnCbu3ZKOI9CJrpjxbakDDnQwkJuenNM8EI7HSjdMA",1790618465030]