How it’s built
Proof, not promises.
Written for the engineer in the room.
Every guarantee below links to the code that enforces it, and to the regression checks that keep it enforced. The compliance rails are in the code path, not a help doc. And where we haven’t earned something yet — SOC 2, a pen test — we say so plainly. You can verify most of this yourself through a read-scoped API.
Proof coverage
The correctness-critical engines are regression-guarded.
Every engine a client reads output from — the value ledger, compliance, quotes, call intelligence, autonomy — is pinned by a proof suite. A suite nobody runs is documentation, so the whole set is a release gate: npm run proofs must be green to ship.
2,219
passing regression checks
across 34 proof suites · derived by running the suite on 2026-08-19, never hand-typed
Money & value truth
368 checks
- 87
Transactions store
Transaction persistence + chase logic, plus source-level tripwires for the money-path regressions.
- 65
MSP license recon
License-billing reconciliation for managed-services seat growth.
- 46
Worth-It Ledger
The confirmed-only value ledger: grades never blend, refusals are counts not dollars, the fee is the one actually billed, a failed source reads incomplete — never zero.
- 40
Add-on billing arithmetic
Keeps an engagement's scope and its Stripe invoice from ever drifting apart.
- 39
Auto-collections
The collections core — who gets chased, when, and how a failed send is never counted as handled.
- 35
Commission reconciliation
Reconcile, de-dupe restatements, and draft underpayment chases without double-counting.
- 33
Square invoice send
The Square invoice-send path — the pure core behind the money it moves.
- 23
Proposal-Pro billing
The self-serve proposal SKU’s pure billing arithmetic.
Compliance-as-code
529 checks
- 159
Permit guardian
The two-clock permit engine, chase decisions and risk rollup — an expired permit is surfaced, never priced as a saved dollar.
- 152
Warranty & the 25C gate
Manufacturer tables, registration deadlines, and the hard federal-25C gate that refuses to promise a terminated tax credit.
- 83
Credential renewals
The license/credential renewal clock and chase decisions.
- 64
Compliance intake
The extraction parser and the human-confirm floors on compliance intake (no field auto-commits from a model guess).
- 41
Access lifecycle
The safety-critical cores behind autonomous Google Workspace provisioning and offboarding.
- 30
Escalations
The escalation decision — what must always route to a human.
Autonomy & safety
350 checks
- 110
Graduated autonomy
The decision gate: a hard-floor (money/legal/complaint/account-destructive) kind can never auto-run, and auto needs owner opt-in + a real write path + a passing safety gate.
- 77
Engine cadence
The orchestrator, division-of-labor and run/store loop — including that the autonomy gate, the atomic execution claim and the write-path check stay intact.
- 75
Pre-send quality gate
The deterministic compliance + grounding + voice gate every client-facing message clears before it can send.
- 45
Agency engine seams
The correctness and safety seams where the agency engine hands work between stages.
- 26
Client-read lanes
Best-of-N selection, the grounding gate on review replies and lead follow-ups, and crisis robustness.
- 17
Public API tenant scoping
The v1 API IDOR guard — a request can name a brand id, but one the caller doesn't own reads nothing.
Client-read generation
972 checks
- 158
Call intelligence
The call-scoring / book-rate engine — a metric with an honest interval, never a fabricated dollar.
- 116
Maintenance memberships
The maintenance-agreement engine — enrollment, metrics, and due-visit outreach.
- 109
action-log
Regression checks for this engine.
- 105
Good / Better / Best quotes
The three-tier quote ladder, including the financing rider that carries term + APR + partner + "subject to credit approval" and refuses above the usury line.
- 84
Appointment reminders
The calendar-driven reminder engine’s pure decision and extraction logic, incl. quiet-hours holds.
- 73
Email triage
The deterministic inbound-email triage core.
- 68
Review-ask engine
The review-ask timing and eligibility — pure functions the module and cron actually run.
- 57
Public demo integrity
The public home-services Intelligence demo — the numbers a cold visitor sees are internally consistent.
- 49
Brand voice + price guard
The voice layer and the legacy-quote price guard that stops a stale price reaching a client.
- 45
Proposal engine
The Deal & Contract Office bid/no-bid calls and proposal generation.
- 29
Generation reliability
Agency generation reliability and honesty — no fabricated claims in client-read output.
- 27
Learning layer
The per-brand learning layer’s honesty and privacy guarantees, including the code-enforced cross-brand wall.
- 26
Agency honesty guards
Pure guards on every place the product used to overclaim — each pins an honesty invariant.
- 26
Security questionnaire
The security-questionnaire deliverable a client sends to a reviewer to win the work.
Numbers regenerate from the suite itself (npm run rigor:coverage) — the page can’t inflate a count the checks don’t back.
Compliance-as-code
The rails are in the code path — not a help doc.
Most tools ship the feature and leave the law to the customer. These are the refusals the product makes on your behalf, each with the primary-source citation and the exact code that enforces it.
CPNI authentication gate (telecom)
47 U.S.C. § 222On a telecom account, the AI will not disclose account, usage or bill detail until the caller has been authenticated to the CPNI standard. The sharp edge is authentication, not content.
Worked example. A reply drafted as “your balance is $84 and you’re on the 5G plan” is held when the caller is not authenticated — disclosing it first would be the violation.
lib/modules/vertical-guards.ts → CPNI_DISCLOSURE gate (verticalKey "telecom"); wired into lib/agency/quality-gate.ts and the autonomy proposal gate
TCPA quiet-hours hold
47 C.F.R. § 64.1200No non-urgent automated text or call goes out outside 8am–9pm in the recipient’s local time. Marketing gets a tighter window (9am–8pm Mon–Sat, no Sundays) so the state patchwork is mooted. Out-of-window sends are deferred to the next lawful time, not dropped.
Worked example. A payment reminder queued at 10:14pm local is held and re-timed to the morning; a marketing text on a Sunday is held everywhere.
lib/modules/payments-compliance.ts → quietHoursGate / marketingQuietHoursGate; enforced for timing-sensitive channels in lib/agency/quality-gate.ts
Reg Z financing rider
12 C.F.R. § 1026.24(d)Any quote that shows a monthly-payment figure must carry the term, the APR, the licensed partner, and “subject to credit approval.” An APR above 36% (the usury line most state small-loan statutes draw) refuses the monthly display entirely — we display a partner’s terms, we never originate.
Worked example. A monthly-equivalent line only renders when a financing partner is configured with valid terms; at 41% APR the monthly-equivalent returns null and the figure is suppressed entirely.
lib/modules/quote-sender/gbb.ts → monthlyEquivalentCents (null when apr<0 || apr>36) + the financing disclosure line
Terminated federal 25C refusal
OBBB, P.L. 119-21 (2025-07-04)An HVAC/water-heater unit placed in service on or after 2026-01-01 gets no federal 25C tax credit — full stop, never promised, never hedged into a “probably” or a “check with your accountant.” The statute’s termination sentence is quoted verbatim in the code so nobody softens it.
Worked example. A 2026-02 install returns eligible:false with the OBBB termination quote; an impossible install date (e.g. 2025-02-30) is refused, not repaired into a usable date.
lib/modules/warranty-rebates/index.ts → taxCreditCheck + OBBB_TERMINATION_QUOTE + isRealCalendarDate
Card-surcharge by state
State statutes + Visa/Mastercard rules (cited per state in code)A proposed card surcharge is validated against the merchant’s state before it can reach an invoice: banned in CT/MA/ME, inclusive-pricing-only in NY, capped in CO/OK/MN, never on debit or prepaid, and the network 3% ceiling binds even where a state allows more.
Worked example. A 4% surcharge in New York is refused (must be priced in, not added at checkout); any surcharge on a debit card is refused regardless of state.
lib/modules/payments-compliance.ts → validateSurcharge / surchargeRule / STATE_SURCHARGE
Late-fee caps + upfront-agreement rule
O.C.G.A. § 7-4-16; Tex. Fin. Code § 302.002; penalty-clause doctrineA late fee that was not agreed in the signed terms is refused (adding it after the fact is generally unenforceable). Above 1.5%/month the code warns on penalty-clause and statutory-cap risk, and consumer invoices are flagged as governed by stricter rules than B2B.
Worked example. A 3%/month fee that never appeared in the agreement is refused; the same rate, even if agreed, warns that it exceeds the 1.5%/mo commercial ceiling.
lib/modules/payments-compliance.ts → validateLateFee
Correctness invariants
Properties that hold mechanically.
Not aspirations — behaviors the code makes true, each with a regression proof standing behind it.
The value ledger never fabricates a delivered dollar
The monthly Worth-It Ledger separates confirmed (arithmetic on events that happened, at your configured numbers) from estimated (identified, not banked) from anchor (fee replacement at a cited rate). The three are never summed into one headline; refusals are counts, not dollars; the fee compared against is the one Stripe actually bills, never a default.
e.g. A source that fails to read is reported as “incomplete,” never quietly as zero — “we couldn’t read the ledger” and “there was no value” are different sentences, and only one is ever true.
lib/agency/value-ledger.ts → composeValueLedger / computeValueLedger
Grounding gate on client-read generation
Text that will reach a customer is checked against what the brand actually told us. A claim, guarantee, price or credential the brand’s own knowledge doesn’t support is held before it can send — the model doesn’t get to invent a fact into a client’s inbox.
e.g. A generated review reply that promises a warranty the brand never mentioned is held by the grounding gate rather than published.
lib/agency/quality-gate.ts → groundingCheck; composed in the client-read lanes
Human-confirm floors on compliance intake
No compliance-critical field is committed from a model’s guess. The extraction parser produces candidates a human confirms, and an impossible or unreadable input is refused rather than repaired into something usable.
e.g. A vision model returning “2025-02-30” as an install date is rejected as not-a-date, not silently accepted as eligible.
lib/modules/compliance/intake (extraction parser + confirm floor); the same date discipline in warranty-rebates isRealCalendarDate
At-most-once execution (no double-send / double-charge)
An approved action is claimed for execution with a single conditional UPDATE that flips approved→executing. A concurrent worker or a platform double-fire hits zero rows on the second try and never runs — so a non-idempotent send or charge cannot happen twice.
e.g. Two workers race on the same approved invoice-send; exactly one wins the claim, the other returns null and does nothing.
lib/agency/engine/store.ts → claimAction (conditional UPDATE) + claimTransition (its pure model)
Graduated autonomy — propose-first, hard-floor never auto
Everything defaults to propose (owner approves). A kind auto-executes only when the owner has explicitly opted it in AND a real write path exists AND the safety gate passes — and hard-floor kinds (money, legal, complaints, account-destructive) can never auto-run no matter the setting or track record. One kill switch returns every kind to propose.
e.g. A refund proposal escalates to a human even on an account where routine replies auto-send — the hard floor is checked first and beats an “auto” setting.
lib/agency/engine/autonomy.ts → resolveAutonomy + HARD_FLOOR_KINDS
Security posture
What’s enforced today, and what we owe you.
The candor is the point. The deep dive on data handling lives on Security and Trust.
Enforced today
Session auth + per-brand ownership on every mutation
Workspace mutation routes go through one authorization guard (authorizeBrandAction): the caller must be the brand’s owner (by session), an admin, or hold the brand’s access token. A request-supplied id is never trusted — the guard verifies ownership before a row is read or written.
Tenant scoping enforced in the application layer
The database is reached with a service role, so isolation is not delegated to row-level security — every query is scoped to your account in code, and the public API intersects any requested brand id with the brands your key actually owns (a foreign id reads nothing).
At-most-once execution
Approved actions are claimed with a single conditional UPDATE, so a double-fire can’t send or charge twice. It’s an invariant with a regression proof, not a hope.
Fail-closed safety gates
When a safety, grounding or compliance gate can’t clear — or a source can’t be read — the system holds and escalates rather than guessing. Unverified work is never shipped.
Connector credentials encrypted at rest
OAuth tokens for the tools you connect are encrypted at rest (AES-256-GCM); a token that no longer decrypts is treated as a dead connection, not a green light.
Passwordless auth, revocable sessions
Sign-in is a one-time magic link — no password to breach or reuse — and sessions live in the database so any one can be revoked.
AI providers don’t train on your data
Content runs through Anthropic and OpenAI under commercial API terms that exclude API inputs and outputs from model training. We don’t train on it either.
Idempotency on write endpoints
The public API honors an Idempotency-Key header on non-GET requests and replays the stored response, so a retried call can’t double-apply.
Being straight with you
What we don’t have yet.
We’re early. You’d rather hear this from us than find it in a security review:
- No SOC 2 report or ISO 27001 certification — those are roadmap, not done. We won’t imply otherwise.
- No third-party penetration test yet. Security review to date is internal (an adversarial code-audit pass, with the findings fixed and regression-proven).
- No formal two-factor login yet — sign-in is a passwordless magic link, and sessions are revocable.
- A Data Processing Agreement is available on request, but it isn’t yet a signed standard on every account.
If procurement needs a formal certification today, tell us where you stand and we’ll be honest about whether we’re a fit yet or should re-engage once it’s in place.
Verify it yourself
A read-scoped API, so you don’t have to take our word.
Pull your own value ledger, automation modes and health straight from the source. Authenticated with an API key, scoped to the brands your key owns, rate-limited, and read-only.
| Method | Endpoint | Returns |
|---|---|---|
| GET | /api/v1/brands | The brands your key’s account owns — find your brand_id here. |
| GET | /api/v1/ledger | The Worth-It Ledger: confirmed / estimated / anchor dollars, graded and never blended. |
| GET | /api/v1/automations | Per action-kind mode (propose | auto), track record, and whether it can ever auto-run. |
| GET | /api/v1/status | Honest per-automation health — ok / degraded / broken — the same verdict the workspace shows. |
Example
# Your key is issued in the dashboard (Integrations → API keys). curl -s https://morthn.com/api/v1/ledger \ -H "Authorization: Bearer <your-api-key>" # Multiple brands on your account? List them, then scope: curl -s https://morthn.com/api/v1/brands \ -H "Authorization: Bearer <your-api-key>" curl -s "https://morthn.com/api/v1/ledger?brand_id=<id>" \ -H "Authorization: Bearer <your-api-key>"
- Tenant-scoped. A request may name a
brand_id, but one your key doesn’t own reads nothing — the cross-tenant refusal is a pure decision with its own regression proof. - Read-only. These endpoints only read. Changing an automation mode or a setting stays an authenticated in-app action.
- Rate-limited. 60 requests/min per key by default;
429with aRetry-Afteron exceed.
Kick the tires.
Then decide.
Twenty minutes to scope the one bottleneck worth starting with. If we’re not the right fit yet — or your procurement needs something we don’t have — we’ll tell you.