Intent · 2026-08-18 · ratified — rulings folded same day

The Judge-First Email Mirror

Code gathers facts and holds the privacy floor; a mind decides what a conversation is and who it’s with. Capture-first: a judged sales lead goes into Salesforce — the worst case does not run this system.

Ratified · Robert’s five rulings folded 2026-08-18 · build proceeds under the adversary charter; courts + corpus gate the ship

Jump by type: the facts code gathers · the one question the judge answers · the write-time floor · what dies / what survives · the proof gates · your rulings

01

Decisions already made

You ratified the direction in-session today (“Yep, I agree”). These three are locked; everything below is built to them.

Who decides
A mind decides meaning — never a counting rule
Your standing law, applied: code holds facts and creates legibility; intelligence decides what a conversation is and who it’s with. The gate ladder that refused today’s introduction was code doing an LLM’s job.
Privacy
The courted floor survives, whole
Every message still earns its own verdict before its body is written; addresses stay minimized; anything uncertain stays private. The floor moves to the write, where hard rules belong — it stops blinding the judge upstream.
Trust path
Shadow until the corpus is read
The lane keeps writing nothing until its judgment is scored against real mail you or Alie have labeled. It has written zero rows to date, so the shadow is already on and free.
02

The journey — one real thread, through the old system and the new

Follow this morning’s introduction — Dr. Zach Carroll, Delta Veterinary — the thread you replied to and the system passed over.

The law this page applies: code gathers facts · intelligence decides meaning · the invariants live at the write. Nothing below is allowed to violate it.
  1. The scene. A consultant you work with introduces you to a vet who needs a new website. You reply the same morning. A meeting lands on your calendar for tomorrow at ten. This is the most sales-shaped thing that happened in your mailbox in two days — a warm intro with a booked meeting.
  2. What today’s system did: refused it on a counting rule. Neither person is in your Contacts, so both counted as strangers — and the rule says a stranger thread with more than one stranger is untouchable. Your reply passed its check; the count failed. No model ever read a word. The morning summary would have told Alie “nothing sales-shaped happened” — a false green.
    ↘ go deeper — the verbatim gate walk, and why the gate existed
    The probe’s walk of the thread, gate by gate: external counterparties → kcrumleydvm@bhcteam.com, zcarrollvet@gmail.com (2 strangers) · evidence leg (findContactsByEmails, Contacts only) → no match → unknown lane · owner participation (Gmail SENT label) → pass, you replied · arity check counterparties.length !== 1refused: unknown-multiple-counterparties. The privacy court built the arity gate to prevent minting the wrong person on a multi-stranger thread. The mistake was letting that worst case run the system: the remedy for a possibly-wrong judgment is measured judgment quality plus reversible, provenance-marked records — not a gate that blinds intelligence (Robert’s capture-first ruling, same day). A warm intro by its nature has two strangers: the introducer and the introduced. The most valuable class of new-business email is structurally invisible to an arity check.
  3. What Salesforce knew the whole time, unasked. Zach is already a Lead in your CRM — with twelve activities on him. The introducer works at Blue Heron Consulting, an Account you have with eight Contacts on that domain. Two independent ways to know this thread mattered; the system reads only the Contact table, so it saw two nobodies. Meanwhile the old indiscriminate sync filed all three intro emails under Blue Heron the same day — the dumb pipe saw what the judged pipe refused.
    ↘ go deeper — the receipts
    Verified live 2026-08-18 via the sf CLI: Lead zcarrollvet@gmail.com (“Zach”, status New) with 12 activities · Account “Blue Heron Consulting (bhcteam.com)” with 8+ Contacts on @bhcteam.com · 3 EmailMessage rows dated today, subject “Re: Introductions: Dr. Zach Carroll meet Robert Sanchez…”, RelatedToId = the Blue Heron Account (the native/EAC path). Also found while looking: robert@digitalempathyvet.com appears in threads as an external stranger — the internal-domains config lists only digitalempathyinc.com; if the -vet domain is yours, it belongs in that list (folded into question 4).
  4. The new shape, part one — code gathers the fact sheet. For every thread in the window, code assembles what is checkably true, and decides nothing: who’s on the thread · whether you replied (from Gmail’s own sent record, which can’t be forged) · what the CRM knows about each person — Contact, Lead, or employee of a known firm · what Salesforce has already filed from this thread · which addresses are your own team. Facts. No gates.
    ↘ go deeper — the fact sheet, as the builder sees it
    Per thread: {subject, participants[], ownerParticipated (in:sent derivation, unchanged), crm: [{address, kind: contact|lead|known-account-domain, recordRef}], alreadyFiled: [messageIds Salesforce holds], internal: [addresses]}. The CRM read widens from findContactsByEmails to Contacts + Leads + Account-domain matches — each labeled with what it is, because “is a Lead” and “works at a known firm” are different facts, and the judge should see which one it has. Unfinished machine-minted stubs stay excluded from “known” exactly as the privacy court ruled (F3). The internal-domains list comes from the worker’s own config — the parity scar from this morning is why that sentence is in this spec.
  5. Part two — a mind reads the sheet and answers one question, three parts. Is this a sales conversation of ours — selling, serving a customer or prospect, or a referral toward one — with who-is-selling-to-whom built into the question, so a vendor billing us is a no? Who is the conversation with — a name, not a count: “it’s with Zach; Crumley is the introducer” is a sentence a model produces trivially and a counting rule never can. And on what basis — which facts carried it. Uncertain still means no: refusal stays the default.
    ↘ go deeper — the verdict contract, the prompt collapse, the cost
    One schema-forced call per thread: {isSales: bool, counterparty: address|null, role: customer|prospect|referrer|null, basis: string} — malformed or absent answer = refusal (fail-closed, unchanged). The two existing prompts (known-contact and stranger) collapse into this single question: today a thread’s privacy rule depends on a table lookup choosing which prompt it gets; after this, one thread, one question, and the CRM facts arrive as context, not as a fork. Direction-of-sale is IN the question — which resolves the open known-prompt ruling as part of the rebuild (your wording ships, not mine; question 3). The per-message layer is untouched: the thread verdict only opens the door; every message still gets its own verdict on its own content before its body is written — written === judged stays an identity. Cost: ~50 subject-and-roster sheets per window on the cheap tier, roughly 1.5k tokens each — single-digit cents a day. Bodies are still only read for threads judged sales.
  6. Part three — code enforces the floor, at the write. Capture-first (your ruling, struck the drafted “anchor” requirement): when the judge says sales lead, the person and the judged messages go in — immediately, no extra proof, no waiting for your reply. The worst case does not run this system: a wrongly-filed person is a legibly-marked row Alie deletes in ten seconds; a missed lead is a lost deal. Code’s hard rules are the reversible-making ones: every machine-created record carries its origin and the judge’s stated reason, machine writes never overwrite what a human typed, addresses stay minimized, and nothing Salesforce already holds is filed twice.
    ↘ go deeper — the invariants, as assertions
    CAPTURE-FIRST: judge.isSales ∧ judge.counterparty ⇒ write — no precondition beyond the verdict itself; Robert’s in-chat ruling 2026-08-18 struck the drafted mint-anchor (“don’t let the worst case dictate the system actually working”). PROVENANCE: every machine row stamped {machineOrigin, judgeBasis} — the working undo; machine writes never overwrite human-entered fields. MINIMIZE: relation writes only for participants of the specific message (unchanged). IDEMPOTENT: skip any RFC Message-ID Salesforce holds (proven live; the mirror narrows to the gap the native sync leaves). NO-SILENT-DROP: isSales ∧ !counterparty ⇒ slackLine to Robert — only when the judge cannot NAME the prospect, or Salesforce refuses the write. Fail-closed body reads, span identity, the tick budget, the write rail and substantiator: all byte-untouched.
  7. The same thread, rerun under the new shape. The fact sheet shows: you replied; Zach is a Lead; the introducer’s firm is a known Account. The judge reads it and says what any assistant would: this is a referral toward a prospect, the conversation is with Zach, basis stated. The messages each earn their verdicts; the thread lands in Salesforce attached to the right people; Alie sees it without asking. And the morning line tells the truth. That is the promise you made her, kept by the judged lane instead of despite it.
03

What dies · what survives

DIESThe counting rules
“More than one stranger” and “no reply from you” stop being refusals; they become facts on the judge’s sheet. The Contact-only definition of “known” dies with them.
DIESThe two-prompt fork
Which privacy question a thread got used to depend on a table lookup. One thread, one question, facts as context.
LIVESPer-message judgment
Every message still earns its own verdict before its body is written. What was judged is what is written — identical, by construction.
LIVESFail-closed everything
Uncertain judge, unreadable body, unverifiable person — each stays private. Refusal remains the default posture.
LIVESThe one code skip
A thread with no outside person at all (pure team mail) never reaches the judge — “no counterparty exists” is a fact, not a judgment.
LIVESIdempotence vs the native sync
Never double-file what Salesforce already holds — proven on live data today; the mirror narrows to the gap the native pipe leaves.
04

How this gets proven — the validation debt comes due here

Both legs this time, in order: courts prove the mechanism, labeled real mail proves the judgment. Neither alone.

The adversary charter for this arc (your ruling, 2026-08-18): the adversaries’ job is not to find ways code can make misjudgment impossible. Code’s job is legibility; judgment and meaning are the job of intelligence. When a court finds “the judge could be wrong here,” the remedy is one of three things: better facts on the sheet (legibility — including labeling untrusted content as untrusted), a measured case in the corpus (judgment-quality, counted), or an invariant at the write (facts). Never a new pre-judge code gate. A fix that pre-empts the judge with structure is itself a court failure — the arity gate was exactly such a fix, produced by exactly such a court, and it ate the realest sales thread of the day.
P1
The rehearsal is the gate
The new lane does not ship without a decision-diff against the old lane on the same live window, read by a human. The rehearsal runs the worker’s own config now — this morning’s false alarm is why that sentence exists.
P2
The corpus before trust
~100 real threads labeled by you or Alie: should this be in Salesforce, yes or no. The judge scored on precision, recall, and run-to-run consistency — it already flipped one marginal verdict between two runs an hour apart. Every disagreement listed; the list is the product.
P3
Courts on the new seam
The privacy court re-runs against the single question and the write floor. A falsification leg attacks the judge: forged headers, strangers who write their own credentials into a subject line, injection in mail bodies. The wiring court proves reachability. All under the adversary charter above.
P4
Shadow stays on
Writes stay off until the corpus scores are read. Zero rows written to date — the shadow period is already running and costs nothing.
05

Resolved — your rulings, 2026-08-18

All five questions closed in chat the same afternoon. Recorded here so the page and the build carry them.

1
Minting anchor — STRUCK. Capture-first.
A judged sales lead goes into Salesforce immediately — no extra proof, no waiting for your reply. Your words: “don’t let the worst case dictate the system actually working.” Protection = measured judgment quality + reversible, provenance-marked records.
2
The Slack ping — narrowed by ruling 1.
Only fires when the judge cannot name who the prospect is, or Salesforce refuses the write. Goes to you only.
3
Direction-of-sale — RATIFIED as drafted.
“Is Digital Empathy the provider in this conversation — selling to, serving, or being asked to serve a customer or prospect? A conversation where someone is selling to or billing Digital Empathy is not ours.” The corpus still counts both failure modes.
4
Internal domains — CONFIRMED.
digitalempathyinc.com only — exactly what production already carries. No change.
5
The 330k backlog — forward-only.
No historical review. The system worries about conversations from here on.