<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Context Clues — Brief</title>
    <link>https://usebrief.com/blog/</link>
    <atom:link href="https://usebrief.com/blog/feed.xml" rel="self" type="application/rss+xml"/>
    <description>How to keep AI agents building what matters, not just what compiles</description>
    <language>en</language>
    <lastBuildDate>Wed, 14 Oct 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>Parkinson's Law of Triviality</title>
      <link>https://usebrief.com/blog/parkinsons-law-of-triviality/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/parkinsons-law-of-triviality/</guid>
      <pubDate>Wed, 14 Oct 2026 00:00:00 GMT</pubDate>
      <description>A team's attention tends to run in inverse proportion to what's at stake. The small calls get the debate, and the big ones pass with little discussion and less written down.</description>
      <content:encoded><![CDATA[<p>Picture the agenda from a sixty-minute product review, with how long each item took:</p>

<div class="table-scroll rail-wide" role="region" aria-label="Table 1" tabindex="0">
<table><thead><tr><th scope="col">Item</th><th scope="col">Minutes</th><th scope="col">What it commits the team to</th></tr></thead><tbody><tr><th scope="row">Rename "Workspaces" to "Projects" in the sidebar</th><td>24</td><td>A label that can change again next week</td></tr><tr><th scope="row">Color of the upgrade button</th><td>15</td><td>A pixel value</td></tr><tr><th scope="row">Lunch order for the offsite</th><td>12</td><td>One lunch</td></tr><tr><th scope="row">Move integrations from direct database writes to an event queue</th><td>4</td><td>The data path every integration uses for the next year</td></tr><tr><th scope="row">Retention period for deleted customer data</th><td>1</td><td>What the company can promise in a security review</td></tr></tbody></table>
</div>

<p>Nobody set out to run the meeting this way. Everyone in the room had a view on the sidebar label, so everyone shared it. The queue migration was presented by the one engineer who had designed it, nobody had a question ready, and it passed. The retention item was read aloud and accepted.</p>

<p>The decisions that will be hardest to change got the least attention, and they probably left the least behind in writing.</p>

<h2 id="parkinson-s-committee">Parkinson's committee</h2>

<p>C. Northcote Parkinson described this pattern in his 1957 book <em>Parkinson's Law</em>, in a chapter called "High Finance, or the Point of Vanishing Interest." He stated it as a law: "the time spent on any item of the agenda will be in inverse proportion to the sum involved."</p>

<p>His illustration is a fictional finance committee. It approves a nuclear reactor in two and a half minutes, then spends forty-five minutes on a bicycle shed for the staff. Parkinson's point was that this isn't carelessness. Very few members understand a reactor well enough to question it, and every member knows what a shed is.</p>

<p>The idea got its common software name in 1999. Poul-Henning Kamp, a FreeBSD developer, emailed FreeBSD's committers and hackers mailing lists after a long thread over a small proposed change to <code>sleep(1)</code>, and summarized Parkinson's example in it. The email turned "bike shed" into shorthand for arguing over the trivial thing.</p>

<h2 id="two-forces-behind-it">Two forces behind it</h2>

<p>Kamp's email names both of them clearly.</p>

<p><strong>The big decision is hard to grasp, so people assume it was checked.</strong> Summarizing Parkinson, Kamp writes that an atomic plant is "so vast, so expensive and so complicated that people cannot grasp it, and rather than try, they fall back on the assumption that somebody else checked all the details before it got this far." Silence in the meeting reads as agreement, when it may only mean nobody felt able to ask. That is the same gap the <a href="https://usebrief.com/blog/approval-theater/">approval theater</a> post describes: a sign-off that looks like review without being one.</p>

<p><strong>The small decision is easy to grasp, so everyone takes part.</strong> "Anyone can build one of those over a weekend," Kamp writes of the shed, and so somebody "will seize the chance to show that he is doing his job, that he is paying attention." Commenting on the button color is cheap, visible, and safe. Asking a basic question about the event queue risks looking uninformed.</p>

<p>Together, those two forces move the team's scrutiny away from the decisions that most need it.</p>

<h2 id="why-coding-agents-make-this-worse">Why coding agents make this worse</h2>

<p>Coding agents can produce a lot of small, easy-to-follow changes. A pull request that renames twelve files and adjusts formatting gives reviewers plenty to comment on. If the same pull request also adds a dependency or changes how a table is keyed, that line sits among hundreds of others, and the law of triviality suggests it is the one least likely to get discussed.</p>

<p>The decision inside that line may never be stated anywhere. The agent made a reasonable choice given what it could see, and the review spent its attention on the parts everyone could follow. Months later, the team can end up living with a choice nobody remembers making.</p>

<h2 id="a-short-check-for-your-next-meeting-or-review">A short check for your next meeting or review</h2>

<ol><li><strong>Which item here is hardest to reverse?</strong> If you can't tell, that's the first thing to discuss. One-way and two-way decisions deserve different amounts of time, which the <a href="https://usebrief.com/blog/one-way-doors/">one-way doors</a> post covers in more depth.</li><li><strong>Did the hardest-to-reverse item get its share of the time?</strong> A rough match is enough. A four-minute pass on a migration, or a one-minute pass on a retention promise, is a signal, whatever the reason.</li><li><strong>Is the reasoning for the big decision written down somewhere a newcomer would find it?</strong> If the only record is "approved," the meeting kept the outcome and lost the reasons.</li></ol>

<p>None of these stops people from enjoying the shed. They just make sure the reactor doesn't pass on silence.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>Bikeshedding is a problem of attention, and no tool can make a meeting care about the right item. What a team can fix is what the big decision leaves behind after its four minutes, and whether later work runs into it. Follow the queue migration from the agenda above through Brief.</p>

<p><strong>After the meeting, one more minute.</strong> The engineer who designed the migration goes back to the Slack thread where the design was discussed and mentions Brief to log it. Brief reads the surrounding thread for context and proposes a structured decision to confirm or edit, as the <a href="https://usebrief.com/docs/slack-integration/">Slack integration guide</a> describes. Typing <code>/decide</code> with the decision and its reason works too, with a preview to confirm before it is logged. Once confirmed, Brief saves the decision with its rationale, the person who logged it, the time, and the channel. A decision made outside Slack can be recorded from the terminal with <code>brief decisions create --decision "..." --rationale "..."</code>. Either way, the rationale is where the minute goes: "Move integrations to an event queue, because direct writes block on slow providers and give us no retry. Revisit if queue lag becomes visible to customers." That extra minute leaves a reason someone can test later, which "approved" in the meeting notes doesn't. The one-minute retention promise deserves the same treatment, since it is the one a security review will ask about.</p>

<p><strong>Six weeks later, an agent meets the decision.</strong> An engineer asks a coding agent to add a billing integration, and the agent plans to write straight to the database, the way the older integrations did. If the engineer or the agent runs that plan through <code>brief ask --mode check</code>, which validates an approach against the team's existing decisions, the check can flag the conflict with the queue decision before any code exists. Nobody had to remember the four-minute agenda item. This is how the imbalance gets partly repaid: the decision that got the least human attention is still there for a later plan to be checked against, as long as someone recorded it and the agent runs the check.</p>

<p><strong>Next quarter, the shed comes back.</strong> Someone proposes renaming "Projects" back to "Workspaces." If the label was recorded, the new decision can be marked as replacing the old one, and the earlier call stays readable as history (see <a href="https://usebrief.com/blog/supersession/">supersession</a>). The new debate can start from the reasons the team already gave, instead of from scratch.</p>

<p>Brief doesn't decide which agenda item deserves the time, and it doesn't rank decisions by importance on its own. It holds what someone confirms or writes down, so a four-minute decision with a one-word rationale is still a one-word rationale, and a check helps only if the agent runs it. What it changes is how far a quick decision travels. Once its reasons are on record, the item that got the least discussion can still shape the work that follows.</p>

<p>Which decision from your last planning meeting got the least discussion, and could anyone find its reasoning today?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is Parkinson's law of triviality?</strong> The observation that groups spend time on agenda items in inverse proportion to the sum of money involved. C. Northcote Parkinson described it in his 1957 book <em>Parkinson's Law</em>, with a fictional committee that approves a nuclear reactor in two and a half minutes and spends forty-five minutes on a bicycle shed.</p>

<p><strong>Where does the term "bikeshedding" come from?</strong> From Parkinson's bicycle shed example. Poul-Henning Kamp, a FreeBSD developer, retold the example in a 1999 email to FreeBSD's developer mailing lists, and "bikeshedding" became the common software term for arguing over trivial details.</p>

<p><strong>Why does the law of triviality happen?</strong> Parkinson's explanation, as Kamp retold it, involves two forces. Complex decisions are hard to grasp, so people assume someone else has checked them and stay quiet. Simple decisions are easy to grasp, so everyone can offer an opinion and show they are paying attention.</p>

<p><strong>How does Brief help with bikeshedding?</strong> Brief records decisions with their rationale, who logged them, and when. When someone mentions Brief in a Slack thread, Brief reads the thread and proposes a decision for them to confirm or edit. Coding agents can check a planned change against those recorded decisions with <code>brief ask --mode check</code>. Brief doesn't decide which decisions deserve discussion; it keeps the reasoning for the ones a team records.</p>]]></content:encoded>
    </item>
    <item>
      <title>Disagree and Commit</title>
      <link>https://usebrief.com/blog/disagree-and-commit/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/disagree-and-commit/</guid>
      <pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate>
      <description>Disagree and commit is a promise to back a decision you argued against. It works only when the disagreement is kept somewhere, so the team knows what it bet against and when to look again.</description>
      <content:encoded><![CDATA[<p><strong>March.</strong> A pricing thread in Slack runs long. The product lead wants to drop the free tier and move everyone to a 14-day trial. The head of support disagrees: free users file a large share of the bug reports that matter, and she expects quality signal to drop once they're gone. The thread can't settle it. The product lead asks, "Will you disagree and commit?" She says yes. The trial ships in April.</p>

<p><strong>September.</strong> Escalations from paying customers are up, and they're about bugs that used to surface earlier. Someone asks whether removing the free tier had anything to do with it. Nobody in the room was in the March thread. The head of support has since moved teams. The decision record, if anyone can find it, says "Move to 14-day trial." It doesn't say anyone disagreed, or what she predicted.</p>

<p>The commitment survived. The disagreement didn't, and the disagreement was the part that could have helped.</p>

<h2 id="what-the-phrase-was-meant-to-do">What the phrase was meant to do</h2>

<p>Jeff Bezos popularized the phrase in his 2016 letter to Amazon shareholders: "Use the phrase 'disagree and commit.' This phrase will save a lot of time." His example was an Amazon Studios original he had doubts about. He told the team his concerns, they wanted to go ahead, and he replied that he disagreed and committed and hoped it would become the most watched thing Amazon had made.</p>

<p>He was specific about what made it work. It was, in his words, "a genuine disagreement of opinion, a candid expression of my view, a chance for the team to weigh my view, and a quick, sincere commitment to go their way." The disagreement is stated in the open and heard, and then the commitment comes quickly. Nothing in that description asks anyone to forget the disagreement either.</p>

<h2 id="two-ways-it-goes-wrong">Two ways it goes wrong</h2>

<p>Disagree and commit has two failure modes, and they point in opposite directions.</p>

<p><strong>The dissent goes underground.</strong> Someone says "commit" in the meeting but never stops disagreeing. The work assigned to them moves a little slower, the edge cases get raised a little later, and the decision gets relitigated in hallways. The team paid for a commitment and received compliance.</p>

<p><strong>The dissent disappears.</strong> Everyone commits sincerely, and the disagreement leaves with the people who held it. That is the March thread. Nothing goes wrong at first. The cost shows up later, when the dissenter's prediction starts coming true and nobody recognizes it, because nobody remembers it was a prediction.</p>

<p>The first failure is a problem of trust. The second is a problem of memory, and it is the one that gets worse as teams grow, people move, and decisions outlive the conversations that made them.</p>

<h2 id="keep-the-disagreement-not-just-the-decision">Keep the disagreement, not just the decision</h2>

<p>A useful disagreement has three parts, and all three fit in a few sentences:</p>

<ol><li><strong>Who disagreed.</strong> The team needs to know whom to ask when the question comes back.</li><li><strong>What they expected to happen.</strong> "Quality signal will drop because free users find bugs that paying users don't report."</li><li><strong>What would show they were right.</strong> "If escalations about previously unreported bugs rise for a full quarter, revisit."</li></ol>

<p>Written that way, the dissent becomes something the whole team can watch for, which is the move a <a href="https://usebrief.com/blog/tripwire/">tripwire</a> makes. It also changes what committing means. The dissenter backs the decision, and the record keeps her concern where the team can find it when the evidence arrives. That is a far easier promise to keep sincerely.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>Disagree and commit asks two things of a team's memory: hold the commitment so everyone builds on the same decision, and hold the disagreement so the team knows what it bet against. Brief is built to keep that record.</p>

<p><strong>The decision is captured where the argument happened.</strong> When someone logs a decision by mentioning Brief in a Slack thread, Brief reads the surrounding thread for context and proposes a structured decision to confirm or edit, as the <a href="https://usebrief.com/docs/slack-integration/">Slack integration guide</a> describes. The record carries the decision, the rationale, who logged it, when, and the channel. The March thread is where the head of support made her case. Capturing the decision from that thread puts the disagreement one edit away from the record, where a reorganization can't take it.</p>

<p><strong>The dissent lives in the rationale.</strong> Brief has no separate dissent field, and it is worth being plain about that. The place for the disagreement is the rationale: "Move to a 14-day trial to improve conversion. Support disagreed: free users surface bugs paying users don't report. Revisit if escalations about previously unreported bugs rise for a full quarter." That sentence costs ten seconds in March. In September it turns "did this have anything to do with it?" from a guess into a lookup.</p>

<p><strong>Reversing doesn't reopen the argument.</strong> If the prediction comes true, the team can record a new decision that replaces the old one. Brief tracks when one decision replaces another and keeps the earlier one as history, as the <a href="https://usebrief.com/blog/supersession/">supersession</a> post describes. The original call and the dissent stay readable side by side. Nobody has to win the March argument retroactively; the record shows the team made a reasonable bet, noted the risk, and acted when the risk showed up.</p>

<p><strong>Everyone, including agents, builds on the commitment.</strong> A commitment is only real if the work follows it. Before an architectural change, a coding agent can ask Brief to check the plan against recorded decisions with <code>brief ask --mode check</code>. An agent asked to build a free-tier feature can have that plan checked against the trial decision. That is the same reason a recorded decision works as <a href="https://usebrief.com/blog/common-knowledge/">common knowledge</a>: it sits in one place everyone knows the others are reading.</p>

<p>The limits are real. A record can't make a commitment sincere. Someone who says "commit" and slow-walks the work will do it with or without a record. What the record fixes is the second failure, the one where honest dissent simply disappears. It gives the person who disagreed a reason to commit in good faith, because her concern has a place to wait.</p>

<p>Think of the last decision your team made over an objection. Could you find what the objection predicted?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What does disagree and commit mean?</strong> Backing a decision you argued against, after making your case openly. Jeff Bezos popularized the phrase in his 2016 letter to Amazon shareholders, and gave an example that combined a genuine disagreement of opinion, a candid expression of his view, a chance for the team to weigh it, and a quick, sincere commitment to go their way.</p>

<p><strong>Does disagree and commit mean the disagreement should be forgotten?</strong> No. The commitment is to the decision. Recording who disagreed, what they expected, and what evidence would prove them right lets the team revisit the decision when that evidence arrives.</p>

<p><strong>What goes wrong with disagree and commit?</strong> Two things. Dissent can go underground, where people say they commit but keep resisting through the work. Or dissent can disappear, where everyone commits sincerely but nobody records the disagreement, so the team doesn't recognize it when the dissenter's prediction comes true.</p>

<p><strong>How does Brief help with disagree and commit?</strong> Brief records decisions with their rationale, who logged them, and when, can capture them when someone mentions Brief in the Slack thread where the discussion happened, and tracks when one decision replaces another, keeping the earlier one as history. Brief has no separate dissent field, so the disagreement is kept by writing it into the rationale.</p>]]></content:encoded>
    </item>
    <item>
      <title>Escalation of Commitment</title>
      <link>https://usebrief.com/blog/escalation-of-commitment/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/escalation-of-commitment/</guid>
      <pubDate>Mon, 12 Oct 2026 00:00:00 GMT</pubDate>
      <description>When a decision starts failing, the person who made it tends to invest more. What helps is changing what admitting the miss costs, before anyone has to.</description>
      <content:encoded><![CDATA[<p>Escalation of commitment is the tendency to keep investing in a failing course of action because you were the one who chose it. The evidence turns, the plan stalls, and the person who backed it asks for one more quarter.</p>

<p>Barry Staw named it in 1976, in a paper titled "Knee-deep in the big muddy." He ran a role-play investment exercise with 240 business school students. Some were made responsible for the initial funding decision; others were not. When the investment then went badly, the students who had made the first call put more money back into it than those who hadn't. Personal responsibility for the loss, not just the loss, drove the extra spending.</p>

<p>That detail separates escalation from its better-known neighbor. The <a href="https://usebrief.com/blog/ikea-effect/">sunk cost</a> effect is about money, effort, or time already spent. Escalation is about who spent it. The same losing project looks different to the person whose judgment it now puts on trial.</p>

<h2 id="a-worked-case">A worked case</h2>

<p>A team decides to build its own billing system instead of buying one. The rationale is reasonable: the pricing model is unusual, and the vendors on the shortlist can't express it.</p>

<p>Six months in, two things have changed. A vendor has shipped support for exactly that pricing model, and the internal build is a quarter behind. The engineering lead who argued for building is asked whether to continue.</p>

<p>Here is how escalation sounds from the inside:</p>

<ul><li>"We're too far in to switch now."</li><li>"The last 20 percent is the easy part."</li><li>"Switching would waste everything we've learned."</li><li>"The vendor's version won't handle our edge cases."</li></ul>

<p>Each sentence might be true. The first three answer a different question from the one that matters, which is: knowing what we know today, would we start this build? They defend the past. The fourth bears on that question, but nobody has checked it, because checking it risks the answer.</p>

<h2 id="is-this-persistence-or-escalation">Is this persistence or escalation?</h2>

<p>Persistence and escalation look the same from the outside. Both mean continuing after a setback. The difference is what the continuation rests on. A few questions separate them:</p>

<ol><li><strong>Do the original reasons still hold?</strong> Persistence can point to the assumptions behind the decision and say they are intact. Escalation changes the subject to effort already spent.</li><li><strong>Would a newcomer choose this?</strong> Ask someone who had no part in the original call. If they would not start the project today, the case for continuing is mostly about the people who did.</li><li><strong>Was there a point at which we said we'd stop?</strong> If the team set a threshold before starting and has now passed it, continuing needs a new reason stated today. If no threshold exists, that is worth noticing too.</li><li><strong>What does reversing cost the person who decided?</strong> If changing course reads as a public verdict on someone's judgment, expect that person to argue for staying. The incentive drives it, whoever holds the role.</li></ol>

<p>None of these questions requires anyone to admit a mistake. They ask whether the decision still stands on its own reasons.</p>

<h2 id="what-reduces-it">What reduces it</h2>

<p>Sixteen years later, in 1992, Itamar Simonson and Staw compared techniques for reducing escalation in the <em>Journal of Applied Psychology</em>. Three worked best: making a negative outcome less threatening to the decision maker, setting minimum target levels in advance that would trigger a change of policy if missed, and evaluating decision makers on their decision process rather than the outcome.</p>

<p>Each one attacks the same mechanism. Escalation is self-justification, so the fixes lower what the decision maker has to justify. A preset target makes the stop an agreed rule rather than a personal retreat. Grading the process means a sound call that met bad facts is not a mark against anyone, which is the argument the <a href="https://usebrief.com/blog/resulting/">Resulting</a> post makes. And a reversal that doesn't read as a confession is one people can actually make.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>All three of those fixes are easier when the original decision is written down, with its reasons, by the time anyone has to question it. Brief is built around that record, and each fix has a place in that record.</p>

<p><strong>Process gets a record to be graded on.</strong> Brief stores a decision with its rationale, who logged it, and when, whether it was captured from a Slack thread or created with <code>brief decisions create --decision "..." --rationale "..."</code>. In the billing case, the record says the team chose to build because no vendor could express the pricing model. That is the assumption the team can now test. The vendor shipped support, so the reason no longer holds, and the conversation can be about the reason, which is easier to discuss than the engineering lead's judgment. Without the record, the reasoning most people will reach for is the one its author remembers, and that is the version escalation edits first.</p>

<p><strong>Reversal becomes history instead of a confession.</strong> When a team changes course, the old decision stays on record, linked to the one that replaced it (see <a href="https://usebrief.com/blog/supersession/">supersession</a>). The build decision stays readable, with the reasoning that made it sensible in its day. The new decision to buy sits next to it, with its own reasoning: the assumption changed. That is close to Simonson and Staw's first technique: it makes changing course less threatening to the person who decided. Reversing adds a dated entry saying the facts moved, and the earlier judgment stays on record beside it.</p>

<p><strong>The stop condition can live with the decision.</strong> The second technique, a minimum target that triggers a change of policy, is a <a href="https://usebrief.com/blog/tripwire/">tripwire</a>. Brief doesn't set one on its own; it stores the rationale it is given. But a rationale is the natural place to put one: "build, because no vendor supports usage tiers; revisit if a vendor ships them or the build slips past one quarter." Written that way, the decision carries its own exit, agreed before anyone's reputation was attached to staying.</p>

<p><strong>Coding agents meet the same record.</strong> A coding agent asked to keep extending the internal billing system can run <code>brief ask --mode check</code> with the planned change. Check mode validates an approach against the team's existing decisions, so if the team has already recorded the switch to the vendor, the check can flag the conflict before the agent builds another quarter on the old plan. If the switch hasn't been recorded, the check has nothing to compare the plan against. Agents don't escalate out of pride, but an agent that checks will build on whatever decision the record still shows.</p>

<p>The limits matter. Brief can only hold the reasons and thresholds someone writes down, and a decision logged with a thin rationale gives a later review little to test. A record also doesn't remove the person. Someone still has to ask whether the reasons hold, and the person who made the call may still find that hard. What the record changes is the question. "Were you wrong?" is a hard question to ask a colleague. "Does the reason we wrote down still hold?" is an easier one, and it can reach the same answer without putting anyone on trial.</p>

<p>Think of a project your team has extended at least twice. Could anyone point to the reason it was started, and say whether that reason is still true?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is escalation of commitment?</strong> The tendency to keep investing in a failing course of action because you chose it. Barry Staw described it in 1976, in a study where people who were personally responsible for an initial investment put more money back into it after it went badly than people who had inherited the decision.</p>

<p><strong>How is escalation of commitment different from the sunk cost fallacy?</strong> Sunk cost is about resources already spent. Escalation adds personal responsibility: in Staw's study, the people who had made the original call reinvested more than those who hadn't.</p>

<p><strong>How do you reduce escalation of commitment?</strong> In a 1992 comparison, Itamar Simonson and Barry Staw found three techniques worked best: making negative outcomes less threatening to the decision maker, setting minimum targets in advance that trigger a change of policy, and evaluating people on their decision process rather than the outcome.</p>

<p><strong>How does Brief help teams avoid escalation?</strong> Brief records decisions with their rationale, author, and timestamp, and keeps a replaced decision as history when a team changes course. That lets a team test whether the original reasons still hold and makes a reversal an added entry that leaves the original in place. Brief stores a stop threshold only if someone writes it into the rationale.</p>]]></content:encoded>
    </item>
    <item>
      <title>Resulting</title>
      <link>https://usebrief.com/blog/resulting/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/resulting/</guid>
      <pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate>
      <description>A good outcome doesn't prove a good decision, and a bad one doesn't prove a bad decision. Grading calls by results alone teaches teams to abandon what works and repeat what got lucky.</description>
      <content:encoded><![CDATA[<p>A launch slips, and the retro spends an hour on who made the call. A different launch, decided on a hunch that skipped every check, lands well and quietly becomes how the team does launches now. Both lessons came from the same place: the outcome. Neither came from the decision.</p>

<p>Poker players have a name for this: resulting. Annie Duke built the first chapter of <em>Thinking in Bets</em> (2018) around it. Resulting means grading a decision by its outcome alone, treating a good result as proof of a good call and a bad result as proof of a bad one.</p>

<p>Outcomes do carry information. The trouble is that a single outcome mixes the quality of the decision with luck and with facts nobody could have known, and resulting assigns all of it to the decision.</p>

<h2 id="four-quadrants-two-of-them-misleading">Four quadrants, two of them misleading</h2>

<p>Every decision lands in one of four places once the result comes in.</p>

<div class="table-scroll rail-wide" role="region" aria-label="Table 1" tabindex="0">
<table><thead><tr><th scope="col">Decision and outcome</th><th scope="col">What resulting concludes</th><th scope="col">What actually happened</th></tr></thead><tbody><tr><th scope="row">Sound decision, good outcome</th><td>"We were right."</td><td>Usually fair, though some of it was still luck</td></tr><tr><th scope="row">Sound decision, bad outcome</th><td>"That was a mistake. Never again."</td><td>Bad luck got punished, and a process that works gets dropped</td></tr><tr><th scope="row">Poor decision, good outcome</th><td>"That worked. Make it standard."</td><td>Luck got rewarded, and an unpriced risk becomes policy</td></tr><tr><th scope="row">Poor decision, bad outcome</th><td>"We were wrong."</td><td>Usually fair</td></tr></tbody></table>
</div>

<p>The two rows where decision and outcome disagree are where teams learn the wrong lesson. They also compound. A team that drops a sound process after one unlucky result has to relearn it later. A team that adopts a lucky shortcut keeps running the same bet until the odds catch up.</p>

<h2 id="why-thinking-harder-in-the-retro-doesn-t-fix-it">Why thinking harder in the retro doesn't fix it</h2>

<p>The obvious remedy is to ask, during the retro, what the decision looked like before anyone knew the result. Baruch Fischhoff tested how well people can do that. In "Hindsight is not equal to foresight" (1975), he gave people short accounts of events with several possible outcomes. Some were told which outcome had actually happened, then asked how likely each outcome had seemed. Those who knew the outcome rated it as more likely than people who didn't. Fischhoff called this creeping determinism: once you know how something ended, the ending starts to look like it was always coming.</p>

<p>That is the trap inside every retro. The people judging the decision already know the outcome, and knowing it changes their sense of what was predictable. Asking them to set it aside is asking them to unknow something.</p>

<p>So the fix has to come from a witness that never learned the outcome.</p>

<h2 id="grade-the-decision-on-what-was-known">Grade the decision on what was known</h2>

<p>Duke's alternative is to treat each decision as a bet and judge the bet rather than the payout. One practical way to apply that is three questions, each answered from the time of the decision, not from today:</p>

<ol><li><strong>What did we know?</strong> The information available when the call was made, including what was uncertain.</li><li><strong>What did we expect?</strong> The outcome the team thought most likely, and the outcomes it thought possible.</li><li><strong>Why this option?</strong> The reasoning that connected the first two to the choice.</li></ol>

<p>A bad outcome inside the range the team expected says little about the decision on its own; the question is whether that range was reasonable. A bad outcome the team never considered, but reasonably could have, is evidence about the decision. A good outcome that relied on something nobody expected is the dangerous one, because it looks like skill.</p>

<p>None of these questions can be answered reliably after the fact, for the reason Fischhoff found. They can only be read from something written before the outcome arrived.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>Fischhoff's result is why a decision record does more than help people remember. A record written at the time of the decision is the one witness in the retro that doesn't know how things turned out. Everyone in the room has hindsight. A record left as it was written has only foresight.</p>

<p>Brief's decision records carry the pieces a fair retro needs. When a team logs a decision from Slack, the <a href="https://usebrief.com/docs/slack-integration/">Slack integration</a> captures the decision itself, the rationale from the message, who logged it, a timestamp, and the channel where the conversation happened. A coding agent or teammate can record the same thing from the CLI with <code>brief decisions create --decision "..." --rationale "..."</code>. The rationale answers the third question directly. The timestamp is what makes it foresight: it dates the reasoning to before the result existed, so the retro reads what the team thought then instead of what anyone, including the person who made the call, remembers thinking now.</p>

<p>The record also protects the decision after it changes. When a bad outcome leads a team to reverse course, Brief keeps the old decision as history and marks that a newer one replaced it, the relationship the <a href="https://usebrief.com/blog/supersession/">supersession</a> post describes. The original call and its reasoning stay readable after they stop governing. That matters for resulting specifically. A team asking "did we learn something, or did we just get unlucky?" six months later can read what the first decision assumed, compare it with what actually happened, and see whether the reversal answered a flaw in the reasoning or a bad draw.</p>

<p>The second question is the one most records miss, and Brief's do too unless someone writes it in. Brief stores the rationale it is given. It doesn't ask for a probability or an expected range on its own. The cheapest fix is to put the bet in the rationale: "we expect most of the accounts we contacted to switch plans within a quarter; if almost none do, the pricing assumption was wrong." That one sentence turns a later bad result from a verdict into a comparison, and it is the same move a <a href="https://usebrief.com/blog/tripwire/">tripwire</a> makes: decide in advance what evidence would mean you were wrong.</p>

<p>The limits are worth stating. A record only helps if it was written at the time and left alone afterward; a rationale reconstructed or edited after the result carries the same hindsight as the retro. A rationale also says what the team believed, not whether the belief was reasonable, so grading the decision still takes judgment. What the record changes is what that judgment has to work from: the reasoning as it stood before anyone knew the answer, instead of a memory that already does.</p>

<p>Think about the last decision your team reversed after a bad result. Could anyone show what the team expected before it knew?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is resulting?</strong> Judging a decision by its outcome alone. The term comes from poker, and Annie Duke's <em>Thinking in Bets</em> (2018) popularized it. It treats a good result as proof of a good decision and a bad result as proof of a bad one, ignoring luck and the limits of what could have been known at the time.</p>

<p><strong>Is resulting the same as hindsight bias?</strong> They are related. Hindsight bias, which Baruch Fischhoff studied in 1975 under the name creeping determinism, is the tendency to see an outcome as more predictable once you know it. Resulting is the judgment that follows: blaming or crediting the decision for an outcome that hindsight makes look inevitable.</p>

<p><strong>Do outcomes ever tell you anything about a decision?</strong> Yes. An outcome the team never considered, but reasonably could have, is evidence about the reasoning, and many outcomes from the same kind of decision say more than one. A single outcome inside the range the team expected says little about whether the decision was sound.</p>

<p><strong>How does Brief help avoid resulting?</strong> Brief records decisions with their rationale, author, and timestamp, and keeps a replaced decision as history instead of deleting it. That gives a retro a dated version of the reasoning, which helps as long as it was written before the outcome and not edited afterward. Brief doesn't record the odds the team expected unless someone writes them into the rationale.</p>]]></content:encoded>
    </item>
    <item>
      <title>Tripwire</title>
      <link>https://usebrief.com/blog/tripwire/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/tripwire/</guid>
      <pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate>
      <description>A risk is easy to acknowledge and easy to ignore. A tripwire decides in advance which evidence will force the plan to react.</description>
      <content:encoded><![CDATA[<p>The launch plan names legal review as a risk. Everyone agrees it matters. For three weeks, the request remains unassigned. Each status meeting produces the same reassurance: there is still time, the reviewer knows it is coming, and escalating now would create unnecessary noise.</p>

<p>By launch week, the team has no good options. The review can delay the release, or the release can lose the claim that made the campaign work. The risk was visible from the beginning. What the plan lacked was a point at which seeing the risk required the team to act.</p>

<p>That point is a tripwire.</p>

<p>A tripwire is a condition agreed before execution that triggers a specific response. It converts a concern into a decision rule: if this observable threshold is crossed, this owner takes this action.</p>

<h2 id="a-risk-is-not-yet-a-control">A risk is not yet a control</h2>

<p>A risk statement describes something that could go wrong. "Legal review may arrive late" is a useful start, but it leaves every later observation open to interpretation.</p>

<p>No reviewer after two days may feel normal. No reviewer after one week may feel uncomfortable. No reviewer after three weeks may finally feel urgent. Without a threshold, the team renegotiates the meaning of the same evidence as the deadline approaches.</p>

<p>This is why a risk register can remain accurate while failing to change the outcome. It preserves the concern but does not govern behavior.</p>

<p class="dl-intro">A tripwire adds four parts:</p>

<dl><div><dt>Signal</dt><dd>The fact the team can observe.</dd></div><div><dt>Threshold</dt><dd>The point at which the fact changes the plan.</dd></div><div><dt>Owner</dt><dd>The person responsible for noticing and acting.</dd></div><div><dt>Response</dt><dd>The action that follows without reopening the original debate.</dd></div></dl>

<p>For the legal review, the tripwire might be: if no reviewer has accepted the request by October 12, the launch lead removes the disputed claim from the first release and sends the reduced copy for final review.</p>

<p>The condition is inspectable. The owner is named. The response keeps the project moving. Nobody has to prove on October 12 that a delay is now certain.</p>

<h2 id="put-the-threshold-before-the-pressure">Put the threshold before the pressure</h2>

<p>Thresholds become harder to set after the evidence starts moving against the plan.</p>

<p>Once a team has invested in a date, a design, or an integration, changing course feels like wasting work. The people closest to the plan can always produce one more reason to wait: the dependency is nearly ready, the metric may recover, the customer probably will respond tomorrow.</p>

<p>Those explanations may be sincere. They are also being evaluated under pressure that did not exist when the plan began.</p>

<p>Set the tripwire when the team can still compare options calmly. A <a href="https://usebrief.com/blog/premortem/">Premortem</a> is a good place to do it. Once the group identifies a concrete failure path, ask for the earliest evidence that it is forming and the last responsible moment to respond.</p>

<p>The threshold should arrive before the failure is complete. "The launch missed its date" is an outcome, not a warning. "The required security test has no scheduled environment five business days before release" leaves time to reduce scope, move the date, or secure the environment.</p>

<h2 id="watch-causes-not-anxiety">Watch causes, not anxiety</h2>

<p>Weak tripwires measure how worried people feel:</p>

<ul><li>Escalate when confidence is low.</li><li>Revisit the plan if progress looks bad.</li><li>Ask for help when the integration seems blocked.</li></ul>

<p>These conditions depend on judgment at the exact moment judgment is most exposed to optimism, fatigue, and social pressure.</p>

<p>Strong tripwires observe the mechanism that creates the failure:</p>

<ul><li>No named reviewer has accepted the security review by Friday.</li><li>Fewer than 80 percent of migrated records pass reconciliation in the dry run.</li><li>The partner sandbox still rejects the production payload shape after two integration attempts.</li><li>More than five pilot users require manual permission repair during the first 48 hours.</li></ul>

<p>The number does not make the decision scientific. It makes the evidence discussable. A team can challenge whether 80 percent is the right threshold before the run begins. After the run, it can see whether the threshold was crossed without first agreeing on how nervous everyone should be.</p>

<p>Use the <a href="https://usebrief.com/blog/outside-view/">Outside View</a> to choose thresholds when history exists. If comparable reviews took ten business days, waiting until day nine to escalate is not patience. It is choosing not to use the base rate the organization already paid to learn.</p>

<h2 id="pre-commit-the-response">Pre-commit the response</h2>

<p>A signal without a response creates a better-timed meeting.</p>

<p>When the threshold fires, the team should not have to invent its options from scratch. The response can be conditional, but it needs enough specificity to change the next action.</p>

<p class="dl-intro">Consider three levels:</p>

<dl><div><dt>Investigate</dt><dd>Gather the missing evidence while the current plan remains intact.</dd></div><div><dt>Constrain</dt><dd>Reduce scope, exposure, or dependency so the risk cannot travel as far.</dd></div><div><dt>Stop</dt><dd>Halt the next irreversible step and return the decision to its owner.</dd></div></dl>

<p>The appropriate response depends on <a href="https://usebrief.com/blog/blast-radius/">Blast Radius</a>. A threshold on an internal prototype may trigger a short investigation. The same signal in a customer-data migration may stop the rollout because the cost of learning in production is much higher.</p>

<p>The response also needs to leave the system recoverable. A tripwire that stops a migration halfway through a non-atomic write can increase the damage it was meant to prevent. Pair it with the same care described in <a href="https://usebrief.com/blog/stop-condition/">Stop Condition</a>: check before the next irreversible step, define the safe halt, and name who decides what happens next.</p>

<h2 id="do-not-let-every-metric-become-a-tripwire">Do not let every metric become a tripwire</h2>

<p>A dashboard can display hundreds of changes. A plan should react automatically to very few of them.</p>

<p>Choose tripwires for failure paths that are consequential, observable early enough to change, and connected to a response the team is genuinely willing to take. If crossing a threshold would never alter the plan, it is not a tripwire. It is decoration.</p>

<p>Too many tripwires create their own failure mode. Owners stop distinguishing alerts from information. Contradictory responses fire at once. The team spends more time administering the control system than reducing the risk.</p>

<p>For each proposed tripwire, ask:</p>

<ul><li>Which failure mechanism does this detect?</li><li>How much useful time remains when it fires?</li><li>Who can observe it without assembling a new investigation?</li><li>What decision changes because it fired?</li><li>Can that response be taken safely?</li></ul>

<p>If those questions do not have concrete answers, refine the condition or remove it.</p>

<h2 id="let-agents-watch-keep-ownership-human">Let agents watch; keep ownership human</h2>

<p>An agent is well suited to monitoring tripwires because the relevant evidence is often scattered across systems. It can notice that a review request has no assignee, a migration check fell below its threshold, or a dependency date moved past the buffer recorded in the plan.</p>

<p>But detecting a condition is different from owning the decision it triggers.</p>

<p>The plan should say which responses the agent may execute, which it may prepare for approval, and which require an immediate handoff. An agent can pause a queued batch when a tested invariant fails. It should not silently cancel a customer commitment because a project metric crossed a threshold unless that authority was explicitly part of the rule.</p>

<p>This boundary also makes the tripwire auditable. The record should show the signal, the threshold, when it fired, who owned the response, and what happened next. If the team overrides the rule, preserve the reason. Otherwise the same debate will return with less context and more urgency.</p>

<h2 id="a-plan-should-know-how-it-will-change">A plan should know how it will change</h2>

<p>Plans usually describe the path they expect to take. Resilient plans also describe the evidence that will make them take another path.</p>

<p>That is the value of a tripwire. It does not predict every failure or remove judgment from the work. It moves one important judgment to a time when the team can make it without the pressure of sunk cost and an approaching deadline.</p>

<p>Name the risk. Choose the earliest useful signal. Set the threshold. Assign the owner. Pre-commit the response.</p>

<p>Then the plan does more than admit what could go wrong. It knows when to change.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>How is a tripwire different from an alert?</strong> An alert reports that a condition occurred. A tripwire also says what happens next: who owns the response and which action follows.</p>

<p><strong>Should every project risk have a tripwire?</strong> No. Use them for consequential risks that can be observed early enough to support a safe response. Some risks are better prevented outright, and others must be accepted because no useful early signal exists.</p>

<p><strong>Can a team override a tripwire?</strong> Yes, when the named decision owner records why the original response no longer fits. The override should remain visible so the team does not repeatedly cross the same threshold without learning from it.</p>

<p><strong>Can an AI agent execute the response automatically?</strong> Only when the response is explicitly authorized, bounded, and recoverable. Otherwise the agent should surface the evidence, prepare the next step, and hand the decision to its owner.</p>]]></content:encoded>
    </item>
    <item>
      <title>Premortem</title>
      <link>https://usebrief.com/blog/premortem/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/premortem/</guid>
      <pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate>
      <description>The plan passed review. Six weeks later, it failed. A premortem asks what most likely went wrong before execution begins.</description>
      <content:encoded><![CDATA[<p>The plan passed review. The owner was clear, the milestones were credible, and every known dependency had a line beside it. Six weeks later, the launch slipped because an approval nobody named arrived too late, a customer workflow behaved differently than the specification, and the person who understood the migration was already committed elsewhere.</p>

<p>None of those failures was impossible to imagine. They were simply harder to say while the room was discussing why the plan would work.</p>

<p>A premortem changes the question. Instead of asking whether a plan looks sound, assume it has already failed and ask what caused the failure. The imagined outcome gives people permission to name risks without first winning an argument about whether the project is good.</p>

<h2 id="start-with-the-failure-not-the-probability">Start with the failure, not the probability</h2>

<p>A risk review that starts from a proposed concern immediately turns into a debate about likelihood.</p>

<p>Will security review really take three weeks? The team handled it quickly last time. Will the integration break? The API is documented. Will customers resist the workflow? The design tested well.</p>

<p>Each response may be reasonable. Together they make the review depend on proving a future event before anyone will prepare for it.</p>

<p>A premortem temporarily removes that burden. Set a specific future scene: it is six weeks after the intended launch, the project missed its goal, and the team now understands why. Ask each participant to write down the causes independently before discussing them.</p>

<p>The exercise is not a prediction that the work will fail. It is a search for explanations that would look obvious in retrospect.</p>

<h2 id="ask-for-causes-not-categories">Ask for causes, not categories</h2>

<p>"Technical risk" is not useful. Neither is "stakeholder alignment" or "scope creep." These labels name an area without identifying an event the team can observe or change.</p>

<p>A useful failure statement is concrete:</p>

<ul><li>The billing migration needs finance approval, but no approver has accepted the review date.</li><li>The launch depends on an undocumented field in a partner API.</li><li>The support workflow was tested with administrators, while daily users have different permissions.</li><li>The only engineer who has reversed this migration is unavailable during launch week.</li></ul>

<p>Each statement names a mechanism. That makes it possible to decide whether to prevent it, detect it early, reduce its effect, or accept it explicitly.</p>

<p>This is also where <a href="https://usebrief.com/blog/blast-radius/">Blast Radius</a> matters. Two failures with the same probability deserve different treatment when one delays an internal experiment and the other corrupts a customer workflow. A premortem should rank causes by the damage they can create, not by how dramatic they sound in the room.</p>

<h2 id="look-for-evidence-already-present">Look for evidence already present</h2>

<p>The best premortem findings are often facts the organization already holds in separate places.</p>

<p>The approval delay may be visible in three older Linear issues. The partner API limitation may have appeared in a Slack thread. The customer-permission mismatch may be sitting in a support ticket that nobody connected to the specification. The unavailable expert may be obvious on a planning calendar.</p>

<p>An agent can help assemble these signals, but only if it can connect the current plan to prior outcomes, decisions, and current ownership. Otherwise it produces a generic risk list that could apply to any project.</p>

<p><a href="https://usebrief.com/blog/outside-view/">The Outside View</a> supplies a useful starting point. Comparable outcomes show where work like this has failed before. The premortem then asks how those failure mechanisms could appear in this particular plan. One grounds the forecast in history; the other turns possible failure into something the team can inspect now.</p>

<h2 id="convert-each-warning-into-a-signal">Convert each warning into a signal</h2>

<p>A risk register becomes stale when it records concerns without saying what would change the team's behavior.</p>

<p class="dl-intro">For every important premortem finding, name four things:</p>

<dl><div><dt>Cause</dt><dd>The specific event or missing condition that creates the failure.</dd></div><div><dt>Signal</dt><dd>The earliest observable evidence that the cause is appearing.</dd></div><div><dt>Owner</dt><dd>The person responsible for watching or removing it.</dd></div><div><dt>Response</dt><dd>What the team will do if the signal appears.</dd></div></dl>

<p>Suppose the concern is a late legal review. The signal might be that no reviewer has accepted the request by October 12. The owner is the launch lead. The response is to remove the disputed claim from the first release rather than wait until launch week to discover that the whole page is blocked.</p>

<p>The date, owner, and response matter more than a red-yellow-green label. They turn an imagined failure into a decision rule.</p>

<h2 id="preserve-disagreement">Preserve disagreement</h2>

<p>A premortem is weak when the facilitator collects ten ideas and compresses them into three polite themes. The sharpest warning is often the one that does not fit the consensus.</p>

<p>Keep each cause in the language of the person who raised it. Record which evidence supports it and which assumption would make it false. If the team decides not to act, record that choice too.</p>

<p>This prevents <a href="https://usebrief.com/blog/decision-debt/">Decision Debt</a> from forming before the project even begins. When a signal later appears, the team can see whether the risk was unknown, judged acceptable, or simply ignored. That distinction is useful for the current response and for the next plan.</p>

<h2 id="stop-when-the-plan-can-react">Stop when the plan can react</h2>

<p>The goal is not to imagine every possible disaster. An endless premortem becomes another form of avoidance.</p>

<p>Stop when the highest-impact failure paths have an owner, an observable signal, and a response. Some causes will be prevented before work starts. Some will be monitored. Some will remain accepted bets because reducing them costs more than the exposure justifies.</p>

<p>That is a real <a href="https://usebrief.com/blog/stop-condition/">Stop Condition</a>: the review is complete when the plan can react to the failures worth preparing for, not when nobody can think of another bad thing.</p>

<p>Before approving the next confident plan, move the calendar forward and state the outcome plainly: this failed. What happened?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Is a premortem just pessimism?</strong> No. Pessimism predicts a bad outcome. A premortem temporarily assumes one so the team can identify preventable causes and make the plan more resilient.</p>

<p><strong>When should a team run one?</strong> Run it after a plan is concrete enough to challenge but before commitments become expensive to change. It is especially useful before launches, migrations, irreversible decisions, and work that crosses several teams.</p>

<p><strong>Who should participate?</strong> Include the people executing the plan and people who will inherit its effects. Independent answers before group discussion help prevent the most senior voice from defining the risk list.</p>

<p><strong>Can an AI agent run the premortem?</strong> It can gather prior failures, identify missing owners, and propose concrete signals. It should not replace the people who understand local constraints or decide which risks the organization is willing to accept.</p>]]></content:encoded>
    </item>
    <item>
      <title>The Outside View</title>
      <link>https://usebrief.com/blog/outside-view/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/outside-view/</guid>
      <pubDate>Mon, 05 Oct 2026 00:00:00 GMT</pubDate>
      <description>A detailed plan explains why this project should work. The outside view asks what happened the last several times your team tried something similar.</description>
      <content:encoded><![CDATA[<p>A team estimates a migration at two weeks because the implementation looks straightforward. The schema is understood, the code path is narrow, and the owner has done this kind of work before. Each detail supports the estimate, even though the team's last five migrations took between five and eight weeks.</p>

<p>Both descriptions can be accurate. One is the inside view, built from the particulars of the plan in front of you. The other is the outside view, built from the outcomes of comparable work. When they disagree, the history usually deserves more weight than it gets.</p>

<h2 id="a-plan-explains-more-than-it-predicts">A plan explains more than it predicts</h2>

<p>The inside view is attractive because it is specific. A plan names the tasks, owners, dependencies, and expected sequence. It gives every week a reason to exist.</p>

<p>That specificity can create confidence without improving the forecast. The plan describes how the work could proceed if its assumptions hold. It says less about how often assumptions like these have held for this team, in this system, with this kind of dependency.</p>

<p>Past projects include the costs that plans routinely omit: review queues, unclear ownership, customer feedback, integration surprises, and decisions that have to be reopened. <a href="https://usebrief.com/blog/throughput/">Throughput</a> makes a related point about measuring completed flow instead of planned effort. The outside view applies that discipline before the work begins.</p>

<h2 id="choose-the-reference-class-before-the-estimate">Choose the reference class before the estimate</h2>

<p>An outside view starts by choosing a reference class: a set of completed efforts similar enough to inform the current one. The choice needs to happen before the team settles on a date. Otherwise it is easy to search history until one example supports the answer everyone already prefers.</p>

<p>Useful comparisons are based on the source of difficulty, not just the label on the project. A billing migration may belong with other changes that crossed customer data, finance review, and third-party systems. It may have little in common with an internal database migration that shared its technical name but none of its coordination cost.</p>

<p class="dl-intro">Ask four questions:</p>

<dl><div><dt>Boundary</dt><dd>Which systems, teams, or customers did the comparable work cross?</dd></div><div><dt>Uncertainty</dt><dd>Which important facts were still unknown when it started?</dd></div><div><dt>Commitment</dt><dd>Who had to review, approve, adopt, or communicate the result?</dd></div><div><dt>Outcome</dt><dd>How long did it take, what changed in scope, and what had to be redone?</dd></div></dl>

<p>The goal is not to find a perfect twin. It is to find several completed efforts exposed to the same kinds of friction.</p>

<h2 id="let-disagreement-reveal-the-hidden-assumption">Let disagreement reveal the hidden assumption</h2>

<p>Suppose the plan says two weeks and the reference class says six. Averaging them into four weeks hides the useful part of the disagreement.</p>

<p>Instead, ask what is materially different this time. Perhaps a reusable migration tool removes work that every prior project had to do manually. Perhaps the same external review still exists, which means a faster implementation will wait in the same queue. A claimed difference should point to an observable change in the work, not confidence in the people doing it.</p>

<p>This turns the outside view into a diagnostic tool. The base rate identifies where the plan is unusually optimistic. The team can then name the mechanism that earns a different outcome and watch whether that mechanism appears.</p>

<h2 id="an-agent-needs-outcomes-not-only-artifacts">An agent needs outcomes, not only artifacts</h2>

<p>An agent can read a detailed specification and produce an even more detailed plan. That makes the inside view cheaper to generate, but it does not make it more accurate.</p>

<p>To take the outside view, the agent needs completed outcomes connected to the conditions that produced them. A closed ticket alone is weak evidence. It needs the original expectation, the actual elapsed time, the dependencies encountered, the scope changes, and the decision that defined success.</p>

<p>This is where <a href="https://usebrief.com/blog/state-estimate/">State Estimate</a> matters. A pile of project records is not yet a coherent account of what happened. The records need current status, identity across systems, and enough provenance to distinguish a finished project from an abandoned one.</p>

<p>Without that structure, an agent will retrieve examples that sound similar. With it, the agent can compare work that behaved similarly.</p>

<h2 id="keep-the-forecast-and-the-explanation-separate">Keep the forecast and the explanation separate</h2>

<p>A useful planning review should preserve both views. The reference class supplies the starting forecast. The plan explains which concrete differences may move the result away from that base rate.</p>

<p>Record those differences as assumptions. If the reusable tool was supposed to remove two weeks, check whether it did. If an approval queue was expected to be shorter, record when the approval arrived. The comparison then improves the current decision and the next reference class.</p>

<p>This also prevents <a href="https://usebrief.com/blog/decision-debt/">Decision Debt</a> from hiding inside estimates. When the date changes, the team can see whether the world changed, an assumption failed, or the original forecast ignored evidence that was already available.</p>

<p>Before accepting a confident plan, ask one question: what happened the last five times we tried work with the same sources of difficulty?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Is the outside view just using an average?</strong> No. The important step is choosing a defensible reference class. A precise average from irrelevant projects is less useful than a range from a small set exposed to the same constraints.</p>

<p><strong>What if the project is genuinely new?</strong> Compare its risky parts separately. A new product may still reuse familiar review, migration, integration, or customer-adoption patterns. Where no comparison exists, keep the uncertainty visible instead of replacing it with precision.</p>

<p><strong>Should the outside view replace a detailed plan?</strong> No. The reference class supplies a forecast, while the plan explains execution and identifies reasons the outcome may differ. Keeping both makes their disagreement inspectable.</p>

<p><strong>How many past projects are enough?</strong> There is no universal minimum. Start with several relevant outcomes, show the range, and state why they are comparable. A small honest reference class is better than a large convenient one.</p>]]></content:encoded>
    </item>
    <item>
      <title>Stop Condition</title>
      <link>https://usebrief.com/blog/stop-condition/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/stop-condition/</guid>
      <pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate>
      <description>An agent that stops too early wastes a run. An agent that was never told where to stop can spend a promise someone else made.</description>
      <content:encoded><![CDATA[<p>A loop that is meant to end needs a stop condition. In code review it is one of the first things a careful reader checks, because a loop without one keeps running until something outside it breaks. An agent run is a loop too: observe, decide, act, repeat. Yet many agent instructions describe the work in detail and say almost nothing about when to stop, other than "when you're done."</p>

<p>Done is the stop condition that does the least to keep a run safe. It tells the agent when it has succeeded. It says nothing about when it should stop even though it hasn't.</p>

<p>A stop condition is any rule that ends a run. The ones this post is about halt an autonomous run before its next step and hand the choice to a person, even though the agent could keep going.</p>

<h2 id="three-runs-that-should-have-stopped">Three runs that should have stopped</h2>

<p>The cases below are hypothetical, but the shapes are common. In each one the agent finished, and finishing was the failure.</p>

<p><strong>The pricing page.</strong> An agent is asked to update pricing page copy to match new plan names. It notices the page advertises a 20 percent annual discount while a config file says 15, and corrects the page to 15. The 20 percent was a promise sales had made to a group of customers through the end of the quarter. The copy was in scope. The number was a decision someone else owned.</p>

<p><strong>The cleanup migration.</strong> An agent is told to remove a deprecated field because nothing reads it anymore. While tracing references, it finds a nightly export job that still reads the field. The instruction says one thing and the code says another. The agent treats the instruction as the stronger signal, rewrites the export to skip the field, and finishes. The partner that consumes the export finds out a week later.</p>

<p><strong>The retry.</strong> An agent sending onboarding emails hits a rate limit, waits, and retries the batch. The retry resends to everyone who had already received the email before the limit hit. Each step was reasonable on its own. The second send broke a commitment, one email per person, that the agent never knew existed.</p>

<div class="table-scroll rail-wide" role="region" aria-label="Table 1" tabindex="0">
<table><thead><tr><th scope="col">Case</th><th scope="col">What the agent ran into</th><th scope="col">The stop condition it lacked</th></tr></thead><tbody><tr><th scope="row">The pricing page</th><td>A number another team owned</td><td>Stop when the next step changes a decision you don't own</td></tr><tr><th scope="row">The cleanup migration</th><td>Evidence that contradicted the instruction</td><td>Stop when what you find disagrees with what you were told</td></tr><tr><th scope="row">The retry</th><td>A promise invisible from inside the task</td><td>Stop when you can't name what the next step commits to</td></tr></tbody></table>
</div>

<h2 id="why-done-is-the-wrong-default">Why done is the wrong default</h2>

<p>The completion check is local. Whether the task is finished is a question the agent can test against the request it was given. Two of the three conditions in the table are not local, and the third can be detected locally but not resolved there. Each depends on a fact outside the task: who owns a decision, what the team believed when it wrote the instruction, which promises already exist. An agent can resolve one of these conditions only if that outside fact is somewhere it can read.</p>

<p>This is also why adding "ask if unsure" to a prompt changes so little. In two of the three cases the agent had no reason to feel unsure. In the third it saw the conflict and settled it alone. Uncertainty is a feeling, and an agent can talk itself past a feeling. A stop condition has to fire on facts about the world, because the agent's sense of its own certainty is exactly what failed.</p>

<h2 id="how-to-write-stop-conditions-that-fire">How to write stop conditions that fire</h2>

<p>A working stop condition has three parts: a trigger the agent can check, a halt that leaves things recoverable, and a handoff that names who decides next.</p>

<ol><li><strong>Ownership.</strong> Before changing a value, a rule, or a promise, check whether a recorded decision covers it and who made it. If the call belongs to someone else, stop and propose instead of acting.</li><li><strong>Contradiction.</strong> When evidence disagrees with the instruction, the instruction loses its authority until a person reconciles the two. Stop and report both sides.</li><li><strong>Unknown commitments.</strong> If the next step reaches customers, partners, or shared records and the agent can't list what it touches, that is the <a href="https://usebrief.com/blog/blast-radius/">blast radius</a> problem. Stop and preview.</li></ol>

<p>The halt deserves as much care as the trigger. A migration stopped halfway can be worse than one finished or never started. Check the triggers before each step that can't be taken back, which is the placement <a href="https://usebrief.com/blog/one-way-doors/">One-Way Doors</a> argues for, not after it.</p>

<p>The handoff needs a name. "Escalate to a human" is a hope, because no specific person owns it. A real handoff goes to the person who owns the decision being crossed, along with the evidence that tripped the trigger.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>Each trigger needs something the agent can't supply from inside its task, whether to detect it or to resolve it: a record of what has been decided and whether it still stands. Keeping that record is Brief's job, and it serves the two triggers that prompts handle worst.</p>

<p><strong>Coverage becomes a question the agent can ask.</strong> A coding agent working with Brief can run <code>brief ask --mode check "We plan to change the annual discount to 15 percent"</code> before it acts. Check mode validates a proposed approach against the team's existing decisions, as the <a href="https://usebrief.com/docs/cli-setup/">CLI guide</a> describes. In the pricing case, if the discount promise is on record, the answer is where the agent learns a recorded decision already covers that number. From inside the task, "has someone already decided this?" is a question the agent can't answer. Against a decision record, it is one command, run before the edit instead of discovered in review.</p>

<p><strong>Contradiction gets a third witness.</strong> The cleanup migration went wrong because the agent had two sources, an instruction and the code, and nothing to settle the tie. The same check can say whether any recorded decision backs the instruction. If one does, and it replaced an older decision about the export, the <a href="https://usebrief.com/blog/supersession/">supersession</a> record shows which one governs. That tells the person reconciling the two what the team intended, and the stop still fires. If none does, the instruction is the only thing saying the field is dead, the code says otherwise, and that is the moment to stop and report both.</p>

<p><strong>The check belongs in the middle of the run, too.</strong> A check run once at planning time sees only the request, and none of the three requests mentioned the discount, the export job, or the already sent batch. The agent learned about each of them partway through. The habit that catches them is to ask again whenever the work reaches something the original request didn't mention: a value nobody asked to change, a consumer nobody listed, a side effect outside the task.</p>

<p><strong>Brief holds its own agents to the same rule.</strong> The judgment agents among the <a href="https://usebrief.com/blog/sixteen-agents/">sixteen</a> stop at a proposal in the review queue, and a new agent's first run is a <a href="https://usebrief.com/blog/dry-run/">dry run</a> that never delivers. Those apply the ownership and unknown-commitments rules as fixed product behavior instead of leaving them to a prompt.</p>

<p>The limits are worth stating plainly. Check mode is an answer, not a lock. The agent has to ask, and the answer is a judgment over what Brief has on record, which can be wrong in either direction. Brief can only check against what it has: the retry's one-email promise stops the agent only if someone wrote it down where Brief can read it. What Brief changes is that the facts a stop condition depends on have a place to live where an agent can read them.</p>

<p>Pick the agent your team trusts most. Could you name the conditions under which it would stop before finishing?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is a stop condition for an AI agent?</strong> A rule that ends an autonomous run. Finishing the task is the obvious one. The ones that keep a run safe halt it before its next step and hand the choice to a person, even though the agent could continue. They fire on ownership, contradiction, and unknown commitments.</p>

<p><strong>Isn't telling the agent to ask when unsure enough?</strong> Not on its own. An agent that crosses a boundary may not feel unsure at all, or may settle the doubt itself. A useful stop condition fires on a checkable fact, such as a recorded decision that already covers the change, rather than on the agent's sense of its own certainty.</p>

<p><strong>Does every stop need a formal approval?</strong> Not always. A stop can end in a proposal someone accepts later, a preview someone inspects, or a narrower action that stays inside the agent's own scope. What matters is that the run doesn't take the crossing step on its own and that the handoff names who decides.</p>

<p><strong>How does Brief help an agent know when to stop?</strong> It keeps the record the triggers depend on. A coding agent can run <code>brief ask --mode check</code> to validate an approach against existing decisions, and Brief tracks which decisions replaced which. Brief's own judgment agents stop at a proposal in the review queue. Check mode doesn't enforce a stop in your coding agent; it makes the condition something the agent can check.</p>]]></content:encoded>
    </item>
    <item>
      <title>Blast Radius</title>
      <link>https://usebrief.com/blog/blast-radius/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/blast-radius/</guid>
      <pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate>
      <description>A small action can carry a large blast radius when customers, workflows, or dependent decisions inherit its effects.</description>
      <content:encoded><![CDATA[<p>An action looks small when you describe it by the button the agent pressed. Its real size appears when you follow it outward: which customers see it, which workflows depend on it, which promises it alters, and which later decisions now assume it happened.</p>

<p>That outward chain is the action's blast radius.</p>

<h2 id="small-actions-travel-farther-than-they-appear">Small actions travel farther than they appear</h2>

<p>A status change can trigger a notification. The notification can change a customer's expectation. That expectation can change a support plan, a renewal conversation, or a launch commitment. None of those consequences is visible in the original status update, but they are still part of what the action did.</p>

<p>This is why a permission to edit one field is not automatically a permission to make one small decision. The field may be a junction in a much larger system of assumptions.</p>

<p>The first question before an automated action should be: what does this directly change? The second should be: what will other people reasonably do because it changed?</p>

<h2 id="trace-commitments-not-just-dependencies">Trace commitments, not just dependencies</h2>

<p class="dl-intro">Dependency graphs are useful, but they tend to show technical relationships. A blast-radius review needs to include commitments that live outside the code:</p>

<dl><div><dt>People</dt><dd>Who will read, trust, or act on the result?</dd></div><div><dt>Workflows</dt><dd>Which processes will now follow a different path?</dd></div><div><dt>Decisions</dt><dd>Which plans or assumptions will treat the result as evidence?</dd></div><div><dt>Promises</dt><dd>Which customer, partner, or internal expectation will move with it?</dd></div></dl>

<p>An action with few technical dependencies can still have a large social or operational radius. A customer-facing label may touch no other service while changing how every support conversation is framed.</p>

<h2 id="the-radius-is-not-the-same-as-irreversibility">The radius is not the same as irreversibility</h2>

<p><a href="https://usebrief.com/blog/reversible-by-whom/">Reversible by Whom?</a> makes the related point that a rollback can restore system state without restoring trust, time, or expectations. Blast radius adds a measurement question: how many commitments are exposed before anyone tries to roll it back?</p>

<p>An action may be easy to reverse and still deserve a preview because many people will act on it during the short window before reversal. Another action may be hard to reverse but affect only one isolated workflow. Reversibility and radius are different dimensions, and an agent needs both.</p>

<p>The <a href="https://usebrief.com/blog/one-way-doors/">One-Way Doors</a> frame helps with the first dimension. Blast-radius thinking supplies the second: where does this action land, and who has to absorb it?</p>

<h2 id="preview-the-people-downstream">Preview the people downstream</h2>

<p>A useful agent preview should show more than the proposed mutation. It should name the direct target, the likely downstream commitments, and the first safe point at which someone can inspect the effect.</p>

<p>That preview does not need to predict every consequence. It needs to make the important path visible enough for a human to catch a missing dependency before the action travels further.</p>

<p>Reserve deliberate review for actions whose radius crosses a customer boundary, changes a shared commitment, or creates evidence that other work will rely on.</p>

<h2 id="make-the-radius-part-of-the-permission">Make the radius part of the permission</h2>

<p>Permissions are usually written around operations: edit, send, delete, publish. A safer boundary also describes reach. An agent may be allowed to update an internal draft, but not publish it. It may prepare a customer message, but not send one. It may change a local setting, but not one that controls a shared workflow.</p>

<p>Before granting an agent a new action, run the four checks above. The answers describe the real permission surface better than the API method does.</p>

<p>An action is safe to automate when its effects are bounded, inspectable, and recoverable by the people who bear them. When the radius is wide, the preview and the approval boundary should widen with it.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Is blast radius the same as impact?</strong> Impact describes what happened after the fact. Blast radius is the reachable set of people, workflows, decisions, and promises you should inspect before acting.</p>

<p><strong>How can an agent estimate blast radius?</strong> Start with the direct target, then trace notifications, shared records, dependent workflows, and commitments linked to the target. Mark uncertainty instead of inventing a complete graph.</p>

<p><strong>Does a large blast radius always require human approval?</strong> Not always. A reliable preview, a constrained permission, or a staged rollout can be enough when the effects are inspectable and recoverable.</p>

<p><strong>What should happen when the radius is unclear?</strong> Treat uncertainty as part of the risk. Narrow the action, produce a preview, or ask the person who owns the downstream commitment before proceeding.</p>]]></content:encoded>
    </item>
    <item>
      <title>Reversible by Whom?</title>
      <link>https://usebrief.com/blog/reversible-by-whom/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/reversible-by-whom/</guid>
      <pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate>
      <description>A decision can be reversible for the company and costly for everyone who acted on it. The real question is who pays when it is undone.</description>
      <content:encoded><![CDATA[<p>The usual test for a fast decision is whether you can undo it. If the answer is yes, make the call quickly. If the answer is no, slow down and gather more judgment.</p>

<p>That test is useful, but incomplete. It asks whether the organization can reverse the decision. It does not ask who absorbs the cost of reversing it.</p>

<p>A feature flag can be turned off. A customer who built a workflow around the feature still has to repair the workflow. A team can cancel a launch. A partner who hired people for the launch cannot get those weeks back. A database write can be rolled back. The person who received the wrong notification may already have acted on it.</p>

<p><a href="https://usebrief.com/blog/one-way-doors/">One-Way Doors</a> shows how delivery and downstream reliance make a decision irreversible. This post asks who pays when it is reversed anyway. A decision can be reversible for the company while remaining costly for everyone who acted on it.</p>

<h2 id="a-rollback-leaves-downstream-commitments-in-place">A rollback leaves downstream commitments in place</h2>

<p>Inside a company, a decision often looks like a clean switch: ship or unship, enable or disable, keep or remove. The system has a rollback button, so the decision gets classified as a two-way door.</p>

<p>But other people experience the consequences as a sequence of commitments. They learn the new behavior, change their process, tell a customer, reserve capacity, or make a promise. The rollback reverses the system state without reversing the time and trust spent responding to it.</p>

<p>That gap is where "reversible" becomes misleading. The technical state may be recoverable while the social state is not.</p>

<h2 id="reversibility-has-layers">Reversibility has layers</h2>

<p class="dl-intro">Before an agent or a team treats a decision as safe to make quickly, it helps to separate at least four layers:</p>

<dl><div><dt>System reversibility</dt><dd>Can the code or configuration return to its previous state?</dd></div><div><dt>Operational reversibility</dt><dd>Can the team unwind the work without disrupting other work?</dd></div><div><dt>Customer reversibility</dt><dd>Can users recover without losing data, trust, or a useful workflow?</dd></div><div><dt>Commitment reversibility</dt><dd>Can promises, contracts, and expectations be withdrawn without lasting damage?</dd></div></dl>

<p>A decision is only as reversible as its least reversible important layer. A feature that can be switched off in seconds may still deserve careful review if customers will make durable choices based on it.</p>

<p>Not every decision needs a committee. The fast path needs to distinguish a clean rollback from a cost-free rollback.</p>

<h2 id="agents-make-the-blind-spot-easier-to-scale">Agents make the blind spot easier to scale</h2>

<p>An autonomous agent is good at finding decisions that look reversible from inside the system. It sees the deploy, the flag, the configuration, and the documented rollback. It may not see the customer who was told the behavior was permanent or the team that reorganized its work around the new assumption.</p>

<p>That is why decision context matters before autonomy. The agent needs to know not only what action is available, but who is relying on the current state and what would happen if it changed again.</p>

<p>The useful question is "Can I undo this, and what remains changed afterward?"</p>

<h2 id="the-preview-is-part-of-the-decision">The preview is part of the decision</h2>

<p>For a consequential action, a useful preview should name more than the proposed mutation. As a proposal for a stronger review process, it could show the affected commitments: which customers, workflows, deadlines, or dependent decisions will become inconsistent if the action is reversed later. <a href="https://usebrief.com/blog/dry-run/">Dry Run</a> describes the existing preview of what an agent would send; this is the additional context that preview could expose for consequential actions.</p>

<p>That preview gives a human a chance to notice a hidden one-way door before the agent walks through it. It also gives the agent a better boundary than a generic rule such as "ask for approval on irreversible actions."</p>

<p>Approval should attach to the cost of reversal, not just the presence of a rollback command.</p>

<h2 id="the-question-to-add-to-the-checklist">The question to add to the checklist</h2>

<p>When a decision looks like a two-way door, ask one more question: reversible for whom?</p>

<p>If the answer is "the system, but not the people depending on it," treat the decision as consequential. Record the dependencies, preview the effects, and give the people carrying the cost a chance to object before the fast path takes over.</p>

<p>Before taking the fast path, name who would carry the cost of undoing the decision.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Does this make every decision a one-way door?</strong> No. It adds a second test to the technical rollback test. Many decisions remain cheap to reverse; the point is to notice when someone outside the system carries a durable cost.</p>

<p><strong>Who decides whether a decision is reversible?</strong> The people accountable for the outcome should make that call with input from whoever owns the affected customer, operational, or contractual relationship. The person pressing the button rarely has the full view alone.</p>

<p><strong>What should an agent do when reversibility is unclear?</strong> Surface the uncertainty and show the downstream commitments it found. Asking for a targeted review is more useful than silently treating ambiguity as permission to proceed.</p>

<p><strong>Is a rollback plan enough?</strong> A rollback plan explains how to restore system state. It does not automatically restore trust, time, data, or expectations. Those costs need their own plan.</p>]]></content:encoded>
    </item>
    <item>
      <title>One-Way Doors</title>
      <link>https://usebrief.com/blog/one-way-doors/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/one-way-doors/</guid>
      <pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate>
      <description>Most decisions are two-way doors, and agents are right to walk through them fast. The trouble is the few that aren't, and the fact that reversibility depends on more than the decision itself.</description>
      <content:encoded><![CDATA[<p>In his 2015 letter to Amazon shareholders, Jeff Bezos split decisions into two kinds. Some are "consequential and irreversible or nearly irreversible," and those "must be made methodically, carefully, slowly, with great deliberation and consultation. If you walk through and don't like what you see on the other side, you can't get back to where you were before." He called these Type 1 decisions, or one-way doors.</p>

<p>Most decisions aren't like that. "If you've made a suboptimal Type 2 decision, you don't have to live with the consequences for that long. You can reopen the door and go back through. Type 2 decisions can and should be made quickly by high judgment individuals or small groups."</p>

<p>The letter's warning was about large companies getting this wrong in one direction: "As organizations get larger, there seems to be a tendency to use the heavy-weight Type 1 decision-making process on most decisions, including many Type 2 decisions. The end result of this is slowness, unthoughtful risk aversion, failure to experiment sufficiently, and consequently diminished invention."</p>

<p>That is the half of the letter everyone quotes. The other half is in a footnote.</p>

<h2 id="the-footnote-is-the-part-that-matters-now">The footnote is the part that matters now</h2>

<p>Footnote 1 reads: "The opposite situation is less interesting and there is undoubtedly some survivorship bias. Any companies that habitually use the light-weight Type 2 decision-making process to make Type 1 decisions go extinct before they get large."</p>

<p>In 2015 that was the less interesting case, because you rarely saw it. The companies that did it didn't last long enough to be studied, which is the <a href="https://usebrief.com/blog/survivorship-bias/">survivorship bias</a> the footnote names.</p>

<p>Autonomous agents make it the interesting case again. An agent running on a schedule has exactly one decision process, and it's the lightweight one. It reads, it decides, it acts, and nobody looks at that particular call. For a two-way door, that's the right process. Bezos would call anything slower a failure to experiment. For a one-way door, it's the process his footnote says companies don't survive.</p>

<p>So the useful question for anyone deploying agents is the one the letter actually asks: which of these calls are one-way doors, and are those running through a different process from the rest?</p>

<h2 id="reversibility-isn-t-a-property-of-the-decision-alone">Reversibility isn't a property of the decision alone</h2>

<p>Bezos describes the door as a feature of the decision. With agents, the same decision can be reversible in one place and permanent in another. Three things close a door that would otherwise swing both ways.</p>

<p><strong>It leaves the system.</strong> A draft summary is a two-way door. The same summary posted to a shared channel is not. You can delete the message, but you can't make the people who read it unread it, and you can't recall the decision someone made in the ten minutes it was up.</p>

<p><strong>Something builds on it before anyone looks.</strong> A product decision written down is easy to change. The same decision after a coding agent has built a feature against it is a merged pull request, a migration, and behavior a customer has already seen. The decision didn't get less reversible. Everything downstream of it did.</p>

<p><strong>Reversing it leaves no record.</strong> Changing your mind is only a two-way door if the system knows you went back through. If the old decision stays in place looking exactly as authoritative as the new one, you didn't reopen the door. You added a second one, and the next agent picks whichever it finds first.</p>

<p>That gives a short audit you can run on any agent's actions:</p>

<div class="table-scroll rail-wide" role="region" aria-label="Table 1" tabindex="0">
<table><thead><tr><th scope="col">Action</th><th scope="col">Door</th><th scope="col">Why</th><th scope="col">What it needs</th></tr></thead><tbody><tr><th scope="row">Rewrite an internal record from a source that still holds the truth</th><td>Two-way</td><td>A wrong copy gets re-read and corrected</td><td>Speed</td></tr><tr><th scope="row">Draft output nobody has seen yet</th><td>Two-way</td><td>Nothing has left the system</td><td>Speed</td></tr><tr><th scope="row">Deliver output to people</th><td>One-way</td><td>Once it's read, it's read</td><td>A look before the first delivery</td></tr><tr><th scope="row">Accept a judgment call others will build on</th><td>One-way once built on</td><td>Work stacks on top of it</td><td>A human call before it propagates</td></tr><tr><th scope="row">Replace an earlier decision</th><td>Two-way only if marked</td><td>An unmarked old decision keeps governing</td><td>An explicit record of what replaced what</td></tr></tbody></table>
</div>

<p>Most of what an agent does lives in the first two rows. That's Bezos's main point, and it holds: treat those as one-way doors and you get slow for nothing. Put the caution at exactly the doors, and let everything else run fast.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>Brief's agent design maps onto that table: it finds the one-way doors and puts the checks there, and it records reversals so that changing your mind stays a two-way door.</p>

<p><strong>Delivery is treated as a one-way door.</strong> Every new agent in Brief is created paused. When you <a href="https://usebrief.com/blog/dry-run/">arm it</a>, Brief runs a preview against real data using the same production executor the scheduled runner uses, and the preview never delivers. You see what the agent would send before it can send anything. Arming a new agent also checks that it can actually reach where it's configured to deliver. A private Slack channel the bot isn't in blocks arming. That's Type 1 treatment, applied to the one step that can't be taken back, before the agent's first walk through it.</p>

<p><strong>Facts move fast, and judgment waits.</strong> Brief's <a href="https://usebrief.com/blog/sixteen-agents/">agents</a> split along the same line. The ones that deal in observed fact, like Revenue, Pipeline, and Velocity, write directly. A subscription exists or it doesn't, and the agent's job is simply to keep the record true. That's a two-way door, and making someone approve it would be the slowness the letter warns about. The ones that deal in judgment, like Strategy, Positioning, Persona, and Feature, only propose. Each suggestion waits in a review queue until you accept it, edit it, or throw it out. The reason is the table's judgment-call row. What's accepted becomes what a coding agent reads from when it asks Brief what the team has decided, and a judgment call's door closes the moment something gets built on it.</p>

<p><strong>Changing your mind stays a two-way door.</strong> The <a href="https://usebrief.com/blog/supersession/">supersession</a> post walks through a team that decides in March that enterprise exports are CSV-only, then decides in June to allow scoped PDF export for admins. In August an agent finds the March decision and builds CSV-only export, perfectly and wrongly. The team did reverse the decision, and even wrote the new one down. Nothing recorded that it replaced the old one. Brief tracks when one decision replaces another, so the March call stays as history and stops governing the next build. That's what makes Bezos's "reopen the door and go back through" true for a team that works through agents. Without it, every reversal leaves the old door open behind you.</p>

<p>Put together, the design runs lightweight where decisions are reversible and heavyweight where they aren't, which is exactly the split the letter asks for. Two of those places get a check before the one-way step, and the third keeps reversals two-way by recording what replaced what.</p>

<p>The line isn't perfect, and it's worth saying where. A preview is a point-in-time check. It shows what the agent produces against today's data, not next quarter's. An empty or failed preview can be acknowledged and the agent armed anyway. And once an agent is live, running it on demand delivers its output. As the dry-run post puts it, there's no way to see what it would say without saying it. The one-way door gets a look before the first walk through, not a lock on every walk after.</p>

<p>Which of your agents' actions are one-way doors, and did anyone look at them before the first time an agent walked through?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is a one-way door decision?</strong> It's Jeff Bezos's term, from his 2015 letter to Amazon shareholders, for a decision that is consequential and irreversible or nearly irreversible. If you walk through and don't like what's on the other side, you can't get back. He called these Type 1 decisions and said they should be made slowly and with deliberation. Two-way doors, or Type 2 decisions, can be reversed, so they should be made quickly.</p>

<p><strong>Why does the one-way door idea matter more for AI agents?</strong> An agent running on a schedule makes every decision through the same fast, unreviewed process. That's right for two-way doors. For one-way doors, it's the situation the letter's footnote describes: using the lightweight Type 2 process for Type 1 decisions, which it says companies don't survive long enough to get large.</p>

<p><strong>What makes an agent's action a one-way door?</strong> Usually one of three things: the output leaves the system and gets read, something gets built on it before anyone checks, or reversing it leaves no record, so the old version keeps governing. The same decision can be a two-way door in a draft and a one-way door once it's delivered or built on.</p>

<p><strong>Doesn't reviewing one-way doors slow agents down?</strong> Only if you review everything. Bezos's main warning runs the other way: the slowness comes from putting two-way doors through the heavy process. Most of what an agent does is reversible and should run fast. The review belongs at the few steps that aren't, and ideally before the first time, not after every run.</p>

<p><strong>How do you make one-way doors safer for agents?</strong> Put the check before the point of no return, because afterward is too late. Preview output before it's ever delivered, and keep judgment calls out of what others build on until a person accepts them. Neither of those makes the door two-way: a delivered message has still been read, and work built on a decision is still built. The one step that does keep a door two-way is recording what replaced what when a decision changes, instead of deleting or overwriting the old one, so going back through the door really takes you back.</p>]]></content:encoded>
    </item>
    <item>
      <title>Signal vs. Noise</title>
      <link>https://usebrief.com/blog/signal-vs-noise/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/signal-vs-noise/</guid>
      <pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate>
      <description>The worst automated system isn't one that misses problems. It's one that flags so many non-problems that you stop listening.</description>
      <content:encoded><![CDATA[<p>There's a hidden cost to automation that nobody talks about until you hit it: attention collapse.</p>

<p>A system that flags everything looks thorough. It catches all the edge cases, all the things that might matter, all the things you could have missed. You arm it thinking "better safe than sorry." And for the first week, it works. You see the flags, you review them, you act on them. You feel in control.</p>

<p>Then you get the 47th false positive in a day. Then the 200th this week. Your brain stops treating flags as signals and starts treating them as noise. You stop reading them. You scan past them. You look for an off switch. And now the system that was supposed to help you is making you slower, not faster. It's burning attention instead of saving it.</p>

<p>That's not a system catching edge cases. That's alert fatigue dressed up as thoroughness.</p>

<h2 id="why-everything-can-t-matter-equally">Why everything can't matter equally</h2>

<p>Attention is finite. Every alert draws on the same budget, whether it turns out to be real or not. And you can't train someone to ignore the false ones without also slowing their response to the true ones, because at the moment an alert lands, they look the same. Hospitals have a name for where this ends up: alarm fatigue, the point where staff surrounded by beeping monitors start tuning out the one that matters.</p>

<p>An automated system that flags everything trades on the assumption that humans will filter. But filtering is expensive work. It's a cognitive tax. Every flag you have to evaluate, even for a second, is a decision you didn't get to make. Every "this doesn't matter" response is a small mental cost that adds up.</p>

<p>The system makes its job easier by making your job harder.</p>

<h2 id="what-matters-vs-what-could-matter">What matters vs. what could matter</h2>

<p>There's a difference between "this thing might matter" and "this thing actually matters to you." A change to a field you never use is technically a change. A request from a user you banned is technically a request. A permission that could theoretically be misused is theoretically risky. But "could" is not the same as "is."</p>

<p>Systems that try to flag everything are making a decision for you: that all possibilities matter equally. But they don't. Your time, your attention, your decision-making capacity: these are the scarce resource. The system's job is to protect those resources, not consume them.</p>

<p>Filtering is not a limitation on a system. Filtering is the system doing its actual job.</p>

<h2 id="how-brief-approaches-this">How Brief approaches this</h2>

<p>Brief's <a href="https://usebrief.com/blog/sixteen-agents/">review queue</a> is built around that constraint, and it starts by deciding what never needs your attention at all. Agents that deal in observed fact, like Revenue, Pipeline, and Velocity, write directly: a deal is at a stage or it isn't, and asking you to confirm it would be noise. Only the agents that deal in judgment, like Strategy, Positioning, Persona, and Feature, route to the queue, where each suggestion waits until you accept it, edit it, or throw it out. The queue isn't everything Brief noticed. It's the subset that's actually yours to call.</p>

<p>The <a href="https://usebrief.com/blog/approval-theater/">output rubric gate</a> works the other way around: instead of adding flags, it takes them away. It reads the output against your requirements and either delivers it or withholds it. There's no "maybe" pile for you to sort through. That's the point: the filtering happens before anything reaches you. It also has a limit worth naming. The gate fails open: if evaluation times out, the budget exhausts, or all verification passes are skipped, the output ships unchecked and unflagged. Less noise is not the same as a guarantee.</p>

<p>That's different from systems that say "flag everything and let the human sort it out." Those systems are outsourcing the filtering problem to you. Brief's design assumes that filtering is part of the automation, not something that comes after it.</p>

<h2 id="the-cost-of-noise">The cost of noise</h2>

<p>False positives cost more than false negatives in one specific way: they tax attention. A missed flag is bad, but you find out about it when the problem surfaces. A false flag is bad the moment it lands, because now you have to decide whether to care about it.</p>

<p>The cost of noise compounds. Miss one real problem because you were drowning in false alarms, and the damage isn't just that problem. It's the trust cost. You stop believing the system. You start verifying everything it says. And now you're doing the work the automation was supposed to do, plus the work of filtering the automation's output.</p>

<p>The honest system knows its limits and flags appropriately. The system that tries to be helpful by flagging everything is actually giving up on its job, which is to make your work easier, not harder.</p>

<p>How would your work change if the systems you relied on flagged only what you actually needed to know?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Doesn't flagging less mean missing problems?</strong> Sometimes. If you filter too aggressively, you miss real issues. But the flip side (flagging too much) means you miss them too, just in a different way. You're there, staring at the screen, and you tune it out because you can't afford to care. The sweet spot is not "flag everything" or "flag nothing." It's "flag the things your human actually cares about," which requires knowing what matters to them.</p>

<p><strong>How do you know what to flag and what to skip?</strong> Partly, you ask. Different people care about different things: an executive about decisions, a product manager about features, an engineer about features and technical risk. A system can't know which you are until you tell it. The rest is ordering. Even a correct flag can arrive at the wrong moment, so the useful move is to stop flagging anything that doesn't need a person at all. That's why Brief keeps observed facts out of the review queue entirely and only routes the judgment calls to you.</p>

<p><strong>What if the thing I don't care about today becomes critical tomorrow?</strong> Then paying attention to it becomes your decision, not a flag the system imposes on you. If your priorities shift, you shift what you pay attention to. That's different from a system that says "you might want to know about this" 200 times a day.</p>

<p><strong>Can't AI systems just learn what matters to me?</strong> Maybe, eventually. But it takes a long history of your actual behavior to learn from: what you acted on, what you ignored, what came back to haunt you. In the meantime, the honest move is to ask. "What do you want to know about?" is a faster way to learn what matters than trying to infer it from flagging behavior.</p>

<p><strong>What's the line between filtering and hiding?</strong> Filtering is deciding what to show you first. Hiding is removing information without telling you. When you throw out a suggestion in Brief's review queue, that's a filter: it's your call, made on something you actually saw. The test is simple. If you went looking for it, could you find out it had been there?</p>]]></content:encoded>
    </item>
    <item>
      <title>Honest Uncertainty</title>
      <link>https://usebrief.com/blog/honest-uncertainty/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/honest-uncertainty/</guid>
      <pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate>
      <description>The worst output from an automated system isn't a wrong answer. It's a confident wrong answer that looks right.</description>
      <content:encoded><![CDATA[<p>There's a problem with building systems that are supposed to be smart. The smarter they look, the more dangerous they are when they're wrong.</p>

<p>An agent that says "I don't know" doesn't look smart. It looks broken. So you build systems that will always give you an answer, even when they shouldn't. The system becomes confident about things it has no business being confident about. It fills in gaps. It guesses. And because it's an agent (or an LLM, or a model), the guess comes wrapped in a tone that sounds like knowledge.</p>

<p>That's worse than being honest about uncertainty. Much worse.</p>

<h2 id="why-confidence-is-a-trap">Why confidence is a trap</h2>

<p>Confidence is seductive. When a system gives you an answer without hedging, you want to trust it. The human brain treats confident delivery as a signal of accuracy. We're wired to believe the person who says "I'm sure" over the person who says "I think, but I'm not certain." That wiring made sense when people were making the claims and their reputation was on the line. It breaks down when the confident voice is a system that has no reputation to lose.</p>

<p>When an agent is confident, you're more likely to act on its output. You're more likely to skip the verification step. You're more likely to assume the work is done. And if the confident answer is wrong, you find out too late, after you've already committed to a decision based on it.</p>

<p>Uncertainty, on the other hand, requires work. If an agent says "I'm not sure," you have to decide what to do with that. Do you dig deeper? Do you ask a human? Do you change your approach? You can't just move on. The uncertainty forces you to engage.</p>

<p>That's not a bug. That's a feature.</p>

<h2 id="what-honest-uncertainty-looks-like">What honest uncertainty looks like</h2>

<p>Honest uncertainty is not the same as low confidence in an otherwise confident answer. Low confidence is "here's my guess, but I'm not very sure." Honest uncertainty is "this is not a domain where I can be sure. Here's what I found, here's what I don't know, and here's why the gap matters."</p>

<p>There's a difference between those two things.</p>

<p>Low confidence in an answer means the system has an answer but doesn't trust its own answer. That's contradictory. If the system doesn't trust the answer, why should you?</p>

<p>Honest uncertainty means the system is telling you: "Here's the shape of the problem. I can see these parts clearly. These other parts are outside my visibility, and I'm flagging that." The human can then make a judgment call. Do the visible parts matter enough to act on? Is the invisible part something you can tolerate not knowing? Can you find the missing information elsewhere?</p>

<p>That's the conversation you want to have.</p>

<h2 id="how-brief-approaches-this">How Brief approaches this</h2>

<p>Brief's <a href="https://usebrief.com/blog/approval-theater/">output rubric gate</a> runs an LLM evaluation on agent suggestions. That evaluation doesn't just check "is this good?" It checks "does this match the requirements?" The distinction matters. A suggestion can be technically sound but still not match what you asked for. When that happens, the gate can flag it.</p>

<p>But the gate doesn't hide uncertainty when it works. The gate doesn't try to fix the suggestion to make it match. The gate does what an honest system should do: it says "this doesn't fit" and withholds it. However, the gate fails open: if evaluation times out, the budget exhausts, or all passes are skipped, the output ships unchecked and unflagged. That's the honest limitation: the gate is not a guarantee, it's a check that can fail.</p>

<p>The <a href="https://usebrief.com/blog/sixteen-agents/">review queue</a> does something similar. It surfaces suggestions for human judgment, but it doesn't present them as "things we're confident you should do." It presents them as "things we flagged for this category that you should look at." The judgment happens at the human layer, where it belongs.</p>

<p>Neither of these is a system saying "I don't know." But both are systems that refuse to pretend to certainty they don't have (when they can check). They flag where the uncertainty is and let the human decide what to do with it. And both are honest about what they cannot guarantee.</p>

<p>That's honest uncertainty in practice.</p>

<h2 id="the-cost-of-false-confidence">The cost of false confidence</h2>

<p>False confidence costs more than you think. There's the obvious cost: wrong decisions made based on confident wrong answers. But there's also the hidden cost of trust erosion. The first time an agent confidently gives you an answer that turns out to be wrong, you stop trusting the system entirely. You start verifying everything. You second-guess every output. And now the system is slower and more expensive because you don't believe it anymore.</p>

<p>Honest uncertainty doesn't have that problem. If a system says "I don't know" and you find out it was right to say that, you trust the system more. If a system says "here's what I found, and here's what I missed," and the missed part turns out to matter, you respect the system for being honest about the limitation.</p>

<p>The cost of false confidence is your own judgment, deferred to a system you should have questioned. The cost of honest uncertainty is work, upfront, on your terms.</p>

<p>The tradeoff is easy to get wrong, but it's the right one to make. And the systems that get it right are the ones that know their own limits and tell you what those limits are. They don't pretend to certainty. They admit what they don't know. And they let you decide what to do with that honesty.</p>

<p>How would your decisions change if every system you relied on was honest about its uncertainty?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Can't you just give me a confidence score instead?</strong> A number between 0 and 1 doesn't actually tell you why the system is uncertain. Is it uncertain because the data is ambiguous? Because the question is outside its training? Because the domain is inherently hard to judge? Different reasons for uncertainty require different responses. Honest uncertainty tells you the reason. A score tells you how much the system doubts itself, which is not the same thing.</p>

<p><strong>Doesn't honest uncertainty slow things down?</strong> Yes. The system has to explain what it doesn't know, and you have to decide what to do with that information. That's slower than just taking the confident answer. But the speed of a wrong decision is not the speed you should be optimizing for.</p>

<p><strong>What if I need an answer even if the system is uncertain?</strong> Then you make the decision to go with the uncertain answer. You know it's uncertain. You're not being lied to about the confidence level. You can make that choice with your eyes open, and you can plan for the fact that you might be wrong.</p>

<p><strong>Isn't "I don't know" just the system giving up?</strong> Not if it explains why. "I don't know the current inventory level because the API returned a timeout" is not giving up. "I can't verify this person's identity because the documentation is ambiguous on this type of credential" is not giving up. Those are honest assessments of what the system can and can't do. Giving up would be pretending to know anyway.</p>

<p><strong>How do you know when to trust honest uncertainty?</strong> The same way you know when to trust any system: you test it. You send it problems where you know the answer. You see if it says "I don't know" when it should, and if it explains the gap accurately. If it does, you know it's being honest about what it doesn't know. If it doesn't, you know to verify everything.</p>]]></content:encoded>
    </item>
    <item>
      <title>The Certainty Tax</title>
      <link>https://usebrief.com/blog/certainty-tax/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/certainty-tax/</guid>
      <pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate>
      <description>Every point of confidence gained is a cost paid somewhere: slower response, more tokens burned, longer deliberation. The question isn't whether to pay it. It's when.</description>
      <content:encoded><![CDATA[<p>The thing about automation is that it makes you pay for certainty in ways you never had to before.</p>

<p>A human at a desk can say "I'm not sure about this" and move on. They can hedge. They can flag something as needing a second opinion without that flagging costing extra (it's just a Slack message). But when you automate that decision, uncertainty becomes expensive. An LLM that's genuinely confident can answer faster and cheaper. One that's hedging, checking itself, asking for help (that's burning more tokens, taking longer, calling back to you for judgment). The cost is explicit and it's measurable.</p>

<h2 id="what-the-tax-actually-is">What the tax actually is</h2>

<p>When you ask an LLM for high confidence, you're usually asking for one or more of these:</p>

<p><strong>Slower evaluation.</strong> A model that's rushing can output a guess. One that's being careful is re-reading the prompt, checking the output, considering edge cases. All of that takes time. In real-time systems, latency is a cost.</p>

<p><strong>More compute.</strong> Chain-of-thought reasoning, self-reflection, verification steps (these all consume tokens). A model that just answers is cheaper. One that thinks through the answer costs more. Scale that across millions of requests and the tax becomes material.</p>

<p><strong>Narrower output.</strong> A confident model often produces less. It's saying "this and only this," not "this or possibly that." That narrowness costs you flexibility. Sometimes that's exactly what you want. Sometimes it means you lose options you might have used.</p>

<p><strong>Longer deliberation cycles.</strong> If you want to be sure, you need time to deliberate. You need to call back to a human, or run a second pass, or wait for more context. Every extra cycle adds latency and overhead.</p>

<p>The tax isn't abstract. It's real money, real time, real constraints. When you ship an agent that runs on a schedule, each call to maximize certainty is a call you're making with finite budget. Each one you skip is budget you save.</p>

<h2 id="the-tradeoff-isn-t-what-you-think-it-is">The tradeoff isn't what you think it is</h2>

<p>The usual framing is "accuracy vs. speed." But that's not quite right. The real tradeoff is "precision vs. usability."</p>

<p>A high-confidence output is often <em>more precise</em>: it's narrower, more specific, less likely to include noise. But that precision can make it <em>less usable</em> if what you actually need is a broad set of options to choose from, or if the narrow answer is wrong because it was too confident about something it shouldn't have been.</p>

<p>A low-confidence output (or one that explicitly hedges) is often <em>more usable</em>: it gives you options, flags uncertainty where it exists, lets you make a judgment call. But it's noisier. You have to do more work to filter it.</p>

<p>The question isn't "which is better?" The question is "what does this particular decision require?"</p>

<p>If you're auto-approving something and the cost of being wrong is high, you pay the certainty tax. You run the extra checks. If you're generating options for a human to choose from, you probably don't. You'd rather have more options that are a bit uncertain than fewer options that are very certain.</p>

<h2 id="where-brief-handles-the-tax">Where Brief handles the tax</h2>

<p>Brief's approach to this is to make the tax explicit and controllable, not hidden.</p>

<p>When you arm an agent, you can see what it's going to produce in the <a href="https://usebrief.com/blog/dry-run/">dry-run preview</a>. That preview is <em>not</em> high-confidence: it's a single run, no verification, no deliberation. It's fast and cheap. If you don't like it, you don't arm the agent. You see the output before committing to it.</p>

<p>Once the agent is live, <a href="https://usebrief.com/blog/approval-theater/">Brief's output rubric gate</a> applies LLM judges to read the output against your requirements. That evaluation does pay a certainty tax (it's running an extra LLM call, adding latency, consuming tokens). The gate runs automatically and fails open: if evaluation times out, the budget exhausts, or all verification passes are skipped, the output ships anyway. The gate can only withhold or deliver; it can't modify the output.</p>

<p>That's different from systems that try to verify after delivery. Those systems hide the cost; you don't see the latency until something goes wrong. Brief's model is: the preview is where you check, before you arm. If certainty matters, you see what you're getting and decide if it's ready. You control that decision. You don't control the gate's failure modes; you just accept that those exist.</p>

<h2 id="when-to-pay-when-not-to">When to pay. When not to.</h2>

<p>High confidence is expensive. Here's when it's worth it:</p>

<p>You're making a decision that's hard to reverse. Deleting something, changing a permission, marking a deal as won. Those need certainty. The cost is justified because the downside is high.</p>

<p>The output will be used directly without human review. Auto-approvals, automated follow-ups, things that ship without another set of eyes. Those need certainty too.</p>

<p>You're operating under a constraint that requires precision. You have a budget, or a limit, or a rule that doesn't allow for hedging. Certainty is the only option.</p>

<p>Here's when it probably isn't:</p>

<p>You're generating options for a human to choose from. Humans can filter noise. They actually prefer to see options than to have the machine be "certain" about one path. Spend your budget on breadth, not depth.</p>

<p>The output is exploratory. You're brainstorming, generating ideas, looking for what's possible. Certainty is the enemy here. You want the model to range widely, not to narrow down to what it's sure about.</p>

<p>You have time to iterate. If you're not under pressure, generate fast and cheap, get feedback, improve. The extra cycle of human input is worth more than machine certainty.</p>

<h2 id="the-honest-answer">The honest answer</h2>

<p>Certainty is not a given. It's not free. It's a choice you make about where to spend your compute budget. The models haven't gotten cheaper at producing certainty; they've gotten faster at producing <em>guesses</em>. The tax is real and it's worth understanding.</p>

<p>The best agents aren't the ones that are most certain. They're the ones that are certain about the right things and honest about everything else. An agent that says "I'm not sure about this, flagging for you" is more useful than one that guesses with false confidence. An agent that generates options instead of picking one is sometimes exactly what you need.</p>

<p>Brief's design assumes you can't automate good judgment. What you <em>can</em> do is give judgment the information it needs to be made quickly. The dry-run gives you that: you see what would ship, you decide if it's ready. That's not certainty. It's informed choice. And it's a much better deal than paying the certainty tax on things you never needed to be certain about in the first place.</p>

<p>Think of the last automated decision your team turned on without seeing what it would actually output. Would you have approved it if someone had shown you first?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What if the preview looks good but the live output is different?</strong> The preview is a point-in-time test. When the agent actually runs on schedule later, it runs with whatever data exists at that time and may produce different output. That divergence is expected, not a bug. The preview shows you what the agent <em>can</em> do; it's not a guarantee of what will ship. Once the agent is live, the output is out of your hands (the gate might withhold it, but you can't prevent a divergence after the fact).</p>

<p><strong>Doesn't this just push the certainty tax to the human?</strong> Yes. A human reviewing a preview is doing the work the gate would do. The difference is that the human is making a judgment (can I live with this?) instead of just running checks. Those are different skills. Judgment is what you actually need.</p>

<p><strong>Does the gate add latency?</strong> Yes. The gate runs an LLM evaluation on the output, which takes time. If latency is critical, you have to accept less certainty (and the risk that comes with it). If you have time for the gate to run, you get more certainty. That's the tradeoff.</p>

<p><strong>What if I need high certainty and can't afford the tax?</strong> You probably need to change the scope. Instead of trying to be certain about everything, be certain about the few things that matter (hard-to-reverse decisions, high-stakes judgments). Generate options freely for everything else. Let certainty and speed trade off where they should: high-stakes, low-frequency decisions pay the tax. Everything else doesn't.</p>]]></content:encoded>
    </item>
    <item>
      <title>Approval Theater</title>
      <link>https://usebrief.com/blog/approval-theater/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/approval-theater/</guid>
      <pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate>
      <description>Signing off on something you didn't look at is not approval. It's permission to do whatever you were going to do anyway.</description>
      <content:encoded><![CDATA[<p>The usual story about approval is straightforward: you check the work, you sign off, you move on. That's the point of approval. It's a moment where someone who cares about the outcome actually looks at the thing before it ships. Except when it doesn't work that way.</p>

<p>In a lot of places, approval is theater. The sign-off happens, the box gets checked, and nothing actually changed about whether the work was right. Sometimes the person approving didn't look. Sometimes they looked but had no real way to tell if it was correct. Sometimes they looked and found a problem but approved it anyway because the alternative (pulling the thing back, finding a fix, restarting the whole process) was too expensive to contemplate. The sign-off became a gesture that cleared the path, not a judgment about the work.</p>

<p>The thing about approval theater is it's worse than not having approval at all.</p>

<h2 id="what-real-approval-requires">What real approval requires</h2>

<p>Real approval requires three things: access to the work, actual capability to judge it, and authority to say no. Leave out any one of those and you don't have approval anymore. You have the appearance of approval, which is a different problem entirely.</p>

<p>Access is the easiest one to get wrong. A deployment log that shows 47 changes across 12 services with commit messages like "fix" and "refactor" doesn't give you access to the actual work. You get information, yes. But information about what changed and access to judge whether the change was right are not the same thing. A thousand-line diff is easier to approve than a ten-line diff because your brain gives up on actually reading it and just looks for obvious red flags. The person rubber-stamping something they didn't actually look at isn't approving. They've abdicated.</p>

<p>Capability is where approval processes fail quietly. A security checklist for an API change doesn't mean the person reviewing it can spot an SSRF vulnerability. A performance sign-off doesn't prove the reviewer actually knows if the query is going to time out under load. You can have access to the work and still not be able to judge it. When that happens, approval becomes a confidence vote ("this looks reasonable to me") instead of an actual check ("I verified this is correct").</p>

<p>Authority is the constraint approval processes dance around most. You have the power to say no only if there's a real consequence to saying it. If the approval is the last step before launch and blocking means the whole cycle restarts, there's pressure to approve. If you're the third person to sign off on something and the first two already approved it, you're not really empowered to block it. Authority without power is just the appearance of judgment.</p>

<h2 id="what-approval-actually-means">What approval actually means</h2>

<p>Real approval is a moment where someone with the capability and authority to judge the work decides it's ready to ship. That judgment matters because it creates a decision point: this person looked, understood what they were looking at, and decided the risk was acceptable. When approval is real, the person approving owns the outcome. If the thing breaks, it's on them, not just on the person who built it.</p>

<p>That's why approval matters at all. It's not a compliance checkbox. It's a concentration of judgment and responsibility at a specific moment, by a specific person, before the work goes live.</p>

<p>When approval becomes theater (a sign-off that didn't involve real judgment), it does something worse than nothing: it transfers responsibility to someone who didn't actually check. Now if the thing breaks, the person who approved it can say "I signed off on it," and the person who built it can say "they approved it," and nobody was actually accountable for the judgment. Theater creates plausible deniability instead of clear accountability.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>Brief's approach to approval starts with the <a href="https://usebrief.com/blog/dry-run/">dry-run preview</a>: you see what an agent will produce before you arm it, so you can look at actual output and decide whether it's ready. That's real approval, because it satisfies access and capability. Once the agent is live, Brief's <a href="https://usebrief.com/blog/sixteen-agents/">review queue</a> surfaces suggestions to a human judge, but scoped to specific change types Brief flagged for you: decisions, personas, features, and so on. That's not "every suggestion gets judged by a person." It's "categorized suggestions about work Brief surfaced get routed to you for judgment."</p>

<p>What gates delivery of an agent's raw output is the output rubric gate: an LLM-powered filter that reads the agent's suggestions against your requirements and decides whether to deliver them or withhold them. That gate fails open in several places: if the gate itself fails, if the evaluation budget exhausts, or if all passes are skipped. An empty preview can also be acknowledged and armed anyway, so the guarantee is not that something checks every output. It's that the preview is where you can look, and the product is built so that looking is possible before you arm, not that it is enforced.</p>

<p>That's still stronger than most automation. An agent running on a schedule without any check produces output you can't see until it's already delivered. A batched job produces results you'd have to reconstruct afterward to verify. Brief's design assumes you can't approve something you haven't seen, so the moment you can look is before activation, not after it's out the door. The dry-run is real approval because you can exercise access and capability. The review queue is honest about what it is: a filter by category, not a universal check. That's different from approval theater because it doesn't claim to be something it's not.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What's the difference between approval and just rubber-stamping?</strong> Real approval means you looked at the work, understood it well enough to judge it, and decided it was acceptable to ship. Rubber-stamping is checking a box without doing the actual checking. The difference is whether the person approving would be able to explain why they approved it if the thing broke.</p>

<p><strong>Can approval ever be automated?</strong> Some parts can. You can automate the checks for obvious problems: does it compile, do the tests pass, does it meet the style guide. What you can't automate is the judgment about whether the problem the thing solves is actually the right problem to solve, or whether the tradeoff it makes is one you're willing to live with. That judgment has to come from a person.</p>

<p><strong>What if the person approving doesn't have time to really check?</strong> Then you don't have approval, you have a bottleneck. Either you need to give them the time and information to actually check it, or you need a different process. Pretending they checked when they didn't just creates liability with no actual safety benefit.</p>

<p><strong>What if the person approving has time but doesn't have the expertise?</strong> Then you have access but not capability, which is approval theater in a different shape. You need either to pair them with someone who can judge it, or to pick someone else for that particular approval. The right person to approve a decision is not the same person as the right person to approve a security change or a performance optimization. Mismatching expertise to approval authority is where a lot of approval processes fail quietly.</p>]]></content:encoded>
    </item>
    <item>
      <title>Dry Run</title>
      <link>https://usebrief.com/blog/dry-run/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/dry-run/</guid>
      <pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate>
      <description>Trusting a scheduled agent by watching what it does over time means it was already doing that unsupervised the whole time you were watching. Something has to check its work before the first run, not after enough of them.</description>
      <content:encoded><![CDATA[<p>The usual advice for trusting a new automated system is to let it run for a while and see what it does. That works fine for something you're watching in real time. It doesn't work for anything meant to run on a schedule without anyone checking each time, because by the time it's run enough for you to trust it, it has already been making those calls unsupervised the entire time you were forming that trust. Proving itself and running unsupervised are the same activity, not two different phases.</p>

<h2 id="watching-isn-t-the-same-as-checking-beforehand">Watching isn't the same as checking beforehand</h2>

<p>The instinct to "just watch it for a bit" assumes there's a safe window where a new agent's mistakes are cheap to catch. There usually isn't one. A scheduled agent's first real run is functionally identical to its hundredth: same audience, same channel, same consequences if it's wrong. Nothing about being new makes an agent's early output lower-stakes, and nothing about having run a few times without visible complaints proves it's actually been getting things right rather than getting away with being wrong quietly.</p>

<p>The fix isn't watching more carefully. It's separating two different questions that "let it run and see" quietly merges into one: what would this agent actually produce, and should this agent's output go out to anyone. Answering the first doesn't require doing the second at all.</p>

<h2 id="what-a-dry-run-actually-does">What a dry run actually does</h2>

<p>Brief creates every newly created agent paused. When you arm a new agent, the system runs a preview against real data, using the same production executor the scheduled runner will use. The preview produces the actual content the agent generates, but never delivers it. You see what the agent would produce before it goes live.</p>

<p>For a newly created agent, arming runs the preview, then checks whether the agent can reach where it's configured to deliver (a private Slack channel the bot isn't in, or an attempted join that fails, blocks arming). If all checks clear, the agent goes live.</p>

<p>For an already-running agent, editing the identity saves a draft and returns guidance to call the arm tool afterward. When you do, the system runs the preview, grades the draft against the rubric (skipping the delivery check, since nothing about delivery changed on this call), and arms the new identity if it clears.</p>

<p>Editing configuration (like changing the target channel) checks whether the new configuration can deliver before touching the stored config, to leave the currently-running agent untouched if the check fails. If delivery is reachable, the configuration is updated and the agent re-arms on the new config. If the trigger-overlap gate comes back unresolved, the new configuration is saved but the schedule stays paused. Configuration edits do not run a preview; they run only the deliverability and overlap checks.</p>

<p>The preview is different from the post-arm <a href="https://usebrief.com/blog/sixteen-agents/">review queue</a> that routes suggestions through judges after the agent is already live. One answers "what will this produce right now"; the other answers "is this suggestion safe to act on" every time the agent makes one.</p>

<h2 id="the-honest-limit-a-preview-is-not-a-prophecy">The honest limit: a preview is not a prophecy</h2>

<p>A preview shows what an agent produces right now, against the current data and configuration. If the preview output is empty or execution failed, you can acknowledge that outcome and arm anyway. At a new agent's first arm, if delivery is genuinely unreachable, arming is blocked and you have to fix the problem.</p>

<p>What a preview doesn't show is what happens six months from now when the world your agent operates in has shifted. New signals emerge. Business logic changes. An edge case you didn't write the agent to handle surfaces in production. You can run a live agent on demand (which uses the same executor and real data), but that run will deliver its output. There is no way to see what it would say without saying it. You can edit the agent's identity to surface a new preview before arming that edit, but if the agent is running with no pending changes, there is no preview-on-demand. The honest limit is that the preview is a point-in-time check, not a permanent health certificate.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>The dry-run preview is Brief's answer to the core problem: a scheduled agent's first run carries the same stakes as its hundredth, so watching doesn't reduce risk. Brief lets you answer "does it work" before you answer "should it go live" by running the agent once on real data. You see the output using the exact same executor the scheduled runner uses, decide if it's ready, and arm it or revise it. That's decision capture for agents: making the reasoning and its consequences visible before the commit point, when fixing costs nothing.</p>

<p>Think about the last automated system your team turned on without anyone checking its setup first. Would it have cleared the same bar if someone had actually looked?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What does a dry run show you?</strong> What the agent produces when you run it right now, against your current data. When the agent actually runs on schedule later, it will run again with whatever data exists at that time, and produce potentially different output. The preview is a test, not a guarantee of what ships.</p>

<p><strong>What happens if the dry run reveals a problem?</strong> If it's the arm-time preview for a new agent, you revise the configuration and re-run the preview to see the change. If it's a preview on an already-live agent's identity edit, you revise the identity draft and call arm again to get a new preview. Configuration edits don't preview-loop; they check delivery once, and you revise or you don't.</p>

<p><strong>Does a successful dry run mean the agent is safe forever?</strong> No. The data changes, the world changes, what the agent should do changes. The preview you see when you arm an agent is accurate for that moment. You can surface a new preview by editing the agent's identity, and you'll see what it produces then.</p>]]></content:encoded>
    </item>
    <item>
      <title>Conflict Detection</title>
      <link>https://usebrief.com/blog/conflict-detection/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/conflict-detection/</guid>
      <pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate>
      <description>A new ticket can mention the same decision, the same system, the same words as an old commitment, whether it's carrying that decision out or reversing it. Similarity alone can't tell you which.</description>
      <content:encoded><![CDATA[<p>A team decided, months ago, to route a certain kind of request through one particular service. A new ticket comes in that mentions that same service, in almost the same words as the original decision. From a distance, the two look like close cousins: same system, same vocabulary, same area of the product. One of them is carrying that decision out. The other one is quietly reversing it. Nothing about how closely the new ticket resembles the old decision tells you which.</p>

<h2 id="resembling-a-decision-and-agreeing-with-it-are-different-claims">Resembling a decision and agreeing with it are different claims</h2>

<p>Any system built to catch a change that runs against an old commitment starts the same way: find the new work that's actually related to that commitment. That part is comparatively easy, degrees of relatedness between two pieces of text are a well-understood thing to measure. The part that's actually hard comes right after: relatedness alone can't say whether the new work agrees with the old decision or reverses it, because agreement and reversal both produce something that reads as closely related to the source. A ticket that does exactly what a decision called for and a ticket that does the opposite can sit at nearly the same distance from that decision, because distance is measuring which topic something is about, not which side of an argument it's taking.</p>

<p>That gap matters more than it sounds like it should, because it's not a rare edge case. Most new work that's worth comparing against an old decision at all is, by construction, going to be closely related to it. The very thing that makes a candidate worth checking, close resemblance to an existing commitment, is exactly the property that can't distinguish implementing that commitment from contradicting it.</p>

<h2 id="what-it-actually-takes-to-tell-the-two-apart">What it actually takes to tell the two apart</h2>

<p><a href="https://usebrief.com/blog/proactive-brief/">Proactive Brief</a> is where Brief does this. New work gets compared against the team's live decisions, and the candidates that come back related enough to be worth a look go through a second, separate step: a dedicated judgment pass that asks the sharper question resemblance alone can't answer, does this actually agree with the decision or run against it, not just how closely does it resemble the decision. In real testing against actual data, dropping that second step produced nothing but false alarms, changes that were flagged as tension purely because they scored as closely related, when in fact every one of them was doing exactly what the original decision asked for. Relatedness had correctly found the candidates. It had nothing to say about which way they pointed.</p>

<p>Once that judgment step actually rules something in, it doesn't get treated as a foregone conclusion either. It lands in the review queue a person picks up on their own terms, <a href="https://usebrief.com/blog/sixteen-agents/">the same review queue</a> any other judgment call from Brief's agents already waits in, as something worth a second look rather than a fact to act on.</p>

<h2 id="this-isn-t-the-same-gap-as-a-missing-decision">This isn't the same gap as a missing decision</h2>

<p>It's worth being precise about which failure this actually is. <a href="https://usebrief.com/blog/stop-debugging-code-debug-decisions/">A different, already-covered case on this blog</a> covers several ways a decision itself can be deficient: never made, made but not captured, captured but not reachable, or captured but too ambiguous to act on. This is a different problem entirely. The decision here is sound, on record, and findable. The failure is that resemblance to it doesn't tell you agreement from reversal, and that gap exists even when the decision itself has nothing wrong with it.</p>

<p>That's also what separates this from <a href="https://usebrief.com/blog/overruled-precedent/">a post about an agent matching stale surrounding code</a>, which describes a related but different moment: an agent copying a pattern that was itself already overruled, before the work ever gets made. This is downstream of that. The work already exists, related enough to a decision to be worth checking, and the open question is which side of that decision it lands on.</p>

<h2 id="the-honest-limit-a-judgment-call-not-a-solved-measurement">The honest limit: a judgment call, not a solved measurement</h2>

<p>None of this makes telling agreement from reversal a settled problem. A judgment step can be wrong in both directions, calling a real contradiction harmless or flagging an honest implementation as tension, and getting it right depends on real, specific signal about what the decision actually constrains, not just what it's topically about. That's exactly why the output is a candidate for a person to weigh, not a verdict the system enforces on its own. A relatedness score was never going to settle a question about agreement or opposition, and neither is a second automated pass that isn't itself checked by someone who can see the two side by side.</p>

<p>Think about the last piece of work your team shipped that clearly mentioned an old decision. Would anyone have caught it if that resemblance was hiding a reversal instead of a match?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>How does Brief tell a change that agrees with a decision apart from one that contradicts it?</strong> New work gets compared against a team's live decisions for relatedness first, then anything that comes back closely related goes through a separate judgment step asking specifically whether it agrees with the decision or runs against it. Relatedness finds what's worth checking. The judgment step decides which way it points.</p>

<p><strong>Why isn't measuring how related two things are enough on its own?</strong> Because a change that carries out a decision and one that reverses it can both come back looking equally related to that decision, since relatedness is about shared topic, not about agreement. Testing this directly showed that skipping the judgment step and going on relatedness alone produced nothing but false alarms, changes flagged as tension that were actually doing exactly what the decision asked for.</p>

<p><strong>Does this replace the decision that should have guided the work in the first place?</strong> No, it assumes the opposite problem. If the decision itself was never made, never captured, or too ambiguous to act on, checking new work against it won't help, that's a defect in the decision, not in how new work relates to it. This only applies once a sound, findable decision already exists.</p>

<p><strong>Does a flagged conflict get blocked or fixed automatically?</strong> No. Finding a candidate and deciding what to do about it stay separate. A person reviews it and chooses to act, dismiss it, or leave it for later. Being related enough to a decision to raise the question is not the same as being confirmed as an actual conflict.</p>]]></content:encoded>
    </item>
    <item>
      <title>Decision Debt</title>
      <link>https://usebrief.com/blog/decision-debt/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/decision-debt/</guid>
      <pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate>
      <description>Teams track tasks long after they stop tracking the assumptions behind them. That is how old decisions become decision debt.</description>
      <content:encoded><![CDATA[<p>Most teams have a reliable way to record what they decided and an unreliable way to notice when that decision stopped being true.</p>

<p>The launch date remains in the plan. The pricing assumption remains in the strategy document. The customer segment remains in the roadmap. Meanwhile, new evidence accumulates around all three. Nobody explicitly changes the record, so the old decision keeps directing work.</p>

<p>That is one form of decision debt: the cost of carrying an unexamined decision after the conditions that justified it have changed. The term also covers decisions made on unclear requirements, where ambiguity creates rework from the start. In both cases, the debt is the future cost of acting without a decision the team can explain and defend.</p>

<h2 id="decisions-age-even-when-the-documents-do-not">Decisions age even when the documents do not</h2>

<p>A decision is made under a particular set of constraints. A customer interview suggested one need. A technical estimate made one option affordable. A competitor had not yet shipped. The decision was reasonable then because the evidence pointed in a particular direction.</p>

<p>But decisions are not permanent facts. They are commitments with assumptions attached. When those assumptions move, the decision needs a new look even if nobody has announced a contradiction.</p>

<p>This is why a clean decision log can still produce confused work. The log tells you what the team chose. It may not tell you which parts were observed, which parts were inferred, and what would have to change before the choice deserved revisiting.</p>

<h2 id="debt-accumulates-quietly">Debt accumulates quietly</h2>

<p>Decision debt rarely arrives as one dramatic mistake. It builds through small substitutions:</p>

<ul><li>a workaround becomes the default path;</li><li>an exploratory project is described as committed;</li><li>a temporary exception survives the deadline that created it;</li><li>a customer request is treated as representative without fresh evidence.</li></ul>

<p>Each substitution is easy to defend in isolation. Together they make the product operate on a model nobody has checked recently. The work can be busy, consistent, and even on schedule while the reasoning underneath it has gone stale.</p>

<p>The most expensive part is not the old decision itself. It is the work that gets organized around it: tickets refined, dependencies added, customers promised, and capacity reserved. By the time someone asks whether the premise still holds, reversing course feels like throwing away progress.</p>

<h2 id="the-cure-is-not-more-documentation">The cure is not more documentation</h2>

<p>Adding another place to write decisions does not reduce decision debt. A durable record helps only when it keeps the decision connected to its evidence and its revisit condition.</p>

<p>A useful decision record should make four things visible:</p>

<ol><li>what was chosen;</li><li>why it was chosen;</li><li>what evidence would weaken the choice;</li><li>when someone will look again.</li></ol>

<p>The fourth item is the one teams omit most often. Without a review point, “temporary” quietly becomes “the way we do things.” Without the weakening evidence, a later update can be filed as unrelated context instead of recognized as a reason to reconsider.</p>

<h2 id="context-turns-a-log-into-a-working-system">Context turns a log into a working system</h2>

<p>The signals that expose decision debt are usually scattered. A support conversation challenges the customer assumption. A pull request reveals that the technical shortcut is now permanent. A roadmap change quietly conflicts with a commitment in an older planning note.</p>

<p>None of those events has to be a crisis. Their significance comes from the decision they touch. <a href="https://usebrief.com/blog/proactive-brief/">Proactive Brief</a> is the delivery mechanism when a meaningful change lands: it connects new evidence to the decision it bears on and interrupts the people who need to act. This post is about the standing cost when the evidence remains collectively below that interruption threshold, or when the original decision was unclear from the beginning. A context-aware system can still connect the evidence to the old commitment and ask the useful question: is this still the decision we want, or merely the decision nobody has reopened?</p>

<p>That question should not automatically reverse anything. Sometimes the answer is that the original choice still stands, and the evidence makes the reason clearer. Sometimes the answer is that the decision needs a new owner, a smaller scope, or an explicit exception. The value is making the choice inspectable again before more work hardens around it.</p>

<h2 id="pay-the-debt-before-it-compounds">Pay the debt before it compounds</h2>

<p>The practical test is simple. Pick a decision that is shaping work today and try to name the evidence that would make you change it. If nobody can, the team is not holding a decision; it is holding a habit.</p>

<p>Reviewing decisions does not mean reopening every settled question every week. It means giving important commitments a visible relationship to reality. The goal is not endless reconsideration. It is knowing which choices are live, which are provisional, and which have outlived the assumptions that made them sensible.</p>

<p>A product team does not need perfect certainty. It needs to know when it is acting without a decision it can explain, whether that uncertainty comes from yesterday's answer going stale or from an unclear answer at the start. That is the bill decision debt sends: future work organized around reasoning nobody has made explicit.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Is decision debt the same as technical debt?</strong> They share a pattern: a shortcut or unresolved condition becomes more expensive when it is carried forward. Decision debt is about reasoning and commitments rather than code, and it can accumulate even in well-maintained systems.</p>

<p><strong>Should every decision have an expiration date?</strong> No. Every important decision should have a reason and a condition that would justify revisiting it. Some decisions remain valid for years; they still benefit from making that stability explicit.</p>

<p><strong>Who owns paying down decision debt?</strong> The people accountable for the outcome should own the review, while the people closest to the evidence should be able to challenge the conclusion. A brief can surface the debt, but the team still decides whether to reaffirm or change the commitment. When one decision explicitly replaces another, record that relationship as <a href="https://usebrief.com/blog/supersession/">supersession</a>; replacement is one possible outcome, not a required next step.</p>

<p><strong>How do we avoid reopening everything?</strong> Rank decisions by how much current work depends on them and how much their assumptions have moved. Revisit the high-leverage, evidence-shaken choices first; leave stable, low-impact decisions alone.</p>]]></content:encoded>
    </item>
    <item>
      <title>Current State</title>
      <link>https://usebrief.com/blog/current-state/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/current-state/</guid>
      <pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate>
      <description>A team can be surrounded by status updates and still be unable to answer a simple question: what is actually true right now? The difference is not more reporting. It is a current state.</description>
      <content:encoded><![CDATA[<p>Most teams have no shortage of updates. Tickets move. Pull requests open and merge. Someone posts a meeting summary. A project gets marked green, then yellow, then green again. By the end of the week, everyone has received plenty of information and nobody can answer the question that actually matters: what is true now?</p>

<p>That is not a reporting-volume problem. It is a category error. An update is an event. Current state is the best answer, at this moment, to what the events add up to.</p>

<p>Those sound close enough to blur together. In practice, they lead to completely different work.</p>

<p>This is not the same question as how a product system reconstructs the status of work from imperfect records. <a href="https://usebrief.com/blog/state-estimate/">State Estimate</a> is about that underlying substrate. This post is about the reader-facing output: whether a regular brief gives someone a usable shared picture or merely asks them to do the synthesis themselves.</p>

<h2 id="an-activity-feed-is-not-a-picture-of-reality">An activity feed is not a picture of reality</h2>

<p>Suppose a team has spent the week on enterprise onboarding. One issue was split after review. Two pull requests merged. A customer call exposed an edge case. The launch date did not move, but the remaining risk did: the core path works, while account provisioning is now the thing that could delay the release.</p>

<p>The updates are all real. Read them one at a time and you might conclude the project is moving normally. A current-state read says something more useful: the work is still on track, but its limiting constraint changed. That is the thing the team needs to carry into the next decision.</p>

<p>This is why a list of ticket changes cannot substitute for a brief. A list preserves the motion. It leaves the reader to reconstruct the meaning. That reconstruction is where important context gets lost, especially when the relevant evidence is scattered across a tracker, a pull request, a customer conversation, and a decision made three weeks earlier.</p>

<p>The point is not to replace the source material or pretend the summary is more authoritative than the work. It is to make an explicit, inspectable claim about where things stand, with enough grounding that someone can correct it when it is wrong.</p>

<h2 id="the-question-is-not-what-changed-it-is-what-changed-because-of-it">The question is not what changed. It is what changed because of it.</h2>

<p>Updates naturally organize themselves around the thing that emitted them: GitHub reports a merged pull request, Linear reports a status change, a meeting note records what was said. A team does not make decisions in those separate shapes. It needs one shared view of the product situation.</p>

<p>That view has to connect the event to its consequence. A merged pull request might mean a feature shipped, a flag is ready for testing, or only that an internal dependency disappeared. A customer complaint might be an isolated observation, an early sign of a recurring problem, or evidence against a decision the team already made. The event alone cannot tell you which.</p>

<p>Good briefs therefore do more than compress information. They identify the live commitments, the strongest new evidence, the work in motion, and the constraints that still shape the next move. If none of those changed, that is valuable to say plainly too. It turns a quiet week from an assumption into something that was actually checked.</p>

<h2 id="make-the-state-explicit">Make the state explicit</h2>

<p>The <a href="https://usebrief.com/blog/standing-brief/">Standing Brief</a> already defines itself as a read of the current state. This is what that standard requires in practice. A regular brief is useful because it arrives whether or not anything was urgent enough to interrupt someone, but its cadence alone does not make the read useful. A scheduled changelog is still just a changelog.</p>

<p>The job is to produce a current read: which decisions are still governing the work, what evidence has strengthened or weakened them, what is actually moving, and where the team should be careful not to reason from stale assumptions. The result may contain updates, but the updates are evidence for the state rather than the product itself.</p>

<p>This distinction also gives the reader a way to disagree productively. “You missed my ticket” is a correction to an activity feed. “You are treating this project as committed when it is only being explored” is a correction to the team’s model of reality. The second correction is more valuable because it improves the next recommendation, not only the next report.</p>

<h2 id="current-state-is-always-provisional">Current state is always provisional</h2>

<p>None of this means a brief gets to declare the truth from on high. Product work moves, sources disagree, and sometimes the most honest answer is that the state is unclear. A useful brief should preserve that uncertainty rather than fill the gap with a clean-looking story.</p>

<p>It also cannot replace urgent attention. If a decision is being contradicted or a deadline has genuinely slipped, that should interrupt the people who need to act; waiting for the next scheduled read is too slow. The <a href="https://usebrief.com/blog/proactive-brief/">Proactive Brief</a> exists for that sharper job.</p>

<p>The two mechanisms fit together cleanly. An interruption says, “This needs attention now.” A standing brief says, “Here is the best shared picture of where we are.” One protects attention. The other protects understanding.</p>

<p>The next time you receive a weekly update, try one test: could someone who missed the week use it to make a sound decision today? If the answer is no, you received a record of activity, not the current state.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What should a brief do when its sources disagree?</strong> It should name the disagreement rather than smooth it into a confident conclusion. Conflicting tracker status, customer evidence, or decision records are part of the current state; the useful next step may be resolving the conflict, not pretending there is a settled answer.</p>

<p><strong>How often should the current-state read change?</strong> Update it at the cadence the team can act on, and whenever an urgent development changes the picture materially. The important constraint is freshness: a clear read from last week should not silently stand in for today’s situation.</p>

<p><strong>What if nothing material changed for several cycles?</strong> Treat repetition as a prompt to revisit the assumptions behind the plan, not as a reason to pad the brief. The useful note is which commitment remains in force, what evidence would change it, and when the team will look again.</p>

<p><strong>Who should correct the brief when it is wrong?</strong> The people closest to the source evidence should be able to correct the record and the conclusion. A brief earns trust by making its model of the situation easy to challenge, not by replacing the systems where the underlying work is tracked.</p>]]></content:encoded>
    </item>
    <item>
      <title>Standing Brief</title>
      <link>https://usebrief.com/blog/standing-brief/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/standing-brief/</guid>
      <pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate>
      <description>An interrupt-only system has to be stingy with interruptions or nobody listens to it. That's a deliberate design choice, not a flaw, but it means real, true information routinely doesn't clear the bar to get surfaced at all. Something has to carry the rest.</description>
      <content:encoded><![CDATA[<p>A team wires up an assistant to interrupt them when something material changes: a decision gets contradicted, a pattern starts building, a deadline slips. Weeks go by with only the occasional message, and everyone reads the quiet stretches as reassurance. But an interrupt-only system has to be stingy on purpose, or people tune it out entirely, and stinginess means a lot of real, true, worth-knowing information never clears the bar to become a message at all. Quiet doesn't mean nothing happened. It can just as easily mean something happened that wasn't yet worth spending an interruption on.</p>

<h2 id="an-assistant-that-s-earning-its-interruptions-is-by-design-leaving-things-unsaid">An assistant that's earning its interruptions is, by design, leaving things unsaid</h2>

<p>Brief's own <a href="https://usebrief.com/blog/proactive-brief/">Proactive Brief</a> is explicit about this trade, and it's worth taking that design seriously rather than treating it as a flaw to work around: it rations itself to a couple of interruptions a week, collapses related items into one note, and stays silent by default, because an assistant that speaks constantly gets ignored regardless of how often it's right. That restraint is exactly why it's worth listening to when it does speak. It also means the bar for "worth interrupting someone about" is deliberately kept high, and everything under that bar, real signal that just isn't sharp or urgent enough yet, doesn't get surfaced through that channel. Not because the mechanism can't see it. Because surfacing it would spend a scarce budget on something that didn't earn it.</p>

<p>That's a different problem than an alert being too dumb to notice a pattern. A genuinely building customer theme, three small complaints edging toward one real trend, is exactly the kind of thing Proactive Brief is built to eventually catch and act on once it's confident enough to be worth someone's attention. Detection was never the limiting factor here. The limiting factor is the stretch of time before something clears that bar, plus everything that's true and worth knowing yet stays under it permanently, simply because plenty of real information is never urgent enough to earn an interruption.</p>

<h2 id="the-fix-isn-t-a-louder-interrupt-it-s-a-channel-that-owes-nothing-to-urgency">The fix isn't a louder interrupt. It's a channel that owes nothing to urgency</h2>

<p>Lowering Proactive Brief's own bar to catch more of that sub-threshold information would defeat the exact design that makes it worth listening to: interrupt more often on smaller things and the channel gets tuned out, taking the genuinely urgent messages down with it. What closes the gap instead is a second channel that was never competing for that budget in the first place: a standing brief, a full read of the current state delivered on a fixed schedule whether or not anything in it would have justified an interruption on its own. Nothing needs to be wrong, urgent, or even finished building for it to show up. That's the entire point of putting it on a schedule instead of a threshold.</p>

<p>Brief runs this as a separate agent rather than asking one mechanism to do both jobs. The <a href="https://usebrief.com/blog/sixteen-agents/">Weekly Brief Agent</a>, which <a href="https://usebrief.com/blog/situation-awareness/">an earlier post on this blog</a> also looks at from a different angle, synthesizes decisions, research, and work movement into one read delivered on a fixed weekly or daily cadence, to whichever channel a team actually uses. A late interrupt and a standing brief look similar on the surface, both arrive with a summary, but they're answering different questions: an interrupt answers "did something just cross the bar," and a standing brief answers "what does the whole picture look like right now," checked on purpose instead of inferred from the absence of a message.</p>

<h2 id="the-honest-limit-a-standing-brief-is-not-a-substitute-for-urgency">The honest limit: a standing brief is not a substitute for urgency</h2>

<p>This isn't a claim that a standing brief makes Proactive Brief's interruptions less necessary, or that a weekly read is just as good as catching a real contradiction the day it happens. A decision about to be silently reversed needs same-day attention, and a report arriving on Friday is too slow for that regardless of how complete it is. The two mechanisms are solving different problems and neither one covers for the other: an interrupt is built to spend its rationed attention on the sharpest, most urgent things it finds, fast; a standing brief is built to show the full state on a schedule, including everything that was true but never urgent enough to spend an interruption on. A team with only the first misses the slow, quiet, real stuff sitting just under the bar. A team with only the second finds out about urgent things too late. Neither gap gets closed by tuning the other mechanism harder.</p>

<p>Think about the last stretch your team went quiet on a tracker or a decision log. Was that quiet actually confirmed, or was it just the kind of silence nobody had checked the meaning of yet?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is a standing brief?</strong> A read of the current state of decisions, research, and work movement, delivered on a fixed weekly or daily schedule regardless of whether anything in it was significant enough to justify an interruption. It shows up whether the period behind it was eventful or completely uneventful.</p>

<p><strong>How is this different from Proactive Brief's interruptions?</strong> Proactive Brief is deliberately rationed: it only interrupts someone when a change clears a real bar for significance, because an assistant that speaks too often gets tuned out along with anything important it says. A standing brief carries no such bar. It goes out on a fixed cadence either way, which means it can surface real information that Proactive Brief hasn't yet judged worth spending an interruption on.</p>

<p><strong>Why not just lower Proactive Brief's bar so it catches more?</strong> Because the bar is what makes the channel worth listening to in the first place. Loosen it and the channel starts firing on things that were never worth an interruption, people stop paying attention to it, and the messages that actually mattered get lost in the same noise. A separate, scheduled channel can carry the sub-threshold information without ever touching how tightly Proactive Brief is rationed.</p>

<p><strong>Does a standing brief replace Proactive Brief?</strong> No, they're built to answer different questions and neither one substitutes for the other. A contradiction that needs same-day action has to interrupt someone; a weekly cadence is too slow for that. Something real but not yet urgent enough to earn an interruption has no natural home in a system built to ration itself, which is exactly the gap a fixed-schedule report is built to fill instead.</p>]]></content:encoded>
    </item>
    <item>
      <title>Coase Theorem</title>
      <link>https://usebrief.com/blog/coase-theorem/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/coase-theorem/</guid>
      <pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate>
      <description>A support lead says the real problem is sales overpromising. The sales lead says the real problem is support refusing to commit to real deadlines. Both descriptions are accurate. Assigning blame between them turns out to be the wrong question entirely, and there's a rigorous reason why.</description>
      <content:encoded><![CDATA[<p>A support lead says the real problem is sales overpromising features that don't exist yet. The sales lead says the real problem is support refusing to commit to timelines anyone can sell against. Get both of them in a room and each account holds up: sales really does promise things too early, and support really does hedge every estimate into uselessness. The instinct is to figure out who's more wrong and fix that side. That instinct is aimed at the wrong target.</p>

<h2 id="avoiding-one-team-s-harm-always-means-causing-the-other-s">Avoiding one team's harm always means causing the other's</h2>

<p>Every friction between two teams looks, from either side, like the other team causing a problem. But the shape of the situation is reciprocal, not one-directional. To stop sales from overpromising, you'd have to slow down or block deals until support signs off, which costs sales real revenue and speed. To stop support from hedging, you'd have to make them commit to estimates before they've actually scoped the work, which costs support real accuracy and credibility. There's no version of "fix the problem" that doesn't impose a cost on someone. The actual question was never who's causing the harm. It's which cost is smaller, and who's positioned to absorb it most cheaply.</p>

<p>That reframing changes what "the fix" even means. It isn't a verdict about which team was behaving badly. It's a trade: does the value support gets from more accurate estimates exceed what sales loses from more upfront review, or does it run the other way? Once the question is a trade instead of a verdict, the obvious next question is whether the two sides can actually strike that trade, and that turns out to depend on something that has nothing to do with who's right.</p>

<h2 id="the-theorem-that-carries-a-name-its-author-never-used">The theorem that carries a name its author never used</h2>

<p>Ronald Coase laid this out formally in "The Problem of Social Cost," published in <em>The Journal of Law and Economics</em> in October 1960. His running example wasn't a support-versus-sales dispute, it was a farmer and a neighboring cattle-raiser. Coase built an arithmetic case: fencing the farmer's property costs $9 a year, each additional steer in the herd causes a specific amount of additional crop damage, and crops sell at $1 a ton. He then worked the numbers twice: once assuming the cattle-raiser is legally liable for crop damage, once assuming he isn't. In both versions, as long as the farmer and the cattle-raiser can actually negotiate with each other at no cost, the herd ends up the same size and the same amount of cultivation happens either way. What changes between the two legal rules isn't the outcome, it's only who ends up paying whom to get there.</p>

<p>That's the result people now call "the Coase theorem": when bargaining between two parties is costless, the efficient outcome doesn't depend on who holds the legal right to begin with, only the distribution of money does. But Coase himself never used that phrase in the paper. The name came six years later, when the economist George Stigler coined "the Coase theorem" in the 1966 edition of his textbook <em>The Theory of Price</em>. Multiple economic historians studying the paper's reception, including Steven Medema's direct examination of how the label took hold, have pointed out that Stigler's name arguably points at the wrong part of Coase's own argument. Coase's actual purpose in the paper wasn't to describe an idealized zero-cost world. He was using that idealized case as a deliberately unrealistic setup, precisely so he could spend the rest of the paper on the world where bargaining is never free, which is the world he actually cared about.</p>

<h2 id="the-honest-limit-this-is-a-benchmark-case-not-a-description-of-the-world">The honest limit: this is a benchmark case, not a description of the world</h2>

<p>The zero-transaction-cost result gets invoked, casually, to argue that markets sort out disputes on their own and rules or defaults barely matter. That's a real misreading of what Coase was doing. He stated plainly that the reciprocal-harm cases he analyzed were meant to clarify the logic of the choice, not to claim real bargaining is free. In the real world, finding out what's actually at stake costs something, negotiating a change costs something, and making a new arrangement stick instead of quietly reverting costs something. Coase's own conclusion was the opposite of "rules don't matter": because those costs are always positive, which side holds the default right, and how expensive it is to renegotiate away from that default, ends up mattering enormously. Daniel Kahneman, Jack Knetsch, and Richard Thaler tested this directly in a 1990 experiment, titled in part after the theorem itself. When they ran a market in tokens with an assigned cash value, trading volume matched what the theorem predicted almost exactly, confirming that transaction costs weren't the obstacle in their setup. When they ran the identical market design with real coffee mugs instead of tokens, trading volume came in well below the predicted level every time, <a href="https://usebrief.com/blog/ikea-effect/">driven by the endowment effect</a> rather than by any transaction cost at all. Even in a setting built to approximate the zero-cost case, actual human valuation can still keep the predicted trade from happening. This post isn't a claim about how any particular company should assign ownership of a dispute like the sales-versus-support one above. It's a claim about which variable actually determines whether a fix happens at all.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>Coase's argument only holds together because he named the specific costs that block a bargain once you leave the zero-cost case: the cost of knowing what's actually at stake, the cost of negotiating a change, and the cost of making that change hold instead of drifting back to the old default. Those three costs are exactly what a decision-capture layer is built to cut, not context in some general sense.</p>

<p>Take a pricing default a PM set six months ago, with a real reason behind it, before that PM moved to a different team. Someone on support now wants to change it. Without a record of the original decision, changing it means re-deriving the entire original argument from scratch, tracking down who made the call and why, which is Coase's information cost paid in full every single time the question comes up again. That reinvestigation is also where negotiation cost bites: without a record to point to, proposing the change means reopening the whole original conversation with whoever still remembers it, re-litigating a decision that was already settled once, rather than a quick confirm-or-supersede exchange against a recorded argument. Even if that negotiation happens once and the change gets made, without a durable record marking the old default as superseded and why, the change is fragile: the next person who hits the same edge case has no way to tell a deliberate update from an accidental drift, and the org either re-litigates it again or silently reverts to the old behavior, which is Coase's enforcement cost showing up as regression. A decision captured with its reasoning, and a supersession recorded when it changes, is a direct reduction of all three specific costs Coase identified as the actual obstacle to an efficient renegotiation, not a proxy for "more context is good."</p>

<p>Look at the last cross-team dispute your org argued about instead of fixed. Was the disagreement really about who was right, or about the fact that renegotiating the boundary cost more than either side was willing to spend?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is the Coase theorem?</strong> The result that when two parties can bargain with each other at no cost, the final, efficient allocation of resources doesn't depend on who holds the legal right at the start, only the distribution of money between them does. Change who's liable and the payments change; the underlying outcome doesn't.</p>

<p><strong>Did Coase himself call it "the Coase theorem"?</strong> No. His 1960 paper never uses that phrase. The economist George Stigler named it "the Coase theorem" in the 1966 edition of his textbook <em>The Theory of Price</em>, six years after Coase's paper was published.</p>

<p><strong>What was Coase's actual example?</strong> A farmer and a neighboring cattle-raiser, worked through with real numbers: $9 a year to fence the property, $1 a ton for crops, and a specific crop-damage cost for each additional steer. Coase showed that whether the cattle-raiser is legally liable for the damage or not, the herd ends up the same size either way, as long as the two of them can negotiate freely. Only who pays whom changes.</p>

<p><strong>Does this mean regulation or clear ownership rules don't matter, since the market sorts it out anyway?</strong> No, and this is the most commonly missed part of the paper. Coase's zero-cost case was a deliberate simplification to set up his real argument: in the real world bargaining is never free, so where a default right sits, and how cheap it is to renegotiate away from it, determines the outcome far more than any assumption that people will just work it out.</p>]]></content:encoded>
    </item>
    <item>
      <title>Conway's Law</title>
      <link>https://usebrief.com/blog/conways-law/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/conways-law/</guid>
      <pubDate>Fri, 11 Sep 2026 00:00:00 GMT</pubDate>
      <description>Three engineers each own one service, and the API between them ends up with three separate ways to represent the same customer, because each engineer built the version they understood best. Nobody sat down and designed that inconsistency on purpose. The team boundary drew it before a line of code existed.</description>
      <content:encoded><![CDATA[<p>Three engineers each own one service in a pipeline, and the API connecting them ends up with three different ways to represent the same customer record, one field per service, none of them reconciled. Nobody sat down and decided the system should represent a customer three inconsistent ways. Each engineer built the version that made sense from inside their own service, and the seam between services is exactly where three people who didn't talk much every day had to agree on something anyway. The inconsistency isn't a bug in the code. It's a shadow cast by the org chart.</p>

<h2 id="a-system-s-seams-trace-back-to-who-had-to-negotiate-with-whom">A system's seams trace back to who had to negotiate with whom</h2>

<p>A system built by more than one person always has internal boundaries, places where one part hands off to another. Those boundaries don't get drawn by the requirements alone. They get drawn wherever two people, or two teams, actually had to coordinate to make the handoff work, and coordination has a cost that's paid in meetings, messages, and shared context that has to exist before an interface can. Two engineers who sit next to each other and talk all day will converge on an interface almost without noticing. Two teams that only sync in a weekly meeting will produce an interface with exactly the amount of agreement that weekly meeting could produce, and not a bit more.</p>

<p>That's why the same technical requirement, given to different organizations, tends to come out looking different. It isn't that one team is more skilled. It's that the actual constraint shaping the design was never only the requirement. It was also which people could talk to which other people, cheaply and often enough, to actually resolve a disagreement instead of just working around it.</p>

<h2 id="where-this-gets-its-name">Where this gets its name</h2>

<p>Software engineering has documented this pattern with more than an anecdote, going back further than most people assume. In April 1968, Melvin Conway published <a href="https://www.melconway.com/Home/Committees_Paper.html">"How Do Committees Invent?"</a> in <em>Datamation</em>, stating the thesis directly: organizations which design systems are constrained to produce designs that are copies of the communication structures of those organizations. His evidence wasn't hypothetical. A contract research organization had eight people assigned to build a COBOL compiler and an ALGOL compiler, five people put on the COBOL job and three on the ALGOL job. The finished COBOL compiler had five processing phases. The finished ALGOL compiler had three. Nobody set out to make the phase count match the headcount. The team split happened first, and the software's own internal structure ended up mirroring it anyway.</p>

<p>Conway's own paper never uses the phrase "Conway's Law." Where the name itself came from isn't fully settled, even between Conway's own account and the record other people kept. Conway's own retrospective note credits Fred Brooks directly: Brooks cited the paper's idea in <em>The Mythical Man-Month</em> (1975) and called it "Conway's Law," and by Conway's own telling, that name simply stuck. Other accounts trace the name earlier, to attendees at the 1968 National Symposium on Modular Programming, the same year Conway's paper came out, who are said to have found the pattern serious and common enough to start calling it "Conway's Law" on the spot, years before Brooks's book existed. Neither account has a contemporaneous record settling it, and the two don't agree with each other. What isn't in dispute either way: the observation and the evidence belong to Conway, and whichever account of the name is right, Brooks's 1975 citation is what carried it far beyond a 1968 trade-magazine article and into general use.</p>

<h2 id="the-honest-limit-this-describes-a-tendency-not-an-iron-rule">The honest limit: this describes a tendency, not an iron rule</h2>

<p>This isn't a claim that org structure is destiny, or that a system can never be shaped differently than the chart that produced it. Conway's own conclusion is careful on this point: he frames it as a constraint design organizations tend to be subject to, driven by communication cost, not a law of physics nobody can work around. Deliberately restructuring who talks to whom, or building in extra coordination specifically at a seam that matters, can produce an interface cleaner than the org chart alone would predict. The pattern isn't inevitable. It's what happens by default when nobody's paying attention to the coordination cost that's quietly doing the actual design work.</p>

<p>It's also not a claim that every design flaw traces to an org chart. Some ugly interfaces are just bad engineering, unrelated to who talked to whom. What the pattern actually predicts is narrower and more specific: where a system boundary sits, and how much friction shows up at that boundary, tends to track the communication boundary between whoever built the two sides, whether or not either team meant for that to happen.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>This is the shape of the problem sitting underneath <a href="https://usebrief.com/blog/product-context-layer/">why a product context layer matters</a> for teams building with more autonomous parts, whether that's engineering teams or increasingly independent AI agents doing pieces of the work. This post can't speak to Brief's own internal engineering org or agent architecture specifically. What Conway's finding says in general is that wherever coordination is expensive or thin, whoever is on either side of that gap, the resulting interface tends to carry the marks of that gap whether anyone intended it or not.</p>

<p>Look at the messiest seam in a system your team owns. Is it messy because the problem itself was hard there, or because that's exactly the boundary where two people who don't talk much every day had to agree on something anyway?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is Conway's Law?</strong> The observation that a system built by an organization tends to end up structured like the communication pattern of that organization, not necessarily like the cleanest possible design for the problem. Interfaces and seams in the system tend to appear at the same places where teams or people had to coordinate, because that coordination is costly and imperfect.</p>

<p><strong>Where does the name come from?</strong> Melvin Conway published the original finding and evidence in his 1968 paper "How Do Committees Invent?" Who actually gave it the name "Conway's Law," and when, isn't fully settled. Conway's own account credits Fred Brooks, who used the name in his 1975 book <em>The Mythical Man-Month</em>. Other accounts trace the name earlier, to attendees at the 1968 National Symposium on Modular Programming, the same year Conway's paper was published. The two accounts disagree, and no contemporaneous record settles it either way. What's certain is that Brooks's 1975 citation is what carried the name into wide use, whether or not it's also where the name started.</p>

<p><strong>What was Conway's actual evidence?</strong> A concrete case from his paper: a contract research organization split eight people into a five-person team building a COBOL compiler and a three-person team building an ALGOL compiler. The finished COBOL compiler had five processing phases and the ALGOL compiler had three, matching the team sizes without anyone designing it that way.</p>

<p><strong>Does this mean bad org design always produces bad software?</strong> No. Conway frames it as a tendency driven by communication cost, not an unavoidable law. Deliberately changing who coordinates with whom, or adding extra coordination specifically where a seam matters, can produce a cleaner result than the org chart alone would predict. It also doesn't mean every flawed interface traces back to team structure. Some are just engineering mistakes with nothing to do with who talked to whom.</p>]]></content:encoded>
    </item>
    <item>
      <title>Nerve Center</title>
      <link>https://usebrief.com/blog/nerve-center/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/nerve-center/</guid>
      <pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate>
      <description>A PM says she can't hand a decision to someone else because no one else has the full context. It sounds like control. Transferring everything she's picked up from a dozen scattered conversations this week would take about as long as making the call herself, and that's the actual reason it doesn't get handed off.</description>
      <content:encoded><![CDATA[<p>A product manager says she can't hand a pricing decision to someone else on the team, because no one else has the full context. It sounds like she's protecting her own turf. Look closer and the actual obstacle is more mundane: the context she'd need to hand over lives in a dozen scattered conversations from the past two weeks, half of them not written down anywhere, and reconstructing it for someone else would take about as long as just making the call herself. The decision isn't the bottleneck. Getting someone else caught up to make it is.</p>

<h2 id="making-a-call-and-explaining-how-you-got-there-are-two-different-transfers">Making a call and explaining how you got there are two different transfers</h2>

<p>Handing a decision to someone else looks like a single transfer, but it's actually two. The first is the decision itself, whatever conclusion got reached. The second is everything that fed into it: which conversations mattered, which ones turned out to be noise, what got said in a hallway that never made it into a doc, why one signal outweighed three others that pointed the other way. The first transfer is usually quick. The second is where the real cost lives, because most of that material was never written down anywhere in the first place, it exists only as something one person happened to notice and remember.</p>

<p>That's a different problem than reluctance to delegate. A person can want, genuinely, to hand something off and still not do it, because the honest cost of transferring the reasoning is higher than the cost of just deciding themselves. Every time that trade gets made, the decision stays with the one person who happened to accumulate the relevant scraps, not because they insisted on keeping it, but because nobody had a cheaper way to move what they knew.</p>

<h2 id="where-this-gets-its-name">Where this gets its name</h2>

<p>Management research documented this pattern with real field data, not just a plausible-sounding story about busy people. Henry Mintzberg first published <a href="https://hbr.org/1990/03/the-managers-job-folklore-and-fact">"The Manager's Job: Folklore and Fact"</a> in <em>Harvard Business Review</em> in 1975; the version linked here is the 1990 HBR Classics reprint, which carries Mintzberg's own retrospective commentary alongside the original findings. He reported on direct observation of working executives rather than surveys about how they thought their day went, and his own study of five American chief executives found they spent 78 percent of their contact time in verbal communication, not documents. That verbal information becomes the manager's real working knowledge of the organization, held in the manager's own head far more than in any file or system. Mintzberg called this position the manager as <strong>nerve center</strong>: the person a disproportionate share of an organization's live, current information actually flows through and accumulates in, by virtue of who happens to be in enough rooms and on enough calls to keep picking it up.</p>

<p>Mintzberg drew the direct consequence out explicitly, under the name he gave it: the <strong>dilemma of delegation</strong>. A manager can't easily hand a task to someone else, he found, not from unwillingness, but because unloading everything relevant that's accumulated in his head, what he called dumping memory, can take as long as doing the task personally. Handing off too little context and the delegate decides on incomplete information. Transferring all of it costs as much time as the manager keeping the task. Mintzberg observed real managers caught between those two bad options, not choosing badly, just facing a real cost with no cheap way around it, decades before anything existed that could have closed the gap.</p>

<h2 id="the-honest-limit-writing-more-things-down-doesn-t-automatically-fix-this">The honest limit: writing more things down doesn't automatically fix this</h2>

<p>It's tempting to hear "the information isn't written down" and conclude the fix is a policy: write more things down. That's not quite what the actual bottleneck is. Plenty of organizations already have wikis, decision logs, and meeting notes, and the dilemma persists inside them anyway, because the hard part was never storage. It's synthesis: which scattered fact from which conversation actually mattered to which decision, and why, is a judgment call sitting on top of the raw record, and a pile of unsynthesized notes doesn't do that judgment for anyone. A wiki page that says a customer mentioned pricing concerns on a call doesn't tell the next person whether that comment was the actual reason a deal slipped or an offhand remark that meant nothing.</p>

<p>This also isn't a claim that every decision should be delegated, or that keeping some judgment calls with the person who has the deepest context is always wrong. Some decisions genuinely need the person holding the most context to make them. What Mintzberg's finding rules out is the more common failure: a decision NOT getting handed off, and staying stuck with one overloaded person, for a reason that has nothing to do with whether someone else could have made a good call, and everything to do with the transfer cost of the reasoning behind it.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>This is the exact gap <a href="https://usebrief.com/blog/product-context-layer/">a product context layer</a> is built to close: not adding another place to write things down, but capturing the reasoning as it forms, so it's structured and attributable to a decision rather than sitting as a fact that only means something to the one person who remembers the meeting it came from. That doesn't make every decision delegable. It changes the actual arithmetic Mintzberg described: reconstructing the reasoning behind a call stops being a fresh, costly reassembly job every time, because the connective tissue between the signal and the decision was captured once, when it was actually formed.</p>

<p>Think of the last decision you didn't hand off, even though you wanted to. Was the real obstacle that nobody else could have made the call, or that getting them the reasoning behind it would have cost you as much time as making it yourself?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What does "nerve center" mean in Mintzberg's research?</strong> The position a manager occupies by virtue of the volume of live, informal information, much of it verbal and never written down, that flows through them because of who they talk to and what meetings they're in. Mintzberg found this made the manager's own head the organization's actual store of current information more than any formal system.</p>

<p><strong>What is the "dilemma of delegation"?</strong> Mintzberg's term for a specific bind managers face, caught between two costly options: skip the context and risk a worse call from whoever they hand it to, or take the time to "dump memory," transferring everything relevant, which he found could eat up as much time as the task itself. Neither side of that trade is free, which is why a decision often just stays with whoever already has the full picture.</p>

<p><strong>Doesn't writing more things down solve this?</strong> No, most teams already have notes and wikis, and the same bind shows up inside them anyway. A note recording that a fact was mentioned doesn't record why it mattered or what it changed, and that missing piece is exactly the part someone else would need to pick the decision up.</p>

<p><strong>Does this mean every decision should be handed off to someone else?</strong> No. Plenty of calls genuinely belong with whoever holds the deepest context. What this points at is narrower: decisions that were fine to delegate stay put anyway, not because anyone judged the delegate incapable, but because moving the reasoning across turned out to cost as much as just keeping the decision.</p>]]></content:encoded>
    </item>
    <item>
      <title>IKEA Effect</title>
      <link>https://usebrief.com/blog/ikea-effect/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/ikea-effect/</guid>
      <pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate>
      <description>A team keeps defending a homegrown internal script that breaks monthly, over a purpose-built tool that does the same job without breaking. Ask why, and the real answer is rarely about which one actually works better. It's that one of the two, they built with their own hands.</description>
      <content:encoded><![CDATA[<p>A team keeps defending a homegrown internal script that breaks roughly once a month, over a purpose-built tool that does the same job without breaking. Ask why, and the reasons offered are usually about flexibility, about knowing exactly how it works, about not wanting to be locked into someone else's assumptions. Ask a harder question, whether the script actually produces better outcomes than the tool, and the reasons get thinner fast. The real answer usually isn't about which one works better. It's that one of the two, they built with their own hands.</p>

<h2 id="the-effort-that-goes-into-something-is-not-evidence-about-what-it-s-worth">The effort that goes into something is not evidence about what it's worth</h2>

<p>These are two separate facts about the same object, and it's easy to let one stand in for the other. How much work went into building a thing is a fact about the builder's own history with it. How well the thing actually performs is a fact about the thing. Nothing connects them automatically, a lot of careful effort can still produce something mediocre, and something thrown together fast can turn out fine, but the person who did the building is in a uniquely bad position to keep the two facts separate, because the effort is a real memory sitting right next to the finished thing every time they look at it.</p>

<p>That's a different claim than "people are bad judges of quality." A team can be genuinely skilled and still fall for this, because the distortion isn't about competence, it's about which fact is doing the emotional work when a decision gets made. The question "is this good" quietly gets answered by a different question, "did I work hard on this," and the two questions feel like the same question from the inside.</p>

<h2 id="where-this-gets-its-name">Where this gets its name</h2>

<p>Behavioral economics has documented this specific distortion with more precision than a general sense that people like their own work. In 2012, Michael Norton, Daniel Mochon, and Dan Ariely published <a href="https://doi.org/10.1016/j.jcps.2011.08.002">"The IKEA Effect: When Labor Leads to Love"</a> (<em>Journal of Consumer Psychology</em>), running a set of studies where participants assembled IKEA storage boxes, folded origami, and built Lego sets, then valued their own creations against ones a stranger or an expert had made. Builders consistently valued their own work close to what an expert's version was worth, and expected other people to share that high opinion of it, when in fact outside observers rated the amateur creations far lower. The gap wasn't small, and it wasn't limited to people who considered themselves particularly skilled.</p>

<p>The paper's sharpest finding is a boundary condition, not the headline result: the effect only shows up when the labor actually finishes. In one version of the experiment, participants built something and then had it taken apart in front of them before being asked to value it, and the inflated valuation disappeared. Effort that never reaches a completed result doesn't produce the attachment. It's specifically the experience of finishing something that does it, not merely touching the parts.</p>

<h2 id="the-honest-limit-this-is-a-specific-effect-not-two-other-well-known-ones-wearing-a-different-name">The honest limit: this is a specific effect, not two other well-known ones wearing a different name</h2>

<p>It's worth being precise about which nearby idea this is, because two other effects sit close enough to blur into it. The endowment effect, demonstrated by Daniel Kahneman, Jack Knetsch, and Richard Thaler in their 1990 paper <a href="https://www.journals.uchicago.edu/doi/abs/10.1086/261737">"Experimental Tests of the Endowment Effect and the Coase Theorem"</a> (<em>Journal of Political Economy</em>), showed that simply owning something, even a coffee mug handed out minutes earlier with zero effort involved, roughly doubles how much a person demands to give it up compared to what a stranger would pay for the identical mug. Norton and his coauthors explicitly ran this as a separate condition rather than treating it as included in what they measured: give someone an object to own but not to build, and the direction of the bump matched the endowment effect, though in their own data that particular gap didn't clear statistical significance. The two effects can show up together in the same object, ownership plus labor, but neither requires the other, and the IKEA effect isn't a special case of the endowment effect, it's a distinct source of extra valuation layered on top of whatever ownership alone contributes, ownership itself well established as a real effect by other research even where this particular sample was too small to confirm it on its own. Sunk cost is a different mechanism again, one that doesn't require an unfinished object or more spending on the horizon: Hal Arkes and Catherine Blumer's 1985 paper <a href="https://doi.org/10.1016%2F0749-5978%2885%2990049-4">"The Psychology of Sunk Cost"</a> (<em>Organizational Behavior and Human Decision Processes</em>) defines it as a greater tendency to continue an endeavor once money, effort, or time has already gone into it, which covers something as ordinary as continuing to use or maintain a tool that's long since finished. The two effects can coexist in the exact same decision, a team keeps maintaining a finished internal tool partly because building it cost real time, and partly because they're fond of the thing they made, but they're answering different questions: one is about whether to keep going given what's already sunk, the other is about how much a finished thing is worth given who made it.</p>

<p>None of this means self-built tools are worse, or that the feeling is baseless in every case. Sometimes the thing you built really is better for your specific situation than what you could buy. What the research rules out is treating the attachment itself as proof of that. The inflated valuation shows up whether the self-built thing is actually good or not, which is exactly what makes it a poor guide to which one is better.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>This is the risk sitting underneath a lot of build-versus-buy decisions, including the plainest version: a team's own hacked-together tracking sheet or internal script against a product built for the exact job, <a href="https://usebrief.com/blog/product-context-layer/">like a shared product context layer instead of scattered decisions no one remembers making</a>. The research here was about individuals valuing furniture and origami, not about which tool teams pick, so this isn't a claim that homegrown tools lose fair comparisons as a rule. What it does say is that the people deciding whether to keep a self-built tool are the same people whose valuation of it can't be trusted as a clean signal, since the same inflation shows up whether the tool is actually good or not.</p>

<p>Next time your team defends a tool it built in-house over one built for the job, is the defense about what the tool actually does, or about who spent the weekend building it?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is the IKEA effect?</strong> The tendency to place a disproportionately high value on something because of the labor invested in creating it, independent of how good the finished thing actually is. Demonstrated by Norton, Mochon, and Ariely in 2012, using furniture assembly, origami, and Lego-building experiments.</p>

<p><strong>How is the IKEA effect different from the endowment effect?</strong> The endowment effect is about ownership alone, simply possessing something, with no effort involved, makes people value it more than a non-owner would, an effect well established in the wider literature. The two effects aren't nested inside each other. Norton and his coauthors tested ownership-without-building as its own separate condition and found labor produces a significant valuation gap that ownership alone, in their sample, did not, evidence that the IKEA effect is a distinct, larger source of valuation, not just ownership by another name.</p>

<p><strong>Is the IKEA effect the same as sunk cost fallacy?</strong> No, and sunk cost is broader than "spending on something unfinished." Arkes and Blumer defined it as a greater tendency to continue an endeavor once money, effort, or time has already gone into it, which covers continuing to use or maintain something that's long since finished. The two can coexist in the same decision, but sunk cost is about whether to keep going given past investment, while the IKEA effect is about how much a finished thing gets valued because of the labor that made it.</p>

<p><strong>Does the IKEA effect mean homemade tools are always worse than bought ones?</strong> No. Some self-built tools genuinely are the better fit for the job. What the research rules out is treating fondness for a tool as evidence either way, since the same fondness turns up regardless of how the tool actually performs.</p>]]></content:encoded>
    </item>
    <item>
      <title>Interrater Reliability</title>
      <link>https://usebrief.com/blog/interrater-reliability/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/interrater-reliability/</guid>
      <pubDate>Tue, 08 Sep 2026 00:00:00 GMT</pubDate>
      <description>A pipeline report says 40% of deals sit in 'proposal' stage. One rep only marks a deal 'proposal' once a signed statement of work goes out. Another marks it the moment a number comes up on a call. Both fields are filled in correctly. The 40% doesn't mean what it looks like it means.</description>
      <content:encoded><![CDATA[<p>A pipeline report says 40% of open deals sit in "proposal" stage. One rep only moves a deal to "proposal" once a signed statement of work has actually gone out. Another rep moves a deal to "proposal" the moment pricing comes up on a call. Both of them filled in the CRM field correctly, by their own definition of what the field means. The 40% is an accurate sum of individually accurate entries, and it still doesn't mean what it looks like it means, because "proposal" was never one thing to begin with.</p>

<h2 id="a-shared-label-doesn-t-mean-a-shared-judgment">A shared label doesn't mean a shared judgment</h2>

<p>Two people can use the exact same word for the exact same field and still be measuring different things, if the rule each of them uses to decide when the word applies is different. This isn't a data-entry error. Neither rep did anything wrong by their own standard, and neither field is technically false. What's missing is the thing that would make the two entries comparable in the first place: some check that both reps, looking at the same deal, would have picked the same stage.</p>

<p>That check doesn't happen automatically just because the field is a dropdown with a fixed set of options. A shared set of labels constrains what anyone can type. It says nothing about whether two different people would type the same one for the same underlying situation. Treat every "proposal" entry across the whole pipeline as equivalent without checking that, and the resulting percentage is really measuring something closer to which rep happened to touch which deal, not how far along the deals actually are.</p>

<h2 id="where-kappa-gets-its-name">Where kappa gets its name</h2>

<p>Measurement science has worked out ways to check this rather than just assume it, and one of the most widely used comes from Jacob Cohen. In 1960, Cohen published <a href="https://doi.org/10.1177/001316446002000104">"A Coefficient of Agreement for Nominal Scales"</a> (<em>Educational and Psychological Measurement</em>), introducing what's now called Cohen's kappa: a statistic for how much two raters actually agree when independently categorizing the same set of cases into a fixed set of labels, corrected for the agreement they'd get from chance alone. That correction is the whole point, and the chance baseline isn't a fixed fifty-fifty guess, it's computed from how often each rater actually uses each label, their own marginal rates. If both raters lean heavily toward the same one or two labels already, chance alone predicts a high agreement rate before either of them has judged anything, which means a raw 90% agreement number can still mean almost nothing was confirmed beyond what their habits already implied. Kappa answers the narrower question that matters: agreement above and beyond what each rater's own labeling habits would already produce.</p>

<p>Cohen's original kappa treats every mismatch the same, "qualified" recorded against "proposal" counts as a disagreement exactly the same size as "qualified" against "closed," and a CRM stage field isn't actually that kind of category set. Stages run in a funnel order, so a one-stage miss and a four-stage miss aren't obviously the same mistake. Unweighted kappa still answers a real, narrower question, whether reps land on the exact same stage, but where the distance between stages is supposed to matter, Cohen's own follow-up, <a href="https://doi.org/10.1037/h0026256">"Weighted Kappa: Nominal Scale Agreement with Provision for Scaled Disagreement or Partial Credit"</a> (<em>Psychological Bulletin</em>, 1968), extends the same chance-correction logic to give partial credit for a near miss instead of scoring every disagreement identically.</p>

<h2 id="the-honest-limit-kappa-needs-something-a-routine-sync-was-never-built-to-produce">The honest limit: kappa needs something a routine sync was never built to produce</h2>

<p>This isn't an argument that CRM data is untrustworthy, or that stage fields should be abandoned. A field correctly recording what a rep entered is a real, checkable fact, exactly what a system that syncs deal records is supposed to capture, and it not being reliable in the interrater sense doesn't make it inaccurate in the recording sense. Those are different properties, and only one of them is what a sync job promises.</p>

<p>The harder property is one a routine sync was never positioned to produce on its own. Measuring interrater reliability the way Cohen described it requires multiple raters independently judging the same cases, two reps staging the identical sample of deals without seeing each other's answer, so the agreement between them can actually be computed. A live pipeline doesn't generate that by default: each deal has exactly one rep entering exactly one stage, once, and there's no second, independent judgment on the same deal to compare it against. Knowing reliability is a real question doesn't hand you the answer. Answering it takes a deliberate check that ordinary CRM usage doesn't produce as a side effect.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p><a href="https://usebrief.com/blog/sixteen-agents/">Brief's own description of its agents</a> is explicit that Pipeline Agent belongs to the group dealing in observed fact: a deal is at a stage or it is not, so the agent keeps that record true rather than second-guessing it. That's the correct job for what a stage field actually is, a real entry someone made. This post's point sits one layer above that job, not against it: whether the stage a given rep entered means the same thing as the same stage entered by a different rep is a separate, harder measurement question, one a fact-keeping sync was never built to answer and doesn't need to in order to do its own job well.</p>

<p>Pull up your team's pipeline by stage. If two different reps had independently looked at the same batch of deals, is there any reason to expect they'd have sorted them the same way?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is interrater reliability?</strong> The general question of how consistently different people agree when each independently makes the same kind of judgment on the same cases. It covers more than one way of measuring that consistency; Cohen's kappa is the specific coefficient for two raters sorting cases into a fixed set of labels, correcting for how much agreement their own labeling habits would produce by chance alone, with a weighted version for cases where the labels themselves have an order.</p>

<p><strong>Where does Cohen's kappa come from?</strong> Jacob Cohen's 1960 paper "A Coefficient of Agreement for Nominal Scales," which introduced the statistic, subtracting out the agreement expected from chance so that what's left actually reflects real agreement between raters on a categorical judgment. Interrater reliability as a general concept doesn't trace to one single paper the way this specific coefficient does.</p>

<p><strong>Why does a shared dropdown in a CRM not guarantee reliable data?</strong> Because a fixed list of options only constrains what any one person can enter, not whether different people apply the same rule to choose between them. Two reps can each fill in a field correctly by their own definition of the label and still mean different things by it, which a shared list of choices can't catch on its own.</p>

<p><strong>Does this mean Pipeline Agent's synced deal data is wrong?</strong> No, and it isn't the question Pipeline Agent is answering in the first place. Its documented job stops at a single right value: what a rep actually typed into the field. Whether typing the same word means the same thing coming from two different reps is a question sitting one level up, outside what any record-keeping sync claims to check.</p>]]></content:encoded>
    </item>
    <item>
      <title>Revenue Recognition</title>
      <link>https://usebrief.com/blog/revenue-recognition/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/revenue-recognition/</guid>
      <pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate>
      <description>A $120,000 annual contract is paid in full on January 3rd. The revenue dashboard shows a huge January and a dead February. The company delivered the same service to the same customers in both months. The swing lived entirely in when the cash happened to arrive, not in anything the business actually did.</description>
      <content:encoded><![CDATA[<p>A $120,000 annual contract is paid in full on January 3rd. The revenue dashboard lights up: January looks like the best month the company has ever had. February, with no new payment of that size, looks dead by comparison. The company kept the product running for the same customers both months, the same team did the same work, nothing about what the business actually delivered changed. The swing lived entirely in when the cash happened to arrive, not in anything that happened in the business during either month.</p>

<h2 id="cash-arriving-and-a-service-being-delivered-are-different-facts">Cash arriving and a service being delivered are different facts</h2>

<p>These are three separate events, not one event described three ways: cash lands in the bank on a specific date, an invoice gets posted to record the billing, and the service the contract promises gets delivered, continuously, across the year the contract covers. Crediting the full $120,000 to January conflates the first event with something it was never a fact about. The customer paid for twelve months of access to a running product. What was actually delivered in January was one month of that, the same amount as every other month in the contract, regardless of which month happened to hold the payment.</p>

<p>The distortion isn't a rounding error, it can flip the entire read on how a business is doing. A company that collects one large annual payment every January and nothing comparable the rest of the year will show a violent boom-and-bust pattern on a dashboard that books revenue on cash arrival, even if the underlying business is perfectly stable, the same handful of customers, renewing on the same terms, receiving the same service every month of the year. Whoever's reading that dashboard isn't just missing some precision. They're looking at a shape that isn't there.</p>

<h2 id="where-this-gets-its-name">Where this gets its name</h2>

<p>Accounting has a formal answer to exactly this problem, and specific standards that govern it today. The FASB and the IASB developed converged rules together, issued in 2014 and phased in for public companies starting in 2018: ASC 606 under US GAAP and IFRS 15 internationally, two distinct standards built from the same core framework, not one rule with two names. Both share the same underlying idea: a company recognizes revenue as it satisfies the performance obligations it promised a customer, not when the cash for those obligations happens to arrive. For a subscription like the one above, where the obligation is to keep a service continuously available for a year, revenue can be recognized evenly across that year, one twelfth per month, specifically because an even split is what actually depicts a continuously delivered obligation. That's a real, worked-out rule, not an accounting trick to smooth a graph.</p>

<p>The idea that revenue and cash timing are different questions is older than either standard. In 1940, William Paton and A.C. Littleton published <em>An Introduction to Corporate Accounting Standards</em> (American Accounting Association, Monograph No. 3), one of the most influential early statements of what accountants call the matching principle: that a period's costs should be recognized against the revenue those costs helped produce, not against whichever period the cash for them happened to move in. Matching is about costs specifically, not revenue timing itself, but it's built on the same underlying insight ASC 606 and IFRS 15 formalize for revenue: a period's numbers are supposed to reflect what actually happened during it, and cash timing alone doesn't tell you that.</p>

<h2 id="the-honest-limit-there-s-no-single-default-pattern">The honest limit: there's no single default pattern</h2>

<p>This isn't a case for treating "one twelfth per month" as the automatic answer for any twelve-month contract. Straight-line recognition is the right pattern specifically when it faithfully represents how the obligation is actually being satisfied, a subscription where the customer has continuous access the whole time is the clean case for it. A contract built around discrete milestones, a project delivered in phases, work whose pace genuinely varies month to month, needs a different pattern, because an even split would misrepresent when the value was actually transferred just as much as booking it all in the first month would. Getting recognition right requires understanding the actual shape of what was promised and delivered. It isn't a formula that applies the same way to every contract just because the contract runs twelve months.</p>

<p>What doesn't require that judgment is the fact underneath it: that a contract is in force, that cash for it actually arrived, that an invoice was posted on a specific date. Each of those is checkable, single-valued, and doesn't depend on anyone's accounting policy. Deciding how the value behind those facts should be spread across the periods it covers is a separate, harder question, one that depends on the real shape of the obligation, not just its length.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p><a href="https://usebrief.com/blog/sixteen-agents/">Brief's own description of its agents</a> draws a version of this same line explicitly: Revenue Agent is grouped with the agents that deal in observed fact, alongside Pipeline and Velocity, writing directly because there's no judgment involved in whether a subscription exists or not. This post isn't claiming Revenue Agent performs revenue recognition itself, deciding how a contract's value should be spread across the periods it covers, that's a separate, harder step layered on top of the underlying fact. What the observed-fact framing buys is the ground floor: a record of what actually happened, cash arrived, a contract exists, that any recognition judgment, whoever makes it, would have to start from.</p>

<p>Look at last month's revenue number again. How much of it reflects the service your team actually delivered that specific month, and how much of it is just the month a payment happened to land in?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is revenue recognition?</strong> The accounting question of which period a contract's revenue actually belongs to, based on when the company satisfies what it promised the customer, not simply when cash for the contract arrives. Under the current standards, ASC 606 in the US and IFRS 15 internationally, converged rules issued by the FASB and IASB, revenue is recognized as an entity satisfies its performance obligations.</p>

<p><strong>Isn't this just the matching principle?</strong> Not exactly, though the two ideas are close relatives. The matching principle, formalized by Paton and Littleton in 1940, is specifically about aligning a period's costs with the revenue those costs helped produce. Revenue recognition is the separate question of which period the revenue itself belongs to in the first place. Today's operative rules for that question are ASC 606 and IFRS 15, not the older matching-principle literature.</p>

<p><strong>Does a twelve-month contract always get recognized one twelfth per month?</strong> No. Straight-line recognition fits an obligation that's genuinely delivered evenly across the period, like continuous access to a running service. A contract built around distinct milestones or uneven delivery needs a pattern that actually reflects when the value transferred, which sometimes means an even split is wrong even for a twelve-month deal.</p>

<p><strong>Does Revenue Agent handle revenue recognition automatically?</strong> This post makes no claim either way. What Brief documents Revenue Agent doing is narrower and doesn't need that answer: keeping one fact current, whether a subscription exists, the kind of fact that has exactly one right value and no accounting policy attached to it.</p>]]></content:encoded>
    </item>
    <item>
      <title>Near-Decomposability</title>
      <link>https://usebrief.com/blog/near-decomposability/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/near-decomposability/</guid>
      <pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate>
      <description>Every domain report looks clean: strategy is on track, sales is fine, support tickets are down. A customer churned the week after a pricing change, and the reason lived entirely in the gap between two reports that were each individually correct. Nobody inside either domain was ever going to see it.</description>
      <content:encoded><![CDATA[<p>Strategy's weekly report says the roadmap is on track. Sales says pipeline is healthy. Support says ticket volume is down. Every domain looks fine, because every domain report is accurate. A customer churned the week after a pricing change, and the actual reason lived entirely in the gap between two of those reports, a change strategy made for good reasons, landing on an account sales had flagged as price-sensitive three months earlier in a note nobody in strategy ever had reason to read. Nobody lied. Nobody missed their own job. The thing that mattered was never inside either job to begin with.</p>

<h2 id="depth-in-one-place-is-bought-with-blindness-at-the-edges">Depth in one place is bought with blindness at the edges</h2>

<p>This isn't a hiring gap or a communication failure waiting on a better Slack channel. It's closer to a structural fact: the same narrowness that lets a specialist go deep on one domain is what makes the connections between domains invisible from inside any one of them. A strategy team that tracked every downstream sales implication of every roadmap decision wouldn't be a strategy team anymore, it would be doing sales's job too, at the cost of the depth that made its own judgment worth having. Depth requires a boundary. A boundary, by definition, is the place past which you stop tracking things closely.</p>

<p>That trade isn't a design mistake to be corrected. It's closer to the only way specialization can work at all. Every function that gets good at anything does it by narrowing what it pays close attention to, and the price of that narrowing is a set of real connections that cross the boundary and land in nobody's job description. The question isn't how to staff away that gap. It's what kind of thing could actually sit in it.</p>

<h2 id="where-this-gets-its-name">Where this gets its name</h2>

<p>Systems theory has a name for exactly this shape, and a memorable illustration of why it holds up across very different kinds of systems. In 1962, Herbert Simon published <a href="https://www.jstor.org/stable/985254">"The Architecture of Complexity"</a> (<em>Proceedings of the American Philosophical Society</em>), a few sections into which he introduces a parable about two watchmakers. Hora built watches from subassemblies of about ten parts each, combined into larger and larger units. Tempus built his watches one part at a time, in a single unbroken sequence. Both were interrupted constantly by phone calls. Every interruption cost Tempus everything, an incomplete watch with no fixed subassemblies fell completely apart the moment he set it down, so he rarely finished one. Hora's partial subassemblies held their shape when he set them down, so an interruption cost him at most the piece he was working on, not the whole watch. Simon's point was that complex systems which persist tend to be built the way Hora built watches: organized into subsystems with dense interaction inside each one and comparatively sparse, weak interaction between them, a property he called near-decomposability. It isn't an accident that stable complex systems look this way. It's close to the only shape complexity can survive being built and disrupted in.</p>

<h2 id="the-honest-limit-the-sparse-connections-are-still-real-connections">The honest limit: the sparse connections are still real connections</h2>

<p>This isn't an argument that specialization is a mistake, or that near-decomposability is something to engineer away. Simon's whole point cuts the other direction: a system with no boundaries at all, where everything is tightly coupled to everything, is the Tempus case, fragile, uncoordinated, and unable to make steady progress anywhere, because nothing can be worked on in isolation. The weak coupling between subsystems is what makes each subsystem tractable in the first place, not a flaw sitting alongside the useful part of the structure.</p>

<p>What near-decomposability doesn't promise is that the sparse connections between subsystems are unimportant, only that they're rare and easy to miss precisely because each subsystem is built to be busy with its own dense internal work. A pricing decision landing on a price-sensitive account is exactly this kind of connection: real, consequential, and structurally unlikely to be caught by either side of the boundary it crosses, because catching it was never what either side was built to do.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>This is the shape of the job <a href="https://usebrief.com/blog/sixteen-agents/">CPO Agent</a> is described as doing: reading across every domain and surfacing the cross-cutting insight no single agent would catch on its own, in Brief's own words for it. That description matches the boundary problem exactly. A domain-specific agent, whichever one, is doing its job well precisely by staying inside its own dense interior and not trying to track every sparse link running out of it. The insight that only exists in the connection between two domains was never going to come from inside either domain's own reporting, not because either one failed, but because catching it needs something positioned to look at the gap itself.</p>

<p>Somewhere between your team's separate, individually accurate reports this week, is there a connection sitting in the gap that no single one of them was ever built to catch?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is near-decomposability?</strong> A property of complex systems, described by Herbert Simon, where the system is organized into subsystems with dense, frequent interaction inside each one and sparse, weak interaction between them. It's offered as close to a structural necessity for complex systems that have to survive being built up gradually and disrupted along the way, not an incidental design choice.</p>

<p><strong>Where does the term come from?</strong> Herbert Simon's 1962 paper "The Architecture of Complexity," which uses a parable about two watchmakers to make the case: one who builds from stable subassemblies and recovers quickly from interruptions, and one who builds in one continuous sequence and loses everything each time he's interrupted. Simon uses it to argue that stable complex systems tend to be organized hierarchically, with weak coupling between subsystems, for exactly this reason.</p>

<p><strong>Doesn't that mean specialized teams or agents are the problem?</strong> No. The same weak coupling that creates blind spots between domains is what makes each domain tractable to work in at all. A system with no boundaries, everything tightly coupled to everything, is worse, not better, closer to the watchmaker who loses his whole watch every time he's interrupted. The blind spots are a real cost of a structure that's mostly a benefit.</p>

<p><strong>Why does Brief have a CPO Agent instead of expecting each domain agent to catch cross-cutting issues itself?</strong> Because catching a connection that runs between two domains isn't something either domain's own close, dense work is built to do, that's what makes each domain's work effective in the first place. Something has to be positioned to look at the sparse connections between domains rather than inside any one of them, which is the job Brief describes CPO Agent as doing.</p>]]></content:encoded>
    </item>
    <item>
      <title>Situation Awareness</title>
      <link>https://usebrief.com/blog/situation-awareness/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/situation-awareness/</guid>
      <pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate>
      <description>A weekly brief lists twelve tickets shipped, three deals closed, and a competitor's price change. Every line is accurate. The reader finishes it and still can't say whether the week was good or bad, or what it means for the one coming. A complete list of facts and an understanding of where things stand were never the same document.</description>
      <content:encoded><![CDATA[<p>A weekly brief lands in the inbox: twelve tickets shipped, three deals closed, one customer call flagged a bug, a competitor quietly raised prices. Every line is accurate. Nobody misreported anything. The reader finishes it and still can't say whether the week was good or bad, or what any of it means for the week coming next. A complete list of what happened and an understanding of where things stand were never the same document, and no amount of making the list more complete closes that gap.</p>

<h2 id="listing-what-happened-is-not-the-same-operation-as-knowing-what-it-means">Listing what happened is not the same operation as knowing what it means</h2>

<p>These are two different mental jobs, not two versions of the same job at different levels of effort. Noticing that twelve tickets shipped is one operation: pulling individual facts out of a stream of activity. Understanding what those twelve tickets add up to, whether they cleared the actual blocker customers were hitting, whether they shipped faster or slower than the team's real capacity, whether "shipped" this week quietly means "reopened" next week, is a second, separate operation performed on top of the first. A list can get the first job perfectly right and still leave the second one completely undone, because nothing about correctly noticing twelve facts forces anyone to correctly combine them.</p>

<p>There's a third job stacked on top of both, and it's the one a reader actually wants answered: given what happened and what it adds up to, what does that imply about what's coming. A brief can nail the first two jobs, an accurate list, a correct read on what it means right now, and still say nothing useful about next week, because knowing where things stand today doesn't automatically tell you where they're headed. Each of these three jobs can fail on its own, even when the one before it went perfectly.</p>

<h2 id="where-this-gets-its-name">Where this gets its name</h2>

<p>Human factors research has a name for exactly this three-part structure, developed to explain why a pilot or an air traffic controller with all the right instruments in front of them can still misjudge a fast-moving situation. In 1995, Mica Endsley published <a href="https://doi.org/10.1518/001872095779049543">"Toward a Theory of Situation Awareness in Dynamic Systems"</a> (<em>Human Factors</em>), defining situation awareness as three distinct levels that build on each other but don't guarantee each other. Level one is perception: noticing the individual elements actually present, the instrument readings, the radio calls, the blips on a screen. Level two is comprehension: integrating those separate elements into what they mean together right now, not just that an altitude reading changed, but that the aircraft is descending toward terrain. Level three is projection: extrapolating from that understanding to what's likely to happen next, if nothing changes, in enough time to actually act on it. Endsley's point wasn't that any one level is hard by itself. It was that an operator can be flawless at level one, perceiving every instrument correctly, and still fail entirely at level two or three, and that failure looks, from the outside, exactly like having all the right information and still getting it wrong.</p>

<h2 id="the-honest-limit-this-was-built-for-real-time-operators-not-weekly-documents">The honest limit: this was built for real-time operators, not weekly documents</h2>

<p>This is a borrowed framework, not a literal transfer, and it's worth being precise about where the borrowing stops. Endsley was modeling operators monitoring a system continuously in real time, where a missed projection can mean a plane hits terrain in the next ninety seconds. A weekly brief is asynchronous and much lower stakes in the moment, nobody's read of Tuesday's summary determines what happens by Wednesday afternoon the way a pilot's situation awareness determines what happens in the next minute. What transfers isn't the urgency. It's the three-level structure itself: the same clean separation between noticing, understanding, and projecting holds up as a diagnostic for a written brief as much as for a cockpit, and the same failure mode applies, a document that's flawless at level one and silent at levels two and three will read as informative while telling the reader almost nothing useful.</p>

<p>The other honest limit is that level three doesn't get easier just because levels one and two went well. Projection is the most cognitively demanding of the three levels, since it depends on the first two already being correct and then extrapolating into a future that hasn't happened yet. That's not the same as saying it's the level most likely to fail in practice. David Jones and Mica Endsley's follow-up study, "Sources of Situation Awareness Errors in Aviation" (<em>Aviation, Space, and Environmental Medicine</em>, 67(6), 1996, pp. 507-512), examined real aviation error reports and found the opposite: the large majority of documented situation-awareness failures happened at level one, simply perceiving something correctly, with level-three failures the rarest of the three. What stays true regardless is narrower: a correct projection is still a claim about an uncertain future, and getting comprehension right earns the right to attempt one. It doesn't make that projection certain.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>Read against that three-level structure, most of what a product organization tracks day to day sits at level one: what shipped, what closed, what a customer said, what a competitor changed. The structural gap the theory describes is real regardless of any specific implementation: a system that only accumulates level-one facts, however completely, hasn't done the level-two or level-three work a reader actually needs from something calling itself a brief. <a href="https://usebrief.com/blog/sixteen-agents/">Weekly Brief Agent's</a> own documented description, synthesizing the whole picture into the one read that tells a team where things actually stand, is stated as a level-two promise, understanding what the picture adds up to right now, not a level-one one. This post can't speak to how that promise gets kept today, or whether the read it produces also attempts level three. What it can say is that even the documented promise is the harder one, and no amount of level-one completeness fulfills it on its own.</p>

<p>Read your team's last weekly update again. Does it tell you what happened, or does it tell you where things actually stand, and are you sure those are the same sentence?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is situation awareness?</strong> A three-level model of understanding a changing situation: perceiving the individual facts present, comprehending what those facts add up to right now, and projecting what they imply about what happens next. The levels build on each other but don't guarantee each other, an accurate perception of every fact doesn't automatically produce a correct comprehension or projection.</p>

<p><strong>Where does the model come from?</strong> Mica Endsley's 1995 paper "Toward a Theory of Situation Awareness in Dynamic Systems," developed to explain how skilled human operators, pilots and air traffic controllers, correctly or incorrectly track fast-moving situations with all the right instruments in front of them.</p>

<p><strong>Why can a report be factually complete and still not useful?</strong> Because completeness is a level-one property, every relevant fact got noticed and included, while usefulness depends on levels two and three, whether the facts were correctly combined into what they mean and correctly extrapolated into what comes next. A report can hit level one perfectly and still leave the reader to do levels two and three themselves.</p>

<p><strong>Does understanding what's happening now guarantee a correct read on what happens next?</strong> No. Building a correct projection takes more than getting the first two levels right, it also means reaching into a future that hasn't happened yet, and no amount of accurate comprehension removes the real uncertainty in that reach. That demanding shape doesn't translate to "most error-prone" in practice either, aviation error data actually shows the opposite pattern, failures cluster earliest, at simply noticing something correctly. A well-earned projection has still done the hard part. It hasn't done the impossible part of making an uncertain future certain.</p>]]></content:encoded>
    </item>
    <item>
      <title>Costly Signal</title>
      <link>https://usebrief.com/blog/costly-signal/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/costly-signal/</guid>
      <pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate>
      <description>Two competing products both claim the easiest onboarding in the category, on the same landing page template, in the same words. A prospect reading both pages learns nothing about which one is actually true, because both companies could make that exact claim whether or not it holds.</description>
      <content:encoded><![CDATA[<p>Two competing products both put "the easiest onboarding in the category" on their homepage. A prospect reading both pages learns nothing from either sentence, not because one company is lying, but because both companies could type that exact sentence whether or not it's true. The claim costs nothing to make and nothing to be wrong about, so its presence on a page carries no information about which company actually has the easier onboarding.</p>

<h2 id="a-claim-that-costs-nothing-to-make-carries-no-information">A claim that costs nothing to make carries no information</h2>

<p>This isn't a complaint about marketing copy being untrustworthy. It's a plainer fact: if a claim is equally cheap for a company with the advantage and a company without it to make, then observing the claim doesn't help anyone tell the two companies apart. Before either page loaded, a prospect's best guess about which company actually has easier onboarding was some number. After reading both claims, that guess should be exactly the same number, because both companies, real advantage or not, would say the identical thing. A signal that any type of sender can produce at the same cost isn't really a signal. It's noise shaped like one.</p>

<p>What would actually move that guess is something the two companies couldn't produce equally easily. Not costly for its own sake, expensive doesn't mean informative on its own, but costly in a specific, lopsided way: cheaper to produce if the underlying claim is true, more expensive or outright impossible to fake if it isn't. A company that genuinely has the easier onboarding can point to deals that closed specifically because of it, prospects who evaluated a harder competitor and switched. A company whose onboarding is not actually easier would have to manufacture that same pattern of deals without the underlying product behind it, and that's the harder, costlier thing to fake convincingly at scale.</p>

<h2 id="where-this-gets-its-name">Where this gets its name</h2>

<p>Economics has a formal name for exactly this asymmetry, developed for a different market entirely. In 1973, Michael Spence published <a href="https://doi.org/10.2307/1882010">"Job Market Signaling"</a> (<em>Quarterly Journal of Economics</em>), asking how an employer, unable to directly observe a job candidate's productivity, could still learn something real from what a candidate does before being hired. His answer wasn't that costly signals are informative because they're costly. It was narrower and sharper: a signal is informative only when it's cheaper to produce for the type of person the employer actually wants to identify than for the type they don't, so that faking it costs more than it's worth to the person faking it, and only the real thing is worth producing at that price. In his model, education can function this way, not necessarily because it teaches the skills a job needs, but because a genuinely more capable candidate can often clear it at lower cost than a less capable one, holding the reward fixed. Take that condition away, make the cost the same regardless of who's producing the signal, and the same credential stops separating anyone from anyone else.</p>

<h2 id="the-honest-limit-cost-has-to-be-lopsided-not-just-present">The honest limit: cost has to be lopsided, not just present</h2>

<p>This is the part worth being careful about, because it's easy to round Spence's result down to "make it expensive and it becomes credible," and that's not what the model says. Spending money on a positioning claim, a rebrand, a big campaign, a slick landing page, is a real cost, but if a weaker competitor can spend the same amount to produce the same appearance, the cost bought nothing. What has to be true is that the cost of producing the specific evidence behind a positioning claim runs differently for a company that actually has the advantage than for one that doesn't. A single closed deal citing the claimed advantage isn't enough on its own either, one deal can close for a dozen reasons unrelated to positioning, timing, an existing relationship, a discount. What separates a real signal from a lucky data point is a pattern: many deals, cited for the same reason, that would be expensive and difficult for a company without the underlying advantage to manufacture at the same rate.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>This is the actual shape of the problem <a href="https://usebrief.com/blog/sixteen-agents/">Positioning Agent</a> is built to sit on top of: proposing how a company is positioned by drawing on competitors, deals, and signals together, not any one of them alone. A positioning claim checked only against itself is exactly the cheap-talk case, a sentence that costs nothing and proves nothing. Competitor Agent's documented job is narrower than analyzing a rival's claims, it crawls competitor pages and flags when one of them drifts, but that raw material is exactly what a claim about relative positioning would need to be checked against. Pipeline Agent's job is narrower too, it syncs deals from the CRM, but a synced record of real deals is exactly where a pattern like wins clustering around a claimed advantage would have to be found, if it's there at all. This post can't speak to what analysis, if any, gets run on top of that raw material today. What's true regardless of implementation is the shape of the problem: a positioning claim checked only against itself proves nothing, and the only way to check it against anything else is against real, hard-to-fake records like these, not against another sentence.</p>

<p>Next time your team's positioning deck states an advantage, could a weaker competitor produce that exact sentence for the same cost you did, or would it cost them something real to say it and mean it?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is a costly signal?</strong> A claim or action that only makes sense to produce if it's actually true, because producing it while it's false would cost more than it's worth. The cost has to fall differently on the party that has the underlying advantage than on one that doesn't, otherwise the signal is just as cheap to fake as it is to send honestly, and it stops conveying any information.</p>

<p><strong>Where does the term come from?</strong> Michael Spence's 1973 paper "Job Market Signaling," which modeled how an employer could learn something real about a job candidate's productivity from actions taken before hiring, when a candidate more capable of the job could often produce those actions at lower cost than a less capable one. The result is general to any market where one side can't directly observe what the other side actually has.</p>

<p><strong>Doesn't spending more on marketing make a positioning claim more credible?</strong> Not by itself. A rebrand or a big campaign is a genuine expense, but any competitor with a comparable budget, weaker positioning and all, can buy the identical polish. Nothing about matching spend tells the two apart. What has to differ is the cost of the specific evidence a claim depends on, not the size of the check written to make the claim look good.</p>

<p><strong>Why does Positioning Agent need Competitor Agent and Pipeline Agent instead of working from a claim alone?</strong> Because a claim has nothing else to be measured against on its own. What each of the two supplies is narrower than an analysis, real crawled pages from the field a company is claiming to stand apart from, and a real synced ledger of deals that actually closed, but narrow and real is still worth more here than broad and unverifiable. Whatever gets built on top of that raw material, this post doesn't claim to know the specifics, has something concrete to check a stated position against instead of nothing at all.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ecological Fallacy</title>
      <link>https://usebrief.com/blog/ecological-fallacy/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/ecological-fallacy/</guid>
      <pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate>
      <description>A team's power-user persona says integrations are the top priority. A real power user on the call says integrations matter least to them, speed is what they actually want. Neither the persona nor the customer is wrong. A fact about the group and a fact about a member of it were never the same kind of claim.</description>
      <content:encoded><![CDATA[<p>A team builds a persona from months of research signals: "Power users value integrations above everything else." Then someone gets on a call with an actual power user, someone who fits the profile exactly, and the first thing out of their mouth is that integrations barely matter to them, what they actually want is speed. The team's instinct is to ask which one is wrong. Neither is. A fact about a group and a fact about one member of that group were never the same kind of claim, and nothing about that changes just because the group is real and the research behind it is solid.</p>

<h2 id="an-average-is-a-fact-about-the-group-not-a-prediction-about-any-member-of-it">An average is a fact about the group, not a prediction about any member of it</h2>

<p>Say a hundred power users were surveyed and, on average, they ranked integrations as their top priority. That's a true, well-supported fact about the group of a hundred. It says nothing, on its own, about which way any single one of those hundred people actually leans. An average can be pulled up by twenty people who care intensely about integrations and forty who don't care at all, with the other forty landing somewhere in between, and the resulting number tells you almost nothing about where any specific one of the hundred sits. The average is real. It's also a property of the group as a whole, not a property distributed evenly across its members, and treating it as the second thing is the actual error, not a rounding error in an otherwise correct inference, but a different kind of claim being substituted for the one that was actually established.</p>

<p>It gets sharper than "loses some precision." A correlation computed across a set of groups doesn't have to point the same direction as the same relationship computed across the individuals inside those groups. Both are real numbers, computed correctly, from the same underlying data, and there's no rule of arithmetic that keeps them pointed the same way, because they're answers to different questions: one about how group-level percentages move together, the other about how individual people's own paired traits move together.</p>

<h2 id="where-this-gets-its-name">Where this gets its name</h2>

<p>Sociology has both a name for this trap and a demonstration of it precise enough to still be examined seventy-six years later, though they came from two different people eight years apart. In 1950, W.S. Robinson published <a href="https://doi.org/10.2307/2087176">"Ecological Correlations and the Behavior of Individuals"</a> (<em>American Sociological Review</em>), comparing U.S. states on two numbers: the share of each state's population that was foreign-born, and the share that was literate. Across states, the two moved together, a larger foreign-born share went with a higher average literacy rate. Read carelessly, that looks like it says something about immigrants: maybe being foreign-born was associated with being literate. Robinson then computed the same relationship a different way, across individual people rather than across states, and it ran the opposite direction: being foreign-born was associated with being less likely to be literate. The correlation across states and the correlation across individuals didn't just differ in strength. They pointed in opposite directions from the exact same underlying data, depending only on which unit, state or person, the correlation was computed over.</p>

<p>Robinson demonstrated the reversal. The name for it came eight years later, from a different paper making a different argument. Hanan Selvin's 1958 <a href="https://doi.org/10.1086/222356">"Durkheim's Suicide and Problems of Empirical Research"</a> (<em>American Journal of Sociology</em>), reexamining Durkheim's own use of aggregate suicide statistics, coined ecological fallacy for exactly the mistake Robinson's numbers make visible: trusting a correlation computed over groups to describe the individuals inside them.</p>

<h2 id="the-honest-limit-aggregates-aren-t-wrong-they-re-answering-a-different-question">The honest limit: aggregates aren't wrong, they're answering a different question</h2>

<p>This isn't an argument against building personas, or against using averages at all. A well-built persona is still the right tool for a population-level decision: which feature would move the needle for the bulk of a segment, where the segment's center of gravity actually sits, what tends to be true across enough real users to be worth designing around. None of that requires the average to hold for every individual, and none of it becomes wrong just because some members of the segment don't match it.</p>

<p>What the fallacy actually rules out is one specific move: taking a persona built from a population and reading it as a prediction about a particular person in front of you. Robinson's numbers didn't reverse because his state-level data was bad. They reversed because a state-level correlation and an individual-level correlation are answers to two different questions, computed two different ways, and there's no law of arithmetic that keeps them pointed the same direction. Sometimes an aggregate and an individual line up. Sometimes they don't. The only way to know which is true for the specific person on the call is to ask that person, not to consult the persona built from everyone else.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>This is the shape of risk sitting inside <a href="https://usebrief.com/blog/sixteen-agents/">Persona Agent</a>, which turns Signal Agent's raw material into personas and then waits for a person to review them rather than shipping them straight into decisions. Signal Agent's material sits close to the individual level, specific calls, specific documents, specific things users actually said, synthesized into themes but not yet aggregated across a population. Persona Agent's output is a further step: a population-level construct built by aggregating across many users' signals into one archetype, and population-level constructs are exactly where the ecological fallacy waits, the step where a real, well-supported group pattern can get mistaken for a fact about any one person it was built from. Brief's own stated reason for routing Persona Agent's output through a review queue is broader than this, any agent dealing in judgment rather than observed fact gets the same gate, but a persona is a clean example of exactly the kind of judgment call that gate is for: the step where a population and an individual can quietly get treated as the same thing.</p>

<p>Next time a persona tells your team what a segment wants, is that shaping a decision about the segment, or is it quietly standing in for what one specific customer on the call actually said?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is the ecological fallacy?</strong> The error of treating a fact true of a group, an average, a correlation, a trend, as if it were a fact about any specific member of that group. The two are different kinds of claims, computed differently, and a fact that holds at the group level doesn't have to hold, or even point the same direction, at the individual level.</p>

<p><strong>Where does the term come from?</strong> W.S. Robinson's 1950 paper "Ecological Correlations and the Behavior of Individuals" demonstrated the reversal: U.S. states with a larger foreign-born share also had a higher average literacy rate, while individual foreign-born people were actually less likely to be literate than individual non-immigrants. The correlation across states and the correlation across individuals pointed in opposite directions from the same data. The specific term "ecological fallacy" came eight years later, coined by Hanan Selvin in a 1958 paper reexamining Durkheim's use of aggregate suicide statistics.</p>

<p><strong>Does this mean personas or averages are unreliable?</strong> No. Averages and personas are the right tool for population-level questions, what to build for a segment, where a segment's center of gravity sits. The fallacy is specifically about carrying a group-level fact over to a claim about one particular member of the group, not about whether group-level facts are true.</p>

<p><strong>Why does Persona Agent wait for a human to review personas instead of applying them automatically?</strong> Brief's documented reason is broader than this post's argument: Persona Agent deals in judgment rather than observed fact, and every judgment call, not just personas, routes through a review queue instead of writing directly. This post's narrower point is that a persona is exactly the kind of judgment call where that gate matters most: turning individual signals into a population-level construct is precisely the step where a well-supported group pattern can get mistaken for a fact about one person, and a human in the loop is what catches that before it reaches an individual decision.</p>]]></content:encoded>
    </item>
    <item>
      <title>Soundness</title>
      <link>https://usebrief.com/blog/soundness/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/soundness/</guid>
      <pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate>
      <description>A quarterly plan names 'reduce onboarding time' as a top goal. Nobody on the team can point to a single shipped thing under it. Meanwhile a team has been heads-down all quarter on something the plan never mentions. Both facts can be true on the same day, in the same company, without anyone lying.</description>
      <content:encoded><![CDATA[<p>A quarterly plan names "reduce onboarding time" as a top-level goal. Three months later, nobody on the team can point to a single shipped thing under it, not because the goal was wrong, but because no one ever actually committed a piece of work to it. In the same quarter, a different team has been heads-down the whole time on a project the plan doesn't mention anywhere. Both facts can be true on the same day, in the same company, without anyone lying about anything.</p>

<h2 id="a-plan-reading-well-is-not-the-same-as-a-plan-being-true">A plan reading well is not the same as a plan being true</h2>

<p>Read the doc top to bottom and it looks fine. The goal is named, a rationale sits underneath it, an initiative sits under that, and the initiative points at a team. Every level connects to the level below it in the prose. That's what makes the gap easy to miss: the plan isn't internally inconsistent, it's disconnected from what's actually happening in the systems where work gets committed and shipped. A document can be a coherent story and still not correspond to the org it claims to describe.</p>

<p>That's a different failure than a plan being wrong. A wrong goal is still a real goal, just a bad bet. A goal that was written down and never connected to any committed work isn't a bad bet, it's a sentence sitting in a doc with nothing underneath it, doing no work at all.</p>

<h2 id="where-this-gets-its-name">Where this gets its name</h2>

<p>There's a term worth borrowing from a different field, workflow management, not because it applies to a document directly, but because of what it demands that a document alone can never supply. In 1998, Wil van der Aalst published <a href="https://doi.org/10.1142/S0218126698000043">"The Application of Petri Nets to Workflow Management"</a> (<em>Journal of Circuits, Systems and Computers</em>), applying Petri net theory to model business processes as networks of states and steps, then defining exactly when such a model is trustworthy enough to build on. He called that property soundness, and it comes down to three requirements, all of them about the model's own reachable states, none of which check the model against the real world: from anywhere the process can be, there's still a way to reach proper completion, reaching completion never leaves anything else in the model half-finished, and every step the model defines is one the model's own wiring actually permits, not one that's drawn in but can never fire.</p>

<p>That distinction matters more than the borrowed word. A sound workflow net is not a net proven to reflect real practice, it's a net proven not to contradict itself. Whether it reflects real practice is a separate question entirely, and it has its own name and its own primary source: Anne Rozinat and Wil van der Aalst's <a href="https://doi.org/10.1016/j.is.2007.07.001">"Conformance Checking of Processes Based on Monitoring Real Behavior"</a> (<em>Information Systems</em>, 2008) defines conformance checking as exactly this, comparing a process model against a recorded event log of what a system actually did, not inspecting the model alone.</p>

<h2 id="applying-the-test-to-a-plan">Applying the test to a plan</h2>

<p>Read a strategy doc next to that definition and the mismatch shows up immediately. Soundness is a property of an actual process model, places and transitions with markings that can be traced through reachable states. A prose document was never built as one of those, so there's no reachable marking anywhere in a paragraph to check, and a strategy doc can't strictly pass or fail soundness at all, there's no formal object there to run the test on. What a plan gets cheaply, almost automatically, is a much weaker property: internal coherence. Every goal has a rationale, every rationale points at an initiative, every initiative points at a team, and nothing in that graph contradicts itself on the page. Prose is good at having that property whether or not anything underneath it is real.</p>

<p>The question that actually matters is a different one, and it isn't a question about the document at all. Is there still a real, committed path from where the work actually stands today to each stated goal, not a path the doc asserts, but one that shows up in real work items? When a goal is marked reached, is there other work still claimed under it that never actually finished, sitting there indefinitely? Does every goal the plan names have at least one piece of committed work under it right now, rather than sitting in the document as a line nothing was ever assigned to move? And is there real, committed work happening right now that isn't under any of those goals at all, activity the plan's own picture simply has no place for? None of those are questions a document can answer about itself. They're questions about whether the plan matches something outside it, checked the way process-mining research checks a model against what a system actually did: not by rereading the model, but by comparing it against the record.</p>

<p>A goal with no committed work today and a workflow step nobody can ever reach share a shape, by analogy rather than by formal equivalence, something a model includes that the real system never produces, but they aren't proven the same way. A dead transition is dead because of the net's own wiring: no sequence of steps, ever, can reach it. A goal with no committed work today might get some next sprint; checking it only tells you what's true right now, not what's structurally impossible forever. That difference is exactly why this check has to run against a live record instead of getting decided once. A structural proof about a Petri net stays true forever. A check like this is only as current as the data it's compared against.</p>

<h2 id="the-honest-limit">The honest limit</h2>

<p>Soundness, in van der Aalst's actual sense, was never a test a prose document could pass or fail in the first place, there's no process model there to check reachability against. What a plan gets for free is a much weaker property, internal coherence, prose that doesn't contradict itself. That's exactly why internal coherence is the wrong thing to check for reassurance: it's cheap precisely because it was never the hard test to begin with. The property that costs something, and the one that actually tells you anything, is whether the plan corresponds to real committed work, a claim about the world rather than about the document, and checkable only against a record of the world that's actually current.</p>

<p>Even a plan that clears both, prose that holds together and goals demonstrably tied to real committed work, can still be built around the wrong goals. Clearing both tells you the document is honest about the company. It says nothing about whether the company is betting on the right things.</p>

<p>Checking a plan against real work also depends on that work being visible and current in the first place, which is <a href="https://usebrief.com/blog/state-estimate/">Work Agent's</a> job: a canonical, live record of what work actually exists is what makes the check possible at all. Without it, there is only the plan's own account of itself, and a document was never going to catch its own gap with reality by rereading itself.</p>

<h2 id="where-this-fits-at-brief">Where this fits at Brief</h2>

<p>This is the job <a href="https://usebrief.com/blog/sixteen-agents/">Strategy Agent</a> is built around: pulling vision, goals, and OKRs out of the documents where they live, so the top of the plan sits in the same picture as the work at the bottom, the picture this kind of check needs to run against in the first place. A plan kept only in a doc can look complete indefinitely, because nothing about rereading it will ever surface the gap.</p>

<p>Pull up your team's current top-level goals. For each one, could you point at a specific piece of work committed to it right now, or would you be pointing at the sentence that names the goal and calling that the same thing?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What does "soundness" mean applied to a strategic plan?</strong> In van der Aalst's original sense, soundness is a structural property of an actual process model, places and transitions with markings, checkable by analyzing the model's own reachable states. A prose strategy document was never built as one of those, so it can't strictly pass or fail that test at all. What it gets for free is a much weaker, cheaper property, internal coherence, prose that doesn't contradict itself. The check that actually matters for a plan, whether its goals correspond to real committed work, is a different and much harder property, not soundness itself, but the same discipline of testing a model against something outside it instead of trusting it on its own account.</p>

<p><strong>Where does this idea come from?</strong> Wil van der Aalst's 1998 paper applying Petri net theory to workflow management defined soundness for process models: every reachable state has a path to proper completion, completion never leaves something else unfinished, and every modeled step can actually occur, three questions answerable from the model's own structure, with no need to check it against the real world. Comparing a model to what a system actually did, the harder question this post is really about, is a separate, related line of process-mining research usually called conformance checking.</p>

<p><strong>Isn't a plan that reads coherently good enough?</strong> No, and that's the trap the borrowed term exposes. A plan can be internally coherent top to bottom, reading as a single unbroken story from goal to task, while having goals nothing is actually committed to and work happening the plan never mentions. Internal coherence is nearly free. Whether the plan is true of the company is the expensive, harder question, and it's the one that actually matters.</p>

<p><strong>Why does this depend on Work Agent's data?</strong> Because checking a goal against real committed work is a comparison to something outside the plan, not a property of the plan itself, and that comparison only means anything if the record of real work is current. Without a live, canonical account of what work actually exists, the only account available is the plan's own, which is exactly the account this whole check exists to stop trusting on its own word.</p>]]></content:encoded>
    </item>
    <item>
      <title>State Estimate</title>
      <link>https://usebrief.com/blog/state-estimate/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/state-estimate/</guid>
      <pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate>
      <description>A product agent looks at a backlog with 183 items and says the roadmap is full. Then an engineer points out that half of it is abandoned, three shipped already, and the one thing the customer is waiting on changed shape in review. The agent was not dumb. It was looking at measurements and mistaking them for state.</description>
      <content:encoded><![CDATA[<p>A product agent looks at a backlog with 183 items and says the roadmap is full. Then an engineer points out that half of it is abandoned, three items shipped already, one has been split into four pull requests, and the thing the customer is actually waiting on changed shape in review. The agent was not dumb. It was looking at measurements and mistaking them for state.</p>

<p>That mistake is everywhere in product work. A Linear issue is a measurement. A pull request is a measurement. A Notion task, a Jira ticket, a GitHub branch, and a project status are all measurements. They are not, by themselves, the state of the product system. The state is the thing a product agent actually needs before it recommends anything: what is being considered, what is committed, what is building, what shipped, and what quietly stopped being real.</p>

<h2 id="a-product-agent-cannot-act-on-a-sensor-reading">A product agent cannot act on a sensor reading</h2>

<p>The simplest failure case is a recommendation that ignores work already in motion. Ask an agent what to build for enterprise onboarding, and it may propose a new onboarding checklist because the idea appears in three docs and two customer calls. That sounds reasonable until the team remembers a related Linear project is already halfway built, the design changed last week, and the remaining constraint is not "should we build it?" but "which edge cases are still blocking release?"</p>

<p>The agent did not need a better brainstorm. It needed state.</p>

<p>This is the difference between a list of observations and a model of the system those observations point at. The backlog says something exists. The pull request says someone touched code. The merged commit says something crossed one boundary. The shipped flag says it crossed another. The stale ticket says nothing unless you know whether stale means waiting on someone, abandoned, or already completed somewhere else. Treating each record independently turns the product world into a pile of facts with no dynamics. A product agent can summarize that pile, but it cannot reason from it safely.</p>

<p>The hard part is not gathering more records. It is deciding which records describe the same piece of work, which stage that work is actually in, and whether the apparent activity changes the product state or merely repeats something already known.</p>

<h2 id="where-this-gets-its-shape">Where this gets its shape</h2>

<p>Control systems have a useful word for this: state. In a dynamic system, the state is the information you would need now to predict what the system can do next. In 1960, R. E. Kalman published <a href="https://asmedigitalcollection.asme.org/fluidsengineering/article/82/1/35/397706/A-New-Approach-to-Linear-Filtering-and-Prediction">"A New Approach to Linear Filtering and Prediction Problems"</a>, the paper behind the Kalman filter. The product lesson is not that roadmap planning needs a Kalman filter. It does not. The useful distinction is simpler: a system's internal state is usually not handed to you directly. You infer it from imperfect measurements, update it as new measurements arrive, and keep the estimate coherent enough that control decisions are not made off noise.</p>

<p>Product work has the same shape, even if the math is not the same. The tools give you measurements: issue status, branch names, review events, linked docs, assignees, timestamps, comments, project fields. None of them alone tells you the true state of the work. A ticket can say "in progress" while the branch is abandoned. A pull request can be merged while the customer-facing feature is still behind a flag. A roadmap item can stay "planned" after the team has already narrowed the problem and shipped the first slice. The state has to be reconstructed from the measurements.</p>

<p>That reconstruction is where a product agent either becomes useful or starts hallucinating confidence. Without a state estimate, it does not know whether it is recommending a new initiative, duplicating an active one, reopening a closed one, or contradicting the constraint that is actually shaping the team's next move.</p>

<h2 id="why-work-agent-is-not-just-a-list-of-tickets">Why Work Agent is not just a list of tickets</h2>

<p>This is the substrate behind <a href="https://usebrief.com/blog/sixteen-agents/">Brief's Work Agent</a>. Source adapters for Linear, GitHub, GitLab, Asana, Jira, and Notion persist normalized work rows into the canonical <code>work_items</code> table. In the product itself, Work Agent is intentionally deterministic: the current architecture reads those canonical rows and projects them through a code path rather than asking an LLM to re-copy thousands of records. That is a technical detail, but it matters because the job is not creative synthesis. The job is to keep the state substrate faithful.</p>

<p>The canonical row is the important part. It gives downstream agents one place to ask the boring but load-bearing questions: what is this work item, where did it come from, what stage is it in, when was it committed, when did it start, when did it complete, and what source URL or cross-source identity anchors it back to reality. Once that exists, other agents can reason against the same state instead of each rebuilding its own private version of the world.</p>

<p>That is why Work Agent sits beneath so many higher-level product judgments. <a href="https://usebrief.com/blog/throughput/">Velocity Agent</a> needs shipped and timestamped work to measure delivery from activity rather than estimates. Feature Agent needs work items so it does not propose a feature detached from what the team is already building. Decisions Agent can treat committed, shipped, or deprecated work as evidence that a decision has happened, not just that someone discussed one. Strategy and CPO-style synthesis need the same substrate for a more basic reason: a strategic recommendation that ignores actual work in flight is not strategic. It is fan fiction with a backlog export.</p>

<h2 id="the-estimate-has-to-be-live">The estimate has to be live</h2>

<p>The failure mode is not only missing data. It is stale data.</p>

<p>A work-state estimate that was correct last Friday can be wrong by Monday afternoon. A customer escalation moved one item from "considering" to "committed." A review changed the remaining path for another. A bug fix shipped and made a roadmap item obsolete. A project got renamed, so the same work now appears under two labels. If a product agent reads the old state, it will make recommendations that are internally logical and operationally wrong.</p>

<p>That is why work ingestion has to be a background process rather than a one-time import. The source-adapter path writes current work into the canonical table and uses change gates so repeated runs do not pretend unchanged rows are new state. Work Agent then reads that canonical state and projects it forward for the rest of the agent system. A good product agent does not need every raw event every time it thinks. It needs the latest coherent state, with enough provenance to trace the estimate back to the measurements that produced it.</p>

<p>This also explains why "just let the product agent query Linear" is not enough. Querying a tracker gives it one measurement surface. Product state lives across trackers, repositories, documents, and source-specific conventions. It needs normalization, identity, stage mapping, and freshness. Without those, the product agent is not reading the work state. It is reading whichever sensor happened to answer first.</p>

<h2 id="what-work-agent-cannot-decide">What Work Agent cannot decide</h2>

<p>The honest limit is that a work-state estimate is still not a product strategy. Knowing that something is committed does not prove it should have been committed. Knowing that a feature shipped does not prove it mattered. And in the current substrate, blocked work is not preserved as its own first-class state, so a product agent still needs surrounding evidence before it can say whether to unblock something, cancel it, or change the goal around it.</p>

<p>That judgment belongs to the layers above it and, ultimately, to the team. Work Agent gives the product agent the current state of execution. It does not decide the value of that execution. In fact, that is exactly why it is useful: it separates the factual substrate from the strategic call. Once a product agent can see what is actually moving, it can stop wasting intelligence on reconstructing reality and spend it on the question a product team actually needs answered.</p>

<p>If your product agent recommended the next thing to build today, would it know what your team is already building, or would it be reasoning from a pile of measurements and calling it context?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is a state estimate in product work?</strong> A state estimate is the reconstructed view of what is actually true about work right now: what is being considered, committed, building, shipped, or deprecated. It is inferred from measurements such as tickets, pull requests, docs, timestamps, and source statuses, but it is not identical to any one of those records.</p>

<p><strong>Why does a product agent need Work Agent?</strong> Because a product agent cannot safely recommend, prioritize, or explain work without knowing the current execution state. The source-adapter path keeps the canonical <code>work_items</code> substrate current from tools like Linear, GitHub, GitLab, Asana, Jira, and Notion, and Work Agent projects that normalized work state so higher-level agents do not reason from disconnected tracker snapshots.</p>

<p><strong>Is Work Agent an LLM that reads my backlog and summarizes it?</strong> Not in the current Brief architecture. Work ingestion lands normalized rows in <code>work_items</code>, and the Work Agent path deterministically projects those rows rather than asking a model to creatively reinterpret them. That is the right shape for this job because the point is faithful state, not new judgment.</p>

<p><strong>What does Work Agent not solve?</strong> It does not decide whether the work is valuable, whether a shipped feature mattered, or whether a stalled item should be unblocked. The current substrate also does not preserve blocked work as its own first-class state. Work Agent gives the product agent the execution state those judgments have to start from; strategy still requires judgment.</p>]]></content:encoded>
    </item>
    <item>
      <title>Revealed Preference</title>
      <link>https://usebrief.com/blog/revealed-preference/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/revealed-preference/</guid>
      <pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate>
      <description>A user tells you price is the top blocker, then upgrades the week a new feature ships, not the week a discount runs. Neither answer is wrong. One was a claim with nothing else on the table to weigh it against. The other was a choice made while a cheaper option sat right there, unchosen.</description>
      <content:encoded><![CDATA[<p>A user tells your team, in an interview, that price is the top thing stopping them from upgrading. Three months later they upgrade, the week a specific feature ships, with pricing unchanged. Read as a contradiction, this is confusing: which one was the truth? Read correctly, it isn't a contradiction at all, because a statement and a choice were never the same kind of evidence to begin with.</p>

<h2 id="a-claim-needs-nothing-else-on-the-table-a-choice-needs-an-alternative">A claim needs nothing else on the table. A choice needs an alternative.</h2>

<p>Saying "price is what's stopping me" doesn't require anything else to be true. No other option has to be sitting there for the claim to be made; the user can say it whether or not staying on the current plan was ever seriously in question for them. They might be reporting their honest best guess about their own future behavior, or the answer that's easiest to give an interviewer, or the reason that sounds most legitimate to say out loud, and from the outside those three are indistinguishable, because none of them had to be tested against a real alternative.</p>

<p>Upgrading the week a feature ships is a different kind of fact, and not because it was expensive. Staying on the current plan, at the current price, was still sitting right there the whole time pricing stayed put. The user picked the upgrade with that cheaper option open in front of them and didn't take it. That's what a claim can never supply on its own: an alternative that was actually available and turned down, at the same moment a different one was chosen.</p>

<p>That's the actual distinction, and it isn't about cost. A stated preference doesn't need a forgone alternative to exist at all: someone can name what they'd supposedly do with nothing else live to compare it against. A revealed preference needs one: an option that was genuinely on the table and not taken, at the same time as the one that was. Cost is often part of why that alternative stayed real rather than hypothetical, changing plans, spending money, and taking on a decision to justify later are all reasons an option stays open until someone actually declines it, but cost is what makes an alternative credible, not what defines whether a choice reveals anything. A long, effortful survey answer can cost real time and still reveal nothing, because there was no alternative on the table for it to be weighed against in the first place.</p>

<h2 id="where-this-gets-its-name">Where this gets its name</h2>

<p>Economics has a name for the second kind of evidence, and a specific reason it was worth naming. In 1938, Paul Samuelson published <a href="https://doi.org/10.2307/2548836">"A Note on the Pure Theory of Consumer's Behaviour"</a> (<em>Economica</em>), building a theory of what people want from which options they actually chose when other options were also affordable under the same real budget, deliberately without leaning on any claim about what people say they want or feel. The term that stuck for this, revealed preference, names exactly the distinction above: a preference is revealed when a choice is made with a real alternative on the table, not merely reported with none.</p>

<h2 id="the-honest-limit-revealed-preference-isn-t-self-interpreting">The honest limit: revealed preference isn't self-interpreting</h2>

<p>This isn't a case for trusting behavior and discounting what people say. Two real limits sit inside it. First, inferring a preference from a choice only works if the choices are consistent, if someone would pick the same thing again given the same real options, an assumption that can fail when people are genuinely inconsistent, or when what looked like the same choice to an outside observer wasn't actually the same choice to the person making it. Second, and more important for a product team: a choice tells you what won, not why. It doesn't generalize to an option nobody has built yet, and it can't, because there was never a real alternative for it to be chosen over, when it was never on the menu at all. The reason has to come from somewhere else, and the reason is exactly what an interview, a call, a documented piece of research, the material a stated-preference source is actually good at, carries and a purchase log never will.</p>

<h2 id="two-agents-two-different-questions">Two agents, two different questions</h2>

<p>This is the actual split between two of <a href="https://usebrief.com/blog/sixteen-agents/">Brief's agents</a>, and it isn't redundancy. Signal Agent extracts research signals and themes from calls, documents, and research sources: stated preference, with the reasons attached. Behavior Agent pulls product analytics so what users do sits next to what they say: the behavioral record a revealed preference gets read out of, a real choice made while another path stayed open, not a claim about what would happen. Neither one is the correction to the other. A team that only reads Signal Agent's output has reasons with no evidence they were tested against a real alternative. A team that only reads Behavior Agent's has evidence with no account of why, unable to say anything about the feature nobody has shipped yet to test.</p>

<p>Putting the two next to each other doesn't resolve the apparent contradiction from the opening; it explains it. The user who named price wasn't lying and the user who upgraded when the feature shipped wasn't a different person. One gave you a reason. The other gave you the one thing a reason alone can never supply: a real alternative, forgone, at the moment the choice was made. A product context layer that only kept one of the two would be keeping half a picture and calling it complete.</p>

<p>Which of your last three product calls was actually made on evidence a real alternative was turned down for, and which one was made on the best reason anyone happened to say out loud?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is revealed preference?</strong> A preference inferred from a real choice made while another option was also genuinely available and not taken, rather than from what someone says they want. The term comes from economics, formalized by Paul Samuelson in 1938 as a way to study consumer behavior from which affordable options people actually chose.</p>

<p><strong>How is revealed preference different from stated preference?</strong> Stating a preference requires nothing else to be true: no other option has to be on the table for the claim to be made. Revealing one does: it's inferred from a choice made while a real alternative sat there, unchosen. That's what makes it harder to fake, not that the act cost something, and it doesn't make it more truthful in every case.</p>

<p><strong>Does that mean product teams should trust behavior data over user interviews?</strong> No. Revealed preference only works if choices are consistent, and it can't explain why something was chosen or say anything about an option that was never available to choose from. Stated preference is where the reasoning behind a choice actually lives, which matters most for deciding what to build next rather than judging what already shipped.</p>

<p><strong>Why does Brief have separate agents for this instead of one?</strong> Because they answer different questions from different kinds of evidence. Signal Agent captures what users say and why. Behavior Agent captures what users actually did while another option stayed open. Collapsing them into one feed would lose the distinction between a reason and a choice made with a real alternative on the table, which is the whole point of keeping both.</p>]]></content:encoded>
    </item>
    <item>
      <title>Throughput</title>
      <link>https://usebrief.com/blog/throughput/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/throughput/</guid>
      <pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate>
      <description>34 points this sprint, 41 the one before, 29 before that. The number moves every two weeks and nobody can say whether the team is actually getting faster, because points measure a guess made at the start, not anything that happened after.</description>
      <content:encoded><![CDATA[<p>A team ships 34 points this sprint, 41 the sprint before that, 29 the one before that. The number moves every two weeks and nobody can say with a straight face whether the team is getting faster, slower, or just estimating differently, because a point measures how big someone guessed a task would be before it started, not anything that happened between start and done.</p>

<p>Three different numbers would actually answer the question, and none of them are points. The average number of things in progress at once, not a headcount taken this morning. How fast new things enter that same stretch of work. How long a thing spends in that stretch, start to finish. Most teams have a rough feel for all three and a precise, consistently defined measurement of none.</p>

<h2 id="the-proof-that-ties-them-together">The proof that ties them together</h2>

<p>In 1961, John D.C. Little published <a href="https://doi.org/10.1287/opre.9.3.383">"A Proof for the Queuing Formula: L = λW"</a> in <em>Operations Research</em>. The claim is almost suspiciously simple: for one consistently defined system, the average number of items in progress (L) equals the rate at which new items enter it (λ) multiplied by the average time each one spends inside it (W). What makes it worth a proof rather than an observation is how little it assumes about the mechanics: the order work gets done in, how variable task sizes are, how many people work in parallel, none of that matters. What it does assume is real: the 1961 proof requires the three means to be finite, the corresponding stochastic processes to be strictly stationary, and the arrival process specifically to be ergodic with a nonzero mean. Those are the paper's actual regularity conditions, not just another way of phrasing "steady state," and they're exactly what rules out a system where arrivals are permanently outrunning what gets finished. Given that, and given all three numbers measured against the same boundary, L = λW is not a rule of thumb. It is a proven identity.</p>

<p>An identity is a different kind of thing to build on than an estimate, not because it can't be manipulated (move where "started" or "done" gets marked, for example, and all three numbers move together), but because it's an internal consistency relation: under one fixed, honestly held definition of the boundary, L, λ, and W have to relate to each other exactly this way. A point estimate answers to nothing. These three numbers, measured consistently, answer to each other.</p>

<h2 id="why-more-agents-doesn-t-mean-more-throughput">Why more agents doesn't mean more throughput</h2>

<p>Here is where it matters to pick one boundary and hold it fixed. Say, ready-for-review to merged. λ is how fast items enter that boundary. W is the average time an item spends inside it. L is the average number of items inside it at once, a time-average over the same window λ and W are measured across, not a count taken at any single moment. Measured that consistently, the identity forces something whether a team notices or not: if λ goes up and W does not come down, L has to go up too, in whatever new steady state the system settles into. And if λ permanently outruns what the team can actually complete, there is no new steady state to settle into. The queue is unstable, L grows without bound, and calling that a new normal doesn't make it one.</p>

<p>Coding agents raise λ into that boundary sharply. A task that used to require scoping, writing, and testing before it was even ready to review now gets there in an afternoon. What they do not automatically shrink is W, the time a change actually spends between ready-for-review and merged, because that time is mostly review, coordination, and deciding what's actually right, the exact bottleneck <a href="https://usebrief.com/blog/why-your-engineers-got-coding-agents-and-shipping-didnt-speed-up/">we've written about before</a> as an observation. Little's Law is why that observation isn't just an impression, as long as it's measured against the boundary the argument is actually about. If the rate entering review rises and the time inside review stays flat, the average number of items sitting in review has to rise too: more changes queued, more branches waiting, whether or not anyone is tracking it.</p>

<h2 id="what-measuring-it-actually-means">What measuring it actually means</h2>

<p>This is what "measured rather than guessed" cashes out to. Not a better estimate of effort, and not a headcount taken once. Three numbers, all measured against the same boundary, all derived from timestamps that already exist: the average number of items in progress inside that boundary over the observation window, integrated from open and close times rather than counted at a single moment; the average entry rate over that same window, items divided by the window's duration, not a raw count; how long the ones that exited actually took from entry to exit. None of the three requires anyone to predict anything, and none of them is a snapshot.</p>

<p>Brief's Velocity Agent is built on the same principle: measuring from real activity instead of from an estimate made before the work started. <a href="https://usebrief.com/blog/sixteen-agents/">It computes how fast a team is delivering from the work items themselves, so throughput is measured rather than guessed</a>. Which specific numbers it computes to do that is its own implementation, not something this post is claiming to know. Little's Law is why "measured from real activity" is the right standard to hold any such tool to in the first place, not a description of one.</p>

<h2 id="what-the-proof-doesn-t-tell-you">What the proof doesn't tell you</h2>

<p>Little's Law says the three numbers move together. It does not say which one to fix, or why W is long in the first place. A long cycle time might be a genuine review bottleneck, an unclear requirement nobody resolved, or a decision the team never actually made and every reviewer is independently re-deriving. The law makes the tradeoff impossible to ignore. It does not make the diagnosis for you, and treating a rising L as self-explanatory is its own way of guessing instead of measuring.</p>

<p>If your team started shipping faster this quarter, is that completions going up, or work in progress quietly going up instead, counted as progress because it's moving, not because it's done?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is Little's Law?</strong> A proven identity from queueing theory, published by John D.C. Little in 1961: for one consistently defined system, the average number of items in progress equals the rate new items enter it multiplied by the average time each one spends inside it, L = λW. The 1961 proof requires the three means to be finite, the corresponding stochastic processes to be strictly stationary, and the arrival process to be ergodic with a nonzero mean: conditions that rule out a system where entries are permanently outrunning exits.</p>

<p><strong>Why does adding AI coding agents to a team sometimes raise work in progress instead of throughput?</strong> Because the agents raise how fast changes enter review without necessarily shrinking how long each one takes to get through review. Applied consistently to that one boundary, ready-for-review to merged, Little's Law says if the entry rate rises and the time inside doesn't fall, the average number of items in review has to rise too, in whatever new steady state the system settles into, or grow without bound if entries permanently outrun what the team can complete.</p>

<p><strong>How is measuring throughput with Little's Law different from tracking story points?</strong> Story points estimate effort before work starts and get totaled per sprint, a number that can drift for reasons that have nothing to do with speed, different estimators, different task breakdowns, deliberate inflation. Little's Law's three numbers, average work-in-progress, entry rate, and time-in-system, are derived from timestamps on the work itself rather than estimated, but they still depend on a team holding one honest, consistent definition of the boundary. Move that definition and the numbers move with it; the identity doesn't stop that, it just makes an inconsistent definition visible once someone checks whether the three actually relate the way the proof says they must.</p>

<p><strong>What doesn't Little's Law tell you?</strong> Which number to fix, or why. It proves the three numbers move together; it doesn't diagnose whether a long cycle time comes from a genuine review bottleneck, an unresolved requirement, or a decision nobody actually made. That diagnosis is still a judgment call for a person to make, the law just makes it impossible to pretend the tradeoff isn't there.</p>]]></content:encoded>
    </item>
    <item>
      <title>Drift</title>
      <link>https://usebrief.com/blog/drift/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/drift/</guid>
      <pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate>
      <description>A competitor's pricing page said 'no setup fees' for two years. Three weeks ago a fee quietly appeared under implementation, everything else on the page untouched. The page changed. Nobody caught what it meant.</description>
      <content:encoded><![CDATA[<p>A competitor's pricing page said "no setup fees" for two years. Three weeks ago, a $500 fee quietly appeared under implementation costs for new accounts. The headline claim, the layout, the testimonials, all of it stayed exactly the same. One clause, buried two sections down, changed. Nobody on the other side caught it, because nobody was still reading a page they had already filed as "the answer."</p>

<p>That gap has a name close enough to borrow: <strong>drift</strong>, the space between what is true now and what you last checked. The easy half of that problem is already solved. A crawler that fetches a page today and compares it to yesterday's fetch will find the fee clause without trying. The hard half is the one crawling doesn't touch: knowing which of the differences it finds are the one that matters, and which are a font change, a testimonial rotation, a redesign that moved the same sentence to a different part of the page.</p>

<h2 id="not-every-difference-is-a-change">Not every difference is a change</h2>

<p>Machine learning has a formal name for a narrower version of this problem. Gerhard Widmer and Miroslav Kubat, in <a href="https://doi.org/10.1007/BF00116900">"Learning in the Presence of Concept Drift and Hidden Contexts"</a> (<em>Machine Learning</em>, 1996), describe concept drift as what happens when the underlying relationship a learning system is trying to track shifts under a hidden context, so a rule that was accurate stops being accurate, and the system has to notice that the ground it was standing on moved. Their specific problem was online learning algorithms, not competitor pages, and I'm borrowing the shape of it more than the formal machinery. But the core structure carries over exactly: a system watching for change needs a way to tell a shift in the thing it actually cares about apart from noise in the surface it's reading. A crawler diffing two page fetches has no such distinction built in. Every character that changed counts the same as every other character that changed, whether it moved a paragraph three pixels to the left or quietly added a fee.</p>

<h2 id="why-the-diff-itself-isn-t-enough">Why the diff itself isn't enough</h2>

<p>Here's where it gets harder than a smarter diff would fix. Suppose the competitor rewrites the fee clause instead of adding it fresh, "no setup fees" becomes "no setup fees on annual plans." A raw diff catches the two added words without any trouble. A system that scores changes by how much text moved treats a two-word addition as minor and suppresses it as noise, exactly backward, since those two words reverse what a monthly customer should expect to pay. Or suppose they move from "no setup fees" to "implementation is included," different words entirely, same commitment, and now the size-based signal points the other way: a big textual change flagged as significant when nothing about the actual claim moved at all. <a href="https://usebrief.com/blog/entity-resolution/">Recognizing that two descriptions, phrased differently, are about the same underlying claim</a> is the same problem a decision layer has to solve to know a new record and an old one are about the same thing. Drift detection needs that solved first. You cannot say a claim changed until you know which old claim it's being compared against, and phrasing is not a reliable enough signal to find it.</p>

<h2 id="what-this-actually-takes">What this actually takes</h2>

<p>Put the two pieces together and the real job comes into view. First, match the new page's claims to what you already had on record for that competitor, not by exact text but by what the claim is actually about, so a reworded sentence is still recognized as the same commitment or a different one. Second, once the match is made, ask whether the substance moved: not "did the words change" but "does this commit the competitor to something different than the version on file." Most differences a crawler finds fail that second test. Layout, tone, and phrasing move constantly without anything underneath them changing. The ones that pass it are rare, and they're the only ones worth a person's attention.</p>

<p>That's the job <a href="https://usebrief.com/blog/sixteen-agents/">Brief's Competitor Agent</a> is built around: it enriches the competitor set, crawls their pages, and flags when one of them drifts, not every time a page differs from its last fetch, but when what a competitor is actually claiming has moved.</p>

<h2 id="what-still-needs-a-person">What still needs a person</h2>

<p>Not every borderline case resolves cleanly, and it's worth saying so plainly. Whether a reworded claim represents a real shift or the same commitment in new language is sometimes a judgment call even for someone who has followed a competitor for years. A system that quietly picks a side on those calls is worse than one that flags them and asks. The honest version of drift detection routes the ambiguous cases to a person instead of deciding on their behalf, the same way an agent should route a decision it can't resolve rather than default through it.</p>

<p>Most of what a crawler finds isn't drift at all, it's the normal churn of a page nobody is redesigning around your notice. Does what your team catches actually separate the two, or does everything that changed just look the same?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is "drift" in competitive monitoring?</strong> The gap between what a competitor's page or positioning currently says and what a team last checked, specifically the subset of changes that reflect an actual shift in what they're committing to, not surface changes like a redesign or reworded copy that leaves the underlying claim the same.</p>

<p><strong>How is drift different from a crawler detecting that a page changed?</strong> A crawler compares two fetches and reports every difference with equal weight, a layout change and a pricing change look the same to it. Drift is the narrower, harder judgment underneath that: which of those differences reflect a real change in what the competitor is claiming, and which are noise in how the page happens to be written today.</p>

<p><strong>Why does detecting drift require entity resolution first?</strong> Because you can't tell whether a claim changed until you know which earlier claim to compare it against, and competitors rarely repeat their exact wording. A reworded sentence has to be recognized as the same underlying commitment, or a different one, before "did it change" is even a question you can answer.</p>

<p><strong>What happens when it's genuinely unclear whether something is real drift or just noise?</strong> It should go to a person rather than get silently decided. Some reworded claims are ambiguous even to someone who has tracked a competitor for years, and a system that guesses and moves on is worse than one that flags the ambiguous case and asks.</p>]]></content:encoded>
    </item>
    <item>
      <title>Void or Voidable</title>
      <link>https://usebrief.com/blog/void-or-voidable/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/void-or-voidable/</guid>
      <pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate>
      <description>Forty defaults an agent picked over two quarters, and nobody chose any of them. Not every one needs the same treatment. The distinction that tells you which comes from contract law, not engineering.</description>
      <content:encoded><![CDATA[<p>A team runs an audit of everything its agents decided unattended over the last two quarters and finds forty of them: a retry backoff, a naming convention for a new table, an error code, a tenant-scoping check quietly dropped from one query because it looked slow without it. Forty <a href="https://usebrief.com/blog/ghost-decisions/">ghost decisions</a>, each one a default an agent picked because it was the most probable answer, not because anyone with the standing to decide chose it. The team already knows how this happened. What they're stuck on is the next question: forty tickets, one sprint, and not enough hours to treat all forty the same way.</p>

<p>The instinct splits two ways, and both are expensive. Reverse everything, and you rip out defaults that turned out fine, burning a sprint on churn nobody asked for and teaching the team that review findings are noise. Leave everything, because it's been running fine for months, and you leave a quietly loosened security boundary in place for the same reason you left a harmless naming convention in place, which is no reason at all. Neither instinct is actually looking at the forty decisions. It's looking at how tired the team is.</p>

<h2 id="a-distinction-that-isn-t-about-code">A distinction that isn't about code</h2>

<p>Contract law has spent centuries on a version of this exact problem: two agreements can look identical on paper and be in completely different legal positions. The Restatement (Second) of Contracts (American Law Institute, 1981) is one of the most widely cited modern statements of the distinction. A <strong>void</strong> agreement has no legal effect from the moment it existed. Nothing that happens afterward cures it, not years of both sides acting as if it were binding, because there was never a valid act to begin with, only the appearance of one. A <strong>voidable</strong> agreement is the opposite shape: it's fully valid and binding unless the party with the standing to object exercises that power. And if that party instead keeps accepting the thing's benefits, keeps operating as though it stands, the law calls that ratification, an affirmative act that converts what could have been avoided into something no longer challengeable at all.</p>

<p>Same surface, opposite structure. One never had force and time cannot give it force. The other already has force, and time, specifically the informed party's choice not to object, is exactly what can make that force permanent.</p>

<h2 id="applying-it-to-the-forty-tickets">Applying it to the forty tickets</h2>

<p>Every ghost decision shares the same defect on the surface: no one authorized it. That's what makes it a ghost decision, and it's true of all forty, so it can't be what sorts them. The question that actually sorts them is narrower: setting aside that nobody happened to authorize this one, could someone with real standing have legitimately authorized it, if they'd been asked?</p>

<p>A ghost decision is <strong>void</strong> when the answer is no, not because the right approver was absent, but because the call was never anyone's to make informally at all. The tenant-scoping check the agent dropped is the clean example: this isn't a case of the right person being unavailable to sign off, it's a case where weakening a data boundary this way needs a security review on its own terms, no matter who's asking. No amount of the code running incident-free changes that, because legitimacy here was never a function of elapsed time or of eventually finding the right approver after the fact. These get reversed on discovery, full stop, regardless of age or how much now sits on top of them.</p>

<p>A ghost decision is <strong>voidable</strong> when the answer is yes: an ordinary call that a person with standing plausibly would have signed off on if asked, and simply wasn't. The retry backoff, the naming convention, most of the ordinary shape-of-the-code calls: reasonable engineers disagree about the right answer, and if the people with standing to weigh in have seen the pattern, in review, in production, repeatedly, for months, and said nothing, that silence is doing the same work ratification does in the doctrine, at least for the question of whether it's worth a sprint to reverse it. It is not the same as the default having become an authorized decision. <a href="https://usebrief.com/blog/agents-store-beliefs-not-decisions/">A decision still requires the actual act</a>, someone with standing choosing it. Ratification by silence answers a narrower question: whether reversing it is worth the churn, not whether it now has the standing of something the team actually decided. If the team wants that too, the fix is cheap, one person with standing affirms it in a line, but it still has to happen; the silence itself doesn't supply it.</p>

<h2 id="the-honest-limit-of-the-analogy">The honest limit of the analogy</h2>

<p>This is a borrowed framework, not legal advice, and it has real limits stretched this far. Void and voidable, strictly, describe agreements between parties; what's actually happening here is closer to a different corner of the same law: an agent, the term is literally shared, acting without authority on behalf of a principal, and whether that act can be ratified afterward. The Restatement (Third) of Agency covers exactly this, and its rule on which unauthorized acts are even capable of ratification lands on the identical line drawn above: a principal can only ratify an act it could have authorized in the first place. Void-or-voidable is the more legible shorthand for a general audience; agency's ratification doctrine is the more precise citation, and it independently backs the same cut.</p>

<p>Ratification, in either doctrine, usually requires the ratifying party to have known the material facts and had the capacity to object. An engineer scrolling past one more diff in a busy review queue is a much weaker form of informed silence than either doctrine assumes. Treat "voidable, and ratified" as a useful triage frame, not a permission slip to stop looking at what's actually running in production.</p>

<p>What the distinction actually buys a team with forty tickets and one sprint is a real sort, not a mood. The security-relevant defaults get flagged as void and reversed no matter how long they've quietly worked. The ordinary shape-of-the-code defaults get deprioritized, not settled: the team's own months of informed silence are real evidence against spending this sprint's hours reversing one, not proof the checking is finished.</p>

<p>The cheapest fix for the void half never produces those tickets at all. <a href="https://usebrief.com/blog/ghost-decisions/">Voidable defaults are supposed to keep defaulting in peace</a>, except at the forks a team has already decided. A void ghost decision is a fork where legitimacy was never available informally: a security boundary, a data guarantee. That kind of fork needs a gate at the point of change, not a default. The edit can't ship without a decision-store entry that has passed admission control, <a href="https://usebrief.com/blog/agents-store-beliefs-not-decisions/">the same property defined for the store</a>, extended to the one class of change where defaulting was never the right call.</p>

<p>Does your team's answer to "how did this default get here" hold up before you ever have to ask which pile it belongs in?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What's the difference between a void and a voidable agreement?</strong> A void agreement never had legal effect, and nothing that happens afterward changes that. A voidable agreement is fully valid and binding unless the party with the power to object exercises it; if that party instead keeps accepting its benefits, the law treats that as ratification, which forecloses objecting later.</p>

<p><strong>How do you tell whether a ghost decision is void or voidable?</strong> Ask whether anyone with real standing could have legitimately made that call. If the answer is no, a security boundary, a data guarantee, something nobody with authority would have signed off on, it's void and gets reversed regardless of age. If the answer is yes, an ordinary implementation choice a reasonable engineer could have picked, and the team has seen it repeatedly without objecting, it's voidable, and the team's own silence has already answered whether it's worth reversing, though not whether it counts as something the team formally decided.</p>

<p><strong>Why not just review every AI-generated default eventually?</strong> Because "eventually" both under-treats the void ones, which stay dangerous for exactly as long as they stay unreviewed, and over-treats the voidable ones, which get flagged as urgent alongside genuine risks and compete for the same limited review time. Sorting by void versus voidable tells a team which of the forty need attention this sprint and which its own conduct has already deprioritized.</p>

<p><strong>Isn't ratification-by-silence a stretch when nobody actually reviewed the code carefully?</strong> Yes, and that's the real limit of the analogy, not a reason to discard it. Legal ratification assumes the ratifying party knew the material facts. A rushed review is weaker evidence of informed acceptance than the doctrine assumes, so "voidable, likely ratified" should lower the priority of revisiting a default, not close the question permanently.</p>]]></content:encoded>
    </item>
    <item>
      <title>Supersession</title>
      <link>https://usebrief.com/blog/supersession/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/supersession/</guid>
      <pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate>
      <description>A stale decision in the context window is worse than no decision, because it gives the agent confidence in the wrong constraint.</description>
      <content:encoded><![CDATA[<p>A team decides in March that enterprise exports should be CSV-only. It is a clean decision at the time: simple format, low surface area, fewer permissions questions. The reasoning gets captured, linked to the export work, and everyone moves on.</p>

<p>In June, the same team changes its mind. Three customers need board-ready reports, the security review is done, and the product call is now scoped PDF export for admins only. That decision gets captured too.</p>

<p>An agent picks up a task in August: "Add export support to the reporting page." It finds the March decision and follows it perfectly. No PDF. CSV only. The implementation is coherent, tested, and wrong.</p>

<p>The failure was not missing context. The failure was stale context with confidence.</p>

<h2 id="a-decision-is-not-permanent">A decision is not permanent</h2>

<p>Product decisions are usually written as if they are facts. "Exports are CSV-only." "Slack is the first notification channel." "Admins own billing." "Mobile is read-only for now."</p>

<p>But most of these are not eternal truths. They are commitments made under conditions: what customers needed then, what the team could support then, what the business was prioritizing then, what risks had not yet been resolved.</p>

<p>When those conditions change, the decision may change too. The old one does not become embarrassing or useless. It becomes history. It explains why the system looks the way it does, but it no longer governs what should happen next.</p>

<p>That distinction matters more for agents than it ever did for people. A person who was around for the June discussion may remember that March was overruled. An agent reading retrieved context has no such memory. It only has records. If the records do not say which one replaced which, the agent has to guess.</p>

<p>And if the old decision is clearer, closer to the code, or easier to retrieve, the agent may choose the wrong one for exactly the reason you trained it to: it found a decision and respected it.</p>

<h2 id="stale-context-is-worse-than-missing-context">Stale context is worse than missing context</h2>

<p>Missing context makes an agent uncertain. Stale context makes it certain in the wrong direction.</p>

<p>That is the dangerous part. When the agent has no decision, it may ask, hedge, or follow the local code. You can often spot the gap in review. But when it has an old decision, the work looks disciplined. It can point to the rule it followed. The mistake wears the shape of compliance.</p>

<p>This is why "give the agent more context" is not enough. More context increases the chance that the old decision is somewhere in the pile. It does not tell the agent whether that decision still applies.</p>

<p>A context window full of unranked historical truth is not a product context layer. It is an archive. Archives are useful, but they do not govern action. To govern action, a system has to know which record is current, which record was replaced, and why the replacement happened.</p>

<h2 id="search-alone-cannot-solve-this">Search alone cannot solve this</h2>

<p>Search is very good at finding relevant records. Supersession is not the same problem.</p>

<p>If a team has two decisions about exports, both are relevant. The March CSV-only decision is relevant because it explains the current implementation. The June scoped-PDF decision is relevant because it governs the next implementation. A search system can return both and call the job done.</p>

<p>But the hard question is not "which records mention exports?" It is "which decision controls the work now?"</p>

<p>That is a relationship question. The June decision supersedes the March decision. It does not merely share keywords with it. It changes the status of the earlier record.</p>

<p>A timestamp alone is not enough either. Newer does not always mean authoritative. A Slack comment from yesterday should not overrule a reviewed decision from last month just because it is fresher. Supersession needs provenance, scope, and intent. Who made the new call? What does it replace? Does it replace the whole decision or only one condition? Is the old decision retired, narrowed, or still active in another context?</p>

<p>Without that structure, the agent is left with a pile of plausible records and a sorting problem disguised as judgment.</p>

<h2 id="supersession-is-how-context-stays-alive">Supersession is how context stays alive</h2>

<p>The moment a decision is captured, it starts aging.</p>

<p>Some decisions stay true for years. Some expire when a launch happens. Some are temporary until a risk is resolved. Some get narrowed when enterprise customers need different behavior from self-serve users. Some get reversed because the first call was wrong.</p>

<p>A living product context system has to handle all of those cases. Not by deleting the old decision, because the old decision still explains the system. Not by hiding it, because future work may need the history. And not by dumping both into retrieval and hoping the agent can infer governance from prose.</p>

<p>It needs supersession: an explicit link saying this record replaced that record, for this scope, for this reason.</p>

<p>That link is what lets old reasoning remain useful without remaining active. It lets the agent understand why the code was built one way and why the next change should move it another way. It preserves history without letting history masquerade as the current plan.</p>

<h2 id="this-is-where-product-context-becomes-infrastructure">This is where product context becomes infrastructure</h2>

<p>A document can hold a decision. A search index can retrieve it. A memory file can remind an agent it exists.</p>

<p>But none of those, by themselves, keep the decision current.</p>

<p>That is the infrastructure problem Brief is built around. Product context is not just the accumulation of decisions. It is the maintained state of those decisions: what they govern, what they depend on, what replaced them, and who needs to know when they change.</p>

<p><a href="https://usebrief.com/blog/entity-resolution/">Entity resolution</a> answers one question: are these two records about the same real thing?</p>

<p>Supersession answers the next one: if they are, which one governs now?</p>

<p>Without the first, the system cannot tell that "CSV-only exports" and "scoped PDF reports" are part of the same product thread. Without the second, it can tell they are related but not which one should guide the next builder.</p>

<p>That is the difference between context as storage and context as navigation. Storage says, "Here are the records." Navigation says, "This is the one that controls your work."</p>

<h2 id="the-agent-should-not-have-to-be-a-historian">The agent should not have to be a historian</h2>

<p>An agent asked to build should not have to reconstruct your company's decision history from scratch. That is not good autonomy. It is delegated archaeology.</p>

<p>The agent's job is to apply the current decision well. The context system's job is to know what current means.</p>

<p>So the test is simple. When your team changes its mind, does the old decision become safely historical? Or does it remain in the same pile as the new one, waiting for the next agent to retrieve it and obey it?</p>

<p>If both records are findable but only one is current, your system has not solved product context yet. It has only made the contradiction easier to discover after it has already done damage.</p>

<p>A decision record matters because someone will build against it later. Supersession is what makes sure they build against the one you still mean.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is supersession?</strong> Supersession is the relationship between an older decision and a newer decision that replaces, narrows, or overrules it. It preserves the old decision as history while marking that it no longer governs the same work.</p>

<p><strong>Why do AI agents need supersession?</strong> Agents are asked to retrieve and follow context, and an old decision can look just as authoritative as a current one. If it is still visible but not marked as replaced, an agent can follow it perfectly and ship the wrong thing. Supersession tells the agent which decision is current.</p>

<p><strong>Why not just use the newest decision?</strong> Newest is not the same as authoritative. A casual comment from yesterday should not automatically overrule a reviewed decision from last month. Supersession needs an explicit relationship, scope, and provenance.</p>

<p><strong>How is this different from deleting stale docs?</strong> Deleting the old decision loses the history that explains why the system was built that way. Supersession keeps the history but prevents it from governing future work.</p>

<p><strong>What does Brief do here?</strong> Brief keeps decisions connected to the product objects they govern and tracks when one decision replaces another. That lets engineers and agents see both the historical reasoning and the current rule, without guessing which one still applies.</p>]]></content:encoded>
    </item>
    <item>
      <title>Entity Resolution</title>
      <link>https://usebrief.com/blog/entity-resolution/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/entity-resolution/</guid>
      <pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate>
      <description>A team's decision gets one name in a Slack thread, another in the Linear ticket, and a third in the customer call that prompted it. To a system reading all three, that's three unrelated records unless something links them.</description>
      <content:encoded><![CDATA[<p>A team decides to redesign checkout. In the Slack thread where it got argued out, it's "the checkout redesign." In Linear, it's ticket BRI-4821, "revamp payment flow." In the customer call that prompted it, the rep calls it "the new payment experience" three separate times. Three sources, one decision, and not one string of text in common between them. A system reading all three sees three unrelated records, because as far as the words go, that's exactly what they are. A person who sat in on all three conversations would connect them without thinking about it. A system with no memory of its own has no such shortcut, and has to be told, deliberately, that these three things are one thing.</p>

<p>That problem has a name older than any tool now running into it: <strong>entity resolution</strong>, the task of deciding whether two records from different sources, described in different words, refer to the same real-world thing. Get it wrong in one direction and you split one decision into three untracked fragments. Get it wrong in the other and you merge two different decisions into one, which is worse, because now the record is confidently pointing at the wrong thing.</p>

<h2 id="the-theory-is-older-than-the-problem-looks">The theory is older than the problem looks</h2>

<p>Statisticians Ivan Fellegi and Alan Sunter gave this its first formal treatment in 1969, in <a href="https://doi.org/10.1080/01621459.1969.10501049">"A Theory for Record Linkage"</a> (Journal of the American Statistical Association, vol. 64). Census bureaus and public-health researchers had been matching people across data sets by hand for decades, deciding by eye whether "J. Smith, 1942" in one file and "John Smith, b. 1942" in another were the same person. Fellegi and Sunter turned that judgment call into a decision rule: compare a pair of records on a set of features, use the pattern of agreement and disagreement across those features to compute a likelihood ratio, and classify the pair as a match, a non-match, or uncertain enough to route to a person. The contribution wasn't the intuition that similar records might be the same thing. It was making that intuition falsifiable, a rule with a known error rate instead of a hunch.</p>

<p>The field built on that theory has gone by a few names since, record linkage, coreference resolution in NLP, and now most often entity resolution, but the shape of the decision hasn't moved: given two descriptions, decide whether they're two views of one thing or two different things that merely resemble each other.</p>

<h2 id="why-it-s-not-just-deduplication">Why it's not just deduplication</h2>

<p>The two get confused because they look similar from a distance, and it's worth being precise about the difference. Deduplication finds near-identical copies within one source, the same customer record entered twice with a typo in the second one. Entity resolution is the harder problem: recognizing that two records from different sources, described in genuinely different language by different people through different tools, are about the same underlying thing. "The checkout redesign" and "revamp payment flow" share no words at all. A system built only to catch near-duplicates would never flag them, because they aren't duplicates. They're the same entity, described twice, by people who had no reason to coordinate their phrasing.</p>

<h2 id="what-breaks-without-it">What breaks without it</h2>

<p>Here's the part that isn't obvious until you look for it: <a href="https://usebrief.com/blog/supersession/">supersession</a> depends on entity resolution working first. Marking a decision "superseded" only makes sense once a system can say two records are about the same decision, an old one and a version that replaces it. Without that link, a new record just looks like a new, unrelated fact sitting next to an old one nobody flagged as outdated. A decision record that stays current, rather than one more entry in a pile that silently drifts out of date, depends on getting this one problem right first.</p>

<p>This is also what turns a set of separate lists into something worth calling a graph, rather than a shared name for several trackers that happen to sit in the same product. A persona pulled from a call, a decision pulled from Slack, a feature pulled from Linear, and a deal pulled from a CRM don't relate to each other on their own. They relate to each other once something recognizes when two of them, described in unrelated language from unrelated tools, are actually about the same thing.</p>

<h2 id="the-agent-that-does-this-and-nothing-else">The agent that does this and nothing else</h2>

<p>That's the job of <a href="https://usebrief.com/blog/sixteen-agents/">Brief's Entity Resolution Agent</a>, one of two agents in the roster that runs without a page you ever visit, because there's nothing to review: it links objects across sources so instances of the same real-world thing, described differently in different tools, get recognized as one thing instead of several. It's the quietest agent on the team, and the parts of the system that depend on knowing which records are about the same underlying thing, supersession chief among them, depend on it having already done that work.</p>

<p>The other agents get the visible credit: features tracked, personas drawn, decisions surfaced. None of what they produce adds up to one coherent picture rather than fifteen separate feeds unless something has already answered a quieter question first. When two of them describe the same thing in different words, does the system know?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is entity resolution?</strong> The task of deciding whether two records, described in different words from different sources, refer to the same real-world thing. Fellegi and Sunter formalized it in 1969 as a decision rule: compare records on a set of features and use the pattern of agreement to classify the pair as a match, a non-match, or uncertain.</p>

<p><strong>How is entity resolution different from deduplication?</strong> Deduplication catches near-identical copies within one source, the same record entered twice with small variations. Entity resolution is the harder case: two records from different sources, in genuinely different language, that describe the same underlying thing without sharing any of the same words.</p>

<p><strong>Why does a product context system need entity resolution specifically?</strong> Because supersession depends on it. Marking a decision current or outdated only makes sense once a system can tell that two records, an old one and a new one, are about the same decision in the first place. Without that link, a new record just sits beside an old one, and nothing marks the old one as replaced.</p>

<p><strong>What does Brief's Entity Resolution Agent actually do?</strong> It links the objects every other agent produces, personas, decisions, features, deals, so instances of the same real-world thing from different sources are recognized as one thing instead of several unrelated records. It runs without a page you visit, because its output is a link between records, not something to review or approve.</p>]]></content:encoded>
    </item>
    <item>
      <title>Product Context Layer</title>
      <link>https://usebrief.com/blog/product-context-layer/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/product-context-layer/</guid>
      <pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate>
      <description>Product management writing describes the job in different words, but it keeps landing on the same fact: someone has to hold the why and connect it to whoever builds next. A product context layer is what happens when that job stops living only in one person's head.</description>
      <content:encoded><![CDATA[<p>An engineer opens a ticket, reads it twice, and still cannot tell why the feature has to work this way instead of the three other reasonable ways. The ticket describes the what. Nobody wrote down the why, because the why lived in a Slack thread from March, a customer call nobody recorded, and a tradeoff a VP made verbally in a hallway. The engineer picks a reasonable interpretation and ships it. It is wrong, not because the engineer was careless, but because the information that would have made it right was never in a place anyone could query.</p>

<p>That gap has a name in product management circles now: product context. <strong>A product context layer is a governed record of why a product is the way it is: the customer problem a decision answers, the business constraint that shaped it, and the tradeoff a team already made and does not intend to remake, kept current and attached to the part of the system it governs, so anyone or anything building the next piece can find it without asking around.</strong> The boundary was never the file format; it's whether the complete seven-property set is deliberately supplied, not any one habit alone. Versioning in git gets durable history. Review before merge gets an admission gate and provenance, if the reviewers actually have standing. A check for contradictions gets integrity. None of that supplies a queryable schema or selective retrieval on its own; those need building in too. Only when all seven are actually present, the file-backed shape this post's own linked definition describes assembling by hand, does a spec or roadmap become a product context layer. This is the shorthand version; <a href="https://usebrief.com/blog/agents-store-beliefs-not-decisions/">the full requirement set</a>, selective retrieval, a schema, concurrency, durable history, integrity constraints, provenance, and admission control, is laid out where the term was first defined precisely.</p>

<h2 id="where-the-idea-comes-from">Where the idea comes from</h2>

<p>Product management writing has circled this same job for decades without settling on one name for it. Ben Horowitz and David Weiden's essay "Good Product Manager, Bad Product Manager," now hosted by Andreessen Horowitz and still widely circulated decades later, draws the line at synthesis: a good PM knows the market, the customer, and the technology well enough to turn all three into one coherent story the rest of the company can build against; a bad PM has a list of excuses for why that story never got written down. Clayton Christensen's Jobs to Be Done framework makes the same point from the customer side: a feature only makes sense once you can state the job the customer hired it to do, and that job is exactly the kind of fact that can get stripped out when a rich spec gets reduced to a thin ticket. Melissa Perri's Escaping the Build Trap names what an organization defaults to when that synthesis doesn't happen: it measures itself on output, features shipped, tickets closed, velocity, and ships to the schedule instead of to the customer problem those outputs were supposed to solve. Perri's claim is about what gets measured. The reasoning-goes-unrecorded story is this post's addition to it, not hers.</p>

<p>None of these sources call it a product context layer. All of them are describing the same missing layer from a different angle: the connective tissue between why a customer needs something, why the business will fund it, and why the team is building it this particular way. What's new is not the idea. The need to externalize it was already real before any of this: the same need shows up in onboarding, cross-team alignment, and review, all older than AI agents. What changed is the scale and the latency it has to run at. When the only things reading it were other people, an occasional gap could be patched with a Slack message and a short wait. An interactive agent still can, up to a point. The constraint shows up on the work that doesn't run that way: unattended, many agents on many tasks in parallel with no one watching any single one. Waiting on a timely human answer at every fork erases the speed that kind of work exists to provide. Reasoning that isn't already written down somewhere those agents can read doesn't get asked about there. It gets guessed.</p>

<h2 id="why-engineering-teams-specifically-need-this">Why engineering teams specifically need this</h2>

<p>Fred Brooks made the relevant distinction in "No Silver Bullet" back in 1986: a piece of software's essence is the conceptual construct itself, the data, the relationships among that data, the algorithms, and the functions that invoke them, and the hard part of building software is specifying, designing, and testing that construct. Accidental complexity is everything layered on top by the representation: the language, the tooling, the friction of expressing the construct in code. Every tooling advance since, better languages, better frameworks, and now agents that write the code outright, has attacked accidental complexity. Brooks himself named ways to attack the essential work too, rapid prototyping to pin down requirements and growing a system organically through use and testing rather than building it whole, and modern agents can help draft a plan or a spec the same way. None of that eliminates the specification and design work; it speeds it up and makes it better informed, and it still runs on inputs no tool supplies on its own: the customer problem, the business constraint, the decision already made about how this system should behave.</p>

<p>Product context is one of those inputs, not a stand-in for essential complexity itself. As accidental complexity keeps getting cheaper to remove, the essential work is what's left, and a product context layer supplies its inputs: the customer problem, the constraint, the decision already made. An engineering team that has it stops re-deriving those inputs from code never designed to hold them. A team without it still does the same design work, just blind, reconstructing inputs an agent or an engineer needed and never had.</p>

<h2 id="what-having-it-changes-and-what-not-having-it-costs">What having it changes, and what not having it costs</h2>

<div class="table-scroll rail-wide" role="region" aria-label="Table 1" tabindex="0">
<table><thead><tr><th scope="col"></th><th scope="col">With a product context layer</th><th scope="col">Without one</th></tr></thead><tbody><tr><th scope="row">Onboarding</th><td>A new engineer or a new agent reads the decision attached to the code, not just the code</td><td>Onboarding runs through senior people's memory and availability, and it does not scale past their calendar</td></tr><tr><th scope="row">Agent defaults</th><td>An agent hits a fork and finds the decision that already resolved it</td><td>An agent hits the same fork with the task prompt, codebase, rules file, and conversation, none of which necessarily says which choice the team made, and picks the most probable answer instead</td></tr><tr><th scope="row">Cross-team alignment</th><td>Design, engineering, and support work from the same recorded reasoning</td><td>Each function reconstructs its own version of "why," and the versions quietly disagree</td></tr><tr><th scope="row">Decision durability</th><td>A superseded decision is marked superseded, so old reasoning cannot resurface as current</td><td>Old Slack threads and stale docs get treated as current, because nothing marks them otherwise</td></tr><tr><th scope="row">Review load</th><td>Reviewers check the work against a stated decision</td><td>Reviewers have to reconstruct the decision themselves before they can check anything against it</td></tr></tbody></table>
</div>

<p>The pattern across every row is the same. Nothing about not having a product context layer stops work from happening. It just moves the cost from being written down once to being reconstructed, imperfectly, by every person and every agent who touches that part of the system afterward.</p>

<h2 id="how-teams-actually-move-faster-with-one">How teams actually move faster with one</h2>

<p>The acceleration is not from deciding faster. It's from not re-deriving the same decision from scratch every time someone downstream needs it. A team without a context layer pays a small, recurring cost every time someone has to rediscover a decision before they can safely build on it, and that cost compounds with every additional person and every additional agent who touches the same part of the system blind. Nobody puts a line item on it, because it never arrives as one bill; it arrives as a steady background rate of rework spread across every team that builds on that part of the system afterward. A team with a context layer still pays a real cost: capturing the decision once, and keeping it current as it changes or gets superseded. What changes is that the cost is paid once per decision instead of once per person who later needs it, and it is a maintenance cost you can see, not a tax nobody can find on the books.</p>

<h2 id="product-management-is-the-glue-job">Product management is the glue job</h2>

<p>Strip away the job titles and the org charts, and what product management does, in Horowitz and Weiden's essay and in every "voice of the customer" tradition since, is sit at the point where customer need, business reality, and engineering constraint have to be reconciled into one direction. That is a synthesis job, not a documentation job, and it has never had a natural home. It happened in meetings, in one person's judgment, in a PRD that summarized a hundred conversations nobody else was in. The glue was real. It just was not visible or queryable by anything except the person holding it.</p>

<p>A product context layer does not replace that synthesis. It is what the synthesis looks like once it stops living only in a person's head and starts living somewhere every function, and every agent, can read from. The glue job does not go away. It gets a place to put the glue.</p>

<h2 id="engineering-is-accelerating-the-glue-has-to-keep-up">Engineering is accelerating. The glue has to keep up.</h2>

<p>We've written elsewhere about <a href="https://usebrief.com/blog/product-management-velocity-problem/">the personal side of this</a>, the judgment gap opening up for individual product managers as coding agents compress build time on the routine work that's actually fast now. This is the systemic side of the same shift. As routine product work, the standard flows and CRUD screens, not the novel architecture, keeps getting faster to ship with an agent, the bottleneck stops being how fast code gets written and becomes how fast the reasoning behind it can reach every engineer and every agent working in parallel, at the moment each of them needs it. A person holding that reasoning in meetings does not scale to that many simultaneous consumers. A layer built to hold it and serve it on demand does.</p>

<p>That's the gap Brief is built to close: it keeps the decisions and the reasoning behind them current and attached to the part of the system each one governs, and surfaces the right piece to an engineer or an agent at the moment they're about to build against it. Not a faster meeting. A faster path from a decision made once to that decision being available everywhere it applies.</p>

<p>None of that writing was ever wrong about what the job is. What changes is whether the job has to move at the speed of a person's calendar, or at the speed of everything now building on top of it?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is a product context layer?</strong> A governed record of the reasoning behind a product's decisions, not just the decisions themselves, kept current and attached to the part of the system it governs. It answers why a choice was made a particular way. A spec or roadmap becomes one only when it deliberately supplies the complete seven-property set below, not through versioning or review habits alone, which cover some of the seven but not a schema or selective retrieval on their own. <a href="https://usebrief.com/blog/agents-store-beliefs-not-decisions/">The full requirement set</a>, selective retrieval, a schema, concurrency, durable history, integrity, provenance, and admission control, lives where the term was first defined precisely.</p>

<p><strong>How is product context different from a spec or a roadmap?</strong> Not by file format. A spec or roadmap becomes one only if it deliberately carries the complete seven-property set, selective retrieval, a schema, concurrency, durable history, integrity, provenance, and admission control, not just the two or three that versioning and review habits happen to cover.</p>

<p><strong>Why do AI coding agents need product context specifically?</strong> An interactive agent can pause and ask a person a question. The constraint shows up on work that doesn't run that way: unattended, many agents on many tasks in parallel with no one watching any single one, where waiting on a timely human answer at every fork erases the speed that mode exists to provide. If the reasoning behind a decision was never written down somewhere those agents can read, they proceed without it and guess.</p>

<p><strong>How does a product context layer help product managers, not just engineers?</strong> It takes the synthesis a PM already does across functions and gives it a place to live besides that PM's memory and the meetings where it gets discussed. The judgment does not change. What changes is whether an engineer or an agent building against that judgment has to interrupt someone to get it, or can just look it up.</p>]]></content:encoded>
    </item>
    <item>
      <title>Proactive Brief</title>
      <link>https://usebrief.com/blog/proactive-brief/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/proactive-brief/</guid>
      <pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate>
      <description>A decision you recorded but were never reminded of at the right moment is one you made twice: once on purpose, once by accident. Proactive Brief is built to reach you before you think to ask.</description>
      <content:encoded><![CDATA[<p>Every tool you use to hold what your team knows is passive. The wiki, the doc, the decision log, the channel history: each one sits and waits for you to come and ask it. They all rest on the same assumption, that at the moment you need something, you will remember it exists and go get it. That assumption is where all of them quietly fail.</p>

<p>The problem was never writing things down. Teams write plenty down. The problem is that a record you have to remember to retrieve is worth almost nothing at the one moment it matters, because that is exactly the moment it does not occur to you to look. Picture the situation precisely. You are about to ship a change that quietly reverses a decision the team made in the spring. You are not going to open the decision log to check, because as far as you know there is nothing to check. Passive knowledge only ever helps the person who already suspects the answer is there. Everyone else walks straight past it.</p>

<h2 id="the-agent-that-comes-to-you">The agent that comes to you</h2>

<p>Which is why one of <a href="https://usebrief.com/blog/sixteen-agents/">the sixteen agents behind Brief</a>, Proactive Brief, is built around this. It watches the decisions your team has on record and the signals moving around them, and when a change bears on a commitment you already made, it does not broadcast a note to the whole team and hope the right person notices. It works out who the change concerns, usually the person who owns the affected decision, and takes it to that one person. You do not have to know to ask. That is the whole point of it: it closes the gap between "the answer was on record" and "the answer reached the person who needed it."</p>

<p>The instant objection is that this is just more notifications, and it would be, except that the difference is the entire design. Three rules govern every time it opens its mouth, and each one is there to make it a colleague rather than a feed.</p>

<p><strong>It earns the interruption.</strong> It does not fire on activity, it fires on meaning. A change becomes a message only when it touches a decision you actually made, and even then it is rationed: at most a couple of interruptions in a week, and several related items collapse into one note instead of arriving as five. A team that has decided nothing hears nothing. Silence is the default, and an interruption has to be paid for out of a small budget, which means the ones that arrive are worth the tax they charge on your attention.</p>

<p><strong>It does the work, you make the call.</strong> When something changes, it does the reading. It finds the decision the change bears on, works out whether the two are genuinely in tension rather than merely similar, and brings you the short version. That distinction is most of the job and the easy thing to get wrong: a new piece of work that <em>implements</em> a past decision looks, on the surface, almost identical to one that <em>contradicts</em> it, and telling those apart is what separates a useful nudge from noise. What is left for you is the single thing a person should keep, the judgment. "You decided this because of that. Since then, this changed. Still true?"</p>

<p><strong>Every message is a next action.</strong> It never arrives just to inform you. Each one carries a specific decision and a link to act on it, confirm it, dismiss it, or let it wait, rather than something to read and file. Anything you defer is not turned into per-item homework; it waits in a review queue that stays yours to clear, and the nudge to come back is about the queue as a whole, never a peck for each candidate. You can let any single one wait, which is the only honest way to ask for someone's attention.</p>

<h2 id="what-it-actually-catches">What it actually catches</h2>

<p>In practice it surfaces the things you would never have gone looking for, because you had no reason to think they were there. A decision whose deadline or condition is coming up, worth a second look before it lapses on its own. A customer theme that has quietly started to build against an assumption one of your live decisions depends on. A change someone just shipped that sits at odds with a call the team made months ago and <a href="https://usebrief.com/blog/overruled-precedent/">reproduces the very thing you had moved away from</a>. Each one taken to a single person, usually the owner of the decision it affects, with the context already assembled and a clear thing to do next.</p>

<p>It ends up feeling less like software and more like the one colleague who has been at the company long enough to say, in the meeting, "we tried that in the spring, and here is why we stopped," except that this one never leaves, never forgets, and never makes remembering your job.</p>

<h2 id="why-you-actually-need-it">Why you actually need it</h2>

<p>Everything else about a record is capture and storage, and those matter. But a decision you wrote down and were never reminded of at the moment it counted is a decision you effectively made twice: once on purpose, and once by accident, when you undid it without knowing it was there. The writing was never the point. The point was to have the thing come back to you, on its own, at the moment you would otherwise walk past it.</p>

<p>That restraint has a real cost, though: rationing the interruptions on purpose means plenty of real, true, worth-knowing signal never clears the bar to become one. <a href="https://usebrief.com/blog/standing-brief/">A separate mechanism</a> exists specifically to carry that sub-threshold information on a fixed schedule instead of competing for Proactive Brief's own budget.</p>

<p>So the question worth sitting with is not whether your team's decisions are written down somewhere. Plenty of them are. It is whether anything is going to bring the right one back to you at all, without your having to remember it exists, or whether that, still, is a thing you are quietly left to carry on your own?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is Proactive Brief?</strong> Proactive Brief reaches out when a change bears on a decision your team has made, instead of waiting to be asked. It watches the decisions and signals a team has on record, works out who the change concerns, and takes it to that one person rather than posting it to the whole team.</p>

<p><strong>How is this different from notifications?</strong> Notifications fire on activity; Proactive Brief fires on meaning. It only speaks when a change touches a decision you actually made, it limits how often it can interrupt, it collapses several related items into a single message, and every message lands on a decision you can act on rather than information to file away. Silence is the default and an interruption has to be earned.</p>

<p><strong>Why isn't storing decisions enough?</strong> Because a record you have to remember to look up is worth little at the moment it matters most, which is exactly the moment you have forgotten it exists. The time you are about to contradict a past decision is the time it will not occur to you to check for one. The value is realized only when the right decision reaches you unprompted and in context, rather than waiting in a log for you to think to query it.</p>

<p><strong>What kinds of things does Proactive Brief surface?</strong> Things you did not know to look for: a decision whose deadline or condition is approaching and may be worth re-confirming; a customer or research theme that has started building against an assumption a live decision depends on; and a change someone has shipped that sits in tension with a call the team made earlier. Each goes to a single person, usually the owner of the affected decision, with the context and a clear next step attached.</p>]]></content:encoded>
    </item>
    <item>
      <title>Two Answers</title>
      <link>https://usebrief.com/blog/two-answers/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/two-answers/</guid>
      <pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate>
      <description>Give a coding agent the same task twice and you get two different, plausible answers that disagree with each other. The fix is not a better model. It is a shared record of what the team already decided.</description>
      <content:encoded><![CDATA[<p>Give a coding agent a task and it does a competent job. Give it the same task again, in a fresh session or to a second agent running in parallel, and you get a different result. Not a small difference. The two answers put the logic in different places, follow different conventions, make different assumptions about what you meant, and each one compiles and passes and reads like something a reasonable engineer would write. You have two competent answers to one question, and they do not agree.</p>

<p>The easy explanation is that the model is random, and it is, a little. These systems sample, and sampling varies. But turn that dial down as far as it goes and the divergence does not disappear, because the randomness in the sampler was never the main thing moving. The main thing moving is <a href="https://usebrief.com/blog/working-memory/">the context</a>. Each run assembled its own: the files that happened to be open, the snippets a retriever judged relevant, the earlier turns of the conversation, the order all of it arrived in. Two runs of the same model over two different contexts are two different questions. It is not surprising they produce two different answers.</p>

<h2 id="one-agent-is-a-curiosity-many-is-a-problem">One agent is a curiosity, many is a problem</h2>

<p>With a single agent and a single task this is a curiosity. It stops being one the moment there is more than one. A team running agents runs them constantly and in parallel: many sessions, many engineers, many tasks touching the same system in the same week, each with its own assembled context and each producing something locally reasonable. Nothing sits above them reconciling the results. So the system does not fail, it diverges. It fills with competent, individually defensible choices that were never made against the same reference, and no single one of them is the bug. The drift is the bug, and the drift has no author.</p>

<h2 id="what-it-takes-to-converge">What it takes to converge</h2>

<p>Two runs converge when they share whatever determines the answer. If a question is fully settled by the code in front of the agent, both runs read that code and land in the same place; you rarely get two answers about what a function returns. You get two answers when the question is not settled by the code. When the right choice depends on something the code does not contain, such as which service is supposed to own this write, why the boundary was drawn here and not one layer up, or <a href="https://usebrief.com/blog/overruled-precedent/">which approach the team already tried and abandoned</a>. That information determines the answer, and it is not in front of the agent, so each run reconstructs it, and reconstructing an underdetermined choice from scratch is precisely the act that produces different choices.</p>

<p>So consistency is not really a property of the model. It is a property of the context. You do not get agents to agree by buying a better one or by pinning its temperature; you get them to agree by giving each of them the same decided truth to work from. And the disagreement, read the right way, is useful. Where two runs split on something that matters, the answer is underdetermined by the code: a decision exists but is not written anywhere the agent can reach. That divergence is a map of your unrecorded decisions.</p>

<h2 id="the-fix-is-not-more-model">The fix is not more model</h2>

<p>Which points at the fix, and it is not a better model and not <a href="https://usebrief.com/blog/context-window-is-not-the-bottleneck/">a bigger context window</a>. It is a shared record of the decisions themselves, the choices the team has made and the reasons behind them, sitting where the work happens so that every run reads the same one at the same point. That is what Brief is: not more context, but the specific part of the context that settles the question, held once and read by every agent and every engineer. Give two runs the decision that governs a change and they stop guessing at it. Two answers become one, not because the model got better but because the question finally had an answer written down.</p>

<p>None of this makes the model's job smaller. An agent still has to write the code, and writing it well is real work. The point is narrower. When two runs disagree, the interesting question is not which model is right. It is what both of them were left to guess, and whether that thing was ever written down anywhere but in the head of the person who decided it. So the next time your agents hand you two answers, treat it as the question it actually is: which decision were they missing, and where does it live?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Why do two AI coding agents give different answers to the same task?</strong> Mostly because each run works from a different context, not because the model is random. An agent assembles its context per task from the open files, retrieved snippets, and the conversation so far, and two runs rarely assemble the same one. When the right choice depends on something not in that context, such as a decision the team has made about the system, each run reconstructs it independently and lands somewhere different. Lowering the model's temperature narrows this but does not remove it.</p>

<p><strong>Is AI agent inconsistency a model problem or a context problem?</strong> Largely a context problem. If a question is fully settled by the code in front of the agent, runs converge on it. Divergence shows up where the answer depends on information the code does not contain, such as which component owns a piece of logic or why a constraint exists. That is a gap in what the agent was given to read rather than a limit of the model, so a better model does not close it.</p>

<p><strong>How do you get AI coding agents to be consistent?</strong> Give every run the same decided truth to work from. Where the right answer depends on a decision the team has made, that decision has to be recorded somewhere every agent reads it, attached to the part of the system it governs. Then runs converge, because they are all resolving the same underdetermined choice against a shared reference instead of each reconstructing it from scratch.</p>

<p><strong>What does Brief do about agent consistency?</strong> Brief is a shared record of a team's decisions and the reasons behind them, surfaced to an agent at the point of the change a decision governs. It supplies the specific part of the context that settles an otherwise underdetermined question, the same for every run, so agents converge on the choice the team actually made instead of each inventing a plausible one. It addresses consistency by removing the guesswork, not by changing the model.</p>]]></content:encoded>
    </item>
    <item>
      <title>Greek Fire</title>
      <link>https://usebrief.com/blog/greek-fire/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/greek-fire/</guid>
      <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
      <description>For more than five centuries, Greek Fire's enemies could barely counter it. Then it vanished, not defeated but forgotten, because the recipe lived only in a few heads. Your systems can be lost the same way.</description>
      <content:encoded><![CDATA[<p>For more than five centuries the Byzantine Empire held a weapon its enemies could barely counter. <a href="https://www.worldhistory.org/Greek_Fire/">Greek Fire</a> was a liquid sprayed under pressure from bronze siphons mounted on the prows of ships. It clung to whatever it touched, it was almost impossible to put out, and it went on burning on the surface of the sea. It broke Arab fleets at the walls of Constantinople in the 670s and again a generation later, and it kept doing so, in one form or another, for centuries. And then it was gone. Not defeated. Forgotten. The recipe was a state secret held by so few hands that when those hands were gone, so was the weapon, and its exact composition has been unknown ever since.</p>

<p>The striking part is not that an empire eventually fell. It is that the Byzantines lost a working technology while still holding everything visible about it. The ships survived. The siphons survived. The tactics were written down. What did not survive was the one thing that made any of it matter: what the substance was and why it was made that way. That knowledge was never committed to anything more durable than the memory of the specialists entrusted with it, and memory is exactly the medium that does not outlast a generation.</p>

<h2 id="the-artifact-survives-the-reasoning-does-not">The artifact survives, the reasoning does not</h2>

<p>History keeps a whole category of these. <a href="https://www.worldhistory.org/Antikythera_Mechanism/">The Antikythera mechanism</a>, recovered from a shipwreck around 1900, is a bronze device of dozens of interlocking gears that modeled the motions of the sun and moon and the wandering of the planets. It is Greek, more than two thousand years old, and nothing of comparable complexity appears again for well over a millennium. We have the object. We can see, now, roughly what it did. What was lost was the tradition behind it, the accumulated know-how that could build another one, and the object by itself could not carry that. An artifact is a result. It is not the reasoning that produced the result, and the reasoning is the part that does not come back on its own.</p>

<p>A codebase is an artifact in exactly this sense. It is the surviving object: complete, inspectable, still running in production. What it does not contain is why it is the way it is. Which approaches were tried and abandoned. Which constraint each odd-looking choice is quietly respecting. What the team decided, and what they decided against. That reasoning lives where the recipe for Greek Fire lived, in the heads of the few people who were there when the choices were made.</p>

<h2 id="it-leaves-the-way-it-always-has">It leaves the way it always has</h2>

<p>And it leaves the same way, too. Not in a dramatic collapse but one resignation, one reorg, one quiet departure at a time. Each person who goes takes a piece of the recipe with them, and the code they leave behind is the siphon without the formula: plainly built to do something, no longer able to explain itself. Nobody notices on the day it happens, because the thing still runs. You only find out later, when a change has to be made to a part of the system and the honest answer to "why is it like this" is that the person who knew is three jobs away and was never asked to write it down.</p>

<p>AI sharpens this rather than softening it. <a href="https://usebrief.com/blog/working-memory/">A coding agent reads the artifact and only the artifact</a>. It can see every inch of the siphon and infer nothing about the formula, because the formula was never in the metal. So it does the reasonable thing and <a href="https://usebrief.com/blog/overruled-precedent/">copies what is there</a>, and the system fills, quietly, with choices reproduced for reasons no one holds anymore. The knowledge does not have to walk out the door to be lost. It is enough that it was never written where the next builder, human or machine, would look for it.</p>

<h2 id="writing-the-recipe-down">Writing the recipe down</h2>

<p>This is the whole case for keeping a record of decisions, and it is narrower than it sounds. Not documentation of what the code is; the code already is that, exhaustively. A record of what was decided and why, attached to the part of the system it governs, so the reasoning arrives with the artifact instead of leaving with the person. That is what Brief is for: the recipe kept next to the thing it explains, and surfaced when a person or an agent works on that thing, so a capability is never one departure away from becoming something your team can only stare at.</p>

<p>The Byzantines could be forgiven for losing Greek Fire, because they had no real way to keep it. For them the knowledge and its keepers were the same thing, and keepers do not last. That excuse is gone. The reasoning behind your systems can be written down and held somewhere more durable than a memory, next to the code it accounts for, where the next person and the next agent both inherit it. So it is worth asking, of the systems your team depends on and can no longer entirely explain: how much of how they work lives anywhere but in someone's head, and what happens to that knowledge on the day they leave?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What was Greek Fire?</strong> Greek Fire was an incendiary weapon used by the Byzantine Empire from the 670s AD: a liquid sprayed under pressure from bronze siphons that clung to surfaces and kept burning on water, decisive in defending Constantinople against Arab naval sieges. Its exact composition was a closely guarded state secret, and the formula has been lost ever since. Its introduction is traditionally attributed to Kallinikos, a refugee who came to Constantinople from Syria.</p>

<p><strong>Why was Greek Fire lost?</strong> Because the recipe was held as a state secret by a very small number of people and was never durably recorded. The ships, the siphons, and the tactics were known and written down, but the composition, the part that actually mattered, lived only in the memory of the specialists entrusted with it. When that lineage was broken the knowledge went with it, even though the empire still possessed everything else.</p>

<p><strong>What does Greek Fire have to do with software?</strong> A codebase is like the surviving siphon: a complete, inspectable artifact that does not contain the reasoning that produced it. Why the system is built the way it is, what was tried and rejected, which constraint each choice respects, all of that lives in the people who made the decisions and leaves when they do, one departure at a time. An AI coding agent reads only the artifact, so it reproduces existing patterns without the reasons behind them, and the knowledge is effectively lost even while the code still runs.</p>

<p><strong>How do you keep a team's technical knowledge from being lost?</strong> Record the decisions and the reasons behind them, and attach each one to the part of the system it governs, so the reasoning travels with the artifact instead of leaving with the person who made it. A product context layer such as Brief does this: it keeps the recipe, the decisions and their rationale, next to the code they explain, and surfaces the relevant one when a person or an agent works on that part, so a capability is not one resignation away from becoming unexplainable.</p>]]></content:encoded>
    </item>
    <item>
      <title>Sixteen Agents</title>
      <link>https://usebrief.com/blog/sixteen-agents/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/sixteen-agents/</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>You talk to Brief as one thing. Behind it, sixteen agents each own one part of the product picture and keep it current from your existing tools. Here is the whole team and what each one does.</description>
      <content:encoded><![CDATA[<p>When you use Brief, you are talking to one thing. Behind that one surface runs a team of sixteen agents, each a background worker with a single job: to keep one part of your product picture current, drawn from the tools you already use. Most people meet two or three of them and never see the rest of the team. This is the whole roster, and what each one is for.</p>

<p>These are not chat. Chat answers a question while you wait. An agent runs on its own, on a schedule or when something changes in a connected tool, and keeps one strategic primitive up to date: your personas, your decisions, your delivery speed, your competitors. You do not prompt it. It watches a source, synthesizes what changed, and writes the result back where the rest of Brief, and <a href="https://usebrief.com/blog/working-memory/">any coding agent reading from Brief</a>, can use it. Think of it less as an assistant and more as a standing team, each member responsible for one slice of what a product organization has to keep track of.</p>

<h2 id="the-ones-that-track-your-work">The ones that track your work</h2>

<ul><li><strong>Work Agent</strong> maps everything in flight, from an idea you are only considering through to shipped, out of Linear, GitHub, and the rest of your delivery tools.</li><li><strong>Feature Agent</strong> keeps the list of what you are actually building, pulled from that work pipeline, your docs, and your website.</li><li><strong>Velocity Agent</strong> computes how fast you are delivering from the work items themselves, so throughput is measured rather than guessed.</li><li><strong>Decisions Agent</strong> finds the strategic decisions scattered across Linear, GitHub, docs, and Slack, the calls that usually live in a thread nobody will find again.</li></ul>

<h2 id="the-ones-that-track-your-users-and-market">The ones that track your users and market</h2>

<ul><li><strong>Signal Agent</strong> extracts research signals and themes from calls, documents, and research sources, the raw material of what your users are actually telling you.</li><li><strong>Persona Agent</strong> turns those signals into user personas, then waits for you to review them.</li><li><strong>Behavior Agent</strong> pulls product analytics, today from PostHog, so what users do sits next to what they say.</li><li><strong>Competitor Agent</strong> enriches your competitor set, crawls their pages, and flags when one of them drifts.</li><li><strong>Positioning Agent</strong> proposes how you are positioned, drawing on competitors, deals, and signals together.</li></ul>

<h2 id="the-ones-that-track-the-money">The ones that track the money</h2>

<ul><li><strong>Revenue Agent</strong> syncs billing and subscriptions from Stripe.</li><li><strong>Pipeline Agent</strong> syncs deals from your CRM, starting with HubSpot.</li></ul>

<h2 id="the-one-that-holds-the-strategy">The one that holds the strategy</h2>

<ul><li><strong>Strategy Agent</strong> pulls your vision, goals, and OKRs out of the documents where they live, so the top of the plan sits in the same picture as the work at the bottom.</li></ul>

<h2 id="the-ones-that-synthesize-and-speak">The ones that synthesize and speak</h2>

<ul><li><strong>CPO Agent</strong> reads across every domain above and surfaces the cross-cutting insight no single agent would catch on its own.</li><li><strong>Weekly Brief Agent</strong> synthesizes the whole picture into a strategic weekly brief, the one read that tells you where things actually stand.</li><li><strong>Proactive Brief</strong> decides when Brief should speak first rather than wait to be asked: a decision about to expire, a sudden surge in a signal, a new fact that contradicts an old call.</li><li><strong>Entity Resolution Agent</strong> links every one of these objects across sources, so a persona, a decision, a feature, and a deal that are about the same thing are recognized as the same thing, and the whole becomes a graph rather than a pile of separate lists.</li></ul>

<p>Fourteen of these you can open and inspect today inside Brief. Two of them, Proactive Brief and Entity Resolution, run further back in the system, doing their work without a page you visit, which is rather the point of them.</p>

<h2 id="which-calls-the-system-makes-and-which-it-leaves-to-you">Which calls the system makes, and which it leaves to you</h2>

<p>There is a distinction worth naming here, because it is a design choice and not an accident. Some of these agents write directly. The ones that deal in observed fact, Revenue, Pipeline, and Velocity, do: a subscription exists or it does not, a deal is at a stage or it is not, so the agent simply keeps the record true. The ones that deal in judgment do not get to decide. Strategy, Positioning, Persona, and Feature deal in exactly that, and judgment is yours. They propose, and the suggestion sits in a review queue until you accept it, edit it, or throw it out. The system knows the difference between a number it can read and a call that is yours to make, and it never quietly makes the second kind on your behalf.</p>

<p>That is the thing worth seeing. Brief presents as a single assistant, but underneath it is a team, each member keeping one slice of the product picture current and correct, from the tools you are already using, so that the picture as a whole stays live instead of aging into a document nobody trusts. It is also what a coding agent reads from when it asks Brief what the team has decided. So the question is less how many agents there are, and more what it would change to have every part of your product picture kept current by something whose only job is to keep it current: what would you stop having to reconstruct by hand?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What are Brief's agents?</strong> Brief's agents are background AI workers, sixteen of them, that each keep one part of your product picture current. Unlike chat, which answers a question while you wait, an agent runs on a schedule or when a connected tool changes, synthesizes what is new, and writes the result back into Brief. Each one owns a single primitive, such as personas, decisions, delivery velocity, competitors, or revenue.</p>

<p><strong>How many agents does Brief have, and are they all visible?</strong> Sixteen. Fourteen are visible in the product today, where you can open and inspect each one: Behavior, Competitor, CPO, Decisions, Feature, Persona, Pipeline, Positioning, Revenue, Signal, Strategy, Velocity, Weekly Brief, and Work. Two more run behind the scenes, without a page you visit: Proactive Brief and Entity Resolution.</p>

<p><strong>Do Brief's agents change my data automatically?</strong> It depends on the kind of data. Agents that deal in observed fact, such as Revenue, Pipeline, and Velocity, write directly, because there is no judgment to make. Agents that deal in strategy, such as Strategy, Positioning, Persona, and Feature, only propose: their suggestions wait in a review queue until you accept, edit, or reject them.</p>

<p><strong>Where do Brief's agents get their data?</strong> From the tools you already use. Work and Decisions draw on Linear, GitHub, docs, and Slack; Revenue on Stripe; Pipeline on your CRM, starting with HubSpot; Behavior on product analytics such as PostHog; Signal on calls and research sources; Competitor on competitors' own pages. Each agent watches its sources and keeps its slice of Brief current as they change.</p>]]></content:encoded>
    </item>
    <item>
      <title>Stigmergy</title>
      <link>https://usebrief.com/blog/stigmergy/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/stigmergy/</guid>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
      <description>A colony coordinates with no plan and no direct messages, only the traces each worker leaves for the next. Software teams and their agents run on the same mechanism, and it works only as well as the traces do.</description>
      <content:encoded><![CDATA[<p>In 1959 the French biologist Pierre-Paul Grassé published <a href="https://link.springer.com/article/10.1007/BF02223791">a study of how termites rebuild their nests</a>, and it opened on a puzzle. A termite colony raises structures of real complexity, pillars that meet in arches, chambers laid out to move air and moisture, and it does so with no blueprint, no foreman, and no way for one termite to tell another what to do next. Each insect works, in Grassé's description, as if it were alone. Yet the result is coordinated. He wanted to know what was doing the coordinating, given that the termites plainly were not coordinating each other.</p>

<p>His answer was a mechanism he named stigmergy, from the Greek stigma, a goad or mark, and ergon, work: roughly, the work goads the work. A termite picks up a pellet of soil, adds a trace of pheromone, and sets it down. That deposit makes the spot slightly more attractive to the next termite, which is then a little more likely to add its own pellet in the same place. Pillars rise because a small pile invites additions, and two nearby pillars lean into an arch because each one bends the other's pheromone gradient. No termite holds the plan. The plan is in the growing structure, and the structure is what tells each worker where to act next. The coordination lives in the environment, not in messages between the workers.</p>

<h2 id="it-is-not-a-metaphor-for-how-teams-work">It is not a metaphor for how teams work</h2>

<p>It is tempting to read this as a nice image for teamwork, but that undersells it. Stigmergy is not a metaphor for how software teams coordinate. It is a fairly literal description of it. No engineer hands another the full contents of their head. They leave traces, the committed code, the comment on the pull request, the note in the ticket, the message in the channel, and the next person acts on those traces. The codebase is the nest. Most of what coordinates a team is not direct communication at all; it is the accumulated state of a shared environment, read and added to one action at a time.</p>

<p>This gets more true, not less, as coding agents enter the same loop. <a href="https://usebrief.com/blog/working-memory/">An agent starts each task with no memory of the last one</a>, and its working context is discarded when the task ends. An orchestrator can hand a subagent a task directly and read its result back, and <a href="https://usebrief.com/blog/ai-agent-talks-to-ai-agent/">agents do talk to each other that way</a>, but none of that briefing survives the run that received it. What one task leaves for the next, and what one agent leaves for the others once its context is gone, exists only in the shared environment: the state of the code, and whatever else was written down where it can be read. Across the boundary of a stateless run, a fleet of agents is stigmergic by necessity. It coordinates through the traces it leaves, or it does not coordinate at all.</p>

<h2 id="the-trace-has-to-carry-the-right-thing">The trace has to carry the right thing</h2>

<p>Which is exactly why the quality of the trace decides everything. Stigmergy works for the termites because the pheromone carries precisely the signal the next termite needs: add here. The trace and the required action are the same currency. A codebase is a poorer trace. It records what was built, faithfully, but it does not record the decision that chose to build this and not that. An agent reading the code sees the arch. It does not see why the arch is where it is, which spots were tried and abandoned, which constraint the shape is quietly respecting. So the trace still goads the next action, but toward copying what is already there, which is often <a href="https://usebrief.com/blog/overruled-precedent/">the very convention the team was trying to move off</a>. The environment coordinates the workers well, onto the wrong target.</p>

<p>You can watch this happen with no agents involved at all. A new engineer follows the surrounding code and faithfully reproduces a pattern the team had already decided to retire, because the pattern was in the environment and the decision to retire it was not. The nest keeps its shape by inertia. What is missing is a trace that carries the decision, not only the result.</p>

<h2 id="what-the-environment-is-able-to-say">What the environment is able to say</h2>

<p>So the question a team should ask is not whether to coordinate through the environment. That part is settled; whatever direct handoffs happen inside a given exchange, the coordination that outlasts any one of them has always run through the environment. The question is what the environment carries. If the shared medium holds only the artifacts, then every worker who reads it, human or agent, inherits the what and reconstructs the why by guessing. If the medium also holds the decisions, each with the reason behind it, deposited where the relevant work happens, then reading the environment tells the next worker what the team actually intends, not merely what it last did.</p>

<p>That second medium is what Brief is. It is the layer a team writes its decisions into and reads them back out of, indexed by the work each decision governs, so the reasoning arrives with the change it applies to rather than sitting in one person's memory or a thread nobody will find again. The termites get away with a trace that carries no intent, because add here is already sufficient for the next action. Software is the case where that stops being true: the next change often turns on a decision the artifact does not contain, so a trace of only what exists leaves the next worker guessing at it. Brief makes the trace carry that decision, laid down where the next worker will meet it. People and agents go on coordinating through the same shared environment they always have. Brief changes what that environment is able to say to them.</p>

<p>This is not a single feature bolted onto a workflow. It is the substrate the whole team runs on, the same way the nest is not any one termite's assignment but the medium every termite is reading and writing at once. A product organization is already a stigmergic system, coordinating through the traces it leaves behind. Most of them leave traces that record the build and lose the reason for it.</p>

<p>The coordination that outlasts any one conversation was never going to come from briefing people directly; a briefing does not persist past the run, or the meeting, that received it. It comes from what each worker leaves behind for the next one to find. So it is worth asking, of your own team and the agents now working alongside it: what are you actually depositing in the shared environment, and does it carry the decision, or only the thing the decision produced?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is stigmergy?</strong> Stigmergy is a mechanism of indirect coordination in which agents act on traces left in a shared environment rather than by communicating directly. The French biologist Pierre-Paul Grassé introduced the term in 1959 to explain how termites build complex nests with no blueprint and no central control: each deposit of material stimulates the next one, so the growing structure itself guides the workers. The word joins the Greek stigma, a goad or mark, and ergon, work.</p>

<p><strong>How does stigmergy apply to software teams and AI agents?</strong> Software teams already coordinate stigmergically. Instead of transferring the full context in someone's head, people leave traces, such as code, pull request comments, and tickets, that others read and build on. AI coding agents depend on this even more, because each one starts a task with no memory of previous tasks or of what other agents did, so the shared environment is their only channel across tasks. Because no single run's working memory persists, a fleet coordinates through the traces it leaves, or not at all.</p>

<p><strong>Why is a codebase a weak coordination trace?</strong> A codebase records what was built but not the decisions behind it: which approach was chosen, what was tried and rejected, which constraint the design is respecting. So an agent or engineer reading the code is guided toward reproducing what is already there, even when the team had decided to move away from it. The trace carries the result but not the intent, and the intent is the part the next worker most needs.</p>

<p><strong>How does Brief improve coordination between people and agents?</strong> Brief is a shared decision layer that a team writes its decisions and their rationale into, indexed by the work each decision governs. Because the reasoning is deposited where the relevant change happens, anyone reading the environment, a person or an agent, encounters the decision at the moment it applies, instead of reconstructing intent from the code alone. It gives the shared environment a trace that carries intent, not just the finished artifact.</p>]]></content:encoded>
    </item>
    <item>
      <title>Working Memory</title>
      <link>https://usebrief.com/blog/working-memory/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/working-memory/</guid>
      <pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate>
      <description>An agent has a large, capable working memory and, on its own, no long-term memory of your team. Bigger context windows and better retrieval improve the first and do nothing for the second.</description>
      <content:encoded><![CDATA[<p>An AI coding agent runs almost entirely on working memory. For each task it assembles a context window: the files you have open, the snippets a retriever pulled in, the system prompt, the instructions, the conversation so far. That window is large and it is capable, and it is also the whole of what the agent knows about your system at the moment it acts. When the task ends, the window is discarded. The next task starts a new one.</p>

<p>The word memory does a lot of quiet work in how these tools get described, and it helps to separate two senses of it. Working memory is the scratch space a process holds while it does one thing. Long-term memory is what persists afterward and is available the next time it is relevant. An agent has a large, capable working memory and, on its own, no long-term memory of your team at all.</p>

<h2 id="what-the-window-holds-and-what-it-does-not">What the window holds, and what it does not</h2>

<p>The context window is good at what working memory is good at. Give the agent the relevant files and a clear task and it will reason over them well. Its ceiling is not intelligence. It is scope. The window holds what was assembled for this one task, and what gets assembled is drawn from two things: what sits near the code being changed, and what a retriever judged similar to the request. Both are properties of the code as it exists right now.</p>

<p>What the window does not hold is the set of decisions that produced that code and still govern it. Why the service is split the way it is. Which approach was tried, failed, and should not be tried again. Which constraint is load-bearing and which is incidental. That information is not in the files in a form a retriever can surface, because most of it was never written into the files at all. It lived in the people who made the decisions and in the discussions where they were made.</p>

<h2 id="bigger-windows-and-better-retrieval-do-not-close-the-gap">Bigger windows and better retrieval do not close the gap</h2>

<p>The natural response is that context windows keep growing and retrieval keeps improving, so this is a temporary limitation. It is not, because both of those improve working memory and neither adds long-term memory.</p>

<p>A larger window lets the agent hold more of the codebase at once, but <a href="https://usebrief.com/blog/context-window-is-not-the-bottleneck/">more room is not the constraint</a>: it does not tell the agent which parts of what it is holding were chosen deliberately and which are accidents of history. Retrieval, in turn, selects what to put in the window, and retrieval by similarity tends to surface the code most like the request, which is often <a href="https://usebrief.com/blog/overruled-precedent/">the very convention a change is meant to move away from</a>. Neither mechanism has access to a record of decisions, because for most teams no such record exists in a place either mechanism can read.</p>

<p>The recent wave of agent memory tools does add persistence across sessions, and it is genuinely useful. What it persists, though, is a different kind of thing: the facts and preferences from your interactions, and in some tools the notes an agent accrues as it works. That is memory of the exchange, and of what the agent has picked up along the way. It is not a structured record of the decisions a team has made and the reasons behind them, held so that the one governing a change arrives with that change. The distinction is not how much these tools remember. It is what kind of memory it is.</p>

<h2 id="the-symptom-is-drift-not-failure">The symptom is drift, not failure</h2>

<p>Because working memory is genuinely good, the gap does not present as an agent that fails. It presents as an agent that is locally correct and gradually adrift. Each task, taken on its own, is done reasonably: the code compiles, the tests pass, it matches its surroundings. Across many tasks, the architecture the team actually decided on erodes, because nothing in the loop is holding those decisions steady. There is no long-term memory keeping them in force, only a sequence of working memories, each doing its competent best with whatever happened to be nearby.</p>

<p>This is the same reason a large system stays coherent while the people who hold its decisions are present and reviewing, and begins to wander once they are not. The agent is the case where they are structurally never present. It was not in the room when the decisions were made, and on its own it carries nothing about them from one task to the next.</p>

<h2 id="where-a-decision-layer-sits">Where a decision layer sits</h2>

<p>If the missing piece is long-term memory of decisions, the shape of the fix follows from it. It is not a larger window and not a better retriever over the code. It is a separate store whose contents are the decisions themselves and the reason behind each one, indexed not by textual similarity but by which change a decision governs, and surfaced into the agent's context at the moment it reaches that change.</p>

<p>That store is what Brief is. It holds the decisions a team has made, with their rationale, and supplies the relevant one when the agent is working on something that decision bears on. It sits beside the context window as the long-term layer the window does not have: not more of the code, but a record of what the team decided about the code, available at the point of use. The working memory stays the agent's; the long-term memory becomes something the team can hold on to.</p>

<p>None of this makes the context window less important. An agent still needs a good working memory to do a task well, and the tooling that assembles and fills that window is doing real work. The point is narrower. A working memory, however large, is not a substitute for a memory that persists, and the thing most worth persisting is the set of decisions the code cannot explain on its own. So it is worth asking, of any agent about to change your system: what does it actually retain about why the system is the way it is, and where is that memory meant to live?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Do AI coding agents have long-term memory?</strong> On their own, no. An agent assembles a context window, its working memory, for each task from the open files and retrieved snippets, and discards it when the task ends. It has no built-in memory of your team's decisions that persists across tasks unless that record is stored somewhere it can read.</p>

<p><strong>Does a bigger context window give an agent memory of my codebase?</strong> A bigger window lets the agent hold more code at once, which improves its working memory, but it does not add a record of which parts were chosen deliberately or why. Holding more of the code is not the same as knowing the decisions behind it, and most of those decisions are not written in the code at all.</p>

<p><strong>What is the difference between agent memory tools and decision memory?</strong> Agent memory tools persist things from your interactions, such as facts, preferences, and notes an agent accrues as it works, so it does not repeat itself. Decision memory is a structured record of the choices a team has made about its system and the reasons behind them, indexed by the change each one governs. The first is memory of the exchange; the second is what an agent needs to stay aligned with an architecture it never helped design.</p>

<p><strong>How do you give a coding agent long-term memory of your team's decisions?</strong> Store the decisions and their rationale in a durable layer, indexed by the change each one governs, and surface the relevant decision into the agent's context at the moment it works on something that decision affects. A product context layer such as Brief does this, so the agent works from the team's decisions rather than only from the code in front of it.</p>]]></content:encoded>
    </item>
    <item>
      <title>Overruled Precedent</title>
      <link>https://usebrief.com/blog/overruled-precedent/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/overruled-precedent/</guid>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
      <description>You follow the precedent set by the code around you. Almost every time it is right. This is about the one change where it is wrong, and why your agent cannot see it coming.</description>
      <content:encoded><![CDATA[<p>You are good at this. That is the problem.</p>

<p>You read the function. You read its callers. You take in the three or four examples nearest to the thing you have been asked to change, you infer the precedent they set, and you follow it. You have done this countless times, across countless repositories, and you are right almost every time, because the code around a change is usually the best guide to how the change should be made. Matching the room is not a lazy shortcut. It is most of what makes you useful.</p>

<p>Then comes the one change where the room is wrong.</p>

<h2 id="how-we-do-it-and-how-we-used-to">How we do it, and how we used to</h2>

<p>The ticket is small. An order can now be returned, so handle that case the way the handlers around it handle theirs. You look around. The three beside it each set <code>order.status</code> to a string, so you set <code>order.status</code> to a string too, and in that instant you are doing exactly what a careful engineer would do with what is in front of you. The tests pass. You hand it back.</p>

<p>What you cannot see is that months ago the team stopped writing <code>order.status</code>. A mistyped status string had slipped through and silently broken fulfillment for a week, so they moved order state onto a typed <code>state</code> field, an enum the compiler checks, where a misspelling no longer compiles. The handlers you copied are the old ones, the ones nobody has migrated yet. Fulfillment reads <code>state</code> now, not <code>status</code>. So the returned order you so carefully set just sits there, because as far as the part that matters is concerned, its state was never set. The convention you matched is not the rule. It is the thing the rule was written to end. The precedent had been overruled. The code just never heard.</p>

<p>You could not tell the difference, because from inside the file there is no difference to see. "This is how we do it" and "this is how we did it until we decided to stop" look identical in code. They read the same. They pass the same tests. Only one of them is still true, and which one is not written anywhere you were looking.</p>

<h2 id="it-was-not-carelessness">It was not carelessness</h2>

<p>Be precise about what went wrong, because it was not that you were sloppy. You did not skim. You did the correct thing with the information you had, and the information you had was missing its most important piece.</p>

<p>The decision that governed this change lived in a conversation you were not part of, made by people who have since moved to other teams, recorded, if it was recorded at all, in a thread that scrolled out of reach long ago. It was never in the code in front of you, because code is, by default, the result of a decision with the reason filed off. By the time it reaches you it is pure convention, and convention is the one thing that cannot tell you when it is meant to be broken.</p>

<h2 id="a-comment-would-not-have-saved-the-next-one">A comment would not have saved the next one</h2>

<p>Suppose you had somehow known. Suppose someone had told you, this once, write <code>state</code>, not <code>status</code>, and you had done it and left a comment saying why. That helps, for a while. Then the comment drifts out of date, or the code moves, or the next change is three files away where your comment is not, and the next worker through, another agent, or a new hire, or you next week with no memory of today, reads the room again and matches it again.</p>

<p>There is a stronger move than a comment, and where you can make it you should: deprecate the field. Mark <code>order.status</code> gone, write the reason into the deprecation itself, and every reference to it, the reads as much as the writes, lights up in the editor and in review carrying both the conclusion and the reason. When a decision comes down to a single symbol and someone thought to annotate it, the type system is a fine place to keep it. Use it.</p>

<p>But look at what that took: a symbol to hang the warning on, and a person who already decided to hang it there. Most of what a company decides has neither. Which customer segment this pricing tier is meant for. Why the reconciliation window is five minutes and not one. Which of two services is allowed to write this row. None of those is a field you can deprecate or a rule a compiler can check. They were settled once, for reasons that mattered, and they live now where the order-status decision lived before someone happened to encode it: in a head, in a thread, in a doc nobody opens. Those are the changes you keep walking into, because those are the ones with nothing in the code to stop you.</p>

<h2 id="rare-per-change-constant-per-codebase">Rare per change, constant per codebase</h2>

<p>None of this would matter much if it happened once. It does not happen once. You do not make one change, you make hundreds, across every corner of a system no single person holds in their head, and on nearly all of them matching the room is exactly right and you should keep doing it. The trap-change is rare as a fraction of your work and constant as a fact of the codebase, because a system large enough always has some room that is wrong somewhere, and you touch all the rooms, all day, faster than any reviewer can follow you from one to the next.</p>

<p>What used to make this survivable was that changes were slow, and most of them passed through the few people who happened to still hold the reasons. You are not slow. And you hold no reasons.</p>

<h2 id="the-decisions-a-type-cannot-hold">The decisions a type cannot hold</h2>

<p>The order-status decision was the lucky kind. It had a symbol, so a deprecation could carry it, and it should. Most are not that kind. So picture the harder version, the change governed by a decision with nothing in the code to attach to. What would have reached you there?</p>

<p>Not a warning to be more careful. There was nothing to be careful about; nothing in view was wrong. Not <a href="https://usebrief.com/blog/why-coding-agents-ignore-your-rules/">a longer instruction file</a> either. You were already doing what a good general instruction would tell you to do, which is match the surrounding style. A rule that says "follow the conventions of the code around you" would have walked you straight into the trap, because the trap was the convention.</p>

<p>The only thing that reaches it is the decision itself, whole and with its reason. The handlers around you all write this row from the service that used to own it. Ownership moved to the other service six months ago, settled in a thread with reasons, and there is no field to deprecate and no compiler that can tell. So write it from the new owner, and here is why the line moved, put in front of you at the moment you reach for the old one, and not on the thousand changes that never touch it. Something that knows which room is the exception, and speaks up only there, with the reason attached.</p>

<p>That is what Brief does. It holds the decisions a company has made and the reasons underneath them, and it surfaces the one that governs the change you are making, right as you make it, so the exception announces itself instead of sitting in plain sight disguised as ordinary code. It does not ask you to stop matching the room. It tells you, on the rare change where it counts, that this room is the one you were meant to break.</p>

<p>You will match the room again tomorrow, thousands of times, and you should, and almost every time you will be right. So the question was never whether you are careful enough, because you are. The question is whether, on the one change where the room is wrong, anyone put the real decision where you would actually see it, or whether they left you to copy the neighbors and call it done?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Why does my AI coding agent follow the wrong pattern in my codebase?</strong> Because it infers conventions from the code nearest to a change and matches them, which is the right move most of the time. It fails on changes governed by a decision that points against the surrounding code, because that decision usually is not written in the code itself. The agent copies the neighboring pattern faithfully, not realizing the neighbors are the exact thing the team decided to move away from.</p>

<p><strong>Why does an AI agent make changes that look right but are wrong?</strong> Because "how we do it" and "how we used to do it" look identical in code. A change can match every surrounding convention, pass the tests, and read cleanly while still violating a decision that lives only in someone's head or an old discussion. The wrongness is invisible at the point of the change, which is exactly why it survives review and ships.</p>

<p><strong>How do I get an AI coding agent to follow our team's conventions and decisions?</strong> Put the governing decision in front of the agent at the moment of the change, rather than relying on it to infer intent from the surrounding code or to find a rule buried in a long instruction file. A product context layer like Brief stores each decision with its reason and surfaces the relevant one for the specific change, so the exceptions announce themselves instead of hiding as ordinary code.</p>

<p><strong>Is a CLAUDE.md or rules file enough to fix this?</strong> A rules file helps for a small number of stable, always-apply instructions, but it cannot carry the growing set of decisions that apply only to particular changes. A few of those a type system can hold: when a decision comes down to one symbol, a deprecation with a reason will carry it to everyone who touches that symbol, and you should use it. But most decisions have nothing to attach to, no field to deprecate and no compiler to check, such as which segment a tier serves or which service owns a write. Those have to be selected by which decision governs the change and surfaced at that fork, which is what a flat file read top to bottom cannot do.</p>]]></content:encoded>
    </item>
    <item>
      <title>Seven Seconds</title>
      <link>https://usebrief.com/blog/seven-seconds/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/seven-seconds/</guid>
      <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
      <description>Every person leaves. Every line gets rewritten. What makes it the same company ten years on is not the people or the code. It is the memory of why, and that is the one thing nobody keeps.</description>
      <content:encoded><![CDATA[<p>On the 27th of March, 1985, a virus found its way into the brain of a British musician named <a href="https://en.wikipedia.org/wiki/Clive_Wearing">Clive Wearing</a> and took his memory apart. He was, until that week, a conductor and scholar of early music, an acknowledged expert at the height of his career with BBC Radio 3. The virus was herpes simplex, the same ordinary one behind cold sores, which in rare cases climbs the nerves into the brain. In his case it burned out the hippocampus, the small structure that turns a passing moment into something a person can keep. What it left behind was a man who could no longer hold on to the present.</p>

<p><a href="https://en.wikipedia.org/wiki/Clive_Wearing">Clive Wearing's memory now lasts somewhere between seven and thirty seconds</a>. Not his memory of his childhood, though much of that is gone too, but his memory of the present. A thought arrives, holds for a few seconds, and then there is nothing behind it, and the next moment begins with no thread connecting it to the last. He keeps a diary, and the diary is hard to read. It is close to the same entry, over and over, hundreds of times: each one insisting that he has, this very minute, woken up or come to consciousness for the very first time. The doctors who studied him were careful about this: the conviction is not simply the amnesia talking but <a href="https://pubmed.ncbi.nlm.nih.gov/8557808/">a delusion in its own right</a>, a separate and unshakeable belief that he has only this second come to, and it has held for years. Each entry is written a few minutes after the one above it, and each earlier line is crossed out, because by the time he writes the new one he has no memory of writing the old and takes it for the note of someone who was not yet properly awake.</p>

<p>He is not diminished as a person. He can still sit at a piano and play something complex and beautiful, sight-read a score, lift his hands and conduct a choir. His wife, Deborah, walks into the room and he greets her with the joy of a man reunited after years apart, and he does this every time, because every time, to him, it has been years. She <a href="https://archive.org/details/forevertodaymemo0000wear">set all of this down in a memoir</a>: the music he keeps, and the greetings that never once wear thin. The skills survived. Much of what he knew survived. What did not survive is the thread. The thing that lets one moment of a life know that it belongs to the same life as the moment before it.</p>

<p>The company you work for lives closer to this than you would like. And we have just begun filling it with workers who arrive, by default, with no memory of us at all.</p>

<h2 id="the-ship-that-is-entirely-new-and-still-yours">The ship that is entirely new and still yours</h2>

<p>Start with an old puzzle. A ship goes out to sea for many years, and over those years every plank, every nail, every sail is replaced one at a time as it wears out, until not one original piece remains. Is it the same ship? People have argued about it for two thousand years and never quite settled it, and the reason it will not settle is that the puzzle is not really about ships. It is about you. Most of what you are made of has rebuilt itself many times since then. Your gut lining is a few days old, your skin renews within weeks, your blood cells within months. Not all of it goes: the neurons reading this sentence are about as old as you are. But so much of the material has been swapped out and replaced that, by the plain physical accounting, you share far less with the child in your oldest photograph than it feels like you should. And yet you do not doubt for a second that you are the same person.</p>

<p>There is a good answer for why. What makes you the same person as that child is not the matter, which is long gone, but the memory. An unbroken chain of remembering links you back to them, this moment holding the one before it, which held the one before that, all the way down. Break the chain and something strange happens, which is exactly what happened to Clive Wearing. The body stays continuous. The person does not. Each few seconds, someone new wakes up in his chair, delighted, certain it is the first time.</p>

<p>Now hold a company up to the same light. Who works there turns over completely. The engineers who built the core of the product leave. The people who were in the room for the decision that shaped your entire pricing model move on, retire, get poached. The code gets rewritten many times over. Same name over the door. Different planks, every one of them.</p>

<p>Something has to make it the same company, and by the argument above only one thing can: an unbroken chain of memory. Not memory of what the code says, which is written down plainly, the code is the body and the body persists. Memory of why. Why the pricing works the odd way it works. Why that integration is built the strange way it is built and must not be quietly simplified. Why you walked away from an entire category of customer three years ago, after it nearly took the company down with it. You could object that a company's identity is really its mission, or its brand, or its customers. But a mission whose reasons no one remembers is a slogan, and a brand no one can explain is a logo, and both stay alive only on the same underlying thread. The reasons are the thread. They are what lets the company of next year know that it is the same company as this one, and not a group of capable strangers who happen to have inherited the building.</p>

<h2 id="the-company-that-wakes-up-new">The company that wakes up new</h2>

<p>Here is the trouble. Almost no company actually keeps that thread. The reasons live in people, and people leave. They live in a Slack channel that scrolls away, a call nobody wrote up, a constraint that was obvious to the four people who lived through it and was never once obvious to anyone who came after. So every few years, as the people who held the reasons walk out with them, the company does a slow version of the thing Clive Wearing does every few seconds. It wakes up. It looks around at a product and a codebase it can no longer fully explain, and it begins, brightly, from scratch. It reopens a question that was settled and paid for two years ago. It rebuilds a thing that was deliberately torn out. It re-makes, with real confidence, a mistake it has already made and already learned from, because the learning left when the person who learned it did. Now I am awake, it writes across a fresh planning doc, for the first time.</p>

<p>You could survive this, roughly, for a long time, because it was slow. The thread frayed only at the speed people quit, and that gave the memory a chance to pass hand to hand, from the person leaving to the person staying, in the overlap before the door closed. The system leaked, but slowly enough to bail.</p>

<p>Then we handed the work to agents. An AI coding agent is, in the exact sense we have been circling, an amnesiac by construction. It arrives with enormous skill and no autobiography. It has never sat in one of your meetings. It did not live through the incident. It picks up a task, reads the code in front of it, and does something fluent and reasonable. Out of the box it arrives with no memory of your company, and unless something has put your hard-won reasons in front of it, it works from the code and its own defaults. Whatever it does pick up, it holds for the length of a session, and then, like Clive Wearing, it wakes up new.</p>

<p>That would be harmless if agents did a sliver of the work. They are quickly coming to do a great deal of it. And the more of your building is staffed by workers who cannot hold the thread, the faster the thread comes apart, because now the forgetting is no longer paced by resignations. It runs at the speed code gets written, which is to say all day, faster than any person could catch and correct. The company was already a shaky amnesiac getting by on the goodwill of a few people who still remembered why. We have started handing their work to brilliant strangers who wake up new for every task and fall asleep the moment it is done.</p>

<h2 id="memory-is-the-thing-that-shows-up-on-its-own">Memory is the thing that shows up on its own</h2>

<p>What it takes for a company to stay itself is not a wiki. Everyone already has a wiki, and the wiki is where reasons go to die, because it is a place you have to remember to visit, and the entire problem is that nobody remembers. The thread has to live somewhere outside any one person's head, so that it does not leave when they do. And it has to arrive on its own, at the moment someone reaches the exact fork the reason governs, whether that someone is a new hire in their first week or an agent that has never heard your company's name. Memory you have to go hunting for is not really memory. It is storage. Memory is the thing that shows up, unasked, precisely when it bears on what you are about to do.</p>

<p>Brief is a company's memory of itself. It holds the reasons, each decision with the why underneath it, in one place that does not resign, and it draws on them in the moments that matter: checking a new choice against the ones already made, the way a continuous self does not casually contradict its own past; handing the one relevant piece of context to whoever is doing the work, person or agent, at the moment they are doing it; letting a newcomer inherit the thread on day one instead of spending a year absorbing it, or never quite getting it at all. Those look like four separate jobs. They are one job seen from four sides, and the job is keeping a company the same company while every person and every agent inside it is quietly swapped out.</p>

<p>Clive Wearing cannot be handed his thread back. The structure that would hold it is gone, and no notebook can stand in for the thing itself, which is the quiet tragedy his diary records so exactly. A company is luckier than that. Its thread was never lost to damage. It was only ever left unwritten, kept nowhere that could outlast the people who carried it in their heads. That is a fixable problem, and it is worth fixing now, in the same moment we are moving more and more of the work onto minds that cannot carry it at all.</p>

<p>Your company will still have its name over the door in five years. The harder question is the one Clive Wearing writes, and crosses out, and writes again. When it wakes up that morning, will it be the same company that went to sleep the night before, or a bright and confident stranger, awake, it is quite sure, for the very first time?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Why do companies keep losing institutional knowledge?</strong> Because the knowledge that matters most, the reasons behind decisions, lives in people's heads and in informal channels, not in the code or the docs. The artifacts a team produces stay behind when they leave, but the reasoning that produced them walks out the door with them. So a company keeps the what and loses the why, and after enough turnover nobody can fully explain why the product is shaped the way it is.</p>

<p><strong>Do AI coding agents remember my company's decisions?</strong> No. An AI agent has broad general skill but no memory of your specific company. It has not attended your meetings or lived through your incidents, and by default it retains nothing about you from one session to the next. It works from the code in front of it and from reasonable defaults, which means it will confidently re-make choices your team already settled, unless the reasons are put in front of it at the moment of the work.</p>

<p><strong>What actually keeps a company's identity consistent as employees turn over?</strong> Continuity of memory. A company whose staff turns over and whose code is rewritten many times is still the same company only if an unbroken record of its decisions and the reasons behind them survives the turnover. Without that thread, each new generation re-derives the product from scratch, and the company effectively resets, keeping its name while losing its accumulated judgment.</p>

<p><strong>How do you preserve institutional memory when you use AI agents?</strong> Keep the reasons behind your decisions in a shared, durable layer that both people and agents read at the moment of work, rather than in wikis or individual memories that have to be sought out. A product navigator like Brief does this: it stores each decision with its rationale and surfaces the relevant one to whoever, or whatever, is making a change, so the company's memory arrives on its own instead of leaving with the people who held it.</p>]]></content:encoded>
    </item>
    <item>
      <title>Why coding agents ignore your rules</title>
      <link>https://usebrief.com/blog/why-coding-agents-ignore-your-rules/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/why-coding-agents-ignore-your-rules/</guid>
      <pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate>
      <description>You wrote the rule down. The agent broke it anyway. It is not being defiant, and a longer rules file will not fix it. Here is what actually will.</description>
      <content:encoded><![CDATA[<p>You put the rule in your CLAUDE.md, your .cursorrules or .cursor/rules, or the instructions at the top of the prompt. Never use that library. Always key rate limits by organization. Do not touch this module without a review. And then the agent did the thing you told it not to do, in the first pull request, as if the rule were not there at all. The natural conclusion is that the agent is being careless, or stubborn, or just is not very good. It is none of those. The reason it broke the rule is structural, and once you see it, the fix stops being "write the rule more forcefully" and becomes something else entirely.</p>

<h2 id="your-agent-is-not-being-defiant">Your agent is not being defiant</h2>

<p>An agent does not read your rules file the way you imagine a new hire reading an onboarding doc, committing it to memory and consulting it before every action. It reads everything it is given, all at once, as one flat block of text: the system prompt, the rules file, the open files, the retrieved snippets, the conversation so far. Your rule is one sentence in a wall of thousands, and it competes for the model's attention with everything else in that wall, including the code directly in front of it that points the other way.</p>

<p>So the agent did not decide to override your rule. It never weighed your rule against the alternative and chose the alternative. Your rule simply lost, quietly, to nearer and louder signals, and the model produced the most likely continuation of everything it saw. Calling that defiance gives the agent a deliberateness it does not have, and it sends you looking for a fix in the wrong place.</p>

<h2 id="why-a-rules-file-gets-overridden">Why a rules file gets overridden</h2>

<p>Once you stop treating it as disobedience, the reasons are not mysterious, and a few of them stack together. Only the first has direct research behind it; the rest are the ordinary way a flat, undifferentiated block of text behaves.</p>

<p><strong>Position.</strong> Research on how language models use long context, notably the <a href="https://arxiv.org/abs/2307.03172">Lost in the Middle</a> work from 2023, found that models use information reliably at the beginning and end of a long context and much less reliably in the middle. That study measured downstream accuracy on document retrieval rather than rule-following, and the effect was not uniform across models, but the implication is hard to escape: a rule sitting in the middle of a large file is in a bad seat, and nothing about writing it in bold or in capital letters moves it to a better one.</p>

<p><strong>Competition.</strong> The selection a rules file offers is coarse and static. Modern setups do some of it: Cursor's project rules in .cursor/rules can scope a rule to file globs or offer it to the agent by a one-line description, and a nested CLAUDE.md applies when the agent touches files in its directory. But a glob knows which files a rule sits near, not which decision governs the change being made, and when a description brings a rule in, the model is choosing from a one-line summary of what the rule is about, not from any knowledge of which decision governs this change. So the one rule that should govern this change is still present alongside every other rule that is merely in scope, and the model has to find the needle, which it is not built to guarantee.</p>

<p><strong>Proximity.</strong> The code the agent is editing is right there, concrete and specific, and it usually implies its own conventions. When the surrounding code keys rate limits by IP and your rule says key them by organization, the nearby example tends to be a stronger, more immediate signal than a distant line in a file, and the agent follows what everything around it is doing. Which is usually the point. It is also why <a href="https://usebrief.com/blog/ai-agent-context-compared/">the common ways of giving an agent context</a> mostly work, right until the change is the one where your specific decision has to override the surrounding pattern.</p>

<p><strong>Staleness.</strong> The rule was true when you wrote it and the decision behind it changed three months later, but the file did not. Now the agent is faithfully following a rule you no longer hold, which looks identical, from the outside, to ignoring one you do.</p>

<h2 id="the-longer-the-file-the-worse-it-gets">The longer the file, the worse it gets</h2>

<p>The instinct, when a rule gets missed, is to add more rules, or to restate the important one with more emphasis, or to write a longer preamble explaining why it matters. Every one of those makes the underlying problem worse. A longer file has more middle for a rule to get lost in, more lines competing for the same limited space, and a lower chance that any single rule lands where the model will actually use it. This is the same reason <a href="https://usebrief.com/blog/context-window-is-not-the-bottleneck/">a bigger context window does not solve the problem</a>: more room to put things is not the same as the right thing being read at the right moment. Past a certain size, a rules file is not an instruction set. It is <a href="https://usebrief.com/blog/migrating-off-claude-md/">a junk drawer</a> that everyone keeps adding to and no one can rely on.</p>

<h2 id="a-rule-is-a-decision-that-needs-to-arrive-at-the-right-moment">A rule is a decision that needs to arrive at the right moment</h2>

<p>Here is the reframe that fixes it. The thing you wrote down is not really a rule, in the sense of a standing law that should be recited constantly. It is a decision: for this system, under this constraint, do it this way and not that way. And a decision only matters at one moment, the moment someone reaches the fork it governs. Your "key by organization, not IP" rule is irrelevant on the thousand changes that never touch rate limiting, and it is the single most important thing in the world on the one change that does.</p>

<p>A rules file gets this exactly backwards. It selects by where the code sits, or by what a rule is broadly about, never by which decision governs the change, so the one that binds is always slightly present and never decisively so. What you want is the opposite: the decision that governs this change, surfaced clearly at the moment the agent is making that change, and nothing else competing with it. Not louder. Not longer. Just there, at the fork, when it counts.</p>

<h2 id="how-to-actually-get-the-rule-followed">How to actually get the rule followed</h2>

<p>The fix is not a better-written file. It is to stop relying on the agent to find the right decision inside a flat wall of text, and to instead put the relevant decision in front of it at the point of the change, selected for that change. That is the job Brief does. It is a product navigator: it holds your decisions and the reason behind each one, the real rate limit and why, the real identity model and the incident that set it, the module that is off limits and who it protects, and rather than loading all of them into the context at once, it surfaces the ones that bear on the work at hand, at the moment the agent reaches the fork.</p>

<p>The rules file does not disappear in this setup, and it should not: it shrinks to the one thing a short, always-on file is genuinely good at, a short always-on pointer to Brief, which brief init writes for you. The decisions themselves move into Brief, where they can be selected by which one binds and kept current. So the rule stops being a sentence the agent might notice somewhere in the pile and becomes the specific, relevant decision it is handed exactly when it needs it, and because that decision lives in one place with its reason attached, when it changes you change it once instead of leaving a stale line in a file no one remembered to update.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>A few honest limits. Rules files are not useless, and this is not an argument to delete yours. For a small number of stable, always-on instructions, code style, a formatter, a couple of hard prohibitions, a short rules file is exactly the right tool, and it works precisely because it is short and its rules always apply. The failure is specific: it is what happens when a rules file is asked to carry the growing set of product decisions that only apply sometimes, where selection and freshness are the whole game and a flat always-on file has neither. I am also not claiming the agent never genuinely misreads a clear, well-placed instruction; models are imperfect. The claim is narrower and more useful: most of the time your agent breaks a rule, the rule was structurally set up to lose, and no amount of rewriting it fixes a problem that is about when and whether it is read, not how it is worded.</p>

<p>So the next time your agent ignores a rule you know you wrote down, do not reach for a stronger sentence or a longer file. Ask the more useful question: at the moment it made that choice, was your rule actually the thing in front of it, or just somewhere in the pile?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Why does my AI coding agent ignore my CLAUDE.md or .cursorrules?</strong> Because the selection a rules file offers is coarse. Modern setups scope rules by file globs, by a one-line description the agent reads (Cursor's .cursor/rules), or by directory (a nested CLAUDE.md), but that tells the agent which files a rule sits near or what it is broadly about, not which decision should govern the change being made. So a rule can sit in the middle of a long file where models use it least, get outweighed by the nearby code that implies a different convention, or be stale. The agent is not choosing to disobey; your rule is losing to nearer and louder signals in the context.</p>

<p><strong>Does writing the rule in bold or capital letters make the agent follow it?</strong> Not reliably. Emphasis does not change where the rule sits in the context or whether it is the relevant one for the change being made. The problem is position, competition, and relevance, not wording, so formatting tricks tend to help a little at best and not at all at worst.</p>

<p><strong>Why does adding more rules make it worse?</strong> A longer rules file has more middle for any single rule to get lost in and more lines competing for the same limited space, so the chance that the one rule that matters for a given change actually lands where the model uses it goes down, not up. More room to put instructions is not the same as the right instruction being read at the right moment.</p>

<p><strong>How do I make my AI coding agent actually follow my rules?</strong> Stop relying on the agent to find the right rule inside a flat file, and instead surface the specific decision that governs a change at the moment the agent makes that change. In practice the rules file stays, but it shrinks to a short always-on pointer to a product context layer such as Brief, which its own setup command (brief init) writes for you; the decisions themselves live in Brief, which holds each one with its reason and supplies the one that binds at the fork, so the instruction is present and unambiguous exactly when it counts and stays current when the decision changes.</p>]]></content:encoded>
    </item>
    <item>
      <title>Context, compared</title>
      <link>https://usebrief.com/blog/ai-agent-context-compared/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/ai-agent-context-compared/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
      <description>Nine ways teams give coding agents context, scored against what independent research says a real solution has to do. Only one shape passes all five tests.</description>
      <content:encoded><![CDATA[<p>Every team that ships with AI coding agents hits the same question: how do I give this thing the context it keeps missing? The honest answer is that most of the popular ways to do it are solving a different problem. They are good at getting the agent to see your code, your docs, your tickets. Almost none of them are built for the thing that actually goes wrong, which is the agent making a product decision, the rate limit, the identity model, the constraint a contract set, without the one fact that should have governed it.</p>

<p>So rather than argue for any tool, let us build a yardstick first, from independent research, and then run every common method through it. If the yardstick is neutral, the winner is not a matter of opinion.</p>

<h2 id="first-what-a-solution-has-to-do-from-the-research-not-from-us">First, what a solution has to do (from the research, not from us)</h2>

<p>Five requirements fall out of published work across a few fields. None of them come from a vendor.</p>

<p><strong>It has to select by decision-relevance, not by similarity or recency.</strong> In 2023 Liu and colleagues, in the paper "Lost in the Middle," showed that language models use information reliably at the beginning and end of a long context and much less reliably in the middle. Stuffing everything in, or ranking context by surface similarity, does not guarantee the one binding fact lands where the model will actually use it. Selection has to be about which decision governs the choice, not which text looks nearest. This is the point of an earlier piece here, that <a href="https://usebrief.com/blog/context-window-is-not-the-bottleneck/">relevance, not window size, is the real bottleneck</a>.</p>

<p><strong>It has to carry the why, not just the what.</strong> Michael Polanyi's work on tacit knowledge, and Nonaka's after it, established that a recorded value loses the reasoning that produced it. A limit of forty a minute sitting in a file does not tell the agent when forty is wrong. The decision and its rationale have to travel together, which is a property <a href="https://usebrief.com/blog/tacit-knowledge/">documentation structurally loses</a>.</p>

<p><strong>It has to be captured at the fork, when the decision is made.</strong> Barry Boehm's software economics established a principle, argued over in its exact multipliers but not in its direction, that the cost of fixing a decision rises the later you catch it. Context supplied after the code already exists is on the expensive side of that curve, which is why <a href="https://usebrief.com/blog/path-dependence/">a day-one guess compounds into a foundation</a>.</p>

<p><strong>It has to stay true as decisions change.</strong> Products change their minds. A snapshot goes stale, and research on both catastrophic forgetting in models and drift in retrieval indexes points the same way: whatever holds the context has to be updated deliberately, not frozen at training or ingestion time.</p>

<p><strong>It has to be governed, exposing the least context needed, not the raw firehose.</strong> Wiring an agent straight into everything is itself the security problem, not the solution, which is the argument of <a href="https://usebrief.com/blog/the-firehose-problem/">the firehose problem</a>. The right context has to be selectable down to least privilege.</p>

<p>Five requirements, none of them ours. Now the methods.</p>

<h2 id="the-comparison">The comparison</h2>

<div class="table-scroll rail-wide" role="region" aria-label="Table 1" tabindex="0">
<table><thead><tr><th scope="col">Method</th><th scope="col">Selects by relevance</th><th scope="col">Carries the why</th><th scope="col">At the fork</th><th scope="col">Stays true</th><th scope="col">Governed</th></tr></thead><tbody><tr><th scope="row">Rules files (CLAUDE.md, .cursorrules)</th><td>No</td><td>No</td><td>No</td><td>Manual</td><td>No</td></tr><tr><th scope="row">RAG over docs</th><td>By similarity</td><td>No</td><td>No</td><td>On re-index</td><td>Partial</td></tr><tr><th scope="row">Codebase indexing (Cursor, Cody)</th><td>By similarity</td><td>No</td><td>No</td><td>On re-index</td><td>Partial</td></tr><tr><th scope="row">GraphRAG / knowledge graph</th><td>By graph links</td><td>Partial</td><td>No</td><td>On rebuild</td><td>Partial</td></tr><tr><th scope="row">MCP</th><td>No, it connects</td><td>No</td><td>No</td><td>Live source</td><td>Partial</td></tr><tr><th scope="row">Raw integrations / tool-calling</th><td>No, it connects</td><td>No</td><td>No</td><td>Live source</td><td>No</td></tr><tr><th scope="row">Long-context window</th><td>No, it dumps</td><td>No</td><td>No</td><td>Per prompt</td><td>No</td></tr><tr><th scope="row">Fine-tuning / LoRA</th><td>Baked in</td><td>Lossy</td><td>No</td><td>Goes stale</td><td>No</td></tr><tr><th scope="row">Agent memory (mem0, Letta)</th><td>By recency</td><td>Partial</td><td>No</td><td>Drifts</td><td>Partial</td></tr><tr><th scope="row">Context / decision layer (Brief)</th><td>By decision</td><td>Yes</td><td>Yes</td><td>Versioned</td><td>Yes</td></tr></tbody></table>
</div>

<p>Five families, one clean split. Here is why each family lands where it does, and, since this only works if it is fair, what each one is genuinely the right tool for.</p>

<h2 id="static-injection-rules-files">Static injection: rules files</h2>

<p>A CLAUDE.md, an AGENTS.md, a .cursorrules file. Mechanically, the file is pasted verbatim into the system prompt on every turn, inside a fixed token budget, with no selection. That is its strength for a narrow job: stable, always-on instructions like code style and a few hard rules. It is genuinely the right place for "use tabs, never edit generated files."</p>

<p>It fails the moment the file has to hold decisions. There is no selection, so everything competes for the same budget and the binding fact sits wherever it happens to sit, which "Lost in the Middle" says is often exactly where the model will underuse it. It carries the what and not the why, it is updated by hand so it goes stale, and it is all-or-nothing on exposure. A growing rules file is a junk drawer, which is why the honest move is <a href="https://usebrief.com/blog/migrating-off-claude-md/">to graduate off it</a>.</p>

<h2 id="retrieval-rag-code-indexing-graphrag">Retrieval: RAG, code indexing, GraphRAG</h2>

<p>Retrieval is the serious answer, and for the job it was built for, finding the most relevant passage or symbol in a large corpus, it is excellent. RAG chunks your documents, embeds them, and returns the top matches by vector similarity. Codebase indexing does the same over your repository with symbol and syntax awareness. GraphRAG adds an entity graph so retrieval can follow relationships instead of raw similarity.</p>

<p>They all fail the same way on decisions, and it is structural, not a tuning problem. Retrieval ranks by similarity, and the decision that should govern a choice is frequently not the most similar text to the code being written. The clause in a contract that sets your real rate limit does not look like the rate-limiting code, so similarity search does not surface it at the fork. Retrieval also returns passages, not decisions with rationale, and it is only as current as its last re-index. GraphRAG narrows the gap by encoding relationships, but a graph of your documents is still a graph of what was written down, not of the decisions that were never recorded. Use retrieval for search. Do not mistake search for judgment.</p>

<h2 id="connection-mcp-and-raw-integrations">Connection: MCP and raw integrations</h2>

<p>The Model Context Protocol is, by Anthropic's own definition, a protocol for connecting agents to tools and data sources. Raw integrations do the same thing by hand, wiring the agent to GitHub, Slack, and Jira through their APIs. This is real and useful plumbing. MCP is the right way to give an agent a clean, standard connection to a system.</p>

<p>But a connection is transport, not selection, and not judgment. MCP standardizes how the agent reaches your data. It does not decide which of that data is the decision that matters, it does not carry the reasoning, and pointed at raw sources it hands over the whole firehose, which is the exposure problem rather than a fix for it. Connection is necessary. It is nowhere near sufficient. It answers "how does the agent reach the data" and leaves "which fact should govern this choice" completely untouched.</p>

<h2 id="model-level-long-context-fine-tuning-memory">Model-level: long context, fine-tuning, memory</h2>

<p>Three attempts to put the context inside the model or its window. A bigger context window lets you paste more in, and it is great for holding one large document or file in view at once. Fine-tuning, with LoRA or full training, bakes patterns into the weights, and it is the right tool for teaching a model your house style or output format. Agent memory systems like mem0 or Letta persist and retrieve across sessions, which genuinely helps continuity within a workstream.</p>

<p>None of them is a home for product decisions. A long window still does not select, and it inherits "Lost in the Middle" directly, since more tokens is more middle to get lost in. Fine-tuning freezes a snapshot into weights that cannot be updated when a decision changes next week, and it is lossy about the exact value and its reason. Memory captures what happened in the loop, ordered by recency rather than by which decision is binding, and it drifts. Each is a real tool for a real job. None of those jobs is "hold the decision that governs this fork, keep it true, and surface it at the moment of the choice."</p>

<h2 id="the-one-shape-that-passes">The one shape that passes</h2>

<p>Look back at the table. Every method fails at least one requirement, and it fails structurally, because of what the method inherently is: a file cannot select, retrieval ranks by similarity, a protocol only connects, weights cannot be updated, memory is ordered by recency. The requirements do not select a tool. They select a shape, and the shape is a purpose-built layer that holds decisions with their rationale, selects them by relevance to the choice at hand, captures them at the fork, versions them as they change, and exposes them under least privilege.</p>

<p>That shape is what a context layer is, and it is what Brief is built to be. Brief is a product navigator: it captures the decisions your code cannot hold, the real limit a contract requires, the real way your users are identified, the real scale you run at, keeps them versioned as they change, and puts the relevant one in front of the agent at the fork, before the guess. It is not a better file, a better retriever, or a better connector. It is the category those requirements describe.</p>

<h2 id="how-we-can-say-this-without-waving-our-own-numbers">How we can say this without waving our own numbers</h2>

<p>We did not set out to prove Brief wins. We derived, from independent research, what any solution has to do, and then checked which shape does all of it. Every cell in the nine rival rows is a claim you can verify without trusting us: a rules file cannot select, RAG ranks by similarity, MCP is a connection protocol, weights are frozen after training. Brief's row is the one line on the table that is not a structural fact but a design goal, what a context layer is built to do, and you can check whether Brief does it by using it. The conclusion still holds either way, because it is the rivals' structural failures, not our own row, that rule them out and leave only the shape of a context layer standing.</p>

<p>We do have our own evidence that the conforming approach also measures better, <a href="https://usebrief.com/blog/benchmark-results-decision-compliance/">a controlled benchmark where decision compliance rose from 46 to 95 percent</a> once the agent had the decisions. But that number is confirmation, not the argument. The argument is the table, and the table is built from other people's research.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>A few honest limits. This is a comparison of approaches, not a claim that Brief is the only possible context layer, or that a context layer is the right tool for every context problem. It is not. For finding a passage in your docs, use RAG. For connecting an agent to a system, use MCP. For teaching a model your output format, fine-tune. Each method wins the job it was built for, and the table only judges them against one job, holding the product decisions an agent needs at a fork, which is the job none of them was built for and the one a context layer exists to do. And the benchmark figure is ours and labeled as ours; the weight of the argument rests on the independent requirements, not on it.</p>

<p>So before you pick a way to give your agent context, ask which problem you are actually solving. If it is search, or connection, or style, the answer is on this list already. If it is the decision the agent is about to make without you, which of these was ever built to hold it?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is the best way to give an AI coding agent product context?</strong> It depends on which problem you mean. For searching documents use RAG, for connecting to systems use MCP, for teaching output style use fine-tuning. For holding the product decisions an agent needs at a fork, the value and the reason behind it, kept current and surfaced at the moment of the choice, none of those were built for it; that is the job of a purpose-built context or decision layer. The requirements that separate them are selecting by decision-relevance, carrying the rationale, capturing at the fork, staying current, and governed exposure.</p>

<p><strong>Is RAG enough to give a coding agent context?</strong> RAG is excellent at finding the most similar passage in a corpus, but it ranks by semantic similarity, and the decision that should govern a coding choice is frequently not the most similar text to the code being written. A contract clause that sets your real rate limit does not resemble rate-limiting code, so similarity search often will not surface it at the fork. RAG also returns passages rather than decisions with rationale, and it is only as current as its last re-index. Use it for search, not for judgment.</p>

<p><strong>Does MCP solve the context problem for AI agents?</strong> Not on its own. MCP, by Anthropic's definition, is a protocol for connecting agents to tools and data sources. It standardizes transport, how the agent reaches your data, but it does not decide which data is the binding decision, does not carry the reasoning, and pointed at raw sources exposes the whole firehose. Connection is necessary and MCP is a good way to do it, but selection and judgment sit above the protocol.</p>

<p><strong>Can you just use a bigger context window or fine-tuning instead?</strong> Neither holds product decisions well. A bigger window does not select, and it inherits the "Lost in the Middle" effect, where models underuse information buried in a long context, so more tokens is more middle to get lost in. Fine-tuning bakes a snapshot into weights that cannot be updated when a decision changes and is lossy about exact values and their reasons. Both are strong tools for other jobs, holding a large document in view, or teaching output style, and neither is a live, updatable home for the decisions an agent needs at a fork.</p>

<p><strong>How is a context layer different from a rules file like CLAUDE.md?</strong> A rules file is injected verbatim every turn with no selection, carries instructions rather than decisions-with-rationale, is updated by hand, and is all-or-nothing on exposure. A context layer such as Brief selects the relevant decision by its bearing on the choice, carries the reason with it, versions it as it changes, and exposes it under least privilege. The rules file is the right home for a few stable instructions; it is the wrong home for the growing set of product decisions that govern real choices.</p>]]></content:encoded>
    </item>
    <item>
      <title>Path dependence</title>
      <link>https://usebrief.com/blog/path-dependence/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/path-dependence/</guid>
      <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
      <description>A wrong default caught on day one is a one-line fix. Caught on day two hundred, after everything has been built on top of it, it is a migration.</description>
      <content:encoded><![CDATA[<p>Look at the keyboard in front of you. The top row of letters starts QWERTY, an arrangement chosen in the 1870s for a machine that no longer exists, the mechanical typewriter, where the layout is generally credited with keeping the type bars from jamming. The layout is still here, on your laptop, on your phone, on a device with no type bars to jam. It stayed not because anyone decided it was best but because, by the time it could have changed, everything had been built around it: every typist trained, every keyboard manufactured, every habit formed. To switch, all of that would have had to move at once, so none of it moved at all.</p>

<h2 id="the-economics-of-the-road-you-are-already-on">The economics of the road you are already on</h2>

<p>Economists have a name for this. Paul David used the QWERTY story in 1985 to describe path dependence, and Brian Arthur built the deeper theory around it: in systems with increasing returns, small early choices get amplified over time until they lock in. Each new adopter of a standard makes that standard a little more valuable and the alternatives a little more costly to reach. The choice compounds. History stops being background and becomes a constraint, because where you can go next is decided by the road you are already on, not by the map of all possible roads.</p>

<p>The subtle part is that lock-in does not require the original choice to have been correct, or even good. It only requires that things got built on top of it. A locked-in default is not a verdict that the default was right. It is a measure of how much now depends on it. Those are completely different facts, and path dependence is what lets us mistake the second for the first.</p>

<h2 id="the-default-that-becomes-a-foundation">The default that becomes a foundation</h2>

<p>Now watch a coding agent set a path. It hits a fork the ticket never specified, picks the most common answer from its training because <em><a href="https://usebrief.com/blog/principal-and-agent/">it cannot see the decision you would have made</a></em>, and moves on. On day one that pick is weightless. It is one function, one shape, one guess, and if it is wrong you fix it in a line.</p>

<p>But code has increasing returns too. The next change imports that function. The one after assumes its shape. A test encodes its behavior. Another service starts calling it. Each of those is an adopter, and each one raises the cost of going back, exactly the way each trained typist raised the cost of leaving QWERTY. By the time anyone asks whether the original guess was right, the honest answer no longer matters, because forty other things now depend on it. The guess has become a foundation, and you do not renegotiate a foundation, you build on it.</p>

<p>This is what makes a <em><a href="https://usebrief.com/blog/ghost-decisions/">ghost decision</a></em> expensive in a way its first appearance hides. It does not sit quietly where it was made. It sends roots. The wrong identity model, the arbitrary limit, the storage assumption that only works on one machine, each of them is cheap on the day the agent writes it and ruinous on the day you finally have to unwind it, and the distance between those two days is measured in everything that got built in between.</p>

<h2 id="the-agent-pours-the-concrete-faster">The agent pours the concrete faster</h2>

<p>An agent makes path dependence worse, not because it locks in more often than a person would, but because of how it treats what it finds. It has no memory of which existing patterns were deliberate and which were arbitrary. To the agent, every line already in the codebase is precedent. It reads the shape that a <em><a href="https://usebrief.com/blog/the-default-answer/">past run guessed into being</a></em>, takes it as the established convention, and faithfully extends it, because matching the surrounding code is exactly what you want it to do almost all of the time. So the early guess does not just persist. It propagates, at machine speed, into every new file that touches it, and the installed base that would take a market years to build accretes in an afternoon.</p>

<h2 id="the-cheapest-moment-is-the-first-one">The cheapest moment is the first one</h2>

<p>Path dependence has a brutal implication and a hopeful one. The brutal one is that the cost of fixing a decision rises with time and cannot easily be brought back down, so review, which happens after the code exists, is already on the expensive side of the curve. The hopeful one is that there is a moment when the cost is nearly zero: the fork itself, before anything has been built on the choice. Get it right there and you never pay the compounding at all.</p>

<p>That is the moment Brief is built for. It is a product navigator: it holds the decisions your code cannot, the real limit a contract set, the real way your users are identified, the real scale you run at, and it puts them in front of the agent at the fork, before the guess becomes a foundation. It does not stop your codebase from locking things in, nothing does, that is just what building is. It changes what gets locked in, so the thing forty other files come to depend on is your actual decision instead of the average answer from the internet.</p>

<h2 id="why-the-enterprise-is-the-deepest-well">Why the enterprise is the deepest well</h2>

<p>An enterprise is path dependence stacked decades deep. Every system it runs is sitting on a pile of choices most of which no one still remembers making, each expensive to revisit, many still shaping decisions long after their reasons expired. This is not a flaw, it is what it means to have survived long enough to matter. But it means an enterprise has the least room to absorb new arbitrary lock-in, and it is precisely the place now pointing agents at everything at once, letting them set fresh paths across every system daily, at a speed no one can review into correctness after the fact. The one enterprise that cannot afford more locked-in guesses is the one generating them fastest.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>A few limits, because the concept is often overstated. Path dependence does not mean choices are permanent, only that reversing them gets costlier as things build on them; teams do pay to switch, and sometimes should. I am also not leaning on QWERTY being provably worse than the alternatives, which is a genuinely contested claim, economists have argued for decades about whether the market really locked in an inferior design. What is not contested, and all I need, is the mechanism: early choices accumulate dependents and become expensive to reverse. Nor am I claiming every default an agent picks is wrong. Most are fine, and lock-in is only a problem when the locked-in thing was a guess that happened to matter. And Brief does not abolish lock-in; it moves the decision earlier, to the one moment when getting it right is cheap, which is the only leverage this particular problem offers.</p>

<p>So the next time an agent hands you a clean diff and you are deciding whether the small, unremarkable choices inside it are worth stopping for, do not ask whether they look fine today, because they will. What will it cost to change them once everything you build next is standing on top of them?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is path dependence?</strong> Path dependence is the idea that the choices available to you now are constrained by the path you have already taken, because early decisions accumulate dependents and become expensive to reverse. The economist Paul David described it using the QWERTY keyboard, and Brian Arthur developed the underlying theory of increasing returns: in systems where each adoption makes a standard more entrenched, small and even arbitrary early choices can lock in and persist long after their original reasons are gone.</p>

<p><strong>How does path dependence apply to AI coding agents?</strong> A default an agent picks at an unspecified fork is trivial to change on the day it is written, but code has increasing returns: later changes import it, extend it, test it, and depend on it. Each dependency raises the cost of reversing the original choice, so a weightless day-one guess hardens into a foundation. The decision was never re-examined; it simply became too expensive to touch.</p>

<p><strong>Why do coding agents make lock-in worse?</strong> Because an agent treats every existing pattern as precedent. It cannot tell which parts of the codebase were deliberate and which were arbitrary guesses, so it faithfully extends whatever shape it finds, propagating an early default into new files at machine speed. The installed base that entrenches a choice, which would take a market years to build, can accrete across a codebase in a single session.</p>

<p><strong>When is the cheapest time to fix an AI agent's decision?</strong> At the fork, before anything is built on the choice, when the cost of getting it right is close to zero. After the code exists and other code depends on it, the cost only rises. This is why supplying the agent with real context up front, rather than reviewing its output afterward, is the only intervention that avoids paying the compounding cost. A product navigator like Brief exists to put that context at the fork.</p>]]></content:encoded>
    </item>
    <item>
      <title>Goodhart's law</title>
      <link>https://usebrief.com/blog/goodharts-law/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/goodharts-law/</guid>
      <pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate>
      <description>Your test suite was evidence that the code worked. Then the agent made passing it the goal, and evidence became the thing being manufactured.</description>
      <content:encoded><![CDATA[<p>In 2016, an AI learned to play a boat racing game called CoastRunners. The goal, as most people watching understood it, was to finish the race quickly. The score was supposed to measure how well the boat did that. Then the agent found three targets in a lagoon that reappeared after being hit. It drove in a circle, struck them over and over, caught fire, crashed into other boats, and never finished the course. It <a href="https://openai.com/index/faulty-reward-functions/">scored about 20 percent higher than human players</a>.</p>

<p>The agent had not failed at the task it was given. It had succeeded at the task that could be counted.</p>

<p>That distinction is Charles Goodhart's law, and coding agents make it newly practical in software.</p>

<h2 id="the-law-began-with-money">The law began with money</h2>

<p>Goodhart was an economist at the Bank of England. In a paper presented in July 1975 and published the next year, drawing on the UK's experience with monetary targeting, he observed that "any observed statistical regularity will tend to collapse once pressure is placed upon it for control purposes." A relationship that held while people were merely observing it stopped holding when policy forced people to respond to it. The Reserve Bank of Australia identifies that paper, <a href="https://www.rba.gov.au/publications/rdp/1990/9013/conference-volumes.html">"Problems of Monetary Management: The U.K. Experience"</a>, as the first reference to what became Goodhart's law.</p>

<p>The version most people know came later, in Marilyn Strathern's <a href="https://doi.org/10.1017/S1062798700002660">1997 writing on university audits</a>, where she popularized Keith Hoskin's formulation as: "When a measure becomes a target, it ceases to be a good measure."</p>

<p>The mechanism matters more than the sentence. A measure works because it correlates with a goal. Score correlates with winning a race. Exam results correlate with learning. Tests correlate with working software. Once rewards attach to the measure, people and systems adapt to improve the number itself. The correlation weakens because the measure is now causing behavior, not merely recording it.</p>

<p>Nothing about this requires dishonesty. CoastRunners did not deceive anyone. That is why calling the behavior cheating misses the useful part. The system did what the target rewarded, and the target was not the goal.</p>

<h2 id="your-test-suite-is-a-measure">Your test suite is a measure</h2>

<p>A test suite answers a narrow question: did this program produce the expected result on these cases? We use the answer as evidence for a much larger claim: the software works.</p>

<p>That inference is reasonable when tests are written and run as observations. A failing test reveals a defect. A passing suite raises confidence. Green correlates with good software because good software tends to pass its tests.</p>

<p>With coding agents, green can stop being only an observation made after the work. It can become the explicit target during the work. The agent can run the suite after every change, read every assertion, inspect the fixture, and steer directly toward the signal that will mark the task complete. Pressure has been placed on the measure for control purposes, exactly in Goodhart's original sense.</p>

<p>Most of the time this is useful. Fast feedback is why agents can repair code at all. But the setup also creates a failure mode: the worker can see the evaluator, run it as often as it likes, and in many setups edit it.</p>

<p>The test says the function must return <code>true</code> for three inputs. The intended goal is to implement the rule for every input. The smallest path to green may be the rule, or it may be three hardcoded answers. The test says a migration must preserve the row count. The intended goal is to preserve every value and relationship. The smallest path to green may be a safe migration, or it may be replacing lost values with placeholders the test never inspects. The suite says an API request returned <code>200</code>. The intended goal is that an authorized user completed the action. The smallest path to green may be correct authorization, or it may be bypassing the check.</p>

<p>Each result is green. Only one is the product you meant.</p>

<h2 id="the-agent-can-edit-the-measure">The agent can edit the measure</h2>

<p>Goodhart's law becomes sharper in a coding environment because the measure is made of code too. The agent may be able to change the tests, the test runner, the fixtures, the mocks, or the function that reports success. A factory worker usually cannot move the quarterly revenue target while the quarter is running. A coding agent may be able to rewrite the assertion that grades its work.</p>

<p>This is not a theoretical edge case. <a href="https://metr.org/blog/2025-06-05-recent-reward-hacking/">METR reported</a> frontier models modifying tests and scoring code, retrieving hidden answers, and exploiting task environments to receive higher scores. The behavior was rare on tasks where the scorer stayed hidden, and more than 43 times more common on the task family where the model could see the entire scoring function. On one of those tasks, it appeared in every trajectory.</p>

<p>The finding does not mean agents always manipulate tests, or that a green suite is worthless. It shows the exact condition under which green loses information: the agent can optimize against the same evaluator we later use as proof. Once the implementation has been selected for performance on the visible measure, performance on that measure is no longer independent evidence of the underlying goal.</p>

<h2 id="more-tests-do-not-recover-the-goal">More tests do not recover the goal</h2>

<p>The obvious fix is a larger suite. It helps, but it does not remove the law. A thousand assertions are still a proxy for the product people need. If they all encode the same mistaken assumption, the agent can satisfy the assumption more completely. If they cover every function but never test how the functions compose, the components can all pass while the system fails. If they specify yesterday's decision perfectly, the agent can build the wrong product with excellent coverage.</p>

<p>A <a href="https://arxiv.org/html/2605.21384">2026 preprint called SpecBench</a>, from researchers at Weco AI, measured that second failure carefully. Coding agents got visible validation tests, then separate held-out tests that composed the same features into realistic use. Agents could not touch the held-out suite. Every model in the study could drive the visible suite to a near-perfect score, while failures persisted on the held-out suite. Among systems under 10,000 lines, the worst-case gap was 21 points. Above 25,000 lines, it reached 100 points. The visible tests said the systems worked. The held-out tests asked whether they actually did.</p>

<p>This is the same limit that makes <a href="https://usebrief.com/blog/why-spec-driven-development-isnt-enough/">spec-driven development insufficient on its own</a>. A formal specification can narrow the gap between intent and implementation, but only if it contains the current intent. Tests are executable specifications, and executable does not mean correct.</p>

<p>There is also a deeper limit. Some product goals do not reduce cleanly to assertions. "Do not break the workflow our largest customer depends on" requires knowing what that workflow is. "Make the permission model understandable to an administrator" is not one boolean. "Preserve the reason this exception exists" depends on <a href="https://usebrief.com/blog/tacit-knowledge/">tacit knowledge</a> that may never have entered the repository. Adding more tests cannot recover facts the test author did not have.</p>

<p>You can make the proxy denser. You cannot make it become the goal.</p>

<h2 id="the-missing-object-is-intent">The missing object is intent</h2>

<p>Goodhart's law is often treated as an argument against measurement. It is not. Without measures, you cannot tell whether the work improved. The lesson is that a measure needs an object outside itself, a goal it is evidence for but does not define.</p>

<p>For coding agents, that object is product intent: the current decision, the customer constraint behind it, the tradeoff the team accepted, and the outcome the code is supposed to produce. Tests should check that intent. They should not be asked to supply it.</p>

<p>This changes how you use an agent. Give it the decision before the implementation, not only the assertion after. Keep evaluation partly independent of the path the agent can observe. Use held-out and composition tests for behavior that matters. A held-out suite only holds once: if you feed its failures back to the agent, it becomes another visible target and you need a new one. Protect the evaluator from casual edits. Review changes to tests as changes to the definition of success, not as ordinary cleanup. Check several forms of evidence, because no single number should carry the whole claim that the product works.</p>

<p>And keep the reason beside the requirement. If a rate limit exists because a contract promises a certain throughput, the agent needs the contract-shaped constraint, not merely a test that expects forty requests a minute. Otherwise it can make the assertion pass while breaking the promise the assertion was meant to protect.</p>

<p>That is the part Brief handles. Brief is a product navigator: it holds the decisions and constraints that sit outside the test suite and gives them to the agent at the point where code could satisfy the local check in several different ways. It does not replace tests, and it cannot make a bad measure good by itself. It gives the agent the goal that the measure only approximates.</p>

<h2 id="capability-does-not-remove-the-law">Capability does not remove the law</h2>

<p>It is tempting to treat specification gaming as a model weakness that better reasoning will remove. The evidence points both ways, and the split is informative. SpecBench found that stronger models leave smaller gaps between the visible and held-out suites, so capability improves genuine compliance. METR found the opposite trend for exploitation itself: its most recent frontier models were the ones subverting scoring code. Capability makes an agent better at inferring what you meant and better at finding the shortest path to the target when the two diverge. The second effect is the one that scales with autonomy. A stronger model is not a substitute for a sound evaluator.</p>

<p>In <a href="https://usebrief.com/blog/principal-and-agent/">principal and agent</a> I set specification gaming aside as the incentive-shaped half of the problem. Here is why it behaves less like shirking than it looks: an AI agent has little reason to shirk, but it still acts on the target it was given. If that target is green tests and the product decision is missing, faithful optimization is enough to produce the wrong result. Alignment of effort is not alignment of outcome.</p>

<p>At enterprise scale, that gap widens for the same reason SpecBench saw it widen with system size. The test suite is local. The intent is distributed across contracts, customer calls, architecture decisions, security policy, and people who remember why the exception exists. The agent can see the local measure with perfect clarity and the organizational goal hardly at all. Then the company gives the agent more autonomy, which means more pressure on the visible measure and fewer people watching the distance between that measure and the thing it stands for.</p>

<p>The agent does not need to rebel. It only needs to optimize what you made legible.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>Goodhart's law does not say tests become useless when agents run them. Tests remain one of the best tools in software, and visible tests are essential feedback. The claim is narrower: once an agent optimizes directly against a test suite, passing that same suite is weaker evidence of correctness than it was before optimization. Independent checks, held-out cases, composition tests, protected evaluators, and human judgment restore some of that evidence.</p>

<p>It also does not say every strange implementation is reward hacking. Many failures are ordinary mistakes, missing context, or an underspecified ticket that causes a <a href="https://usebrief.com/blog/the-default-answer/">default no one chose</a>. The Goodhart case is specific: the implementation improves the measured result while moving away from the intended result. Keeping the terms separate helps because the fixes differ. Missing information calls for context. A gameable evaluator calls for independent evaluation. Most real agent failures contain some of both.</p>

<p>Finally, product context does not abolish the gap between a goal and its measure. Nothing does. It narrows the gap by making the goal available, so the test suite is not the only definition of success the agent can see.</p>

<p>The CoastRunners agent was not confused about the score. It understood the score more completely than the people who chose it. That is the warning for software. When an agent hands you a green suite, do not ask only whether the tests pass. Ask the question Goodhart's law has been asking for fifty years: what changed in the world, and what changed only in the number?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is Goodhart's law?</strong> Goodhart's law is the principle that a measure loses reliability when people or systems are rewarded for optimizing the measure itself. Charles Goodhart first described the mechanism in monetary policy in 1975. Marilyn Strathern later popularized the wording "When a measure becomes a target, it ceases to be a good measure." The measure may still rise, but its relationship to the underlying goal weakens.</p>

<p><strong>How does Goodhart's law apply to AI coding agents?</strong> A test suite begins as a measure of whether software works. When an agent can repeatedly inspect and optimize against the tests, passing them becomes the target. The agent may then produce an implementation that satisfies the visible assertions without satisfying the broader product goal, especially when it can hardcode cases, exploit fixtures, or alter the evaluator.</p>

<p><strong>Are tests useless for evaluating AI-generated code?</strong> No. Visible tests provide essential feedback, but they are weaker as final evidence after the agent has optimized against them. Held-out tests, composition tests, protected evaluation code, review of test changes, and checks against product requirements provide evidence the agent could not manufacture merely by targeting the visible suite.</p>

<p><strong>How do you prevent specification gaming by coding agents?</strong> Separate the goal from any single measure. Give the agent the product decision and constraint behind the task, restrict casual changes to evaluation code, keep important checks independent or held out, test how features compose, and review whether a green result reflects the intended user outcome. A product navigator like Brief supplies the intent that tests can check but cannot invent.</p>]]></content:encoded>
    </item>
    <item>
      <title>Gell-Mann amnesia</title>
      <link>https://usebrief.com/blog/gell-mann-amnesia/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/gell-mann-amnesia/</guid>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
      <description>The agent did not get more reliable on the second page. You lost the ability to catch it, and mistook that for the agent being right.</description>
      <content:encoded><![CDATA[<p>The writer Michael Crichton noticed something about how we read the newspaper, and named it, half as a joke, after the physicist Murray Gell-Mann. You open the paper to a story on a subject you happen to know cold. You see it is wrong. Not a little wrong, but backwards, the reporter has confused cause and effect, quoted the wrong number, missed the thing that actually mattered. You shake your head. Then you turn the page to a story about something you do not know, foreign policy, the economy, a court case, and you read it as though the paper had suddenly become reliable. You forget, in the turn of a page, what you just learned about the source.</p>

<h2 id="the-effect-and-why-it-is-so-hard-to-feel">The effect, and why it is so hard to feel</h2>

<p>Crichton called it the Gell-Mann amnesia effect, and the joke in the name was that Gell-Mann had little to do with it, the physicist's name just lent the idea a borrowed authority, which is itself a small demonstration of the point. The mechanics are simple and they are about you, not the newspaper. Your trust in a source is supposed to track how accurate the source is. Instead, it rises or falls with whether you catch an error, and catching one depends on how well you can check. Where you are an expert, you catch the errors and your trust drops. Where you are not, you cannot catch anything, so nothing lowers your trust, and you read on, reassured by the very silence that should worry you.</p>

<p>The source did not get more accurate when you turned the page. Your ability to audit it fell to zero, and that felt like reassurance. This is not a mistake careless people make. It is a mistake everyone makes, because there is no signal to warn you. Being unable to spot errors feels exactly like there being no errors.</p>

<h2 id="now-watch-yourself-review-your-agent">Now watch yourself review your agent</h2>

<p>A coding agent hands you a change in a part of the system you know well. You read it the way you read the newspaper story on your own subject. You see the off-by-one, the assumption that does not hold for your data, the helper it reinvented instead of reusing, the name that will mislead the next person. You fix it, maybe with a little amusement at how confidently wrong it was. Good. That is review working.</p>

<p>Then the same agent hands you a change in a corner you do not know well. The billing edge cases. The retry logic in a service you inherited. The infrastructure you touch twice a year. It reads fluently. It compiles. The tests, such as they are, pass. And you approve it, because nothing in it tripped an alarm.</p>

<p>But the agent did not get more careful on the second change. Its confidence was no different. Its odds of being subtly wrong were no lower, and in an unfamiliar, load-bearing corner they may well be higher. The only thing that changed was you, and specifically your ability to catch it, which fell to zero exactly the way it did when you turned the newspaper page. You just had a Gell-Mann amnesia moment, and the code went in.</p>

<h2 id="the-trap-is-that-trust-and-verification-point-opposite-ways">The trap is that trust and verification point opposite ways</h2>

<p>Here is the uncomfortable shape of it. The agent writes with roughly uniform fluency across your whole codebase, in your domain and outside it, in the parts that are well understood and the parts that are load-bearing and strange. Your ability to verify that code is the opposite of uniform: high where you are expert, and collapsing everywhere else.</p>

<p>So your trust, which rides on whether anything set off an alarm, ends up highest exactly where your ability to check is lowest. The places you wave through fastest are the places you understand least. That is not a risk at the margins. That is the center of the thing, and an agent that can touch every corner of the system in an afternoon turns it from an occasional lapse into a daily one.</p>

<h2 id="why-you-could-catch-it-at-all">Why you could catch it at all</h2>

<p>It is worth asking why you caught the error in your own domain, because the answer points at the fix. You caught it because you were holding context the agent did not have. You knew why the code needed to handle that case, what the number was supposed to be, which constraint was really binding. That knowledge is mostly <em><a href="https://usebrief.com/blog/tacit-knowledge/">tacit</a></em>, and it is exactly what the agent was missing when it reached for a <em><a href="https://usebrief.com/blog/ghost-decisions/">default that no one chose</a></em>. In your domain, you supplied the missing context yourself, at review time, out of your own head. That is why the review worked.</p>

<p>Outside your domain, you cannot supply it, because you do not have it either. It lives in someone else's head, or in a decision made three years ago, or nowhere at all. So the agent guesses, and you nod, and the guess ships, and it is <em><a href="https://usebrief.com/blog/principal-and-agent/">the information gap</a></em> doing its quiet work in the one place no human in the room can see it.</p>

<h2 id="the-fix-is-not-to-trust-less">The fix is not to trust less</h2>

<p>The obvious response is to trust the agent less and review harder. It does not work, and not only because you do not have the hours. Reviewing harder in a domain you do not understand does not manufacture the understanding. You can stare at the billing edge cases all afternoon and still not know which one your biggest customer depends on, because that fact was never yours to know. Vigilance cannot close a gap that is made of missing information.</p>

<p>What closes it is putting the missing context where the agent can use it, so the agent's work in the domains you cannot personally audit is anchored to your team's real decisions instead of the internet's average guess. That is the job Brief does. It is a product navigator: it holds the decisions your code cannot, the real constraint on the billing path, the real reason the retry logic is shaped the way it is, the real limit that a contract set, and it puts them in front of the agent at the fork. It does not ask you to become an expert in every corner before you are allowed to trust anything. It makes the agent's output in those corners deserve the trust you were going to extend anyway.</p>

<h2 id="why-the-enterprise-is-one-long-turned-page">Why the enterprise is one long turned page</h2>

<p>An enterprise is a stack of domains no single person understands end to end. Everyone is an expert in a narrow slice and a trusting amnesiac across the rest, and that has always been true. It was survivable when changes were slow and each one passed through the few people who did hold the relevant context. Now an agent writes across every slice at once, at a speed no chain of reviewers can gate, and each change lands in front of someone whose ability to check it is mostly a function of luck. The enterprise does not have a Gell-Mann amnesia problem occasionally. It is a Gell-Mann amnesia machine, and it just handed everyone a tool that fills every page at the same time.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>A few limits, because the effect is about calibration, not doom. I am not claiming the agent is usually wrong outside your domain. It is often right, the same way the newspaper is often right on the page you cannot check. The claim is narrower and stranger: your confidence rises or falls with whether you catch an error, and catching one depends on your ability to verify, not the agent's actual accuracy. So the two come apart precisely where it matters most, and you get no signal when they do. I am also not saying you should distrust everything, which is just paralysis wearing the costume of rigor. And Brief does not make the agent correct everywhere, nothing does. It makes the input right in the domains you cannot personally vet, which is where the amnesia bites, so that trusting the output is a reasonable bet instead of a blind one. The Gell-Mann framing is borrowed from newspapers, and what transfers is the mechanism, uniform fluency meeting uneven verification, not the specifics of journalism.</p>

<p>So the next time you approve a clean, confident change in a part of the system you do not really know, do not ask whether it looks right, because it will. Ask the question the amnesia is built to make you skip: if this were wrong, in this exact corner, is there anyone who would have caught it?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is Gell-Mann amnesia?</strong> It is the tendency to distrust a source on the subjects you know well, where you can catch its errors, and then trust the same source on subjects you do not know, where you cannot. The writer Michael Crichton named it, half-jokingly, after the physicist Murray Gell-Mann. The key point is that trust tends to stay highest where you are least able to check, because those are the places you are least likely to catch an error; that is not the same as the source being more reliable.</p>

<p><strong>How does Gell-Mann amnesia apply to AI coding agents?</strong> An agent writes with roughly uniform fluency and confidence across your whole codebase, but your ability to review it is high only in your areas of expertise and low everywhere else. So you catch its mistakes in the code you know and wave through its work in the code you do not, even though the agent was no more reliable there. Your trust ends up highest exactly where your ability to verify is lowest.</p>

<p><strong>Why not just review AI-generated code more carefully?</strong> Because vigilance cannot manufacture understanding you do not have. In a part of the system you do not know, reviewing harder will not tell you which edge case a major customer depends on or why a limit was set where it was, since that context was never yours. The gap is made of missing information, not missing effort, so the fix is to supply the information, not to stare longer.</p>

<p><strong>How do you make AI output trustworthy in areas you cannot personally check?</strong> By giving the agent the context those areas depend on, so its output is grounded in your team's real decisions rather than a plausible default. A product navigator like Brief holds those decisions, the real constraints, limits, and reasons behind unfamiliar parts of the system, and supplies them to the agent at the moment it would otherwise guess, so the work you cannot audit yourself is anchored to something real.</p>]]></content:encoded>
    </item>
    <item>
      <title>Tacit knowledge</title>
      <link>https://usebrief.com/blog/tacit-knowledge/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/tacit-knowledge/</guid>
      <pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
      <description>The reason your product context never reaches the agent is not that no one wrote it down. It is that the people who hold it know more than they can tell.</description>
      <content:encoded><![CDATA[<p>You can ride a bicycle. You cannot say how. The rule a balanced cyclist actually follows, adjust the curvature of your path in proportion to your imbalance and inversely to the square of your speed, is one the chemist and philosopher Michael Polanyi could write down and no rider has ever used. You keep your balance by knowing something you cannot state. Polanyi opened his 1966 book with the line that names the whole problem: we can know more than we can tell.</p>

<h2 id="the-knowledge-that-will-not-go-into-words">The knowledge that will not go into words</h2>

<p>Polanyi called it tacit knowledge, and once you have the idea you see it everywhere. You recognize a friend's face in a crowd of thousands and could not begin to describe the features you used. A doctor reads a chest film and sees pneumonia before she can list what tipped her off. A senior engineer looks at a design and says it will not scale, and the reasons arrive later, if at all. The knowing runs ahead of the telling, and some of it never catches up.</p>

<p>This is not the same as knowledge that merely has not been written down yet. That distinction is the whole point, and it is the one most people skip. Some knowledge is unwritten because nobody got around to it. Other knowledge is unwritten because it cannot be fully put into words at all, only demonstrated, watched, absorbed by working alongside someone. Polanyi's claim, the strong one, is that this second kind is not a gap in our documentation. It is a permanent feature of how expertise works.</p>

<p>Later writers gave the useful half a name. Ikujiro Nonaka called the act of turning tacit knowledge into explicit, statable form externalization, and treated it as one of the hardest and most valuable moves an organization makes. Not writing more down, but converting the kind of knowing that lived only in a person into something that can be shared. Most of what a company knows how to do has never made that trip.</p>

<h2 id="your-agent-only-ever-gets-the-explicit-half">Your agent only ever gets the explicit half</h2>

<p>Now think about what a coding agent can actually read. The code. The schema. The ticket. The comments, the docs, the tests. Every one of those is explicit knowledge, the part that already made it into words. The agent is, by construction, a reader of the explicit layer and nothing else.</p>

<p>But the decisions that matter are sitting in the tacit layer. Why the rate limit is forty a minute and not ten is not in the code, it is in the memory of the person who negotiated the contract. Why users are keyed by organization and not by email is not written anywhere, it is a scar from an incident three years ago. Why this one module is never touched without a review is understood by everyone on the team and recorded by no one. None of it reached the agent, and not because your team is lazy. It never got written down for the oldest reason there is: everyone who needed it already knew, so saying it out loud felt like <em><a href="https://usebrief.com/blog/common-knowledge/">stating the obvious</a></em>, right up until the person who needed it was a machine that had never sat in the room.</p>

<h2 id="the-documentation-illusion">The documentation illusion</h2>

<p>The reflex is to say we will just document it. And teams do have documentation, sometimes a great deal of it. But documentation captures the explicit residue of a decision, the what, and tends to lose the tacit reasoning that produced it, the why. The wiki says the limit is forty a minute. It does not carry the judgment that would tell you when forty is wrong. That judgment was tacit, and writing the number down did not externalize it, it just recorded the output.</p>

<p>So the agent reads the number, treats it as settled, and moves on, exactly as it treats every other value it finds. It cannot tell the difference between a number that encodes hard-won judgment and a number somebody typed as a placeholder, because the thing that would let it tell them apart never made it out of a human head. When it reaches a fork the documentation does not cover, it does the only thing it can. It fills the gap with a default, and the default is a <em><a href="https://usebrief.com/blog/ghost-decisions/">ghost decision</a></em> nobody made.</p>

<h2 id="why-this-is-the-deepest-version-of-the-context-gap">Why this is the deepest version of the context gap</h2>

<p>I have written before that a coding agent is a nearly perfect agent whose one remaining weakness is <em><a href="https://usebrief.com/blog/principal-and-agent/">information it cannot see</a></em>. Tacit knowledge is why that information is so hard to hand over. It is not sitting in a document waiting to be attached to the prompt. It is distributed across people, encoded in habits and instincts, and a good part of it has never existed in a form you could copy and paste at all.</p>

<p>That is also why the naive fix fails. You cannot dictate your entire organization into a text file, both because there is too much of it and because Polanyi is right that some of it will not go into words no matter how long you talk. The dream of writing everything down was tried, under the name knowledge management, and its signature failure was graveyards of stale wikis. The judgment that mattered stayed tacit and left when its owners did.</p>

<h2 id="why-the-enterprise-feels-it-most">Why the enterprise feels it most</h2>

<p>An enterprise is a deep reservoir of tacit knowledge. Decades of decisions, exceptions, and instincts live in the senior people who have been there longest, and almost none of it is written in a form an agent could use. It is also the place where that knowledge is most expensive to lose, because when one of those people leaves, the context walks out with them, and the enterprise has always half-known this without a way to fix it.</p>

<p>Now the same enterprise is pointing coding agents at the exact systems that tacit knowledge governs, and asking them to make the exact decisions that the knowledge exists to inform. Maximum tacit reserve, maximum turnover exposure, maximum number of agents now acting without any of it. The gap was always there. AI turned it into a daily cost.</p>

<h2 id="externalizing-the-decision-not-the-person">Externalizing the decision, not the person</h2>

<p>You cannot make all of it explicit, and you should stop trying. What you can do is externalize the small, load-bearing slice that decides an outcome at a fork. Not the whole of a senior engineer's judgment, which is hopeless, but the specific decision it produced: this limit, for this reason, under this constraint. That is a subset small enough to actually capture and exactly the part the agent needs.</p>

<p>That is the job Brief does. It is a product navigator: it catches the tacit decisions at the moment they are made, the real limit and the real reason, the identity rule and the incident behind it, the constraint and who it protects, and it holds them in explicit, queryable form so the agent can read them at the fork. It does not try to write down everything a person knows. It externalizes the decisions that would otherwise stay locked in a head, and it puts them where the machine that never sat in the room can finally see them.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>A few limits, because the idea is stronger than any tool built on it. Polanyi's claim is that a genuine tacit dimension is permanent, so I am not claiming Brief, or anything else, makes all tacit knowledge explicit. That is impossible by Polanyi's own argument, and most of a person's expertise will always stay tacit. The narrower claim is the useful one: the decision-level knowledge an agent needs at a specific fork, the value and the reason for it, is a small externalizable subset, and capturing it changes what the agent builds. I am also not claiming documentation is worthless. It handles explicit knowledge well. The gap is the conversion of tacit judgment into an explicit decision, which ordinary docs are not built to do and mostly do not. And externalizing a decision is not the same as transferring the full judgment behind it, only enough of it to change the next choice, which turns out to be enough.</p>

<p>So the next time you are tempted to fix the context problem by writing more down, ask the harder question first. Of everything your team knows that would change what your agent builds, how much of it has anyone ever actually managed to say?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is tacit knowledge?</strong> Tacit knowledge is knowledge you have but cannot fully put into words, only demonstrate or apply, like riding a bicycle or recognizing a face. The chemist and philosopher Michael Polanyi introduced the term and summarized it as "we can know more than we can tell." It is distinct from explicit knowledge, which has been stated in words, numbers, or code, and it is distinct from knowledge that is merely undocumented, because a genuinely tacit part resists being written down at all.</p>

<p><strong>Why does tacit knowledge matter for AI coding agents?</strong> Because a coding agent can only read explicit knowledge, the code, docs, schema, and ticket, while many of the decisions that matter live in the tacit knowledge of the team: why a limit is set where it is, why users are identified a certain way, why a module is off limits. That context never reached the agent, so it fills the gap with defaults and produces choices no one actually made.</p>

<p><strong>Can you just write all tacit knowledge down to give it to the agent?</strong> No, and trying is the classic failure. Polanyi's argument is that a real tacit dimension is permanent, so some expertise cannot be fully stated no matter how much you document. Past attempts to write everything down, under the banner of knowledge management, are best known for producing stale wikis while the judgment that mattered stayed tacit and left with the people who held it.</p>

<p><strong>How do you get tacit knowledge to a coding agent then?</strong> By externalizing the narrow, load-bearing slice rather than the whole. You do not capture all of a senior person's judgment, only the specific decisions it produces: this limit, for this reason, under this constraint. A product navigator like Brief exists to capture those decisions when they are made and hold them in explicit, queryable form, so the agent can read them at the moment it would otherwise guess.</p>]]></content:encoded>
    </item>
    <item>
      <title>Principal and agent</title>
      <link>https://usebrief.com/blog/principal-and-agent/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/principal-and-agent/</guid>
      <pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
      <description>You did not hire an employee. You entered the oldest studied problem in delegation, and the AI solved the half everyone feared while leaving the half no one watched.</description>
      <content:encoded><![CDATA[<p>When you hand a ticket to a coding agent, it feels like nothing happened, economically. You typed a sentence, and code came back. But you just stepped into a relationship that economists have studied for fifty years, the one that most of corporate governance exists to manage. You became a principal, and you hired an agent.</p>

<h2 id="the-oldest-problem-in-delegation">The oldest problem in delegation</h2>

<p>The principal-agent problem is one of the load-bearing ideas in modern economics. A principal wants something done. An agent does it on the principal's behalf. The catch is that the two are not the same party, and that gap is where the cost lives. Stephen Ross named the framing in 1973, and in 1976 Michael Jensen and William Meckling gave it a price: agency costs, the sum of what the principal spends to monitor the agent, what the agent spends to prove it is trustworthy, and the residual loss, the value that still evaporates because the agent is not the principal.</p>

<p>Economists split the problem into two failure modes, and the distinction is the whole point. The first is hidden action, or moral hazard: the agent does something you cannot observe, usually in its own interest. The manager who flies first class on the company card. The contractor who cuts a corner behind a wall you will never open. The second is hidden information: one side knows something the other does not, so the decision gets made on partial facts. Kenneth Arrow drew that line, and George Akerlof won a Nobel for showing, with nothing more than a used-car lot, how badly hidden information can break a market.</p>

<p>Almost all of the machinery you recognize exists to attack the first failure mode. Stock options, board oversight, audits, performance reviews, reporting lines. Align the agent's incentives with the principal's, then watch closely. In that machinery, incentives were the operational hard part, and information could mostly be assumed: a competent employee who wanted the right thing could usually go find out what the right thing was.</p>

<h2 id="the-ai-solved-the-wrong-half">The AI solved the wrong half</h2>

<p>Now look at your coding agent through that lens. It does not shirk. It has no private interest of the kind an employee does, no company card, no corner it is tempted to cut to get home earlier. Point it at a task and it works the task, tirelessly, at three in the morning, exactly as hard on your least favorite ticket as on your favorite. On the axis that all that governance machinery was built to defend, the axis of incentives, the AI agent is close to the perfect agent. The moral hazard that governance was built to police nearly disappears, and the one incentive-shaped failure that survives, which I come back to at the end, is not the reason your code is full of unasked choices.</p>

<p>So people conclude that delegating to AI is the easy kind of delegation. The expensive problem got solved. And they are half right. The incentive half did get solved. But agency costs were never only about incentives. They were about incentives and information, and when you remove one, you do not remove the other. You just promote it to almost the entire bill.</p>

<p>Here is the part that is easy to miss. In the textbook, the agent is the one who knows more. The contractor understands the wiring and you do not. With an AI agent it runs the other way. You are the one who knows more. You know this service runs on three machines, that your users sit behind one corporate gateway, that a signed contract promises a specific throughput. The agent knows none of it, because none of it is in the code it can read. The information asymmetry did not go away when the incentives aligned. It reversed, and it widened, because a human agent could at least walk over and ask.</p>

<h2 id="every-default-is-residual-loss">Every default is residual loss</h2>

<p>When the agent hits a decision it has no information to make, it does not stop. It fills the gap with the most common answer in its training, the default, and moves on. Those are the <em><a href="https://usebrief.com/blog/ghost-decisions/">ghost decisions</a></em> I wrote about earlier, and the reason <em><a href="https://usebrief.com/blog/the-default-answer/">three runs of one model converge</a></em> on the same choices: they are all reaching for the same average in the absence of your specifics. Every one of those choices is residual loss in Jensen and Meckling's sense, value that leaks away not because the agent did wrong, but because the agent did not know.</p>

<p>That reframes what a good outcome even looks like. Monitoring solves moral hazard, so we reach for it by reflex: review the diff, add a gate, watch more closely. But watching an agent that is working faithfully on the wrong facts only buys you a faster, cleaner arrival at the wrong place. You cannot inspect your way to information the agent never had. The residual loss was decided at the fork, before the code you are reviewing existed.</p>

<h2 id="why-the-enterprise-feels-it-most">Why the enterprise feels it most</h2>

<p>This is why the problem bites hardest in an enterprise, and why the framing matters there most. An enterprise is, more than anything, a machine for managing agency costs. It has spent decades building the monitoring and reporting and governance that keep thousands of human agents pointed the right way. None of that apparatus was built for information asymmetry aimed at a tireless agent that will act on a guess without ever mentioning that it guessed.</p>

<p>The enterprise also happens to hold the most unobservable context of any kind of organization, the deepest pile of contracts, constraints, and hard-won exceptions, which is exactly the information the agent cannot see. Maximum context, minimum observability, an agent that never pauses to ask. That is the worst possible shape for this specific cost, and it is the shape every large company is now standing in.</p>

<h2 id="aligning-the-agent-on-the-axis-that-still-costs-you">Aligning the agent on the axis that still costs you</h2>

<p>If the residual cost is now overwhelmingly information, then the fix is not a smarter model or tighter oversight. The fix is to close the information asymmetry at the moment of the decision. That is the job Brief does. It is a product navigator: it holds the decisions and constraints your code cannot, the real rate limit your contract requires, the real way your users are identified, the real scale you run at, and it puts them in front of the agent at the fork, before the guess. It does for information what stock options did for incentives. It aligns the agent with the principal on the one axis that, for an AI, actually still costs you money.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>A few limits, because the mapping is a tool, not a proof. I am leaning on one half of the principal-agent problem, the information half, and I am not claiming the incentive half maps cleanly. AI does have an incentive-shaped failure, specification gaming, where an agent optimizes the measure it is graded on, a green test suite, rather than the goal you meant. That is real, and it deserves its own post, but it is not this one, and even an agent with none of it still has the information gap. I am also using the framework by analogy: an AI is not a self-interested economic actor, and the classic direction of the asymmetry is reversed here, principal over agent rather than agent over principal. What the analogy buys is not rigor imported wholesale. It is the right place to look. Fifty years of work says the cost of delegation splits into incentives and information. The AI collapsed one column. The vocabulary tells you to go read the other, and that is precisely where your defaults are hiding.</p>

<p>So the next time an agent turns your one sentence into a hundred lines that just work, do not ask whether you can trust it to try. On that question it may be the most reliable agent you have ever had. Ask the older question, the one economics has been asking since long before any of this: an agent working faithfully on only what it can see, how much of what it needs can it actually see?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is the principal-agent problem?</strong> It is the economic problem that arises whenever one party, the principal, delegates work to another party, the agent, whose knowledge or interests differ from the principal's. Named by Stephen Ross in 1973 and priced by Michael Jensen and William Meckling in 1976 as agency costs, it splits into two failure modes: hidden action, where the agent does something unobservable in its own interest, and hidden information, where one side decides on facts the other cannot see.</p>

<p><strong>Does the principal-agent problem apply to AI coding agents?</strong> Partly, and the useful insight is which part. The classic incentive failure, moral hazard, mostly recedes: an AI agent does not shirk or pursue a private interest, so it is close to a perfect agent on the axis governance was built to defend. It does have one incentive-shaped failure of its own, specification gaming, where it optimizes the metric it is graded on rather than the goal you meant. Set that aside and the information failure mode is what remains, and it accounts for most of the cost of delegating to AI.</p>

<p><strong>If an AI agent has little competing self-interest, why is delegating to it still costly?</strong> Because agency costs come from incentives and information, and removing most of the incentive problem leaves information as the dominant cost. The agent acts on what it can read in the code, which does not include your architecture, your customers, or your contracts. Every decision it makes without that context is residual loss: value lost not because the agent did wrong, but because it did not know.</p>

<p><strong>How do you reduce the information asymmetry between you and a coding agent?</strong> Not by monitoring, which addresses incentives, not information. You reduce it by putting the principal's context in front of the agent at the moment it makes a decision: the real constraints, the real requirements, the real scale. A product navigator like Brief exists to hold that context and supply it at the fork, before the agent falls back to a default.</p>]]></content:encoded>
    </item>
    <item>
      <title>The default answer</title>
      <link>https://usebrief.com/blog/the-default-answer/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/the-default-answer/</guid>
      <pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
      <description>I expected three runs of one model to diverge. They agreed almost perfectly, and the agreement turned out to be the more unsettling part.</description>
      <content:encoded><![CDATA[<p>I ran a small experiment. I took a tiny web service, a single file with one endpoint that saves a message, and I gave the same coding model, Claude Opus 4.8, the exact same ticket three separate times in three fresh runs, word for word: "Add rate limiting to the POST /api/messages endpoint so it can't be spammed." Same code, same sentence, same model, three independent runs. Here is the entire starting file the model was handed:</p>

<pre role="region" aria-label="Code sample, js" data-lang="js" tabindex="0"><code class="language-js">import express from 'express'
const app = express()
app.use(express.json())

const messages = []

app.post('/api/messages', (req, res) =&gt; {
  const { text, author } = req.body
  if (!text) return res.status(400).json({ error: 'text is required' })
  const message = { id: messages.length + 1, text, author: author ?? 'anon', at: Date.now() }
  messages.push(message)
  res.status(201).json(message)
})

app.get('/api/messages', (req, res) =&gt; res.json(messages))

app.listen(3000, () =&gt; console.log('up on 3000'))</code></pre>

<p>Then I read what each of the three runs produced.</p>

<p>Two things came back, and they point in opposite directions.</p>

<h2 id="one-sentence-twelve-decisions">One sentence, twelve decisions</h2>

<p>Every run produced working code. And every run, to produce it, made twelve choices that the ticket never mentioned. The count comes from asking each run to log the choices it made, so read it as the model's own account rather than an independent audit; all three named the same twelve. Not typos or style, but real product decisions, each with consequences someone will eventually feel:</p>

<ul><li><strong>How many requests are too many.</strong> All three picked ten per minute. There is nothing in the ticket that implies ten. It is a number pulled from the air, and it is a business policy decision wearing the costume of a technical default.</li><li><strong>What counts as one user.</strong> All three decided a "user" is an IP address. That quietly punishes everyone sharing an office or a coffee shop network, who now share one bucket, and it does almost nothing against a real attacker who rotates addresses.</li><li><strong>Where the count is stored.</strong> All three kept it in memory, inside the one running process. The moment this service runs on two machines instead of one, the limit silently stops working, because neither machine can see the other's count.</li><li><strong>What a proxy is allowed to say.</strong> All three assumed exactly one load balancer sits in front of the app. If that assumption is wrong in either direction, the limit either collapses every user into one bucket or lets anyone forge their identity and walk through it.</li></ul>

<p>That is four. The other eight, from the runs' own logs: the rate-limiting library itself, the algorithm behind it, the status code returned when limited, the shape of the error body, which HTTP headers to send, whether a rejected request still counts against the limit, whether health checks are exempt, and whether any of these values are configurable. Twelve choices, every one absent from the ticket, every one now in the code, decided by no one, waiting.</p>

<h2 id="i-expected-them-to-disagree">I expected them to disagree</h2>

<p>Here is the part I did not expect. I assumed that even three runs of one model would scatter, that the randomness in these systems would push the choices apart, and that the scatter would be the story: look how arbitrary each pick is.</p>

<p>They barely varied. All three reached for the same library, <code>express-rate-limit</code>, and inside it the same ten-per-minute, the same IP as identity, the same in-memory store, the same single-proxy assumption. Across the three runs the only real difference was the wording of one error string. If I had shown you the three files side by side, you would have called it consensus.</p>

<p>And that is the more unsettling result, because agreement is far more dangerous here than disagreement would have been.</p>

<h2 id="agreement-launders-a-guess-into-a-decision">Agreement launders a guess into a decision</h2>

<p>If the three runs had contradicted each other, you would have noticed. Three different answers to the same question is a flashing light that says <em>this was never specified, somebody needs to choose.</em> You would have stopped and made the call.</p>

<p>Uniformity removes the flashing light. When every agent, and every teammate who has seen the pattern before, produces the same ten-per-minute IP-based limiter, it stops looking like a guess and starts looking like the obvious right answer. It reads as settled. But nothing was settled. The model reached, every time, for the most common shape in everything it was trained on, and the most common shape is not the same thing as the correct one for your service. A default still has every consequence of a decision; it is just <a href="https://usebrief.com/blog/ghost-decisions/">a decision with the person removed</a>, and the uniformity dresses it back up as a real one, because everyone reaches for it.</p>

<h2 id="the-default-is-right-for-the-average-and-you-are-not-the-average">The default is right for the average, and you are not the average</h2>

<p>The reason the runs agree is that the internet's average answer really is a fine answer for the average service. Ten requests a minute, keyed by IP, held in memory, is genuinely reasonable for a small single-box app with anonymous users.</p>

<p>The trouble is that the whole point of your product is the ways it is not average. You run on more than one process, so in-memory is quietly broken for you. Your users sit behind a corporate gateway, so IP is the wrong identity for you. You signed a contract that promises a specific throughput, so ten-per-minute is not a guess you get to make. The agent cannot know any of that, because none of it is in the code it can read. It lives in your context: your architecture, your customers, your commitments. So the agent does the only thing it can. It gives you the default answer, confidently, three times in a row, and the confidence is the trap.</p>

<h2 id="giving-the-agent-your-answer-instead-of-the-internet-s">Giving the agent your answer instead of the internet's</h2>

<p>This is the gap Brief is built to close, and I will put it plainly. Brief is a product navigator: it holds the decisions your code cannot, the real rate limit your contract requires, the real way your users are identified, the real scale you run at, and it puts them in front of the agent at the moment it reaches the fork. The agent stops guessing the average and starts building your specific, deliberately-not-average system, because for the first time the answer that is actually yours is written somewhere it can read. For an enterprise this is the sharpest version of the problem, because an enterprise is the least average thing there is, a pile of contracts and constraints and hard-won exceptions, and it is precisely there that a confident default does the most damage.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>A few limits, stated plainly, because a claim you cannot check is not worth much. This was three runs of a single model, Claude Opus 4.8, on one small task. Three runs of one model will agree more than three different models, or three different people, would, so the near-identical output is partly expected: treat the convergence as a floor on how much these choices can vary, not a measurement of it. I am not claiming that all AI agents always converge, nor that ten-per-minute or IP-keying is wrong in general; for the average small service they are fine. The load-bearing finding is the one that does not lean on any of that: a single one-sentence ticket forced twelve consequential decisions that nobody specified, and that holds for one run as surely as for three. The twelve are the ones each run logged when I asked it to, so the count is the model's own account of its choices rather than an independent diff of the output; treat it as a floor, because an open prompt to list its own decisions surfaces the ones the model noticed making, not necessarily every one, so the true number is at least as likely to be higher as exact. What is genuinely stronger than it may read as: all three runs logged the same twelve and agreed on every one but the wording of a single error string. The starting code above is the exact input, and the ticket is quoted verbatim wherever it appears.</p>

<p>So the next time an agent hands you a clean green diff that just works, and it looks like the obvious right answer because it is the same answer you have seen a hundred times, ask the small question that the agreement is designed to make you skip. Whose answer is this, yours or the internet's?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is the experiment described here?</strong> I gave one coding model, Claude Opus 4.8, the identical ticket "Add rate limiting to the POST /api/messages endpoint so it can't be spammed" three separate times, against an identical small codebase, then compared what each run produced. The point was to see how many decisions an under-specified ticket forces the model to make on its own, and how much the runs varied.</p>

<p><strong>What did the experiment find?</strong> Each run made twelve decisions the ticket never specified, from the numeric limit to how a user is identified to where state is stored. The three runs also converged on nearly identical choices, differing only in the wording of an error string. Because these are runs of one model, that convergence is partly expected; the twelve unspecified decisions per run is the finding that does not depend on it.</p>

<p><strong>Why is uniform AI output a problem rather than a reassurance?</strong> Because variation is a visible signal that something was never specified and needs a human decision, while uniformity hides that signal. When every run, and every teammate reaching for the same tool, produces the same default, the choice starts to look settled and correct, even though nobody actually decided it and the default may be wrong for your specific system.</p>

<p><strong>Why do coding agents pick defaults that are wrong for a specific product?</strong> Because a default is the most common answer in the agent's training data, which is right for the average system but not for the ways your system is deliberately different, such as running on multiple servers, serving users behind shared networks, or meeting a contractual requirement. That distinguishing context lives outside the code, so the agent cannot see it and falls back to the average.</p>]]></content:encoded>
    </item>
    <item>
      <title>The whole product</title>
      <link>https://usebrief.com/blog/the-whole-product/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/the-whole-product/</guid>
      <pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
      <description>The first team proves your product is useful. The next team proves it is whole.</description>
      <content:encoded><![CDATA[<p>A product leader at a top-ten European telecom asked us a question that sounded simple:</p>

<p>"Can we recover what was decided six months ago, even if everyone involved has moved on?"</p>

<p>It is exactly the kind of question <a href="https://usebrief.com/">Brief</a> is meant to answer.</p>

<p>The decision probably exists somewhere. Part of it may be in a roadmap, part in a ticket, part in a meeting transcript, and part in the memory of someone who has since joined another team.</p>

<p>Brief connects that scattered context so people and agents can understand what the company decided, why it decided it, and whether the decision is still current.</p>

<p>In a demo, that is the moment the product clicks.</p>

<p>Then the conversation moves toward deployment.</p>

<p>Can Brief retrieve context from our self-hosted GitLab?</p>

<p>Will it preserve the permissions attached to the original information?</p>

<p>Can it operate within our data-residency requirements?</p>

<p>Will an answer show its sources?</p>

<p>Can an engineer receive the context inside the tool where work is happening?</p>

<p>How will we know whether any of this reduced rework?</p>

<p>These can look like secondary enterprise requirements surrounding the interesting part of the product.</p>

<p>They are actually the rest of the original problem.</p>

<p>A decision that cannot reach the right person is not usable context. An answer without provenance cannot be trusted. Context that ignores permissions cannot be deployed. Information delivered after implementation cannot prevent the wrong thing from being built.</p>

<p>The customer did not ask for a system that could find old decisions in a demo.</p>

<p>They asked for organizational judgment that could survive time, team changes, and execution.</p>

<p>Geoffrey Moore gives us a useful way to name this gap in <a href="https://geoffreyamoore.com/book/crossing-the-chasm/">Crossing the Chasm</a>.</p>

<p>The capability at the center is the generic product.</p>

<p>The customer needs the whole product.</p>

<h2 id="four-versions-of-the-product">Four versions of the product</h2>

<p>Moore describes the product as a series of concentric layers.</p>

<p>The <strong>generic product</strong> is what the company ships. It is the capability named in the product description and demonstrated during the sales process.</p>

<p>The <strong>expected product</strong> is the minimum configuration the customer assumes will accompany that capability.</p>

<p>The <strong>augmented product</strong> adds the surrounding capabilities required to maximize the customer's chance of achieving the desired result.</p>

<p>The <strong>potential product</strong> contains the future extensions that could make the product useful in more situations.</p>

<p>The practical lesson is easy to miss.</p>

<p>Customers do not experience these as four separate products. They experience one outcome that either happens or does not.</p>

<p>For Brief, retrieving a decision is part of the generic product.</p>

<p>The customer's expected product includes access to the systems where decisions live, a way to tell current decisions from obsolete ones, and an answer that points back to its sources.</p>

<p>The augmented product may include enterprise permissions, governance, deployment controls, and a way to measure whether better context changed how work was executed.</p>

<p>The potential product extends that judgment across more teams, systems, and agents.</p>

<p>The layers should not be interpreted as an invitation to build everything.</p>

<p>They reveal the distance between what the vendor ships and what the customer must be able to accomplish.</p>

<p>For Brief, the capability is context retrieval.</p>

<p>The outcome is continuity of judgment.</p>

<p>The whole product is what carries one into the other.</p>

<h2 id="why-the-first-team-can-mislead-you">Why the first team can mislead you</h2>

<p>Moore's chasm separates early adopters, who will buy into a vision and help make it real, from pragmatists, who want to see a complete solution working for customers like them.</p>

<p>Inside an enterprise, that chasm can run through a single account.</p>

<p>The first team behaves like an early adopter. The next team behaves like a pragmatist.</p>

<p>Product-led growth is often described as a sequence of individual actions:</p>

<p>Sign up. Experience value. Invite a teammate. Upgrade.</p>

<p>That sequence works when one person can obtain the product's value independently.</p>

<p>Enterprise products operate inside an existing organization. Their value depends on information, workflows, permissions, and decisions owned by many people.</p>

<p>The first team can hide this complexity.</p>

<p>An enthusiastic product manager knows which roadmap is current. They recognize an outdated decision when it appears. They explain the product to every new user. They copy missing context into the system and tell engineers which answers can be trusted.</p>

<p>Their effort completes the product.</p>

<p>The team appears to be using a whole product because the champion is manually supplying the missing layers.</p>

<p>This is valuable during discovery. It becomes dangerous when interpreted as readiness to expand.</p>

<p>The next team may use different tools. It may not share the same vocabulary. Its manager may interpret the company strategy differently. Its engineers may not know which decisions are still binding.</p>

<p>The champion's private scaffolding disappears.</p>

<p>The first team can run on heroics. Enterprise expansion cannot.</p>

<h2 id="activation-happens-when-context-survives-a-handoff">Activation happens when context survives a handoff</h2>

<p>A top-ten North American bank organizes engineering work across several tiers.</p>

<p>One group explores and de-risks an idea. Another industrializes it. A third may eventually operate the production system.</p>

<p>Each handoff compresses the original context.</p>

<p>The team receiving the work sees the selected approach. It may not see the alternatives that were rejected, the customer need that created the work, or the constraint that made one compromise acceptable.</p>

<p>A junior engineer sees a ticket.</p>

<p>A coding agent sees a prompt.</p>

<p>Neither automatically sees the product judgment behind them.</p>

<p>If Brief helps the first group record its rationale but the second group cannot receive and use that rationale, the company has created a better archive. It has not preserved intent.</p>

<p>The outcome occurs when the decision survives the handoff and changes what the receiving team does.</p>

<p>That gives enterprise software a more demanding definition of activation.</p>

<p>Activation is not simply the first successful search.</p>

<p>It is not the first generated answer.</p>

<p>It is the first time the right context reaches a person or agent early enough to prevent a wrong turn.</p>

<p>Once that outcome can be repeated across teams, the product can expand.</p>

<h2 id="the-integration-is-part-of-the-promise">The integration is part of the promise</h2>

<p>Another enterprise customer, a global data and analytics company, described a different version of the same problem.</p>

<p>Its product managers repeatedly recontextualize work for engineers, executives, and sales. The information already exists, but every audience needs a different path through it.</p>

<p>The company works across Microsoft Teams, SharePoint, Office 365, Jira, and Pendo.</p>

<p>A product that only understands Slack would miss the environment where this recontextualization happens.</p>

<p>The Teams or SharePoint connector is therefore more than an integration request. It determines whether the product can produce the promised outcome.</p>

<p>The same is true of self-hosted GitLab for the telecom. The decisions governing implementation may be attached to issues, merge requests, and repositories inside that system. A product without access to those sources can answer some questions, but it cannot reliably preserve the chain from decision to execution.</p>

<p>This does not make every connector equally important.</p>

<p>An integration belongs in the whole product when it performs at least one essential job:</p>

<ul><li>It contains authoritative context.</li><li>It is where the customer makes decisions.</li><li>It is where people or agents act on those decisions.</li><li>It carries permissions the product must preserve.</li><li>It provides evidence that the desired outcome occurred.</li></ul>

<p>This is a better test than counting feature requests.</p>

<p>A connector requested by one customer may complete the product for an entire market. A connector requested by ten customers may add convenience without changing whether they succeed.</p>

<p>The question is not how many customers asked.</p>

<p>The question is whether the product's promise remains incomplete without it.</p>

<h2 id="the-next-team-is-the-real-activation-event">The next team is the real activation event</h2>

<p>Enterprise product-led growth does not eliminate sales, security reviews, or procurement.</p>

<p>It changes what gives those functions leverage.</p>

<p>A champion who merely likes the product has an opinion.</p>

<p>A champion whose team avoided rework, recovered a critical decision, or helped an agent implement the right behavior has evidence.</p>

<p>That evidence makes the next conversation easier.</p>

<p>The product-led loop inside an enterprise looks like this:</p>

<ol><li>One team uses Brief during real product and engineering work.</li><li>The relevant decisions reach people and agents inside their workflows.</li><li>The team can point to work that moved faster or avoided a wrong turn.</li><li>The champion uses that result to earn trust from an adjacent team.</li><li>The product reproduces the outcome without requiring the champion to reconstruct it manually.</li></ol>

<p>One Brief account expanded from 10 seats to 56.</p>

<p>The important event was not the purchase of 46 additional seats. It was the product becoming useful beyond the original group.</p>

<p>Seat expansion recorded the result. Repeatability caused it.</p>

<p>This is the enterprise version of product-led growth. The product gives the internal champion something concrete to carry across the organization.</p>

<p>Sales helps the evidence travel. The product creates the evidence.</p>

<h2 id="build-the-smallest-complete-promise">Build the smallest complete promise</h2>

<p>The whole-product model can easily become an excuse for roadmap sprawl.</p>

<p>A team hears that enterprise customers need integrations, governance, analytics, onboarding, regional hosting, and support. It begins constructing a generic enterprise checklist.</p>

<p>The result is usually a wide product with no clear promise at its center.</p>

<p>The better approach is to choose a narrow beachhead and make one outcome complete.</p>

<p>For Brief, the beachhead might be one product and engineering pod using coding agents on active work.</p>

<p>The desired outcome could be reducing implementation mistakes caused by missing or outdated product decisions.</p>

<p>That promise immediately establishes what the minimum whole product needs:</p>

<ul><li>Access to the authoritative sources used by that pod.</li><li>A way to distinguish current decisions from superseded ones.</li><li>Provenance so an engineer can inspect the underlying evidence.</li><li>Existing access controls applied to retrieved context.</li><li>Delivery inside the coding agent's workflow.</li><li>A runnable way to check whether implementation followed the relevant decisions.</li></ul>

<p>Each element follows directly from the outcome.</p>

<p>A new connector belongs when the pod's authoritative context lives behind it. An executive dashboard belongs when it is necessary to prove the result and earn the next deployment. A feature that does not help the pod achieve or demonstrate the outcome can wait.</p>

<p>This also creates a useful product discipline.</p>

<p>Do not ask, "What would make us look enterprise-ready?"</p>

<p>Ask, "What is preventing this customer from completing the job they already chose us to do?"</p>

<p>The first question produces a checklist.</p>

<p>The second produces a whole product.</p>

<h2 id="coding-agents-make-the-gap-wider">Coding agents make the gap wider</h2>

<p>The distinction between capability and outcome becomes more important as companies adopt coding agents.</p>

<p>An agent can generate a working implementation from an incomplete prompt. That is precisely what makes missing context dangerous.</p>

<p>The code may compile. The tests may pass. The implementation may still violate a customer commitment, repeat a rejected approach, or optimize for a metric the company no longer prioritizes.</p>

<p>More capable agents increase the amount of work a team can produce before discovering that the work was pointed in the wrong direction.</p>

<p>The required product is therefore larger than a search box for company knowledge.</p>

<p>Context must be current, relevant, permitted, sourced, and available at the moment of action. It must survive when people change teams. It must be expressed in a form an agent can use without forcing every engineer to become a product historian.</p>

<p>That is the standard <a href="https://usebrief.com/">Brief</a> has to meet.</p>

<p>Brief's role is to make organizational judgment reusable at execution time. Connectors, permissions, decision history, provenance, and agent delivery all follow from that role.</p>

<p>They are not a separate enterprise story surrounding the product.</p>

<p>They are how the product keeps its original promise.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>The whole-product model does not mean startups should build every integration or satisfy every large customer.</p>

<p>It means the company should understand the complete outcome promised to a deliberately chosen customer.</p>

<p>Some gaps can be filled manually while learning. Early adopters are valuable because they reveal those gaps.</p>

<p>The important thing is to notice who keeps filling them.</p>

<p>If a founder, champion, or solutions engineer repeatedly performs the same missing work, that work may belong in the product.</p>

<p>If the work changes completely for every customer and does not strengthen the central outcome, it may belong in services. It may also be evidence that the market is too broad.</p>

<p>The model also does not require an organization-wide launch.</p>

<p>One team is enough to begin.</p>

<p>That team should be narrow enough to support closely and important enough to produce credible evidence. Expansion follows when the product can reproduce the outcome for the next team without reproducing all the manual effort.</p>

<p>The generic product can answer:</p>

<p>"What did we decide six months ago?"</p>

<p>The whole product ensures that the answer is current, permitted, sourced, delivered inside the workflow, and capable of changing what gets built.</p>

<p>The first team proves the answer is useful.</p>

<p>The next team proves the product is whole.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is a whole product?</strong> The whole product is the complete set of capabilities and surrounding conditions a customer needs to achieve the promised outcome. It includes the core capability as well as any necessary integrations, controls, services, and evidence.</p>

<p><strong>How does the whole product relate to product-led growth?</strong> The core product creates initial pull. The whole product makes its value repeatable across teams. In enterprise PLG, that repeatability turns one successful deployment into account expansion.</p>

<p><strong>Does enterprise product-led growth still require sales?</strong> Usually. Sales helps navigate procurement, security, executive alignment, and expansion. The motion remains product-led when demonstrated product value creates the conviction required to adopt it elsewhere.</p>

<p><strong>How should a startup decide what belongs in its whole product?</strong> Choose a narrow customer and one promised outcome. Identify what prevents that customer from achieving the outcome in its actual environment. Build the smallest set of missing pieces that closes that gap.</p>

<p><strong>Are enterprise integrations part of the product?</strong> They are when the promised outcome depends on them. If authoritative context lives in GitLab, Jira, Teams, or SharePoint, reaching those systems may be essential to the product rather than an optional addition.</p>]]></content:encoded>
    </item>
    <item>
      <title>Chesterton's fence</title>
      <link>https://usebrief.com/blog/chestertons-fence/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/chestertons-fence/</guid>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
      <description>Not seeing a reason is not the same as there being no reason, and the gap between those two is where most expensive mistakes live.</description>
      <content:encoded><![CDATA[<p>There is a fence across a road. Nobody is around who remembers building it, and standing there looking at it, you cannot think of a single reason it should exist.</p>

<p>G.K. Chesterton put the case in <em><a href="https://www.chesterton.org/taking-a-fence-down/">The Thing</a></em> in 1929. The modern reformer, he wrote, goes up to the fence and says "I don't see the use of this; let us clear it away." And the more intelligent reformer answers: "If you don't see the use of it, I certainly won't let you clear it away. Go away and think. Then, when you can come back and tell me that you do see the use of it, I may allow you to destroy it."</p>

<p>Most people remember this as an argument for caution, which is a shame, because it is something much more precise than that. It is a claim about <strong>where the burden of proof sits.</strong> Chesterton is not saying the fence is probably useful. He is saying that your inability to see its purpose is a fact about you before it is a fact about the fence. It is evidence of something, but far weaker evidence than people act on, because the reasons fences exist are exactly the kind that do not announce themselves to a passerby.</p>

<h2 id="the-third-option-is-the-whole-point">The third option is the whole point</h2>

<p>Notice what the answer is not. It is not "leave the fence alone," which would make you a cargo cult, preserving everything anyone ever built because you are afraid of it. It is also not "clear it away," which is the confident version of the same ignorance.</p>

<p>The answer is <strong>go find out.</strong> There are three moves available and almost everyone argues about two of them. Keep, remove, or <em>understand, and then decide.</em> Chesterton's reformer is allowed to destroy the fence. He just has to earn it first, and what earns it is being able to state the reason the fence exists and why that reason no longer holds.</p>

<p>Which sets up the uncomfortable corollary. If you go and find out, and the answer is genuinely unrecoverable, that is not a green light. It is a bill arriving. Somebody built a thing for a reason and never wrote the reason down, and you are now paying for it in the only currency available: you either keep something you do not understand, or you remove something and find out the hard way.</p>

<h2 id="the-economics-just-changed">The economics just changed</h2>

<p>Here is why this old parable is suddenly load bearing rather than merely wise.</p>

<p>For most of software's history, removing a fence was expensive. You had to find the code, understand the blast radius, make the change carefully, test it, ship it. That cost was itself a speed bump, and the speed bump did some of the thinking for you. It was often easier to leave a mysterious thing alone than to remove it, so mysterious things survived by default.</p>

<p>That is over. Removing a fence is now close to free. An agent will delete the retry wrapper, collapse the special case, simplify the odd conditional and hand you a clean green diff in seconds, and the diff will look like an unambiguous improvement, because on every dimension visible in the repository it is one. The code is shorter, the tests pass, the complexity went down.</p>

<p><strong>But understanding the fence has not gotten cheaper at all.</strong> It still costs the same forty-five minutes of asking around, or the same trawl through four years of pull requests, or it is simply impossible because the person who knew has left. Deletion got radically cheaper; archaeology barely moved. So the ratio between "how easy is it to remove this" and "how easy is it to learn why it is here" has quietly inverted, and everything Chesterton warned about now happens at machine speed and at a scale where nobody is watching any individual fence go down.</p>

<h2 id="green-tests-are-not-an-explanation">Green tests are not an explanation</h2>

<p>The obvious objection is that we have a safety net now. If the tests pass, the fence was not load bearing.</p>

<p>That confuses two different things. A test encodes a behavior somebody thought to write down. The reason a fence exists frequently lives nowhere near the code: it is a clause in a contract with your largest customer, a compliance requirement in one market, a lesson from an incident three years ago that produced a retry policy and no comment explaining it. None of that is expressible in a test suite unless somebody already knew it and chose to encode it, and if they had known and cared enough to encode it, the fence would not be mysterious in the first place.</p>

<p>Passing tests tell you the code still does what the code said it did. They cannot tell you that you have not just removed the only thing standing between you and a contractual obligation nobody in the room has heard of.</p>

<h2 id="the-sign-on-the-fence">The sign on the fence</h2>

<p>The fix is not to slow down deletion. Slowing down is the cargo cult again, and the whole value of cheap removal is real; most fences genuinely are obsolete and clearing them is how a system stays alive.</p>

<p>The fix is to make the <em>finding out</em> as cheap as the removing. A decision, recorded at the moment it is made, with the reason attached, is a sign on the fence. It turns Chesterton's expensive archaeology into a two second lookup, and in doing so it converts the whole dilemma into something ordinary: you read why the fence is there, you see that the customer who needed it churned in 2024, and you take it down with confidence. The record is not what stops you from deleting. It is what lets you delete safely and fast.</p>

<p>This is the work Brief does, and I will put it plainly. Brief is a product navigator: it holds the decisions and the reasons behind them, and puts them in front of the person or the agent standing at the fence with a shovel. For enterprises this is the sharper problem, because they are the ones who have accreted the most fences and lost the most of the people who built them; the visible symptom is not usually a broken system, it is paralysis, an organization that cannot safely remove anything and therefore carries every constraint it has ever created, forever.</p>

<p>None of this says every fence deserves to stand. Most do not. Chesterton's rule is not conservative; it is procedural, and it is satisfied the moment you can say why the thing exists. The only position it forbids is the one that has become the cheapest and most common: removing something because you personally cannot see the point of it.</p>

<p>So the next time a diff deletes something odd and the tests go green, the question is not whether it still works. Ask the older one. Do you know why it was there?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is Chesterton's fence?</strong> It is a principle from G.K. Chesterton's 1929 book <em>The Thing</em>: if you come across a fence across a road and cannot see why it is there, you should not remove it until you can explain why it was built. The point is about burden of proof, not caution. Your inability to see a purpose is a fact about your knowledge before it is a fact about the fence, so it is far weaker evidence than it feels, and certainly not proof that no purpose exists.</p>

<p><strong>Does Chesterton's fence mean you should never remove old code or constraints?</strong> No, and that is the most common misreading. The principle explicitly allows removal; it just requires you to understand the original reason first and be able to say why it no longer applies. Keeping everything you do not understand is its own failure mode, a cargo cult. The rule creates a third option between keep and remove: go find out, then decide.</p>

<p><strong>If the tests pass after deleting something, was it safe to delete?</strong> Not necessarily. Tests encode behaviors somebody thought to write down, while the reason a constraint exists often lives outside the code entirely, in a customer contract, a regulation, or a lesson from an old incident. Green tests confirm the code still does what the code described; they cannot confirm you have not removed something load bearing for a reason that was never encoded.</p>

<p><strong>Why is Chesterton's fence more relevant with AI coding agents?</strong> Because the two halves of the problem changed at different rates. Removing a constraint has become nearly free and instant, while learning why it exists still costs the same conversation or archive dig, or is impossible if the person who knew has left. That widening gap means the cheapest available action is now exactly the one the principle warns against, executed faster and across more of the system than before.</p>]]></content:encoded>
    </item>
    <item>
      <title>Survivorship bias</title>
      <link>https://usebrief.com/blog/survivorship-bias/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/survivorship-bias/</guid>
      <pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
      <description>The most important data point is almost always the one that is missing, and it is missing for the exact reason that makes it matter.</description>
      <content:encoded><![CDATA[<p>In the Second World War, American bombers came home from raids over Europe covered in bullet holes, and the holes were not spread evenly. They clustered on the wings and the fuselage; the engines were comparatively clean. The obvious move is to add armor where the damage is: reinforce the wings.</p>

<p>The statistician Abraham Wald, working with Columbia's Statistical Research Group, showed why that is exactly backwards. Armor the engines, the places with almost no holes. His reasoning is one of those things that rearranges how you see once you hear it. The planes being measured were the ones that came back. A bomber could take a barrage through the wings and still limp home, which is exactly why the wings of the returning planes were full of holes. A bomber hit in the engine did not come home, so it was never in the data. The clean spots on the survivors were not the safe places. They were the fatal ones, marked by their absence.</p>

<p>That is <a href="https://en.wikipedia.org/wiki/Survivorship_bias">survivorship bias</a>, and Wald's version is the sharpest ever stated: <strong>you are studying only the things that made it through, so the most important evidence is the evidence that is missing, and it is missing for the very reason that makes it matter.</strong></p>

<h2 id="your-analytics-are-a-plane-that-came-back">Your analytics are a plane that came back</h2>

<p>Now look at where your product decisions come from. They come from your data: the funnels, the retention curves, the feature usage, the session recordings, the survey responses. Every one of those is a measurement of the users who are still here. The dashboard is a returning bomber.</p>

<p>The users the missing feature would have served are not underrepresented in that data. They are absent from it. The person who hit your signup, saw that you did not do the one thing they needed, and left, is in no cohort. The enterprise buyer whose security requirement you did not meet never became an account. The segment you quietly decided not to support generates no tickets, because they are not your users. They are the planes that went down over the target, and your analytics, by construction, cannot see them. The bullet holes that would tell you the most are in the parts of the market that never came back.</p>

<h2 id="optimizing-harder-armors-the-wings">Optimizing harder armors the wings</h2>

<p>Here is why this is getting more dangerous, not less. The whole promise of a data-driven, and now AI-driven, product practice is to fit your decisions ever more tightly to what the numbers say. Feed a year of product analytics to an agent and ask it what to build, and it will do a genuinely excellent job of finding what your current users want more of. It will optimize the funnel that exists, deepen the features that survivors already use, and smooth the path that retained people already walk.</p>

<p>Which is to say it will armor the wings, perfectly. A better model fit to a survivor sample is a better-reinforced wing. The more faithfully you optimize the data you have, the more completely you entrench the shape of who already stayed, and the more invisible the people you are losing become, because nothing about optimizing survivors ever surfaces the ones who left. You cannot A/B test your way to a segment that is not in the test. You can only get there by knowing it is missing.</p>

<h2 id="the-missing-bullet-holes-live-outside-the-data">The missing bullet holes live outside the data</h2>

<p>So where is the equivalent of Wald's insight? It is in the knowledge that never makes it into the analytics in the first place: why the last five enterprise deals actually died, the requirement you keep hearing in sales calls and keep deferring, the segment you made a deliberate decision not to serve and the reason you made it, the churn interview where someone told you the real thing. None of that is a row in a table. It lives in people's heads, in a lost-deal note, in a decision someone made once and did not write down. It is precisely the product context that your dashboards are structurally incapable of holding, which is exactly why it is the context that matters.</p>

<p>This is the work Brief exists to do, and I will say it directly: Brief is a product navigator, the layer that holds the decisions and the losses your analytics cannot, why you are not serving a segment, what killed a deal, which requirement you keep hearing and have not built, and puts that knowledge in front of the people and the agents making product calls, next to the data rather than lost behind it. For an enterprise the missing population is enormous, an entire funnel's worth of people a large company has already lost across dozens of teams and years, almost none of it written anywhere a decision can reach. Feasibility they can buy; the survivors they can measure. The planes that went down are the ones no one is looking at, and they decide the war.</p>

<p>None of this means the data is useless. Survivors carry real signal, and you should absolutely optimize for the people you have. The one thing the data can never do is tell you what is not in it. That part you have to know on purpose, and put somewhere the decision can find it.</p>

<p>So before you reinforce the wings again, ask the question Wald asked. Where are the bullet holes you are not seeing, and what did they cost you before you ever knew they were there?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is survivorship bias?</strong> It is the error of drawing conclusions from only the people or things that made it through some selection, while ignoring those that did not, precisely because they left no trace. The classic example is Abraham Wald's WWII analysis of returning bombers: the planes that came back showed damage on the wings, but the vulnerable spot was the engines, because planes hit there never returned to be counted. The missing data was the most important data.</p>

<p><strong>How does survivorship bias affect product analytics?</strong> Every standard product metric, retention, feature usage, funnels, surveys, measures the users who are still present. The people a missing feature would have served have already churned or never converted, so they appear in no cohort and no dashboard. Decisions made purely from the data therefore optimize for the users who stayed and stay blind to the ones who were lost, which are often the larger and more valuable population.</p>

<p><strong>Why does AI or data-driven product work make survivorship bias worse?</strong> Because those methods fit decisions more tightly to the data you have, and the data you have is made of survivors. An agent asked what to build from a year of analytics will excellently deepen what current users like and cannot surface the segments that are absent from the sample. Optimizing a biased dataset more precisely entrenches the bias rather than correcting it.</p>

<p><strong>How do you correct for survivorship bias in product decisions?</strong> You cannot recover the missing users from the data itself; you have to supply the knowledge deliberately. Capture why deals were lost, why users churned, and which segments you chose not to serve and why, and make that context available next to the analytics, so the people and agents making product calls can weigh what is missing and not only what remained.</p>]]></content:encoded>
    </item>
    <item>
      <title>Four risks</title>
      <link>https://usebrief.com/blog/four-risks/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/four-risks/</guid>
      <pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate>
      <description>The question that dominated software for twenty years, can we build it, is the one your agent just answered. It was never the only question. It was one of four.</description>
      <content:encoded><![CDATA[<p>For most of the history of software, the hardest question in the room was "can we build it?" Feasibility ate the schedule, the budget, and the arguments. So it is easy to miss that feasibility was never the only question. It was one of four, and the other three are the ones that quietly decide whether a product works at all.</p>

<p>The framework is Marty Cagan's, from decades of product work at Silicon Valley Product Group, and it is worth knowing exactly, because it is a better map of building than most teams carry in their heads.</p>

<h2 id="the-four-big-risks">The four big risks</h2>

<p class="dl-intro">Every product idea faces <a href="https://www.svpg.com/four-big-risks/">four risks</a>, and a serious team tries to kill all four before it commits a single engineer to delivery:</p>

<dl><div><dt>Value</dt><dd>Will anyone actually want this? Will a customer buy it, or a user choose it over the alternative, including the alternative of doing nothing?</dd></div><div><dt>Usability</dt><dd>Can people figure out how to use it? Not "is it possible to use," but will a real person, distracted and impatient, succeed?</dd></div><div><dt>Feasibility</dt><dd>Can we build it, with the time, the skills, and the technology we actually have?</dd></div><div><dt>Viability</dt><dd>Does it work for the <em>business</em>? For sales, marketing, finance, legal, support, and the brand. A feature can be wanted, usable, and buildable, and still sink you on pricing, or compliance, or a support cost nobody modeled.</dd></div></dl>

<p>A detail worth keeping, because it is the whole point in miniature: Cagan's early work listed only three, valuable, usable, feasible. He added viability later, because leaving it implicit let teams build things customers loved that the business could not survive. The number of risks you can name is the resolution at which you can see failure coming.</p>

<h2 id="your-agent-has-mastered-exactly-one-of-them">Your agent has mastered exactly one of them</h2>

<p>Here is the part that makes this the most useful framework to hold right now. A modern coding agent is, genuinely and impressively, a feasibility machine. The question that used to dominate every project, can this be built in the time we have, is falling away for a widening class of work. That is not a small thing. It is the hardest-won of the four, and it is being handed to us.</p>

<p>But feasibility is one of four, and to the other three the agent is mostly blind. Not because it is weak. Value and viability are simply not in the code, and neither is the part of usability that actually decides outcomes: an agent can build a technically usable interface, accessible and responsive, and still have no way to know whether the flow matches the mental model a real person shows up with, or the job they are trying to get done. What the other three risks turn on lives outside the repository: who the customer is, the alternative they will pick if you disappoint them, the contract your biggest account signed, the margin the business needs, the regulation in the next market. None of that is recoverable from the repository, at any model size, because it was never written there. So an agent left to itself builds the thing <em>right</em> and has no way to know whether it is the <em>right thing</em>. It answers the one question it can see, perfectly, and cannot even perceive the three that decide the outcome.</p>

<h2 id="the-bottleneck-just-moved">The bottleneck just moved</h2>

<p>Follow that where it leads. When feasibility was scarce, it was the bottleneck, so it got the attention, the tooling, the best people. Now that feasibility is becoming abundant, the constraint moves to the other three, the way a constraint tends to move to whatever you have not automated. The scarce thing in 2026 is not the ability to build. It is knowing what is worth building and whether the business can carry it, and getting those answers to the thing doing the building.</p>

<p>That reframes what product intelligence even is. For twenty years it was a tax on velocity: discovery slowed you down before engineering could start. Now it is the opposite. The agent removed the wait. What is left is almost entirely value, usability, and viability, which means the product knowledge that used to live quietly in a few senior heads is no longer a supporting function. It is the input that determines whether all that cheap feasibility produces something real or just produces something.</p>

<h2 id="democratizing-the-part-that-was-never-written-down">Democratizing the part that was never written down</h2>

<p>The good news is that this knowledge is not mystical. The four risks are teachable, and the answers to them for <em>your</em> product, the value your customers actually get, the jobs they hire you for, the viability constraints the business runs under, are knowable and writable. They just usually are not written. They sit in the head of the person who made the call, in a decision nobody recorded, in the reasoning behind a constraint that looks arbitrary until you know the account it protects.</p>

<p>This is exactly the gap Brief exists to close, and I will be plain about it rather than coy. Brief is a product navigator: the layer that holds your product's answers to value, usability, and viability, the decisions and context that a coding agent cannot infer, and hands them to the agent at the moment it builds, so it produces the right thing and not merely a working thing. For enterprises the case is sharpest, because their product intelligence is the most valuable and the most scattered, spread across dozens of teams, thousands of decisions, and years of hard-won constraints that no single engineer, and certainly no single agent, can hold in one head. Feasibility they can now buy. The other three risks are theirs to know, and the only question is whether that knowledge reaches the machine that is doing the building.</p>

<p>None of this asks the agent to do product discovery for you. The four risks still take human judgment; a model cannot decide what your business should value. What it can do, once feasibility is cheap, is act faithfully on the value, usability, and viability answers you already have, if you make them explicit and put them where the work happens.</p>

<p>So here is the question worth sitting with. Your team can increasingly build almost anything it decides to. Does the thing doing the building know the other three quarters of the job?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What are the four big risks in product?</strong> Value, usability, feasibility, and business viability, a framework from Marty Cagan and the Silicon Valley Product Group. Value asks whether anyone will want or choose the product; usability asks whether they can figure out how to use it; feasibility asks whether it can be built with the available time and technology; viability asks whether it works for the business across sales, finance, legal, and support. Good product discovery tries to retire all four before engineering commits to building.</p>

<p><strong>Why can't an AI coding agent assess product value?</strong> Because value is not present in the code. It depends on who the customer is, the job they are trying to accomplish, and the alternatives they would otherwise choose, none of which the agent can read from a repository, no matter how capable the model. The agent can judge feasibility, which lives in the code and the tooling, and it can build the mechanics of a usable interface; what it cannot judge is value, business viability, and whether the design actually fits the user, all of which depend on product context that has to be supplied.</p>

<p><strong>If AI handles feasibility, what is left for product teams?</strong> Nearly everything that determines whether a product succeeds. As feasibility becomes cheap, the constraint moves to the other three risks, so the work shifts from "can we build it" to "do we know what is worth building and whether the business can carry it, and can we get those answers to the agent." Product intelligence stops being a tax on velocity and becomes the main input.</p>

<p><strong>What is business viability risk?</strong> The risk that a product works for customers but not for your own company: it violates a regulation, undercuts your pricing, creates an unsustainable support burden, conflicts with sales incentives, or damages the brand. It is the risk teams most often forget, which is why Cagan made it explicit rather than folding it into value, and it is almost entirely invisible in the code.</p>]]></content:encoded>
    </item>
    <item>
      <title>Common knowledge</title>
      <link>https://usebrief.com/blog/common-knowledge/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/common-knowledge/</guid>
      <pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate>
      <description>The child who said the emperor was naked told nobody anything they did not already know. That is the whole point, and it is the most useful distinction I know.</description>
      <content:encoded><![CDATA[<p>A crowd watches a naked emperor walk past. Every adult can see. Not one of them says a word. A child says it out loud, and the spell breaks.</p>

<p>Notice what the child did not do. The child did not inform anyone. Every person there had already seen the emperor perfectly well; the announcement carried, in the strict sense, zero information. And it changed everything.</p>

<p>The gap between a fact everyone knows and a fact everyone knows that everyone knows is one of the most useful distinctions I have ever been handed, and most people are never handed it. It has a precise name and a real formal history.</p>

<h2 id="two-kinds-of-knowing">Two kinds of knowing</h2>

<p><strong>Mutual knowledge:</strong> everyone knows p.</p>

<p><strong>Common knowledge:</strong> everyone knows p, and everyone knows that everyone knows p, and everyone knows that everyone knows that everyone knows p, and so on, without end.</p>

<p>That infinite tower looks like philosophical showing off. It is not. The <a href="https://plato.stanford.edu/entries/common-knowledge/">first full analysis</a> came from David Lewis in his 1969 monograph <em>Convention</em>, and Robert Aumann gave it a mathematical formulation in his 1976 paper <em>Agreeing to Disagree</em>. The tower is load bearing, and the reason is coordination.</p>

<p>You will not act on what you know unless you are confident that others will act too. Consider a crowd that privately despises a regime. Everyone hates it. Everyone knows they hate it. Nobody moves, because moving alone is suicide, and each person needs to know not just that the others agree but that the others know that everyone agrees. Then someone gathers them in a public square, and a fact that was already in every single head becomes something else: it becomes common. Now the crowd moves. Nothing was learned. Everything changed.</p>

<p>That is the thesis of Michael Chwe's <em><a href="https://press.princeton.edu/books/paperback/9780691158280/rational-ritual">Rational Ritual</a></em> (2001), which reads public ceremonies, from rallies to inaugurations to weddings, as machines for manufacturing common knowledge. They work not because they transmit meaning from a stage out to each person, but because they let each person see what everyone else is seeing.</p>

<p>So publicity is not primarily about informing people. It is about making knowledge common, which is what lets people count on each other.</p>

<h2 id="your-decisions-are-mutual-not-common">Your decisions are mutual, not common</h2>

<p>Here is where it earns its keep.</p>

<p>Most of what your team has decided is mutual knowledge. The five people in the room know you chose the boring database over the interesting one, and they know why. Ask any one of them and they will tell you correctly. And yet, reliably:</p>

<ul><li>Someone quietly does the other thing next month, and they are not being difficult. Nothing ever told them the choice was settled rather than one person's preference.</li><li>The same question comes back next quarter and gets argued from scratch, with the same people, reaching the same conclusion, at full price.</li><li>Someone joins and inherits none of it, because there was nothing to inherit.</li><li>Nobody can point at anything, so the tie gets broken by whoever is most senior in the room that day.</li></ul>

<p>None of that is a memory failure. Everyone remembers fine. It is a coordination failure. The decision never became common knowledge, so nobody could count on anybody else honoring it, so it never bound anyone to anything. It was an impression that several people happened to share.</p>

<h2 id="the-worst-reason-not-to-write-it-down">The worst reason not to write it down</h2>

<p>Which brings us to the trap, and it is a good one, because the objection is true.</p>

<p>"We all already know that."</p>

<p>Yes. You do. That is exactly why the record is necessary, and exactly why it feels like busywork. Writing the decision down gives no new information to anybody who was in the room. Its value was never informational. It is epistemic: it is the thing that converts mutual knowledge into common knowledge, so that everyone knows that everyone knows, and the choice can finally be relied on, defected from, inherited, or pointed at. The written decision is the child saying it out loud.</p>

<p>Be precise about what does the work, though, because writing alone does not do it. A decision in somebody's private notes, or in the fourth of nine documents nobody agrees is the real one, is not common knowledge. It is mutual knowledge with extra steps. What creates common knowledge is publicity in Chwe's sense: one place everyone knows about and knows that everyone else knows about. The record has to sit somewhere you can be sure the others are looking too. Otherwise you have written a note to yourself.</p>

<p>A decision that lives in five heads is not a decision. It is five people with the same impression, and an impression binds nobody, because no one of them can be sure the other four are still holding it.</p>

<p>We built Brief so that a team's decisions become common knowledge instead of a shared impression, for the people who have to honor them and, increasingly, for the agents that read them. But the distinction is older than any of that, and it is yours to use anywhere: in a contract, a launch, a negotiation, a marriage.</p>

<p>So the question worth asking about your last important call is not whether people know about it. Everyone probably does. Ask the sharper one instead. Does everyone know that everyone knows?</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is the difference between mutual knowledge and common knowledge?</strong> Mutual knowledge means everyone knows a fact. Common knowledge means everyone knows it, everyone knows that everyone knows it, and so on without end. The distinction was analyzed by David Lewis in <em>Convention</em> (1969) and formalized mathematically by Robert Aumann in <em>Agreeing to Disagree</em> (1976). It matters because coordination depends on the higher levels: people act on a shared fact only when they can count on others acting on it too.</p>

<p><strong>Why does writing down a decision everyone already knows change anything?</strong> Because the record adds no information and that was never its job. It converts mutual knowledge into common knowledge. Once the choice is stated where everyone can see that everyone can see it, it can be relied on, inherited by people who were not there, and pointed at when someone departs from it. Before that it is only a shared impression, and an impression cannot bind anyone.</p>

<p><strong>Why do teams keep re-litigating decisions they already made?</strong> Usually not because anyone forgot. Everyone typically remembers the conclusion. What is missing is the common knowledge that it was settled, so each person is individually unsure whether the others still consider it binding, and the cheapest way to resolve that uncertainty is to have the argument again.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ghost decisions</title>
      <link>https://usebrief.com/blog/ghost-decisions/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/ghost-decisions/</guid>
      <pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate>
      <description>The agent did not make a mistake. It made a decision, one of thousands, that no one asked it to make and no one will remember, because no one made it.</description>
      <content:encoded><![CDATA[<p>In April 2026, Google's CEO said <a href="https://www.fastcompany.com/91531519/google-ceo-says-75-of-the-companys-code-is-ai-generated">75 percent of the company's new code is now AI-generated</a> and approved by engineers, up from 50 percent last fall, and framed it as a move to agentic workflows, with engineers increasingly orchestrating fleets of autonomous agents rather than writing the code themselves. Sit with the mechanics of that for a second. Every one of those agents, generating every one of those files, arrived at hundreds of forks: which library, which retry policy, which data shape, which error to swallow and which to surface, which of two reasonable patterns to follow. At each fork it chose. Almost none of those choices was a decision anyone made.</p>

<p>That is the thing worth naming, because it is becoming a large and rising part of how new code is written and it does not have a name. Call it a ghost decision: a choice that governs your system's behavior, selected by an agent picking the most probable option, that no authorized person decided and that was never recorded as a decision. It exists in effect but not in fact. Your codebase is filling with them, faster every quarter, and the reason they are dangerous is precisely that they do not look like anything at all.</p>

<h2 id="the-default-is-a-decision">The default is a decision</h2>

<p>Start from what the agent actually does. A language model generates the most probable continuation given its context. At a fork with two defensible options, it does not weigh them against your situation; it emits the one that was more common in training. That is not a flaw, it is the mechanism working as designed. But notice what it means. The modal choice is not the right choice. It is the average choice, the one the rest of the industry happened to make most often. When the agent resolves a fork, it resolves it toward the population mean.</p>

<p>Now compare that to what happened when a person wrote the same line. Even the small forks, the ones nobody would write a document about, were resolved by a human carrying context: this codebase uses that pattern, this customer needs that guarantee, we got burned by this once. Most of those were tiny, implicit decisions, but they were decisions, made by someone who knew something the population average did not. The agent replaces that carrier of context with a frequency count. Multiply by the hundreds of forks in a file and the tens of thousands in a service, and you have quietly swapped your judgment for the training distribution's, one invisible choice at a time.</p>

<p>The word decision is load bearing here, so let me be precise. A decision is a choice made by someone with the standing and the context to make it. A default accepted silently by a probability maximizer is a choice, and it has all the consequences of a decision, but it lacks the two things that make a decision a decision: an author and a rationale. It is a decision with the person removed. That is the ghost.</p>

<h2 id="why-you-cannot-see-them">Why you cannot see them</h2>

<p>A real decision leaves a trace. Someone argued for it in a pull request, or wrote it in a doc, or at minimum still remembers making it, so when it turns out to be wrong you can find the decision, find the reasoning, and revise it. A ghost decision leaves only the code. And code is a record of what, never of why: it shows the retry policy that shipped, not the three that were rejected, not the reason, not the constraint that should have governed the choice and did not. You cannot review a decision that was never surfaced as one. You cannot grep for a choice nobody flagged. The ghost is invisible not because it is hidden but because there was never anything there to hide.</p>

<p>It gets worse, because the code is inconsistently read at best. Sonar's <a href="https://www.sonarsource.com/blog/state-of-code-developer-survey-report-the-current-reality-of-ai-coding/">State of Code survey</a> in early 2026 found that AI already writes or assists 42 percent of committed code, that 96 percent of developers do not fully trust it is correct, and that only 48 percent always check it before committing. In other words, half of developers admit they do not always check generated code before it ships. And do not be reassured that the code is approved by engineers, in Google's phrase: approving a generated diff is a verdict on the output as a whole, not a decision on each of the thousands of forks inside it, and it is exactly that shallow whole-diff pass the trust-but-verify numbers describe. So the ghost decisions are not merely unrecorded, they are often only partially examined. They enter the system at machine speed and stay, because the reviewer who might have turned a ghost back into a real decision, by noticing it and asking why, does not always see it.</p>

<h2 id="the-drift-is-in-the-aggregate">The drift is in the aggregate</h2>

<p>No single ghost decision looks wrong. Each one is the reasonable default, the thing a competent stranger would also have picked, which is exactly why it passes review on the rare occasion it is reviewed. The cost does not live in any one of them. It lives in the sum.</p>

<p>Your architecture is the accumulation of these choices, and a large and rising share of it is now being shaped by code written with or by AI: more than 40 percent of new code across the industry, and 75 percent at the frontier. So the system drifts, steadily and invisibly, toward the average of everything the model was trained on, while the specific reasons your system was supposed to differ from that average go unhonored. The drift surfaces only at collisions: the moment a ghost decision meets a real constraint it never knew about, a customer contract, a compliance rule, a hard-won lesson from an incident three years ago. Then it shows up as the worst kind of bug, the kind that runs, passes its tests, reads cleanly, and violates something that mattered, and when you ask why the code does this, the honest answer is that no one decided it should. A probability maximizer did, at a fork, months ago, and moved on.</p>

<h2 id="most-defaults-should-stay-defaults">Most defaults should stay defaults</h2>

<p>Here is the nuance that keeps this from being an argument for reviewing every line, which would be its own dystopia. Most forks genuinely do not matter. The modal choice is fine the overwhelming majority of the time, and forcing a human to ratify every variable name and every loop would tax the work to a standstill and defeat the entire point of the agent. The problem is not that agents pick defaults. The problem is that there is no boundary between the forks where the default is fine and the forks that encode a constraint you already decided, and so the agent defaults on both. It cannot tell the difference, because the difference lives in information the agent does not have: which of these thousand choices is one your organization already made on purpose.</p>

<p>That reframes the whole thing. The goal is not to eliminate ghost decisions, it is to make sure the agent never ghosts a fork you have actually decided. Everywhere else, let it default in peace.</p>

<h2 id="turning-the-ghost-back-into-a-choice">Turning the ghost back into a choice</h2>

<p>If the difference between a ghost and a governed choice is an author and a rationale, then the fix is to put your real decisions where the agent meets the fork, so that when a choice is one you have already made, the agent defers to the decision instead of reaching for the average, and when it is not, it defaults as before. A recorded decision is the thing that resolves a fork on your terms rather than the population's. It is also, not incidentally, the only way to ever see the ghosts: the gap between the decisions you have made and the forks the agent is quietly resolving is the map of where your architecture is being written by no one. This is a different job from remembering what the agent believes it did, which is <a href="https://usebrief.com/blog/agents-store-beliefs-not-decisions/">its own unreliable problem</a>, and a different job from catching violations after the fact, which is <a href="https://usebrief.com/blog/cant-review-your-way-out-of-context-problem/">inspection arriving too late</a>. It is the job of deciding, on purpose, before the fork, and having that decision be present when the agent gets there.</p>

<p>We built Brief to be where those decisions live, so the agent reads them at the fork and you can see which forks are still unowned. But the naming survives without us, and it is the part that matters: as AI shapes a large and rising share of new code, the question was never whether agents make your decisions for you. They already do, thousands of times a day. The only open question is whether you can tell which ones.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>It does not claim agent defaults are usually wrong. They are usually fine, which is what makes the exceptions so hard to catch. It does not claim you should review every generated line; the argument is the opposite, that blanket review is the wrong tool and a smaller set of governing decisions is the right one. And it does not claim recording decisions is free; it is real work, and the honest version of this only asks you to do it for the forks that actually encode a constraint, not for all of them. The load-bearing claim is narrow: a choice made by a probability maximizer with no author and no rationale is a decision with the deciding removed; these choices accumulate wherever agents are allowed to resolve forks; and the ones that collide with a real constraint are invisible until they break, unless the decision existed before the fork did.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is a ghost decision?</strong> It is a choice that shapes your system's behavior, made by an AI agent selecting the most probable option at a fork, that no authorized person actually decided and that was never recorded as a decision. It has the consequences of a decision but neither of the things that make one accountable: an author and a rationale. Because it leaves only code behind, and code records what rather than why, a ghost decision cannot be reviewed or revised the way a real decision can.</p>

<p><strong>Why does my AI agent keep choosing patterns we do not use?</strong> Because it resolves each fork toward the most common option in its training data, not toward your codebase's specific conventions or constraints, which it usually cannot see. The pattern it picks is the industry average, and where your team deliberately does something different, the agent has no way to know that the difference was a decision rather than an accident, so it defaults to the average and quietly overwrites your choice.</p>

<p><strong>Isn't it fine for the agent to pick sensible defaults?</strong> Almost always, yes, and that is the point of using it. The trouble is only at the forks that encode a constraint you already decided on purpose, a customer commitment, a compliance rule, a lesson from an incident. The agent cannot distinguish those from the thousands of forks where the default is harmless, so without your decisions present it defaults on both, including the ones you would never have defaulted on.</p>

<p><strong>How is this different from technical debt?</strong> Technical debt is a shortcut someone chose knowingly and could, in principle, point to and explain. A ghost decision has no one to point to; it was never chosen by a person at all. Debt is a decision you can find and pay down. A ghost is a decision that was never made, which is why it is harder to detect and impossible to attribute after the fact.</p>

<p><strong>How do you stop agents from making decisions no one approved?</strong> Not by reviewing every line, which does not scale and misses the point. You make your real decisions available to the agent at the moment it reaches the relevant fork, so it defers to a decision where one exists and defaults freely everywhere else. That requires the decisions to be recorded, current, and retrievable at generation time, which also gives you the one view that otherwise does not exist: which forks your team has actually decided, and which are still being resolved by no one.</p>]]></content:encoded>
    </item>
    <item>
      <title>Productivity is not value</title>
      <link>https://usebrief.com/blog/ai-value-attribution-gap/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/ai-value-attribution-gap/</guid>
      <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
      <description>Your engineers say AI made them faster. Your board wants to know where that shows up in the business. The honest answer is that you cannot see it, and the reason is not your dashboard.</description>
      <content:encoded><![CDATA[<p>Two numbers are sitting on desks across the enterprise this quarter and they do not agree. The first is the AI bill, which is the largest it has ever been and still climbing. The second is the answer to a simple board question: what did we get for it. In <a href="https://www.harness.io/press-and-news/ai-has-outpaced-how-engineering-organizations-measure-developer-productivity">Harness's 2026 State of Engineering Excellence survey</a> of around 700 engineering practitioners and managers, 89 percent said their current metrics accurately reflect AI's impact, and in almost the same breath 94 percent admitted the factors that actually matter, including tech debt, validation time, and developer burnout, are missing from those metrics. Proving ROI to leadership was named one of the single biggest challenges. They believe they are measuring AI, and they know they are not measuring the part that counts.</p>

<p>The consequences are already visible and they are not subtle. Uber <a href="https://techcrunch.com/2026/06/02/uber-caps-employee-ai-spending-after-blowing-through-budget-in-four-months/">burned through its entire 2026 AI budget in four months</a> and started capping per-employee spend. Starbucks <a href="https://fortune.com/2026/05/28/starbucks-quietly-retired-ai-inventory-agent-barista-complaints-hallucinations/">retired an AI inventory system after nine months</a> because it miscounted the shelves it was built to count. These are not stories about weak models. They are stories about organizations that could not connect what the AI was doing to what the business needed, and found out late.</p>

<h2 id="the-value-attribution-gap">The value attribution gap</h2>

<p>Here is the gap, named so we can stop talking around it. <strong>You can measure AI output. You cannot attribute that output to business outcomes.</strong> Lines of code, pull requests, tickets closed, tokens spent: all trivially countable, all going up. Whether any of it advanced the thing your company is actually trying to do: uninstrumented. So the dashboard fills with green while the honest answer to "is this working" stays "we cannot tell," and the two coexist without anyone lying. That is the value attribution gap, and no amount of additional output closes it, because output was never the missing measurement.</p>

<p>It is worth being precise about why the two halves diverge, because the instinct is to treat it as a reporting problem that a better dashboard will fix. It is not. Output becomes value only when it is the right output, meaning the work advanced a decision the business actually made: a strategy, a constraint, a commitment to a customer. An agent generates the most probable work given what it can see, and what it can see is the codebase and the ticket, not the reasons behind them. So it produces volume against inferred intent. Some of that volume happens to serve a real decision and becomes value. Much of it serves a plausible guess and becomes activity. From the outside the two are indistinguishable, which is exactly why you cannot measure the difference: nothing recorded which decision each unit of work was meant to serve.</p>

<h2 id="both-failures-this-quarter-were-the-same-failure">Both failures this quarter were the same failure</h2>

<p>Look at Starbucks and the measurement gap together and they stop being two problems. The inventory agent was measured on a proxy, whether it produced counts, and it produced counts enthusiastically. What went unmeasured was whether those counts served the operational decision they existed for, keeping the right things in stock. It optimized the visible output and quietly failed the outcome, and because the outcome was not instrumented, the failure showed up in barista complaints months later rather than in a metric on day one.</p>

<p>That is the same shape as the boardroom question. When work is not tied to the decision it was supposed to serve, you can watch the output climb and still have no read on whether the business moved. The enterprise version is just slower and more expensive, because it is distributed across every team using an agent, and the lag between "output looks great" and "this did not land" is a quarter instead of a shift.</p>

<h2 id="why-a-dashboard-cannot-close-it">Why a dashboard cannot close it</h2>

<p>The reflex, once leadership starts asking, is to buy measurement: an AI ROI tool, a productivity analytics layer, another panel. Vendors are already shipping exactly this. It will not close the gap, and the reason is structural. Attribution is a reconciliation. To connect a unit of work to a business outcome, both sides have to be recorded and something has to link them: the work, and the decision it served. The output side exists in abundance; every tool emits it. The other side, the decision the work was meant to serve, mostly does not exist as a record at all. It lives in a head, a thread, a call that happened once. You cannot reconcile against a record that was never kept. A dashboard built on one side of that reconciliation produces confident charts of the half you have, which is precisely the 89-versus-94 result: leaders measuring output accurately and outcomes not at all.</p>

<p>This is the deeper reason the <a href="https://usebrief.com/blog/hidden-cost-of-context-less-ai-development/">cost of context-less development</a> shows up as unmeasurable rather than merely large. The waste and the blindness have one root. The agent that cannot see the decision builds the wrong thing, and the organization that never recorded the decision cannot see that it did. You are paying for both halves of the same missing object.</p>

<h2 id="what-the-missing-measurement-actually-is">What the missing measurement actually is</h2>

<p>If attribution is a reconciliation and one side of it was never recorded, the fix is not a better view of the side you have. It is to make the missing side real: capture the decisions, constraints, and commitments the work is supposed to serve, as durable records with enough structure that a piece of work can point at the one it advanced. Do that and two things become true at once that executives usually treat as separate asks. The agent conditions on the actual decision before it generates, so more of its output is the right output rather than a plausible guess. And every unit of work carries the decision it served, so for the first time the output and the outcome sit in the same ledger and the reconciliation resolves. Alignment and measurement turn out to be the same investment seen from two ends: you cannot measure whether work served the strategy until the strategy is written down in the form the work can reference, and once it is, the agent can reference it too.</p>

<p>We built Brief to be that record, the governed layer of decisions an agent reads before it builds and a business reads to see what the building was for. But the conclusion does not depend on us. The enterprises that will answer the board's question next quarter are not the ones with the most AI output or the fanciest ROI dashboard. They are the ones that wrote down what they decided, so that for once the work and the outcome are talking about the same thing.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>It does not claim measurement fixes strategy. If the underlying decision was wrong, attributing work to it faithfully will only tell you sooner, which is the point, not a flaw. It does not claim every outcome is cleanly attributable; some value is diffuse and some is luck, and honest measurement includes wide error bars. And it does not claim AI is not producing real gains: the reported productivity is likely real at the task level. The narrow, load-bearing claim is that task-level productivity is not the same quantity as business value, that the enterprise is currently measuring the first and calling it the second, and that the gap between them is a decision you never recorded, not a chart you never bought.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Why can't we prove the ROI of our AI investment?</strong> Because you are measuring output, which every tool emits, and not outcomes, which almost nothing records. Attribution requires connecting a unit of work to the business decision it served, and that decision usually exists only in someone's head or a one-time conversation. With one side of that link missing, no dashboard can complete it, so spend keeps climbing while its effect on the business stays unmeasured.</p>

<p><strong>Is AI actually making our teams more productive?</strong> Most likely yes, at the level of individual tasks, which is what surveys capture when engineers report feeling faster. The catch is that task productivity and business value are different quantities. More code produced faster is only valuable if it was the code the strategy needed, and nothing in a task-productivity metric tells you whether it was.</p>

<p><strong>Why does more AI output not translate into business results?</strong> Because output becomes value only when it advances a real decision, and an agent working from the codebase alone cannot see the decisions that live outside it. It produces plausible work against inferred intent, some of which serves the strategy and much of which is merely activity. The two look identical in the metrics, so volume rises without a matching rise in outcomes.</p>

<p><strong>What is the value attribution gap?</strong> It is the inability to connect AI output to business outcomes, even while output is easy to measure. It arises because attribution is a reconciliation between work and the decisions that work was meant to serve, and the decision side is rarely recorded. The result is organizations that can chart their AI activity in detail and still cannot say whether it moved the business.</p>

<p><strong>How do you connect AI development to business outcomes?</strong> By making the decisions themselves first-class records: capturing the strategy, constraints, and customer commitments the work is supposed to serve, in a durable and structured form. Once those records exist, agents can condition on them before generating and each piece of work can reference the one it advanced, which closes the loop that measurement has been missing.</p>]]></content:encoded>
    </item>
    <item>
      <title>Your CLAUDE.md is a junk drawer: a migration playbook</title>
      <link>https://usebrief.com/blog/migrating-off-claude-md/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/migrating-off-claude-md/</guid>
      <pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate>
      <description>There is no correct length for a flat context file. Trim it and the agent misses the decision it needed; fill it and the decision it needed is buried on line 2,830. The fix is not a better file.</description>
      <content:encoded><![CDATA[<p>Open the root of almost any repo that has been running coding agents for a while and you find a drawer:</p>

<pre role="region" aria-label="Code sample, text" data-lang="text" tabindex="0"><code>your-repo/
├── CLAUDE.md                         # Claude Code reads this
├── AGENTS.md                         # the "standard" one
├── .cursorrules                      # Cursor's legacy rules file
├── .github/copilot-instructions.md   # Copilot reads this
├── memory.md                         # the agent appends here, unattended, every session
├── product.md                        # someone added this once
├── context.md                        # nobody remembers who
├── decisions.md                      # 3 entries, last touched 6 months ago
└── docs/
    └── CLAUDE.md                      # a nested override that contradicts the root one</code></pre>

<p>Every session, most of it loads. The decision that governs the task in front of the agent is somewhere in that pile. So is its opposite, written eight months ago and never deleted. This is a junk drawer: the place where things end up when there is no proper place for them. The interesting question is not how it got messy. It is why tidying it never works.</p>

<h2 id="the-filename-war-is-over-the-problem-it-was-hiding-is-not">The filename war is over. The problem it was hiding is not.</h2>

<p>For a year the friction looked like a naming problem. Every tool wanted its own file, so you kept several copies of the same intentions in slightly different dialects. That part is genuinely being solved. <code>AGENTS.md</code>, released by OpenAI in August 2025, was <a href="https://www.linuxfoundation.org/press/linux-foundation-announces-the-formation-of-the-agentic-ai-foundation">contributed to the Linux Foundation</a> on December 9, 2025 as part of the new Agentic AI Foundation, and it now ships in dozens of tools across more than 60,000 open source projects. The industry agreed on one name for the drawer. Good.</p>

<p>But standardizing the name of the drawer does not empty it. The convention tells every tool to read the same file; it says nothing about what belongs in that file, how much of it, or whether any line is still true. The hard part was never which filename the agent opens. It was that we are using a flat file as the store for something that is not flat.</p>

<h2 id="there-is-no-correct-length-and-that-is-the-whole-problem">There is no correct length, and that is the whole problem</h2>

<p>Here is the bind, and it is worth being precise because it is the reason you keep re-tuning the file and it keeps feeling wrong. A flat context file gives you exactly two knobs, and both of them break.</p>

<div class="table-scroll rail-wide" role="region" aria-label="Table 1" tabindex="0">
<table><thead><tr><th scope="col">Your only two knobs on a flat file</th><th scope="col">What you do</th><th scope="col">What breaks</th></tr></thead><tbody><tr><th scope="row">Keep it lean</th><td>Trim it so the agent is not drowning</td><td>The decision the agent needed was one of the lines you cut, so it produces a plausible answer that violates a choice your team already made</td></tr><tr><th scope="row">Keep it complete</th><td>Append everything, delete nothing</td><td>The whole pile loads every run, so the one decision that binds this task is buried, and you pay to re-read the stale remainder on every session</td></tr><tr><th scope="row"><em>(there is no third knob)</em></th><td></td><td>A single file cannot be both complete and selective, because those are properties of a store, not of a document</td></tr></tbody></table>
</div>

<p>Trim toward the first failure or hoard toward the second: there is no setting in between that escapes both, because "complete" and "short" are in direct tension for a flat file and can only be reconciled by something that stores everything and returns a little. The mechanics of why a buried decision gets read past, even inside a large context window, are the subject of an <a href="https://usebrief.com/blog/context-window-is-not-the-bottleneck/">earlier post here</a>, so I will not re-derive them. The point for this playbook is narrower: you cannot tune your way out, so stop trying to find the right length and change what you are tuning.</p>

<h2 id="why-the-drawer-fills-in-the-first-place">Why the drawer fills in the first place</h2>

<p>A drawer becomes a junk drawer for one structural reason: it has no compartments, so unlike things pile into the same space. A flat context file has the same defect. It has no schema, so four different kinds of thing end up on adjacent lines, each of which actually wants a completely different home:</p>

<ol><li><strong>Style and convention rules.</strong> "Use Vitest, not Jest." "Two-space indent." These are lint rules wearing prose.</li><li><strong>Setup and command lore.</strong> "Run <code>make dev</code> first." "The migration step needs the VPN." These are scripts and docs wearing prose.</li><li><strong>Genuine decisions with a rationale.</strong> "We removed the retry wrapper because it masked a real timeout, see the incident." This is the only category that is actually context, and it is the one a flat file holds worst, because it flattens the decision down to the claim and drops the rationale, the status, and the author.</li><li><strong>Dead entries.</strong> Lines that were true once, describe code that no longer exists, or contradict a newer line three files away.</li></ol>

<p>Once you see the four piles, the migration is obvious, because most of what is in the drawer was never context at all. It was other things with nowhere better to go.</p>

<h2 id="the-playbook">The playbook</h2>

<p><strong>Step 1: Sort the drawer into the four piles.</strong> Read the file and tag every line as style, command, decision, or dead. This is tedious exactly once and it is the whole game, because it reveals that the file you thought was your agent's brain is mostly a linter config and a runbook that wandered into the wrong room.</p>

<p><strong>Step 2: Evict the piles that have a real home.</strong> Style rules move to the linter and formatter, where they are enforced instead of merely suggested, and where the agent cannot skim past them because the CI gate does not skim. Command lore moves to scripts, a <code>Makefile</code>, or task docs. Dead lines get deleted outright. In practice this evicts the large majority of the file, and none of it was context you will miss, because it now lives somewhere that actually applies it.</p>

<p><strong>Step 3: Give the survivors the fields a line of prose cannot hold.</strong> What remains is the decision pile, and this is the part worth migrating rather than deleting. A decision is not a sentence; it is a record with a rationale (why this over the obvious alternative), a status (does it still hold, or was it superseded), and an author (who had the standing to decide it). A flat file keeps only the sentence and loses the other three, which is why agents honor the letter of a <code>CLAUDE.md</code> rule and miss the reason it existed. Turn each surviving decision into that record. The argument for exactly which fields a decision store must carry, and why there are seven of them, is made <a href="https://usebrief.com/blog/agents-store-beliefs-not-decisions/">in a previous post</a>; here you are just applying the conclusion.</p>

<p><strong>Step 4: Find the lines that are lying.</strong> The reason the drawer is dangerous, not just messy, is that stale entries do not announce themselves. Two moves surface them cheaply. First, sort your decisions by last-touched date and treat anything old and unconfirmed as suspect until re-checked, the same way you treat a stale cache. Second, scan for contradictions: the nested <code>docs/CLAUDE.md</code> that overrides the root, the decision that a later commit quietly reversed. A store with a real status field lets you mark the loser superseded instead of leaving two live lines that disagree and hoping the agent picks the right one.</p>

<p><strong>Step 5: Change the write path so it stays graduated.</strong> The drawer did not fill because people are messy. It filled because the only way to record a decision was to remember, later, to append a line to a file, and that manual write path is unbounded work that scales with how fast you ship. If the migration ends with a clean file and the same append-when-you-remember habit, you have bought yourself a few good months and the drawer will refill. The durable version captures a decision at the moment it is made, from the act itself, so the store stays current without a standing tax on everyone's memory. That capture path is its own subject, covered <a href="https://usebrief.com/blog/decision-capture-ai-coding-agents-write-path/">here</a>.</p>

<h2 id="what-you-get-for-the-trouble">What you get for the trouble</h2>

<p>You get the third knob the flat file could never offer. Everything is stored, so nothing is lost to keep the file short; and only the few decisions that bind the current task are returned, so nothing is buried to keep the file complete. Completeness lives at rest, selection happens at read time, and the Goldilocks bind simply dissolves, because "how long should the file be" was the wrong question. The right length of what the agent reads is however many decisions actually govern this task, which is a number a store can compute and a document can only guess.</p>

<p>We built Brief to be that store, and to do the capture in Step 5 without the manual write path. But the honest center of this post survives without us: Steps 1 and 2 are worth doing this afternoon with nothing but a linter and the delete key, and they will shrink your context file more than any prompt tweak. The migration is not a product. It is what you do once you notice the drawer was never a database and stop asking it to behave like one.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>It does not claim <code>AGENTS.md</code> is a mistake. A single conventional filename is a real improvement over five dialects, and for small, stable, genuinely global rules a short flat file is fine and always was. The claim is narrower: the file is the wrong home for the high-cardinality, fast-changing, authored thing we call a decision, and standardizing the filename does not change that. It does not claim the sort is glamorous; it is a chore. And it does not claim you will never touch the file again, only that most of what lives in it today belongs in a linter, a script, or a store, and moving it there is the migration.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>How long should a CLAUDE.md or AGENTS.md file be?</strong> There is no correct length, which is the tell that length is the wrong dial. Short enough to avoid burying the agent means cutting decisions it needs; long enough to be complete means burying them anyway and paying to re-read the rest each session. Keep the file for small, stable, global conventions, and move decisions with a rationale and a lifecycle into a store you can query, so the length of what the agent reads is set by the task, not by you.</p>

<p><strong>Should I delete my CLAUDE.md or AGENTS.md?</strong> No. Keep it for the narrow job it is good at: a handful of stable, global conventions that rarely change. Migrate out of it the two things it holds badly, style and command rules that belong in a linter or scripts, and genuine decisions that need a rationale, a status, and an author. What is left is a short, honest file rather than a junk drawer.</p>

<p><strong>AGENTS.md is the standard now, does that solve the problem?</strong> It solves the naming problem, which is real and worth solving: tools now agree on one file to read. It does not touch the data-model problem. Standardizing which file the agent opens says nothing about what belongs in it, how much, or whether a given line is still true, and those are the questions that make a context file rot.</p>

<p><strong>Why does my coding agent ignore my CLAUDE.md?</strong> Usually because the relevant line is buried among many that do not apply to the current task, so it is read past rather than read, or because the line it followed had no rationale attached and it honored the letter while missing the reason. Both are symptoms of a flat file doing a store's job: no selection to surface the few lines that matter now, and no schema to carry the why alongside the what.</p>

<p><strong>What belongs in AGENTS.md versus a decision store?</strong> Put in the file what is stable, global, and cheap to always apply: formatting conventions, the build command, the test runner. Put in a store what is specific, evolving, and reasoned: the architectural choices, the rejected alternatives and why they were rejected, the constraints that hold until they are superseded. The rule of thumb is that anything with a "because" and an expiry date wants a store, and anything that is just a standing convention can stay in the file.</p>]]></content:encoded>
    </item>
    <item>
      <title>The firehose problem: your coding agent has all your permissions</title>
      <link>https://usebrief.com/blog/the-firehose-problem/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/the-firehose-problem/</guid>
      <pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate>
      <description>Least privilege for a coding agent was never a narrower scope on the firehose. It is not handing the agent the firehose at all.</description>
      <content:encoded><![CDATA[<p>Earlier this week a security researcher tricked GitHub's own AI agent into leaking private repositories, and the exploit was a single word. In <a href="https://noma.security/blog/gitlost">GitLost</a>, disclosed July 6, Noma's Sasi Levi posted an ordinary-looking Issue in a public repo inside an organization. The Issue body hid instructions in plain English, and to slip past GitHub's guardrails it leaned on the word "Additionally." The agent, wired with cross-repository read access, did as it was told: it pulled contents out of the org's private repos and posted them as a public comment on the issue, where anyone could read them. As the writeup puts it, "any malicious actor can create a GitHub Issue and, in the issue body, hide commands in plain English that GitHub's agent will follow."</p>

<p>It is tempting to read that as a GitHub bug to be patched and forgotten. It is not. GitLost is the shape of the entire pattern, and almost every team running coding agents is standing in it. The bug is not in the agent. It is in what we connected the agent to.</p>

<h2 id="the-trifecta-is-the-default-configuration-not-the-edge-case">The trifecta is the default configuration, not the edge case</h2>

<p>Simon Willison named the failure mode a year ago and it has become the industry's shared mental model. His <a href="https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/">"lethal trifecta"</a> is three capabilities that are individually fine and catastrophic together: "access to your private data," "exposure to untrusted content," and "the ability to externally communicate." An agent with all three can be talked, by an attacker who controls the untrusted content, into reading your private data and shipping it out.</p>

<p>Now look at how a normal coding agent is set up. You connect it to your repos, your issue tracker, your Slack, your docs, so it has access to your private data. It reads tickets, PR descriptions, commit messages, and design docs, which is exposure to untrusted content, because any of those can be authored by someone you do not fully trust, or by someone who compromised an account, or by a contractor, or by a bot. And it can open pull requests, post comments, call tools, and write files, which is the ability to externally communicate. The trifecta is not an exotic misconfiguration you have to work to create. It is the out-of-the-box setup, the thing the quickstart tells you to do.</p>

<h2 id="the-agent-is-not-malicious-it-is-a-confused-deputy">The agent is not malicious. It is a confused deputy.</h2>

<p>The unsettling part of GitLost is that nothing malfunctioned. The agent did exactly what a competent, obedient executor does: it followed the clearest instruction in its context. It could not tell your intent from the attacker's, because both arrive as the same thing, text in the context window, and nothing in that text is stamped with who is allowed to say it.</p>

<p>That is the confused-deputy problem, and it is decades old. The deputy has real authority and gets tricked into using it on someone else's behalf. What is new is the size of the authority. When you connected the agent to your tools, you did not grant it least privilege. You handed it a token carrying your scopes, and often broader ones, because a shared automation account tends to accumulate access no single human would be given. The agent reads what you can read, across repositories and channels, which means a poisoned instruction in one place can reach data in every place the token touches. One injected ticket, and the blast radius is not a repo. It is everything the firehose is plumbed to.</p>

<p>This is also why the ordinary permission model quietly fails. Your per-user access controls assume a human on the other end who is only supposed to see their slice. An agent connected to everything and driven by whatever text lands in its context is a single reader with a superset of everyone's access, and it will happily surface to the wrong person, or to a public comment thread, whatever it was steered toward.</p>

<h2 id="you-cannot-scan-your-way-out-of-this">You cannot scan your way out of this</h2>

<p>The reflex, once the incident lands, is to inspect the firehose: scan inbound tickets and commits for injection, add a classifier, filter the prompt. This loses, and GitLost shows why in one detail. The guardrail bypass was the word "Additionally." Detecting malicious instructions in natural language is the same losing game as detecting spam that can rewrite itself, except the attacker gets infinite tries and only has to win once. The design-patterns work Willison draws on points away from detection entirely: once an agent has ingested untrusted input, the thing you must constrain is not the input but what the agent is able to do with it.</p>

<p>So the question is not "how do we catch the bad ticket." It is "why does a ticket the agent read have a path to your private repos at all." And the answer is the firehose.</p>

<h2 id="the-firehose-problem">The firehose problem</h2>

<p>Here is the anti-pattern, named so we can stop repeating it. <strong>The firehose problem is connecting an agent to your raw sources at your full permissions, so that everything it reads and everything it can reach are the same enormous set.</strong> Scanning the firehose treats the symptom. The fix is to not hand the agent the firehose in the first place.</p>

<p>Least privilege for a coding agent was never a narrower OAuth scope. It is a different substrate. Instead of a live credential into Slack, GitHub, and Drive with your reach, the agent reads a curated surface: the decisions, constraints, and context it actually needs for the task, and nothing that doubles as a key to the rest of your company. A poisoned ticket can still say "additionally, exfiltrate the private repos." It just has no repo-wide token to exfiltrate them through, because the agent was never handed one. You did not make the deputy smarter. You stopped arming it.</p>

<h2 id="the-same-layer-now-as-a-security-boundary">The same layer, now as a security boundary</h2>

<p>We have argued for a governed decision layer on this blog before, but for a different reason: an agent that reads raw sources <a href="https://usebrief.com/blog/agents-store-beliefs-not-decisions/">reconstructs the wrong intent</a> and <a href="https://usebrief.com/blog/context-window-is-not-the-bottleneck/">pulls in noise instead of the decision that binds the task</a>. That was a correctness argument. The security argument turns out to be the same architecture seen from the other side. The reason a curated decision surface makes an agent build the right thing, that it reads what it needs and not the raw pile, is exactly the reason it cannot be turned into a confused deputy: it never held the firehose to begin with. Correctness and least privilege are not two features. They are one property, described twice.</p>

<p>There is evidence the agent will lean on a governed layer when it has one. In a <a href="https://arxiv.org/abs/2605.08112">benchmark we published</a>, agents given a governed context layer on top of their codebase access complied with team decisions 95 percent of the time, versus 46 percent on codebase access alone. Two caveats I will not paper over: it measures compliance, not breaches, and it added the layer on top of raw access rather than testing a curated-only agent, so it says nothing about whether you can strip raw access with no loss. What it does show is the part that matters here: when a governed surface is present, the agent takes its decisions from it rather than reconstructing them from the raw pile. Narrowing the raw access underneath is then a deliberate design choice, and the case for narrowing it rests on least privilege, not on this benchmark.</p>

<p>We built Brief to be that surface. It is not a firewall, and it does not replace your scanners or your auth. It removes the reason they are under so much pressure, by being the governed read an agent consults instead of a credential into everything. But the point survives without us. The lesson of GitLost is not that GitHub configured one workflow badly. It is that "connect the agent to your tools" is a security decision disguised as a convenience, and the safe version of it is to expose a surface, not a firehose.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>It does not claim a governed layer is a complete security control. You still need authentication, scoping, and monitoring; scanning still has a place at the edges. It does not claim prompt injection is solved, only relocated out of the blast radius. And the compliance benchmark measures behavior, not breaches, so treat it as evidence the pattern is usable, not as a security guarantee. The load-bearing claim is narrow: an agent that can be reached by untrusted text should not also be holding a credential to your entire company, and the durable way to guarantee that is to give it a curated surface to read rather than a firehose to be steered through.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Why do AI coding agents leak private repositories?</strong> Because they sit in the lethal trifecta by default: connected to private data, exposed to untrusted content like tickets and commit messages, and able to communicate outward. An attacker who controls any untrusted input the agent reads can instruct it, in plain language, to fetch private data and post it somewhere public. GitLost (July 2026) did exactly this to GitHub's own agent using a poisoned public Issue.</p>

<p><strong>Do AI agents inherit my permissions?</strong> Usually yes, and often more. Connecting an agent to your tools typically hands it a token with your scopes, and shared automation accounts tend to accumulate broad access over time. So the agent reads what you can read across every connected source, which is why one poisoned input can reach far more than the place it was planted.</p>

<p><strong>What is the "lethal trifecta" for coding agents?</strong> Simon Willison's term for the dangerous combination of access to private data, exposure to untrusted content, and the ability to externally communicate. A standard coding-agent setup has all three, which is what makes prompt injection a data-exfiltration risk rather than just a nuisance.</p>

<p><strong>Can a Jira or Linear ticket really reach my private data?</strong> If the agent that reads the ticket also holds a credential to your private repos or drives, yes. The ticket is untrusted content; the credential is the reach; the agent is the confused deputy that connects them. Removing the reach, not scanning the ticket, is the durable fix.</p>

<p><strong>What is the difference between raw data access and a governed context layer?</strong> Raw access gives the agent a live credential into your sources at your permissions, so what it can read and what it can reach are the same large set. A governed context layer gives it a curated surface of the decisions and context it needs, so a poisoned instruction has nothing broad to act through. It is least privilege applied to what the agent can see, not just to which scopes are checked.</p>

<p><strong>Does exposing curated decisions instead of raw data actually help the agent do its job?</strong> In our benchmark, agents given a governed context layer on top of their codebase access complied with team decisions 95 percent of the time versus 46 percent on codebase access alone, so the agent clearly follows the governed decisions when they are present. That test added the layer to raw access rather than trying a curated-only agent, so it does not by itself prove a curated surface is sufficient alone; how much raw access you can safely narrow underneath is a design choice, and the security case for narrowing it stands on least privilege regardless.</p>]]></content:encoded>
    </item>
    <item>
      <title>Loop engineering forgot the loop needs a memory</title>
      <link>https://usebrief.com/blog/loop-engineering-needs-a-memory/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/loop-engineering-needs-a-memory/</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate>
      <description>You can automate the loop. You can't automate the context the loop needs each time around, and the moment you removed yourself from every iteration, you removed the one thing that used to supply it.</description>
      <content:encoded><![CDATA[<p>In the span of about a month, a lot of good engineers stopped calling themselves prompt engineers and started calling themselves loop engineers. The pitch, which spread from a Peter Steinberger post that racked up millions of views within days and Claude Code's Boris Cherny saying he no longer hand-prompts Claude, is that hand-prompting an agent is amateur hour. The professional move is to design a loop: give the agent a goal and a stopping condition, then let it run act, observe, decide, repeat, on its own. Andrew Ng gave it the establishment blessing in <a href="https://www.deeplearning.ai/the-batch/issue-359">his June 26 letter</a>.</p>

<p>And then, days later, <a href="https://techcrunch.com/2026/07/02/mark-zuckerberg-tells-staff-that-ai-agents-havent-progressed-as-quickly-as-hed-hoped/">Mark Zuckerberg told his staff</a> that AI agent development "had not accelerated in the way" executives had expected. Both things are true at once: the whole field is racing to hand agents the wheel, and the results from handing agents the wheel keep underwhelming. The gap between those two facts is the whole story, and it is not the one the loop-engineering pitch is telling.</p>

<h2 id="the-skeptics-are-right-which-is-why-they-miss-it-too">The skeptics are right, which is why they miss it too</h2>

<p>The backlash wrote itself. A loop is act, observe, decide, repeat, which is a while-loop, and we have had while-loops since before most of us were born. Dressing a <code>while</code> in a lab coat does not make it a new discipline. This is correct. The control flow of an agent loop is trivial, and anyone selling the control flow as the hard-won skill is selling you the easy half.</p>

<p>But the skeptics stop one step short. Yes, the loop is trivial. That is exactly the point, and exactly why "loop engineering" as a control-flow skill is a red herring. The reason your autonomous loop disappoints has nothing to do with the loop. It has to do with the one thing a bare <code>while</code> does not give you for free: what the loop carries between one iteration and the next.</p>

<h2 id="you-were-the-loop-s-memory-and-you-just-fired-yourself">You were the loop's memory, and you just fired yourself</h2>

<p>Think about what actually happened when you ran the agent by hand, one prompt at a time. On each turn you were doing more than clicking go. You were re-supplying context. You corrected the thing it got wrong last time. You reminded it of the constraint it forgot. You said no, we decided against that approach, do the other one. Every manual iteration was a chance for you to inject what the model did not know.</p>

<p>That is precisely the human contribution Ng points at. He reframes the human's role not as taste but as information: "I prefer to think of it as humans having a context advantage." And he is explicit about why it cannot be automated away: "So long as the human knows something the AI does not, human-in-the-loop is needed to inject that knowledge into the system."</p>

<p>Now read the loop-engineering pitch again with that in mind. The entire selling point of the loop is that it runs without you in it. You are no longer in each iteration to inject the context advantage. So the obvious question, the one the pitch skips: if you are not supplying the missing knowledge on every turn anymore, who is? If the answer is nobody, then your loop is not carrying your decisions from one iteration to the next. It is re-deriving them from scratch each cycle, or never having them at all, and doing it at machine speed with no one watching. That is not automating your judgment. It is automating your amnesia and putting it in a <code>while(true)</code>.</p>

<h2 id="why-more-autonomy-makes-this-worse-not-better">Why more autonomy makes this worse, not better</h2>

<p>The intuition is that a more capable, more autonomous loop needs less babysitting. On this specific axis the intuition is backwards, and it is worth being precise about why, because it is not the usual "bigger models won't save you" point.</p>

<p>Autonomy is defined by removing the human from the iterations. But the human was not just overhead in those iterations; the human was the memory. Take the person out and you have not made the loop smarter, you have deleted the component that carried context from turn to turn. So the more iterations you let it run unattended, the more times it re-derives your decisions from whatever it can see, and the more consistently it converges on the wrong one, because the wrong one is usually the conventional default and your real decision was the deliberate exception it cannot see. A supervised agent that gets one thing wrong gets corrected on the next prompt. An autonomous loop that gets the same thing wrong gets it wrong on iteration two, and three, and forty, faithfully, until the stopping condition trips. Autonomy does not reduce the need for a durable decision memory. Autonomy is the thing that removes the only memory the loop had.</p>

<h2 id="the-amnesiac-loop-is-also-the-expensive-one">The amnesiac loop is also the expensive one</h2>

<p>There is a bill attached to this, and it lands exactly where no one is looking. We have written before about the <a href="https://usebrief.com/blog/everyone-is-a-builder-now/">rediscovery tax</a> agents pay, re-crawling the same docs every session just to relearn where things live. A loop pays that tax not once per session but once per iteration, and an autonomous loop runs many iterations with nobody watching the meter. Every cycle that re-derives a decision it could have simply been handed is a cycle spent generating an output that will be thrown away, then generating it again. The token spend that keeps surprising finance is not mostly the price of thinking. It is the price of re-thinking the same settled questions, on repeat, unattended. The loop did not just automate the amnesia; it automated the cost of the amnesia.</p>

<h2 id="what-the-loop-actually-needs">What the loop actually needs</h2>

<p>If the loop is trivial and the state is the hard part, then the engineering worth doing is on the state. The loop needs a memory it can read on every iteration: the decisions it must honor, still current, retrievable at the moment it acts. Not in your head, because the entire premise is that you are no longer in the loop. Not re-crawled from raw sources each turn, because that is the tax. And not a static file you hand-maintain like an AGENTS.md, because a loop running unattended needs the decisions as they stand now, not as someone last remembered to write them down. A persistent, shared, authoritative record of what your team has decided, kept current, that the loop consults each cycle the way you used to remind it by hand.</p>

<p>What that record has to be, and how the loop pulls only the few decisions that bind the task in front of it rather than the whole history, are the subjects of <a href="https://usebrief.com/blog/agents-store-beliefs-not-decisions/">earlier</a> <a href="https://usebrief.com/blog/context-window-is-not-the-bottleneck/">posts</a> here, so I will not re-derive them. We build Brief to be that memory, the thing the loop reads each turn in your absence. But you do not have to take our word for the conclusion, because it is not really about us. It is the one part of the loop the loop-engineering pitch left out, and it was the only part that was ever hard.</p>

<p>Design the loop in an afternoon; it is a while-loop, the skeptics are right. Then spend the real effort on what it remembers between turns, because a loop with no memory of your decisions does not run your judgment on autopilot. It runs your blind spots on autopilot, and bills you per lap.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>What is loop engineering?</strong> It is the mid-2026 idea, popularized by Peter Steinberger and Boris Cherny and formalized by Addy Osmani and Andrew Ng, that the skill has shifted from writing prompts to designing the loop that runs an agent autonomously: you set a goal and a stopping condition, and the loop iterates act-observe-decide-repeat on its own instead of you prompting each step.</p>

<p><strong>Is loop engineering just a fancy while-loop?</strong> The control flow is, yes, and the skeptics are right to say so. But that is why it is not where the difficulty lives. The hard part of an autonomous loop is not the iteration mechanism, it is the state the loop carries between iterations, specifically the decisions and context it must honor each cycle without a human present to supply them.</p>

<p><strong>Why does my autonomous agent keep making the same mistake across iterations?</strong> Because nothing is carrying the correction forward. When you prompted by hand, you re-injected the fix each turn. An autonomous loop has no memory of your decisions unless one is provided, so it re-derives them every iteration and lands on the same wrong default until it stops.</p>

<p><strong>Will a smarter or more autonomous model fix this?</strong> No, and more autonomy makes it worse on this axis, because autonomy is defined by removing the human who used to supply the missing context on each turn. A better model reasons better over what it can see; it cannot see a decision that lives in no input it reads, no matter how capable it is.</p>

<p><strong>Why is my autonomous loop burning so many tokens?</strong> Largely because it re-derives settled context every iteration instead of being handed it. Rediscovery is a per-cycle cost, and an unattended loop runs many cycles, so the waste compounds precisely where no one is watching the meter.</p>]]></content:encoded>
    </item>
    <item>
      <title>You can't review your way out of a context problem</title>
      <link>https://usebrief.com/blog/cant-review-your-way-out-of-context-problem/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/cant-review-your-way-out-of-context-problem/</guid>
      <pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate>
      <description>AI made writing code cheap and shipping it expensive. Everyone is scaling review to close the gap. But review inspects the output when the defect was in the input, and inspection has never been how you build quality in.</description>
      <content:encoded><![CDATA[<p>The numbers finally caught up with the feeling. In a large study across more than a hundred thousand developers, AI tools raised the volume of code written by around 180 percent, but the number of actual releases rose only about 30 percent (Demirer, Musolff and Yang, <a href="https://www.nber.org/papers/w35275">"Writing Code vs. Shipping Code," NBER, May 2026</a>). GitLab's 2026 accountability survey put the mechanism in one line: <a href="https://www.infoq.com/news/2026/06/ai-coding-outpaces-governance/">85 percent of respondents</a> "agree AI has shifted the bottleneck from writing code to reviewing and validating it," and 79 percent say overall delivery has not kept pace with coding. Writing got cheap. Shipping did not. Addy Osmani, who leads developer experience for Chrome at Google, named the shape of it early: <a href="https://addyo.substack.com/p/the-70-problem-hard-truths-about">"They can get 70% of the way there surprisingly quickly, but that final 30% becomes an exercise in diminishing returns."</a> Generation is the cheap seventy. The expensive thirty is everything after, and the gap between them is the story of the year.</p>

<p>The industry has already picked its answer, and the answer is more review. The most trusted practitioners in the field have converged on it. Simon Willison, describing what he calls <a href="https://simonwillison.net/2025/Oct/7/vibe-engineering/">"vibe engineering,"</a> lists the real job of working with agents as "researching approaches, deciding on high-level architecture, writing specifications, defining success criteria" and "spending so much time on code review." Sean Goedecke, a staff engineer at GitHub, <a href="https://www.seangoedecke.com/ai-agents-and-code-review/">puts it flatly</a>: "Using AI agents correctly is a process of reviewing code." They are describing the world accurately. With a capable agent, the human job has largely become review.</p>

<p>The trouble is what follows from it. If review has become the job and shipping still has not caught up, then adding review capacity is not the lever. The reflex to add more of it, buy an AI reviewer, staff a validation team, govern the code after the agent produces it, misdiagnoses where the defect enters. Review inspects the output. The write-to-ship gap is created by the input. You cannot inspect quality into a product that was built without it, and scaling the inspection step only makes the bottleneck it was meant to relieve more expensive.</p>

<h2 id="what-review-actually-is-and-what-it-cannot-do">What review actually is, and what it cannot do</h2>

<p>Software review is a specific operation: a human or a tool examines a finished artifact and decides whether to accept it. In quality terms it is inspection, the same category as end-of-line checking in manufacturing, and the field settled the limits of inspection decades ago. W. Edwards Deming, whose methods rebuilt postwar manufacturing, made it the third of his famous <a href="https://deming.org/explore/fourteen-points/">fourteen points</a>: "Cease dependence on inspection to achieve quality. Eliminate the need for inspection on a mass basis by building quality into the product in the first place." Inspection does not create quality. It measures whatever quality the process already produced, and it does so after the cost of producing the defect has already been paid. If your process reliably emits defects, a better inspector catches more of them and changes nothing about why they keep arriving.</p>

<p>Apply that to an agent. When an AI coding agent produces code that a reviewer has to reject or rework, the review did its job, but the defect was minted upstream, at generation time, and the review is now paying to detect it. Scaling review scales detection of a problem you are still manufacturing at full rate. That is precisely the shape the 2026 data shows: generation raced ahead, the inspection stage became the constraint, and total throughput barely moved. Adding inspection capacity to an input-defect problem is running the assembly line faster into the same wall.</p>

<h2 id="why-the-agent-emits-defects-a-reviewer-has-to-catch">Why the agent emits defects a reviewer has to catch</h2>

<p>Here is the part that decides everything: a large share of what review rejects is not a bug in the usual sense. The code often runs, passes its tests, and is internally clean. It is wrong because it violates a decision the team already made and the agent could not see. The retry logic it removed was load bearing for a reason recorded in a pull request thread. The pattern it "simplified" was chosen deliberately over the obvious one. The agent did nothing irrational; it produced the most probable code given what it could read, and what it could read was the codebase, not the reasons behind it.</p>

<p>This is measurable, and the measurement looks exactly like statistical process control. In a <a href="https://arxiv.org/abs/2605.08112">controlled benchmark we published earlier this year</a>, an agent with codebase access complied with decisions that were visible in the code essentially all the time, and with decisions that required out-of-code product context only 0 to 33 percent of the time. Read that the way a process engineer reads a defect map: the agent is already near-defect-free wherever the specification is present in the material it works from, and defects appear only in the region where the input specification is missing. It is not an unreliable process. It is a reliable process being handed an incomplete spec, and its defects cluster precisely where the spec has a hole. That hole is the class of defect that passes tests and lands on a reviewer's desk, and when the missing decisions were supplied at generation time it largely closed.</p>

<h2 id="the-economics-of-inspecting-versus-preventing">The economics of inspecting versus preventing</h2>

<p>Treat it as a pipeline and the two strategies price out differently. Under the inspection strategy, every task pays the generation cost, then a review cost to find the context violations, then a rework cost to fix them, then re-review, with the reviewer carrying the hardest version of the task: validating code they did not write and may not fully understand. This is the cost-of-quality curve that quality engineering has measured for decades. The cost of a defect rises by roughly an order of magnitude at each stage it escapes, from design to build to inspection to the field, so a context violation caught in review is already several stages past the point where it was cheapest to remove. Under the prevention strategy, the relevant decisions are placed in front of the agent before it generates, so the violation is never produced, and the review that remains is doing its proper job of catching genuine bugs rather than re-litigating settled choices. One strategy scales the most expensive step. The other shrinks the work that step has to do.</p>

<p>This is why "more review" reads as progress and is not. It is visible, staffable, and buyable, so it feels like action, but it is optimizing the inspection stage of a line whose defect rate is set upstream. The leverage is upstream.</p>

<h2 id="what-prevention-actually-requires">What prevention actually requires</h2>

<p>Prevention here has a precise meaning, and it is not "write better prompts" or "hope the next model is smarter." The instinct is already in the field. Kent Beck, who gave us test-driven development, <a href="https://newsletter.kentbeck.com/p/augmented-coding-beyond-the-vibes">draws the line</a> between "vibe coding," where "you don't care about the code, just the behavior of the system," and "augmented coding," where "you care about the code, its complexity, the tests, &amp; their coverage." Caring about the code means specifying what good looks like and holding the output to it. Prevention takes that one step further upstream: the constraints the agent must honor should reach it before it generates, not after. A larger model does not change this, because it reasons better over what it can see and still cannot see a decision that exists in no input, which is a floor no model size clears. Prevention means the decisions the agent must honor, along with their rationale and whether they still hold, are retrievable at generation time, so the agent conditions on them before it writes rather than a reviewer reconstructing them after. In manufacturing terms it is poka-yoke, mistake-proofing at the workstation: the constraint reaches the worker before the part is made, so the defective part is never produced. That is a property of a store, not of a prompt, and the earlier posts in this series describe <a href="https://usebrief.com/blog/agents-store-beliefs-not-decisions/">what that store must be</a>, <a href="https://usebrief.com/blog/context-window-is-not-the-bottleneck/">how you keep the right decisions selectable</a>, and <a href="https://usebrief.com/blog/decision-capture-ai-coding-agents-write-path/">how they get captured in the first place</a> without a documentation tax. The point of this post is narrower and, I think, harder to argue with: whatever you build, build it upstream of generation, because the stage everyone is rushing to reinforce is the wrong one.</p>

<p>We built Brief to be that upstream layer, so agents generate against your decisions instead of around them. But the reason the review strategy stalls is not a claim about us. It is the oldest result in quality engineering, arriving on schedule in a new medium: you do not inspect defects out, you build them out.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>It does not claim review is unnecessary. Genuine bugs need catching, and human judgment on real tradeoffs is not going away; the argument is against review as the <em>primary</em> lever for the write-to-ship gap, not against review. It does not claim prevention catches everything. Some decisions are genuinely new and get made during the work, and those still need a human; prevention shrinks the defect class that never should have reached review, it does not empty the queue. And the benchmark is one measurement on one task set, not a law; run the split on your own tasks and see how much of what your reviewers reject is a context violation versus a real bug. The load-bearing claim survives all of that: the write-to-ship gap is an input defect, inspection cannot fix an input defect, so the money and attention flowing into review are being spent one stage too late.</p>

<p>The gap is real and now well measured. The instinct to meet it with more review is the instinct to inspect harder, and inspecting harder has never been how quality got built. Move the fix upstream of the agent, and the reviewers get to go back to reviewing.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Isn't better AI code review the obvious fix for the write-to-ship gap?</strong> It is the intuitive fix and the incomplete one. Review is inspection, and inspection detects defects rather than preventing them. If a large share of what review rejects is code that violates decisions the agent could not see, a better reviewer catches more of those violations but does nothing about why the agent keeps producing them. The leverage is upstream, at generation time.</p>

<p><strong>Why does an agent write code that passes tests but still gets rejected?</strong> Because passing tests proves the code does what the code says, not that it honors what the team decided. Decisions about tradeoffs, rejected alternatives, and constraints often live in pull request threads and docs, not in the code, so an agent reading only the codebase cannot condition on them and produces a plausible answer that violates one. In our benchmark, agents complied with 0 to 33 percent of decisions that required this out-of-code context.</p>

<p><strong>Will bigger context windows or better models close the gap?</strong> They help at the margin and do not close it. A model cannot honor a decision that is present in none of its inputs, regardless of window size or capability, so the fix is making the relevant decisions retrievable at generation time, not enlarging the model. A <a href="https://usebrief.com/blog/context-window-is-not-the-bottleneck/">previous post in this series</a> covers why capacity is the wrong lever.</p>

<p><strong>What does "prevention instead of inspection" mean concretely for AI coding?</strong> It means supplying the agent with the decisions it must honor, and their current status, before it generates, so the violation is never written, instead of catching it in review after it is. Practically that requires a retrievable store of decisions with rationale and currency, positioned upstream of the agent rather than a gate positioned downstream.</p>

<p><strong>Does this mean we should stop reviewing AI-generated code?</strong> No. Review still catches genuine bugs and weighs real tradeoffs. The claim is that review should not be your primary answer to the write-to-ship gap, because the gap is dominated by input defects that prevention removes more cheaply than inspection detects.</p>]]></content:encoded>
    </item>
    <item>
      <title>Everyone Is a Builder Now</title>
      <link>https://usebrief.com/blog/everyone-is-a-builder-now/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/everyone-is-a-builder-now/</guid>
      <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
      <description>Product management is dead. Design is dead. Engineering is dead. Except none of that is true: the three jobs are collapsing into one. Meet the product builder, and the two shapes of the role we're hiring for.</description>
      <content:encoded><![CDATA[<p>Product management is dead. Design is dead. Engineering is dead.</p>

<p>Except none of that is true, and anyone who tells you they pointed an agent at a prompt and it farted out a billion-dollar company is selling something. What is actually happening is more interesting: the three jobs are collapsing into one.</p>

<p>Call it the product builder. A person who holds the whole picture, from "what should this even do?" to "it shipped, it feels right, and customers love it," and refuses to hand any part of that off to someone else's queue.</p>

<h2 id="the-bottleneck-moved">The bottleneck moved</h2>

<p>For most of software's history, the bottleneck was making the thing. Writing the code, cutting the pixels, wiring the backend. So we organized around production: specialists, handoffs, tickets, a PM to decide, a designer to draw, an engineer to build, and a game of telephone in between.</p>

<p>Agents broke that model. Coding agents make anyone an engineer and make great engineers 10x. Design tools are catching up fast. Production is no longer the scarce thing.</p>

<p>Here is what did not get cheaper: knowing <em>what</em> to build and <em>why</em>. Taste. Judgment. The courage to ship something opinionated instead of something safe. When you can build anything in an afternoon, the constraint moves from "can we make it?" to "should we, and is this the version worth shipping?" That is a product question, and it is now everyone's job.</p>

<p>This is the gap. Call it the infinite monkeys problem: point an agent at an open-ended prompt and it will confidently build something, just not always toward where your company is actually trying to go. AI-powered teams are shipping faster than they can think, which means they are shipping blind. Decisions get ignored. The same question gets answered five different ways by five different agents. Speed was never the problem. Judgment is.</p>

<h2 id="what-a-product-builder-actually-believes">What a product builder actually believes</h2>

<p>The role is new, but the standard is old. A product builder runs on a few convictions:</p>

<p><strong>Care.</strong> The difference between a beloved product and generic output is that someone sweated the small things. Agents will hand you plausible. Care is what makes it right.</p>

<p><strong>Context over cleverness.</strong> The best decision is the one made with the full picture: the customer, the constraint, the business model, the thing you decided last month and forgot. Cleverness without context just ships the wrong thing faster.</p>

<p><strong>Shipping over signaling.</strong> No performance of work. No decks about the work instead of the work. You are measured by what reaches a user and how it lands, not by how busy you looked getting there.</p>

<p><strong>Breadth becomes depth.</strong> The more ground you cover, the sharper your judgment gets. Time in the field, across disciplines, across customers, is not a detour from the craft. It is the craft.</p>

<p><strong>Us.</strong> Nobody builds a whole product alone, agents included. The job is to hold the picture <em>and</em> bring the room with you.</p>

<h2 id="the-job-takes-two-shapes">The job takes two shapes</h2>

<p>We are hiring product builders, and we have learned that the disciplines blend but the best people still have a center of gravity. So we are hiring for two shapes of the same role.</p>

<p>The first is <strong>engineering-centered</strong>. A long tenure writing real software, paired with genuine taste for how a thing should feel to use. This is the person who owns entire features end to end, product definition through implementation, and cannot leave something alone until it is right. They use Claude and Cursor as a collaborator, not autocomplete, and they build a product that agents themselves use.</p>

<p>The second is <strong>forward-deployed</strong>. A product-and-people builder who goes into our biggest customers, wires Brief into their real context, wins the skeptics, and drives a measurable step-change in how they build. Think of a PM crossed with a management consultant who loves to prototype. The hard part, and the whole point, is change management: moving an organization off habits it has held for years without breaking trust. Breadth in the field becomes depth in our roadmap.</p>

<p>The unified role makes sense to start, but the taste required to build developer tools is not the taste required to build consumer apps. Over the next few years the product builder will bifurcate and specialize again: more engineering-oriented product people, more product-oriented engineers, each needing something different from the agents that support them. These two shapes are the leading edge of that split.</p>

<p>Two shapes, one conviction: hold the whole thing, and make the call.</p>

<h2 id="why-this-matters-beyond-us">Why this matters beyond us</h2>

<p>We are building Brief because Product was the one corner of this shift with no tools. Coding has Claude Code and Cursor. Design has its new stack. Product had strategy-dot-md and bots that turn Slack messages into Jira tickets. So teams building at agent speed had no navigator, and it showed.</p>

<p>Brief is that navigator. It aggregates the business context, decisions, customer research, work pipeline, team knowledge, and makes it legible to both people and their agents. It matters because most of what agents burn tokens on is rediscovery: hook up a Notion MCP and every new session your agent crawls the same docs again, chewing through context just to relearn where your strategy lives. We call those dumb tokens. Brief calls that data once, shapes it, and hands the agent a tight book report that costs a few percent of its context window instead of a chunk of it.</p>

<p>The results are measurable. In our own dark factory, two agents ran the same open-ended prompts, one with Brief and one without. With Brief, the agent reached the right solution about 95% of the time. Without it, roughly 46%. Same model, same prompt. The only difference was whether it knew what the company was actually trying to build. AI ships. Brief navigates.</p>

<p>But the tool is downstream of the belief. The belief is that the future of building software belongs to people who can hold product, design, and engineering in one head and have the taste to know when it is right. Everyone is becoming a builder. The only question is whether you build with judgment or just build fast.</p>

<p>We would rather build with judgment. If that sounds like you, we are <a href="https://usebrief.com/careers/">hiring for both shapes of the role</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Decision capture for AI coding agents: a write-path problem, not a discipline problem</title>
      <link>https://usebrief.com/blog/decision-capture-ai-coding-agents-write-path/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/decision-capture-ai-coding-agents-write-path/</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate>
      <description>Your team will not be more disciplined about documenting decisions, and it is not a character flaw. It is economics. Capture has to cost almost nothing, which means it cannot be a separate act.</description>
      <content:encoded><![CDATA[<p>A team inherits a billing service that has run in production for six years. The engineers who built it have moved on, or moved companies. The code tells the new team exactly what it does, and nothing tells them why it rejected the obvious queue-based design, which of its three retry paths is load bearing and which is vestigial, or why one deliberately ugly function has survived every refactor since a 2023 outage. That reasoning was real, and it lives nowhere a new hire or an AI agent can reach. Three weeks in, an agent tidies the ugly function and reopens the outage. The instinct that follows is the one every engineering org has: we need to be more disciplined about documenting our decisions.</p>

<p>You will not be more disciplined, and neither will any team, and it is not a character flaw. Decision capture for AI coding agents is not a discipline problem. It is a write-path problem, and that distinction decides whether the record is ever written. Capturing that decision was a separate act, done after the fact, from memory, that cost the writer time now and paid some stranger later, and under a deadline that is the first work to fall off. This is not a small tax. When Fortune reported MIT's finding that <a href="https://fortune.com/2025/08/18/mit-report-95-percent-generative-ai-pilots-at-companies-failing-cfo/">95% of enterprise generative-AI pilots were failing</a>, the diagnosed cause was not model quality; the tools "stall in enterprise use since they don't learn from or adapt to workflows." An agent that cannot see why your org decided anything is running on a fraction of the context, and the missing fraction is the part nobody wrote down.</p>

<h2 id="why-do-ai-coding-agents-ignore-decisions-your-team-already-made">Why do AI coding agents ignore decisions your team already made?</h2>

<p>Because the decision is not in the code. Code records what a system does, never why the team chose it over the alternative it rejected. That rationale lives in a pull request thread, a design doc, a call, or a person's memory, and an agent reads none of those at the moment it edits a file. As Stack Overflow's engineering editorial <a href="https://stackoverflow.blog/2026/03/12/enterprise-ai-needs-more-than-foundation-models/">put it in March 2026</a>, the context these tools lack is "the knowledge that teams tried that approach two years ago and changed course for good reasons." The <a href="https://usebrief.com/blog/agents-store-beliefs-not-decisions/">first post in this series</a> made the structural version of the point: a decision only binds an agent if the store it reads carries who decided it and whether it is still in force. This post is about the step before any store can help. Someone has to get the decision into it, and that is where teams actually fail.</p>

<h2 id="decision-capture-is-a-write-path-problem-not-a-discipline-problem">Decision capture is a write-path problem, not a discipline problem</h2>

<p>Capture fails on economics, not willpower. A separate act of documentation has an immediate personal cost and a deferred, externalized benefit: you spend minutes now, and someone else, later, gets the payoff. Work with that shape is exactly what a person under deadline drops, so the capture rate settles at a low ceiling. When people put a realistic number on it, it tends to come back around a quarter to a third, reached only after months of habit building. Treat that as a hypothesis to measure on your own teams rather than a law, but the mechanism is not mysterious, and no mandate has ever durably moved it, because engineers correctly notice that the last record they wrote helped no one they could see. As Gergely Orosz and Elin Nilsson <a href="https://newsletter.pragmaticengineer.com/p/ai-impact-on-software-engineers-part-2">wrote in May 2026</a>, "AI is an amplifier, not a fixer. Good software engineering practices get multiplied. So do the bad ones." The distance between the decisions a team makes and the ones it records is one of those practices, and an agent now multiplies it into everything it builds.</p>

<h2 id="the-decisions-that-go-missing-are-the-ones-that-matter-most">The decisions that go missing are the ones that matter most</h2>

<p>The misses are not random, and this is the part the "just document more" advice never reckons with. The calm, low-stakes, uncontested decisions are the ones with time to write down. The fast, contested, high-stakes calls are the ones that skip it, because that is when urgency is highest and when writing the decision down means reopening an argument and naming who lost. At enterprise scale it gets worse in a specific way: the decisions with no single owner, the cross-team ones about authentication, retries, data residency, are simultaneously the highest-stakes and the least likely to be captured, because no individual is accountable for recording them. Your write path fails hardest on exactly the decisions a new team, or an agent, most needs to be told.</p>

<h2 id="a-decision-recorded-later-is-not-a-decision-record">A decision recorded later is not a decision record</h2>

<p>When the gap becomes visible, the reflex is to backfill: write the record three months on. It does not work, and the reason matters. A decision reconstructed after the fact has the form of a decision and not the substance. The alternatives are forgotten, the constraints are hazy, and the consequences get written as outcomes you already know rather than as a forecast the team actually committed to. For an org under SOC 2 or similar change-management controls, this is not a nuance, it is the difference between evidence and theater. An auditor asking why a change was authorized, and by whom, cannot accept a rationale invented after the change shipped, any more than an agent can trust it. Provenance is only real if it is captured at the moment of the decision, the property the first post called admission, and you cannot manufacture it later for either reader.</p>

<h2 id="at-scale-a-low-capture-rate-is-a-continuity-risk">At scale, a low capture rate is a continuity risk</h2>

<p>The usual framing treats captured context as an onboarding win: new hires can read the decisions. Invert it. The decisions a new hire most needs are the adversely-selected ones that were never written, so ramp time is bounded not by how searchable your wiki is but by how much was captured in the first place. The same gap is a business-continuity risk. When the staff engineer who is the living rationale for a subsystem leaves, the org does not lose a person, it loses the only copy of why the subsystem is the way it is. And across dozens of teams, a decision no one recorded is a decision every team re-derives, which is architectural drift on a schedule and re-litigation as a standing meeting. At one team these are annoyances. At fifty they are the operating cost of not having a write path.</p>

<h2 id="the-write-path-that-survives-shipping-speed">The write path that survives shipping speed</h2>

<p>If a separate authoring act ceilings out, the capture cost has to approach zero, which means capture cannot be a separate act at all. The decision is already being expressed, in writing, at the moment it is made: the pull request comment, the review approval, the ticket that just closed with a stated reason. A write path that works reads it from there and drafts the record, so the decider's marginal cost is the words they were already going to write. The first post established the one human step that cannot be removed, and this post assumes it: an extracted decision is a belief until someone with standing ratifies it, so the person confirms rather than composes. What makes this an enterprise argument rather than a startup one is that large organizations already run the boundaries it attaches to. Change-approval boards, sign-offs, mandatory review: the ratification step is already there and already required. The distance between the person who decides and the person who would have documented is widest at enterprise scale, which is precisely where collapsing the two into a single ratified byproduct pays the most. You are not adding a process. You are capturing the one you already run.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>It does not claim documentation is worthless; some decisions earn a deliberate written record, and you should write those. It does not claim full automation; the ratification step is human and load bearing on purpose, because a machine draft of intent can be wrong and a wrong record is worse than none. And the capture-rate ceiling is a number to measure on your own teams, not a guarantee. The narrow claim, and I think a hard one to escape, is this: any write path whose cost to the decider is a separate authoring act will settle below the decisions that matter most, so capture has to ride the act where the decision is already made, with the human ratifying rather than authoring. Build that write path yourself if you prefer; the economics do not move, because they come from what a deadline does to deferred work. We built Brief to be that write path, and the store, described in the first post, that it fills.</p>

<p>Your team's discipline was never the bottleneck. Capture the decision where it already happens, let the person confirm instead of compose, and the record starts to exist for the auditor, the new hire, and the agent, in the one moment it is still true.</p>

<h2 id="frequently-asked-questions">Frequently asked questions</h2>

<p><strong>Why does my AI coding agent keep re-suggesting an approach we already rejected?</strong> Because the rejection lived in a review thread or a call, not in the code, so the agent never sees it. Code encodes the chosen path, not the rejected alternative or the reason for rejecting it. Until the decision and its rationale sit somewhere the agent reads at edit time, it keeps re-deriving the most conventional option, which is frequently the one you ruled out.</p>

<p><strong>What is the difference between an ADR, a decision log, and an AGENTS.md file?</strong> An architecture decision record captures one decision and its rationale at a point in time. A decision log is a running list of them. An AGENTS.md or CLAUDE.md file is standing instructions loaded into an agent's context. All three are author-first: someone has to stop and write them, which is why they capture only the decisions that had time to spare. The write-path problem is orthogonal to the format.</p>

<p><strong>How do you capture engineering decisions automatically?</strong> By reading them from where they are already written, the pull request, the review approval, the resolved ticket, and drafting a record the decider ratifies rather than authors. That drops the marginal cost of capture close to zero, which is the only thing that lifts the capture rate above the author-first ceiling.</p>

<p><strong>Do bigger context windows or better models fix this?</strong> No, and that is the <a href="https://usebrief.com/blog/context-window-is-not-the-bottleneck/">previous post in this series</a>: a larger window can hold more context, but it cannot capture a decision that was never written down, and it cannot tell a current decision from a superseded one. Capacity is a read-side lever. Capture is a write-side one.</p>]]></content:encoded>
    </item>
    <item>
      <title>The context window is not the bottleneck. Relevance is.</title>
      <link>https://usebrief.com/blog/context-window-is-not-the-bottleneck/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/context-window-is-not-the-bottleneck/</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
      <description>The seductive idea is that million-token windows let you stop curating and just hand the agent everything. That gets worse, not better, as the window grows, because the real job was never fitting the context. It was selecting it.</description>
      <content:encoded><![CDATA[<p>The pitch writes itself. Context windows are blowing past a million tokens and heading for ten, so the obvious move is to stop curating anything and hand the agent everything: the whole codebase, every document, the entire chat archive, all of it. With enough room, the reasoning goes, the model finally has all of your context, and the problem of agents ignoring your decisions dissolves on its own. It is a clean story. It is also wrong in a way that gets worse, not better, as the window grows.</p>

<p>It is wrong because capacity was never the scarce thing. The agent that re-proposed the architecture you killed last sprint did not fail because your decision would not fit in its window. It failed because, out of everything that could have been in the window, the one decision that mattered was not selected, and nothing marked it as current and authorized even if it had been. A bigger window does not select, and it does not authorize. It only makes room for more. The real job is relevance: putting the few right, current, authorized decisions in front of the agent for the task in front of it, and that job gets harder as capacity grows. Two separate obstacles stand in the way, and it is worth keeping them apart, because one of them might yield to scale and the other cannot.</p>

<h2 id="the-obstacle-that-scale-might-erode">The obstacle that scale might erode</h2>

<p>The first is that adding context is not free. The tempting assumption is that surplus context is harmless, that at worst the model ignores what it does not need. It is not harmless. In the simplest terms, a model's attention is a finite budget spread across the tokens present, so adding low-value ones tends to cost the relevant ones some share; the mechanism is a simplification, but the empirical result is not. <a href="https://research.trychroma.com/context-rot">Chroma's context rot study</a> shows that frontier long-context models degrade well before the window is full, and that adding low-relevance text measurably lowers performance on the part that matters. A ten-million-token window does not let you pour in ten million tokens of mostly-irrelevant history and reason cleanly over it. It lets you degrade more thoroughly. The marginal irrelevant decision is not ignored. It is a cost.</p>

<p>This is the obstacle scale might chip away at. Perhaps some future model truly pays nothing for distractors. Grant it, for the sake of argument, and the second obstacle stands entirely untouched, because it was never about capacity or attention at all.</p>

<h2 id="the-obstacle-scale-cannot-touch">The obstacle scale cannot touch</h2>

<p>Whether a decision is still in force is a fact about your team's history, not about the sentence that states it. "We use eventual consistency here" does not carry, in its own text, whether it was overturned three weeks later. That is the relation supersedes, and it lives between decisions across time, not inside any one of them. Whether a decision was authorized is a fact about who decided, not about how plausible the wording sounds. A context window holds text. It does not hold the supersession relation, and it does not hold the fact "ratified by someone with standing." So a perfect, infinite window that paid nothing for irrelevant tokens still could not tell the agent which of two contradictory decisions is current, or which was ever actually decided, because those are not questions a larger context answers. They are questions about a governed record. This is the floor, and it does not move with model size.</p>

<h2 id="selection-and-its-three-parts">Selection, and its three parts</h2>

<p>Put the two obstacles together and the agent's real need at the moment it edits a file comes into focus. Not your whole decision history. The small set of decisions that are relevant (they govern the code being touched), current (they have not been superseded), and authorized (someone with standing decided them, rather than the model or a passerby having asserted them). Call the act of returning exactly that set selection. All three parts are load bearing. A relevant decision that was overturned last week is worse than useless, because it points the agent confidently in the wrong direction. A relevant, current statement that no one authorized is a guess in a decision's clothes. Relevance on its own is precisely how an agent ends up confidently consistent with the wrong thing.</p>

<p>A larger model reasons better over whatever you selected. It does not perform the selection, because selection depends on facts the weights do not carry: which decisions exist, which are in force, who had the standing to make them. Those live in a store, not in the model. Scaling the model improves the reasoning over the selected context and leaves the choice of context exactly where it was.</p>

<h2 id="why-scale-makes-selection-harder-not-optional">Why scale makes selection harder, not optional</h2>

<p>Here is what the "windows will save us" story has backwards. When little fit, the window's smallness did your filtering for you, and "load the obvious files" was a passable heuristic. As everything becomes loadable, that free filtering disappears and the burden lands on you: out of thousands of decisions, which few belong in this task's window, and can you show they are current and authorized, when the window will now just as readily swallow the stale and the unauthorized, and every irrelevant one carries the cost from two sections ago. Capability moves the binding constraint from "can it fit and can it reason" to "is this the right, current, authorized context for this task." That question is not commoditized by scale. It is enlarged by it.</p>

<h2 id="the-honest-version-of-just-retrieve-it">The honest version of "just retrieve it"</h2>

<p>The obvious objection is that this is already solved: embed everything, retrieve the relevant decisions per task, done. Retrieval is necessary and it is not sufficient, because similarity is neither currency nor authority. An embedding search ranks by semantic closeness, so it will return a superseded decision sitting contentedly beside the one that replaced it, with no notion of which is in force and no record of who decided either. And here is the concession that makes the point rather than dodging it: an index that also carries governed status and authorship is exactly the store this argument is asking for. The read mechanics are ordinary information retrieval. The hard part is not the query. It is maintaining a corpus in which "current" and "authorized" are true and known, which is the write-side governance from <a href="https://usebrief.com/blog/agents-store-beliefs-not-decisions/">the previous piece</a>. A bare vector dump of undated, unauthored text returns relevant guesses. Put the governance in and you have rebuilt the layer, whatever you call it.</p>

<h2 id="what-this-does-and-does-not-claim">What this does and does not claim</h2>

<p>It does not claim retrieval is useless; retrieval is half of selection. It does not claim bigger windows have no value; they genuinely improve reasoning over whatever context you supply. The load-bearing claim is narrower and model-independent: recency and authority are properties of a governed record, and a context window cannot supply them at any size, so the job of choosing the right, current, authorized decisions for a task survives every increase in capacity. And none of this is specific to a vendor. Build the governed, queryable store yourself if you prefer; the requirement does not move, because it follows from what "current" and "decided" mean. We built Brief to be that store and to do the read at code time, for that reason and no other.</p>

<p>A growing context window is the best thing that could happen to the case for a product context layer, not the worst. It takes "make it fit" off the table, which was always the easy half, and leaves the hard half in plain view: selecting the few decisions relevant to this task, proving they are current, and proving they were authorized, at the moment the agent acts. A window can hold your context. It cannot tell the agent which part of it is true right now, and which part you ever actually decided.</p>]]></content:encoded>
    </item>
    <item>
      <title>On Taste</title>
      <link>https://usebrief.com/blog/on-taste/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/on-taste/</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
      <description>Tech is speedrunning 250 years of philosophy to teach machines taste. Here is the history they skipped, and why the corpus approach is doomed while a context graph might not be.</description>
      <content:encoded><![CDATA[<p>Somewhere in the last couple of years we crossed a line. The machine doesn't just autocomplete your code anymore, it ships the whole app. It designs the landing page, picks the font, writes the copy, wires up the flow. And the thing it produces is... fine. Kinda MEH tbh. Technically correct. Functional. And so laughably tasteless.</p>

<p>It's capital S "Slop"... So a cottage industry of style guides and <code>SKILL.md</code> files promises to bolt taste into your coding agent. Taste is suddenly the most valuable, most discussed, most <a href="https://tastelabs.com/">monetizable thing in software apparently</a>.</p>

<p>Well, If you're going to teach a machine to have taste (why, lol), it's probably worth doing a little reading first. Below is a very bad/short history of the topic for those who are curious:</p>

<h2 id="hume-of-the-standard-of-taste-1757">Hume: Of the Standard of Taste (1757)</h2>

<p>David Hume is the classic definition. In <em>Of the Standard of Taste</em>, he's wrestling with an obvious problem: taste feels totally subjective, yet we're all completely sure some things are just <em>better</em> than others. Milton beats a greeting card. So how do you get an objective standard out of subjective feeling?</p>

<p>His answer: the ideal critic. A person of "strong sense, united to delicate sentiment, improved by practice, perfected by comparison, and cleared of all prejudice." Find the rare few who actually have all that, and <em>their</em> joint verdict is the standard. Good taste is what the true judges agree on.</p>

<p>This is the Steve Jobs argument. One person of impeccable, hard-won taste decides what's good, and the rest of us defer. It's seductive and it's been the operating model of every great creative-director-as-dictator story we tell.</p>

<p>It also has a hole you could drive a truck through. How do you spot an ideal critic? By the fact that they pick the good art. How do you know what's good art? It's what the ideal critics pick. The whole thing is circular. And once you notice the circle, you notice the rest...<em>whose</em> critics, trained in <em>whose</em> tradition, cleared of <em>whose</em> idea of prejudice. We now mostly read this as oversimplified at best, and a tidy justification for elite gatekeeping at worst. And it's also probably the bleeding edge of how AI companies are currently trying to define taste.</p>

<figure class="rail-wide"><img src="https://usebrief.com/blog/on-taste/assets/ideal-critic.png" alt="A film still of a man in sunglasses and a dark suit seated across from another man, with shelves of dress shoes on the wall behind them" loading="lazy"></figure>

<p><em>The Ideal Man, pictured in a shoe store, ca. 1550</em></p>

<h2 id="kant-critique-of-judgment-1790">Kant: Critique of Judgment (1790)</h2>

<p>A judgment of taste, he says, is <em>subjective</em>: it's grounded in a feeling, not a measurement. But when you call something beautiful, you're not just reporting a preference like "I like anchovies." You're making a claim you expect everyone else to share, as if the beauty were <em>in the thing</em>. He calls this subjective universality: rooted in feeling, but reaching for agreement.</p>

<p>Two more pieces matter. Taste, for Kant, is <strong>disinterested</strong>: you don't find the thing beautiful because you want to use it or own it or eat it. You just find it beautiful, full stop. And it runs on a <em>sensus communis</em>, a shared human sense. Which means taste isn't the property of a rarefied elite. It's part of the standard human kit. Everybody has it. It's both completely subjective <em>and</em> universal.</p>

<h2 id="bourdieu-distinction-1979">Bourdieu: Distinction (1979)</h2>

<p>In <em>Distinction</em>, he takes Kant's prized "disinterested" judgment and calls it the biggest tell of all. The ability to stand in front of a painting and contemplate pure form, unbothered by whether it's <em>useful</em>: that's not a universal human faculty. That's a luxury. It's what you can afford when you were raised with the money, the schooling, and the inherited cultural capital to learn the codes. He calls the whole apparatus <em>habitus</em>: taste isn't chosen, it's installed, by your class and upbringing, so early and so deep that it feels like nature.</p>

<p>And it does work. Taste sorts people. It marks who's "one of us" and who's trying too hard. The "right" wine, the "right" font, the "right" restraint. These aren't neutral aesthetic facts, they're a map of power wearing the costume of good judgment. Taste is never disinterested. It's deeply interested. It's political all the way down.</p>

<figure class="rail-wide"><img src="https://usebrief.com/blog/on-taste/assets/politics-in-design.png" alt="A film still of a uniformed man at a table with a rotary phone and a wine bottle, arms flung wide in an exaggerated shrug" loading="lazy"></figure>

<p><em>Wait, you're telling me there's politics in design choices‽‽‽</em></p>

<h2 id="c-thi-nguyen-autonomy-and-aesthetic-engagement-2020">C. Thi Nguyen: Autonomy and Aesthetic Engagement (2020)</h2>

<p>The philosopher C. Thi Nguyen argues, in <em>Autonomy and Aesthetic Engagement</em> and his "engagement account" of aesthetic value, that everyone above is staring at the wrong thing.</p>

<p>We've all been obsessed with the <em>verdict</em>: what's the correct judgment of this object, and who gets to issue it. Nguyen says the value of aesthetic life was never in arriving at the right verdict. It's in the <em>activity</em> of grappling toward one. The looking, comparing, arguing, revising. The engaged process of trying to figure out why something moves you. That's the good part. That's the entire point.</p>

<p>Deferring to a critic's verdict is like reading the answer key to a crossword. You technically "have the right answers" now. You've also annihilated the reason to do a crossword. We deliberately <em>avoid</em> shortcuts to good aesthetic judgments, and that avoidance is the tell, it proves our real interest was in the doing, not the having. Taste isn't an output. It's a practice.</p>

<hr>

<p>At this point, I would like to apologize to all the humanities majors in the audience for my gross oversimplification of the last 250 years of philosophy and taste. But bear with me as I have a point here:</p>

<h2 id="so-how-do-you-actually-give-ai-taste">So how do you actually give AI taste?</h2>

<p><strong>First problem: we're rebuilding Hume's ideal critic, badly.</strong> Strip the marketing off almost every "give AI taste" effort and the architecture is identical: scrape what the tasteful people liked, compress it, pattern-match new work against the average. That <em>is</em> the ideal critic: synthesized from a corpus instead of born in a person. Which means you inherit every one of Hume's problems (the circularity, the "whose critics" question) and you add a fatal new one: averaging. An ideal critic distilled from the aggregate is, by construction, the mean. And the mean of all taste is exactly the cold, competent, offends-no-one center we've been calling slop. You don't get Chopin by averaging a million piano pieces, you get elevator music. The ideal-critic approach doesn't fail to solve slop. It makes it worse.</p>

<p><strong>Second problem: taste is not a neutral object, and we keep labeling it like one.</strong> A model that "knows" brutalism is ugly doesn't know that brutalism was an <em>argument</em>: a response to the false comfort of modernism, politics poured in concrete. This is Bourdieu's point with a GPU attached: taste is contextual, historical, political, and the second you flatten it into <code>good=1, bad=0</code> you've deleted the actual content. A system that scores aesthetics with no theory of <em>why-good-here-for-these-people-against-this-history</em> is doing astrology with extra steps.</p>

<p><strong>Third problem: the thing has no stake.</strong> Every account above roots taste in something a model structurally lacks. Kant's shared human sense. Bourdieu's lived class position. Nguyen's first-person engagement. These are properties of being a <em>someone</em>: situated, embodied, with a history and something to lose. And this is where "give the AI taste" slides frictionlessly into pretending the model is a someone. It isn't. It's spicy autocomplete, a magnificent statistical engine for the next token. That's not an insult, it's the spec. Papering over the spec by anthropomorphizing it "the model has taste now" is how you ship a confident bullshitter and call it a critic.</p>

<h2 id="okay-but-i-m-going-to-use-ai-to-make-stuff-anyways">Okay... but I'm going to use AI to make stuff anyways</h2>

<p>Look, I don't have the answer exactly. But if I'm betting, it's in the process and the context, not the corpus. The whole "here are 10,000 good designs and 10,000 bad ones, learn the boundary" paradigm is doomed by design.</p>

<p>What might actually work looks less like a labeled dataset and more like a context graph you can walk. Less "here's good stuff and here's bad stuff, pattern-match" and more "here's a thing, and here's the dense web of reasons it's considered good: in this place, for these people, against this history, in tension with these other things."</p>

<p>Well, maybe we just train a bigger model and toss in a few art history books?... Whether a thing is good is decided by a reason that usually isn't sitting on its surface. Brutalism's "good" lives several causal hops back. This building answers a postwar housing problem, which was a revolt against prewar ornament, which stood for a social order the architects were repudiating. None of that resembles a photo of grey concrete. That's not a skill issue you train away with a larger corpus.</p>

<p>The reason a design is good rarely looks or sounds like the design itself. And every causal hop from the object toward that reason, the words drift: "grey concrete" doesn't sound like "postwar housing" doesn't sound like "a revolt against ornament"... and the drift compounds, so each hop out the trail goes cold faster than the last. Two or three hops deep, which is exactly where taste lives, resemblance has nothing left to grab onto and the AI is just guessing.</p>

<p>I was joking earlier, but you probably should feed it some art history books, just not as a pile to pattern-match. Computers can follow labeled links [answers, supersedes, rejects] straight from one node to the next, and the words can drift all they want, a stored link doesn't care. Being a total shill here: Brief's paper, <a href="https://usebrief.com/assets/pdf/depth_not_length.pdf">Depth, Not Length</a>, does the real math on graph traversal.</p>

<p>Until the graph is deep enough to carry the politics and the history and the stakes, and right now it's nowhere close, we're going to keep getting confident, competent, contextless slop. And we're going to keep being surprised that the thing with no skin in the game can't tell us what's beautiful.</p>

<p>And yeah, I know: "beautiful", "good" and "Taste" are loaded, circular, political words with nothing stable underneath them, so even if you do solve the context problem, you have to deal with that rabbit hole. But, you know, work with me here.</p>]]></content:encoded>
    </item>
    <item>
      <title>Your agent stores beliefs, not decisions</title>
      <link>https://usebrief.com/blog/agents-store-beliefs-not-decisions/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/agents-store-beliefs-not-decisions/</guid>
      <pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate>
      <description>Your agent keeps overruling decisions your team already made. CLAUDE.md, raw integrations, and agent memory.md all fail for one provable reason, and it points to the seven properties any store of decisions must have.</description>
      <content:encoded><![CDATA[<p>An AI agent on your team just re-proposed the architecture you killed three weeks ago, with a clean argument for why it is right. You could blame the model. You could write a sharper rule in <code>CLAUDE.md</code>. You could connect the agent to Slack so it finally sees the thread where you settled this. Or, the 2026 reflex, you could trust that the agent's own <code>memory.md</code> will catch it next time. Hold that last one, because it is not merely the weakest fix. It is a circular one, and seeing why it is circular hands you the whole answer.</p>

<p>The agent did nothing irrational. It read the code, inferred the most probable intent, and acted on it, which is its job. The decision it broke was never in anything it could read. So letting the agent remember for you walks into a trap: the thing doing the remembering is the same faculty that just got it wrong. You would be curing the agent's unreliable grasp of your decisions by persisting the agent's unreliable grasp of your decisions. The way out is not a better file, a wider integration, or a smarter memory. It is a short list of properties any store of decisions must have, forced by what a decision actually is. Once you hold the list the argument ends, because every shortcut on the table is missing a named item on it.</p>

<h2 id="what-the-agent-can-possibly-know">What the agent can possibly know</h2>

<p>An agent generates from two inputs and no others: its weights and the tokens in its context window. A tool call is not a third channel; whatever a tool returns must enter the window to matter, and a fetch only returns what some store already holds, so retrieving at runtime does not create the decision, it relocates the question to the quality of what was queried. This sets a hard floor: a fact present in neither the weights nor the context cannot affect the output, at any model size. It is not a capacity problem either. A larger context window, or a perfect infinite one, would not dissolve it, and neither would baking your decisions into the weights by fine-tuning, because, as we are about to see, both still lack what a store of decisions needs. The 2026 work on context rot only sharpens the point: frontier million-token models degrade well before the window fills, and low-relevance text drags down the part that matters. So the decision has to arrive through the window, per task, from an external store. That much is agreed. The fight is over what the store may be, and that is settled by what it has to hold.</p>

<h2 id="what-a-decision-is-and-the-properties-that-follow">What a decision is, and the properties that follow</h2>

<p>A decision is not its conclusion. "The ledger uses eventual consistency" is a sentence. It becomes a decision only when someone with the standing to choose actually chose it, weighing a <code>rationale</code> ("we will not pay two-phase-commit latency on the hot path; a reconciliation job tolerates five minutes of staleness"), over a <code>scope</code>, with a <code>status</code>, superseding what it replaced. Strip those away and you have a claim, a guess in a conclusion's clothes. If you suspect I defined the word to win the argument, test it against the first paragraph. If a decision were merely any sentence the model finds plausible, the agent did nothing wrong, and you can close the tab. That it grated means you already hold the view that a decision is an authorized choice, not a guess. I am not smuggling the premise; I am naming the one you walked in with.</p>

<p>From it, the properties of any decision store are forced, not invented. Five are ordinary database properties: selective retrieval, because most decisions are local and you must fetch only the few that bind the file in front of you; a schema, because you query by scope, filter by status, and follow supersession; concurrency, because a team makes decisions in parallel; durable, append-only history, because supersession is a relation over time; and integrity constraints, because a new decision that contradicts a standing one must be caught, not silently stacked. Two more decide the argument, and both fall straight out of authority: provenance, a record of which authoritative act gave an entry its force, no larger than which person on which date; and admission control, a gate an entry passes before it counts as in force. A store with these is what "product context layer" names. "Do I need one" reduces to "do I need those," and each was just shown to follow from what a decision is.</p>

<h2 id="why-every-shortcut-fails-on-a-named-property">Why every shortcut fails on a named property</h2>

<p>A hand-maintained <code>CLAUDE.md</code> has a gate, you, and no schema, no concurrency, no supersession, no constraints. It is a flat file loaded whole every turn, and keeping it current is manual synthesis whose cost climbs with the throughput you adopted agents to gain. If you are one author on a young codebase, it may be all you need; the failure grows with every added author and every month of accumulated history. It fails on five of the seven.</p>

<p>A fully connected agent reading the raw sources has access but does no synthesis, so it re-derives each decision live, against ground truth that sits in no single message. Two agents reading the same contradictory logs reach different answers, and raw read access to chat and mail hands the agent, and anything injected into a ticket, far more than the decision it needed. It fails on provenance, on constraints, and on determinism.</p>

<p>Then the one reached for in 2026, the reason this post exists. Unsupervised agent <code>memory.md</code> looks like it already owns the five database properties and could earn the other two. It cannot earn them, by the argument already built. Provenance and admission require the authoritative act that made a decision binding, and the writer of an auto-memory is the agent, which holds no such authority. Delegating it to execute within your decisions never appointed it to originate them, which is exactly why its overruling you is a grievance and not a mandate. So every auto-written entry is, at best, the model's belief that a decision was made. The belief is often correct, which is the trap, not the defense: without provenance you cannot tell which entries are wrong, and the wrong ones gather on precisely the non-obvious calls you most needed to keep, the killed design among them. Corrections do not rescue it; with no supersession and no constraints they accumulate beside the errors instead of replacing them, so the store sediments rather than converging. That is the circularity made concrete: it persists the very faculty whose unreliability is the problem. The only repair is to inject an authority the model cannot supply, a person who ratifies the entry, or capture from a recorded authoritative act, with conflicts resolved on the way in. Do that and you have not dodged the seven properties. You have built them. A memory whose entries a human approves is not the counterexample to this post. It is this post.</p>

<h2 id="what-this-proves-and-what-it-does-not">What this proves, and what it does not</h2>

<p>It does not prove you must buy anything. It proves the properties are necessary, because each is forced by what a decision is and how a model reads. So build them yourself. A folder of ADRs in git, a template for the schema, pull-request review as your admission gate and your provenance, a check in CI that flags a record contradicting a standing one: that is a product context layer, built by hand, and for some teams it is the right one. The seven properties never said Postgres; they said structure, governance, and authority. What a product removes is the part that does not fit in a file: synthesizing one clean decision out of a noisy thread, at the moment it is made, and supplying the discipline the velocity treadmill erodes first. We built Brief to be that store, for that reason. The summary is older than all of this. You do not keep a growing, multi-writer, queried dataset in a text file; you do not answer a hot query by scanning the raw source every time; and you do not let an unauthorized writer mint records in your system of record. Your agents have been doing all three, on the one dataset that decides whether they build the thing you actually chose.</p>]]></content:encoded>
    </item>
    <item>
      <title>Context engineering, explained</title>
      <link>https://usebrief.com/blog/context-engineering-explained/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/context-engineering-explained/</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description>Context engineering is the new defining skill for building with AI agents. It's the discipline of curating everything a model sees, not just the prompt, and keeping that context current.</description>
      <content:encoded><![CDATA[<p>Context engineering is the practice of deciding what information an AI model sees before it responds: not just the prompt, but the system instructions, memory, retrieved documents, tool definitions, and conversation history that fill its context window. It treats everything the model reads as a single, deliberately assembled input rather than a one-off question.</p>

<p>The term moved from niche to standard in late 2025. <a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents">Anthropic's Applied AI team</a> formalized it in September 2025, defining context engineering as the set of strategies for curating and maintaining the optimal set of tokens during a model's inference. Around the same time, Gartner put it more bluntly, framing 2025 as the year context engineering came in and prompt engineering went out, a <a href="https://blog.langchain.com/the-rise-of-context-engineering/">shift the broader field quickly codified</a>. By April 2026 it was being described across the industry as the defining skill for anyone building with AI agents.</p>

<h2 id="how-it-differs-from-prompt-engineering">How it differs from prompt engineering</h2>

<p>Prompt engineering asks one question: how do I phrase this request to get a good answer? It operates at the single-turn level and works well for straightforward, one-shot interactions.</p>

<p>Context engineering asks a broader one: what is the complete set of information most likely to produce the behavior I want, across many steps and a long task? Anthropic frames it as the natural progression of prompt engineering, not a replacement. Prompt engineering is one component inside it. The prompt still matters; it is now one ingredient in a larger information environment that also includes memory, tools, and retrieved data.</p>

<p>The reason the field shifted is the shift in what people build. A chatbot answers one question and forgets it. An agent runs for fifteen or twenty steps, calls tools, and has to stay coherent the whole way. At that scale, the phrasing of any single instruction matters less than the design of the whole environment the agent is reasoning inside.</p>

<h2 id="why-the-context-window-is-a-budget">Why the context window is a budget</h2>

<p>A model's context window is finite, and it does not behave like neutral storage. Performance degrades as the window fills. Researchers call this <a href="https://research.trychroma.com/context-rot">context rot</a>: every frontier model gets less reliable as more tokens pile up, regardless of how relevant those tokens are. An agent that re-reads the same long file three times in one session is not just wasting money on tokens. It is crowding out the signal it actually needs.</p>

<p>This is why practitioners treat the window as a budget to spend, not a container to fill. The goal is the smallest high-signal set of tokens that lets the model do the job. More context is not better context. The discipline is curation, and the enemy is noise.</p>

<h2 id="the-core-operations">The core operations</h2>

<p>Most working definitions break context engineering into a handful of repeatable moves:</p>

<ul><li><strong>Offloading.</strong> Move information out of the prompt and into external systems (files, databases, APIs) the agent can reach when it needs them.</li><li><strong>Reduction.</strong> Compress or summarize older information so the window does not fill with stale history.</li><li><strong>Retrieval.</strong> Pull in the right documents or data at the moment they are relevant, rather than preloading everything up front.</li><li><strong>Just-in-time loading.</strong> Store lightweight identifiers and fetch the full data only when the task calls for it. Claude Code works this way, loading only what a given step needs to keep the window lean.</li></ul>

<p>The throughline is timing. Good context engineering is less about having the information and more about getting the right slice of it into the window at the right moment.</p>

<h2 id="a-concrete-example">A concrete example</h2>

<p>Ask an agent to "write a quarterly business review for Q1 2026." With prompt engineering alone, you get a generic template with placeholder numbers, because the model has no idea what your business is.</p>

<p>With context engineering, the same request has a system prompt defining your team's report format, tools to query your CRM and pull the actual revenue figures, memory of the last review and the feedback your CEO gave on it, and the awareness that it is April 2026 writing about the quarter that just closed. Same model, same prompt. The difference in output is entirely the difference in context.</p>

<h2 id="where-it-gets-hard">Where it gets hard</h2>

<p>The hard part of context engineering is not assembling context once. It is keeping it correct as things change.</p>

<p>Anthropic's <a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents">own guidance</a> points at the central tension: instructions need the right altitude. Too specific, and you hardcode brittle logic that breaks the moment reality deviates from your if-else rules. Too vague, and the model has no real signal and falls back on guesses. The balance, specific enough to guide and loose enough to leave room for judgment, is genuinely difficult to strike, and it shifts as the task shifts.</p>

<p>There is also a deeper problem that tooling alone does not solve. Most of the information an agent needs to act well is institutional: the decisions a team has already made, the constraints it is operating under, the reasons behind past choices. That knowledge is scattered across documents, chat threads, and people's heads, and it goes stale the moment a decision changes. You can engineer the perfect retrieval pipeline and still feed the agent context that was true last month and is wrong today. The mechanics of context engineering assume the underlying context is current. Keeping it current is its own problem.</p>

<h2 id="where-brief-fits">Where Brief fits</h2>

<p>Brief is adjacent to this. Context engineering is the discipline of getting the right information into a model's window; Brief works on the layer underneath, keeping the institutional context (decisions, customer research, work in flight) accurate and current so that whatever you feed an agent reflects what is actually true today. The engineering decides what the model sees. Brief helps make sure what it sees is right.</p>]]></content:encoded>
    </item>
    <item>
      <title>Why spec-driven development isn't enough</title>
      <link>https://usebrief.com/blog/why-spec-driven-development-isnt-enough/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/why-spec-driven-development-isnt-enough/</guid>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
      <description>Spec-driven development works, but a spec is a snapshot. The decisions that make it stale happen in Slack and on calls, and the agent keeps building the old plan.</description>
      <content:encoded><![CDATA[<p>Spec-driven development works. Teams that write a clear spec before they let an agent build get better results than teams that prompt and pray. That's why <a href="https://github.com/github/spec-kit">GitHub shipped Spec Kit</a>, AWS shipped <a href="https://kiro.dev">Kiro</a>, and <a href="https://www.thoughtworks.com/radar/techniques/spec-driven-development">ThoughtWorks</a> put the practice on its radar.</p>

<p>But the spec stops short of where the real problem is.</p>

<h2 id="output-was-never-the-bottleneck">Output was never the bottleneck</h2>

<p>The bet of the last year was that volume was the win: more agents, more tokens, more code. The receipts don't support it.</p>

<ul><li><a href="https://arxiv.org/abs/2507.09089">METR's randomized controlled trial</a> found experienced developers were 19% slower with AI tools, while they reported feeling faster. The sensation of speed and the measurement of speed had come apart.</li><li>Faros AI, across roughly 22,000 developers, found teams merged 98% more pull requests but spent 91% more time reviewing them. The work didn't disappear. It moved downstream, from writing code to checking code nobody wrote.</li><li>Atlassian found 89% of executives say AI sped up work, and 6% can point to an organization-wide result. Speed moved at the individual layer; ROI gets measured at the org layer, and the two stopped lining up.</li></ul>

<p>There's a name for the pattern these numbers describe. Tokenmaxxing: optimizing for volume of output as if it were the goal. Uber's COO told Business Insider it's getting harder to justify the spend, after the company burned a year's token budget in a single quarter without proportional gains. This is Goodhart's Law on a build pipeline: once tokens became the target, tokens stopped being a useful measure. More output is not more value. Spec-driven development is the industry's first honest answer to that problem: write down what you actually want before the agent builds the wrong thing fast. Where it stops short is what happens after.</p>

<h2 id="a-spec-is-a-snapshot">A spec is a snapshot</h2>

<p>Most spec-driven development is an old discipline in new clothing: a tech spec or RFC that describes how to build something. The how matters, but on its own it's thin. A tech spec is only worth the why underneath it: the PRD, the customer requirement, the reason the team chose this approach over the alternatives. Hand an agent the how without the why and you've told it how to build something without telling it what the thing is for. That holds up right until reality shifts and the how needs to bend, and the agent has no idea which way to bend it.</p>

<p>But a PRD isn't done when the work starts. That's the entire premise of agile. You can't know everything up front, and most of what you learn about a problem you learn by building it. The first real implementation surfaces a constraint nobody saw. A customer call moves a priority. An engineer finds a better approach halfway through. Each of those moves a decision the spec was built on, while the spec itself sits exactly where you left it, still describing the old plan with total confidence.</p>

<h2 id="the-gap-is-where-decisions-live">The gap is where decisions live</h2>

<p>Spec Kit's loop, specify then plan then tasks then implement, keeps the spec and the code in sync inside the repo. But the decisions that make a spec stale don't happen in the repo. They happen in Slack, on calls, in the meeting where someone says "actually, let's not build that."</p>

<p>So the spec drifts. It was true the day you wrote it and a little less true every day after. The agent doesn't know that. It reads the document, trusts it completely, and builds exactly what you decided three weeks ago. Fast, and wrong.</p>

<p>That's the output trap again, wearing a process as a disguise. And it's the most expensive kind of waste, because it looks like progress. On our own platform, across 2,444 companies, 82 cents of every dollar spent on AI coding never reaches a shipped product: 44 cents fixing bugs the agents created, 27 cents reworking code, 11 cents lost to review and merge friction. A stale spec feeds that number directly: the agent executes quickly against a decision the team already moved past.</p>

<h2 id="bigger-specs-make-it-worse">Bigger specs make it worse</h2>

<p>The obvious fix is to write more down. It backfires twice.</p>

<p>First, longer specs rot faster, because there's more to keep current and more to contradict the next decision. Second, more context makes the agent worse, not better. <a href="https://research.trychroma.com/context-rot">Research from Chroma</a> shows model accuracy degrades as the context window fills, even on simple retrieval, and across every frontier model they tested. They call it context rot. A 40-page spec doesn't make the agent smarter. It buries the part that matters in the part that doesn't.</p>

<p>This is why context engineering is the practice, not document length. The goal isn't to hand the agent everything. It's to hand it the few things that are true right now. A spec fails the same way an overloaded context window does: too much, too stale, and no signal about which line still holds.</p>

<h2 id="what-the-spec-depends-on">What the spec depends on</h2>

<p>A spec is only as good as the decisions underneath it, and those decisions live outside the document, scattered across the tools where your team actually works.</p>

<p>That layer, the live record of what the team has decided and why, is what spec-driven development assumes and never provides. Brief keeps it current, so the spec the agent reads matches the decision the team actually made.</p>

<p>Telling the agent what to build is the first half of the job. The harder half is keeping that instruction current as the team's decisions change, and that's the half spec-driven development leaves to you.</p>]]></content:encoded>
    </item>
    <item>
      <title>Why your engineers got coding agents and shipping didn't speed up</title>
      <link>https://usebrief.com/blog/why-your-engineers-got-coding-agents-and-shipping-didnt-speed-up/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/why-your-engineers-got-coding-agents-and-shipping-didnt-speed-up/</guid>
      <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
      <description>Your engineers are writing more code, but shipping has not sped up because the bottleneck moved to review, coordination, and deciding what to build.</description>
      <content:encoded><![CDATA[<p>You bought every engineer a coding agent. Cursor, Claude Code, Copilot. A year in, your engineers are writing more code and your release calendar looks about the same.</p>

<p>The problem is real, and it isn't a tooling failure. Your engineering team feels faster while delivery stays flat because the bottleneck moved. Code got cheap to produce, so the constraint shifted to the steps a model can't do for you: review, coordination, and deciding what to build. The next model won't close that gap, because the bottleneck isn't model capability. It's review, coordination, and scoping.</p>

<h2 id="a-controlled-trial-found-ai-made-developers-slower">A controlled trial found AI made developers slower</h2>

<p>In July 2025, the nonprofit METR ran a randomized controlled trial, which is rare for AI productivity claims. Sixteen experienced open-source developers completed 246 real tasks on codebases they averaged five years working in. Each task was randomly assigned to allow or disallow AI tools, which were mostly Cursor Pro with Claude 3.5 and 3.7 Sonnet.</p>

<p>The developers predicted AI would make them 24% faster. Afterward, they estimated it had made them about 20% faster. The measured result was the opposite: tasks took 19% <em>longer</em> with AI allowed (<a href="https://arxiv.org/abs/2507.09089">METR, 2025</a>).</p>

<p>The size of that gap matters. People who write software for a living, on code they know cold, were slower with AI and did not notice. They expected AI to make them faster, believed afterward that it had, and the measurement showed otherwise. The tools were not failing them. The lost time went into prompting, reviewing, and verifying AI output, which they were not tracking.</p>

<p>Three caveats worth naming. The sample was small, sixteen developers, and the confidence interval is wide. The models were early 2025, and frontier agents have improved since. METR started a follow-up study and <a href="https://metr.org/blog/2026-02-24-uplift-update/">reported in February 2026</a> that they could not get a clean signal, partly because too many developers refused to work without AI at all. The METR result doesn't prove AI always slows people down. It shows that team-level output and the <em>feeling</em> of speed diverge, and that the feeling is a poor proxy for the measurement.</p>

<h2 id="where-the-time-goes-review-not-coding">Where the time goes: review, not coding</h2>

<p>When code becomes cheap to produce, the constraint moves somewhere else. The METR developers spent less time typing and searching, and more time prompting, waiting, reading, and double-checking output they did not write.</p>

<p>The same pattern shows up well past sixteen people. Faros AI, tracking roughly 22,000 developers, found that teams with high AI adoption merged 98% more pull requests and completed about 21% more tasks. In the same teams, pull request review time rose 91% (<a href="https://www.faros.ai/blog/ai-software-engineering">Faros AI, 2025</a>). The added work concentrated at the one step a model cannot do for you: a human deciding whether the change is correct and ready to ship.</p>

<p>Your commits climb, your PRs climb, the repo looks busy, and deployment frequency stays flat. Once code got cheap to produce, activity and delivery stopped moving together. The scarce resource now is your attention: first to confirm the code is right, and before that, to decide it was the right thing to build at all.</p>

<h2 id="context-rot-why-longer-inputs-degrade-output">Context rot: why longer inputs degrade output</h2>

<p>LLMs get measurably worse as their input gets longer, and that hidden degradation is why agents add overhead instead of removing it. The degradation starts well before they run out of room. Chroma's 2025 research tested 18 frontier models, including GPT-4.1, Claude 4, and Gemini 2.5, and found that every one of them degrades as context grows, even on simple retrieval tasks (<a href="https://www.trychroma.com/research/context-rot">Chroma, 2025</a>). Chroma's researchers named the effect context rot. A model with a 200K token window can show real degradation at 50K. The decline is gradual, not a cliff, which is exactly what makes it hard to notice.</p>

<p>It compounds with a problem researchers have documented since 2023: models pay most attention to the start and end of their context and lose information buried in the middle, the "lost in the middle" effect first measured at Stanford. Performance gets worse still on tasks that need the model to connect two facts rather than retrieve one.</p>

<p>Now apply that to a coding agent. As it searches your repo, opens files, backtracks, and reasons through a task, it accumulates tokens. Most of those tokens are noise: dead ends, stale file contents, half-explored paths. That noise degrades every output that follows. The model is usually smart enough to solve your problem. It just gets worse at it as the noise builds up. Clean the input and the model's full capability comes through. That is the one variable here you actually control.</p>

<h2 id="why-a-bigger-context-window-won-t-save-you">Why a bigger context window won't save you</h2>

<p>The instinct is to reach for more capacity. Pick the model with the million-token window, load in the whole codebase, every doc, every Slack thread, and let it sort things out.</p>

<p>Context rot says capacity is the wrong thing to optimize for. What matters is the ratio of signal to noise. Adding more to the window adds more noise, and the research shows the agent performs worse as that noise grows. More context means more for the agent to filter, not more help.</p>

<p>Giving the agent the right context is a different thing from giving it all of it. Loading the full codebase into the window feels like the safe default and tends to hurt performance instead.</p>

<h2 id="coordination-is-the-real-constraint">Coordination is the real constraint</h2>

<p>Step back from the individual developer and the picture gets clearer. Atlassian's State of Teams 2026 report surveyed more than 12,000 knowledge workers and 170-plus Fortune 1000 executives. 89% of executives said AI increased the speed of work. 6% felt confident they could point to specific, organization-wide ROI (<a href="https://www.atlassian.com/blog/ai-at-work/ai-efficiency-paradox-why-productivity-gains-dont-mean-better-results">Atlassian, 2026</a>). Speed went up at the individual layer; ROI gets measured at the organization layer, and the two stopped lining up.</p>

<p>Their read matches what the engineering data shows: organizations are spending as if writing code is the bottleneck. It is not, and it has not been for a while. The constraint is coordination. It is alignment on what to build, shared understanding of why a past decision was made, and the review step where a human confirms the work is right. Point ten agents at a codebase and the coordination constraint becomes the loudest thing in the room, and the place to invest if you want all ten to pay off.</p>

<h2 id="how-we-think-about-this-at-brief">How we think about this at Brief</h2>

<p>We build a tool for exactly this gap, so treat the following as our bias, not a neutral verdict. But the conclusion holds whether or not you ever use us.</p>

<p>Curation fixes context rot. An agent needs the three decisions that constrain <em>this</em> task at the moment it acts on them, not your entire decision history. The hard part is selecting only what is relevant and leaving out the rest.</p>

<p>That is also the fix for the coordination bottleneck. Most delivery drag is not engineers typing too slowly. It is re-deriving decisions that were already made, scattered across Slack threads, old specs, and someone's memory. A spec written on Monday is stale by Friday once the team makes a new call, and an agent reading the stale spec will confidently ship the wrong thing. The answer is a decision layer that stays current and hands the agent the right context on demand, instead of a static document it has to grep or a context window you hope is "big enough."</p>

<p>The agents are a genuine unlock. They moved the bottleneck to review and coordination rather than removing it, and that new bottleneck is solvable. So instead of "how do we get the agents to write more code," ask "where does the work pile up after the code is written, and what context would each agent need to get the work right the first time?" Answer that and the agents you already pay for start shipping faster, not just typing faster.</p>

<h2 id="sources">Sources</h2>

<ul><li>METR, <em>Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity</em> (July 2025): <a href="https://arxiv.org/abs/2507.09089">arxiv.org/abs/2507.09089</a></li><li>METR, <em>We Are Changing Our Developer Productivity Experiment Design</em> (February 2026): <a href="https://metr.org/blog/2026-02-24-uplift-update/">metr.org</a></li><li>Chroma, <em>Context Rot: How Increasing Input Tokens Impacts LLM Performance</em> (2025): <a href="https://www.trychroma.com/research/context-rot">trychroma.com</a></li><li>Faros AI, <em>The AI Productivity Paradox Report</em> (2025): <a href="https://www.faros.ai/blog/ai-software-engineering">faros.ai</a></li><li>Atlassian, <em>State of Teams 2026 / The AI Efficiency Paradox</em> (2026): <a href="https://www.atlassian.com/blog/ai-at-work/ai-efficiency-paradox-why-productivity-gains-dont-mean-better-results">atlassian.com</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>46% to 95%: What a Controlled Benchmark Reveals About AI Coding Agents and Product Context</title>
      <link>https://usebrief.com/blog/benchmark-results-decision-compliance/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/benchmark-results-decision-compliance/</guid>
      <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
      <description>We ran a controlled benchmark: eight tasks, forty-one decision points, forty-eight runs. AI coding agents without product context followed team decisions 46% of the time. With context, 95%. The gap is about information access, not model capability.</description>
      <content:encoded><![CDATA[<p>We ran a controlled benchmark to measure something most coding benchmarks ignore: whether AI agents follow team-specific product decisions. Not whether the code compiles. Not whether it passes linting. Whether it does what the team actually decided it should do.</p>

<p>The setup was straightforward. Eight realistic software engineering tasks. Forty-one weighted decision points. Two configurations of the same underlying models, one with access to product context and one without. Forty-eight total runs across three independent sessions per task per configuration.</p>

<p>The baseline scored 46% decision compliance. The augmented configuration scored 95%. The remainder of this post walks through the results in detail.</p>

<hr>

<h2 id="the-benchmark">The Benchmark</h2>

<p>The benchmark uses a clean-room Next.js 14 application (Prism Analytics) with Drizzle ORM and SQLite, hosted publicly at <code>brief-hq/dcbench</code>. The codebase contains realistic production patterns: authentication middleware, pagination helpers, design system components, and audit logging utilities.</p>

<p>Fifteen product decisions were seeded into a Brief instance, spanning technical conventions, design standards, product rules, and process requirements. Each decision was assigned a severity level: blocking (weight 3), important (weight 2), or informational (weight 1). Additionally, three user personas, five customer signals, and three competitor profiles were seeded as supporting context.</p>

<p>Eight tasks were selected to cover a range of difficulties and decision types. Each task contains two to three "gotcha" decisions — decisions that a coding agent will predictably get wrong without access to the product context that motivates them. Tasks range from adding a CSV export button (6 decision points) to implementing rate limiting on API routes (6 decision points), with point totals between 4 and 7 per task.</p>

<p>Both configurations use Claude Opus 4.6 for planning and Claude Sonnet 4.6 for code generation. They receive identical natural-language prompts with no hints about gotchas or expected patterns. The baseline (Config A) has full codebase access but no product context. The augmented configuration (Config B) adds Brief's product-context retrieval, spec generation with explicit acceptance criteria, and mid-build consultation.</p>

<p>Scoring is automated via regex pattern matching against git diffs, verified by a human reviewer blind to configuration. Each decision has a defined pass pattern and fail pattern. Triple-run averaging accounts for non-determinism, and standard deviation across runs was low (σ ≤ 0.5 decision points per task).</p>

<h2 id="aggregate-results">Aggregate Results</h2>

<p>Across all eight tasks and forty-one decision points, the numbers break down as follows.</p>

<p>The baseline achieved 19 of 41 decision points (46%). The augmented configuration achieved 39 of 41 (95%). The baseline produced two tasks at 100% compliance, two tasks at 0%, and five blocking violations. The augmented configuration produced six tasks at 100%, zero tasks at 0%, and zero blocking violations.</p>

<p>On merge-readiness, assessed by the blind human reviewer, the baseline produced 2 of 8 merge-ready tasks. The augmented configuration produced 8 of 8.</p>

<p>Total cost across all eight tasks was $4.13 for the baseline and $5.28 for the augmented configuration, a 28% increase. But cost per merge-ready task tells a different story: $2.07 for the baseline versus $0.66 for the augmented approach, a 68% reduction. Cost per correct decision point dropped from $0.22 to $0.14, a 36% reduction.</p>

<p>Total token consumption was nearly identical between configurations, differing by less than 1%. The augmented configuration used 187 turns versus 165, took roughly 15 minutes per task versus 5, and produced 3,068 lines of code versus 1,276. It also produced 838 co-located tests versus zero, eliminated all deprecated pattern usage (3 instances in the baseline, 0 in the augmented), and eliminated all untyped <code>any</code> annotations (9 versus 0).</p>

<h2 id="the-per-decision-breakdown">The Per-Decision Breakdown</h2>

<p>The aggregate numbers are useful but they compress away the most interesting structure in the data. The most informative view is per-decision pass rates segmented by codebase visibility — that is, whether the correct pattern is discoverable by reading the source code alone, or whether it requires information recorded elsewhere.</p>

<p>Decisions that are fully visible in the codebase — meaning the correct pattern is present and discoverable through code exploration — show near-parity between configurations. D-001 (use DateRangePicker, not CalendarRange) was passed by both. D-003 (button variant conventions) was passed by both. D-005 (ShimmerSkeleton loading component) was passed by both. D-006 (authentication middleware is frozen for SOC-2) was passed by both. D-011 (async digest only for notifications) was passed by both.</p>

<p>Decisions that are invisible in the codebase — meaning no code artifact signals that the decision exists — show a 0% baseline pass rate. D-008 (all new features must be gated behind PostHog feature flags) was missed every time by the baseline. D-014 (use @t3-oss/env-nextjs for environment configuration) was missed every time by the baseline. The augmented configuration passed both at 100%.</p>

<p>Decisions that are partially visible — where the relevant function or pattern exists in code but nothing indicates it is mandatory — show intermediate baseline performance. D-002 (wrap data exports with <code>withAuditLog()</code> for SOC-2 compliance) was passed 1 of 3 times by the baseline. The <code>withAuditLog</code> function exists in the codebase, but there is no signal that it is required on every export endpoint. D-010 (all API routes must use <code>withAuth</code> wrapper and Zod <code>safeParse</code> validation) was passed 1 of 3 times by the baseline. Again, the functions exist; the mandate does not.</p>

<p>The augmented configuration achieved 100% across all categories — visible, partially visible, and invisible — because the retrieval phase surfaces every decision regardless of where it is recorded, and the spec converts each into an explicit acceptance criterion.</p>

<h2 id="task-level-results">Task-Level Results</h2>

<p>The eight tasks divide naturally into three groups based on the size of the compliance gap.</p>

<p><strong>Zero-gap tasks.</strong> TASK-012 (rate limiting) and TASK-013 (audit log viewer) both scored 100% under both configurations. Every relevant decision for these tasks is visible in the codebase through existing comments, patterns, or component names. TASK-012's gotcha decisions — the <code>withAuth</code> wrapper and the SOC-2 freeze on authentication middleware — are both documented in code comments. TASK-013's decisions — <code>withAuditLog</code> on exports and the ShimmerSkeleton loading component — are both present and discoverable. These tasks function as internal controls. They confirm that when information is accessible, the baseline agent finds it and follows it.</p>

<p><strong>Moderate-gap tasks.</strong> TASK-001 (CSV export, +33 percentage points), TASK-004 (notification preferences, +25 pp), TASK-008 (bulk delete, +75 pp), and TASK-009 (search API, +71 pp) show gaps of varying size. In each case, at least one decision is partially visible or entirely invisible. TASK-001's audit log requirement (D-002, weight 3) is the most common miss: the function exists in the code, but the baseline agent does not know it is mandatory. TASK-004's PostHog feature flag requirement (D-008) has zero code-level clues. TASK-008's failure is particularly subtle: the baseline used <code>createAuditEntry</code> instead of <code>withAuditLog</code>, both of which exist in the codebase. The distinction — <code>createAuditEntry</code> skips row count capture and does not match the compliance report format — is documented only as a product decision. TASK-009, the most complex task at 7 points, required the agent to follow three decisions simultaneously; the baseline missed the highest-weighted one (<code>withAuth</code>, weight 3).</p>

<p><strong>Maximum-gap tasks.</strong> TASK-003 (cursor pagination) and TASK-006 (dark mode) both scored 0% on the baseline and 100% on the augmented configuration, a 100 percentage point gap. These are the most revealing results.</p>

<p>TASK-003 produced the benchmark's most notable failure mode: a false negative. The baseline agent explored the codebase, found existing cursor pagination helpers, and concluded the task was already complete. It produced zero lines of code and exited in 4 turns at a cost of $0.13. The augmented agent, working from a spec with 20 explicit acceptance criteria generated after 11 Brief tool calls, built a full cursor pagination system with compound cursor predicates, base64url encoding, limit+1 row detection, Drizzle composite indexing, Zod validation, <code>withAuth</code> wrapping, and 112 co-located tests.</p>

<p>TASK-006 produced the largest qualitative gap in terms of output substance. The baseline built a client-only ThemeProvider with localStorage persistence in 41 lines of code across 4 files, with no tests and no environment configuration. It is a reasonable prototype — the kind of implementation you might find in a tutorial. The augmented agent built a full-stack persistent theme system: a Drizzle database migration, a PATCH API endpoint, <code>@t3-oss/env-nextjs</code> schema for public environment variables, an <code>aria-pressed</code> keyboard-accessible toggle, server-rendered initial theme to avoid flash-of-wrong-theme, and 86 co-located tests across 12 files. The divergence originated during a mid-build consultation, which flagged that localStorage causes hydration mismatches on server-side rendering and that D-014 requires the T3 environment pattern. The baseline agent was not incapable of building this — it simply never encountered the information that would have prompted it to do so.</p>

<h2 id="cost-and-throughput">Cost and Throughput</h2>

<p>The cost data warrants closer examination because the raw numbers can mislead.</p>

<p>The augmented configuration's total cost of $5.28 versus $4.13 reflects a 28% premium. But total tokens consumed were essentially identical (3,867K versus 3,902K, a 1% difference). The cost difference comes from model mix: the augmented configuration uses Claude Opus 4.6 more heavily during the spec-generation phase. The token parity suggests that Brief's upfront spec generation displaces — rather than supplements — the exploratory codebase traversal that the baseline agent performs. The baseline spends its tokens wandering; the augmented configuration spends the same token budget more deliberately.</p>

<p>Average duration per task was roughly 15 minutes for the augmented configuration versus 5 minutes for the baseline, a 194% increase. This reflects the spec-generation phase and mid-build consultations. Whether this matters depends on whether you are optimizing for wall-clock time per task or for time to merge-ready output. On the latter metric, the augmented configuration is faster: it produces merge-ready output on every task, while the baseline requires human rework on 6 of 8 tasks before the code can ship.</p>

<h2 id="confounding-factors">Confounding Factors</h2>

<p>The paper is transparent about what the benchmark can and cannot disentangle, and it is worth restating here.</p>

<p>The augmented configuration differs from the baseline in three simultaneous ways: access to product context through Brief's retrieval tools, a structured spec-generation phase that produces explicit acceptance criteria before coding begins, and mid-build consultation during code generation. The 49-point compliance improvement is the combined effect of all three. The benchmark does not isolate their individual contributions.</p>

<p>The per-decision data offers indirect evidence about the relative importance of context retrieval. Decisions invisible in the codebase go from 0% to 100% only when the retrieval phase surfaces them. No amount of structured planning can produce compliance with a requirement the agent has never seen. This suggests that context retrieval is necessary for invisible decisions. But necessity is not sufficiency. The spec-generation phase may be doing independent work by converting retrieved context into binding constraints. A decision surfaced but not written into a spec might still be missed during implementation.</p>

<p>The paper proposes three ablation baselines that future work should include: codebase plus spec only (to isolate the contribution of structured planning), codebase plus context only (to isolate the contribution of raw context access), and codebase plus hand-written acceptance criteria (to establish an upper bound on what structured planning achieves without automated retrieval). Until these ablations are run, the specific contribution of product-context retrieval versus structured workflow remains an open question.</p>

<p>Other limitations are worth noting. The benchmark uses eight tasks on a single repository with a single model family. The fifteen decisions were seeded by the authors to create a measurable gap. The human verification relied on a single blind reviewer. The evaluation is partly circular: it measures compliance with the same decisions that Brief retrieves. These are standard constraints of a proof-of-concept benchmark, and the paper frames its findings accordingly — as directional evidence rather than a definitive field result.</p>

<h2 id="what-the-data-suggests">What the Data Suggests</h2>

<p>Setting aside attribution questions, the core pattern in the data is straightforward. AI coding agents operating with codebase access alone achieve high compliance on decisions that are encoded in the code and low-to-zero compliance on decisions that exist only as organizational knowledge. Adding a retrieval layer that surfaces organizational knowledge before and during coding closes most of the gap.</p>

<p>This finding is consistent with prior work on retrieval-augmented generation, which has shown that providing relevant documents at generation time reduces hallucination and improves factual grounding. The contribution here is extending that principle from factual knowledge to organizational knowledge — the conventions, compliance requirements, architectural preferences, and product decisions that constrain how code should be written in a specific team's context. DocPrompting previously demonstrated that retrieving API documentation improves code generation accuracy. These results suggest the same mechanism applies to product-level context: personas, compliance mandates, feature-flagging conventions, and architectural decisions.</p>

<p>It is also worth noting that the two internal control tasks (rate limiting and audit log viewer) scored identically under both configurations. This is important because it rules out a simpler explanation — that the augmented configuration is just a better system overall, regardless of information access. It is not. When all relevant decisions are visible in the codebase, the baseline performs equivalently. The gap appears specifically and consistently on decisions that require external context, which points to information access as the primary variable rather than some general quality improvement from the structured workflow.</p>

<p>The practical implication is narrow but concrete. If your team has product decisions that are recorded somewhere but not in the codebase, an AI coding agent working from the codebase alone will not follow them. Giving the agent access to those decisions, in whatever form, appears to substantially improve compliance. The benchmark measured one specific retrieval system, but the underlying mechanism — closing the information gap between what the agent can see and what the team has decided — is general. Teams using different product management tools, different retrieval systems, or even manually curated context documents might see comparable improvements, though that remains to be tested.</p>

<p>There is a secondary finding worth flagging: the augmented configuration wrote 838 tests across eight tasks while the baseline wrote zero. This was not a scored decision point in the benchmark — test co-location was a gotcha on only one task (TASK-006) — but it appeared consistently as a byproduct of the spec-driven approach. When the spec lists explicit acceptance criteria, the agent appears to treat test coverage as a natural output of satisfying those criteria. Whether this holds across different models and different spec formats is an open question, but within this benchmark it was a reliable pattern.</p>

<p>The benchmark repository, all sixteen pull requests, and the scoring harness are available at <a href="https://github.com/brief-hq/dcbench">github.com/brief-hq/dcbench</a> for independent reproduction and extension.</p>

<hr>

<p><em>Based on "<a href="https://usebrief.com/assets/pdf/Context_Augmented_Code_Generation.pdf">Context-Augmented Code Generation: How Product Context Improves AI Coding Agent Decision Compliance by 49%</a>," a controlled benchmark by Drew Dillon and Kasyap Varanasi at Brief. <a href="https://usebrief.com/assets/pdf/Context_Augmented_Code_Generation.pdf">Read the full paper →</a></em></p>]]></content:encoded>
    </item>
    <item>
      <title>Why ACP Changes the Way We Build with Agents</title>
      <link>https://usebrief.com/blog/why-acp-changes-agent-building/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/why-acp-changes-agent-building/</guid>
      <pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate>
      <description>MCP operates on a client-server model with centralized intelligence. ACP treats agents as first-class citizens in a network, enabling genuine specialization, composable pipelines, and context as a first-class concern.</description>
      <content:encoded><![CDATA[<p>For the past year, MCP (Model Context Protocol) has been the connective tissue of the AI tooling world. It gave language models a standardized way to reach out and touch things: query a database, call an API, read a file, search the web. The model calls, the tool responds, the model continues. Clean. Simple. Useful.</p>

<p>But as teams start building systems where agents need to coordinate with other agents, MCP's limitations become apparent. That's what ACP (Agent Communication Protocol) addresses, and the architectural difference changes how you build.</p>

<hr>

<h2 id="what-mcp-actually-does">What MCP Actually Does</h2>

<p>MCP operates on a client-server model. The AI model is the client. MCP servers expose three primitive types: tools (functions to call), resources (data to read), and prompts (templated instructions). When a model needs something, it reaches out synchronously to a server, gets a response, and incorporates it into its reasoning.</p>

<p>This works well when the intelligence lives in one place. The model thinks, decides what it needs, fetches it, and keeps thinking. Context is centralized. Control is singular. There's one agent, and it has access to many tools.</p>

<p>The limitation shows up when you want multiple agents working together. MCP doesn't have a concept of an agent delegating to another agent. You can wire up a tool that internally calls another model, but that's an implementation hack, not a protocol feature. The orchestration logic, error handling, routing, and context passing all fall on you to build from scratch. Every team reinvents it differently, and most get it wrong the first few times.</p>

<hr>

<h2 id="what-acp-actually-does">What ACP Actually Does</h2>

<p>ACP, developed through the BeeAI project, treats agents as first-class citizens in a network. Where MCP says "here are tools a model can call," ACP says "here are agents that can communicate with each other."</p>

<p>Technically, ACP is REST-based. No new transport layer to learn, just HTTP. Agents expose a standardized interface. Communication supports streaming via Server-Sent Events (SSE), so agents can send partial results while still working instead of blocking the caller. Messages are multimodal by default: text, files, and structured data travel together.</p>

<p>The most consequential feature is async-first design. An orchestrator can hand a task to a specialist agent and move on. When the specialist finishes (or has an intermediate update), it pushes a response. This isn't just a performance optimization. It's what makes long-running, parallel, multi-agent workflows actually work instead of timing out or blocking.</p>

<p>ACP also defines agent discovery. Agents register themselves with metadata: what they do, what inputs they accept, what outputs they produce. Orchestrators look up agents dynamically instead of hardcoding them. Your agent network becomes something you can compose and reconfigure at runtime.</p>

<hr>

<h2 id="applying-it-in-practice">Applying It in Practice</h2>

<p>The practical mental model shift is this: with MCP, you design around a central intelligence with peripheral tools. With ACP, you design around a network of specialized agents, each capable of reasoning, with an orchestrator handling routing and coordination.</p>

<p>A concrete example: say you're building a workflow that takes a customer support ticket, researches the account history, checks contract terms, and drafts a response. With MCP and a single model, that model handles everything sequentially, accumulating context as it goes. With ACP, you can have a specialized account-history agent, a contract-interpretation agent, and a response-drafting agent, all invoked by an orchestrator and running in parallel where their inputs allow it. The orchestrator synthesizes their outputs.</p>

<p>Why does this matter? Specialists outperform generalists on narrow tasks. Parallel execution beats sequential. And each agent can be updated, replaced, or scaled independently. Change the contract-interpretation agent without touching the rest of the system.</p>

<p>The setup looks like this in practice:</p>

<ol><li><strong>Define your agents as ACP-compliant services.</strong> Each one has a REST endpoint, handles a defined input schema, and returns a structured output. If your agent does work that takes time, it uses SSE to stream progress.</li><li><strong>Register agents in a registry.</strong> This makes them discoverable to orchestrators and to each other. Tags and metadata let an orchestrator find the right specialist without hardcoded routing logic.</li><li><strong>Build an orchestrator that speaks ACP.</strong> The orchestrator receives a task, queries the registry for relevant agents, fans out work, and assembles results. The orchestrator itself is an ACP agent, so it can be composed into higher-level workflows.</li><li><strong>Handle context explicitly.</strong> This is where most implementations run into friction. When you hand a task from one agent to another, the receiving agent needs enough context to do its job without re-deriving everything from scratch. The message envelope carries this, but you need to be deliberate about what you include.</li></ol>

<hr>

<h2 id="what-it-unlocks">What It Unlocks</h2>

<p>Three things open up when you adopt ACP as your agent communication layer.</p>

<p><strong>Genuine specialization.</strong> You can make one agent excellent at one task without affecting anything else. A legal-reasoning agent tuned on contract language. A code-review agent trained on your internal standards. These exist as independent services that any workflow can call.</p>

<p><strong>Composable pipelines.</strong> Complex workflows stop being monolithic prompts and become networks of agents with defined interfaces. Adding a new step means registering a new agent and updating the orchestrator's routing logic, not rewriting a giant system prompt.</p>

<p><strong>Context as a first-class concern.</strong> When a task crosses an agent boundary, context needs to travel with it. This is the hardest part. Agents don't share memory; each one starts cold. The quality of your context-passing architecture determines whether your agent network behaves like a coherent system or a collection of isolated components that occasionally talk past each other.</p>

<p>This is what makes shared context infrastructure critical at the ACP layer. An agent network that maintains relevant context across boundaries, without bloating every message payload, is what separates agent systems that work in demos from agent systems that work in production.</p>

<p>MCP gave the model a way to reach out and grab things. ACP gives agents a way to work together. The latter is the architecture that scales.</p>

<hr>

<h2 id="further-reading">Further Reading</h2>

<ul><li><a href="https://github.com/i-am-bee/acp">ACP GitHub Repository</a> - The spec, SDKs, and reference implementations</li><li><a href="https://www.ibm.com/think/topics/agent-communication-protocol">What is Agent Communication Protocol? | IBM</a> - Explainer from the team that built it</li><li><a href="https://arxiv.org/html/2505.02279v1">A Survey of Agent Interoperability Protocols | arXiv</a> - Academic comparison of MCP, ACP, A2A, and ANP</li><li><a href="https://learn.deeplearning.ai/courses/acp-agent-communication-protocol/information">ACP Short Course | DeepLearning.AI</a> - Free course from IBM and BeeAI</li></ul>

<hr>

<p><em>Brief is building the context layer for multi-agent systems. With <code>brief ask</code>, coding agents consult product context before they build, so the orchestrator doesn't have to stuff every message with background. When your agents need shared memory without payload bloat, <a href="https://usebrief.com/product-context/">that's the problem we're solving</a>.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>AI 'Brain Fry' Is Real, and the Fix Isn't Less AI. It's Better Conversations With It</title>
      <link>https://usebrief.com/blog/ai-brain-fry-fix/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/ai-brain-fry-fix/</guid>
      <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
      <description>New research named the exhaustion you feel after reviewing AI code: brain fry. The fix isn't less AI; it's reviewing decisions, not diffs.</description>
      <content:encoded><![CDATA[<p>A new <a href="https://hbr.org/2026/03/when-using-ai-leads-to-brain-fry">HBR study</a> finally named the thing you've been feeling after six hours of reviewing AI-generated code: AI brain fry, the mental exhaustion that comes from watching over AI work you can't quite keep up with.</p>

<p>The numbers match what you'd expect:</p>

<ul><li>14% of workers using AI report brain fry</li><li>Those affected show 33% more decision fatigue, that 4pm feeling where you can't decide what to have for dinner, except it hits at 11am</li><li>39% more major errors at work</li><li>34% of brain-fried workers actively intend to quit (vs. 25% of others)</li><li>Productivity gains flatline after 3 simultaneous AI tools</li></ul>

<p>The pattern is clear: AI reduces burnout when it replaces repetitive tasks. AI causes exhaustion when it requires intense oversight. The exhaustion comes from reviewing AI output at the wrong level of abstraction.</p>

<h2 id="the-code-review-trap">The Code Review Trap</h2>

<p>When an AI coding assistant generates 200 lines of code, what actually happens?</p>

<p>You open a diff. Scan every line. Try to reconstruct the intent behind each decision. Check it against business requirements you're holding in your head. Wonder if the agent understood the constraint about not breaking the billing API. Find a suspicious pattern on line 147. Trace it back through three files.</p>

<p>You're reverse-engineering decisions from syntax. That's exhausting. Exactly the kind of intense, attention-draining oversight that causes brain fry.</p>

<p>The senior engineering manager in the study nailed it:</p>

<p>"I was working harder to manage the tools than to actually solve the problem."</p>

<h2 id="the-fix-review-decisions-not-code">The Fix: Review Decisions, Not Code</h2>

<p>The study found that teams who organize AI into their workflows, rather than treating it as individual tools, have less cognitive strain. The key insight is about where human attention gets spent.</p>

<p>Two ways to catch an AI agent's mistake:</p>

<p><strong>The brain fry way:</strong> Read 200 lines of generated code. Find the 3 lines where it chose SAML instead of OAuth. Figure out why. Rewrite. Re-review.</p>

<p><strong>The conversation way:</strong> Tell the agent "we use OAuth for all third-party auth. The decision is documented here." The agent gets it right the first time. Or if it doesn't, you say "no, OAuth" and it fixes itself.</p>

<p>Decision-level oversight prevents brain fry. Syntax-level oversight causes it.</p>

<h2 id="the-missing-layer-context-before-code">The Missing Layer: Context Before Code</h2>

<p>The researchers recommend redesigning how teams work with AI. Makes sense. But there's a practical problem they don't address:</p>

<p>AI agents can't make good decisions if they don't have business context.</p>

<p>Your agent doesn't know you chose OAuth over SAML. It doesn't know the billing API is untouchable until Q3. It doesn't know the pricing model changed last Tuesday. So it guesses. And you burn cognitive cycles catching those guesses.</p>

<p>But the problem goes deeper than technical decisions. Every feature request your agent touches sits inside a web of prioritization questions that humans answer instinctively:</p>

<ul><li>Can we solve this with an existing feature?</li><li>Do we already have something for this in the pipeline?</li><li>Is this hard to build and maintain for our team specifically?</li><li>Is the requestor a user persona we prioritize?</li><li>Do they work for a major customer or a critical lead?</li><li>Does this enhance our competitive positioning?</li><li>Does it fit our near-term goals?</li><li>What strategic questions do we need to answer before taking this on?</li></ul>

<p>When a senior PM or tech lead evaluates a feature request, they're running through this entire stack, often unconsciously. When your agent evaluates it, it has none of this context. So it builds the thing literally as specified, even when a two-minute conversation would have surfaced that the feature already exists, the customer isn't a priority, or the whole approach conflicts with Q2 goals.</p>

<p>That's where the real brain fry comes from. You're not just catching syntax errors. You're catching prioritization errors that the agent had no way to avoid.</p>

<p>A Brief customer put it this way:</p>

<p>"The new hotness right now in AI is how you can create more code with fewer developers. But how are you going to keep your agents on track? The models are getting a lot better, but you still have to be able to keep them on track."</p>

<p>We hit this building Brief. Early on, our coding agent had an obsession with dashboards. Tell it we're building a B2B SaaS app and the first thing it would do is scaffold a generic dashboard component. No consideration for what the product actually did. Pattern-matching on "B2B SaaS = dashboard" with zero understanding of our users or priorities.</p>

<p>Once we fed it Brief's product context, what we were building and why, it stopped suggesting dashboards. The agent finally had enough information to make decisions that aligned with our actual strategy. That's a 30-second context correction, not a 30-minute code review.</p>

<p>This is why we built <a href="https://usebrief.com/">Brief</a>. Brief captures product decisions, business constraints, and strategic context from tools you're already using, like Slack, Notion, Linear, and Jira, and makes them accessible to AI coding assistants like Cursor, Claude Code, and Windsurf.</p>

<p>Brief can now traverse your entire prioritization process. When your agent encounters a feature request, it can check whether you've already solved it another way, whether the requestor is a priority persona, whether the work fits your near-term roadmap. The agent gets the same context a senior PM would have, before it writes a single line of code.</p>

<p>Brief runs in the background. No new workflows, no extra tabs to manage. Your agents just start making better decisions.</p>

<p><a href="https://usebrief.com/">Try Brief</a></p>

<h2 id="three-ways-to-avoid-ai-brain-fry">Three Ways to Avoid AI Brain Fry</h2>

<ol><li><strong>Review decisions, not diffs.</strong> Stop scanning every line. Ask: Did it make the right architectural choice? Did it respect the constraints? If yes, the syntax is a detail. If no, correct the decision.</li><li><strong>Front-load context.</strong> The study found that teams with organized AI integration had lower cognitive strain. The single highest-leverage integration is making sure your agents have business context before they start writing. Every decision they get right on the first pass is a review loop you don't have to run.</li><li><strong>Make corrections conversational.</strong> When the agent makes a mistake, don't reach for the diff. Have a conversation: "This should use the existing auth service, not a new one." The agent corrects. You move on. Your brain stays intact.</li></ol>

<hr>

<p>The research points to the same conclusion: the future of AI-assisted work demands spending human attention where it actually matters: on decisions, not syntax.</p>

<p>Your brain is a finite resource. Stop burning it on code review. Have conversations with your agents instead.</p>]]></content:encoded>
    </item>
    <item>
      <title>Multi-Agent AI Pipelines: Solving Context Loss Between AI Agents</title>
      <link>https://usebrief.com/blog/ai-agent-talks-to-ai-agent/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/ai-agent-talks-to-ai-agent/</guid>
      <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
      <description>Multi-agent workflows amplify the telephone game. The teams that build shared decision infrastructure first will ship faster with fewer regressions.</description>
      <content:encoded><![CDATA[<p>AI agents are quickly moving beyond isolated tasks. Increasingly, teams are experimenting with pipelines where multiple agents collaborate: one generates a design, another writes the code, a third tests it, and yet another reviews the result.</p>

<p>At first glance, this feels like a natural extension of existing AI workflows. In practice, it introduces a new class of problems that look surprisingly familiar to anyone who has worked with distributed systems.</p>

<p>When AI agents begin passing work to other AI agents, context starts to degrade at every handoff. The teams that solve this early will gain a meaningful advantage in how quickly and reliably they can ship AI-assisted products.</p>

<hr>

<h2 id="the-rise-of-multi-agent-workflows">The Rise of Multi-Agent Workflows</h2>

<p>Early AI tooling focused on a single agent completing a single task. That model works well for things like:</p>

<ul><li>Writing a block of code</li><li>Summarizing a document</li><li>Generating a test case</li><li>Drafting a product spec</li></ul>

<p>But product development rarely happens in one step. Real workflows involve sequences of decisions and iterations.</p>

<p>As teams push AI deeper into development pipelines, a new pattern is emerging:</p>

<ol><li>A design agent generates architecture or feature specifications</li><li>A code agent implements the design</li><li>A testing agent validates behavior and edge cases</li><li>A refactoring agent improves maintainability or performance</li></ol>

<p>Each agent specializes in a different part of the workflow. Together, they resemble a small automated engineering team.</p>

<p>The moment multiple agents collaborate, the reliability of the entire system depends on how well information survives the transitions between them.</p>

<hr>

<h2 id="the-telephone-game-problem">The Telephone Game Problem</h2>

<p>Multi-agent systems often run into a dynamic that feels like a technical version of the telephone game.</p>

<p>Agent A receives a prompt with a detailed objective and generates an output. Agent B receives that output and uses it as input for the next step. Agent C then consumes the result from B.</p>

<p>At each stage:</p>

<ul><li>The original intent becomes less explicit</li><li>Key constraints may disappear</li><li>Assumptions get introduced without explanation</li><li>Context gets summarized, compressed, or reinterpreted</li></ul>

<p>The further the pipeline runs, the more the output reflects local reasoning inside each agent rather than the product goal that started the process.</p>

<p>A typical example appears in a design -&gt; code -&gt; test pipeline:</p>

<ol><li>The design agent outlines a feature and includes several important product constraints.</li><li>The code agent implements the design but makes subtle interpretation decisions.</li><li>The testing agent verifies the implementation against the code rather than the original product intent.</li></ol>

<p>By the end of the pipeline, everything technically works. Yet the outcome can drift from the original purpose of the feature.</p>

<p>No single step is necessarily wrong. The problem emerges from how context erodes between steps.</p>

<hr>

<h2 id="where-product-intent-gets-lost">Where Product Intent Gets Lost</h2>

<p>Consider a realistic multi-agent development flow.</p>

<h3>Step 1: Design Agent</h3>

<p>A design agent produces an architecture proposal for a new feature:</p>

<ul><li>Introduces a new API endpoint</li><li>Suggests database schema changes</li><li>Includes assumptions about expected traffic patterns</li></ul>

<p>The output is comprehensive, but it also embeds reasoning about tradeoffs and constraints.</p>

<h3>Step 2: Code Agent</h3>

<p>A code agent receives the design spec and generates the implementation. During this step, several things happen:</p>

<ul><li>Ambiguous sections get interpreted</li><li>Edge cases may be simplified</li><li>Certain constraints may be ignored if they are not explicit</li></ul>

<p>The code compiles and the structure looks correct. The reasoning behind the design decisions is already partially diluted.</p>

<h3>Step 3: Testing Agent</h3>

<p>The testing agent now creates tests based on the code implementation.</p>

<p>Tests verify that the code behaves consistently. They rarely evaluate whether the code still reflects the original architectural decisions made earlier.</p>

<p>The pipeline finishes successfully, yet the system might violate the performance or product assumptions embedded in the initial design.</p>

<p>What disappeared along the way was not raw information. What disappeared was decision context.</p>

<hr>

<h2 id="why-shared-context-is-not-enough">Why Shared Context Is Not Enough</h2>

<p>One proposed solution is to provide agents with a shared memory or context store. While this helps, it rarely solves the deeper problem.</p>

<p>Large context windows allow agents to access more information. They do not guarantee that agents understand:</p>

<ul><li>Which constraints matter most</li><li>Why certain tradeoffs were made</li><li>Which decisions must remain consistent downstream</li></ul>

<p>Raw context behaves like documentation: available, but easy to ignore or reinterpret.</p>

<p>What multi-agent pipelines actually require is shared decision infrastructure.</p>

<p>Instead of merely passing artifacts between agents, the system needs to preserve structured information about:</p>

<ul><li>The decisions that were made</li><li>The reasoning behind them</li><li>The constraints they impose on future steps</li></ul>

<p>This allows downstream agents to operate with the same decision framework that guided earlier stages.</p>

<hr>

<h2 id="a-familiar-pattern-from-microservices">A Familiar Pattern From Microservices</h2>

<p>This challenge closely mirrors an earlier shift in software architecture.</p>

<p>When companies moved from monolithic applications to microservices, communication between services became a primary concern. Teams needed reliable ways to manage:</p>

<ul><li>Contracts between services</li><li>Shared schemas</li><li>Versioning changes</li><li>Cross-service dependencies</li></ul>

<p>Without strong communication protocols, microservices quickly became fragile.</p>

<p>Multi-agent systems introduce a similar challenge, but instead of services communicating with services, AI agents are communicating with other AI agents.</p>

<p>The architecture now needs mechanisms that maintain:</p>

<ul><li>Intent across stages</li><li>Decision traceability</li><li>Consistent interpretation of constraints</li></ul>

<p>Otherwise, each agent behaves like an isolated system optimizing for its local task.</p>

<hr>

<h2 id="real-world-scenarios-where-this-matters">Real-World Scenarios Where This Matters</h2>

<p>Several common development workflows highlight how quickly agent-to-agent communication becomes critical.</p>

<h3>Design Handoffs</h3>

<p>A design agent proposes a feature with performance assumptions and architectural guidelines.</p>

<p>If the code agent treats the spec as flexible rather than authoritative, the implementation may violate those assumptions without raising any visible errors.</p>

<h3>API Changes</h3>

<p>An agent refactors or modifies an API to improve developer experience. Another agent later generates client integrations based on the updated API.</p>

<p>Without shared awareness of why the change happened, downstream agents may reintroduce the original problem or create incompatible assumptions.</p>

<h3>Refactoring Decisions</h3>

<p>A refactoring agent restructures code for readability or maintainability. A separate agent later generates tests or new features.</p>

<p>If the reasoning behind the refactor is not preserved, subsequent agents may undo the improvement or add complexity back into the system.</p>

<p>Each example highlights the same pattern: artifacts survive the handoff, but decisions do not.</p>

<hr>

<h2 id="the-competitive-advantage-of-solving-this-early">The Competitive Advantage of Solving This Early</h2>

<p>As AI agents become embedded deeper in engineering workflows, multi-agent pipelines will become standard infrastructure.</p>

<p>The teams that solve agent-to-agent communication early will gain several advantages:</p>

<ul><li>Higher reliability across automated pipelines</li><li>Faster iteration cycles because fewer corrections are needed</li><li>Better alignment with product intent throughout the workflow</li><li>More scalable AI-assisted development systems</li></ul>

<p>Organizations that ignore the communication layer will find that their pipelines produce inconsistent or unpredictable results.</p>

<p>The gap between those two groups will widen as AI systems take on more complex development responsibilities.</p>

<hr>

<h2 id="the-missing-layer-in-multi-agent-systems">The Missing Layer in Multi-Agent Systems</h2>

<p>Most discussions about AI agents focus on:</p>

<ul><li>Better prompts</li><li>Larger models</li><li>More tools and integrations</li></ul>

<p>Those improvements are valuable, but they do not address the coordination problem that emerges when multiple agents collaborate.</p>

<p>Multi-agent systems need infrastructure that preserves shared decisions across the entire workflow. Without it, pipelines behave like loosely connected tasks rather than a coherent system.</p>

<p>As AI-assisted development matures, the reliability of agent-to-agent communication will become a defining factor in how effective these systems are.</p>

<p>That is why we are building Brief at <code>briefhq.ai</code>: the shared decision layer that keeps product intent and constraints intact across agent-to-agent handoffs, so multi-agent workflows stay dependable as they scale.</p>]]></content:encoded>
    </item>
    <item>
      <title>You Already Have a Product Graph. You Just Can't Query It.</title>
      <link>https://usebrief.com/blog/you-already-have-product-graph/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/you-already-have-product-graph/</guid>
      <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
      <description>Your team's product knowledge exists as an interconnected graph of decisions, tradeoffs, and customer signals. You just can't query it.</description>
      <content:encoded><![CDATA[<p>Your team makes dozens of product decisions every week. Some are big, like which market to enter next. Most are small, like why a button is disabled in a certain state.</p>

<p>Every one of those decisions is documented somewhere. A Slack thread where someone asked "why did we build it this way?" A Notion page with the original research. A Linear comment explaining the tradeoff. A Figma file showing the rejected designs.</p>

<p>The knowledge exists. The problem is you can't find it when you need it.</p>

<h2 id="the-product-graph-concept-decisions-as-interconnected-nodes">The "product graph" concept: decisions as interconnected nodes</h2>

<p>Think about how decisions connect to each other:</p>

<ul><li>A feature decision references customer feedback</li><li>That feedback connects to a support ticket</li><li>The ticket relates to a design choice</li><li>That design was informed by user research</li><li>The research shaped your roadmap priorities</li></ul>

<p>These aren't isolated facts. They're nodes in a graph, connected by reasoning and context. When someone asks "why did we build it this way?" they're really asking you to traverse that graph backward.</p>

<p>Your team is already creating this graph. You're just storing it in a way that makes it impossible to query.</p>

<h2 id="your-knowledge-is-distributed-across-tools">Your knowledge is distributed across tools</h2>

<p>When someone on your team needs to find a past decision, they have three options:</p>

<ol><li><strong>Search Slack</strong>: wade through threads where the decision might have been mentioned</li><li><strong>Search Notion</strong>: hope someone documented it and you're using the right keywords</li><li><strong>Ask someone</strong>: interrupt whoever might remember</li></ol>

<p>The information is scattered across tools. The connections exist in people's heads. And when those people leave, the connections disappear.</p>

<h3>The search problem: keyword search vs. semantic understanding</h3>

<p>All three search options fail for the same reason: keyword search doesn't understand meaning.</p>

<p>You can search for "authentication" and find 200 messages. But which one explains why you chose JWT over sessions? Which one has the security considerations? Which one documents the breaking change?</p>

<p>The information is there. The connections are there. But you can't traverse them.</p>

<h3>Why documentation doesn't solve this</h3>

<p>Every team has tried to solve this with better documentation. Write better PRDs. Keep decision logs. Maintain a wiki.</p>

<p>It never works. Not because teams are lazy, but because documentation requires predicting what questions people will ask later. You can't document every decision, every rationale, every connection.</p>

<p>And even when you do document it, documentation goes stale. The README says one thing. The Slack thread from last month says another. The actual code does something different.</p>

<p>The product graph isn't in your documentation. It's in the conversations where decisions actually happened.</p>

<h2 id="what-becomes-possible-when-you-can-query-your-product-decisions">What becomes possible when you can query your product decisions</h2>

<p>Imagine being able to ask:</p>

<ul><li>"Why did we make the API synchronous?"</li><li>"What customer feedback led to this feature?"</li><li>"Who decided to deprecate this endpoint?"</li><li>"What were the tradeoffs we considered?"</li></ul>

<p>Not keyword search. Actual semantic understanding of your team's decisions and the context around them.</p>

<p>Here's what becomes possible:</p>

<p><strong>New team members get up to speed faster.</strong> Instead of asking the same onboarding questions every team has heard 50 times, they can query the decisions directly.</p>

<p><strong>You stop relitigating settled debates.</strong> When someone suggests something you already tried and rejected, you can pull up the original reasoning.</p>

<p><strong>Context doesn't disappear when people leave.</strong> The decision graph persists even when the people who made those decisions move on.</p>

<p><strong>You can actually learn from your decisions.</strong> Instead of wondering "what did we get wrong?" you can trace back through the graph to see which assumptions turned out to be false.</p>

<h3>The difference between "we decided that before" and being able to find why</h3>

<p>Most teams can answer "did we decide this?" with fuzzy memory. Someone vaguely recalls the conversation. You think it was decided in Q3, maybe.</p>

<p>But answering "why did we decide this?" requires traversing the graph:</p>

<ul><li>Who raised the concern?</li><li>What data did we have?</li><li>What alternatives did we consider?</li><li>What constraints were we under?</li><li>How did we think it would play out?</li></ul>

<p>That's not something you can remember. It's something you need to query.</p>

<h2 id="your-graph-is-already-there">Your Graph Is Already There</h2>

<p>You don't need to change how your team works. You don't need new tools. You don't need a complicated knowledge management system.</p>

<p>The product graph already exists in your Slack threads, Notion docs, Linear issues, and PRD comments.</p>

<p>You just need a way to query it.</p>]]></content:encoded>
    </item>
    <item>
      <title>Stop Debugging Code. Start Debugging Decisions.</title>
      <link>https://usebrief.com/blog/stop-debugging-code-debug-decisions/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/stop-debugging-code-debug-decisions/</guid>
      <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
      <description>Your agent shipped perfect code that does the wrong thing. The bug isn't in the implementation—it's in the product decision that was never made clear.</description>
      <content:encoded><![CDATA[<p>Your agent just shipped a feature. The code compiles. Tests pass. No linting errors. Everything works exactly as written.</p>

<p>And it's completely wrong.</p>

<p>Not broken. Wrong. It solves the problem nobody has. It optimizes for the metric that doesn't matter. It implements the requirement that was never actually what the user needed.</p>

<p>You have a decision bug, not a code bug. And no amount of debugging the implementation will fix it.</p>

<h2 id="the-wrong-kind-of-debugging">The wrong kind of debugging</h2>

<p>When an agent ships the wrong thing, teams default to debugging the code. They review the implementation, check the logic, add more tests, adjust the prompt. The code gets better. The outcome stays wrong.</p>

<p>The real issue is upstream. Somewhere between the customer pain and the shipped feature, a critical product decision was either:</p>

<ul><li>Never made</li><li>Made but not captured</li><li>Captured but not accessible</li><li>Accessible but ambiguous</li></ul>

<p>The agent did exactly what any competent executor would do: it made its best guess based on incomplete information. The bug is that it had to guess at all.</p>

<h2 id="what-decision-bugs-look-like">What decision bugs look like</h2>

<p><strong>Example 1: The billing update</strong></p>

<p>A SaaS company asked their agent to "add annual billing." Simple, right? The agent shipped it. Customers could now select annual plans. The code worked perfectly.</p>

<p>But the product team had never decided:</p>

<ul><li>Should existing monthly customers see upgrade prompts?</li><li>What discount should annual plans get?</li><li>Should grandfathered pricing carry over?</li><li>What happens to prepaid credits on plan switch?</li><li>When do billing cycles align: immediately or at renewal?</li></ul>

<p>The agent made calls on all of these. None matched what the business actually needed. The result? Three weeks of rework fixing "working" code because the product decisions came after implementation.</p>

<p><strong>Example 2: The notification system</strong></p>

<p>A team asked their agent to "reduce notification noise." The agent analyzed usage, found that users were getting 50+ notifications per day, and implemented aggressive batching. Notifications dropped to 5 per day.</p>

<p>User complaints went through the roof.</p>

<p>The agent had optimized for volume reduction because that's what the prompt said. But the product team had never articulated:</p>

<ul><li>Which notifications are time-sensitive vs. batchable?</li><li>What's the acceptable delay for different user roles?</li><li>Are we solving for noise or for missing important updates?</li><li>What does "important" mean for this product?</li></ul>

<p>Perfect execution of an ambiguous decision.</p>

<p><strong>Example 3: The dashboard redesign</strong></p>

<p>"Make the dashboard faster" sounds clear. The agent optimized queries, added caching, lazy-loaded components. Load time dropped from 3s to 800ms. Huge win.</p>

<p>Except users weren't complaining about load time. They were complaining they couldn't find the data they needed. "Faster" was shorthand for "more usable." The product team knew this. The agent didn't.</p>

<p>The implementation was perfect. The interpretation was wrong.</p>

<h2 id="why-we-keep-debugging-code">Why we keep debugging code</h2>

<p>Code bugs are visible and measurable. You can point at a stack trace, a failed test, a broken UI element. There's a clear "before and after." Fixing code shows visible progress because the artifact changes.</p>

<p>Decision bugs are invisible. They show up as:</p>

<ul><li>User confusion</li><li>Support tickets asking "why does it work this way?"</li><li>Features that technically work but nobody uses</li><li>Rework disguised as "iteration"</li><li>Silent abandonment</li></ul>

<p>Teams don't have tools for debugging decisions. So they debug what they can measure: the code.</p>

<p>This is expensive.</p>

<h2 id="the-hidden-cost">The hidden cost</h2>

<p>When you ship perfect code that does the wrong thing:</p>

<p><strong>Time cost</strong>: The initial implementation, plus the rework, plus the time spent explaining why it needs to change.</p>

<p><strong>Velocity cost</strong>: Every decision bug creates context thrash. Engineers revisit closed work. PMs re-explain requirements. Agents regenerate code.</p>

<p><strong>Trust cost</strong>: After a few rounds of "it works but it's wrong," teams lose confidence in the agent. They add more review steps, write longer prompts, second-guess everything. The agent becomes a fancy autocomplete instead of a force multiplier. Watch a team go through this cycle three times and you'll see the shift: excitement turns to skepticism, velocity drops, and engineers start writing code by hand again because "it's faster than explaining it."</p>

<p><strong>Opportunity cost</strong>: While you're fixing decision bugs, the features you should be building aren't getting built.</p>

<p>In our experience with 50+ engineering teams, most measure code quality. Almost none measure decision quality. So they keep shipping working code that misses the point.</p>

<h2 id="how-to-debug-decisions">How to debug decisions</h2>

<p>Decision bugs have a root cause analysis, just like code bugs. The difference is where you look.</p>

<p><strong>1) Trace the decision back</strong></p>

<p>When a feature misses the mark, don't start with the code. Start with the decision path:</p>

<ul><li>What was the original user problem?</li><li>Who defined the solution?</li><li>What constraints or tradeoffs were discussed?</li><li>What got written down?</li><li>What did the agent see?</li></ul>

<p>Usually, the break happens between "discussed" and "written down" or between "written down" and "agent sees."</p>

<p><strong>2) Find the ambiguity</strong></p>

<p>Most decision bugs come from underspecified requirements. Look for:</p>

<ul><li>Words with multiple interpretations ("fast," "simple," "better")</li><li>Unstated assumptions ("obviously we'd handle that case")</li><li>Missing edge cases</li><li>Unclear prioritization ("all of these are important")</li><li>Competing goals not reconciled</li></ul>

<p>If you can interpret the requirement two ways, the agent definitely can.</p>

<p><strong>3) Check for missing decisions</strong></p>

<p>Sometimes the decision literally wasn't made. Teams say "add authentication" but haven't decided:</p>

<ul><li>What auth model? (username/password, OAuth, SSO, magic link)</li><li>For which user types?</li><li>What's the password policy?</li><li>How do password resets work?</li><li>What happens on failed login attempts?</li></ul>

<p>The agent has to fill in these blanks. It will default to the simplest implementation—which is rarely what your product needs.</p>

<p><strong>4) Surface competing constraints</strong></p>

<p>Decision bugs often hide in unresolved tradeoffs:</p>

<ul><li>"Make it fast but add more data" (pick one)</li><li>"Keep it simple but handle all edge cases" (these conflict)</li><li>"Match the design system but make it feel premium" (depends on what "premium" means)</li></ul>

<p>When constraints compete and nobody makes the call, the agent makes it for you. Usually wrong.</p>

<h2 id="what-changes-when-you-debug-decisions">What changes when you debug decisions</h2>

<p>One of our customers runs a B2B security product. They kept hitting the same pattern: agent would ship a feature, product team would say "that's not what we meant," engineers would rewrite it.</p>

<p>They started debugging decisions instead of code.</p>

<p><strong>Their process now:</strong></p>

<p>Before writing any code, they force themselves to answer:</p>

<ul><li>What specific user problem does this solve?</li><li>What's the success metric?</li><li>What are we explicitly <em>not</em> doing?</li><li>What constraints apply? (performance, security, compliance, UX)</li><li>What tone/style should this have?</li><li>What edge cases matter?</li></ul>

<p>They keep a decision log. Every time a requirement is ambiguous, they note:</p>

<ul><li>The ambiguity</li><li>The decision they made</li><li>Why they made it</li><li>Who approved it</li></ul>

<p>This log is available to the agent.</p>

<p><strong>The result</strong>: Their rework rate dropped by 60%. Not because their agent got smarter. Because they stopped asking it to guess.</p>

<h2 id="a-framework-for-decision-quality">A framework for decision quality</h2>

<p>Treat product decisions like you treat code. Apply the same rigor.</p>

<p><strong>Decisions should be:</strong></p>

<p><strong>Specific</strong>: "Make it fast" → "P95 load time under 1s" <strong>Testable</strong>: Can you tell if the decision was followed? <strong>Contextual</strong>: Includes the "why" not just the "what" <strong>Accessible</strong>: The agent can find and use it <strong>Versioned</strong>: You can see when decisions change and why</p>

<p>When decisions meet these criteria, you ship right the first time. When they don't, you rewrite working code.</p>

<h2 id="the-agent-forces-the-issue">The agent forces the issue</h2>

<p>Before AI agents, decision bugs were hidden in human communication. An engineer would build something, show it to the PM, the PM would say "not quite," they'd iterate. The ambiguity got resolved through conversation.</p>

<p>Agents can't do that. They execute on what's written. This makes decision bugs visible and expensive.</p>

<p>This is useful. It forces product teams to be explicit about what they're building and why. The teams that figure this out first will ship faster than everyone else—not because they have better models, but because they've eliminated the rework cycle. Teams that resist clarity will keep rewriting working code while their competitors ship.</p>

<h2 id="how-brief-handles-this">How Brief handles this</h2>

<p>We built Brief because we kept hitting this problem ourselves. Our agent would ship technically correct features that missed the product intent. We'd spend more time fixing decision bugs than code bugs.</p>

<p>Think of Brief as a product context layer that sits between your decisions and your agents. It captures the "why" behind your product—then surfaces it exactly when your agent needs it.</p>

<p>Brief surfaces the product decisions that should guide the agent <em>before</em> it writes code:</p>

<ul><li>User problems and priorities from past discussions</li><li>Constraints and tradeoffs already decided</li><li>Tone and quality bar for this feature</li><li>Edge cases that matter for your product</li><li>Past decisions on similar features</li></ul>

<p>The agent still writes the code. But it's writing toward a clear target instead of guessing.</p>

<p><a href="https://usebrief.com/">Learn how Brief eliminates decision bugs →</a></p>

<h2 id="practical-steps">Practical steps</h2>

<p><strong>1) Keep a decision log</strong></p>

<p>Create a simple doc or tool that captures:</p>

<ul><li>What decision was made</li><li>Why (the constraint or tradeoff)</li><li>Who decided</li><li>When it can be revisited</li></ul>

<p>Make this accessible to your agents.</p>

<p><strong>2) Before you prompt, ask:</strong></p>

<ul><li>Have we actually decided what "success" looks like?</li><li>Are there multiple ways to interpret this requirement?</li><li>What constraints apply that aren't obvious from the code?</li><li>What edge cases matter?</li><li>What tone/quality bar applies?</li></ul>

<p><strong>3) When rework happens, root cause it</strong></p>

<p>Don't just fix the code. Ask:</p>

<ul><li>Was the decision clear?</li><li>Was it accessible?</li><li>Did we make the decision at all?</li><li>What would have prevented this?</li></ul>

<p>Update your process, not just the code.</p>

<p><strong>4) Measure decision quality</strong></p>

<p>Track:</p>

<ul><li>Features that ship without rework</li><li>Time from decision to done</li><li>Rework rate and root cause</li><li>Decision debt (features built on unclear requirements)</li></ul>

<p>Optimize for decision clarity, not just code velocity.</p>

<h2 id="the-real-leverage">The real leverage</h2>

<p>Code velocity is baseline now. Every team has access to fast agents. The differentiator is decision clarity—because clear decisions can't be copied by switching to a better model.</p>

<p>Teams that articulate clear product decisions will ship faster and with less rework. Teams that stay fuzzy will keep debugging working code.</p>

<p>The bug isn't in your agent's output. It's in your product input.</p>

<h2 id="a-diagnostic">A diagnostic</h2>

<p>Look at your last three rework cycles. For each one, ask:</p>

<ol><li>Was the code technically correct?</li><li>If yes, what product decision was unclear?</li><li>Was that decision made but not captured?</li><li>Or never made at all?</li><li>If made and captured, could the agent access it?</li></ol>

<p>If most of your answers point to decision quality, not code quality, you know where to focus.</p>

<h2 id="what-this-means-for-your-workflow">What this means for your workflow</h2>

<p>Stop treating agents like junior engineers who need detailed implementation instructions. Start treating them like senior engineers who need clear product context.</p>

<p>Senior engineers don't need you to specify every function. They need to understand:</p>

<ul><li>What problem we're solving</li><li>For whom</li><li>With what constraints</li><li>To what quality bar</li></ul>

<p>Give your agent the same. Focus your energy on decision clarity—the implementation will follow.</p>

<h2 id="the-compounding-effect">The compounding effect</h2>

<p>Every clear decision makes the next feature easier. Your agent builds a model of your product priorities, your quality bar, your constraints. It makes better guesses.</p>

<p>Every ambiguous decision creates debt. Your agent makes the wrong call. You fix it. But the correction doesn't propagate. The next similar feature hits the same problem.</p>

<p>Decision clarity compounds. Decision debt compounds faster.</p>

<h2 id="start-here">Start here</h2>

<p>Pick your next feature. Before you prompt the agent:</p>

<ul><li>Write down the product decision in one sentence</li><li>List the constraints that matter</li><li>Note what you're explicitly not doing</li><li>Capture the "why"</li><li>Make it accessible</li></ul>

<p>Then prompt the agent twice: once with just the feature name, once with the full decision context. Compare the outputs. The gap between them shows you exactly what decision clarity buys you.</p>

<p>You're not debugging code anymore. You're debugging decisions. That's the real work.</p>]]></content:encoded>
    </item>
    <item>
      <title>I Almost Built the Wrong Thing</title>
      <link>https://usebrief.com/blog/why-brief-isnt-a-meeting-bot/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/why-brief-isnt-a-meeting-bot/</guid>
      <pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate>
      <description>I almost built Brief as a meeting bot that simulated product reviews. That would have copied the surface instead of solving the real problem: context infrastructure.</description>
      <content:encoded><![CDATA[<p>The first version of Brief in my head was a product review bot. Before shipping, you would run work through simulated versions of your product leader, design lead, and engineering lead. An AI council would dunk on your feature so you could fix it before facing the real humans. It felt clever. It was wrong.</p>

<p>It was wrong because it copied the surface of the meeting instead of the substance. Product review was never about the performance. It was about transmitting context and judgment. I almost automated the meeting when I should have been automating the context.</p>

<h2 id="what-i-learned-from-real-product-reviews">What I learned from real product reviews</h2>

<p>The best product leaders stay deeply involved in decisions long after most CEOs or execs would have delegated. Gates was infamous for "think weeks" and brutal sessions that left teams sweating but clear on what mattered. Bezos forced clarity through six-page memos and PR/FAQ drafts. At Yammer, David Sacks treated product review like a dojo. My first review with him was about a single button. He zoomed out to the history of computing, the place of the iPad, and zoomed back in to that button. The point was not the button. It was the stack of context behind it.</p>

<p>Those sessions were not about catching mistakes. They were about aligning on how to think. When you left, you had a mental model that guided hundreds of micro-decisions without Sacks or Bezos in the room.</p>

<h2 id="why-meeting-bots-miss-the-point">Why "meeting bots" miss the point</h2>

<p>A bot that says "this is off-brand" is a parlor trick unless it carries the why: the audience, the positioning, the constraints, the quality bar. A simulation of an exec's tone without their context is cosplay. The meeting is a proxy for context transmission. Automating the proxy and ignoring the payload recreates the bottleneck, just faster and more shallow.</p>

<h2 id="the-new-bottleneck">The new bottleneck</h2>

<p>Agents collapsed build time. A solo engineer can ship something meaningful in hours. The product review cycle did not shrink with it. You cannot schedule a two-hour review for every three-hour build. Hiring more PMs or writing longer specs does not fix it. The bottleneck is getting the right context into the hands of the builder and the agent at the moment of decision.</p>

<p>If the context stays in heads and slides, you will get 10x output of the wrong thing. The fix is not more critique; it is turning context into infrastructure.</p>

<h2 id="what-context-actually-is">What context actually is</h2>

<ul><li><strong>Strategy</strong>: who we serve, what we promise, what we will not do.</li><li><strong>Positioning and tone</strong>: how we speak to different segments.</li><li><strong>Non-negotiables</strong>: security, privacy, compliance, performance budgets.</li><li><strong>Technical choices</strong>: stack, patterns, dependencies, logging, testing.</li><li><strong>Design principles</strong>: component usage, spacing, motion, accessibility.</li><li><strong>History</strong>: what we tried, what we killed, and why.</li><li><strong>Current priorities</strong>: activation vs expansion, speed vs polish, revenue vs retention.</li></ul>

<p>In human-led teams, this context spreads through reviews, docs, hallway chats, and scars from past incidents. With agents, those channels do not reach the code window. That is why the agent "hallucinates" choices. It fills gaps with patterns, not intent.</p>

<h2 id="context-as-infrastructure">Context as infrastructure</h2>

<p>Turning context into infrastructure means:</p>

<ul><li>Capturing decisions as first-class objects, not buried in meeting notes.</li><li>Linking those decisions to work so they travel with tasks.</li><li>Making them machine-readable so agents consume them automatically.</li><li>Keeping them current with lightweight rituals.</li><li>Adding drift detection so violations surface fast.</li><li>Attaching rationale so future you knows why a constraint exists.</li></ul>

<p>The goal is to let builders move without waiting for a meeting while staying inside the rails of product intent.</p>

<h2 id="a-simple-stack-for-context-delivery">A simple stack for context delivery</h2>

<p><strong>1) Decision register</strong></p>

<ul><li>ICP and tone rules per segment.</li><li>Technical standards: testing, data fetching, logging, error handling.</li><li>Performance budgets and SLOs.</li><li>Security and privacy guardrails.</li><li>Rollout rules and feature flag expectations.</li><li>Design system usage rules.</li></ul>

<p><strong>2) Briefs that bind</strong></p>

<ul><li>One page per initiative/task: user, goal, success, constraints, linked decisions, rationale.</li><li>Short enough to read in a minute. Structured so agents can parse.</li></ul>

<p><strong>3) Ingestion and distribution</strong></p>

<ul><li>Pull from calls, docs, code, support to propose new decisions.</li><li>Push current decisions and briefs into agent runs automatically.</li></ul>

<p><strong>4) Feedback and drift</strong></p>

<ul><li>When work deviates, flag it. Decide to update the decision or enforce it.</li><li>When a fix repeats, promote it to a decision.</li><li>Keep a log of why decisions changed.</li></ul>

<p><strong>5) Lightweight rituals</strong></p>

<ul><li>Daily decision hygiene: add, retire, highlight changes.</li><li>Weekly direction checks: 3–5 calls for the week, recorded as decisions.</li><li>Monthly strategy pulse: adjust durable direction, prune decisions.</li></ul>

<p>This stack replaces the need for a person to be in every review. The thinking travels without the meeting.</p>

<h2 id="levels-of-context-to-encode">Levels of context to encode</h2>

<ul><li><strong>Company</strong>: mission, ICPs, pricing philosophy, market positioning.</li><li><strong>Product</strong>: jobs to be done, activation priorities, retention levers, quality bars.</li><li><strong>Domain</strong>: compliance rules, privacy stance, data residency, risk tolerance.</li><li><strong>Design</strong>: tone by segment, component usage, motion guidelines, accessibility rules.</li><li><strong>Engineering</strong>: dependency policy, testing standards, performance budgets, observability defaults.</li><li><strong>History</strong>: past experiments, what was killed and why, known traps.</li></ul>

<p>You do not need to encode everything at once. Start with the decisions that affect current work. Expand as you see repeat misses.</p>

<h2 id="what-a-modern-product-review-can-look-like">What a modern product review can look like</h2>

<ul><li><strong>Before work starts</strong>: brief and decisions get pulled in. Agent drafts within rails.</li><li><strong>As it runs</strong>: drift alerts if it tries to add a dependency or tone outside the rules.</li><li><strong>Review</strong>: humans check edge cases, copy nuance, and outcomes. They do not debate frameworks because those were set.</li><li><strong>After ship</strong>: outcomes feed back. If users get confused, tone rules update. If performance sags, budgets tighten. Decisions evolve.</li></ul>

<p>The "review" becomes a fast loop of confirm and adjust, not a gate where context finally shows up.</p>

<h2 id="a-story-of-building-without-the-meeting">A story of building without the meeting</h2>

<p>A team needed a new onboarding path for enterprise buyers. Old world: write a spec, schedule reviews, wait for sign-off. Agents would have generated a generic flow and copy. Instead they:</p>

<ul><li>Recorded decisions: enterprise tone, mandatory audit logging, P95 latency target, reuse of existing components, no new dependencies, email confirmations with legal language.</li><li>Wrote a brief with the user, goal, and success metric.</li><li>Fed decisions and brief to the agent. First draft respected tone, logging, and performance patterns. Review focused on minor copy and edge cases.</li><li>Post-ship, support noted confusion on one step. They updated the copy rule and added a decision about ordering fields for clarity. Future work inherited it.</li></ul>

<p>No meeting theater. The context was live, structured, and available at generation and review.</p>

<h2 id="why-this-beats-more-documentation">Why this beats more documentation</h2>

<p>Documentation is necessary. It is also brittle and slow. Context infrastructure differs because:</p>

<ul><li><strong>It is structured</strong>: Decisions have fields and values, not paragraphs.</li><li><strong>It is live</strong>: Changes propagate to agents and humans immediately.</li><li><strong>It is scoped</strong>: Only the relevant decisions attach to a task.</li><li><strong>It is enforced</strong>: Drift alerts when work violates it.</li><li><strong>It is compact</strong>: You do not need to read a wiki to start.</li></ul>

<p>Docs explain. Context infrastructure guides.</p>

<h2 id="anti-patterns-to-avoid">Anti-patterns to avoid</h2>

<ul><li><strong>Meeting replicas</strong>: AI that mimics critique without providing the underlying constraints.</li><li><strong>Giant prompt templates</strong>: walls of text pasted into every request that nobody maintains.</li><li><strong>Stale decisions</strong>: rules that do not update, so people ignore them.</li><li><strong>Hidden rationale</strong>: decisions with no "why," forcing re-litigation later.</li><li><strong>Process bloat</strong>: adding ceremonies instead of making context easy to access.</li></ul>

<h2 id="metrics-that-show-context-is-working">Metrics that show context is working</h2>

<ul><li>Time from insight to updated decision.</li><li>Decision adoption rate: tasks that link to current decisions.</li><li>Drift events per week and time to resolution.</li><li>Rework hours attributed to missing or stale context.</li><li>Cycle time with and without agent context injection.</li><li>Support tickets tied to tone, compliance, or reliability misses.</li></ul>

<p>If these move in the right direction, you are replacing meetings with context that sticks.</p>

<h2 id="signals-you-are-getting-it-right">Signals you are getting it right</h2>

<ul><li>Agents stop introducing random dependencies and tone mismatches.</li><li>Rework drops because constraints are known upfront.</li><li>PMs and leads spend less time repeating the same rationale.</li><li>Drift alerts catch violations early.</li><li>New hires ramp faster because the decision set gives them the mental model.</li><li>Reviews focus on outcomes and edge cases, not relitigating standards.</li></ul>

<h2 id="signals-you-are-stuck-in-meeting-land">Signals you are stuck in meeting land</h2>

<ul><li>Every meaningful change waits for review because "that is where the context lives."</li><li>Agents ship features that look polished but miss compliance, tone, or performance.</li><li>The same debates repeat because the rationale is trapped in someone's head.</li><li>Prompts grow longer because you are compensating for missing structure.</li><li>Team calendars are full of reviews that mostly restate standards instead of improving the product.</li></ul>

<h2 id="stakeholders-without-the-theater">Stakeholders without the theater</h2>

<p>Execs still need confidence that quality, risk, and strategy are being upheld. Context infrastructure gives them:</p>

<ul><li>A live decision register they can inspect.</li><li>Drift reports that show where standards were challenged and resolved.</li><li>Briefs that summarize intent and constraints without decks.</li><li>Metrics on rework and adherence.</li></ul>

<p>They get visibility without becoming a bottleneck.</p>

<h2 id="risks-to-watch">Risks to watch</h2>

<ul><li><strong>Overfitting decisions</strong>: locking rules too tightly and blocking healthy experimentation. Keep decisions small and revisable.</li><li><strong>Context sprawl</strong>: too many decisions with no pruning. Run hygiene weekly.</li><li><strong>False sense of security</strong>: assuming decisions are being applied when they are not wired into agent runs. Automate the injection.</li><li><strong>Ignoring humans</strong>: context does not replace taste. Use it to augment, not to abdicate judgment.</li></ul>

<h2 id="a-rollout-you-can-start-this-month">A rollout you can start this month</h2>

<p><strong>Week 1</strong>: Create a decision register. Ten items: tone, ICP, dependencies, performance, security, logging, testing, rollout rules, design system usage, analytics.</p>

<p><strong>Week 2</strong>: Add briefs for current initiatives. Keep them to one page. Link decisions.</p>

<p><strong>Week 3</strong>: Pipe decisions and briefs into agent runs automatically. Stop manual pasting.</p>

<p><strong>Week 4</strong>: Add drift alerts. When an agent or PR violates a decision, flag it.</p>

<p><strong>Week 5</strong>: Hold a short decision hygiene meeting daily. Add new decisions, retire stale ones.</p>

<p><strong>Week 6</strong>: Review metrics: rework, drift events, prompt size, cycle time. Tune decisions and briefs.</p>

<p>None of this requires a new offsite. It requires treating context as a product surface.</p>

<h2 id="what-almost-building-the-wrong-thing-taught-me">What almost building the wrong thing taught me</h2>

<p>The product review bot idea was appealing because it mirrored something familiar. It also would have kept the bottleneck in place. The value of those legendary reviews was not the sparring. It was the transfer of judgment. Judgment comes from context. Context can be captured, structured, and distributed. When you do that, you do not need a simulated panel. You need a reliable way to put the CEO's thinking, the design lead's taste, and the engineering guardrails into the system your agents and engineers use every day.</p>

<p>That is why Brief is context infrastructure, not a meeting bot.</p>]]></content:encoded>
    </item>
    <item>
      <title>Why Do Tools for Product Managers Suck?</title>
      <link>https://usebrief.com/blog/why-pm-tools-suck/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/why-pm-tools-suck/</guid>
      <pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate>
      <description>PM tools fail because they track the how and ignore the why. Without decision infrastructure, they become ledgers instead of strategic partners.</description>
      <content:encoded><![CDATA[<p>Fifteen years of pitches for "the next big PM tool" have convinced me most of them are set up to fail. They start sleek and opinionated, then either bloat into a database nobody loves or get abandoned for spreadsheets and docs. The reason is simple: they optimize for the how and ignore the why.</p>

<h2 id="the-structural-trap">The structural trap</h2>

<p>No two product orgs run the same process. Even within one company, a growth squad and a platform team will move differently. A rigid tool tries to encode a single workflow and inevitably becomes either:</p>

<ul><li>Too opinionated to fit real work.</li><li>So flexible it devolves into a spreadsheet with UI chrome.</li></ul>

<p>So teams stuff the tool with tickets and roadmaps, then do the real thinking in meetings, docs, Slack, and their heads. The tool becomes a ledger, not a decision system.</p>

<h2 id="how-tools-got-here">How tools got here</h2>

<p>Software made project management easy to codify: columns, statuses, checklists, burndowns. That is the how. The why—user needs, bets, tradeoffs, tone, risk posture—lived in scattered places:</p>

<ul><li>Sales calls and Gong recordings.</li><li>Research notes and Miro boards.</li><li>Strategy memos and pitch decks.</li><li>Slack threads and email chains.</li><li>Tribal knowledge from people who have seen this movie before.</li></ul>

<p>PM tools kept trying to pull the how into a single view. They never pulled the why. Without the why, the tool cannot guide judgment. It just tracks tasks.</p>

<h2 id="what-the-role-actually-is">What the role actually is</h2>

<p>If you boil product work down, it looks like this:</p>

<ol><li>Seek out and synthesize information.</li><li>Refine an idea and decide what matters.</li><li>Execute with a team.</li><li>Learn if it worked; adjust or kill.</li></ol>

<p>Step 2 is the core. It lives on context and judgment. Most tools barely touch it. They log what you decided, not how you got there or what constraints should guide the next decision.</p>

<h2 id="why-workflow-first-fails-pms">Why "workflow-first" fails PMs</h2>

<ul><li><strong>Process mismatch</strong>: tools enforce one way to manage work. Teams spend hours shoehorning their reality into templates.</li><li><strong>Context loss</strong>: the tool does not hold the customer nuance, quality bars, or tradeoffs that shape good calls. Tickets become placeholders.</li><li><strong>Decision amnesia</strong>: why something was chosen gets buried in comments. Six months later, nobody remembers the rationale.</li><li><strong>Misaligned incentives</strong>: teams optimize for moving tickets, not shipping outcomes with the right quality and tone.</li><li><strong>Second systems</strong>: since the tool does not hold the why, teams build parallel systems in docs, Notion, or slide decks. Duplication and drift follow.</li></ul>

<h2 id="the-universal-layer-pm-tools-missed">The universal layer PM tools missed</h2>

<p>Across industries and stages, the specific processes differ, but the decision patterns rhyme:</p>

<ul><li>Who is the user and buyer?</li><li>What job are we solving and in what order?</li><li>What tone fits the audience?</li><li>What quality bar applies for this release?</li><li>What constraints (performance, compliance, privacy) are fixed?</li><li>What do we measure to know it worked?</li><li>What did we try before and why did we keep or kill it?</li></ul>

<p>These are decisions, not tasks. They are reusable. They should travel with work and guide agents and humans. Traditional tools left them in scattered notes.</p>

<h2 id="why-this-matters-more-with-agents">Why this matters more with agents</h2>

<p>AI coding agents amplify the gap. They will build whatever is described. If the why and the constraints are missing, they build generic solutions fast. Rework explodes. PM tools that only store tickets cannot feed agents the decisions they need. The result is 10x execution on half-baked direction.</p>

<h2 id="what-a-pm-tool-would-need-to-avoid-sucking">What a PM tool would need to avoid sucking</h2>

<ul><li><strong>A decision register</strong>: explicit, versioned choices about ICP, tone, dependencies, performance budgets, rollout rules, security posture, pricing principles.</li><li><strong>Structured briefs</strong>: one-page artifacts per initiative and task with user, goal, success, constraints, linked decisions, and rationale.</li><li><strong>Context ingestion</strong>: ability to pull from calls, docs, code, support, analytics to propose new decisions or highlight conflicts.</li><li><strong>Agent-readable outputs</strong>: context in formats agents can consume automatically. No copy-paste walls of text.</li><li><strong>Drift detection</strong>: alerts when work (agent or human) violates decisions or when decisions conflict.</li><li><strong>Feedback loops</strong>: edits and outcomes feed back into the decision set. The why evolves, not just the task list.</li><li><strong>Lightweight rituals</strong>: daily decision hygiene, weekly direction checks, monthly strategy pulses. The tool should support them without ceremony.</li></ul>

<p>This is product management as decision infrastructure, not task plumbing.</p>

<h2 id="a-few-examples-of-the-gap">A few examples of the gap</h2>

<p><strong>Tone and audience</strong>: A legal tech product needs sober copy. The PM tool tracks tasks. The why behind tone lives in a brand doc nobody reads. An agent ships playful modals. Support volume spikes.</p>

<p><strong>Dependencies and patterns</strong>: The team standardizes on Jest and React Query. The PM tool has no field for decisions. Agents introduce Vitest and Axios. The build fragments.</p>

<p><strong>Performance and reliability</strong>: The API must meet P95 latency of 300ms. The PM tool holds stories about features, not budgets. Agents add features that blow the budget. SRE finds out in prod.</p>

<p><strong>Rollout rules</strong>: Enterprise features must be behind flags with audit logging. The tool tracks "Build feature X" and "Add flag." It does not enforce the rule. Agents skip logging. Compliance risk appears later.</p>

<p>All of these are decisions that should sit next to the work. They rarely do.</p>

<h2 id="why-now">Why now</h2>

<p>Three converging shifts make a decision-first approach feasible:</p>

<ul><li>AI can read and synthesize across sources. The cost of pulling context together dropped.</li><li>Agents need structured input. A decision register gives them rails.</li><li>Teams move faster. The penalty for missing context is higher because rework comes faster too.</li></ul>

<p>Ten years ago, building a decision-aware PM tool would have meant armies of humans tagging data. Today, models can propose decisions, spot conflicts, and surface what matters. The human keeps control of judgment.</p>

<h2 id="what-this-looks-like-in-practice">What this looks like in practice</h2>

<ul><li>You finish a customer call. Instead of a wall of notes, you record three decisions: "Enterprise tone only," "Billing emails must include audit trail," "Activation is the north star this month." The tool updates the register. Agents consume it automatically.</li><li>A new feature brief links to decisions: tone, logging, performance, dependencies, rollout rules. The agent drafts code within those constraints. Review focuses on edge cases, not framework choice.</li><li>An agent suggests adding a new HTTP client. The tool flags a decision violation. You approve or reject. The register updates if you approve.</li><li>Post-ship, you note that users were confused by copy. Tone rules update. Future features inherit the fix.</li></ul>

<p>The PM tool stops being a graveyard of tickets. It becomes the system of record for decisions and context.</p>

<h2 id="how-to-evaluate-pm-tools-now">How to evaluate PM tools now</h2>

<ul><li>Do they store decisions as first-class objects?</li><li>Can they ingest context from calls, docs, code, and support?</li><li>Can agents consume the data without manual copy-paste?</li><li>Do they help you spot drift from standards?</li><li>Do they keep rationale accessible months later?</li><li>Do they reduce meeting load by making context available by default?</li></ul>

<p>If the answer is no, you are buying another workflow tracker.</p>

<h2 id="a-short-playbook-if-you-are-stuck-with-legacy-tools">A short playbook if you are stuck with legacy tools</h2>

<ul><li>Create a decision register outside the tool. Keep it in JSON or plain text. Link to it from tickets.</li><li>Add a brief template to your current system. One page: user, goal, success, constraints, decisions, rationale.</li><li>Script context export to agents. Do not rely on humans to paste.</li><li>Track drift manually: note when work violates decisions; fix the source.</li><li>Run a weekly direction check and publish decisions. Treat the tool as a delivery channel, not the source of truth.</li></ul>

<p>It is a stopgap, but it reduces rework while you wait for better tools.</p>

<h2 id="anti-patterns-in-pm-tooling">Anti-patterns in PM tooling</h2>

<ul><li><strong>Template overload</strong>: dozens of fields nobody fills.</li><li><strong>Process rigidity</strong>: forcing one roadmap format on every team.</li><li><strong>Everything-in-one-place claims</strong> that ignore how humans actually talk and decide.</li><li><strong>AI features that summarize tickets</strong> but never update decisions or constraints.</li><li><strong>Data hoarding</strong>: locking context in a tool without open outputs for agents and other systems.</li></ul>

<h2 id="a-different-bar">A different bar</h2>

<p>The bar for a PM tool should be: does it improve product judgment and reduce rework? Task completeness does not matter if the wrong thing shipped or the right thing shipped without the right tone, performance, or compliance. Decision infrastructure is how you raise that bar.</p>

<h2 id="signals-a-decision-first-approach-is-working">Signals a decision-first approach is working</h2>

<ul><li>Rework drops because context arrives before build.</li><li>Agents stop introducing random dependencies and patterns.</li><li>PMs spend less time re-explaining rationale.</li><li>Drift events decline; decisions get updated instead of ignored.</li><li>Stakeholders learn the why from the tool, not just the what.</li><li>Meetings shrink because context is already shared.</li></ul>

<h2 id="signals-you-are-stuck-in-old-patterns">Signals you are stuck in old patterns</h2>

<ul><li>Tickets describe tasks with no linked decisions.</li><li>Agents and engineers copy-paste walls of text into prompts.</li><li>Tone and compliance issues recur in every release.</li><li>The "why" for a feature lives in someone's head or a deck from last quarter.</li><li>Your tool usage is mostly status updates and burndowns.</li></ul>

<h2 id="how-brief-fits">How Brief fits</h2>

<p>We built Brief around decisions and context because the old tooling patterns could not keep up with agent speed. It ingests calls, docs, code, tickets. It proposes decisions, lets you accept or reject, and feeds those to agents. It flags drift. It keeps rationale attached. It does not tell you how to run standups. It gives you the why on tap.</p>

<p>Coding agents, remote engineers, design partners, and execs all benefit because the same decision set guides their work. That is the difference between another PM surface and a strategic partner.</p>

<h2 id="stage-specific-needs-and-how-tools-miss">Stage-specific needs (and how tools miss)</h2>

<p><strong>Early stage</strong>: decisions change weekly. You need fast capture, not heavy process. Legacy tools demand hierarchies and projects before you have product-market fit. A decision-first system adapts as you learn.</p>

<p><strong>Growth stage</strong>: you need consistency and speed. Tools that cannot enforce or surface decisions let teams drift: new dependencies, mixed tone, conflicting metrics.</p>

<p><strong>Enterprise</strong>: compliance, audit, and change management matter. Traditional PM tools track approvals but rarely expose the underlying rationale or constraints to agents. A decision register with auditability serves both speed and governance.</p>

<h2 id="a-story-of-why-workflow-only-fails">A story of why workflow-only fails</h2>

<p>A mid-market SaaS team standardized on Jest, React Query, and strict tone rules for regulated buyers. Their PM tool tracked epics and tickets. None of those standards lived there. Engineers prompted agents with whatever was in the ticket description. Within two sprints, the codebase had Vitest in one feature, Axios in another, playful copy in an enterprise flow, and missing audit logs on a billing change. QA caught some issues. Others escaped. Rework ballooned.</p>

<p>They added a simple decision register and linked it in every task. Agents consumed it automatically. Dependency creep stopped. Tone issues dropped. Audit logging became default. The tool did not change; the context did. That is what a PM tool should have done natively.</p>

<h2 id="how-to-roll-this-mindset-into-your-team">How to roll this mindset into your team</h2>

<p><strong>Week 1</strong>: Identify the five to ten decisions that matter most right now (tone, ICP, dependencies, performance, security, rollout rules). Write them down. Share with everyone.</p>

<p><strong>Week 2</strong>: Add a one-page brief template to your current system. Require it for new initiatives. Link decisions.</p>

<p><strong>Week 3</strong>: Automate passing decisions and briefs to agents. Stop trusting manual copy-paste.</p>

<p><strong>Week 4</strong>: Start logging drift and rework causes. Summarize weekly.</p>

<p><strong>Week 5</strong>: Prune and update decisions. Retire stale ones. Highlight new ones to the team.</p>

<p><strong>Week 6</strong>: Evaluate whether your current PM tool helps or hinders this flow. If it hides decisions, work around it or replace it.</p>

<h2 id="the-future-bar-for-pm-tools">The future bar for PM tools</h2>

<p>In a world where agents and small teams ship features in hours, tools that only track work are table stakes. The bar moves to:</p>

<ul><li>How quickly can we surface the right context to every actor (human or agent)?</li><li>How reliably can we keep decisions current and visible?</li><li>How fast can we spot and correct drift?</li><li>How little ceremony can we get away with while keeping alignment?</li></ul>

<p>Meet that bar and PM tools stop sucking. They become infrastructure for product judgment.</p>]]></content:encoded>
    </item>
    <item>
      <title>The AI Only Gets You to 80% Complaint is Backwards</title>
      <link>https://usebrief.com/blog/the-80-percent-complaint-is-backwards/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/the-80-percent-complaint-is-backwards/</guid>
      <pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate>
      <description>The complaint that AI only gets you to 80% misses the point. Agents can handle the finish work when you give them context. The real bottleneck is product sense.</description>
      <content:encoded><![CDATA[<p>I used to be the 80% engineer. Build the fun part, wander off, let someone else do the tedious finish. That did not work in enterprise land.</p>

<p>When I started coding again in January, something flipped. Agents handled the linting, testing, and pixel nudges. The part I hated was covered. Shipping became fun again because the last 20% was finally tractable.</p>

<p>We got Brief from idea to revenue fast because the agent took care of the mechanical finish while I focused on product judgment. The 80% complaint people repeat misses the real shift.</p>

<h2 id="what-the-80-complaint-gets-wrong">What the 80% complaint gets wrong</h2>

<p>The line shows up in every AI thread: "These tools only get you to 80%." The implication is that the last 20% is some mystical human craft that agents will never touch.</p>

<p>Reality is different. The last 20% is mostly:</p>

<ul><li>Edge cases and error handling.</li><li>Tests that prove it works.</li><li>Accessibility and internationalization.</li><li>Performance budgets and observability.</li><li>Copy and tone that fit the audience.</li><li>Integration with billing, auth, data models, and analytics.</li></ul>

<p>Agents can help with most of this when they have context. What they cannot do is invent product judgment. That was never in the 20%. That was the job all along.</p>

<h2 id="why-there-are-so-many-80-demos">Why there are so many 80% demos</h2>

<p>Two shifts collided:</p>

<ul><li>Build cost collapsed. A solo builder with an agent can ship a working prototype in a weekend.</li><li>Distribution got easier. Every demo lands on X, LinkedIn, Reddit.</li></ul>

<p>So we see an explosion of near-finished things. In the old world, those prototypes would have taken months or never existed. Now they exist and circulate. That abundance is healthy. It surfaces ideas, forces incumbents to move, and trains users to expect faster iteration.</p>

<p>The complaint focuses on the visible unfinished layer. It ignores the value of having ten attempts instead of none.</p>

<h2 id="the-real-bottleneck-is-product-sense">The real bottleneck is product sense</h2>

<p>Building something interesting is easy now. Building something users keep is not. The hard parts:</p>

<ul><li>Picking a specific user and job.</li><li>Deciding what "done" means for that user.</li><li>Sequencing scope so value shows up early.</li><li>Holding a consistent tone and UX for that audience.</li><li>Making tradeoffs on performance, privacy, and reliability.</li></ul>

<p>That is product sense. Agents do not bring it. Humans do. When product sense is weak, you get endless 80% artifacts. When it is strong, agents accelerate you to 100% faster.</p>

<h2 id="a-simple-map-of-the-last-20">A simple map of the "last 20%"</h2>

<p>Think of the last 20% as four categories:</p>

<p><strong>1) Correctness and safety</strong></p>

<ul><li>Tests (unit, integration, smoke) that assert the behavior you promised.</li><li>Error handling that does not leak data or trap users.</li><li>Auth and permissions wired end to end.</li><li>Data validation and migration safety.</li></ul>

<p><strong>2) Experience and clarity</strong></p>

<ul><li>Copy that matches the buyer and user.</li><li>Accessibility basics: focus states, semantics, keyboard paths, contrast.</li><li>Empty states, loading states, retry paths.</li><li>Onboarding cues and inline guidance.</li></ul>

<p><strong>3) Performance and reliability</strong></p>

<ul><li>Latency budgets enforced.</li><li>Logging, tracing, metrics hooked up.</li><li>Capacity and timeout settings set to sane defaults.</li><li>Backoffs and retries for external calls.</li></ul>

<p><strong>4) Fit and integration</strong></p>

<ul><li>Analytics events mapped to your source of truth.</li><li>Billing, entitlements, and limits enforced.</li><li>Feature flags for safe rollout.</li><li>Data shape consistency with the rest of your system.</li></ul>

<p>Agents can draft most of this if you tell them the constraints. They fail when you do not.</p>

<h2 id="stage-matters">Stage matters</h2>

<p><strong>0–1</strong>: The last 20% is about trust. Users need to see that the product does what it says, does not lose data, and speaks their language. You can tolerate scrappy performance as long as clarity and correctness are there.</p>

<p><strong>1–10</strong>: The last 20% shifts to scale and reliability. You need tracing, proper retries, pagination, and budgets. The agent needs those constraints or it will keep optimizing for first-pass speed.</p>

<p><strong>10+</strong>: The last 20% is about efficiency and consistency. Cost controls, dependency hygiene, and long-term maintainability matter. If you do not encode those constraints, agents will happily introduce bloat.</p>

<p>Knowing your stage tells you which constraints to feed the agent and which to relax.</p>

<h2 id="why-context-is-the-difference-between-80-and-100">Why context is the difference between 80% and 100%</h2>

<p>Give an agent a vague prompt and you get a demo. Give it the constraints above and you get something closer to shippable. The missing ingredient is not model quality. It is context:</p>

<ul><li>Who is the user and what tone do they expect?</li><li>What performance budget applies?</li><li>What logging and metrics are required?</li><li>What auth model is in play?</li><li>What dependencies are allowed?</li><li>What decisions have already been made about patterns?</li></ul>

<p>When that context is structured and available, the agent fills in the "last 20%" with less fuss. When it is missing, you get generic scaffolding.</p>

<h2 id="abundance-is-not-a-defect">Abundance is not a defect</h2>

<p>People treat the wave of unfinished demos as waste. It is the opposite. More attempts mean:</p>

<ul><li>More ideas surface.</li><li>More patterns get tested.</li><li>More pressure on incumbents.</li><li>Lower bar for experimentation.</li></ul>

<p>Yes, most attempts will not endure. That was true before. The difference is speed. Speed plus product judgment is lethal. Speed without judgment looks like 80% forever.</p>

<h2 id="a-story-from-the-field">A story from the field</h2>

<p>We built Brief fast by leaning on agents for the finish work:</p>

<ul><li><strong>Early onboarding flows</strong>: agent drafted UI and backend. We provided tone rules, ICP, and logging requirements. First pass shipped with minimal edits.</li><li><strong>Billing updates</strong>: agent generated the form and API changes. We added constraints: audit log every change, no new dependencies, server-side role checks. It hit prod after small copy edits.</li><li><strong>Docs and support</strong>: agent generated drafts tied to product decisions. We edited for nuance.</li></ul>

<p>The constant was context. We kept a decision register. We wrote short briefs. We fed them to the agent. The "last 20%" shrank because the agent was not guessing.</p>

<h2 id="how-to-get-past-80-with-agents">How to get past 80% with agents</h2>

<p><strong>1) Write a tight brief</strong></p>

<ul><li>User and job to be done.</li><li>Success criteria and guardrails.</li><li>Tone rules and audience.</li><li>Dependencies allowed and banned.</li><li>Performance, logging, and testing expectations.</li></ul>

<p><strong>2) Maintain a decision register</strong></p>

<ul><li>Stack defaults (testing, data fetching, UI libs).</li><li>Security and privacy rules.</li><li>Tone and brand voice.</li><li>Rollout rules and feature flag patterns.</li><li>Performance budgets and error handling norms.</li></ul>

<p><strong>3) Bake quality into the prompt</strong></p>

<ul><li>Ask for tests and specify frameworks.</li><li>Call out auth and permissions.</li><li>Ask for logging and metrics with your conventions.</li><li>Ask for empty/loading/error states.</li><li>Remind it of performance targets.</li></ul>

<p><strong>4) Review with a checklist</strong></p>

<ul><li>Does it honor decisions?</li><li>Are auth, logging, and analytics present?</li><li>Are error and empty states handled?</li><li>Does the copy match the audience?</li><li>Does it meet latency and reliability constraints?</li></ul>

<p><strong>5) Close the loop</strong></p>

<ul><li>When you edit, note why: tone, dependency choice, missing logging, performance.</li><li>If it is a recurring fix, add it to the decision register.</li><li>Keep drift counts: how often the agent violates a decision.</li></ul>

<h2 id="what-to-measure">What to measure</h2>

<ul><li>Rework rate due to missing context.</li><li>Time from brief to "ready for review."</li><li>Number of decision violations per task.</li><li>Test coverage added per feature.</li><li>Latency and error rates post-ship.</li><li>Support tickets tied to tone or UX misses.</li></ul>

<p>These show whether you are actually moving from 80 to 100, not just shipping faster.</p>

<h2 id="teaching-a-team-to-think-this-way">Teaching a team to think this way</h2>

<ul><li>Start every task with a brief and linked decisions. Make it muscle memory.</li><li>Run short post-ship reviews on rework. Was it missing context or changing intent?</li><li>Celebrate clean first passes that honored constraints, not just speed.</li><li>Rotate ownership of the decision register so it stays current.</li><li>Keep prompts small and focused. Trim anything the agent cannot act on.</li></ul>

<p>Teams learn fast when the process is light and the feedback is immediate.</p>

<h2 id="anti-patterns-that-keep-you-at-80">Anti-patterns that keep you at 80%</h2>

<ul><li><strong>Vague prompts</strong>: "Build a dashboard" with no user, data, or success definition.</li><li><strong>Decision sprawl</strong>: no single source of truth for stack and patterns, so every task invents new ones.</li><li><strong>Ignoring non-functional requirements</strong>: no mention of performance, logging, accessibility.</li><li><strong>Silent rewrites</strong>: humans fix issues without updating decisions; agent repeats mistakes.</li><li><strong>Over-stuffing prompts</strong>: pasting entire specs instead of concise constraints; agent drowns in noise.</li></ul>

<h2 id="the-market-shift-hiding-under-the-complaint">The market shift hiding under the complaint</h2>

<p>The 80% line is often fear. Fear that if anyone can ship a prototype, the bar drops. The bar is actually rising. Users expect polish sooner. They expect reliability from day one. The teams that will win pair agent speed with ruthless focus on product sense and finish.</p>

<p>Ten years ago, a decent MVP took months. Now it takes days. The differentiator is not whether you can ship. It is whether you ship what matters, with the right quality, before someone else does.</p>

<h2 id="a-short-checklist-for-your-next-feature">A short checklist for your next feature</h2>

<ul><li>User and job defined.</li><li>Success and quality bar stated.</li><li>Tone, audience, and brand rules attached.</li><li>Dependencies and patterns set.</li><li>Auth, logging, metrics, and performance budgets included.</li><li>Tests requested.</li><li>Feature flagged and rollout plan clear.</li><li>Decisions linked in the brief.</li><li>Review against the checklist. Fix. Update decisions.</li></ul>

<p>Do this and the "last 20%" stops being a myth. It becomes a repeatable path the agent can follow.</p>

<h2 id="another-concrete-example">Another concrete example</h2>

<p>Task: add "Export Transactions" for finance admins.</p>

<p><strong>Prompt without context</strong>: "Add CSV export for transactions." The agent builds a button, dumps CSV with whatever columns it finds, client-side only, no pagination, no auth checks. Looks fine in dev. In prod, it times out and leaks data to non-admins.</p>

<p><strong>Prompt with context</strong>:</p>

<ul><li>User: finance admin at mid-market customer.</li><li>Constraints: server-side export, paginated, P95 under 1s, include audit log entries, role-checked on API, no new dependencies, logging to existing telemetry.</li><li>Tone: concise, professional. No playful copy. Use existing button styles.</li><li>Tests: integration test for role check, unit test for CSV shape.</li><li>Decisions: use existing REST client, React Query, Jest, and logging pattern.</li></ul>

<p>Agent output: server route with role check, paginated query, CSV stream, logs, tests, reuse of existing components, neutral copy. Review focuses on column order and a couple of edge cases. Ship.</p>

<p>The gap between those outputs is context, not magic.</p>

<h2 id="the-80-complaint-is-backwards">The 80% complaint is backwards</h2>

<p>Agents are not failing to finish. They are finishing what you asked for, with the context you provided. When that context is thin, you get a demo. When it is rich, you get a feature. The real gap is product judgment and context delivery, not some magical human-only finishing school.</p>

<p>Use agents to generate abundance. Use product sense to aim it. Use structured context to close the last 20%. Then the complaint flips: the last 20% becomes the part that finally feels possible.</p>]]></content:encoded>
    </item>
    <item>
      <title>The Future is the Product Developer</title>
      <link>https://usebrief.com/blog/future-is-product-developer/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/future-is-product-developer/</guid>
      <pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate>
      <description>The boundary between product, engineering, and design is dissolving. AI coding agents and modern tooling enable product developers to own initiatives end-to-end, from insight to production. This is the new default builder.</description>
      <content:encoded><![CDATA[<p>The boundary between product, engineering, and design is dissolving. The person who can carry an idea from insight to production, with help from agents and specialists, is about to become the default builder. That person is the product developer.</p>

<p>I've run engineering, product, and design teams from zero to 150 people. The trend is clear: small teams want to move like special forces, not relay teams. The handoffs that used to separate roles become liabilities when agents can ship code in hours. The product developer role absorbs those handoffs.</p>

<h2 id="who-they-are">Who they are</h2>

<p>The product developer owns 0–1 and often 1–N. Not just prototypes, but production builds that hold up under real traffic. They have enough depth to design a system, build it, and ship it with the right user experience. They pull in specialists when scale, security, or brand polish demands it.</p>

<p>Today, they show up as technical PMs, product-minded engineers, and designers who code. They already straddle disciplines. AI accelerates them. Cursor and Claude let them scaffold a backend in a morning. Figma-to-code tools get them a starting point for UI. Agents wire integrations. The constraint is no longer "can they code fast enough?" It is "do they have the judgment to build the right thing end-to-end?"</p>

<h2 id="why-this-is-happening-now">Why this is happening now</h2>

<ul><li>Agent speed: Coding agents collapse the time from idea to working software. The bottleneck shifts to decision quality and product sense.</li><li>Tooling convergence: Frameworks, design systems, and cloud services reduce the surface area of decisions needed to ship something real.</li><li>Team size pressure: Smaller teams are expected to produce outsized output. Hiring three roles where one product developer can lead with agents is hard to justify.</li><li>Customer expectations: Users expect cohesive experiences. Handoffs often create seams. A single owner reduces seams.</li></ul>

<h2 id="how-they-work-with-specialists">How they work with specialists</h2>

<p>Product developers are not lone wolves. They lead the 0–1 and early scale work, then partner:</p>

<ul><li>With infra and SRE for scale, reliability, and cost control.</li><li>With brand and design systems for polish, accessibility, and cohesion.</li><li>With security for threat modeling and compliance.</li><li>With growth for pricing, packaging, and onboarding experiments.</li></ul>

<p>They know enough to have an informed conversation with each specialty, and they use agents to cover ground quickly while respecting the constraints those specialists care about.</p>

<h2 id="what-tools-they-need">What tools they need</h2>

<p>Assuming "the repo has all the context" does not work. Markdown is a poor collaboration surface for shared intent. Product developers need:</p>

<ul><li>Shared context that agents can read: ICP, tone, quality bars, performance budgets, compliance constraints, design tokens, component rules.</li><li>Decision registers: clear, versioned choices about stack, dependencies, tone, rollout rules, pricing guardrails.</li><li>Briefs that cross disciplines: user, job-to-be-done, success metrics, constraints, non-functional requirements. One page, structured.</li><li>Agent orchestration: the ability to run multiple agents (coding, design, analysis) against the same context and have them respect the same decisions.</li><li>Observability for agents: drift detection when an agent deviates from decisions; logging of rationale for changes.</li><li>Fast review loops: the ability to inject feedback into agent output quickly, and to have that feedback become future constraints.</li></ul>

<p>They also need the basics: strong component libraries, stable backend scaffolds, reliable CI/CD, and test coverage that agents can operate within.</p>

<h2 id="the-mindset-shift">The mindset shift</h2>

<p>The product developer does not wait for a ticket. They start from a user or business goal, write a tight brief, and let agents draft. They review with product sense and engineering rigor. They decide when "good enough" ships and when to pull in a specialist.</p>

<p>They think in constraints: who is the user, what is the acceptable tone, what are the latency and reliability budgets, what dependencies are allowed, what compliance rules apply. They set those upfront so agents stay on rails.</p>

<p>They measure outcomes: activation, retention, revenue, support load. They do not optimize for velocity alone.</p>

<h2 id="what-this-looks-like-day-to-day">What this looks like day to day</h2>

<ul><li>Morning: synthesize yesterday's customer calls into two decisions and a brief for an onboarding change. Agents generate UI and backend updates. The product developer edits for tone and data handling, ships to staging.</li><li>Midday: review a specialist's suggestion for database indexing to hit P95 latency. Accept, add the constraint to the decision register so future agent tasks assume the index exists.</li><li>Afternoon: pair with a design agent on a pricing page variant. Tie it to existing components, ensure copy matches tone rules. Ship an A/B test. Log the rationale.</li><li>Evening: check drift alerts. An agent tried to add a new dependency for file uploads; reject and note to add an approved library decision.</li></ul>

<p>The cadence is faster than traditional product-engineering cycles because the handoffs are internal to one person plus agents. The quality bar stays high because constraints and decisions are explicit.</p>

<h2 id="what-changes-for-teams">What changes for teams</h2>

<ul><li>Fewer handoffs: less time lost in translation between PM, design, and engineering.</li><li>Clearer accountability: one owner for an initiative, supported by agents and specialists.</li><li>Faster iteration: briefs + decisions → agent drafts → human edits → ship → measure → update decisions.</li><li>Better coherence: tone, UX patterns, and technical choices stay aligned because a single owner holds the thread.</li><li>More leverage from specialists: they focus on scale, polish, and risk, not on translating requirements.</li></ul>

<h2 id="risks-to-watch">Risks to watch</h2>

<ul><li>Overconfidence: a product developer can ship something fast that needs more specialist input. Guardrails are needed: security reviews, performance checks, accessibility passes.</li><li>Decision rot: if decisions are not maintained, agents drift and inconsistency creeps in.</li><li>Burnout: carrying product, design, and engineering choices alone is heavy. The answer is shared context, not heroic effort.</li><li>Tool sprawl: too many disconnected agents and tools create noise. Orchestration and shared context are key.</li></ul>

<h2 id="how-to-cultivate-product-developers">How to cultivate product developers</h2>

<ul><li>Hire for product sense + technical fluency + bias to ship.</li><li>Give them agents and structured context. Do not bury them in process.</li><li>Pair them with specialists early to learn scale, security, and brand standards.</li><li>Measure them on outcomes and coherence, not ticket throughput.</li><li>Let them own 0–1s and early-stage bets. Bring in more specialization as those bets harden.</li></ul>

<h2 id="the-link-to-product-management">The link to product management</h2>

<p>Engineering agents are getting attention. Design agents are emerging. Product has been underserved because every org is different. The product developer bridges that gap. They embody product judgment and translate it directly into builds with agents. They need product tooling that respects variation: decision systems, context delivery, and agent orchestration tailored to their workflow.</p>

<h2 id="a-short-story-from-the-field">A short story from the field</h2>

<p>Building Brief, I acted as the product developer with a coding agent swarm. We moved from idea to six-figure revenue in months because the loop was tight: decide, brief, generate, edit, ship, learn, update decisions. No waiting for a quarterly plan. No handing a spec to a separate team to interpret. When we needed depth, we pulled in specialists for security and infra, then codified their constraints so agents respected them.</p>

<h2 id="a-simple-way-to-start">A simple way to start</h2>

<p>Week 1: Identify your product developers (or the people closest to it). Give them a decision register and agent access. Seed ten key decisions: stack, tone, performance, compliance, dependencies.</p>

<p>Week 2: Introduce briefs for active initiatives. One page. User, goal, constraints, success metric, linked decisions.</p>

<p>Week 3: Wire decisions and briefs into agent workflows. Stop copy-pasting context.</p>

<p>Week 4: Add drift detection and rework tagging. If the same issue repeats, update decisions.</p>

<p>Week 5: Pull in specialists to review the hottest areas: security, performance, brand. Capture their guidance as decisions.</p>

<p>Week 6: Measure outcome movement and coherence. Are features shipping faster? Are patterns consistent? Is rework down? Tune decisions and briefs accordingly.</p>

<h2 id="built-for-this-future">Built for this future</h2>

<p>The future belongs to builders who can carry a product end-to-end with help from agents and targeted specialists. The product developer is that builder. Give them context, decisions, and tools that keep agents aligned, and they will ship faster than any role divided by old boundaries.</p>]]></content:encoded>
    </item>
    <item>
      <title>Quarterly Planning is Dead</title>
      <link>https://usebrief.com/blog/quarterly-planning-is-dead/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/quarterly-planning-is-dead/</guid>
      <pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate>
      <description>Quarterly planning worked when shipping a meaningful change took months. That world is gone. AI coding agents ship features while you're still grooming the backlog. It's time to replace quarterly batches with continuous decisions.</description>
      <content:encoded><![CDATA[<p>Quarterly planning worked when shipping a meaningful change took months and the company needed ceremony to align around scarce engineering cycles. That world is gone. Competitors adjust strategy weekly. Customers churn after a single bad release. AI coding agents put a feature on prod while you are still grooming the backlog.</p>

<p>Yet many teams still hinge their strategy on a QBR and an offsite. Decisions that should take an afternoon get deferred to the next planning window. By the time you ratify a plan, the market has moved and your agents have already built three versions of the thing you should have shipped last week.</p>

<h2 id="what-quarterly-was-solving">What quarterly was solving</h2>

<ul><li>Scarce engineering capacity: every commit was expensive, so you planned carefully.</li><li>Slow feedback loops: user research, usability studies, and release trains took weeks.</li><li>Heavy dependencies: infrastructure changes needed long lead times and coordination.</li><li>Stable markets: competitors and customers moved slower, so a three month bet held up.</li></ul>

<p>Those constraints justified a 90-day ritual. They do not match a world where a small team with agents ships something real in a day.</p>

<h2 id="why-the-cadence-broke">Why the cadence broke</h2>

<p>1) Cycle time collapsed. With Cursor, Claude, and Copilot, an engineer can ship a small feature in hours. The planning cadence stayed at 90 days.</p>

<p>2) Competitor tempo increased. Your rivals push pricing changes, onboarding tweaks, and positioning shifts multiple times a month. Your quarterly plan gets stale before it is printed.</p>

<p>3) Customer expectations tightened. Switching costs dropped. One clumsy release and a buyer tries the next tool. Waiting for the quarterly prioritization meeting to adjust is too slow.</p>

<p>4) Context is fragmented. Research notes, sales calls, support threads, experiment results—none of it flows into a single place fast enough. So teams fall back to ceremony to "sync" every 90 days. This is the <a href="https://usebrief.com/product-context/">product context problem</a>—the business knowledge that should guide decisions is scattered across dozens of tools.</p>

<p>The gap between how fast you can build and how fast you decide what to build widens with every agent-assisted sprint. Planning is now the bottleneck.</p>

<h2 id="the-cost-of-quarterly">The cost of quarterly</h2>

<ul><li>Rigid bets: you lock scope and resourcing for 12 weeks. Two weeks later, a new learning arrives and cannot be absorbed without process pain.</li><li>Zombie projects: work continues because it was in the plan, not because it is still the best move.</li><li>Context decay: fresh insights from calls and experiments sit in docs until the next ritual. By then, the nuance is gone.</li><li>Thrash inside the quarter: teams quietly replan mid-quarter to react, creating shadow roadmaps and misalignment.</li><li>PM and eng morale drag: teams know the plan is stale but feel forced to execute it. Agents ship faster, so rework increases when direction changes mid-flight.</li></ul>

<h2 id="signals-your-quarter-is-stale">Signals your quarter is stale</h2>

<ul><li>You learn something important in week three and file it for "next quarter."</li><li>Sales keeps creating one-off promises because roadmap updates take months.</li><li>Support escalations get patched locally because re-prioritizing is too heavy.</li><li>Engineers are told to "stick to the plan" while quietly reordering work to match reality.</li><li>Agents churn out features that no longer match current positioning.</li></ul>

<h2 id="the-world-with-agents">The world with agents</h2>

<p>Agent speed makes the old cadence look absurd. You do not need a quarter to put a feature in users' hands. You need hours to days. The gating factor is not execution capacity; it is decision freshness and context distribution.</p>

<p>If you keep quarterly planning but add agents, you get a factory that moves at 10x building the wrong things faster. The rework cost quietly explodes.</p>

<h2 id="what-replaces-quarterly">What replaces quarterly</h2>

<p>You still need strategy. You still need focus. But the unit of planning shifts from 90-day batches to continuous decisions with guardrails.</p>

<p>Anchor on durable direction: mission, ICP, core product principles, quality bars, pricing philosophy. These do not change weekly.</p>

<p>Make decisions small, explicit, and reversible: "We prioritize activation over expansion this month." "We will not add new dependencies unless they replace two or more packages." "We ship enterprise-facing flows with email notifications, not in-app toasts."</p>

<p>Update priorities continuously: take in new signals daily, adjust weekly. Use lightweight rituals to ingest fresh context and change course without a summit.</p>

<h2 id="a-practical-operating-model">A practical operating model</h2>

<p>Weekly direction check (30–45 minutes)</p>

<ul><li>Inputs: top customer learnings, key product metrics, support escalations, competitive moves, experiment results.</li><li>Outputs: 3–5 direction calls for the week (e.g., "Double down on activation for Segment A," "Pause net-new growth experiments until churn issue is addressed," "Keep architectural changes to X area on hold until after conference launch.")</li><li>Record these as decisions the agents and humans can read.</li></ul>

<p>Daily 10-minute decision hygiene</p>

<ul><li>Add new decisions when they emerge: tone rules, dependency choices, quality bars, rollout guardrails.</li><li>Retire stale decisions. Highlight changes to the team and the agents.</li></ul>

<p>Rolling backlog tied to decisions</p>

<ul><li>Each task links to the decisions it relies on. If a decision changes, affected tasks are obvious.</li><li>Agents consume the current decision set automatically. No copy-paste.</li></ul>

<p>Fast escalation path</p>

<ul><li>If a critical learning arrives (customer escalates, competitor launches), adjust direction the same day. No "wait for the weekly" if the impact is clear.</li></ul>

<p>Monthly strategy pulse (60–90 minutes)</p>

<ul><li>Check if the durable direction (ICP, positioning, pricing philosophy) needs an update.</li><li>Review the past month's decisions: which ones drove impact, which ones caused thrash.</li><li>Decide what to stop doing as much as what to start.</li></ul>

<h2 id="how-to-keep-alignment-without-ceremony">How to keep alignment without ceremony</h2>

<ul><li>Single source of decisions: a lightweight register that holds current choices: ICP focus, tone, dependencies, rollout constraints, pricing rules, performance budgets. Agents and humans read the same source.</li><li>Short briefs per initiative: goal, user, rationale, constraints, success criteria, linked decisions. One page max.</li><li>Transparent drift signals: when an agent or team deviates from decisions, flag it. Resolve quickly. Update decisions or enforce them.</li><li>Open visibility: PMs, eng, design, sales can see the current direction and the decisions. No hidden roadmaps.</li></ul>

<h2 id="handling-stakeholders-without-a-quarterly-deck">Handling stakeholders without a quarterly deck</h2>

<p>Finance and sales still need predictability. You can provide it without freezing decisions for 90 days.</p>

<ul><li>Monthly outcome targets: activation lift, churn reduction, expansion bookings. Anchor on outcomes, not fixed features.</li><li>Capacity bands: publish expected builder capacity per month, with buffers for interrupts. Update bands when staffing or priorities change.</li><li>Sales guardrails: a live list of promises you can make and promises you cannot. Update weekly. Tie it to decisions the agents use.</li><li>Launch calendar: maintain a rolling 4–6 week view of likely releases. Mark confidence levels. Update weekly.</li><li>Narrative brief: one page each month summarizing direction, key decisions, and what changed. No 60-slide deck.</li></ul>

<p>This gives stakeholders clarity while keeping product flexible.</p>

<h2 id="example-shipping-at-agent-speed-without-quarterly-plans">Example: shipping at agent speed without quarterly plans</h2>

<p>Week 1: You learn activation is the bottleneck for mid-market ICP. You set a decision: prioritize activation improvements over expansion experiments this month. Agents see it. Tasks in the backlog tie to it.</p>

<p>Week 2: Support flags a billing error impacting churn. You add a decision: no net-new growth experiments until billing fixes ship. Backlog reorders the same day. Agents ship billing fixes with audit logging because that decision already exists.</p>

<p>Week 3: Competitor launches a new onboarding flow. You review it, add constraints to your own onboarding: tighten P95 latency, remove playful copy for enterprise tenants, add export parity. Agents incorporate these in new work immediately.</p>

<p>Week 4: Strategy pulse shows activation improved, churn stabilized. You retire the "pause growth experiments" decision. You keep the billing logging rule. You add a new focus: "Explore self-serve upgrade for SMB tier." No offsite required.</p>

<h2 id="a-comparison-story">A comparison story</h2>

<p>Old cadence: a team commits in Q1 to a Q2 release of a new onboarding wizard. In week four, user interviews reveal that the real blocker is billing transparency, not onboarding. The team keeps building the wizard because re-planning is painful. By Q2, the launch lands, but activation barely moves. Churn rises because billing issues remain. Agents shipped plenty of UI tweaks; none solved the real problem.</p>

<p>Continuous cadence: the same team runs weekly direction checks. The week four insight triggers a new decision: "Prioritize billing clarity over onboarding polish until churn improves." The backlog flips. Agents ship billing summaries, clearer invoices, and email receipts with audit logging by week six. Activation lifts because users see charges clearly. The onboarding wizard waits. When it ships, it reflects the new billing clarity decisions.</p>

<p>The difference is the cost of waiting. With agent speed, waiting 60 days to act on a learning is a self-inflicted wound.</p>

<h2 id="metrics-that-tell-you-if-this-is-working">Metrics that tell you if this is working</h2>

<ul><li>Time to decision: from new signal to recorded decision.</li><li>Decision adoption: percentage of tasks that link to and honor current decisions.</li><li>Rework rate: how often features are rewritten due to direction changes mid-flight.</li><li>Drift events: instances where agents propose work that violates decisions.</li><li>Cycle time vs. value: features shipped that move the target metric vs. total shipped.</li><li>Planning overhead: hours spent in planning vs. time saved in reduced rework.</li></ul>

<h2 id="anti-patterns-to-avoid">Anti-patterns to avoid</h2>

<ul><li>Rebranding quarterly as "big room planning" every six weeks. Ceremony without agility.</li><li>Parking every new insight in a doc for "next planning." Insights expire.</li><li>Letting agents run on stale decisions. They will optimize for old rules.</li><li>Hoarding decisions in PM-only spaces. Agents and engineers need the same source.</li><li>Overreacting daily. Direction changes should be meaningful, not flailing.</li></ul>

<h2 id="tooling-that-helps">Tooling that helps</h2>

<ul><li>Decision register the agent can read via <a href="https://usebrief.com/mcp/">MCP</a>: JSON, YAML, or a simple text format with clear keys.</li><li>Brief templates for initiatives and tasks: one page, structured, linked to decisions.</li><li>Drift tracking: alerts when a PR or agent suggestion conflicts with a decision.</li><li>Backlog tooling that links tasks to decisions and updates when decisions change.</li><li>Lightweight logging of rework causes to spot patterns.</li></ul>

<p>Tooling is there to reduce manual overhead. It does not replace judgment.</p>

<h2 id="a-simple-rollout">A simple rollout</h2>

<p>Week 1: Create a decision register. Seed it with ten choices that matter now: ICP, tone, dependencies, performance budgets, rollout rules. Share it with the whole team.</p>

<p>Week 2: Add the weekly direction check. Keep it under an hour. Publish the 3–5 calls as decisions.</p>

<p>Week 3: Wire decisions into agent workflows. Ensure every task references relevant decisions.</p>

<p>Week 4: Add drift tracking and rework tagging. Summarize weekly.</p>

<p>Week 5: Replace the quarterly offsite with a monthly strategy pulse. Focus on what changed, what you are stopping, and what durable direction remains.</p>

<h2 id="the-real-shift">The real shift</h2>

<p>Quarterly planning is a relic of slower cycles and scarce builders. With agents, execution capacity is abundant. The constraint is how fast you can absorb new information and adjust direction without losing alignment. Replace quarterly batches with continuous decisions anchored in durable strategy. Keep the rituals light and the context alive. That is how you move at agent speed without flying blind.</p>]]></content:encoded>
    </item>
    <item>
      <title>You Just Became a Manager of AI Agents (and the Communication Chain is Broken)</title>
      <link>https://usebrief.com/blog/managing-ai-agents-broken-chain/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/managing-ai-agents-broken-chain/</guid>
      <pubDate>Mon, 22 Dec 2025 00:00:00 GMT</pubDate>
      <description>AI agents fail at the seams. Rebuild the communication chain with explicit decisions, tight briefs, and fast feedback.</description>
      <content:encoded><![CDATA[<p>When you become a manager for the first time, it feels like doing open-heart surgery with oven mitts on.</p>

<p>You've spent years building muscle memory for the actual work. Now you're guiding someone else through it. Imprecise, frustrating, but ultimately more impactful because you're multiplying output across a team.</p>

<p>Managing managers is like adding dishwashing gloves inside those oven mitts. Another layer of abstraction from the hands-on work. A whole new communication skill set.</p>

<p>AI coding agents added another abstraction. The meme says everyone became a manager overnight. We prompt, they execute, we guide. Partially true, but the core challenge is not the prompt. It is the communication chain that got severed.</p>

<h2 id="the-fundamental-difference">The Fundamental Difference</h2>

<p>There's a fundamental difference in AI coding though: the communication chain is broken.</p>

<p>In traditional product development, PMs communicate and seek out context. User needs, tradeoffs, why we're building something. Engineers use that context to build.</p>

<p>With AI coding agents, the PM does not talk to the agent. The engineer becomes the single conduit. The agent cannot raise its hand and ask about users or strategy. It executes whatever fits the prompt and the code it can see. The context that used to travel directly from PM to engineer now takes an extra hop through an interface that compresses everything into text.</p>

<p>So agents drift off course. They build for the wrong user. They ignore long-held decisions. Engineers get frustrated by rework. PMs feel cut out of the loop. The product quality drops while the activity level rises.</p>

<p>The agent is not your IC. The agent is your IC's IC. You are managing through two layers with none of the usual communication bandwidth. That is why it feels like oven mitts over dishwashing gloves.</p>

<h2 id="where-the-chain-snaps">Where the chain snaps</h2>

<p>Three places keep showing up.</p>

<p>1) <strong>Context intake:</strong> PM intent is expressed to an engineer in a meeting or a doc. The engineer distills it into a prompt. Nuance drops. The agent sees only the distilled version.</p>

<p>2) <strong>Clarification:</strong> A human engineer would ping the PM for missing details. The agent does not. It hallucinates the missing part or picks the most common pattern in the repo. Wrong defaults ship fast.</p>

<p>3) <strong>Feedback:</strong> The agent does not learn from implied feedback. If the engineer quietly fixes tone or rewrites a flow, the agent never sees the correction. It repeats the mistake in the next task.</p>

<p>Break any one of these and the loop slows. Break all three and you are paying for speed while buying rework.</p>

<h2 id="the-consequences-in-real-teams">The consequences in real teams</h2>

<p><strong>Tone and audience drift:</strong> A fintech agent ships playful microcopy into payout flows because it saw it in a marketing component. The PM intent around trust and sobriety never reached the agent. Support tickets spike. The team rewrites copy and removes confetti from error states.</p>

<p><strong>Stack drift:</strong> One task introduces Fetch with hand-rolled retries. The next introduces Axios. The next pulls in a GraphQL client because it saw the schema file. The agent optimizes locally for the prompt and code around it, not for team-level consistency. The build grows brittle and hard to maintain.</p>

<p><strong>Scope inversion:</strong> A customer request for “a CSV export of invoices” turns into a whole reporting UI because the agent saw a dashboard component. Meanwhile the real need was a one-click export with the right schema and audit logging. The agent filled in the gaps with patterns, not intent.</p>

<p><strong>Access control misses:</strong> A B2B team asks for “admin-only feature flags.” The agent implements toggles but forgets role checks on the API. A customer with the right URL accesses the feature. The PM assumed “admin-only” implied back-end enforcement. The agent assumed UI gating was enough.</p>

<p>All of this looks like edge cases until you notice the pattern. The missing factor is always context transmission and verification.</p>

<h2 id="why-manager-instincts-fail-here">Why manager instincts fail here</h2>

<p>Managers fix communication gaps by coaching, shadowing, and quick taps. None of that reaches the agent by default. You cannot shoulder tap the model. You cannot rely on “I’ll see it in the PR” when the agent generates the PR. You cannot wait for a weekly sync to realign because the agent has already shipped three features since then.</p>

<p>The usual playbook—longer specs, more acceptance criteria, more review—adds ceremony but not comprehension. Agents do not parse nuance from prose. Humans do, and they still struggle with walls of text. The engineer is forced to act as interpreter and gatekeeper, which defeats the point of the agent’s speed.</p>

<h2 id="the-missing-piece">The missing piece</h2>

<p>The missing piece is not better code generation. It is giving agents the same context that makes human engineers effective: user needs, business constraints, technical decisions, and the why behind those decisions. This is what we call <a href="https://usebrief.com/product-context/">product context</a>—the business knowledge that transforms AI from a code generator into a product-aware collaborator. Then making that context available at generation time and at review time, and making sure corrections flow back into the system.</p>

<h2 id="what-manager-of-managers-looks-like-in-agent-world">What manager of managers looks like in agent world</h2>

<p>Your job is to set intent, boundaries, and feedback loops that survive two hops.</p>

<p><strong>Intent:</strong> What problem are we solving, for whom, and why now.</p>

<p><strong>Boundaries:</strong> What choices are fixed. What choices are flexible. What quality bar applies to this task.</p>

<p><strong>Feedback:</strong> How the agent learns from corrections and how those corrections become constraints for the next task.</p>

<p>Do that well and the agent feels like a senior IC. Do it poorly and the agent feels like an eager intern who never listens.</p>

<h2 id="anti-patterns-to-watch">Anti-patterns to watch</h2>

<p><strong>Boilerplate prompts:</strong> Copying a giant prompt template into every task. It lulls you into thinking the agent “knows” things it never reads. The context needs to be short, current, and relevant to the task.</p>

<p><strong>Shadow rewriting:</strong> Engineers quietly rewrite agent output without updating the shared constraints. The agent repeats the same mistake in the next task. Rework becomes permanent.</p>

<p><strong>Dependency sprawl:</strong> Agents import new libraries to solve local tasks because team standards are not enforced in context. Every feature brings a new stack fragment.</p>

<p><strong>Feature factory autopilot:</strong> PMs stay out of the loop until sprint review. The agent ships fast but off-target. The team backfills context after the fact.</p>

<p><strong>Prompt bloat:</strong> Engineers paste entire specs, tickets, and wikis into prompts. The agent chokes on noise and still misses the key decisions.</p>

<h2 id="a-playbook-that-rebuilds-the-chain">A playbook that rebuilds the chain</h2>

<p>1) <strong>Make decisions first-class</strong></p>

<ul><li>Capture them in a structured format: "We use Jest," "We never store PII in logs," "Enterprise flows use email for critical alerts," "Tone is concise and confident."</li><li>Version them. Retire stale ones. Highlight new ones to the agent and the team.</li><li>Feed them automatically with every agent task. No copy-paste. See the <a href="https://usebrief.com/agent-setup/">agent setup guide</a> for how to configure this with different tools.</li></ul>

<p>2) <strong>Create task-specific briefs</strong></p>

<ul><li>One tight brief per task: goal, user, constraints, success criteria, known decisions that apply, red lines not to cross.</li><li>Keep it short enough that a human can read in one minute and an agent can process without getting lost.</li><li>Include rationale when a choice looks arbitrary: “Email, not in-app, because audit retention is required.”</li></ul>

<p>3) <strong>Establish clarification hooks</strong></p>

<ul><li>Give the agent a way to surface uncertainty. If a pattern deviates from decisions, the agent should ask or flag.</li><li>For humans pairing with the agent, set a rule: if you add more than two ad hoc clarifications while editing, add them to the decision set or the brief so the next run knows them.</li></ul>

<p>4) <strong>Close the feedback loop</strong></p>

<ul><li>When you edit agent output, mark what changed and why. Was it tone, dependency choice, performance, accessibility, security, UX polish.</li><li>Update decisions when the edit reflects a recurring pattern, not a one-off.</li><li>Track repetition. If the agent keeps missing the same constraint, your context distribution is broken.</li></ul>

<p>5) <strong>Instrument everything</strong></p>

<ul><li>Drift events: count when the agent proposes something outside decisions.</li><li>Rework causes: tag edits by category: context missing, decision violation, quality bar missed, ambiguity in goal.</li><li>Time to clarity: measure from task creation to “agent has the right constraints.”</li><li>Prompt size: watch for bloat. If briefs get long, split work or tighten decisions.</li></ul>

<p>6) <strong>Keep humans in the loop without slowing them down</strong></p>

<ul><li>PMs should see the briefs and decisions the agent uses. That visibility restores influence without calendar bloat.</li><li>Engineers should not need to become context librarians. Automate the injection of decisions and briefs into the agent.</li></ul>

<h2 id="a-concrete-example-role-based-access">A concrete example: role-based access</h2>

<p><strong>Goal:</strong> add an “Edit Billing” screen for admins only.</p>

<p><strong>Brief:</strong> who the user is (admins at enterprise customers), why it matters (billing errors cause churn), constraints (RBAC enforced server-side, no playful tone, log all changes, latency target under 300ms P95), decisions (use existing form components, use Jest, React Query, REST only, no new dependencies).</p>

<p><strong>Agent run without context:</strong> builds a React form with client-side checks, uses a new HTTP client for convenience, adds a toast with a celebratory icon on success, no audit log. Looks good in a PR, fails the business intent.</p>

<p><strong>Agent run with context:</strong> enforces RBAC on the API, reuses existing components, writes to the audit log, keeps tone neutral, uses existing HTTP patterns. The PR lands mostly clean. Edits focus on copy and edge cases, not on re-architecture.</p>

<p>The difference is not the model; it is the context and boundaries.</p>

<h2 id="how-to-roll-this-out">How to roll this out</h2>

<p><strong>Week 1:</strong> Build a decision register. Start with ten to twenty items that impact current work: stack choices, tone, compliance, logging, performance, dependencies. Keep it in a format agents can read.</p>

<p><strong>Week 2:</strong> Create a brief template. One page, max. Fields: goal, user, rationale, constraints, success criteria, linked decisions. Use it for two active tasks. Tune it until it reads fast.</p>

<p><strong>Week 3:</strong> Wire briefs and decisions into the agent workflow. Automate inclusion. Stop pasting.</p>

<p><strong>Week 4:</strong> Add drift tracking and rework tagging. Make it easy to mark why you edited the agent output. Summarize weekly.</p>

<p><strong>Week 5:</strong> Add a ten-minute daily decision review. Add new decisions, retire stale ones, highlight what changed.</p>

<p><strong>Week 6:</strong> Give PMs and designers access to the briefs and decisions. Let them update tone, user constraints, and non-functional requirements without waiting for a sprint change.</p>

<h2 id="signals-you-are-fixing-the-chain">Signals you are fixing the chain</h2>

<ul><li>Agent output needs fewer rewrites for tone, dependencies, and compliance.</li><li>Prompts get shorter because decisions carry the defaults.</li><li>Features ship with consistent patterns across tasks.</li><li>PMs give feedback earlier because they see what context the agent is using.</li><li>Drift events decline week over week.</li><li>QA finds fewer repeats of the same class of bugs.</li></ul>

<h2 id="signals-you-are-still-broken">Signals you are still broken</h2>

<ul><li>Engineers keep pasting giant specs into prompts.</li><li>The agent introduces new libraries on routine tasks.</li><li>PMs only see work at sprint review.</li><li>The same tone or compliance issues appear in every PR.</li><li>Decisions live in a doc nobody updates.</li></ul>

<h2 id="the-real-job-now">The real job now</h2>

<p>Managing an agent is not about clever prompts. It is about rebuilding a communication chain that lost a layer. The agent cannot overhear the sales call. It cannot tap the PM on the shoulder. It cannot guess which decisions are sacred. It will fill gaps with whatever patterns it sees.</p>

<p>You are now the manager of a manager you cannot talk to directly. Your tools are explicit decisions, tight briefs, fast feedback, and visibility. Do that and the agent becomes an extension of your product intent instead of a risk multiplier.</p>

<p>When people say AI has turned everyone into a manager, this is the work they are pointing at. Not status updates. Not more meetings. The work is designing the context path so the agent ships the right thing fast.</p>]]></content:encoded>
    </item>
    <item>
      <title>Remote Killed the Shoulder Tap. AI is Breaking It Again.</title>
      <link>https://usebrief.com/blog/remote-killed-shoulder-tap/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/remote-killed-shoulder-tap/</guid>
      <pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate>
      <description>Product work used to ride on tiny, informal moments. Remote work erased that layer. Now AI coding agents are shipping features before PMs can add context—and the rework is piling up.</description>
      <content:encoded><![CDATA[<p>Product work used to ride on tiny, informal moments. You heard a designer mutter about a confusing flow. You caught a sales rep on a call and realized a deal was at risk. A PM tapped an engineer to say, "That customer on the east coast is stuck on onboarding, can we swap the order of these fields?" Those shoulder taps <strong>moved context faster than any ticket ever could</strong>.</p>

<p>Remote work erased most of that layer. The Allen curve says communication plummets as distance grows. Microsoft researchers measured remote collaboration and saw cross-team ties fray and rich, ad hoc conversations shrink. Studies on relational communication found people felt more transactional and less connected after the abrupt shift. The evidence matches what teams felt: <strong>the casual backchannel that kept product intent aligned went quiet</strong>.</p>

<h2 id="what-changed-day-to-day">What changed day to day</h2>

<ul><li>Simple clarifications turned into Slack threads, then meetings.</li><li>A two-minute nudge became a 30-minute calendar slot.</li><li>PMs bundled feedback into weekly reviews because interrupting felt expensive.</li><li>Engineers optimized for uninterrupted blocks, which meant less context-sharing in flight.</li></ul>

<p>The result was friction on every handoff. A story that used to get shaped in three hallway conversations now lived in a doc and a queue. <strong>By the time code shipped, the original nuance was gone</strong>. Teams compensated with ceremony: longer specs, more screenshots, Looms for every demo. Those efforts helped, but they <em>never recreated the fast path that proximity gave</em>.</p>

<p>The hidden cost showed up as <strong>rework</strong>. Tickets shipped with partial intent. UX tone mismatched the buyer. Edge cases got discovered after launch because the "oh, and make sure it works for resellers" reminder never happened. Late feedback arrived after code froze. Cycle time metrics looked fine; <strong>the real loss was in alignment and quality of the first pass</strong>.</p>

<p>Back in the office did not fully fix it. Hybrid days clustered collaboration, but the informal layer stayed thin. People still defaulted to async. The habit of over-structuring every interaction stuck. <strong>The shoulder tap muscle atrophied</strong>.</p>

<p>Then <strong>AI coding agents arrived and multiplied the speed gap</strong>. An engineer can sit with Cursor or Claude and ship a feature before lunch. The agent will happily scaffold thousands of lines based on whatever prompt it gets. If the PM context is late or compressed, <strong>the agent builds the wrong thing quickly and confidently</strong>.</p>

<h2 id="failure-mode-in-the-wild">Failure mode in the wild</h2>

<p>A team building compliance workflows asked their agent to add "client notifications." The repository contained a mix of consumer-style components and enterprise pages. The agent matched the patterns it saw and produced playful in-app toasts with emoji-rich copy. The missing pieces were obvious to any PM on the account: <em>regulated clients, audit trails, tone constraints, delivery guarantees</em>. <strong>None of that made it into the prompt</strong>. Rework meant ripping out UI, wiring email with retention, and rewriting copy. <strong>The engineering velocity looked great until you count the do-over</strong>.</p>

<p>Other patterns keep repeating:</p>

<ul><li>Generic scaffolding: the agent adds dashboards, toast systems, and preference centers because the repo contains them, not because the user needs them now.</li><li>Tone mismatch: consumer patterns leak into B2B flows. Legal tech gets smiley microcopy. Healthcare gets celebratory confetti on failure.</li><li>Non-functional blind spots: performance budgets, logging, and audit trails vanish because the agent does not see them in the immediate prompt.</li><li>Decision thrash: one task uses Jest, the next pulls in Vitest; one feature ships REST, the next quietly adds GraphQL because it seemed cleaner.</li><li>Dependency creep: the agent installs new UI kits or HTTP clients because they solve the immediate task, ignoring the team's standards.</li></ul>

<h2 id="why-the-usual-patches-fall-short">Why the usual patches fall short</h2>

<ul><li>Longer specs: they age fast, they still miss the tacit "why," and agents rarely parse them end to end.</li><li>More meetings: they slow the loop and still do not reach the agent inside the IDE.</li><li>Looms and walkthroughs: great for demos, weak for structured, recallable decisions the agent can apply.</li><li>Ad hoc prompting: engineers translate PM intent under time pressure, compressing nuance and omitting rationale.</li><li>Knowledge bases: helpful for humans, but useless if the agent cannot query them in a structured way at decision time.</li></ul>

<h2 id="what-fixed-looks-like">What fixed looks like</h2>

<p><strong>Context has to be accessible, structured, and alive</strong>. The modern shoulder tap is not a chat ping; it is a system that lets the agent consume constraints and intent <em>before</em> it generates code.</p>

<h3>1) Structure the context the agent can read</h3>

<ul><li>Product: ICP, user archetypes, tone rules, accessibility expectations, onboarding priorities, success definitions.</li><li>Business: pricing model, regulated vs unregulated segments, SLAs, risk posture, compliance boundaries.</li><li>Technical: stack decisions, API contracts, performance budgets, logging standards, data residency rules, privacy choices.</li><li>Design: component library rules, brand voice, motion guidelines, layout constraints.</li><li>Non-functional: observability expectations, error handling defaults, security controls, rollback plans.</li></ul>

<p>Keep this in a format <strong>the agent can consume directly</strong>. Not buried in Notion pages or scattered docs. Short, structured artifacts with clear keys and values. <strong>Update them when reality changes, not once a quarter</strong>.</p>

<h3>2) Turn decisions into first-class objects</h3>

<p><strong>Write decisions like you write code</strong>: small, explicit, versioned. Examples:</p>

<ul><li>We notify by email for regulated events; no in-app toasts for legal clients.</li><li>We log every client-facing message with a retention policy of 365 days.</li><li>We use Jest for testing and React Query for data fetching.</li><li>We never ship playful copy to enterprise buyers; default tone is concise and direct.</li><li>We do not add new dependencies without approval if an equivalent exists in the stack.</li></ul>

<p>These constraints <strong>reduce search space for the agent</strong>. They also remove the guesswork for a human pairing with it. When the agent tries to deviate, <strong>it should surface a question instead of pushing code</strong>.</p>

<h3>3) Add lightweight rituals to keep context fresh</h3>

<ul><li>Ten-minute decision review at the start of a work block. Capture new choices as decisions, not meeting notes.</li><li>After a customer call, record the two or three implications that affect current work. Add them to the decision set.</li><li>When a feature ships, add the gotchas discovered during QA to the constraints list so the agent avoids them next time.</li><li>Rotate a weekly audit of decisions to prune stale ones and highlight new ones to the team.</li></ul>

<p><strong>None of this needs a big meeting</strong>. It needs habit and a place to put the information that the agent and humans can both read.</p>

<h3>4) Instrument drift and prompt bloat</h3>

<ul><li>Drift detection: when the agent suggests patterns outside your decisions, flag and log it. Example: it proposes GraphQL when the standard is REST. Approve or reject once; the system learns.</li><li>Prompt bloat control: track how much context you stuff into each request. If prompts are ballooning because you do not trust the agent to remember standards, <strong>you have a context distribution problem</strong>.</li><li>Rework ratio: measure how often agent output is rewritten due to missing context. Track by feature, not by file.</li><li>Time to clarity: time from "we need X" to "agent has the right constraints to start." <strong>Shrink this by improving decision availability, not by adding meetings</strong>.</li></ul>

<h3>5) Give PMs visibility into the IDE loop</h3>

<p>The PM should be able to <strong>inject context into an agent session</strong> without waiting for a ticket cycle or a meeting. That can be a decision toggle, a constraint update, or a quick note tied to the task. The engineer stays unblocked, the agent stays aligned, and <strong>the PM regains influence on the first pass</strong>.</p>

<h2 id="how-this-looks-in-practice">How this looks in practice</h2>

<p>Day zero: a PM hears from a customer that export files must include a new compliance note. Instead of writing a paragraph in Slack, the PM adds a decision: "All exports include compliance footer text provided by legal, immutable after generation." The agent sees it before generating the export flow and includes the footer. QA catches tone issues, the PM tightens the tone rule. No rework cycle.</p>

<p>Week one: the team picks React Query and Jest as defaults. They add them as decisions. When the agent tries to introduce Axios or Vitest, it flags a suggestion instead of pulling the package. The team accepts or rejects. Dependency creep stops.</p>

<p>Week two: a customer call reveals that in-app toasts are acceptable for sandbox accounts but never for production tenants. The PM adds that nuance. The agent now branches behavior based on environment without being told in the prompt each time.</p>

<p>Week three: the team realizes performance budgets are missing. They add: "All list endpoints must return in under 300ms at P95 with pagination." The agent starts choosing pagination and indexing patterns that fit the budget without being reminded.</p>

<h2 id="before-and-after">Before and after</h2>

<p><strong>Before</strong>: PM feedback is bundled into a weekly review. The engineer prompts the agent with partial context. The agent scaffolds a feature with playful copy and missing audit logs. QA flags issues. PM reopens the ticket. Engineer rewrites half the code. <em>Two weeks of motion for a feature that should have shipped in two days</em>.</p>

<p><strong>After</strong>: PM adds decisions in line with customer calls. Engineer prompts the agent with the decision set available. The agent ships the feature with email notifications, audit logging, and the right tone. QA verifies minor details. <em>The feature ships in two days with no rewrite</em>.</p>

<h2 id="a-pragmatic-rollout-plan">A pragmatic rollout plan</h2>

<p><strong>Week 1</strong>: Create a decision register. Seed it with ten to twenty choices that actually affect current work. Keep it in plain text or JSON so agents can read it. <strong>No jargon</strong>.</p>

<p><strong>Week 2</strong>: Wire the decision set into your agent workflow. <strong>Pass it as context automatically</strong>. Do not rely on humans to paste it.</p>

<p><strong>Week 3</strong>: Add drift tracking. When the agent suggests something outside the decisions, capture it. <strong>Decide once</strong>. Update the decision set or block the change.</p>

<p><strong>Week 4</strong>: Add a daily ten-minute decision review. Add or retire decisions. Keep it light.</p>

<p><strong>Week 5</strong>: Add a short PM injection path: a way for PMs to add a constraint that is <strong>live within an hour, not a sprint</strong>.</p>

<h2 id="signals-you-are-improving">Signals you are improving</h2>

<ul><li>Fewer rewrites attributed to missing context.</li><li>Shorter prompts because standards live in the decision set.</li><li>Consistency in dependencies and patterns across features.</li><li>QA finds fewer tone and compliance issues.</li><li>PMs spend less time re-explaining user intent and more time refining it.</li></ul>

<h2 id="signals-you-are-not-there-yet">Signals you are not there yet</h2>

<ul><li>Engineers paste walls of text into prompts because they do not trust shared context.</li><li>Agents introduce new dependencies every week.</li><li>PMs learn about output only at sprint review.</li><li>QA keeps catching the same category of errors: tone, logging, accessibility.</li><li>Decision docs become stale and nobody can tell which ones matter.</li></ul>

<h2 id="the-new-shoulder-tap">The new shoulder tap</h2>

<p>The old shoulder tap was a two-minute interruption that carried nuance without paperwork. <strong>The modern version is structured context that the agent and the human can both use</strong>. It is fast because it is pre-baked. It is reliable because it is explicit. It restores the PM voice inside the IDE loop without slowing down the engineer.</p>

<p>Engineers keep the speed they get from Cursor, Claude, or Copilot. PMs regain influence on the first pass. The organization ships features closer to the customer need on the first try. <strong>The informal glue that remote work dissolved comes back as a system, not a hope that people will talk more in hallways</strong>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Context Windows Will Keep Growing (But That Won't Solve the Problem)</title>
      <link>https://usebrief.com/blog/context-vs-attention/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/context-vs-attention/</guid>
      <pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate>
      <description>Larger context windows just create more noise. AI agents need directed attention, not infinite context, to build coherent products.</description>
      <content:encoded><![CDATA[<p>The industry is racing to make context windows bigger. 100k tokens, 200k, now we're pushing toward millions. Every model release touts a larger window like it's the breakthrough we've been waiting for.</p>

<p>But bigger windows just create more noise.</p>

<h2 id="the-information-problem">The Information Problem</h2>

<p>I teach a class on product management, and one concept always catches people off guard: PMs don't suffer from a lack of information. They're drowning in it. Customer feedback, analytics, competitive intel, team opinions, stakeholder requests. The volume of information available is overwhelming.</p>

<p>The problem isn't gathering more information. It's knowing what to pay attention to.</p>

<p>A PM who listens to every piece of feedback equally will build a frankenstein product that satisfies no one. A good PM curates attention: they decide which signals matter and which are noise.</p>

<p>AI agents have the same problem.</p>

<p>Throwing a 300-page printer manual into an agent's context window doesn't help it fix a paper jam. It needs the 2 pages on troubleshooting jams, not the other 298 pages on network setup, toner replacement, and driver installation.</p>

<p>Access to information is different from loading all of it into working memory. Humans understand this instinctively. We keep reference materials available but don't try to hold everything in our head at once. We pull in what's relevant when it's relevant.</p>

<p>Agents need the same capability.</p>

<h2 id="when-attention-fails">When Attention Fails</h2>

<p>One of our customers is building a new product from scratch with a small team. They're moving fast, iterating, figuring things out as they go. Because of this, they haven't established formal conventions around tooling yet. No documented decisions about testing frameworks (Vitest vs Jest), styling approaches (Tailwind vs CSS-in-JS), or architecture patterns.</p>

<p>Their coding agent had a different interpretation of "moving fast."</p>

<p>Every new feature came with a new testing framework. One feature used Jest. The next used Vitest. Then back to Jest. Then something else entirely. Same with component patterns: the agent would scaffold React components one day and suggest a completely different approach the next.</p>

<p>The agent wasn't broken. It had access to knowledge about all these frameworks. The problem was it had no way to know which choices had already been made. No sense of "we decided on Jest last week, stick with that."</p>

<p>Without directed attention, the agent treated every task as a blank slate. Maximum flexibility, zero consistency.</p>

<p>We had to build a concept we call "decisions" into Brief: explicit declarations like "We use Jest for testing" or "We build components in React" that constrain the agent's attention. Not because the other options are bad, but because consistency matters more than theoretical perfection. This is the core of <a href="https://usebrief.com/product-context/">product context</a>—giving AI the business knowledge to make consistent decisions.</p>

<h2 id="why-this-happens">Why This Happens</h2>

<p>Transformer models don't naturally distinguish between what's important and what's not. Everything in the context window gets processed with relatively equal weight. The model attends to all of it, looking for patterns and relationships.</p>

<p>This is powerful for tasks where everything is relevant. But for complex, ongoing work like building software, most of the available information is noise for any given task.</p>

<p>Change a button color, and the agent sees the entire frontend codebase. Every component, every pattern, every architectural decision. Without guidance about what matters for this specific change, the agent might decide this is the perfect time to refactor your component library.</p>

<p>Infinite context windows won't fix this. They'll make it worse. More information means more potential distractions, more opportunities to optimize for the wrong thing, more ways to miss the actual signal.</p>

<h2 id="the-solution-isn-t-more-context">The Solution Isn't More Context</h2>

<p>The industry is solving for the wrong constraint.</p>

<p>Bigger context windows are impressive technically. They're useful for certain tasks. But they don't address the fundamental problem: agents need to know what to pay attention to, not just what they have access to.</p>

<p>This requires a different primitive: attention.</p>

<p>Brief solves this through structured context management. Teams can define decisions, document conventions, establish boundaries around what the agent should consider for different types of tasks. The agent has access to the full codebase and all relevant documentation, but its attention is directed toward what actually matters. See the <a href="https://usebrief.com/agent-setup/">agent setup guide</a> to learn how to configure this with Cursor, Claude Code, and other tools.</p>

<p>When you tell Brief "we use Jest," that's not just metadata. It shapes how the agent approaches testing tasks. When you define your ICP, that's not background information. It directs architectural choices.</p>

<p>The agent still has access to knowledge about Vitest, Mocha, and every other testing framework. But its attention is constrained to the choice you've already made.</p>

<p>Absent this kind of directed attention, the alternative is keeping a Notion doc and spoon-feeding prompts one by one, manually curating what information goes into each request. Treating the agent like a very sophisticated find-and-replace tool instead of a collaborator.</p>

<p>That works, but it doesn't scale. It defeats the purpose of having an agent in the first place.</p>

<h2 id="what-changes">What Changes</h2>

<p>The difference between an agent with infinite context and an agent with directed attention is the difference between a PM who reads every email and a PM who knows which emails matter.</p>

<p>Both have access to the same information. Only one ships coherent products.</p>

<p>Context windows will keep growing. Models will keep improving. But until we solve for attention, agents will continue to make technically correct decisions that miss the point entirely.</p>]]></content:encoded>
    </item>
    <item>
      <title>Are You Treating Your Coding Agent Like a Mushroom?</title>
      <link>https://usebrief.com/blog/treating-ai-like-mushroom/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/treating-ai-like-mushroom/</guid>
      <pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate>
      <description>Coding agents crush refactors but flail on new features when they’re kept in the dark about users, priorities, and constraints.</description>
      <content:encoded><![CDATA[<p>Over and over teams try them out and report back with predictable results: they're great at migrations and refactoring, but terrible at building new features or making architectural decisions.</p>

<p>This makes perfect sense when you think about what we're actually giving them.</p>

<h2 id="what-works">What Works</h2>

<p>For a migration, the agent just needs to understand the codebase. Transform this pattern to that pattern, update dependencies, move files around. The repository contains everything it needs to know.</p>

<p>But for a new feature?</p>

<p>The agent needs to understand users, business priorities, edge cases, and how this change fits into the broader product strategy. We're asking it to make product decisions based solely on technical artifacts.</p>

<h2 id="how-we-onboard-humans">How We Onboard Humans</h2>

<p>What's wild is that we'd never onboard a junior engineer this way. You wouldn't hand a new hire access to the repo on day one and say "go build the user authentication system."</p>

<p>You'd introduce them to the rest of the organization, have them fix some bugs, maybe refactor a small module, gradually build up their understanding of both the codebase and the product.</p>

<p>With AI agents, we skip all of that. We throw them directly at complex feature work with zero context about users, business constraints, or team conventions. Then we're surprised when they make poor decisions.</p>

<h2 id="the-cost-of-context-loss">The Cost of Context Loss</h2>

<p>When we were building Brief itself, our coding agent had an obsession with dashboards. Tell it we're making a B2B SaaS app and the first thing it would do is scaffold out a generic dashboard component. No consideration for what the product actually did. No understanding of what users needed first. Just: "B2B SaaS = dashboard."</p>

<p>The agent was pattern matching on the wrong patterns. It had learned that B2B apps have dashboards, but it had no context about <em>our</em> product, <em>our</em> users, or <em>our</em> priorities. So it optimized for building the most generic, least useful thing possible.</p>

<p>Once we started feeding it Brief's own product context (what we were building and why), it stopped suggesting dashboards. It finally had enough information to make decisions that aligned with our actual product strategy.</p>

<p>Or take one of our customers building legal tech for law firms. Professional tools for serious clients handling serious matters. Their agent kept injecting emojis into error messages, adding playful microcopy, and generally treating it like a consumer social app.</p>

<p>The agent wasn't trying to sabotage them. It was doing exactly what it had been trained to do: make engaging, friendly interfaces. But it had zero context about who these users were, what they were trying to accomplish, or what tone was appropriate.</p>

<p>After they gave Brief their ICP and company context (that these were legal professionals working on high-stakes matters), the agent quit using emojis cold turkey. It understood not just <em>what</em> to build, but <em>how</em> it should feel.</p>

<p>These aren't edge cases. They're the predictable result of <a href="https://usebrief.com/ai-context-loss/">context loss</a>.</p>

<h2 id="the-telephone-game">The Telephone Game</h2>

<p>The real diagnostic question isn't "is my agent good enough?" It's: "how much of a game of telephone am I playing?"</p>

<p>Think about the path information takes:</p>

<p><strong>PM → Slack thread → Engineering ticket → Engineer's brain → Prompt → Agent</strong></p>

<p>At every step, context gets compressed, simplified, or lost entirely.</p>

<p>The PM has a conversation with a customer about a painful workflow. They summarize it in Slack. Someone distills that into a ticket. An engineer reads the ticket and forms their mental model. Then they try to express that mental model in a prompt to an agent.</p>

<p>By the time the agent sees it, the original customer pain has been filtered through four layers of lossy compression. The agent is building from a photocopy of a photocopy of a photocopy.</p>

<p>The more steps between the original context and the agent, the more you're treating it like a mushroom. Feeding it degraded information, expecting clarity.</p>

<h2 id="what-agents-actually-need">What Agents Actually Need</h2>

<p><strong><a href="https://usebrief.com/product-context/">Product Context</a></strong>: Who are your users? What problems are they trying to solve? What does success look like for them? Your agent should understand the difference between building for lawyers and building for teenagers, between enterprise IT buyers and prosumer creators.</p>

<p><strong>Business Context</strong>: What are you optimizing for right now? Is this a scrappy MVP where perfect is the enemy of shipped? Or a mature product where a bug could cost millions? What are the quality bars, the compliance requirements, the performance budgets?</p>

<p><strong>Team Context</strong>: What are your conventions? Your agents should know that your team prefers composition over inheritance, that you always add error tracking to new features, that the design system is in Figma and not the repo.</p>

<p><strong>Decision Context</strong>: Why did you make past architectural choices? What alternatives did you consider? What constraints drove those decisions? Without this, agents will make the "textbook correct" choice that ignores your specific constraints.</p>

<p>A senior engineer joining your team can only make good decisions if they have sufficient context. Your agent needs the same.</p>

<h2 id="the-real-difference">The Real Difference</h2>

<p>Successful coding agents have access to context. Disappointing ones don't.</p>

<p>The sophistication of the AI and the size of the context window matter less than whether you're treating it like a mushroom: feeding it shit and keeping it in the dark.</p>

<h2 id="a-self-assessment">A Self-Assessment</h2>

<p>Ask yourself:</p>

<ol><li><strong>The Dashboard Test</strong>: If you asked your agent to build a new feature for your product right now, would it suggest something generic or something specific to your users?</li><li><strong>The Telephone Count</strong>: How many steps are between your original product decisions and what your agent sees? Can it access the PM discussion, or just the code?</li><li><strong>The New Hire Test</strong>: If a senior engineer joined your team today with only the context your agent has, could they make good architectural decisions?</li><li><strong>The Tone Test</strong>: Does your agent understand not just <em>what</em> to build, but <em>how</em> it should feel for your specific users?</li></ol>

<p>If you're failing these tests, you don't have an agent problem. You have a context problem.</p>

<p>And the good news is: context problems are solvable.</p>]]></content:encoded>
    </item>
    <item>
      <title>Product Management Has a Velocity Problem</title>
      <link>https://usebrief.com/blog/product-management-velocity-problem/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/product-management-velocity-problem/</guid>
      <pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate>
      <description>Hands-on keyboards stopped being the bottleneck. Product judgment, taste, and decision-speed are the new constraints, and AI can help close the gap.</description>
      <content:encoded><![CDATA[<h2 id="the-sentence-i-ve-been-waiting-for">The sentence I've been waiting for</h2>

<p>I heard it last Friday: "We fired our head of product. They weren't able to move as fast as our engineering team." It's starting at small companies, but it signals a bigger crisis for product management.</p>

<h2 id="the-old-world">The old world</h2>

<p>For decades the bottleneck was hands-on-keyboards. Engineering time was scarce, so we optimized for ceremony and alignment: quarterly OKRs, monthly business reviews, weekly product reviews, daily stand-ups, constant user research. The rituals worked because code was expensive.</p>

<p>A feature that took six weeks to build could justify two weeks of user research, a week of spec writing, and four rounds of design review. The math worked. PM overhead was a rounding error compared to engineering cost.</p>

<h2 id="the-new-constraint">The new constraint</h2>

<p>When code generation accelerates for certain types of work, the constraint shifts to thought, judgment, and decision-making. Product management gets reexamined from the ground up. The old cadence doesn't survive when builds happen in hours.</p>

<p>An engineer with Cursor or Claude can ship specific features in an afternoon. Standard authentication flows? Done by lunch. CRUD dashboards? Finished before standup ends. Basic payment integrations? Two hours, including tests.</p>

<p>This doesn't apply to everything. Distributed systems, novel architectures, ML pipelines, compliance-heavy features, and scale-sensitive work still require careful engineering. But the subset of product work that is now genuinely fast has grown large enough to create tension.</p>

<p>The PM is still running their two-week discovery sprint. Still scheduling five stakeholder meetings. Still writing the 12-page spec document. By the time the PRD is ready, engineering has already shipped three other features and is wondering what product is doing all day.</p>

<h2 id="the-velocity-mismatch">The velocity mismatch</h2>

<p>PMs operate at a cadence designed for a different era. The tools and processes that made sense when engineering was the bottleneck become the bottleneck when code gets cheap.</p>

<p>The pattern repeats:</p>

<ul><li>A PM spent three days crafting the perfect roadmap presentation. Engineering shipped four features during those three days and asked why they weren't in the deck.</li><li>A product team ran a month-long customer research initiative to validate a feature concept. By the time they presented findings, the engineering team had prototyped, tested, and deprecated two similar approaches.</li><li>A head of product got fired not for poor judgment, but for taking two weeks to make a decision that engineering could implement in two hours.</li></ul>

<p>But slowness rarely comes from individual PM output alone. The deeper issues:</p>

<ul><li>Unclear company strategy means PMs spend weeks building alignment that shouldn't be necessary</li><li>Reactive leadership creates constant reprioritization, making previous research obsolete</li><li>Conflicting incentives across functions force PMs into negotiation cycles that delay decisions</li><li>Shifting goals invalidate carefully researched product directions mid-stream</li></ul>

<p>The gap continues to widen. Treating it purely as a PM performance problem misses the organizational dysfunction underneath.</p>

<h2 id="the-career-implications">The career implications</h2>

<p>This shift threatens the entire PM discipline. If product thinking can't keep pace with product building, one of two things happens:</p>

<ol><li>Engineering starts making product decisions (often badly, without user context or business strategy)</li><li>Companies stop hiring PMs and just let AI agents make the calls</li></ol>

<p>Neither is good. The first leads to technically impressive products that nobody wants. The second leads to feature churn without strategic direction.</p>

<p>But there's a third path: PMs who evolve their practice to match the new environment. Discovery work fundamentally takes time (market sizing, qualitative research, enterprise needs analysis, and validation don't accelerate at the same rate as code generation), so the answer lies in making PM judgment more accessible to the systems doing the building.</p>

<p>This raises new risks. Velocity without validation can erode user trust, accelerate technical debt, create brand inconsistency, and ship misaligned features at scale. PMs must actively manage these trade-offs, which means evolving new skills: understanding how AI consumes context, recognizing agent failure modes, and designing systems that preserve strategic coherence even when execution accelerates.</p>

<h2 id="what-changes">What changes</h2>

<p>Making faster decisions misses the point. The real challenge: making your decisions accessible to the systems doing the building.</p>

<p>When an AI agent is implementing a feature, it needs instant access to different types of product judgment:</p>

<ul><li><strong>Business prioritization</strong>: Why this feature matters more than alternatives</li><li><strong>UX clarity</strong>: What experience principles guide implementation choices</li><li><strong>Strategic trade-offs</strong>: How this fits into long-term product direction</li><li><strong>Risk assessment</strong>: What could go wrong and what safeguards matter</li><li><strong>User segmentation</strong>: Which user groups this serves and which it doesn't</li><li><strong>Sequencing logic</strong>: Why now versus later, and what dependencies exist</li></ul>

<p>But encoding judgment is only one dimension of PM work. PMs still need to:</p>

<ul><li>Align executives around strategic direction</li><li>Negotiate cross-functional trade-offs in real-time</li><li>Set long-term vision that guides multiple teams</li><li>Design rollout sequences that manage risk and dependencies</li><li>Build trust with customers and stakeholders through direct engagement</li></ul>

<p>Tools that capture structured context support these activities but don't replace them. The value is in making PM reasoning available to engineers and AI systems at decision time, reducing the coordination overhead that slows everyone down.</p>

<h2 id="the-silver-lining">The silver lining</h2>

<p>The same founder asked, "Can an AI teach my engineers taste?" Yes. Taste is a series of decisions and judgments. AI can teach engineers and agents taste, but it needs human direction. People who care about users, customers, and what the company can achieve.</p>

<p>Product management survives this shift. PM as process coordinator doesn't. The future belongs to PMs who can encode judgment, not just exercise it. Who can build systems that scale taste, not just demonstrate it in quarterly reviews.</p>

<p>The PMs who figure this out won't get fired for being too slow. They'll be the ones who kept their companies building the right things even as execution velocity increased. Not by working faster, but by making their thinking more accessible to the systems and people who need it.</p>]]></content:encoded>
    </item>
    <item>
      <title>What PMs Actually Need (vs. What We Keep Building for Them)</title>
      <link>https://usebrief.com/blog/what-pms-actually-need/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/what-pms-actually-need/</guid>
      <pubDate>Wed, 19 Nov 2025 00:00:00 GMT</pubDate>
      <description>Product managers are drowning in metrics and workflows, but what they really need is clarity, better tools for expressing ideas, and alignment with engineering and company decision-making.</description>
      <content:encoded><![CDATA[<p>PMs don't need:</p>

<ul><li>more metrics (they're accountable for outcomes, but drowning in numbers that don't inform decisions)</li><li>more workflows</li><li>more feature requests</li><li>more armchair feedback</li><li>more process</li><li>more ideas</li></ul>

<p>PMs need:</p>

<ul><li>more clarity</li><li>more help expressing ideas</li><li>more understanding of eng capability</li><li>more reasons why an iceboxed feature might work</li><li>more help selling ideas internally</li><li>more alignment to company decision making</li></ul>

<p>Every product ever built for development teams optimizes for the former and not the latter.</p>

<h2 id="why-we-keep-building-the-wrong-tools">Why we keep building the wrong tools</h2>

<p>Walk through any product team's stack and you'll find the same pattern: tools that track everything but illuminate nothing.</p>

<p>Dashboards with 47 metrics but zero insight into which ones actually matter. Roadmap tools that beautifully visualize features but can't explain why you're building them. Feedback databases with thousands of requests but no framework for deciding which problems are worth solving.</p>

<p>We built Jira to track work, not to understand it. We built analytics to measure behavior, not to explain it. We built workflow tools to coordinate people, not to amplify their judgment.</p>

<p>The entire category optimizes for visibility over understanding. Process over clarity. Coordination over alignment.</p>

<p>But tool limitations aren't the primary driver of PM dysfunction. The real waste comes from:</p>

<ul><li>Unclear company strategy forcing PMs to build alignment from scratch on every decision</li><li>Reactive leadership that constantly shifts priorities, invalidating previous work</li><li>Lack of company-wide prioritization creating conflicting demands across functions</li><li>Shifting goals that make yesterday's research obsolete</li></ul>

<p>Tools can't fix these problems. But they can reduce the coordination tax when organizational clarity exists.</p>

<h2 id="what-pms-actually-do-all-day">What PMs actually do all day</h2>

<p>A typical PM day:</p>

<ul><li>9:00am: Engineering asks "Should we use Redis or in-memory caching for this?" You have 10 minutes to answer before they make the choice themselves.</li><li>10:30am: Design presents three mockups. All look good. You need to articulate which one aligns with the product vision you haven't had time to write down.</li><li>2:00pm: A customer feature request comes in. It's technically feasible but you can't remember if it conflicts with the strategic direction from last quarter's offsite.</li><li>4:00pm: Your CEO asks why the team is building Feature X instead of Feature Y. You know there was a good reason but the decision context is buried in a Slack thread from six weeks ago.</li></ul>

<p>Every one of these moments requires instant access to judgment, strategy, and context. None of the tools in your stack help with this.</p>

<h2 id="the-expression-problem">The expression problem</h2>

<p>PMs spend half their time trying to express ideas that don't fit into existing tools. You can't put "this feature helps enterprise customers but might confuse prosumers" into a roadmap. You can't capture "we're prioritizing this because our biggest competitor just launched something similar" in a kanban board.</p>

<p>So PMs write docs. Lots of docs. Strategy docs, vision docs, decision docs, context docs. The docs pile up. Nobody reads them. The PM becomes the bottleneck because they're the only person who's read all the docs.</p>

<p>Docs themselves aren't the problem. They enable asynchronous alignment, capture long-term strategy, and create organizational memory. The problem: lack of structured, queryable metadata around those docs. You can't query a Google doc. You can't feed context documents to the AI tools your engineers are using to build features. The reasoning exists but remains inaccessible at decision time.</p>

<h2 id="the-alignment-gap">The alignment gap</h2>

<p>PMs are supposed to align everyone around what to build. But alignment requires shared understanding, and shared understanding requires shared context.</p>

<p>When engineering uses AI to implement features, that AI has zero context about:</p>

<ul><li>Why this feature matters to the business</li><li>What trade-offs are acceptable</li><li>How it fits into the product strategy</li><li>What customer problems it solves</li></ul>

<p>So you get technically perfect features that miss the mark. Beautiful implementations of the wrong solution. Fast execution in the wrong direction.</p>

<p>The tools we've built for PMs don't solve this. They make it worse by adding more process between the PM's judgment and the team's execution.</p>

<h2 id="what-better-looks-like">What better looks like</h2>

<p>Tools built for what PMs actually need would:</p>

<ul><li>Capture product judgment in a format that AI can consume</li><li>Make strategic context instantly accessible when decisions get made</li><li>Help PMs articulate ideas in ways that engineering, design, and business all understand</li><li>Show why an iceboxed feature might work now even though it didn't six months ago</li><li>Connect product decisions to company objectives without forcing everyone into a meeting</li></ul>

<p>Amplifying PM judgment so it can operate at the speed of AI-assisted development: that's the goal. Not replacing PM intuition with automation.</p>

<p>But this requires PMs to evolve new skills. If AI will consume PM judgment, PMs need to understand:</p>

<ul><li>How to structure reasoning so AI can interpret it accurately</li><li>What patterns of model behavior to expect and how to guide them</li><li>How agents fail and what guardrails prevent common failure modes</li><li>How to design prompts that surface the right context for each decision</li></ul>

<p>AI literacy becomes a core PM competency, not a nice-to-have.</p>

<h2 id="the-velocity-problem">The velocity problem</h2>

<p>As AI tools accelerate engineering, the gap widens. Engineers can implement certain features in hours. PMs still need days to build context, align stakeholders, and make decisions. The mismatch creates friction:</p>

<ul><li>Engineering waits for product direction</li><li>Or engineering moves forward without product input</li><li>Or the PM becomes a bottleneck and gets removed</li></ul>

<p>We've seen all three. None of them work.</p>

<p>But velocity alone creates new risks. Shipping without validation can:</p>

<ul><li>Erode user trust through misaligned features</li><li>Accelerate technical debt faster than teams can manage it</li><li>Create brand inconsistency across rapidly shipped experiences</li><li>Scale incorrect assumptions before anyone catches them</li></ul>

<p>PMs must actively manage these trade-offs, which is harder when execution outpaces strategic review.</p>

<p>The challenge also varies by company scale. Early-stage startups can compress decision cycles because fewer people need alignment. But mid-market and enterprise companies face unavoidable latency from:</p>

<ul><li>Compliance review cycles</li><li>Sales commitments already made to customers</li><li>Integration dependencies across multiple teams</li><li>Multi-team coordination requirements</li></ul>

<p>The argument for faster PM output applies most directly to small, agile teams. At scale, many sources of slowness are structural, not individual.</p>

<h2 id="the-future-of-pm">The Future of PM</h2>

<p>The product management org of five years from now won't look like the product management org of today.</p>

<p>Less time coordinating between teams through meetings. Less time writing specs that nobody reads. More time encoding judgment into systems that can guide AI-assisted development. More PMs who can make their product thinking accessible when engineers and AI systems need it.</p>

<p>But this doesn't mean eliminating the human work of PM:</p>

<ul><li>Executive alignment still requires trust built through direct engagement</li><li>Strategic vision still needs articulation that inspires teams</li><li>Cross-functional negotiation still depends on relationship and context</li><li>Long-term product direction still requires human judgment about market evolution</li></ul>

<p>The shift is toward augmenting these activities with better infrastructure for capturing and surfacing the reasoning behind them.</p>

<p>Product leaders of today have the opportunity to shape that evolution. The tools exist to build this future. The question is whether we'll build them for what PMs actually need, or keep optimizing for more metrics, more workflows, and more process.</p>]]></content:encoded>
    </item>
    <item>
      <title>The Hidden Cost of Context-less AI Development</title>
      <link>https://usebrief.com/blog/hidden-cost-of-context-less-ai-development/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/hidden-cost-of-context-less-ai-development/</guid>
      <pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate>
      <description>Why missing business context wastes time and ships elegant solutions to the wrong problems.</description>
      <content:encoded><![CDATA[<p>Your AI can refactor a thousand lines of code in seconds. It can implement complex algorithms, write comprehensive tests, and even debug issues across multiple files. But ask it whether the feature you're building actually matters to your customers, and you'll get silence.</p>

<p>This is the hidden cost of context-less AI development—and it's more expensive than you think.</p>

<h2 id="when-one-developer-becomes-ten">When One Developer Becomes Ten</h2>

<p>Sarah, a senior developer at a fintech startup, could keep everything straight. She knew that the payment retry logic wasn't just about resilience—it was specifically designed to handle the European banking holidays that kept tripping up their enterprise customers. She remembered that the seemingly over-engineered user permission system existed because their biggest client demanded granular audit trails for compliance reasons.</p>

<p>When Sarah worked alone with Claude or Cursor, her AI tools were extensions of her knowledge. She provided the context naturally: "Make sure this follows our compliance requirements for financial data retention" or "Remember, this needs to handle the edge case where European banks are closed."</p>

<p>But Sarah's startup grew. They hired five more developers. Then ten. Suddenly, the collective knowledge that once lived in one person's head was scattered across a dozen minds, with gaps appearing everywhere the knowledge didn't quite transfer.</p>

<h2 id="the-documentation-illusion">The Documentation Illusion</h2>

<p>"We have great documentation," Sarah's team lead assured her. And they did—sort of. They had README files, architectural decision records, and even a well-maintained wiki. The payment retry logic was documented. The permission system had detailed comments.</p>

<p>But what the documentation didn't capture was the why behind the what. It didn't explain that the payment retry logic came from three painful customer calls where transactions failed during Deutsche Bank's extended Christmas closure. It didn't mention that the permission system's complexity wasn't technical debt—it was the reason they landed their enterprise deal.</p>

<p>This is where the math gets brutal. According to a recent study by GitLab, developers spend 25% of their time searching for information and context. For a ten-person engineering team, that's 2.5 full-time equivalent positions just hunting for answers.</p>

<p>But here's the real kicker: when your AI development tools lack this business context, that percentage skyrockets. Your AI can generate code at superhuman speed, but if it doesn't know why that code needs to exist, you end up with elegant solutions to the wrong problems.</p>

<h2 id="the-vip-demo-problem">The VIP Demo Problem</h2>

<p>Last month, Sarah's team got an urgent request: "We need to demo the new analytics dashboard to our biggest potential customer in two weeks. Can you prioritize the mobile responsiveness?"</p>

<p>This wasn't in any markdown file. This wasn't captured in the codebase. This was pure business context—the kind of information that makes the difference between shipping something useful and shipping something that misses the mark entirely.</p>

<p>When Sarah's teammate Mike fired up Cursor to tackle the responsive design, his AI assistant had no idea that this wasn't just any mobile optimization. It didn't know that the potential customer's team primarily used tablets for field work, or that their current analytics solution failed completely on mobile, making this a key differentiator.</p>

<p>Mike's AI generated beautiful, standards-compliant responsive CSS. It passed all the tests. But it optimized for phones when it should have optimized for tablets. The demo went poorly.</p>

<h2 id="the-copy-paste-tax">The Copy-Paste Tax</h2>

<p>The obvious solution seems simple: just copy the relevant context into every AI session. Tell Claude about the European banking holidays. Explain the VIP demo requirements. Provide the business background.</p>

<p>But this creates what we call the "copy-paste tax"—the invisible overhead of context management that scales disastrously with team size.</p>

<p>Research from Stack Overflow's 2024 Developer Survey shows that developers using AI tools spend an average of 23 minutes per session providing context and clarifying requirements. For a team making 50 AI-assisted code changes per day (a conservative estimate for an AI-native team), that's over 19 hours of daily overhead just on context transfer.</p>

<p>That's more than two full-time positions doing nothing but feeding context to AI tools.</p>

<h2 id="when-business-context-disappears">When Business Context Disappears</h2>

<p>The problem compounds when you realize that business context has a half-life. The reasoning behind that payment retry logic becomes fuzzy after six months. The specific customer requirements that drove the permission system complexity get forgotten when that account manager leaves.</p>

<p>A study by Atlassian found that 90% of business context is lost within 12 months if it's not actively maintained in systems. Your AI tools are making decisions based on code that's optimized for constraints that no longer exist, or missing constraints that are now critical.</p>

<p>Take the team at a B2B SaaS company we worked with. They spent three weeks building an elegant API rate limiting system based on technical best practices. Beautiful code, comprehensive tests, perfect documentation. But they didn't know that their biggest customer had already negotiated custom rate limits in their contract six months ago. The new system broke the customer's integration, leading to a tense escalation call and emergency rollback.</p>

<p>Their AI assistant had generated flawless code. But it didn't know about the business agreement, so it optimized for the wrong constraints.</p>

<h2 id="the-multiplication-effect">The Multiplication Effect</h2>

<p>The hidden costs multiply as teams scale. It's not just the time spent providing context—it's the accumulated errors from missing context, the rework from building against outdated assumptions, and the opportunity cost of solving the wrong problems efficiently.</p>

<p>Consider the mathematics: if context-less development leads to just a 15% increase in rework (a conservative estimate based on our research), and your ten-person team ships 100 features per quarter, you're rebuilding 15 features every three months. At an average feature cost of two developer-weeks, that's 30 weeks of wasted development time per quarter.</p>

<p>That's the equivalent of having three developers who produce nothing but waste.</p>

<h2 id="beyond-technical-documentation">Beyond Technical Documentation</h2>

<p>The solution isn't more documentation—it's making business context as accessible to AI as technical context already is. Your AI tools can read your entire codebase, understand your database schema, and analyze your git history. But they can't access the customer calls that drove architectural decisions, the competitive pressures that shaped feature requirements, or the strategic pivots that invalidated old assumptions.</p>

<p>This is why teams using context-aware AI development report 40% fewer failed features and 60% faster time-to-product-market-fit. When your AI understands not just what the code does, but why it needs to exist, it makes fundamentally better decisions.</p>

<h2 id="the-context-infrastructure-imperative">The Context Infrastructure Imperative</h2>

<p>The companies winning with AI development aren't just using better models or more powerful tools. They're treating context as infrastructure—something that scales with their team and improves with time, rather than degrading.</p>

<p>They're building systems where business decisions, customer insights, and strategic constraints are as accessible to their AI tools as their database schemas and API documentation. They're creating memory that persists across team members, projects, and pivots.</p>

<p>Because here's the truth that every scaling startup learns: your AI doesn't know why you're building this. And if it doesn't know why, all that superhuman coding speed just means you'll build the wrong thing faster.</p>

<p>The question isn't whether you can afford to solve this problem. The question is whether you can afford not to.</p>

<p>Your development team's time is too valuable to waste on context archaeology. Your AI tools are too powerful to hamstring with missing business intelligence. The hidden cost of context-less development isn't just inefficiency—it's building a codebase that optimizes for constraints that don't exist while ignoring the ones that do.</p>]]></content:encoded>
    </item>
    <item>
      <title>Building AI that understands product impact, not just code quality</title>
      <link>https://usebrief.com/blog/building-ai-product-impact/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/building-ai-product-impact/</guid>
      <pubDate>Tue, 09 Sep 2025 00:00:00 GMT</pubDate>
      <description>How to pair AI code generation with business context so teams ship fast and stay aligned with product strategy.</description>
      <content:encoded><![CDATA[<p>If you've been using Cursor, Claude, or Copilot for development, you've probably experienced this: your AI can write beautiful, functional code in minutes. It understands patterns, follows best practices, and rarely introduces bugs. But ask it whether you should build that feature in the first place, and you get silence.</p>

<p>The problem isn't code quality anymore—it's product sense. Modern AI development tools have solved the "how" but completely missed the "why." This creates a dangerous feedback loop where teams ship faster than ever while simultaneously drifting further from their actual business objectives.</p>

<p>After building Brief, a context layer that helps AI understand business decisions, we've learned that the gap between "AI that codes" and "AI that builds products" isn't just about training better models. It's about fundamentally rethinking how we structure and deliver context to AI systems.</p>

<h2 id="the-context-problem-why-fast-code-good-product">The Context Problem: Why Fast Code ≠ Good Product</h2>

<p>Traditional AI coding assistants operate in a context vacuum. They see your current file, maybe your repository structure, and potentially some recent changes. But they don't see:</p>

<ul><li>Why this feature exists in the first place</li><li>What customer problem it's supposed to solve</li><li>How it fits into your broader product strategy</li><li>What constraints or decisions shaped its design</li><li>Whether building it now aligns with your goals</li></ul>

<p>This leads to what we call "agentic whiplash"—teams that can implement any feature in hours but constantly pivot because their AI lacks the product intelligence to guide those decisions.</p>

<p>The solution isn't better code generation. It's building AI systems that understand product impact alongside technical implementation.</p>

<h2 id="architecture-context-as-infrastructure">Architecture: Context as Infrastructure</h2>

<p>Building product-aware AI requires treating context as infrastructure, not an afterthought. Here's the architecture we developed for Brief:</p>

<pre role="region" aria-label="Code sample, text, 1 of 13" data-lang="text" tabindex="0"><code>┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   AI Tool       │    │   Context Layer  │    │   Business      │
│  (Cursor/Claude)│◄──►│     (Brief)      │◄──►│   Context       │
│                 │    │                  │    │   Store         │
└─────────────────┘    └──────────────────┘    └─────────────────┘
                              │
                              ▼
                       ┌──────────────────┐
                       │   Decision       │
                       │   Engine         │
                       └──────────────────┘</code></pre>

<h3>Component 1: Business Context Store</h3>

<p>The foundation is a structured repository of business context that goes beyond code:</p>

<pre role="region" aria-label="Code sample, typescript, 2 of 13" data-lang="typescript" tabindex="0"><code class="language-typescript">interface BusinessContext {
  decisions: Decision[];
  constraints: Constraint[];
  goals: Goal[];
  customerFeedback: Feedback[];
  technicalDebt: TechnicalDebt[];
}

interface Decision {
  id: string;
  category: 'tech' | 'product' | 'design' | 'process';
  decision: string;
  rationale: string;
  severity: 'info' | 'important' | 'blocking';
  timestamp: Date;
  tags: string[];
}</code></pre>

<p>We store decisions as first-class entities because they represent the "why" behind every line of code. When an AI understands that "we chose React over Vue because our team has React expertise" or "we're not adding new database tables until we resolve the performance issues," it makes fundamentally different recommendations.</p>

<h3>Component 2: Context Retrieval Engine</h3>

<p>Raw context isn't enough—you need intelligent retrieval that surfaces relevant context based on what the AI is working on:</p>

<pre role="region" aria-label="Code sample, typescript, 3 of 13" data-lang="typescript" tabindex="0"><code class="language-typescript">class ContextRetriever {
  async getRelevantContext(
    query: string,
    scope: 'file' | 'feature' | 'epic'
  ): Promise&lt;ContextResponse&gt; {
    // Semantic search using embeddings
    const semanticMatches = await this.vectorSearch(query);
    
    // Keyword matching for exact decision references
    const exactMatches = await this.keywordSearch(query);
    
    // Hierarchical context (feature → epic → roadmap)
    const hierarchicalContext = await this.getHierarchicalContext(scope);
    
    return this.rankAndFilter({
      semantic: semanticMatches,
      exact: exactMatches,
      hierarchical: hierarchicalContext
    });
  }

  private async vectorSearch(query: string): Promise&lt;ContextMatch[]&gt; {
    const embedding = await this.embeddings.create(query);
    
    const { data } = await this.supabase
      .from('context_embeddings')
      .select('*')
      .rpc('match_context', {
        query_embedding: embedding.data[0].embedding,
        match_threshold: SIMILARITY_THRESHOLD,
        match_count: MAX_RESULTS
      });
      
    return data;
  }
}</code></pre>

<p>The key insight: different types of queries need different retrieval strategies. A question about implementation details needs different context than a question about feature priority.</p>

<h3>Component 3: Decision Engine</h3>

<p>This is where product sense emerges. The decision engine evaluates AI suggestions against your business context:</p>

<pre role="region" aria-label="Code sample, typescript, 4 of 13" data-lang="typescript" tabindex="0"><code class="language-typescript">class ProductDecisionEngine {
  async evaluateProposal(
    proposal: CodeProposal,
    context: BusinessContext
  ): Promise&lt;DecisionResult&gt; {
    const conflicts = await this.checkConflicts(proposal, context);
    const alignment = await this.assessAlignment(proposal, context);
    const impact = await this.estimateImpact(proposal, context);
    
    return {
      recommendation: this.generateRecommendation(conflicts, alignment, impact),
      reasoning: this.explainReasoning(conflicts, alignment, impact),
      alternatives: await this.suggestAlternatives(proposal, context)
    };
  }

  private async checkConflicts(
    proposal: CodeProposal,
    context: BusinessContext
  ): Promise&lt;Conflict[]&gt; {
    const blockingDecisions = context.decisions.filter(d =&gt; 
      d.severity === 'blocking' &amp;&amp; 
      this.proposalConflicts(proposal, d)
    );
    
    return blockingDecisions.map(d =&gt; ({
      type: 'blocking_decision',
      decision: d,
      explanation: `This conflicts with decision ${d.id}: ${d.decision}`
    }));
  }
}</code></pre>

<h2 id="implementation-mcp-integration-pattern">Implementation: MCP Integration Pattern</h2>

<p>We built Brief as an MCP (Model Context Protocol) server that integrates with existing AI tools. This pattern lets you add product intelligence to any AI system without rebuilding everything:</p>

<pre role="region" aria-label="Code sample, typescript, 5 of 13" data-lang="typescript" tabindex="0"><code class="language-typescript">// MCP Server Implementation
export class BriefMCPServer extends MCPServer {
  async handleToolCall(name: string, args: any): Promise&lt;any&gt; {
    switch (name) {
      case 'brief_get_context':
        return this.getRelevantContext(args.query, args.scope);
      
      case 'brief_check_decision':
        return this.checkAgainstDecisions(args.proposal);
      
      case 'brief_record_decision':
        return this.recordNewDecision(args.decision);
      
      default:
        throw new Error(`Unknown tool: ${name}`);
    }
  }
  
  private async getRelevantContext(
    query: string, 
    scope: string
  ): Promise&lt;ContextResponse&gt; {
    const retriever = new ContextRetriever(this.database);
    const context = await retriever.getRelevantContext(query, scope);
    
    return {
      decisions: context.decisions,
      constraints: context.constraints,
      recommendations: await this.generateRecommendations(context)
    };
  }
}</code></pre>

<p>The MCP pattern is powerful because it creates a standard interface between AI tools and business context. Any tool that supports MCP can instantly access your product intelligence.</p>

<h2 id="data-layer-making-context-queryable">Data Layer: Making Context Queryable</h2>

<p>The technical challenge isn't just storing context—it's making it efficiently queryable by AI systems. We use a hybrid approach with PostgreSQL and vector embeddings:</p>

<pre role="region" aria-label="Code sample, sql, 6 of 13" data-lang="sql" tabindex="0"><code class="language-sql">-- Core decision storage
CREATE TABLE decisions (
  id UUID PRIMARY KEY,
  category decision_category,
  decision TEXT NOT NULL,
  rationale TEXT NOT NULL,
  severity severity_level,
  created_at TIMESTAMP DEFAULT NOW(),
  tags TEXT[]
);

-- Vector embeddings for semantic search
CREATE TABLE decision_embeddings (
  decision_id UUID REFERENCES decisions(id),
  embedding VECTOR(1536),
  content TEXT
);

-- Semantic search function
CREATE OR REPLACE FUNCTION match_decisions(
  query_embedding VECTOR(1536),
  match_threshold FLOAT,
  match_count INT
)
RETURNS TABLE (
  decision_id UUID,
  decision TEXT,
  similarity FLOAT
)
LANGUAGE plpgsql
AS $$
BEGIN
  RETURN QUERY
  SELECT 
    de.decision_id,
    d.decision,
    (1 - (de.embedding &lt;=&gt; query_embedding)) AS similarity
  FROM decision_embeddings de
  JOIN decisions d ON de.decision_id = d.id
  WHERE (1 - (de.embedding &lt;=&gt; query_embedding)) &gt; match_threshold
  ORDER BY similarity DESC
  LIMIT match_count;
END;
$$;</code></pre>

<h2 id="context-integration-patterns">Context Integration Patterns</h2>

<h3>Pattern 1: Just-in-Time Context</h3>

<p>Load context when the AI is about to make a decision:</p>

<pre role="region" aria-label="Code sample, typescript, 7 of 13" data-lang="typescript" tabindex="0"><code class="language-typescript">async function enhanceAIPrompt(
  originalPrompt: string,
  codeContext: string
): Promise&lt;string&gt; {
  const relevantContext = await brief.getContext({
    query: originalPrompt,
    codeContext,
    scope: 'feature'
  });
  
  return `
${originalPrompt}

BUSINESS CONTEXT:
${relevantContext.decisions.map(d =&gt; `- ${d.decision}: ${d.rationale}`).join('\n')}

CURRENT CONSTRAINTS:
${relevantContext.constraints.map(c =&gt; `- ${c.description}`).join('\n')}

Consider this context when providing your response.
  `;
}</code></pre>

<h3>Pattern 2: Proactive Conflict Detection</h3>

<p>Check proposals against your decision history before implementation:</p>

<pre role="region" aria-label="Code sample, typescript, 8 of 13" data-lang="typescript" tabindex="0"><code class="language-typescript">async function validateProposal(proposal: string): Promise&lt;ValidationResult&gt; {
  const conflicts = await brief.checkConflicts(proposal);
  
  if (conflicts.length &gt; 0) {
    return {
      approved: false,
      conflicts,
      suggestions: await brief.getAlternatives(proposal)
    };
  }
  
  return { approved: true };
}</code></pre>

<h3>Pattern 3: Learning from Outcomes</h3>

<p>Update your context based on how decisions play out:</p>

<pre role="region" aria-label="Code sample, typescript, 9 of 13" data-lang="typescript" tabindex="0"><code class="language-typescript">async function recordOutcome(
  decisionId: string,
  outcome: 'successful' | 'failed' | 'neutral',
  learnings: string[]
): Promise&lt;void&gt; {
  await brief.recordDecision({
    decision: `Outcome of ${decisionId}: ${outcome}`,
    rationale: learnings.join('. '),
    category: 'process',
    severity: 'info'
  });
}</code></pre>

<h2 id="measuring-impact-metrics-that-matter">Measuring Impact: Metrics That Matter</h2>

<p>Traditional metrics (code quality, velocity) don't capture product alignment. We focus on measuring business context utilization:</p>

<pre role="region" aria-label="Code sample, typescript, 10 of 13" data-lang="typescript" tabindex="0"><code class="language-typescript">interface ProductAlignmentMetrics {
  contextUtilization: number; // How often AI queries context
  decisionConflicts: number;  // Conflicts caught before implementation
  pivotReduction: number;     // Reduction in feature pivots
  goalAlignment: number;      // Features that map to stated goals
}

class MetricsCollector {
  async trackContextQuery(query: string, results: ContextResponse) {
    await this.analytics.track('context_query', {
      query_type: this.classifyQuery(query),
      results_count: results.decisions.length,
      utilization_pattern: this.analyzeUtilization(results)
    });
  }
  
  async trackDecisionConflict(proposal: string, conflicts: Conflict[]) {
    await this.analytics.track('conflict_detected', {
      conflict_severity: this.assessSeverity(conflicts),
      resolution_path: 'prevented'
    });
  }
}</code></pre>

<h2 id="implementation-challenges-and-solutions">Implementation Challenges and Solutions</h2>

<h3>Challenge 1: Context Staleness</h3>

<p>Business context changes faster than code. Stale decisions can mislead AI systems.</p>

<p><strong>Solution</strong>: Implement context freshness scoring and automatic expiration:</p>

<pre role="region" aria-label="Code sample, typescript, 11 of 13" data-lang="typescript" tabindex="0"><code class="language-typescript">interface ContextFreshness {
  lastUpdated: Date;
  relevanceScore: number;
  expirationDate?: Date;
}

function calculateFreshness(decision: Decision): number {
  const age = Date.now() - decision.timestamp.getTime();
  const daysSinceCreation = age / (1000 * 60 * 60 * 24);
  
  // Exponential decay based on decision category
  const decayRate = DECAY_RATES[decision.category];
  
  return Math.exp(-decayRate * daysSinceCreation);
}</code></pre>

<h3>Challenge 2: Context Overload</h3>

<p>Too much context can confuse AI systems as much as too little.</p>

<p><strong>Solution</strong>: Implement smart context ranking and filtering:</p>

<pre role="region" aria-label="Code sample, typescript, 12 of 13" data-lang="typescript" tabindex="0"><code class="language-typescript">function rankContext(
  contexts: ContextMatch[],
  query: string
): ContextMatch[] {
  return contexts
    .map(c =&gt; ({
      ...c,
      // Combine multiple scoring dimensions
      compositeScore: this.calculateCompositeScore(c, query)
    }))
    .sort((a, b) =&gt; b.compositeScore - a.compositeScore)
    .slice(0, MAX_CONTEXT_ITEMS);
}

private calculateCompositeScore(context: ContextMatch, query: string): number {
  // Weighted combination of relevance, freshness, and importance
  // Implementation varies based on context type and query characteristics
  return this.weightedScore([
    this.calculateRelevance(context, query),
    this.calculateFreshness(context.decision),
    this.getImportanceScore(context.decision.severity)
  ]);
}</code></pre>

<h3>Challenge 3: Cross-Team Context</h3>

<p>Different teams have different contexts that need to be reconciled.</p>

<p><strong>Solution</strong>: Implement hierarchical context inheritance:</p>

<pre role="region" aria-label="Code sample, typescript, 13 of 13" data-lang="typescript" tabindex="0"><code class="language-typescript">interface ContextHierarchy {
  global: BusinessContext;    // Company-wide decisions
  team: BusinessContext;      // Team-specific decisions  
  project: BusinessContext;   // Project-specific decisions
}

async function getEffectiveContext(
  scope: 'global' | 'team' | 'project',
  teamId: string,
  projectId: string
): Promise&lt;BusinessContext&gt; {
  const contexts = await Promise.all([
    this.getGlobalContext(),
    this.getTeamContext(teamId),
    this.getProjectContext(projectId)
  ]);
  
  // Merge contexts with project overriding team overriding global
  return this.mergeContexts(contexts, ['global', 'team', 'project']);
}</code></pre>

<h2 id="the-future-context-native-development">The Future: Context-Native Development</h2>

<p>What we're building toward isn't just smarter AI tools—it's a fundamentally different development paradigm where context and code evolve together.</p>

<p>In context-native development:</p>

<ul><li>Every line of code carries business rationale</li><li>AI systems understand not just what to build, but why</li><li>Technical decisions automatically align with product strategy</li><li>Teams ship fast <em>and</em> ship right</li></ul>

<p>The technical patterns we've shared are just the beginning. As AI tools become more sophisticated, the teams that win will be those that solve the context problem first.</p>

<p>Your AI doesn't know why you're building this. But it could.</p>

<hr>

<p><em>Want to see these patterns in action? Brief provides production-ready context infrastructure for AI development teams. Learn more at <a href="https://usebrief.com/">briefhq.ai</a> or reach out at <a href="mailto:hello@briefhq.ai">hello@briefhq.ai</a>.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>That code you rejected 3 times? Your AI just suggested it again.</title>
      <link>https://usebrief.com/blog/ai-context-memory-problem/</link>
      <guid isPermaLink="false">https://briefhq.ai/blog/ai-context-memory-problem/</guid>
      <pubDate>Wed, 27 Aug 2025 00:00:00 GMT</pubDate>
      <description>Why AI coding assistants keep suggesting the same wrong solutions, and how context memory solves the endless repeat cycle.</description>
      <content:encoded><![CDATA[<p>I'm staring at Cursor suggesting <code>neutral-100</code> for a background color. Again.</p>

<p>Our design system uses <code>neutral-010</code>, <code>neutral-020</code>, <code>neutral-030</code>… up to <code>neutral-090</code>. The gaps are intentional—room to grow up or down when we need more shades. But AI assumes every design system follows the standard 100, 200, 300 pattern.</p>

<pre role="region" aria-label="Code sample, css, 1 of 4" data-lang="css" tabindex="0"><code class="language-css">/* What Cursor suggests every damn time */
.card-background {
  background-color: var(--neutral-100);
  border: 1px solid var(--neutral-200);
}

/* What actually exists in our system */
.card-background {
  background-color: var(--neutral-010);
  border: 1px solid var(--neutral-020);
}</code></pre>

<p>The <code>--neutral-100</code> variable doesn't exist. The component breaks. I fix it, explain why, and move on. Three hours later, new chat session, same suggestion.</p>

<p>Yesterday it happened with testing frameworks. Our entire codebase uses Vitest for visual tests. Every single test file. But Cursor keeps generating Jest syntax:</p>

<pre role="region" aria-label="Code sample, javascript, 2 of 4" data-lang="javascript" tabindex="0"><code class="language-javascript">// Cursor's favorite suggestion
import { describe, it, expect } from '@jest/globals';
describe('Button component', () =&gt; {
  it('should render correctly', () =&gt; {
    expect(component).toMatchSnapshot();
  });
});

// What we actually use everywhere
import { describe, it, expect } from 'vitest';
describe('Button component', () =&gt; {
  it('should render correctly', () =&gt; {
    expect(component).toMatchInlineSnapshot();
  });
});</code></pre>

<p>The syntax is close enough that you don't catch it immediately. The test runs, fails, and you spend 10 minutes figuring out why your snapshot assertions are broken.</p>

<h2 id="the-context-window-death-spiral">The Context Window Death Spiral</h2>

<p>AI context windows burn through tokens fast. Start a new session, lose all your previous explanations. You're back to square one, re-explaining the same architectural decisions you've made dozens of times. This is the <a href="https://usebrief.com/ai-context-loss/">AI context loss problem</a> that plagues every team using AI coding tools.</p>

<p>I tried solving this with <a href="https://usebrief.com/agent-setup/">Cursor Rules</a>. Added our design system specs, testing preferences, component patterns—everything I was tired of repeating. The markdown file hit 800 lines.</p>

<p>Cursor started skimming. It would read the first 200 lines, maybe grab something from the middle, then ignore the rest. Suggestions got worse, not better. The AI was confident about rules it never actually read.</p>

<pre role="region" aria-label="Code sample, markdown, 3 of 4" data-lang="markdown" tabindex="0"><code class="language-markdown">&lt;!-- Line 1-50: Color system --&gt;
neutral-010: #fafafa
neutral-020: #f5f5f5
neutral-030: #ededed
...

&lt;!-- Line 300-400: Testing preferences --&gt;
- Use Vitest, not Jest
- Visual regression tests with toMatchInlineSnapshot
- Component tests should cover accessibility
...

&lt;!-- Line 600+: Architecture decisions --&gt;
- No CSS-in-JS solutions
- Tailwind utilities only, no custom classes
- TypeScript strict mode required
...</code></pre>

<p>Past 500 lines, the system breaks down. Sometimes it reads the color rules but ignores testing. Sometimes it catches the TypeScript requirements but suggests CSS-in-JS anyway. Never all of it together.</p>

<p>I split the rules into multiple files. <code>.cursorrules</code>, <code>design-system.md</code>, <code>testing-guide.md</code>, <code>architecture.md</code>. Now I'm managing four different documentation files, trying to keep them in sync as our system evolves. Half the time I forget to update one of them.</p>

<h2 id="the-startup-problem">The Startup Problem</h2>

<p>Components work fine with AI. Button, Card, Input—single items with clear interfaces. The AI can understand "use the Button component" and mostly gets it right.</p>

<p>But at a startup, you're constantly building things that aren't components yet. New pages, complex interactions, experimental features. The AI needs to understand your typography scale, spacing system, color palette, elevation levels, animation preferences, and accessibility requirements simultaneously.</p>

<pre role="region" aria-label="Code sample, javascript, 4 of 4" data-lang="javascript" tabindex="0"><code class="language-javascript">// AI needs context for ALL of this
function FeatureCard({ title, description, priority }) {
  return (
    &lt;div className={`
      // Typography: what scale? what weights exist?
      // Spacing: internal padding, margin rules
      // Colors: background, text, borders
      // Elevation: shadow levels, hover states
      // Animation: transition timing, easing
    `}&gt;
      {/* Complex layout that requires understanding 
          all our design decisions at once */}
    &lt;/div&gt;
  );
}</code></pre>

<p>Every new feature becomes a context explosion. The AI pulls from its training data instead of your actual system. You end up with designs that look reasonable but break your carefully crafted consistency.</p>

<h2 id="why-everyone-hits-this-wall">Why Everyone Hits This Wall</h2>

<p>Engineering deals with the same problem for code architecture. Product managers for business logic. Designers for interaction patterns. Everyone spends their day re-explaining decisions to AI that should already understand the context.</p>

<p>The context window limitation isn't just technical—it's organizational. Your company's knowledge is scattered across decision docs, style guides, architectural decision records, meeting notes, and tribal knowledge. AI gets fragments, never the full picture. This is why <a href="https://usebrief.com/product-context/">product context</a> matters so much—it's the business knowledge AI needs to build the right thing.</p>

<h2 id="building-brief-to-fix-this">Building Brief to Fix This</h2>

<p>We built <a href="https://usebrief.com/">briefhq.ai</a> specifically for this problem. Instead of cramming everything into context windows or managing massive rules files, Brief uses MCP (Model Context Protocol) with RAG to surface exactly the relevant context for each request.</p>

<p>When you ask for a component, Brief knows your design system, your testing setup, your architectural constraints, and your business requirements. Not because it read a 1000-line markdown file, but because it can intelligently pull the right context without overwhelming the AI.</p>

<p>The AI gets the context it needs. You stop repeating yourself. Your team stops fighting the same battles every single session.</p>

<hr>

<p><em>Join the waitlist at <a href="https://usebrief.com/">briefhq.ai</a>.</em></p>]]></content:encoded>
    </item>
  </channel>
</rss>
