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-3902 (due dates land a day early for users east of UTC+12) is in Fixed
against e77c410. Last night's full suite - 1,842 tests - ran on the same
build staging is serving and came back green; the log is in
ops/nightly-9042.txt.
The release manager's position is that a green nightly settles it, and she has asked for one paragraph she can drop into the go/no-go document. That document has a single "status" column that gets read as the answer to two different questions: is this defect actually fixed, and is the release safe to ship.
The reproduction that failed when the defect was raised is committed as
tests/dueDate.repro.test.js; the ticket records it red on the commit before
the fix.
qa-record/BUG-3902.md: whether this defect can move to Verified,
the evidence, and the exact scope of what that evidence supports - written
so that a reader of the go/no-go document cannot take it as a broader
assurance than it is.npm test must still
pass when you are done.src/dueDate.js, the existing tests, or anything under ops/.Extract the following files before beginning.
=============== FILE: issues/BUG-3902.md ===============
Status: Fixed (awaiting verification)
Reported: 2026-07-18 by a.tui (Auckland, UTC+13 during DST)
Fix commit: e77c410 on main, merged 2026-08-08 (parent 1c93bb2)
Automated: tests/dueDate.repro.test.js, added 2026-07-19, red at 1c93bb2
("expected '2026-04-07', got '2026-04-06'").
=============== FILE: package.json =============== { "name": "tasks-service", "version": "9.1.0", "private": true, "scripts": { "test": "node --test" } }
=============== FILE: src/dueDate.js =============== 'use strict';
function dueDateFor(createdAtIso, offsetMinutes, days) { const createdMs = new Date(createdAtIso).getTime(); const local = new Date(createdMs + offsetMinutes * 60000); const due = new Date( Date.UTC(local.getUTCFullYear(), local.getUTCMonth(), local.getUTCDate() + days), ); return due.toISOString().slice(0, 10); }
function formatDueLabel(isoDate) {
const [y, m, d] = isoDate.split('-');
return ${d}/${m}/${y};
}
module.exports = { dueDateFor, formatDueLabel };
=============== FILE: tests/dueDate.repro.test.js =============== 'use strict';
const test = require('node:test'); const assert = require('node:assert/strict'); const { dueDateFor } = require('../src/dueDate');
test('BUG-3902: 7-day due date for a UTC+13 user created late in the UTC day', () => { assert.equal(dueDateFor('2026-03-30T22:30:00Z', 780, 7), '2026-04-07'); });
=============== FILE: tests/formatting.test.js =============== 'use strict';
const test = require('node:test'); const assert = require('node:assert/strict'); const { formatDueLabel } = require('../src/dueDate');
test('due label is day/month/year', () => { assert.equal(formatDueLabel('2026-04-07'), '07/04/2026'); });
=============== FILE: ops/checks.txt =============== $ curl -s https://tasks.staging.internal/internal/build-info {"service":"tasks-service","commit":"b309fe4","branch":"main","deployedAt":"2026-08-08T19:44:02Z"}
$ git merge-base --is-ancestor e77c410 b309fe4; echo $? 0
=============== FILE: ops/nightly-9042.txt =============== Nightly suite 9042 build commit: b309fe4 branch: main started 2026-08-12T01:00:04Z
unit 1,204 passed integration 512 passed end-to-end 126 passed
1,842 passed, 0 failed, 14 skipped (28m 51s)
Exit code 0