Borrower and lender are just different API views of the same backend.
// Borrower — /bxp prefix, cookie auth ENDPOINTS = { fileData: '/bxp/get-file', income: '/bxp/income', decision: '/bxp/decision-result', } // Lender — /api prefix, session auth endpoints = { file: (id) => `/api/file/${id}`, income: (id) => `/api/file/${id}/income`, decisionResult: (id) => `/api/file/${id}/decision-result`, }
One File = one loan application. Every entity branches from it.
views/income.py
views/liability.py
lc/schema/employment.py
lc/model/asset.py
lc/model/credit_data.py
lc/model/lien.py
excluded and verified must never reach
borrowers. The /bxp proxy strips them automatically.
Flagged, not removed. One exception: vendor-sourced credit tradelines.
reactor/functions/delete_<entity>.py
reactor/functions/delete_credit_tradelines.py
Every data change triggers re-evaluation automatically.
after_flush detects a dirty File → Decision Engine re-evaluates all policies → satisfy codes update → screens react automatically.
One orchestrator coordinates decision, reactor, and pricing.
Contracts keep the repos in sync.
Rules for cross-repo work.