Forward Deployed Engineering across 12 cycles: from initial baseline (V1.0) to multi-client TX ownership fix (V2.1) — 16 days, 262 tests, 6 reusable assets.
Demand discovery → rapid prototyping → abstraction & generalization. Each cycle turns one field lesson into permanent leverage.
FT-710 inherited 6+ reusable assets from the MRRC project. Never start from zero.
| Asset | From | How FT-710 Uses It |
|---|---|---|
| PTT safety (7-layer model) | MRRC |
Ch15, server.py PTT handler — fire-and-forget TX0
+ 500ms poll
|
| AudioWorklet + Opus WASM | MRRC |
rx_worklet_processor.js,
tx_opus_worker.js
|
| Glassmorphism design system | MRRC |
css/octen.css — dark amber theme, safe-area
support
|
| Multi-instance architecture | MRRC |
server.py lifespan management, env-var config
|
| SDD template (IBM TeamSD) | MRRC / SunMRRC | All 15 chapters — harness structure reused |
| Website deploy pattern | MRRC / SunMRRC |
website/deploy.sh + build_sdd.py
|
Each SDD version is one Echo → Delta → Product loop. Every cycle driven by a real field signal, not a speculative feature.
| # | SDD | Date | Echo Signal | Delta Challenge | Product Output |
|---|---|---|---|---|---|
| 1 | V1.0 | Jul 6 | F4HTB evaluation + MRRC patterns | Full baseline: CAT, audio, scope, polling, PTT safety | 15-chapter SDD, 7 core modules |
| 2 | V1.1 | Jul 6 | "16kHz TX crackling" | Unify TX pipeline to 48kHz | AD-011: 48kHz codec + 44.1kHz bridge |
| 3 | V1.2 | Jul 8 | "Freq drifts ~20Hz, TX meters blank" | VS/FB active VFO, RM calibration | AD-012/013: VFO + meter tables |
| 4 | V1.3 | Jul 8 | "TUNE doesn't work, PTT latency" | Priority CAT preemption, TX2+AC003 | AD-015: _cancel_polls |
| 5 | V1.4 | Jul 12 | "Waterfall alone is hard to read" | FFT spectrum line plot, install.sh | FFT overlay, dev tooling |
| 6 | V1.5 | Jul 18 | "SDD docs stale vs. runtime" | Doc sync: PTT layers, polling naming | V1.5 docs + issues I6/I7 |
| 7 | V1.6 | Jul 18 | "SSB filter change — can't hear difference" | RX zero-audio watchdog, TX Opus truth sync | Dead-carrier fix, WS 403 flow |
| 8 | V1.7 | Jul 19 | "Filter switch works 50% of the time" | Stale-read discard, 150ms SH0 read-back | 3 regression tests |
| 9 | V1.8 | Jul 21 | "PTT watchdog dead code, TUNE accidental tap" | PTTManager routing, press-and-hold, keyboard guards | Space-bar PTT, mobile layout |
| 10 | V1.9 | Jul 21 | "USB reconnect → waterfall frozen forever" | on_reconnected hook for scope-init CAT |
2 regression tests |
| 11 | V2.0 | Jul 21 | "Spurious 'radio disconnected' during operation" | NoneType guard + recovery path | 1 regression test |
| 12 | V2.1 | Jul 22 | "PTT keys but no voice / no RF power" | TX uplink promote + claim, per-session counters | 5 tests + TX session: logging |
FT-710 didn't re-solve PTT safety, WDSP, or multi-instance. MRRC's 15-cycle Product phase turned those into reusable abstractions. Starting from zero would have cost months.
14-version-history.md records every Echo signal,
Delta fix, and Product output — in a machine- and human-readable
format. No separate "FDE tracker" needed.
Zero speculative features. Each Delta cycle was triggered by a concrete Echo event: a log line, a user observation, an on-air misbehavior.
SDD chapters updated during each Delta phase, not after. The harness records what worked, not what was planned. Your 6-month-future self is the primary audience.
V1.0 proved direct CAT works. V1.1 proved 48kHz audio. V1.9 proved scope-init needs re-run after USB reconnect. V2.1 proved multi-client TX needs ownership promotion.
MRRC's 14-month operational gap accumulated real pain points. FT-710 benefits from that proxy — but also generates its own Echo through daily on-air use.
The 15-chapter SDD locks down WHAT, HOW, and DELIVERABLE — fed by Echo, Delta, and Product phases respectively.
The critical insight: don't let documentation drive development — let development drive documentation. After each FDE phase, the output updates the harness. The harness is not a plan — it's a record of what worked.
Each Delta hack that became a Product-phase abstraction — ready for the next FT-710 project.
| Gravel Road (Delta Hack) | Highway (Product Abstraction) | Reusable For |
|---|---|---|
| FT4222 ctypes crashed asyncio |
scope_pipe.py — standalone subprocess with
length-prefixed stdout
|
Any FTDI SPI project |
| 44.1↔48kHz mismatch crackles |
audio_resample.py — frame-aligned linear SRC
(960↔882)
|
Any 44.1→48kHz bridge |
| Fixed-interval polling missed state |
poll_scheduler.py — skip-on-command, stale-read
discard, on_reconnected hook
|
Any CAT-controlled radio |
| Raw PCM only, no codec flexibility | Tagged dual-codec: 1-byte tag (0x00=PCM, 0x01=Opus) + payload | Any codec-flexible audio transport |
| Ad-hoc scope data parsing |
scope_frame.py — shared format, sync pattern,
quality metrics
|
Any FT-710 scope consumer |
| TX failures with zero diagnostics |
TX session: — per-PTT-release counters + PCM peak
|
Any TX audio pipeline |
Imagined requirements without field presence — "I think the user wants X"
Spend at least 1 week in the actual usage scenario. Every FT-710 cycle started from a real log line.
Delta code shipped directly without generalization — the gravel road stays gravel
Reserve at least 20% of every cycle for abstraction and
documentation. scope_pipe.py is a highway because
someone took the time.
Writing a generic framework before scenario #1 is validated — future-proofing that never pays off
Wait until at least 2 similar scenarios succeed before abstracting. The FT-710's tagged audio format earned its abstraction.
New project, blank repo, no leverage inventory — re-solving problems MRRC already solved
Always audit existing assets first. FT-710 inherited 6 MRRC modules. Your leverage is your unfair advantage.
Defined 10 demos with enormous scope — "we'll do all of them this cycle"
Pick 1 demo per cycle. Ship it. Then do the next. Each SDD version addresses exactly one field signal.
Full error handling + logging + config in prototype #1 — spending weeks polishing unvalidated code
Prototype #1 validates only the riskiest assumption. Polish later. V1.0 was a working baseline in 1 day.
A repeatable playbook derived from this project's 12-cycle FDE journey.
| # | Step | FT-710 Application |
|---|---|---|
| 1 | Start from Leverage | Inherited 6+ MRRC assets — PTT safety, WDSP, multi-instance, Glassmorphism, SDD template, website deploy |
| 2 | Define the Harness | SDD V1.0: 15 chapters, 15 ADs, 65 NFRs — written concurrently with first commit |
| 3 | Echo: Deploy | Field deployment on macOS + Raspberry Pi + Windows. Daily operation as signal generator |
| 4 | Delta: Ship | Each SDD version within 24h of Echo signal. 12 cycles in 16 days |
| 5 | Product: Abstract | 6 reusable modules. Dual-codec tagging. Adaptive polling as pattern |
| 6 | Accelerate | Next FT-710 client inherits WebSocket protocol as stable contract — zero server changes needed |
The full SDD, source code, and FDE cycle log are open source. Start your own Echo→Delta→Product journey.