The Problem

"It works on my machine" is not a release decision. A shipping app needs a repeatable, defensible answer to whether it's ready — one that survives a deadline, a tired developer, and a feature added last week.

Memory and good intentions don't scale. The process has to be written down, ordered, and gated.

The Approach

Three layers, narrowest net first: an automated adversarial test suite, then emulator validation, then a physical-device release gate. Every test has an explicit pass condition.

Known issues are triaged by severity and disclosed — not buried. The gate states, in writing, ship or don't ship.

56
Automated tests
22
Manual procedures
2
Physical test devices
Sev
Triaged known issues
Gate
Written ship / no-ship

56 automated tests (44 on-device adversarial checks + 12 unit tests) and 22 manual procedures, run on two physical handsets. Counts verified against the source before publishing. The automated suite has already earned its keep twice — it caught a readout-overflow defect, and later a teardown race that four rounds of code review missed (both documented below).


FreqCraft Mobile — QA Test SOP
Version 1.3  ·  2026-07-05  ·  Directive Craft LLC
App: FreqCraft Android 1.0.0 (Flutter/Dart)  ·  Status: ACTIVE — release QA procedure
Purpose. Define and execute pre-launch QA across three layers — an automated adversarial integration suite, emulator validation (Phase A), and physical-device release qualification (Phase B). Phase B is the release gate; the app bundle is not submitted to the store until every Phase B criterion is met.

Scope. FreqCraft 1.0.0 release candidate, Android only, including the live waveform visualizer and timed-session behavior. Out of scope: iOS, accessibility/TalkBack (deferred). Trigger: developer declares the build ready for QA — run the automated suite first, then Phase A, then Phase B.
Automated Coverage — Run First
The adversarial integration suite is the first gate. It runs the build through input it was never meant to receive, on a tethered device, and must pass clean before a human tests anything.
Location: integration_test/app_test.dart (44 on-device) · test/ (12 unit)
Run: flutter test integration_test -d <device-id>
Gate: 44 on-device adversarial checks + 12 unit tests — 56 total, all green before manual testing begins.
SUITEAdversarial Integration Suite
Confirm the app survives malformed and absurd input, mode and state transitions, and edge cases — automatically and repeatably.
Implementation note — no pumpAndSettle: the live waveform animates continuously, so it never returns and the suite would hang. Use pump(Duration) only.
Pass — 44/44 adversarial checks green on the tethered device, plus 12/12 unit tests. Any failure is fixed and the suite re-run before Phase A.
Phase A — Emulator Test Procedure
Environment: Android Studio AVD, Pixel 6 / API 33 / Android 13, 2048 MB RAM, 4 cores, flutter run from project root.
Result codes: PASS · FAIL · NOTE (emulator artifact — log and continue). Known emulator limitations (channel reversal at low beat frequencies, soft isochronic below 6 Hz, fade-timing drift under CPU load) are logged, not fixed.
A-1First Launch — Disclaimer Flow
Verify the disclaimer runs once on first launch and is not skippable.
Pass — disclaimer appears on first launch only, skipped on every subsequent launch.
A-2Main Screen — Static UI
Verify layout, labels, and static elements are correct.
Pass — all static elements present and correct, no legacy text visible.
A-3Mode Selector
Verify the mode toggle controls downstream UI correctly in both directions.
Pass — mode switch controls UI elements and advisory text correctly both ways.
A-4Numeric Field Behavior
Verify input fields accept correct values, handle edge cases, and release focus cleanly.
Pass — fields select-on-tap, accept valid values, show/clear advisories at threshold, and clear focus cleanly however the numpad is dismissed.
A-5Fade Field Alignment
Verify visual alignment of the fade controls and stability under toggling.
Pass — fields right-aligned; toggling causes no layout shift.
A-6Audio Playback — Basic
Verify audio starts, produces output, and stops cleanly in both modes.
Pass — audio starts and stops cleanly; button state follows session state.
A-7Fade In / Fade Out — Perceptual Curve
Verify the fade curve is perceptually gradual across the full duration. Validates the fix for a prior linear fade that sounded complete in roughly one-third of the intended time.
Pass — fade feels linear to the human ear across the full duration. (A quadratic curve produces this perception; linear does not.)
A-8Race Condition Regression — Volume Spike
Verify the "alarm-clock" volume spike is gone. History: volume spiked in the final seconds before fade-out when a timer was used with fade enabled (overlapping fade coroutines).
Fail — any sudden volume spike or "alarm clock" effect in the final 10 seconds is a regression. Do not ship.
A-9Session Timer
Verify timer countdown, auto-stop, and fade-out display behavior.
Pass — counts down correctly, auto-stops at zero, fade triggers at the right offset, and the countdown reaches 0:00 in sync with audio silence — no early jump.
A-10Preset Persistence — Cold Start
Verify stored presets survive a full app restart. (Hot reload does not test persistence — cold start required.)
Pass — all saved values survive a cold restart.
A-11Presets Screen
Verify factory and user preset display and behavior in the single-open accordion UI.
Pass — all presets present, accordion behavior correct, factory vs. user controls correct, modes load correctly.
A-12Footer Disclaimer
Verify the sourcing disclaimer is present at the bottom of the Presets screen.
Pass — footer disclaimer present, correct text and styling.
A-13Live Waveform Visualizer
Verify the live waveform renders continuously, matches the selected type and mode, stays readable across the Hz range, idles correctly, and does not stutter during a session.
Pass — continuous, type- and mode-accurate, readable at all Hz, readout never overflows, idles and re-animates cleanly, no per-second stutter.
Phase B — Physical Device Release Gate
Prerequisites: automated suite green; all Phase A items PASS or NOTE (no unresolved FAILs).
Devices: Moto G7 Power (wired-audio reference, 3.5mm jack); Pixel 6 Pro (stock Android, USB-C). The release-validation install sideloads the signed app bundle.
B-0Device Setup
Prepare the physical device for testing.
B-1All Phase A Tests — Repeat on Device
Confirm every emulator-verified behavior holds on real hardware.
Pass — all Phase A items pass on device, or differences are logged and confirmed as emulator artifacts.
B-2Binaural Audio Quality
Verify binaural beat perception on stereo headphones — different frequencies per ear.
Pass — rhythmic pulsing at the correct rate, stereo-dependent, tone centered.
B-3Isochronic Audio Quality
Verify isochronic pulses are audible and clean on both speakers and headphones.
Pass — pulses audible on speakers, clean edges, no artifacts at any rate.
B-4Background Audio Mixing
Verify the app runs alongside other audio rather than muting it — a key design differentiator (ducking, not interrupting).
Fail — if the app mutes or pauses the music app entirely. Do not ship.
B-5Screen Lock / Background Playback
Verify audio continues when the screen locks.
Note — if audio stops after lock, investigate the foreground-service path and log it. This blocks launch only if audio stops within 5 minutes (see B-6).
B-6OEM Battery Management — Extended Run
Detect audio termination by Android battery optimization — the primary real-device risk not testable in an emulator.
Pass — audio runs continuously for 20+ minutes screen-locked.
Blocker — audio stops within 5 minutes; the core use case is non-functional. Resolve before submitting. (Stops after 5 minutes: log and triage by device.)
B-7Volume Control
Verify system volume buttons and the in-app slider both affect output.
Pass — both system and in-app controls govern audio level.
B-8Cold Start After Device Reboot
Verify stored state persists across a full device reboot.
Pass — all state persists through a full reboot.

Release Gate Checklist

Every item must be checked before the app bundle is submitted.

GATE STATUS:   [ ] OPEN   [ ] PASSED   [ ] BLOCKED

Known gaps and open issues — disclosed and triaged, not hidden.
IDSeverityDescriptionStatus / Plan
STOPLowTeardown race in the stop path — a reference used after an await without a mounted-check could log an error if the screen was dismissed mid-stop. Surfaced by the expanded test suite, not by four rounds of code review (including a maximum-effort audit).Fixed + verified
P4LowA dead validation method in the engine — never called; validation handled in the UI.Later release
P5LowEmulator channel reversal at low beat frequency; reproducible cause not identified.Device test
ENGDeferredEngine hardening (deterministic stop poll, completer-based fade cancel, band-limited waveforms).Post-launch
Version log — change control is part of the deliverable.
v1.0  2026-06-12 — Initial release. Built from the QA SOP handoff.
v1.1  2026-06-14 — Accordion preset UI, preset names, contact email; Phase A + Phase B.
v1.2  2026-06-22 — Stamped to app 1.0.0. Added the automated adversarial suite (29 tests) as the first gate; added the Live Waveform Visualizer section (A-13); added the timer fade-out display spec (A-9) and the numpad-focus regression (A-4). Sanitized internal paths; defect forensics tracked separately in the bug log.
v1.3  2026-07-05 — Adversarial suite expanded 29 → 44 on-device checks; added 12 unit tests (56 automated total). Physical testing run on two handsets (Moto G7 Power + Pixel 6 Pro). Logged the teardown-race defect (STOP) the suite caught after code review missed it — fixed and verified. Counts verified against source.

This is the app it ships.

FreqCraft is built and tested the way this page describes — precision audio, zero data collection, one-time purchase. See it for yourself.

See FreqCraft →