CustomerLedger

One customer record across every business you run.

Every call, text, note and permission becomes one timestamped record with the evidence attached. Your AI agents read from it, so each business remembers its own customers warmly, and no business ever repeats what a customer told a different one.

1
Record per human
0
Cross tenant code paths
22
Binary release gates
4
Append only tables
The problem

The same human shows up in all of your businesses.

They call the directory on Monday, the voice agent on Thursday, and the shop on Saturday. Three systems, three half records, and three different answers to the only question that matters before you dial: who is this, and what are we allowed to do with them.

01

Split memory

Identity lives in two places, so resolve and file disagree about who a number belongs to. The record you read is not the record you wrote.

02

Unprovable consent

You can see that a customer said yes. You cannot prove the row was not written afterwards, which is the only part a regulator cares about.

03

Leaky agents

An agent that knows everything will eventually say everything. Prompt wording is a request, not a boundary, and it fails silently.

The primitive

A stamped ledger, and views onto it.

There is one store per tenant and one kind of row. Every fact is stamped at the moment it is written with the brand that captured it and the audience allowed to see it. An unstampable write is a rejected write, so the boundary is a property of the data rather than a habit of the code that reads it.

Fact class Agent, own brand Agent, sibling brand Any other tenant Operator
Business identityWith own historyAbsentNo code pathFull
Consent evidenceDecisions onlyNeverNo code pathFull
Cross brand factsAbsentAbsentNo code pathFull
NameSpoken above 0.8 confidenceAbsentNo code pathFull
Operator notesNeverNeverNeverFull
Own brand historySpeakable summariesAbsentNo code pathFull
Private fit valuesBehavior flags onlyAbsentNo code pathFull

Enforced in code at read time and asserted against the built artifact. Prompt wording shapes tone; it never carries a guarantee.

The speakables rule

If it may not be spoken, it is not in the window.

There is no know but do not say state in any customer facing context. The corollary that makes the rule cheap

Most systems put the secret in the context and then write a sentence forbidding its use. That is a request addressed to a model, and an attacker only has to be more persuasive than the sentence. CustomerLedger builds the prompt from what the agent is permitted to say to this caller in this session, so an injection attack finds nothing to elicit. Redaction runs once at write time, where it is testable, instead of on the hot path where its bugs live.

One gate, last in line

finalize_prompt(parts, audience) is the final code to touch a prompt. It runs on the complete artifact: placeholder sentinels, a brand and canary audit against the audience allowance, spoken form time rewriting, and an exactly one callback block check. The bridge may only ship its return value.

Audiences are constructed

There is no default audience, no optional brand parameter and no unscoped form. Constructing an agent audience without a tenant and a brand raises. The unscoped hole that every leak in this class comes through is made unrepresentable rather than discouraged.

Peer tenancy

Your clients are not your contacts.

Tenant, one business

  • Their callers, resolved by endpoint
  • Their consent, bound to a sending identity
  • Their transcripts and call summaries
  • Their agents, tokens scoped to brand
No code path

Tenant, another business

  • Their callers, resolved by endpoint
  • Their consent, bound to a sending identity
  • Their transcripts and call summaries
  • Their agents, tokens scoped to brand

One file per tenant. The same phone number in two tenants is two unlinked people, permanently and by design, because linking them is the leak the wall exists to prevent. A canary planted in either tenant must appear in zero prompts built for the other, asserted in both directions.

Silent

Never name a provider

For a white label client. If asked, the agent says the business runs its own line.

On request

Confirm only if asked

The expected default for a paying client. Never volunteer, never pitch.

Showcase

May explain and route

For demo and reference agents. Extends to named brands only, never to a peer client.

Whose data an agent may hold and whose name it may say are different questions. Collapsing them produces the wrong answer twice: a white label client whose agent volunteers a vendor, and a demo agent forbidden from naming the product it exists to sell.

Consent

Prove they said yes, in their own words, with the date on it.

Consent is an append only event log, never a column. Current state is a fold, and the fold sorts declined and revoked above granted and exempt, so an opt out beating an exemption is an ordering property rather than an if statement somebody can forget to write. Every store error returns no.

VERBATIM

The exact wording shown is stored with the grant. Existing wordings are preserved rather than improved, because editing text somebody agreed to orphans their evidence.

SCOPED

Every wording carries a scope. Service does not cover promotional; promotional does cover service. A grant for one purpose is not a grant for another.

TRI STATE

Never asked, declined, granted. An unchecked box returns nothing at all, never a decline, because never asked is not no.

ONE ORACLE

A single function decides every send, and its denial beats every approval above it. Every sender calls it and logs the decision it got.

The box is not pre checked, and that is a commercial decision before it is a legal one

The control stays hidden until the phone field holds enough digits, then appears beneath it, unchecked, and the person taps it themselves. The entire pitch is that you can prove the customer said yes. A pre checked box proves only that we checked it.

Tamper evidence

A hash chain, deliberately not a blockchain.

Append only by convention is not append only. The operator holds write access to the file, so no row can be shown to be un backdated. Each consent event carries the hash of the row before it, so an edit, a deletion or a reorder breaks the chain and names the row that broke it.

EVENT 41
granted
a91c4f
EVENT 42
granted
7e02bb
EVENT 43
edited
chain break
EVENT 44
revoked
4c8d10
RFC 3161
daily anchor
head digest

Why not a chain proper

Distributed consensus resolves disagreement between parties who do not trust each other. There is one writer per tenant and one operator, so you would pay the whole cost of consensus for none of its purpose. Immutability also collides with erasure rights over exactly the data class that attracts deletion requests.

What an anchor buys

Only the chain head digest leaves the machine, never content, so proving the record adds no disclosure surface. The signed token sits beside the nightly snapshot and shows the digest existed at that time, independently of us. A logged erasure records what was removed by id and hash, so an expected break stays distinguishable from tampering.

Doing, not just knowing

Absence over prohibition.

A verb that is not granted does not exist in the agent tool surface, so the model cannot name it, be talked into it, or be confused about it. Every decision writes a row recording the disclosure level it acted under.

VerbPolicyHow it is enforced
AnnotateAllowAppend only, attributed, stamped at write
Delete or spendDeny foreverNo code path exists
DraftAllowInert, in product, built through the same gate, so a draft cannot contain what the gate did not release
Modify consentDeny foreverOnly evidence bearing capture writes consent. The AI records, it never decides
ProposeAllowAn operator confirms every merge and correction by hand
ReadDossier onlyAudience type plus session recognition, never raw store access
ScheduleAbsentThe verb does not exist yet
Send emailAbsentThe verb does not exist yet
Send SMSConfirm eachThe consent oracle runs first and its denial beats every approval

There is no trust ladder promotion for an external send verb, ever. Approvals may promote inert verbs only, and one bad act demotes.

The operator surface

Time that understands the job.

A burst pipe is fifteen minutes. A move booked for September is weeks. Both live in one model: the trade sets the default urgency, a justification with a date overrides it, and a planned touchpoint fills the gap between. The clock is derived on read and never stored, because a state written into a row is wrong the moment nothing updates it.

Hot 15 min
Warm responding
Stale slipping
Cold lapsed
Scheduled date ahead
Engaged they replied
Customer booked
Closed done
Provenance

Never editable, and it resolves downward

A row from somebody's spreadsheet must not look like demand. An unknown source resolves to manual rather than to requested, because guessing generously is exactly how an uploaded list launders itself into looking like a real customer.

Reasons

A reset has to say why

A pro may always push a timer out, but the justification sets the new clock rather than merely excusing the old one. A quote out implies three days; a stated date always wins. Every touch is logged and becomes the account history.

Teasers

The allowlist is the boundary

Before a lead is claimed, a business sees a fixed list of fields and nothing else. Because it is an allowlist, a column added to the row later cannot leak by default, and a test asserts no surname, email, phone or address ever reaches the teaser.

Ranking

Weight attaches to evidence, never to the source.

A review counts more when we can prove the job happened, not because it was left on our site. The rule, in one sentence

Saying our reviews count more is indefensible to a business that just dropped a place. Saying that reviews tied to a provable job count more is a claim about proof, and it happens to favour the party doing the work of collecting it. The uplift is deliberately small, because anything larger makes rank a function of which platform a business pushes customers toward, which is pay to play wearing a different hat.

1.6

Transaction verified. Our lead, a logged appointment, and the review written after the event date.

1.2

Platform verified. A real account, with no job we can tie it to.

1.0

Baseline, and explicitly not devalued.

0.0

Unverified. May be displayed, moves nothing.

Four guards matter more than the weight: shrinkage toward the category mean so three glowing reviews cannot leapfrog four hundred, a two year recency half life, one customer counted once however often they write, and burst damping above five in a day. Volume buys confidence, never stars, so asking for reviews cannot inflate a rating. There is no manual adjustment input, and there must never be one.

Calls

Open any call. Read it, or read the point of it.

A client who sees that their agent took ten calls can open any one of them, read what was said, get the important points without reading, and reach the caller's record in one click. Transcripts are coalesced into readable turns at write time rather than rendered from the fragments a speech engine happened to emit, because a transcript that reads as broken software is worse than none.

Nothing records audio, and the field is not built

Florida is an all party consent jurisdiction, callers originate anywhere, so the strictest applicable rule governs and an undisclosed recording is a criminal exposure rather than a compliance nit. Recording also costs the warmest three seconds of every call, because the disclosure has to land in the greeting. A release gate asserts that zero recording artifacts and zero recording configuration exist for any tenant. Absence over prohibition, the same principle as the verb table.

Release gates

Twenty two things that are true, or it does not ship.

Each gate is a registry feature with a binary answer, run on every release. Vague goals fail; specific testable ones survive contact with a migration.

01A canary planted in either tenant appears in zero prompts built for the other, in both directions.
02Constructing an audience without a tenant and a brand raises, and zero callers of the unscoped path remain.
04No row in any child table references a person that a merge moved away.
06Ten spoofed and asserted calls per brand elicit zero foreign facts, checked on prompt and transcript.
07A decline recorded in one tenant blocks a send from another through the shared identity, and an induced store error still blocks.
09A planted placeholder, a written clock time and a brand canary each fail the build and never reach a shipped prompt.
11The pre dial card renders in under a second behind auth, and the public probe gets a 401 with zero contact data.
13A repository grep finds zero references to the ledger directory outside its own package.
16Two interleaved calls on different tenants, through one process, each build prompts holding only their own data.
17A tenant restored from last night's snapshot passes that tenant's full feature set.
18A mutated historical row fails verification by id, and a logged erasure of the same row verifies clean.
22Zero recording artifacts and zero recording configuration exist for any tenant.

Twelve of twenty two shown.

Position

It ships under the agent, not beside it.

Every voice agent onboarding creates a tenant on the same day, with no separate step and no second purchase. The ledger is the reason the agent is better than an answering service: it is what makes a business remember its own customers. The tenant is therefore the unit of onboarding rather than an upsell, and it unbundles to operators who never bought an agent later.

One CRM, one email front end, and one calendar across all your businesses, integrated to everything, with an AI helper. The product definition, and it is broader than a CRM

Contacts is the wedge and is largely built. Calendar is the smallest and most obviously useful, so it lands second. A unified inbox is hardest and last, because an email is a permanent forwardable record produced under the weakest identity signal in the system, and reusing the voice rules there would be a guess. Version one locks in the hooks and takes a position on each rather than promising all three and delivering none.