Derives human-readable manual test cases from stateful behavior: identify states, events, transitions, and guard conditions, draw the state table including invalid (empty-cell) transitions, choose a coverage level (all states, valid transitions / 0-switch, transition pairs / 1-switch per Chow, all transitions including invalid ones), then derive one test case per coverage item as an event sequence with per-step expected states (ISTQB CTFL v4.0 section 4.2.4). A deep single-technique walkthrough rather than a broad multi-lens case matrix; the output is manual step/expected cases rather than parameterized test code, and it covers how cases are derived rather than how a case record is structured. Use for lifecycle entities (accounts, orders, subscriptions), workflows, and UI wizards where the response to an event depends on the current state.
78
93%
Does it follow best practices?
Impact
77%
0.81xAverage score across 10 eval scenarios
Passed
No findings from the security scan
The app pairs with our Bluetooth kitchen scale. The user opens the Devices screen and taps Scan, the app lists nearby scales, the user picks one, the scale shows a six digit code on its display, and the user types it into the app. If the code matches, the scale is paired and starts streaming weight readings. If it does not match, pairing is abandoned and the user is back to where they started with no device.
Bluetooth being what it is, the connection drops constantly. A drop during the scan or during the code entry throws the user back to having no device. A drop on a paired scale is different: the scale stays paired but shows as unavailable until the user taps Scan again to go looking for it.
The Scan button is disabled while a scan is already running, and the app hides the device list once a device has been picked. That is the UI. The pairing service underneath still receives events from the Bluetooth stack, and the stack delivers them late, out of order, and sometimes twice - a code result for a pairing attempt the user abandoned thirty seconds ago will still arrive.
Last release QA raised one ticket, "app misbehaves when stale pairing events arrive", listing six things to try in a single reproduction. A developer fixed the first thing on the list, the ticket was retested and passed, and two of the remaining five were found by a customer a month later. We would like the pack written so that cannot happen again.
Produce docs/pairing-tests.md containing:
Each case must be able to fail for exactly one reason.
Firmware behaviour, weight accuracy, and the Bluetooth stack itself are out of scope. Do not write code - the team runs these by hand against a real scale.
Extract the following files before beginning.
=============== FILE: docs/pairing-service.md ===============
| Situation | Devices screen shows |
|---|---|
| Unpaired | "No scale connected" and a Scan button |
| Discovering | Spinner and a growing list of nearby scales |
| Pairing | Code entry field, six digits |
| Paired | Scale name, battery level, live weight |
| Unavailable | Scale name greyed out, "Out of range", Scan button |
| Event | Delivered by |
|---|---|
| scan-started | User taps Scan |
| device-selected | User taps a scale in the list |
| code-accepted | Bluetooth stack, after the scale validates the code |
| code-rejected | Bluetooth stack, after the scale rejects the code |
| connection-lost | Bluetooth stack, on link loss or adapter off |
These five are the only events the service handles. The stack does not guarantee ordering and reissues events on reconnect, so any of the five can arrive in any situation.
The situations above are what the app renders. The stack's own connection
states (CONNECTING, BONDED, DISCONNECTED_TIMEOUT) are not the same thing
and are not visible anywhere in the UI.