TSD-9273 manual QA guide for any executed-unit matrix case
Manual QA guide for reproducing one chosen executed-unit matrix case on a TS, entering the requested CZ upgrade flow, and comparing the real DecisionFlowLog against the expected units.
- Namespace:
replace-via-cli
Apply the required TS settings before starting the flow:
twisto ts settings replace-via-cli
Paste or merge this payload in the editor:
overrides:
USE_DEV_DECISION_FLOW_SPECIFICATIONS: false
CREDIT_NAVIGATOR_WSDL: os.path.join(PROJECT_ROOT, "resources", "credit_navigator",
"mock_api.wsdl")
EMAIL_OFFLINE_VALIDATION: true
DISABLED_KOS: '["FOREIGNER"]'Use the steps below as the primary QA guide. Backend automation snippets are included as an exact reference and can also be executed through the shared TS runner.
Export the matrix dimensions for the case you want to test, then run the helper below. It prints the expected config.name, the expected executed units, and the case-specific notes.
Frontend / API steps:
- Choose
MATRIX_MODEasbaselineorpatched. - Choose
REGISTRATION_KINDasneworexisting. - Choose
FLOWasclassic,spi,split, orbankid. - Choose
NRKIandPREPENDas0or1. - On patched
newcases withPREPEND=1, also chooseREPIas0or1. - On patched
newcases withPREPEND=0, expect the legacy flow shape;REPIdoes not change the executed-unit sequence there. - If
NRKI=1and you want a prepend-sensitive case, chooseSCORE_RANGE=Ffor good score range orSCORE_RANGE=Afor non-good score range.
Shell command (scripts/print_case_reference.sh):
#!/usr/bin/env bash
set -euo pipefail
python3 tmp/tsd-9273/playbooks/manual-qa/scripts/print_case_reference.pyApply the chosen matrix flag values and the entry-path flags in Django Admin before you start or rerun the registration.
Django Admin checks:
- Open Django Admin → Features → Features.
- Set
NRKIaccording to the chosen case. - Set
NRKI_PREPEND_FOR_GOOD_SCORE_RANGEaccording to the chosen case. - On patched
newcases withPREPEND=1, setCZ_REPI_ENABLEDaccording to the chosen case. - On baseline, on
existing, or on patchednewwithPREPEND=0, you can leaveCZ_REPI_ENABLEDunchanged because it does not affect the executed-unit sequence there. - For
classic, setCZ_MULTISTEP_RISK_ONBOARDING_ENABLED=0andCZ_BANKID_REGISTRATION_ENABLED=0. - For
spi, setCZ_MULTISTEP_RISK_ONBOARDING_ENABLED=0andCZ_BANKID_REGISTRATION_ENABLED=0. - For
split, setCZ_MULTISTEP_RISK_ONBOARDING_ENABLED=100andCZ_BANKID_REGISTRATION_ENABLED=0. - For
bankid, setCZ_MULTISTEP_RISK_ONBOARDING_ENABLED=100andCZ_BANKID_REGISTRATION_ENABLED=100. - Use a unique email address and a unique CZ phone number for every registration run.
- On TS, use OTP
123456unless the page shows a different generated code. - Use normal adult CZ customer data, for example name
TSD 9273 Tester, addressSokolovská 47/73, Praha, 18600, income20000, expenses1000, and loan repayments2000.
Use the entry path for the selected FLOW, then create a new registration or rerun an existing one.
Frontend / API steps:
- For
classic, open the legacy CZ registration path, for example/registrace/. - For
classic, complete the registration with unique email, phone, adult CZ personal ID, CZ citizenship, CZ address, income, expenses, loan repayments, education, family status, and non-PEP value. - For
classic, let the upgrade scoring check be created; if the UI stops before scoring execution, open the related upgrade request or check in Django Admin and run the scoring action normally used for classic registrations. - For
classic, later confirm that the storedconfig.nameisCZUpgradeFlowSpecificationorCZUpgradeFlowSpecificationV2, depending on the case. - For
spi, open the flow-app onboarding path, for example/start/onboarding/. - For
spi, submit a unique email address and the email OTP. - For
spi, continue from the additional-info intro, submit a unique CZ phone number, and submit the SMS OTP. - For
spi, submit password1qaz@WSX, nameTSD 9273 Tester, and addressSokolovská 47/73, Praha, 18600. - For
spi, accept CZ account agreements withtermsPrivacy=true,nrki=true,telco=true,marketing=false,isPoliticallyExposed=false. - For
spi, submit country of birthCZ, a valid adult CZ personal ID, educationPrimary, family statusSingle, childrenNone, income typeEmployment, employment type1, monthly income20000, monthly expenses1000, and monthly loan repayment2000. - For
spi, continue untilRiskCheckProcessingStepis reached and the upgrade scoring check exists. - For
spi, later confirmSPICZUpgradeFlowSpecificationorSPICZUpgradeFlowSpecificationV2. - For
split, open the flow-app onboarding path, for example/start/onboarding/. - For
split, submit a unique email address and the email OTP. - For
split, continue from the additional-info intro, submit a unique CZ phone number, and submit the SMS OTP. - For
split, submit password1qaz@WSX, nameTSD 9273 Tester, and addressSokolovská 47/73, Praha, 18600. - For
split, continue untilRiskCheckProcessingStepis reached and the upgrade scoring check exists. - For
split, if the page proceeds through CZ account agreements instead of the step-by-step risk checkpoint, discard the run and re-check thatCZ_MULTISTEP_RISK_ONBOARDING_ENABLED=100was active before the run started. - For
split, later confirmSplittedCZUpgradeFlowSpecificationorSplittedCZUpgradeFlowSpecificationV2. - For
bankid, open the flow-app onboarding path, for example/start/onboarding/. - For
bankid, submit a unique email address and the email OTP. - For
bankid, choose BankID when the BankID intro step is shown. - For
bankid, complete BankID authentication through the available TS sandbox or mock path. - For
bankid, wait until the flow reaches BankID confirmation and confirm the BankID customer data. - For
bankid, submit BankID consent withtermsPrivacy=true,nrki=true,telco=true,marketing=false. - For
bankid, submit a unique CZ phone number and the SMS OTP. - For
bankid, submit password1qaz@WSXand educationPrimary. - For
bankid, continue untilRiskCheckProcessingStepis reached and the upgrade scoring check exists. - For
bankid, confirm in Django Admin → Customer → Bank ID connection logs that the related session has a successfulBankIdConnectionLog. Without it this run is not a BankID flow verification. - For
bankid, later confirmBankIdUpgradeFlowSpecificationorBankIdUpgradeFlowSpecificationV2. - If you hit the wrong flow, discard the run and retry through the correct entry path.
- For
new, start a fresh registration. - On patched
new,PREPEND=1should resolve to aV2config;PREPEND=0should stay on the legacy config. - For
existingon baseline, create the first run, keep the same request, then trigger a rerun of that request. - For
existingon patched, first create the first run withPREPEND=0so the first stored flow stays legacy, then switch flags to the target case and rerun the same request. - The created
Checkmust be production-like:is_production=True. If the resultingDecisionFlowLogpoints tocheck.is_production=False, discard that run and create the case through a production-key path. - When the case depends on
SCORE_RANGE, choose the Credit Navigator mock sample that yields the chosen score range and verify the realCBScoreRangeafterwards in the stored NRKI response.
Read the real executed and skipped units from the chosen DecisionFlowLog and compare them to the expected case from step 2.
Shell command (<inline>):
DECISION_FLOW_LOG_ID=<decision-flow-log-id>
python3 ../environment/tripping-avenger/tools/ts_testing/ts_django_shell_runner.py <ts-namespace> --script tmp/tsd-9273/playbooks/manual-qa/scripts/inspect_decision_flow_log.py --var DECISION_FLOW_LOG_ID=${DECISION_FLOW_LOG_ID} --prettyDjango Admin checks:
- Open Django Admin → Scoring → Decision flow logs.
- Open the relevant
DecisionFlowLog. - Copy its numeric id into
DECISION_FLOW_LOG_ID. - Confirm that the related
Checkhasis_production=True. - Confirm that
config.namematches the expected config from step 2. - Run the helper below from the repository root and replace
<ts-namespace>plus<decision-flow-log-id>with the tested values. - Compare
executed_unitsfrom the helper output toexpected_executed_unitsfrom step 1. - On patched
newV2cases, treatskipped_unitsas informative only; the matrix is defined by executed units. - If the case depends on
SCORE_RANGE, also confirm the storedCBScoreRangein the related NRKI response.
Run this helper when you need a quick TS proof that a production-like patched new/classic/NRKI=1/PREPEND=1/REPI=0/SCORE_RANGE=A case reaches the registry units and matches the expected matrix. The helper isolates unrelated pre-registry TS blockers so the check focuses on the NRKI/REPI unit order.
Shell command (<inline>):
python3 ../environment/tripping-avenger/tools/ts_testing/ts_django_shell_runner.py <ts-namespace> --script tmp/tsd-9273/playbooks/manual-qa/scripts/verify_production_matrix_smoke.py --pretty --exec-timeout-seconds 900