51 lenders on panel
Methodology · generated from the repository

How LendScope is verified

This page is built from the code, not written about it. Every item below is read from the test suite, the lender policy overlays and the panel data file when the site is built, so it cannot say something the code does not do. 827 behaviours are pinned by automated tests; 9 of 51 lender policies are transcribed from the lender's own broker workbook with a cell reference per figure; rates are dated 3 Sep 2026; the panel's 82 recorded changes are diffed from history.

Where lender policy comes from

A lender is verified when its assessment floor, buffer, shading, card factor and thresholds were read from the lender's own workbook, each with the sheet and cell it came from, and the fields that could not be found are listed as unverified. Draft means public broker guides, not cell-checked. Generic means the panel-wide defaults. The calculator shows which applies on every lender row.

LENDERSOURCE WORKBOOKCITED FIGURESLISTED AS UNVERIFIED
National Australia Banknab-broker-serviceability-calculator-v63.xlsm212
ANZ BankANZ-Home-Loan-Calculator.xlsm187
Macquarie Bankmacquarie-bank-mortgage-solutions-serviceability-calculator.xlsm185
AMP Bankamp-bank-serviceability-calculator.xlsm245
Bankwestserviceability-calculator.xlsm (Bankwest)195
Auswide Bankawb-loan-serviceability-calculator-111a.xlsx175
MyState Bankloan_service_calculator.xlsx175
ME BankMEB CAT v1.15 - Broker (Locked).xlsm166
La Trobe Financiallatrobe-serviceability-calculator.xlsm185

Draft (public guides, not cell-checked): Commonwealth Bank, Westpac, Bluestone, Bendigo Bank, Bank of Queensland, Heritage Bank, Bank Australia, Qudos Bank, Community First Bank, Teachers Mutual Bank, Beyond Bank, BankVic, Gateway Bank, Firstmac. Generic defaults: 28 lenders. Send us a lender's broker workbook and it moves to verified.

What the tests pin

Each line is the title of one automated test in the repository. They run on every push, and the result is recorded against the commit on GitHub; the deployment itself is not gated on them.

anon-surface · 12

Cross-cutting sweep of every SQL file and Edge Function that an anonymous

app-pages-a11y · 16

App-page accessibility: dashboard, lenders, portals, calculators and settings.

applicant-import · 6

Applicant import: header guessing, saved-mapping precedence, value parsing,

apply-sql-failures · 17

How scripts/apply-sql.py decides a statement failed, and what it does next.

bankwest-carded-rate · 6

Bankwest is assessed at its own carded rate for product × LVR tier, buffer

broker-channel · 8

Three lenders on the panel are not accepting new broker applications:

calc-a11y · 11

Calculator accessibility: every rendered input has a name, the page has one <h1>, muted text never sits on --faint, and the token pairs clear 4.5:1.

crm-contact-detail · 7

crm-contact-detail.html — one contact, their deal, and the history

crm-contacts · 10

crm-contacts.html — the CRM contacts page (2026-09-04).

crm-css-coverage · 1

Strip comments so a class named only in prose ("we used to use .foo") is

crm-dashboard · 12

crm-dashboard.html — the CRM dashboard ported from the Claude Design

crm-documents · 10

client_documents — the metadata layer, the path rule, and the two orderings

crm-fact-find · 8

crm-fact-find.html — the broker's fact-find review (2026-09-04).

crm-new-contact · 9

crm-new-contact.html — a contact with no deal attached (2026-09-04).

crm-new-lead · 9

crm-new-lead.html — the intake form (2026-09-04).

crm-pages · 19

The four remaining CRM pages — activity, calendar, deal book, reports

crm-pipeline · 7

crm-pipeline.html — the kanban from the Claude Design project,

crm-tasks · 7

crm-tasks.html — the broker's follow-up list (2026-09-04).

csp-inline-styles · 5

The CSP's style-src carries no 'unsafe-inline' (2026-09-03). Under that

dashboard-samples · 6

First-run samples on the dashboard: the three demo files the empty state

deal-files · 20

Deal files (Phase 1a-i): six deal columns on scenarios, the owner-executed

deal-list · 31

The Deals page (scenarios.html, js/scenarios.js) — Phase 1a-i of the

deal-summary · 7

Copy-to-CRM summary (deal files 1a-ii, C4) and the DOM-free hydrateState.

design-md · 5

DESIGN.md is written from the CSS, so it must never drift from it.

drawer-dialog · 6

The calculator's Details drawer as a dialog (a11y follow-up 2026-09-03).

duty-core · 8

duty-core.js was cut out of calculators.js verbatim so the Funds to

edge-shared · 17

The three modules every Edge Function shares: CORS, the rate limiter and

embed-parity · 22

The embeddable calculators at /embed/*.html, which run on OTHER PEOPLE'S

engine-methods · 5

Engine behaviours added for parity: self-employed method per lender,

engine-vs-workbook · 15

Engine versus workbook: the same simple scenario — one PAYG applicant, one

error-sink · 11

js/error-sink.js — the client error sink in the browser: what it sends,

export-expenses · 7

Living expenses → lender workbooks. `LIVING_EXPENSE_CELLS` in js/xlsx-export.js

export-parity · 8

The downloaded workbook IS the verified workbook.

factfind-intake · 20

Permanent fact-find links, the quick form and client progress — the page

factfind-payslip · 6

The client's payslip fills their fact-find income — js/factfind-payslip.js

factfind-steps · 9

factfind.html — the stepped client fact find (2026-09-04).

factfind-upload · 19

The client's side of attaching a document to a fact-find.

factfind · 6

Client fact-find links: anon may only read a link's label and submit to a

funds-card-render · 8

Render smoke test for the Funds to complete card and the property-card

funds-position · 9

fundsPosition() is the one composer the engine, the form card, the results

guide-claims · 7

The Serviceability explained guide, the glossary and the calculator's HEM

hem · 5

HEM 2025 Q4 — pinned to the workbook cells it was transcribed from, plus

hgs-audit-methodology · 5

Home Guarantee Scheme eligibility and its effect on funds to complete;

homepage-claims · 7

The homepage and the login page used to carry invented numbers — "1,247

lazy-load · 11

js/lazy-load.js + js/lazy-features.js — the loader that keeps SheetJS,

lender-logo-fallback · 4

Lender and portal favicons fall back to the abbreviation badge through a

lender-overlays · 14

Lender policy overlays: every `verified: true` overlay must say which

lender-why · 9

"Why this result" — js/lender-why.js (2026-09-11). LoanOptions.ai says its

lenders-directory · 7

The public lender directory's card list is generated from the panel data

lenders-hydration · 5

initLenders() — when the panel is hydrated from public.lenders, and when it

levers · 3

The levers optimiser: tries each candidate on a clone through the pure

living-expenses · 9

Living expenses: the lender category set, migration of the old eight keys,

lvr-rules · 5

ANZ security / LVR rules, transcribed from its broker workbook. Cases name

modal-visible · 4

Every modal must open.

no-gradients · 3

DESIGN.md: "No gradients on any UI element" — flat surfaces; decorative

objectives · 7

Requirements and objectives (2026-09-11) — the gap from the LoanOptions.ai

orgs · 8

Teams: the database decides access. These tests pin the SQL's shape and

pack · 10

The deal pack (deal files 1a-ii, C3): one zip per lender — the lender's

page-boot · 6

Every `data-on-<Event>="name"` in an HTML page names a function that the

panel-changelog · 6

The panel changelog is generated from git history. These tests fail when

panel-defaults · 7

PANEL_DEFAULTS — the constant cannot drift from its own evidence.

panel-provenance · 9

The lender panel has one date — PANEL_META.ratesAsAt — and everything that

payslip-read · 14

Reading a payslip into a job (js/payslip-read.js).

pdf-report · 6

The client PDF report is built from a pure model (buildPdfReportModel) so

phase0-parity · 4

Phase 0 — the enumerated gate (docs/designs/broker-crm-deal-files.md,

policy-qa · 9

Policy Q&A: the model sees panel data and a question — nothing else. These

probe-thresholds · 8

The threshold prober: is the search sound, and does every probed figure in

rate-review · 7

Rate review sheet: a human-in-the-loop refresh, because the majors render

rental-tax · 11

Rental income is taxed as income, the way the workbooks do (2026-09-03).

results-layout · 1

The lender comparison table is ~1,270px of column min-widths inside a card

results-sort · 7

The results table's column sort. sortResults() (calc-engine.js) reads the

scenario-export · 4

The Export button writes the loaded scenario to a .lendscope.json file.

scenario-recheck · 13

Scheduled scenario re-check: the function loads the SAME engine files the

share-links · 18

The share-links panel (js/share-links.js) — the surface that lets a broker

share-snapshot · 6

A share link is for a client or a referrer, not for a credit file. The

specialist-match · 16

Specialist lender matcher: every figure it asserts must carry a source of

sql-split · 2

The real-Postgres suite splits SQL files exactly the way scripts/apply-sql.py does.

statement-read · 11

Living expenses from a bank-statement export (js/statement-read.js).

structures · 7

Bridging, construction, company/trust borrowers and deposit bonds — each

tax-offsets · 6

Tax offsets and levies per lender: the ATO LITO schedule, the Medicare

tfn-wiring · 31

Where the TFN guard is actually attached.

tfn · 15

The TFN detector (js/tfn.js).

topbar-landmark · 5

The app top bar is a banner landmark on every signed-in page. It used to be

version-diff · 8

Version diff: diffScenarioInputs() walks the scenario input shape and

versions-and-digest · 7

Scenario version history and the panel email digest: SQL shape, function

workbook-fidelity · 7

The workbook-fidelity harness must load the NAB workbook into HyperFormula

workbook-mode · 12

Workbook mode: the calculator's "Verify with the lender's workbook" button

xlsx-late-icons · 3

The per-row Excel download icons, now that SheetJS and js/xlsx-export.js are

xlsx-tables · 8

Structured table references and the Excel-compatibility rewrites applied

ytd-months · 5

"Months elapsed" on a year-to-date income (js/calc-forms.js, 2026-09-11).

What LendScope does not claim