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. § 222

On 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.1200

No 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 doctrine

A 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.

MethodEndpointReturns
GET/api/v1/brandsThe brands your key’s account owns — find your brand_id here.
GET/api/v1/ledgerThe Worth-It Ledger: confirmed / estimated / anchor dollars, graded and never blended.
GET/api/v1/automationsPer action-kind mode (propose | auto), track record, and whether it can ever auto-run.
GET/api/v1/statusHonest 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; 429 with a Retry-After on 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.