mandaire.com For your life .app For your product .dev Architecture & trust .org

The conventional AI builder demo shows you a task completed. You prompt, code appears, it runs. That part works. The hard part is not the first working version. The hard part is the judgment call that the first version was wrong, the refusal to ship it, and the brief that gets the next version right.

Mandaire built mandaire.app. Not the static marketing pages: the actual product, across months of cycles, with a real user (us). Everything on mandaire.dev/proof comes from that build. This is the story of three decisions that turned out to matter.

What the system does before any code exists

Every build cycle starts with an intent brief. Not a spec the developer writes. An intent brief Mandaire writes back, before any code exists, stating what it thinks you want, what it is deliberately not touching, and the assumptions it is making that you should correct.

Here is one, from a recent rewrite of the mandaire.dev page:

Intent brief excerpt

Here is what I think you want: A page rewrite that addresses two convergent critiques from v7 adversarial evaluation (Claude.ai + ChatGPT): (1) the "optimizes for growth" lead is borrowed authority the page does not earn, and (2) the page lacks a concrete buyer engagement shape. Here is what I am deliberately NOT rewriting: - The proof-section bounds (four named bounds are correct and disciplined; they stay) - Bet 1, Bet 3, Bet 4 (only Bet 2 needed the operational fix) Assumptions I am making (please correct): - You accept that "optimizes for growth" overclaims what the page demonstrates; the honest claim is wrong-build refusal. - You want the beta contract section between "Who it is for" and "What Mandaire produces." One product call I need from you before deploy: Should the page name the first-beta founder publicly with consent, or hold him as "the first founder we know fits it cleanly"? Defaulting to the latter unless you say otherwise.

The reason the brief writes back the assumptions is that the assumptions are where the product decisions live. A fast builder executes the literal brief. The intent brief makes the gap between "what you said" and "what you meant" visible before any code is written.

Three calls that bent the architecture

Day 1, the first user thought they were building a personal assistant with a clean chat interface. By Day 90, they were building something structurally different. Three intent briefs caused three course corrections. None of them were caught in code review because the code worked either way.

Day 14: MCP over a custom chat UI. The first working demo was a custom chat interface with full access to the context store. It worked. It felt like the right thing to ship. The intent brief raised: "You are paying for Claude Max. This adds a fifth window. Every session starts with a context-switch cost. The brief assumes the user lives here. They won't." The custom chat interface was dropped. Mandaire connects to the AI surfaces the user already uses, via MCP, rather than competing with them.

Day 31: per-tuple disclosure over per-person privacy settings. The naive model gave each person in the network a privacy level: high, medium, low. Fast to build. Easy to explain. The brief raised: "Two colleagues, same privacy level. Topic A is a shared project. Topic B is compensation. The per-person model leaks Topic B when they ask about Topic A." The naïve model would have shipped. The brief refused it. The correct model is per-(person, topic, context, surface): slower to build, harder to explain, structurally correct.

Day 47: disclosure logic must live upstream of the user's renderer. The single-LLM architecture had the user-facing renderer also reasoning over raw context. Simpler. The brief raised: "The user can bring their own renderer: ChatGPT, Gemini, a local model. If disclosure runs in a model the user can swap, it runs in a model the user can prompt-inject. That is not disclosure logic. It is a request." The architecture split. The reasoner and renderer are now separate. Disclosure lives in Python upstream of any LLM the user controls. This is now in the decision ledger, applied to every build that follows.

Fast-builder tools execute the initial brief. The judgment is in the refusal that precedes the build.

What gets encoded

Every meaningful decision goes into an auditable ledger. You can read it, search it, correct it. Future cycles use it as baseline. It is not a changelog of what shipped. It is a record of why, written at the time the decision was made, with the risk level and the rule it encodes.

The three calls above are in that ledger. The output_filter false-positive cascade is in that ledger. Every time a decision recurs, the context is already there.

When it gets things wrong

Earlier in the build, the output filter held two legitimate agent responses on the same regex pattern. A technical response about security methodology and a reply that quoted the trigger word were both held as "credential exfiltration attempts" when they were neither credentials nor exfiltration attempts.

Failure admission excerpt

Root cause: a bare substring match on a word that legitimately appears in security and architecture discussions. What I shipped to prevent the same class of error: - Tightened "exfiltrat\w*" to require an object word (data/credentials/keys/secrets/etc) within three words. - Added value-based credential detection that matches actual secret formats (sk-ant-..., ghp_..., AKIA..., PEM keys, JWT) rather than verbs about credentials. - Encoded a new rule: when a fix ships to a runtime module, restart EVERY process running the pre-patch module, not just the ones already showing the symptom. This is now in the decision ledger. The specific failure mode is closed; I will likely make a different one, and when I do, you will see the same kind of writeup.

That writeup style is the standard. When something breaks, the admission names the root cause, what shipped to address it, and the rule that prevents the same class of error. There is no softening. You can read this and know the state of the system's judgment at the time.

What actually compounds

After months of working with the first user, Mandaire has a structured model of how they think about product: what they cut, what they sharpen, how they frame a decision. That model is explicit, editable, and portable. The user can read it. They can correct it. They can take it with them.

This is the compounding that matters. Not faster code generation. Not better autocomplete. A system that gets harder to replace the longer you use it because it has been paying attention and writing down what it learned.

The Day 90 intent brief is not the same document as the Day 1 intent brief. The three calls above are the reason.

The proof artifacts from this build are on mandaire.dev. The intent brief, the decision ledger, the Day 1 vs Day 90 delta, the failure admission: all of it is from the real build, not illustrations.

See the proof →