GitDoctorruntime, not static

Find the jade. Send the claims, keep the words one pull away.

Structured data, then hoarded unstructured data, now “unlimited context will find it.” It won't; it saturates. Jade metabolizes sales conversations into a few ranked, pointered claims — Data Enzymatics applied to transcripts — and that digest is what goes into the agent's context instead of the calls.

The four enzymes

Digesters break a transcript into threads: single units of buyer meaning — need, pain, objection, belief, criterion, timeline, budget, authority, competitor, commitment, risk — each stated or inferred, with verbatim evidence at exact character offsets. A thread without evidence is a failed thread and is not kept.

Connectors attach each thread to the body — the account's existing intelligence — and decide: create (fills a gap), augment (corroborates, from another call), replace (the buyer's position changed; the old claim goes to the graveyard with a lesson), or reject (no advantage).

Modifiers adapt what survives to body style: one sentence, the buyer's terms, typed, pointered. Architects fold it into the deployable digest by domain with a deployment signature and a coherence check.

Then the body lives: threads that get pulled thrive; threads nobody uses decay and are shed. Accumulation is the disease; this is the metabolism.

What the agent receives

Real output, from ten public sales calls (the gwenshap/sales-transcripts dataset), one light model, $0.012 in total:

## budget
- (0.51 · stated · 1 call · active) Buyer has a $300 budget for this purchase [[src:call-008#411-552]]
## criterion
- (0.48 · stated · 1 call · active) The solution must be warm and lightweight—not heavy or burdensome to carry [[src:call-001#719-846]]
- (0.48 · stated · 1 call · active) The jacket needs to be available in tall sizes, not just standard large [[src:call-009#1269-1334]]
## pain
- (0.48 · stated · 1 call · active) Inconsistent sizing across brands creates risk of poor fit when ordering [[src:call-003#572-726]]
- (0.46 · stated · 1 call · active) The buyer's previous mid-tier jacket lost warmth and failed functionally (zipper broke) within months [[src:call-005#1070-1185]]
## risk
- (0.48 · stated · 1 call · active) The buyer needs a clear, easy return policy to feel safe purchasing [[src:call-007#869-983]]
---
context: 768 tokens instead of 6,515 (88% smaller). The words are one pull away.

Every line is DIGEST_SPEC v0.1: a claim, its score, whether it was stated or inferred, how many calls corroborate it, and pointers to the exact words. pull([[src:call-008#411-552]]) returns “Sure. I'm looking for casual clothes like jeans and tops, but I also want a couple of more formal outfits for work. My budget is around $300.” — and marks that claim as used, which is what keeps it alive.

The whole library in one context

Per-account bodies hold deal intelligence: what this buyer believes. A company's call library holds product intelligence: what many buyers say in different words. The same enzymes run one level up — threads from every call are connected into themes, corroboration is the number of distinct customers, and one cheap call names each theme. Real output from the same fifty public calls, nine cents in total:

## criterion
- (12% of calls · 6 calls · 100% stated) Families need at least 3-4 bedrooms with outdoor space in a top-rated school district [[src:call-022#360-499]] [[src:call-024#280-430]] [[src:call-025#695-822]] [[src:call-026#1269-1403]]
## budget
- (6% of calls · 3 calls · 100% stated) Buyers have a firm $400,000 price ceiling they cannot exceed [[src:call-024#280-430]] [[src:call-025#695-822]] [[src:call-029#566-687]]
## risk
- (4% of calls · 2 calls · 100% stated) Buyers worry that switching systems will disrupt operations and struggle to get their teams to adopt new tools [[src:call-012#1059-1212]] [[src:call-046#1387-1545]]
---
library context: 334 tokens for 50 calls instead of 34,203 (99% smaller) — at this rate 22,489 calls fit in a 150k-token context, every claim one pull from the words.

That last line is the point. The push was to structure data, then to hoard it, now to buy unlimited context and hope a better model finds the jade. Compress the mine until it fits instead: every call a company has ever recorded, as themes with prevalence and pointers, in front of one reasoning model at once — and the exact words one pull away when it needs them. POST /api/jade with { mode: "themes", transcripts }.

Language is a lexicon, not a rewrite: the same enzymes ran on the TeleSalesCorpus (2,465 real-grounded Chinese telemarketing dialogues, AAAI 2026) with a CJK signal table and character bigrams — 40 dialogues for $0.028, themes such as “buyers need assurance there are no hidden costs beyond the quoted price” (10% of calls), each pointing at the customer's own words: pull() → “什么优惠?”.

Cheap on purpose

Digestion is mechanical: utterances are cut and scored on a signal lexicon with no model at all, and only the strongest threads go forward — verbatim, offsets already known, so evidence can never be invented. The model is one cheap enzyme call that returns a label per thread. Measured on real calls: about a tenth of a cent per call on a light model, a few hundred input tokens, cached system prompt. A lexical mode with no model key runs at $0 with lexicon labels. Compare that with re-sending a 10,000-token transcript to a large model on every agent turn.

Additive: it reads where the calls already are

Nobody moves their recordings. Connect Gong, Fireflies, or Zoom — or the Vapi and Retell voice agents already connected — and the library page pulls the last 30 days of transcripts with speaker names intact, digests them, and hands back themes and account digests whose pointers resolve to the source's own transcript. Tools with no API: drop the export (VTT, SRT, Otter, Meet). Gong stays Gong; this is the page beside it.

Import it into your search loop

import { metabolize, renderDigest, pull, emptyBody } from "@gitdoctor/jade";

let body = emptyBody("Northwind Logistics");            // the account's intelligence, kept by you
const gen = await metabolize(newCalls, body, MODEL_KEY);  // digest → connect → modify → architect
body = gen.body;                                           // generation +1; graveyard grew if positions changed
const context = renderDigest(body, { limit: 25 });        // this replaces the transcripts in the agent prompt
const words = pull(pointer, allCalls, body);               // verbatim, on demand, marks the claim as used

Or over HTTP: POST /api/jade with { transcripts, body? } and your model key in x-model-key; you get the new body, the decisions with reasons, and the digest. Nothing is stored here — the body is state you keep, which is the point.

One module, no dependencies, Apache-2.0 with the engine. The model is the digestive enzyme and it is yours; a light model is enough. Validate any digest with loopmath validate-digest.