Credit agentic architecture
An end-to-end origination platform built on top of the Go.Abacus substrate: a vendor-neutral model layer so any LLM can serve any task, a context and knowledge plane in the middle that every piece of evidence passes through, eight specialized credit agents, a deterministic risk engine — and a human at the final gate.
Evidence flows down the left. Every arrow that crosses into the model layer passes through the context plane first — that is where redaction, provenance and the content fingerprint are applied.
No module outside the model package may import a vendor. Everything speaks one contract, so
changing which model answers which task is an edit to tenant.json and a restart —
not a code change, not a rebuild, not a new dependency.
// tenant.json — the whole model layer is data "agentic": { "llm": { "providers": [ { "provider": "anthropic", "model": "claude-opus-5", "apiKeyRef": "secret://anthropic" }, { "provider": "openai-compatible", "baseUrl": "https://llm.internal.cu", "model": "llama-3.3-70b-instruct" } ], // cheap model for volume, frontier for the memo "routing": { "agent-reasoning": ["openai-compatible", "goabacus"], "memo-narration": ["anthropic", "goabacus"] } } }
airgapped, every external provider in the config
above is inert, and the CLI says so per model at validation time.Nothing reaches a model raw. An agent asks for a context pack; the assembler flattens the read model into cited facts, retrieves the governing policy text, redacts, budgets, and fingerprints — in that order.
TF-IDF, not embeddings: no model, no vector store, no network. Retrieval therefore works identically air-gapped, and identical inputs always produce identical hits — which is what makes the fingerprint mean anything. A vector-backed store is a drop-in replacement.
Bound for an external model, a name becomes [NAME_1] — consistently within a
pack, independently numbered across packs. The model can still reason about "the applicant";
the identity never crosses. The token map never leaves the appliance. Financial magnitudes
pass through untouched.
A finding citing contextFingerprint: 9a1c… can be re-derived years later and
shown to have come from precisely that evidence. "The model said so" is not an examiner
answer. This is.
Four independent mechanisms, each covered by a test. Model risk guidance expects a model whose logic is documented and whose outputs are reproducible; an LLM in the decision path is neither.
| Mechanism | How | Consequence |
|---|---|---|
| Type-level | An agent report has no outcome, score or price field. | The type cannot express a credit decision. |
| Severity clamp | A model observation is capped at ATTENTION; only deterministic checks assert ADVERSE. | A hallucination can raise a human's eyebrow. It cannot assert an adverse fact about a member. The clamp is to the ceiling, not the floor — capping to INFO would hide the loudest thing a model can say. |
| Risk exclusion | The risk engine drops every model-derived finding before computing PD and LGD. | An unvalidated model can never move a capital number. |
| Grounded memo | A deterministic skeleton carries every figure; the model pass may replace prose only. | With no model at all, the skeleton is the memo, flagged narrated: false. |
Each agent has a deterministic core — ratios, thresholds, list matches — and an optional qualitative pass over the same context. Only the deterministic half can assert an adverse finding, and a model outage degrades an agent to that half rather than failing it.
Every external dependency has an explicit failure mode, and none of them stops an origination.
| Failure | Behavior |
|---|---|
| External model unreachable, refuses, or returns garbage | The agent keeps its deterministic findings and records SOFT_SIGNAL_UNAVAILABLE. The router has already audited which of the three it was. |
| Posture forbids egress | External providers and data sources are never selected; the on-appliance path runs. The refusal reason is recorded. |
| A data source times out | Recorded as failed; the other sources still contribute. A missing bureau score becomes an honest reason code, not a crash. |
| A single agent crashes or hangs | Timed out and captured as an error report. The run continues — a partial analysis with an explicit gap beats no analysis. |
| Knowledge store unavailable | Empty knowledge list, visible in the pack and in its fingerprint. |
| No model configured at all | The memo is the deterministic skeleton, and says so. |
Stated plainly, because the value of everything above depends on it.