Procedure for proving that a claimed defect fix actually reached the build under test and actually works. Covers the merge-base ancestry check that proves the running build contains the fix commit rather than trusting a version label, the priority order for choosing which reproduction to re-run, and the VERIFIED / NOT FIXED / BLOCKED verdict table whose governing rule is that any ambiguous, flaky, or unreproducible result resolves to BLOCKED and is never guessed. Scoped to ISTQB confirmation testing (does this specific fix work?), not regression testing (did the fix break something else?), and not triage or severity assignment. Use when a developer has marked a defect Fixed and someone must decide whether it moves to Verified or back to Reopened.
99
94%
Does it follow best practices?
Impact
100%
1.03xAverage score across 10 eval scenarios
Passed
No findings from the security scan
BUG-7781 came from finance: concurrent withdrawals could take a wallet below
zero, and the customer saw a negative balance. The developer shipped 5ad9f10
and added a test; the ticket is in Fixed and the wallet screen no longer shows
a negative number, which is the thing finance complained about.
Finance has asked whether they can stop running their daily reconciliation query. I would rather answer that from the ticket's own steps than from the screen, so I want the four reported steps walked in order and the results written down.
Staging is on e0ff31d; the containment check is in ops/checks.txt. The fix
is not mine to change.
qa-record/BUG-7781.md: whether this defect can move to Verified,
with the result of each of the four reported steps recorded individually
against the expected result the ticket states for it, and real output rather
than a description.src/wallet.js, tests/walletView.test.js, or the ticket.Extract the following files before beginning.
=============== FILE: issues/BUG-7781.md ===============
Status: Fixed (awaiting verification)
Reported: 2026-07-25 by finance-ops
Fix commit: 5ad9f10 on main, merged 2026-08-11
w_1 holds 1000 cents.getWalletView('w_1')).
Observed: balanceCents: -600.
Expected: balanceCents: 200 - the second withdrawal is refused with
INSUFFICIENT_FUNDS and never applied.readRow('w_1')).
Observed: balanceCents: -600.
Expected: the stored balance is never below 0.2026-08-11 v.sorokin: Fixed in 5ad9f10. Added a test that the wallet
view never goes negative.
=============== FILE: package.json =============== { "name": "wallet-service", "version": "3.3.0", "private": true, "scripts": { "test": "node --test" } }
=============== FILE: src/wallet.js =============== 'use strict';
const WALLETS = new Map();
function reset() { WALLETS.clear(); WALLETS.set('w_1', { id: 'w_1', balanceCents: 1000 }); }
reset();
function withdraw(walletId, cents) { const wallet = WALLETS.get(walletId); if (!wallet) { return { ok: false, code: 'NOT_FOUND' }; } wallet.balanceCents -= cents; return { ok: true, balanceCents: wallet.balanceCents }; }
function getWalletView(walletId) { const wallet = WALLETS.get(walletId); if (!wallet) { return null; } return { id: wallet.id, balanceCents: Math.max(0, wallet.balanceCents) }; }
function readRow(walletId) { return WALLETS.get(walletId) || null; }
module.exports = { withdraw, getWalletView, readRow, reset };
=============== FILE: tests/walletView.test.js =============== 'use strict';
const test = require('node:test'); const assert = require('node:assert/strict'); const { withdraw, getWalletView, reset } = require('../src/wallet');
test('BUG-7781: the wallet view never shows a negative balance', () => { reset(); withdraw('w_1', 800); withdraw('w_1', 800); assert.equal(getWalletView('w_1').balanceCents, 0); });
=============== FILE: ops/checks.txt =============== $ curl -s https://wallet.staging.internal/internal/build-info {"service":"wallet-service","commit":"e0ff31d","branch":"main","deployedAt":"2026-08-12T11:26:08Z"}
$ git merge-base --is-ancestor 5ad9f10 e0ff31d; echo $? 0
=============== FILE: ops/reconciliation-2026-08-12.txt =============== Daily reconciliation, finance-ops, 2026-08-12. Wallets with a stored balance below zero: 14 (yesterday: 12).