Document regression evidence for banks and insurers

Proof that your customer documents did not change.

Tekmor compares every PDF your document engine produces against its approved baseline, layer by layer, and writes evidence that a bank's own change process accepts. Identical inputs produce byte-identical results.

Exhibit 1 · Home insurance PDS, page 4, "What we do not cover" text layer: fail (content) · visual: 98.23% SSIM
Baseline, locked Baseline clause: We do not pay for damage caused by gradual deterioration, rust, rot, mould or wear and tear.
Candidate, flagged Candidate clause with Tekmor's overlay: We pay for damage caused by gradual deterioration, with the changed words boxed in red and amber.
The Tekmor comparison workspace showing baseline and candidate pages side by side, with the diff panel listing five visual regions and three text changes.
A template edit turned an exclusion into a promise to pay. No pixel-level tool flags it as more than a reflow. Tekmor's layout-aware text layer reports it as a content change, in reading order, with the exact words before and after.
5deterministic check layers on every page
31 / 31planted defects caught on the labelled test pack
0false alarms on identical, rebuilt and masked controls
2×every CI build runs the campaign twice and diffs the bytes

What a document engine change breaks

A composition engine upgrade, a template edit, a new font pack or a data-mapping fix re-renders policies, statements, notices and invoices by the hundred thousand, and almost nobody reads them afterwards. The defects that matter are small. The table lists ten from the test pack.

Planted defectDocumentLayer that catches it
Exclusion "We do not pay" becomes "We pay" for gradual deteriorationHome insurance PDStext
Financial Claims Scheme section droppedHome insurance PDStext
Closing balance taken from another accountBank statementdata fields text
Total due rounded down to the dollarPostpaid mobile billdata fields
Pay-by date printed one day lateArrears noticedata fields
Default-notice fee clause added to the privacy sectionArrears noticetext
PDF/A claim removedBank statementstructural
Body font no longer embeddedTax invoicestructural
BPAY barcode printed 40 grey levels lighter, past the zone tolerancePostpaid mobile billvisual
Cooling-off paragraph rewritten in legal jargonHome insurance PDSplain language

Every row is a case from Tekmor's frozen test pack: fictional Australian documents built in a pinned container, each with one planted change and a written expectation. Tekmor caught all of them on the run of 4 October 2026 and stayed silent on the controls.

The governing rule

The deterministic engine is the source of truth and produces the evidence. AI is advisory. It speeds people up and never issues a verdict.

Every pass or fail comes from repeatable, version-pinned checks. Run the same inputs twice and the results are byte-identical. The toolchain (rasteriser, text extraction, fonts) is pinned in one container image whose digest is recorded on every baseline and every run, so a changed document and a changed toolchain are recorded as different events.

The determinism contract
f(payload_hash,
  template_version,
  toolchain_manifest_hash,
  zone_config_hash,
  render_dpi) -> results JSON bytes

# pure. identical inputs, identical bytes.
# no floats, no timestamps, no row ids inside.

Results JSON is canonical: sorted keys, integers and fixed-format decimals only, entities named by variant key and content hash. The CI build runs the 12-variant campaign twice and fails on a single differing byte. A change to any pinned constant must ship with a manifest version bump and its measured effect on the scorecard, or the build refuses it.

How a run works

  1. Define the baseline

    A versioned variant matrix, mask and tolerance zones for dates and barcodes, a render DPI, and approved golden masters. Or import the composition templates and build a scenario catalogue with measured conditional-branch coverage.

  2. Run the campaign

    Dual engine (version A against version B), baseline compare (candidate against goldens) or inspection with no golden master. Variants run in parallel on queued workers and one failure never poisons the batch.

  3. Verify on five layers

    Visual, text, structural, data fields and plain language, each producing canonical results that are stored content-addressed before anyone looks at them.

  4. Triage by cause

    Failed checks are clustered into root causes with an AI severity opinion. Reviewers decide per cluster with a mandatory rationale. Content-level changes need a second, compliance-privileged approver.

  5. Issue the evidence

    Append-only approvals, a run report, a self-contained evidence pack an auditor verifies offline, and promotion of the run to the next approved baseline.

Visual

Pixel and SSIM comparison per page, masked by declared zones with per-zone tolerances. Diff regions are merged and listed with their pixel counts.

Catches: a BPAY barcode printed past its tolerance, a letterhead logo missing, a block shifted 6 pt.

Text

Layout-aware extraction in reading order, paired across documents, classified as insertions, deletions and moves. Reads only glyphs visible inside the clip, so clipped text reports as a deletion.

Catches: a flipped negation, a dropped section, two sections swapped, a long name clipped by a window box.

Structural

Font inventory per page with substitutions named baseline to candidate, document metadata, page size and PDF/A conformance.

Catches: an unembedded body font, an italic face substituted, A4 swapped for US Letter.

Data fields

Values printed on the page checked against the source data payload, with Australian date and currency formats, rounding and totals.

Catches: a total rounded down, a blank BSB, a closing balance from the wrong account.

Plain language

Repeatable readability, sentence length, passive voice and jargon scores, per document and per section, in regression mode against the baseline.

Catches: a cooling-off clause rewritten in legalese, a privacy paragraph flipped to the passive voice.

The screens a reviewer signs from

Every screen below is Tekmor running the test pack: fictional insurer and bank documents, with the engine output and model opinions as recorded. Click any screenshot to enlarge it.

Properties of the evidence

Evidence is useful to an auditor only when it cannot be altered after the fact and can be checked without trusting the tool that produced it. Each property below meets that test.

Content-addressed artifacts

Every PDF, page image, overlay and results JSON is stored under its SHA-256 hash and committed before comparison begins. Verification refuses to run without both sides' artifact rows on record.

Append-only at the database

Results, artifacts, approvals and AI invocations have UPDATE and DELETE revoked from the application role and triggers that reject them even from the owner. A reversed decision is a new row that references the one it supersedes.

Toolchain identity on every run

The container image digest and the manifest hash of every pinned constant are recorded on baselines and runs. A toolchain upgrade requires a new baseline approval; a historical run re-executes with its recorded digest to identical results.

An evidence pack an auditor verifies offline

A self-contained zip: manifest with every artifact hash, the deduplicated artifacts, and a summary PDF. A standard-library Python script checks it with no platform access and rejects any tampered byte.

Every AI call logged

Purpose, model, prompt hash and response artifact are recorded per invocation. Each opinion in the UI links to exactly what the model saw and said.

No document content in logs

Secrets come from the environment, error detail never carries document text, and documents, data and evidence stay inside your environment.

The AI advisory layer

Every deterministic feature works with AI disabled or unavailable. With it enabled, the advisory layer turns thousands of diffs into a handful of decisions, and every one of its outputs is labelled as an opinion.

✦ AI opinionDefect clustering and severity

Failed checks grouped by likely root cause, each with a cosmetic, minor or content severity and a confidence. Content clusters are excluded from bulk approval and need four eyes.

✦ AI opinionResolution advisor

Likely cause, suggested fix and owning team per cluster, citing the checks and pages it drew on. Reviewers rate it helpful or not, and the rating is stored.

✦ AI opinionSemantic diff

Meaning-preserving versus meaning-altering text changes, with a rationale. A meaning-altering finding forces content severity on its cluster.

✦ AI opinionInspection without a golden master

Vision review of newly created documents for overlap, truncation, orphaned headings, broken tables and a mandatory-content checklist. Findings link to the page images.

✦ AI opinionTest plan and test data proposals

Scenarios and data for the template branches the catalogue does not yet reach. A proposal enters the catalogue only after a deterministic reach check proves the branch and a person accepts it.

✦ AI opinionNarrative report and plain-language assessor

An audit-ready narrative drafted from evidence only, edited before issue. A qualitative language assessment that never flags mandated regulatory phrasing.

Spend is an exact integer per invocation, summed per feature, run and period, with a monthly cap that stops AI calls before a surprise bill while the deterministic flow continues unaffected. Each feature routes to its own provider, and a production licence refuses the built-in mock.

The measured catch rate

Tekmor is proved against a labelled corpus of realistic documents: five families, each case a single planted change with its expectation written from the planted change before the engine ran. The scorecard it produces is a committed floor in the build.

A code or constant change that lowers any class's catch rate or attribution rate, raises a false-alarm rate, or alters a pinned constant without a matching floor update fails the build before it merges.

Test pack tekmor-v1, run of 4 October 2026
Document families5
Cases (defects, controls, edge cases)43
Planted defects expected31
Planted defects caught31
False alarms on identical, rebuilt and masked controls0
Known gaps open on that date3

Families: home insurance policy schedule and PDS, bank transaction statement, tax invoice, arrears notice letter, postpaid mobile bill. The three gaps are tracked as a stated outcome. The current committed floor records every defect class at full catch rate.

The deployment footprint

Your cloud, your tenancy

Single-tenant deployment into the customer's environment. Documents, data and evidence never leave it, and AI calls go only through the provider path you approve.

Postgres plus one image

The API, the UI and every worker ship as one digest-pinned container image. The footprint is Postgres and that image. Backup is one pg_dump and one directory.

Deployed by one command

A release reaches a host by one command from a CI-built image, verified by digest, with migrations frozen as DDL. One health endpoint covers every process on the host.

A deterministic CI/CD gate

Scoped API tokens, a ready-made GitHub Action, and a pass/fail summary derived from deterministic results only. Templates are regression-tested inside the release pipeline.

Separated duties

Test lead, reviewer, compliance and admin roles enforced server-side, admin actions audited. Local accounts today, with sign-in through the organisation's own identity provider on the roadmap.

A licence that fails safe

A signed licence carries entitlements and caps. An expired or missing licence blocks creating new runs only. Reading and exporting evidence is never blocked.

A demo on documents like yours

A demo takes an hour: we run the test pack live, then a family of your own documents if you can share redacted samples. Tekmor is built by Agenta, an Australian consultancy, and runs today on a Tekmor-operated staging host deployed by one command.

Keith RowellPrincipal Consultant, Agenta
keith@agentaconsulting.com
Danny MalonePrincipal Consultant, Agenta
danny@agentaconsulting.com