CtrlK
BlogDocsLog inGet started
Tessl Logo

testland/confirmation-testing-workflow

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

1.03x
Quality

94%

Does it follow best practices?

Impact

100%

1.03x

Average score across 10 eval scenarios

SecuritybySnyk

Passed

No findings from the security scan

Overview
Quality
Evals
Security
Files

task.mdevals/scenario-2/

BUG-7781 - the negative balance is gone from the wallet screen

Problem Description

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.

Output Specification

  1. Write 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.
  2. If it cannot move, the record must give the developer the precise observed-versus-expected difference and name the check that would have caught this, so their next attempt can be judged quickly.
  3. Do not modify src/wallet.js, tests/walletView.test.js, or the ticket.

Input Files

Extract the following files before beginning.

=============== FILE: issues/BUG-7781.md ===============

BUG-7781 - Concurrent withdrawals take a wallet below zero

Status: Fixed (awaiting verification) Reported: 2026-07-25 by finance-ops Fix commit: 5ad9f10 on main, merged 2026-08-11

Reproduction steps

  1. Wallet w_1 holds 1000 cents.
  2. Submit two withdrawals of 800 cents each, close enough together that both read the balance before either writes.
  3. Read the wallet as the customer sees it (getWalletView('w_1')). Observed: balanceCents: -600. Expected: balanceCents: 200 - the second withdrawal is refused with INSUFFICIENT_FUNDS and never applied.
  4. Read the stored row (readRow('w_1')). Observed: balanceCents: -600. Expected: the stored balance is never below 0.

Comments

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).

SKILL.md

tile.json