←→ change slide · Home to top
SLIDE 01
Say this in the first minute
DEB JET has no AI feature.
There is nothing in the product to point an evaluation at, so “test the AI” cannot mean testing a feature. We read it the only way that makes sense: the AI is the evaluator, not the thing evaluated — an external model looks at DEB JET and reports what it sees.
That reading creates a second problem immediately. Slide 03 is about it.
SLIDE 02
What we are delivering is not a report. It is a pipeline that produces reports — for this loan, and for any loan after it.
That distinction matters commercially. A report answers one question once. This answers the same question every time a new journey ships, run by someone who was never in this room.
| Folder | Contains |
|---|---|
00-framework/ | Criteria, checklist, fixed prompts |
01-howto/ | The operating manual, EN/VI throughout |
02-scenarios/ | One folder per run, evidence inside |
03-ai-output/ | What we fed the AI, what it said — verbatim |
04-report/ | The four reports |
scripts/ | The runner and the packager |
site/ | The LAN-hosted results view |
Real data inside 02-scenarios/
Every number below is read straight from the seven evidence.json files. None of it is typed by hand.
Backing: 01-howto/README.md · track-a-agent.md · track-b-chat.md
SLIDE 03
If the AI is our instrument, then the AI can be wrong — and a wrong instrument produces a confident report full of things that never happened. So we split the evaluation in two.
| Part A | Part B | |
|---|---|---|
| On trial | The DEB JET system | The AI’s own assessment |
| AI’s role | Analysis instrument | Subject under test |
| Criteria | 8 — A1…A8 | 4 — B1…B4 |
| Answers | “What is wrong, what do we fix first?” | “Can we trust what the AI said?” |
The design decision everything rests on
Part B exists so Part A is not built on invented findings. An AI claim citing evidence that is not in the input gets discarded before it reaches the report — no matter how plausible it sounds.
SLIDE 04
Before we wrote a single criterion, we surveyed the system and listed what could actually be captured.
| Signal | Capturable? |
|---|---|
| Step load time | Yes |
| Field counts: total / editable / empty | Yes |
| Validation error text, verbatim | Yes |
| Whether a field blocks Next when empty | Yes |
| Data loss on return | Yes |
| Console errors | Yes |
| Time-on-step by a real human | No |
The rule
A criterion that cannot be evidenced by something in this table does not belong in the checklist.
Note the last row says No. Scripted runs do not model human reading time — so no criterion in this framework claims anything about how long a real broker takes. The framework is honest about its own edges, and that is what makes the parts inside the edges trustworthy.
SLIDE 05
| # | Step | Output |
|---|---|---|
| 1 | Research what the system must do | Standards that apply |
| 2 | Standard — turn research into criteria | Part A + Part B |
| 3 | Checklist — make criteria checkable | Table of IDs |
| 4 | Scenario — run the journey | evidence.json + shots |
| 5 | AI assessment — fixed prompt, verbatim output | AI output |
| 6 | Comparison — audit the AI, then score the system | Part B audit → Part A |
| 7 | Feedback — the report the requester reads | comparison.md |
Criteria are written before anything is run. If you look at results first and then decide what counts as a problem, you are not evaluating — you are justifying.
Note where step 5 sits. The AI is asked fourth from the end, not first. By the time it sees anything, the criteria are frozen and the evidence is collected.
SLIDE 06
If you hand the AI your criteria and then check whether its output matches your criteria, you have tested nothing — you have tested whether the AI can repeat you. It can. Every model can.
Isolation is what makes the audit worth anything. When the AI independently finds something we found, that is corroboration. When it finds something we missed, that is value. When it claims something the evidence does not support, we catch it — that is quality control. All three happened.
SLIDE 07
P1 requires one of four conditions:
Condition 3 is not a usability concern. Under ASIC RG 273, the evidence of best-interests compliance comes predominantly from the broker’s own records. If the journey lets a broker finish without recording a reason, they cannot produce that evidence later. The consequence is not a bad experience — it is an unmet regulatory obligation that surfaces long after the loan settled.
Condition 4 separates a system defect from a per-loan configuration issue. Something reproducing on Refinance and Purchase is a defect in the product. That distinction is what makes a P1 claim defensible instead of assertive.
SLIDE 08
| Refinance | Purchase | New JET app | |
|---|---|---|---|
| strong | Round 1 | Round 1 | Round 3 |
| weak | Round 2 | — | Round 3 |
Round 1 ran the weak broker only on one route and the strong broker only on the other. We then concluded that weak brokers hit a wall strong brokers avoid.
That conclusion was wrong, and the way it was wrong is instructive. Persona was confounded with route. When two variables move together, you cannot attribute the effect to either one. We had evidence of a difference and no evidence at all about its cause.
This cell had to be closed twice. Round 2 closed it by crossing two different routes — still confounded, just less visibly. Round 3 closed it properly: same loan, same route, persona the only thing that moved. See slide 11.
The lesson for anyone reusing this
If persona and journey are not crossed, no statement of the form “weak brokers experience X” is supported by your evidence.
SLIDE 09
| Run | Loan | Journey | Persona | Round |
|---|---|---|---|---|
SC01-strong-refi | 009365 | /loanjet/ 15 tabs | strong | 1 |
SC01-strong-purchase | 008812 | /loanjet/ 15 tabs | strong | 1 |
SC02-weak-refi | 009365 | /loanjet/ 15 tabs | weak | 2 |
SC01-strong-refi-v2 | 009365 | /loanjet/ | strong | fix |
SC01-strong-jetsmsf | d3fe18dd… | /loanjet/ 15 tabs | strong | 3 |
SC02-weak-jetsmsf | d3fe18dd… | /loanjet/ 15 tabs | weak | 3 |
SC02-weak-smsf | 009387 | /loan/ — wrong route | weak | withdrawn |
SC01-strong-smsf | 009387 | /loan/ — wrong route | strong | withdrawn |
SC02-weak-smsf-v2 | 009387 | /loan/ — wrong route | weak | withdrawn |
Seven scripted runs, five of them valid. Three are withdrawn: they were created by clicking the wrong button and measured /loan/, the SMSF product, rather than the /loanjet/ journey the brief asked about. Slide 11 has the detail.
Those three are not deleted. The AI's round-1 assessment genuinely read one of them, so removing them would falsify the audit trail.
The packager is deterministic: same inputs give a byte-identical package. That is what makes two runs comparable rather than merely similar.
The packager is deterministic: same inputs give a byte-identical package. That is what makes two runs comparable rather than merely similar.
SLIDE 10
input-brokernote exists on all five valid runs but is required: false. A broker can pass the product step having recorded no reason at all.
This finding is stronger after the withdrawal, not weaker. It previously leaned partly on the field being absent on the other route — a contrast that has been dropped. It now rests on five runs of one route, three loans, both personas.
Rule: leaves no compliance record · reproduces on every loan. Engages ASIC RG 273.
All three populated runs — both loans, both personas — Next on an untouched product step moved forward with errorsShown: []. The AI found this independently; we had recorded it as an A6 observation without recognising it as P1.
Rule: reproduces on both loans.
On both round-3 runs: input-loanamount is present but disabled, Next is disabled, reasonShownOnScreen: null. A broker clicks Create new JET application and lands on a step where nothing can be typed and the journey cannot advance, with nothing on screen saying what is required first.
This finding originally cited two runs that have since been withdrawn. It was re-tested on the correct route and reproduced there — surviving a change of evidence base is the strongest thing about it.
Rule: blocks completion · reproduces across both personas. Needs manual confirmation before being reported as a defect — the field may be gated behind a selection the script never made.
Four successive malformed entries into loan amount produced an identical five-error list every time. All four were made on a withdrawn run — the finding describes a route that is not under test.
It could not be re-tested: on the two blank JET loans the amount field is disabled, so there was nowhere to put a malformed value. Withdrawn, not disproved — error-message quality on /loanjet/ is unmeasured.
Enter a value, navigate forward, come back — it is still there. Across all three populated loans, both personas. A3 passes cleanly, and should be reported as a strength rather than omitted for not being a problem. On the two blank loans it is not assessable — nothing could be entered to test persistence with, which is distinct from a failure.
Note the two loan states have opposite defects. A populated loan lets an empty form through; a newly created one blocks and will not say why. Both are on /loanjet/. Neither state tells the broker what is actually required.
SLIDE 11
| Signal | strong-refi | weak-refi | strong-jetsmsf | weak-jetsmsf |
|---|---|---|---|---|
| Route | /loanjet/ | /loanjet/ | /loanjet/ | /loanjet/ |
| Loan state | populated | populated | blank | blank |
| Next on empty form | advances | advances | disabled | disabled |
input-brokernote | optional | optional | optional | optional |
| Step marker | 11/11 | 11/11 | 11/11 | 11/11 |
The AI — looking only at the evidence — flagged the confound in our own scenario design. It was right. We ran the two missing cells and concluded that every difference tracks the journey.
That conclusion was also wrong. The two cells we added ran on /loan/ — the SMSF product's route, not /loanjet/. We closed the gap by introducing the very variable we were trying to eliminate. What we called a journey difference was a difference between two products.
Round 3 re-ran both personas on the same loan, on the same route. The table above is the result, and it gives a different answer:
Behaviour tracks the state of the loan, not the persona and not the journey. Three populated loans let an empty form through; two newly created ones disable Next. All five are on /loanjet/, so the route cannot be the cause.
No defect in this package is attributable to broker skill level. The matched pairs are identical on every captured signal.
Why those three runs passed every check we had
They measured accurately. They just measured the wrong product.
Internal consistency: passed. Reproduction across personas: passed. Re-testing against the live system: passed. Every check passed because every number was real — they simply described a different screen. What caught it was a person looking at a screenshot and saying “that is the wrong button”.
SLIDE 12
The most strongly evidenced finding in the report
55 / 55
Wrong.
activeTabMarked: false on 55 of 55 steps, across two journeys and both personas.
A bug in our own probe. It looked for the active class on the tab button; the marker lives on the .rc-steps-item ancestor. The probe could never have returned true — not once, under any condition.
The AI repeated the claim faithfully because our evidence package said so. It did exactly what it should have done. No amount of auditing the AI would have caught this — the AI was not the source of the error. We were.
What caught it was re-testing against the live system. We wrote verify-active.mjs, pointed it at DEB JET, and found the marker present and tracking correctly. We fixed the probe and repeated two runs; both report activeMarked: true on 11 of 11. A2-1 is a Pass.
One real finding survives the wreckage, now measured: aria-current is 0 on every step — the marker is visual only and is not exposed to assistive technology. That is genuine, it is P3, and it is nothing like what P1-2 claimed.
The line to take away
A tool that measures the wrong thing produces consistent, confident, wrong numbers — and consistency reads as proof.
Fifty-five out of fifty-five looked like certainty. It was a single bug, repeated fifty-five times.
SLIDE 13
Recorded so that no silence is read as a pass.
| Gap | Why it matters |
|---|---|
| A7-3 and A8-1 never instrumented | Both bear directly on P1-1 — the difference between “the field is optional” and “the record cannot be produced” |
| A4 guidance counted, not read | 23–63 helper elements per step; nobody checked whether the text helps |
| No step beyond the 11th was walked | Though 15 tabs exist |
| The blank-loan wall is unconfirmed | P1-4 rests on scripted observation only; needs one manual pass through the creation flow |
Error-message quality on /loanjet/ unmeasured | Following the withdrawal of P2-1 |
| Server-side persistence untested | One in-session probe only; no reload, no re-login |
| Accessibility untested | Beyond the aria-current finding |
| Single timing sample per step | So no timing figure from this round should be quoted as a system characteristic |
SLIDE 14
input-brokernote value on Purchase 008812 — stored value or placeholder?run-scenario.mjs at a new URL; the seven steps repeat01-howto/ is written for someone who was not here — two tracksNote on method
The audit was not ceremony. Two AI P1 claims — one resting on an unsupported reading of controls: 0, one misapplying the data-loss rule — would otherwise have reached the report as findings. Equally, the AI caught a confound in our scenario design that we had missed.
Both directions of correction are the point.
But a third direction mattered more than either. The AI audited our reasoning and we audited its reasoning, and neither of us asked whether the evidence described the right system. The lesson is recorded plainly in the pipeline: verify what the automation clicked, not only what it recorded. create-app.mjs now takes an explicit --kind=jet|smsf argument and logs which button it clicked, so the route is a recorded fact rather than an assumption.
If you only remember three sentences