The Outcomes — Section 05

QA & Test Readiness

Build the net before turning on the accelerator

Where You Are Now

Some unit tests. Nothing enforces them.

That combination matters more than it sounds. Tests that do not block a merge are tests nobody maintains, because breaking them costs nothing. They drift, then get skipped, then get deleted in a cleanup. So regression confidence on n.tasc comes from experienced people remembering what is fragile.

That works until throughput goes up. And putting throughput up is exactly what this programme does.

What happens if you speed up without the net

More change volume agents are working Memory-based regression unchanged More escaped defects QA becomes the bottleneck Trust collapses team goes slow on purpose net effect: no gain, plus damage SO: NET FIRST (STAGE 2), THEN GENERATION (STAGE 3) Enforced CI gate red build blocks the merge Characterization net pins what exists today Golden datasets critical logic checked on every change

Why this matters more for n.tasc than for most products

A defect in a CMS is embarrassing. A defect in a business-critical calculation produces a number a client acts on. A defect in a rule engine means a check that should have fired stays silent. In n.tasc the blast radius is a client's operations and regulatory standing, not a support ticket.

Three Layers of Net

Different problems. None replaces the others.

What each layer is for
Built in this order during Stage 2
1
Characterization — pin what already exists
Problem: most of n.tasc has no spec to test against. Writing one first takes months. Fix: run the code, capture what it does, assert it stays that way. Generated by an agent, at a rate no human backfill would match.
2
Specification — test what is new
Problem: new work needs tests against intent, including the cases people forget under pressure. Fix: one test per acceptance criterion, traceable both ways, with negative and boundary cases required, plus React Testing Library component tests and Playwright journeys for the React UI.
3
Golden datasets — check the numbers, not the code path
Problem: for business-critical calculations, “it ran without throwing” proves nothing. Fix: frozen scenarios with known-correct outputs, re-run on every change that touches the restricted zone.

Where the effort goes, by layer

GOLDEN DATASETS Few. Expensive to build. Built with your domain owners. Highest value per test. INTEGRATION + UI JOURNEYS real database, real backend APIs, Playwright on the React UI Moderate count. Catch cross-layer breaks. UNIT + CHARACTERIZATION fast, many, mostly agent-generated — this is where the backfill lands Thousands. Run on every commit.

Golden Datasets for Critical Logic

The highest-value test asset here. Also the one that needs your domain owners most.

For anything that produces a number or a decision a client acts on — business-critical calculations, rule engines, thresholds and aggregations — unit tests are not enough. The hard part is not whether the code runs. It is whether the number is right.

How a golden dataset works

Known inputs synthetic portfolios built with your domain owners Reference outputs agreed once, then frozen Changed risk code runs the same inputs Compare every difference reported including the 4th decimal Human decides named domain owner agent cannot pass it WHERE THE DATA COMES FROM — AND WHERE IT MUST NOT Synthetic only. Built with your domain owners. Never an extract of live client data — that puts real client records in a repo, a fixture, and an agent's context.
Scenario familyWhat it pinsWhy it earns its place
Core calculation pathBaseline arithmetic on the most-used flowsEverything hits this path constantly. A regression is wide and immediate
Multi-step calculationsChained rules, offsets and derived valuesThe most intricate logic in the product. Easiest to break subtly
Cross-entity aggregationRoll-ups across accounts, segments and groupsAggregation bugs hide behind correct per-item results
Limit edgesBehaviour at, just under and just over a configured limitBoundary handling is where threshold logic actually fails
Upstream integrationsValues derived from external and back-office inputsBreaks for reasons outside the calculation engine
Degraded inputsStale data, missing upstream feed, partial input file, empty data sets, expired recordsHow the system behaves on bad input is a business decision, not an error path
Rule-trigger scenariosSynthetic cases that must and must not trigger each ruleProves alerts and checks still fire. A false negative is invisible until it is critical

This is the biggest ask in the plan

Roughly two to three days of domain-owner time per scenario family. It cannot be handed to the agents, because the datasets exist to check the agents. If this time is not protected in weeks five to eight, Stage 2 slips and the pilot slips with it. We would rather flag it now than report it as a variance in week nine.

Test Data and Environments

The practical things that stall most testing efforts in this domain

🔑

No production data

  • Synthetic client codes, accounts and transactions
  • Recorded, replayable upstream data instead of a live feed
  • Deterministic clocks. Behaviour depends on time of day
  • Datasets versioned with the tests that use them
💾

Real DB, throwaway instance

  • Containerised database per pipeline run
  • Real schema and migrations deployed, because that is where data rules live
  • Seeded from a known baseline, torn down after
  • Kills the “works on the shared test server” class of failure
⏱

Intraday time simulation

  • Pre-open, continuous session, post-close, settlement
  • Cutoffs and scheduled jobs tested at the boundary times
  • Feed interruption and recovery mid-session
  • Near impossible to test manually with any reliability
⚖

Coverage targets by zone

  • Critical business logic: high, non-negotiable, plus golden datasets
  • Integration / API: every endpoint hit at least once
  • UI: critical journeys, not a percentage
  • Peripheral legacy: characterization where touched, not everywhere

No single coverage number

A blanket target makes people write tests to satisfy the number, and spends the same effort on a settings screen as on a calculation engine. Targets are set per zone, weighted to where a defect actually costs something.

What Changes for QA

The role gets harder and more valuable, not smaller

QA time today
  • Writing routine test cases by hand
  • Running the same regression journeys, release after release
  • Working out what actually changed before testing it
  • Chasing developers for what a change was supposed to do
  • Last line of defence, under time pressure, where being wrong is expensive
→
QA time after
  • Reviewing generated cases, mainly hunting what they missed
  • Owning the golden datasets and deciding what correct means
  • Exploratory testing where automation is weakest
  • Opening a UAT pack that already lists what changed and what to test
  • Designing the test strategy rather than executing it repeatedly

“Testing is faster and more reliable” — concretely

The suite runs on every commit and blocks the merge. Test cases arrive with the change instead of after it. Critical logic is checked against a frozen reference. QA arrives at UAT with a pack telling them where to look. The speed comes from removing the repetitive part. The reliability comes from the parts that no longer depend on anyone remembering.