ExactCov went into 2025 with one claim: the covenant is written once and the check happens every month, and nothing in most credit teams' tooling connects the two. We came out of it with a register that does, and with four decisions we would defend to any second-line function. This is the short version of the year.
What we decided
The parser reads first, the model reads second. Early on we ran extraction the way most vendors do: hand the agreement to a language model and ask for the covenants. It found most of them and cited about half of them exactly. That is not a register a bank can sign. So we rebuilt the pipeline the other way round. A deterministic parser builds the section tree, the definitions index and the cross-reference graph before any model runs. The model then answers from candidates and must cite a span the validator can check. First pass ended the year at 97.4 percent citation-exact, 99.7 percent after a routed second read, and every one of those figures is on the platform page rather than in a deck.
Stale is a state, not an age. Every deliverable in an agreement became a calendar item with a due date and a cure period. A NAV whose deliverable is overdue is marked stale until a new one lands, and a stale figure is never silently reused. The reporting frequency in the schedule sets the due date. A suspension notice overrides it. This sounds like data operations. It is a risk metric, and it sits next to headroom on every screen.
Every figure traces to a page. The piece we published in October, on designing for the auditor rather than the dashboard, is the design brief for the whole product. A number a credit officer cannot defend to internal audit is not a number, however good it is. So each extracted term carries its document, page and passage, and each write to the register is audited. The Breach and Waiver Log exists so that the person signing the report has something to sign against.
People decide. AI collects, extracts, calculates and flags. It does not approve a limit, send a chase or record a waiver. Every action that changes the book is proposed for a person to accept, and the trail shows who accepted it and when.
What we built
The year started with one job, incurrence analysis on cov-lite bonds and syndicated loans, and ended with two. In March we wrote that maintenance covenants have a cadence and incurrence does not, and that private credit monitoring is a calendar with a calculation attached. By the summer the register ran both: what the documents allow on day one, and whether every test still passes each period after that.
Fund counterparty monitoring was the largest addition. Banks facing funds under ISDA, GMRA and financing agreements carry NAV triggers in schedules that no research subscription covers, and the same fund can sit under an umbrella agreement with terms inherited on paper and nothing on the calendar. ExactCov now extracts those triggers from the executed documents, tests every fund the day its NAV arrives, and lets limits follow the NAV with an approval trail.
| Quarter | Shipped |
|---|---|
| Q1 | Deterministic parser in front of the model. Reporting obligations calendar with due, overdue and stale states. |
| Q2 | Maintenance monitoring for private credit and bank facilities. Compliance certificates reconciled against the register. |
| Q3 | Precedent comparison across a firm's own closed deals. Fund counterparty monitoring under ISDA and GMRA. |
| Q4 | Audit trail on every write, Breach and Waiver Log, and the morning brief: breaches first, then stale, then near trigger. |
What we wrote
Four pieces, each a two or three minute read, each written to be argued with. Maintenance covenants have a cadence. Incurrence does not. in March. Extraction is where monitoring starts, not where it ends in May. "What's market" is sitting in documents you have already read in July. Designing for the auditor, not the dashboard in October.
What we learned
The hardest conversations were never about extraction accuracy. They were about adoption. A credit team cannot switch systems in the middle of a reporting cycle, and a pilot that asks them to is a pilot that quietly dies. The answer we settled on is a parallel run: same inputs, independent output, nothing changes for the teams processing the book, and after four weeks the two outputs are compared disagreement by disagreement. It costs us more. It is the only form of evaluation a second-line function can actually accept.
A pass with a date and a source is a fact. A pass without either is a hope, and the book should not be built on hope.
What comes next
2026 is about two things. The first is measurement: a research programme that publishes what we test, on models, OCR, citation faithfulness and how much human review is enough, with the numbers attached. The second is where the register is used. Agents that own the monitoring calendar and propose every action for a person to approve, and the register answering from the assistant a team already uses, with citations, rather than from one more tab.
Thank you to everyone who read a draft, argued with a table or ran their own documents through the parser to see where it broke. That is how the register got better, and it is how it will keep getting better.