Canonical Credit Union AI Platform on the Go.Abacus substrate · appliance + cloud

Layered architecture · examiner-grade

One skeleton, every vertical, two ways to run it.

A hexagonal skeleton for CU back-office automation — lending is the worked example on this page. The same skeleton (a pure domain kernel at the foundation, one SDK boundary onto the Go.Abacus substrate, a posture-aware Document Intelligence Gateway as the crux) is constructed for each vertical: lending, deposit ops, member experience, and the rest of the back office. The same signed artifact runs on-appliance (Go1) in a member's server room or in cloud / VPC — the deployment posture re-routes the gateway between on-device (zero-egress) and external vendors. Press ▶ Explain every step for a slow, narrated walkthrough: it spotlights each part of the stack in order while a balloon explains exactly what happens to one origination — auto-advancing every few seconds, with pause and click-through at your own pace. Switch the posture mid-tour and the story re-routes live. Open any + details drawer for the real contracts, thresholds, tiers, routing rules, and state machines.

Posture
host appliance + cloud · vendors + on-device fallback · floor 0.82
Pure · no I/O, zero SDK Structure · logic & audit On-device · zero-egress External vendor · governed egress
L6

Composition Root & Verticals

app · depends on all below

originate() runs one identical pipeline; matrixFor + policyFor supply the only product-specific config.

apps/lending/compose.ts

The one place everything meets: builds the gateway + valuation providers from the injected posture & host ports.

originate()buildGateway()bootstrap()registerAgentActions()
apps/lending/demo.ts

Originates one auto and one HELOC application through the identical shared flow.

npm run demo

AUTO 4 stipulations

  • INCOME — paystub / W2 / bank stmt
  • AUTO_INSURANCE — carrier · vin · coverageStart
  • RESIDENCE — proof of residence
  • IDENTITY — driver's license

HELOC 7 stipulations

  • INCOME — paystub / W2 / tax return
  • HOMEOWNERS_INSURANCE · FLOOD_INSURANCE (SFHA only)
  • FIRST_MORTGAGE · VALUATION · TITLE
  • IDENTITY — driver's license
details · origination pipeline & agent actions
originate(host, posture, req) — identical for both products
buildGateway() — register OnDevice + 3 vendor adapters under the posture's egress + routing
matrixFor(product) → run clearStipulations() through the gateway
derive incomeVerified = INCOME stip CLEARED
if no collateralValueresolveCollateralValue() via valuation providers
evaluate(input, policyFor(product)) → deterministic Decision
buildAdverseAction() from reason codes (only on DECLINE)
host.audit.append("clp.decision.recorded") — outcome + policyVersion + reasonCodes
agent actions (registered against host.agent)
clp.requestDocumentclp.clearStipulationclp.routeToUnderwriterclp.issueDecision
OriginationResult
{ product, posture, stipulations[], allStipsResolved, decision, valuationSource?, adverseAction? }
vendor config
injected per install; apiKeyRef → host secret store (secret://…), never keys in code
L5

Regulatory Overlay

→ underwriting

Notices render purely from deterministic reason codes; the optional LLM rephrase never alters a reason.

packages/compliance

buildAdverseAction(decision, ctx)AdverseActionNotice | null (null unless DECLINE). ECOA up to 4 principal reasons + FCRA score disclosure.

ECOA / Reg BFCRAdraftNarrative()
details · reason-code → notice mapping
ReasonCodeECOA principal-reason text
CREDIT_SCORE_BELOW_MINCredit score did not meet our minimum requirement (triggers FCRA disclosure)
DTI_EXCEEDS_MAXDebt-to-income ratio exceeded our maximum
LTV_EXCEEDS_MAXRequested amount exceeded allowable loan-to-value
CLTV_EXCEEDS_MAXCombined loan-to-value exceeded our maximum for this property
INSUFFICIENT_COLLATERAL_VALUEValue of the collateral was insufficient
INCOME_NOT_VERIFIEDUnable to verify income from documents provided
COLLATERAL_VALUE_MISSINGA collateral valuation was not available

draftNarrative(notice, narrator) uses the Go.Abacus model port to rephrase the body into warm prose — reasons stay fixed.

L4

Deterministic Domain Engines

→ core-domain · dig

The examiner-defensible core. The credit decision is versioned rules — never an LLM.

packages/underwriting

evaluate(input, pack){ outcome, tier?, aprBps?, metrics{dti,ltv}, reasonCodes }. Any reason ⇒ DECLINE; else tier match ⇒ APPROVE, else REFER.

AUTO_POLICYHELOC_POLICY
packages/stipulations

clearStipulations() maps each gateway verdict onto the state machine: PASS→CLEARED · FAIL→FAILED · REVIEW→MANUAL_REVIEW.

AUTO_MATRIXHELOC_MATRIXallCleared()
packages/valuation

First supporting provider wins → LTV/CLTV. Manual is zero-egress (conf 1.0) so air-gapped still underwrites.

ManualValuationProviderVehicleBookAdapterAvmAdapter
details · policy packs, rule order, valuation contracts
rule evaluation order (each failed check appends a reason code)
collateral present? income verified? score ≥ min? DTI ≤ max? (C)LTV ≤ max? APPROVE/REFER/DECLINE
AUTO_POLICY · auto-2026.07 — minScore 580 · maxDTI 0.50 · maxLTV 1.25
Tiermin scoreAPR
A7405.99%
B6807.99%
C62011.99%
D58016.99%
HELOC_POLICY · heloc-2026.07 — minScore 660 · maxDTI 0.43 · maxCLTV 0.85
Tiermin scoreAPR
A7607.49%
B7208.99%
C66010.99%
valuation providers (tried in order)
manual
zero-egress · reads value already on the collateral · confidence 1.0
vehicle-book
POST /v1/vehicle/value (NADA/JDPower-class) · Bearer · conf 0.9 · ASSUMED shape
avm
POST /v1/avm · Bearer · conf from response (~0.75) · ASSUMED shape
L3

Document Intelligence Gateway

the crux · posture-aware

One contract, swappable adapters. route() + verify() audit every choice; below the confidence floor a PASS is forced to REVIEW.

packages/dig/gateway.ts

DocumentIntelligenceGateway · route → verify · classify / extract / verifyPASS | FAIL | REVIEW

DocIntelligenceAdapterEgressPolicyRoutingPreferenceNoEligibleAdapterError
on-appliance · zero-egress adapters/on-device.ts · OnDeviceAdapter

Go LLM + Indexer. Prompt → grounded JSON. PASS/REVIEW only — never FAIL. Always the last-resort fallback (never egresses).

external-vendor · governed egress adapters/vendors.ts

Injectable HTTP transport + host-resolved secret refs.

LandingAdeAdapterInformedIqAdapterInfrrdAdapter
governor packages/platform-config

resolvePosture(env CLP_POSTURE) — defaults airgapped. Sets egress policy + per-doc routing.

airgappedvpchybrid
details · adapter contract, routing table, egress policy
DocIntelligenceAdapter — every adapter implements
id · locality
on-device | informed-iq | infrrd | landing-ade · on-appliance | external-vendor
supports(docType)
competence check used by the router
classify(doc)
{ docType, confidence }
extract(doc, schema)
{ fields[]: {name, value, confidence, grounding{page,bbox}}, minConfidence }
verify(doc, ctx)
{ stipulationCode, status, reason, evidence[] }
route() — first supported + policy-permitted adapter wins; on-device is fallback
doc typeBEST_OF_BREED order (vpc / hybrid)
PAYSTUB · W2 · BANK_STATEMENT · AUTO_INSURANCE · PROOF_OF_RESIDENCEinformed-iq → on-device
MORTGAGE_STATEMENT · HOMEOWNERS_INSURANCE · FLOOD_INSURANCEinfrrd → on-device
PROPERTY_APPRAISAL · TITLEinfrrd → landing-ade → on-device
TAX_RETURN · DRIVERS_LICENSElanding-ade → on-device
egress policy per posture
posturehostallowExternalconf. floorrouting
airgappedappliancefalse0.85on-device only
vpccloud / VPCtrue0.80best-of-breed
hybridappliance + cloudtrue0.82best-of-breed (primary)
vendor adapters — auth & contract status
LandingAdeAdapter
Bearer · parse → extract · grounding from extraction_metadata.references · VERIFIED · api.va.landing.ai
InformedIqAdapter
Basic auth VERIFIED · request/response shapes ASSUMED (auto API partner-gated)
InfrrdAdapter
Bearer async job: upload → submit → poll → result · shapes ASSUMED (enterprise API)

Audit events: dig.route.selected · dig.route.refused · dig.verify.completed. Below-floor PASS → REVIEW "(confidence below floor)".

L2

Go.Abacus SDK Boundary

the only SDK leak point

Every host call passes through here as a typed port, so the pure core never sees the SDK — and never knows whether it's on an appliance or in the cloud.

packages/goos

GoOsHost aggregates the host ports; helpers bind identity & secrets into the audit trail.

ModelPortIndexerPortAuditPort IdentityPortSecretPortAgentActionPort
details · ports & helpers
connect()
GoOsHost { model, indexer, audit, identity, secret, agent }
ModelPort
os.model.complete — Go LLM (assistive only)
IndexerPort
os.indexer.search — policy / guidance / history
AuditPort
os.audit.append / list — hash-chained
helpers
auditSinkFrom(host) · secretResolverFrom(host) · nowIso() · Go1osError (typed, HTTP status)
L1

Pure Domain Kernel

base · zero dependencies

Entities and state machines with no I/O and no SDK import — the foundation both verticals and every engine plug into.

core-domain/entities.ts

Product-agnostic types. Money = integer minor units, USD, never float. Prefixed IDs (app_ who_ loan_ doc_ stip_). Doc bytes stay on the host (sha256).

Collateral = vehicle | property13 DocumentTypes
core-domain/state-machines.ts

Transitions are data, not scattered ifs — auditable, diffable, identical for both products. assertLoanTransition() throws IllegalTransitionError.

details · the two state machines & core types
loan lifecycle — loanTransitions(product)
INTAKE DOC_COLLECTION VERIFICATION UNDERWRITING DECISION CLOSING RESCISSION_WINDOW FUNDED

RESCISSION_WINDOW (Reg Z) is HELOC only — inserted between CLOSING and FUNDED via config; auto funds directly. Terminal branches: DECLINED WITHDRAWN. Gate: enter UNDERWRITING only when allStipulationsResolved().

stipulation lifecycle
REQUESTED RECEIVED EXTRACTING VERIFYING CLEARED ·MANUAL_REVIEW ·FAILED

FAILED → REQUESTED (re-submit) · MANUAL_REVIEW → CLEARED | FAILED | REQUESTED.

key entities
VehicleCollateral
vin · year · make · model · bookValue?
PropertyCollateral
address · appraisedValue? · existingLiens? · inFloodZone? (SFHA gate)
Stipulation
code · requiredDocTypes[] · status (7 statuses)
L0

Go.Abacus Runtime

substrate · appliance + cloud

On-prem AI OS. One signed artifact runs on either target — the posture selects which, and the confidence floor.

airgapped

On-Appliance · Go1

member's server room · true air-gap

NVIDIA Blackwell appliance in the credit union's own facility. Zero data egress; on-device extraction only. The compliance moat.

Go1 Mini≤200 users · 1× Blackwell · 2 TB
Go1≤2,000 users · 3× Blackwell · 15 TB
Go1 MAX≤8,000 users · 8× · 30+ PFLOPS
vpc · hybrid

Go.Abacus Cloud / VPC

dedicated private cloud · elastic

Managed, single-tenant deployment with geographic data residency. Governed, audited routing to external vendors permitted within the VPC boundary.

Private VPCdedicated · data residency
Elastic scaleburst compute on demand
Hybridon-prem core + cloud routing
same everywhere — one .go1pkg · same 6 host ports · same signed audit chain
Go LLM
os.model.complete
Indexer
os.indexer.search
Audit chain
os.audit.append / list
Agent
declared actions
Identity
os.whoami
Secrets
secret:// refs
details · packaging & audited event stream
ships as
manifest/go1pkg.json → signed .go1pkg · ed25519 publisher key · host verifies signature + payload digest before install — on appliance or in cloud
permission scopes
model · indexer · audit(rw) · agent · identity — "denials are evidence"
portability
same artifact validated on Go1 Mini (air-gapped) and Go.Abacus Cloud/VPC (Go1 MAX-class) — a posture profile, not a rebuild, selects the target
every origination writes a hash-chained trail
dig.route.selecteddig.route.refused dig.verify.completedclp.decision.recorded
Package graph: compose.ts → 8 packages; only goos & dig/adapters + valuation externals touch I/O. Deterministic core: core-domain · underwriting · stipulations are pure — zero SDK, zero vendor. Status: Phase 2 · 20/20 tests green.