summaryrefslogtreecommitdiff
path: root/stacks/crdop/ROADMAP.md
diff options
context:
space:
mode:
authorinfo@mode42.com <info@mode42.com>2026-08-07 18:25:13 +0000
committerinfo@mode42.com <info@mode42.com>2026-08-07 18:25:13 +0000
commit04d965d67a7264a1c7c211494aebda1953df7603 (patch)
tree0ebd700a6e219f84a26a656f4bee8778bc75da7b /stacks/crdop/ROADMAP.md
Initial push
Diffstat (limited to 'stacks/crdop/ROADMAP.md')
-rw-r--r--stacks/crdop/ROADMAP.md445
1 files changed, 445 insertions, 0 deletions
diff --git a/stacks/crdop/ROADMAP.md b/stacks/crdop/ROADMAP.md
new file mode 100644
index 0000000..0ae1aa4
--- /dev/null
+++ b/stacks/crdop/ROADMAP.md
@@ -0,0 +1,445 @@
+# MAX25-SoftModem (CRDOP) — development roadmap
+
+> **Static rule:** **CRDOP** = stack acronym for **MAX25-SoftModem** (device id `soft-crdop`). Authoritative everywhere CRDOP is named in MAX25-Stack.
+
+**Stack version:** MAX25-Stack **v1.0.0** · **Dev track:** `CUR999` in `$SRC/stacks/crdop/VERSION`
+
+**Stack dependency:** CRDOP sources live in `stacks/crdop/` and are **standalone-capable** in principle, but **MAX25-Stack is required for integration** (build, `max25d`, INI, operator tooling) until **CRDOP-v1.0.0** (or later) marks a mature standalone release. Current stack product: **MAX25-Stack-v1.0.0**.
+
+**Nature:** MAX25 in-house development — open development and test program for the kernel-ALSA sound-card modem. CRDOP is the standard modem; ARDOP is a separate optional plugin.
+
+**Research synthesis:** 2026-07-13 — modem and integration priorities synthesized into this ROADMAP and linked in-repo docs below. **No duplicate re-copy** of external notes into this tree.
+
+---
+
+## Protocol taxonomy (research catalog)
+
+| Class | Description | CRDOP relation |
+|-------|-------------|----------------|
+| **A** | Classic AX.25 packet (HDLC, frequency-toggle line code) | **P0/P1/P2 targets** — 1200 AFSK, G3RUH, 300 HF |
+| **B** | AX.25 + FEC extension | **Reference** — FX.25 informs FEC block design |
+| **C** | New L2 (not AX.25 on-air) | **Reference** — IL2P lessons (no bit-stuffing, RS FEC) |
+| **D** | HF/VHF data modems (Winlink ecosystem) | **Out of scope** on-air — separate ARDOP-plugin registry |
+| **E** | Keyboard/chat modes (PSK31, RTTY, …) | **Out of scope** — boundary only |
+
+---
+
+## MAX25-Stack integration (until CRDOP-v1.0.0+)
+
+| Topic | Policy |
+|-------|--------|
+| **Source tree** | All CRDOP sources in `stacks/crdop/` — standalone CMake possible; **operator integration via MAX25-Stack** until mature **CRDOP-v1.0.0** (or later) |
+| **Build** | `MAX25_BUILD_CRDOP=ON` default — installs launcher, `lib/`, tools, INI |
+| **Daemon** | `max25d` → `CrdopTcpBackend` / `AudioDummyBackend` — see [docs/MAX25-USAGE.md](docs/MAX25-USAGE.md) |
+| **AX.25 runtime** | Native `ax25_codec.py` in MAX25 — no libax25 bundle in releases |
+| **HyBBX** | External consumer — serial ownership boundary; CRDOP via host TCP attach |
+| **Docs entry** | [docs/INDEX.md](docs/INDEX.md) · project rule [docs/CRDOP.md](../../docs/CRDOP.md) |
+
+HyBBX boundary: [docs/HYBBX.md](../../docs/HYBBX.md) · [docs/PLUGINS-DEVICE-MODEL.md](../../docs/PLUGINS-DEVICE-MODEL.md)
+
+---
+
+## MAX25-Stack DEV-Level gate
+
+> Stack DEV-Levels are approximate (*ca.*) — see [docs/V2.0.0-SCOPE.md](../../docs/V2.0.0-SCOPE.md#dev-levels-roadmap-stack-wide). CRDOP modulation milestones (P0/P1/P2 below) are **subproject delivery** labels, not stack DEV-Levels.
+
+**DEV-Level 1 (*ca.* current — stack priority):** modular TCP/IP + Linux/FreeBSD platform compat. CRDOP work in DEV-Level 1 is **minimal/native only** — existing backend, bench DSP, enough OSS path for FreeBSD TCP/IP hub. **Do not expand CRDOP scope** ahead of DEV-Level 1.
+
+**DEV-Level 4 (*ca.*):** CRDOP expansion (OSS polish, G3RUH, acoustic validation, hardware docs). Modulation milestones below remain valid but are **scheduled for DEV-Level 4** unless required to unblock DEV-Level 1 platform work.
+
+**WebSocket** is **DEV-Level 3** — separate from CRDOP expansion.
+
+Stack roadmap: [docs/V2.0.0-SCOPE.md](../../docs/V2.0.0-SCOPE.md#dev-levels-roadmap-stack-wide).
+
+---
+
+## Current phase: development and test
+
+| Area | Status |
+|------|--------|
+| MAX25-Stack standard build/install (`MAX25_BUILD_CRDOP=ON`) | **Done** |
+| `max25d` `crdop-tcp` backend + offline tests | **Done** |
+| INI scaffold, launcher (`scripts/crdopc`), HyBBX attach examples | **Done** |
+| Native modem DSP — 1200 baud Bell 202 AFSK (`stacks/crdop/lib/`) | **In progress** |
+| Acoustic AX.25 validation vs reference 1200 AFSK paths | **In progress** |
+| Half- and full-duplex operator paths + FEC strategy | **In progress** |
+| Open hardware interface documentation | **In progress** |
+| G3RUH 9600–19200 (direct FSK rig path) | **Planned** (DEV-Level 4 / P1) |
+| 300 baud HF AFSK | **Optional** (P2) |
+| Speeds >19200 baud | **Out of scope** |
+
+---
+
+## Modulation priority matrix
+
+Synthesized from research catalog — implementation order for CRDOP native DSP.
+
+| Priority | Mode | Modulation | Baud | RF path | Bands | CRDOP target |
+|----------|------|------------|------|---------|-------|--------------|
+| **P0** | AX.25 Packet | **AFSK Bell 202** (1200/2200 Hz) | **1200** | Audio AFSK (Mic/Spkr/Line) | **CB, VHF/UHF** | **Primary on-air** |
+| **P0** | FEC + duplex profiles | Short frames, frequent TX | 1200 | same | CB, VHF | **Strategy** (see below) |
+| **P1** | AX.25 Packet | **G3RUH FSK/GMSK** (scrambled baseband) | **9600–19200** | **Direct FSK** (varactor + discriminator) | VHF/UHF backbone | **Hard max 19200** |
+| **P2** | AX.25 Packet | AFSK/FSK tone pairs | **300** | SSB audio (USB/LSB) | HF | **Optional** |
+| — | 2400/4800 AFSK | V.26/V.27 class | 2400–4800 | Audio | VHF | Low priority incremental |
+| 📋 | FX.25 / IL2P | FEC wrappers / new L2 | 1200+ | Audio or FSK PHY | VHF/HF | **Reference only** — inform FEC design |
+| ❌ | VARA / PACTOR / WINMOR | Proprietary DSP | various | Audio / SSB / hardware | HF/VHF/CB | **Out of scope** |
+| 📋 | ARDOP | 4FSK/PSK/QAM Winlink modes | adaptiv | Soundcard SSB | HF/VHF | **Separate plugin** — not CRDOP |
+
+**Rule:** CRDOP on-air goal is **AX.25-compatible PHY + framing** at P0/P1/P2. Winlink-class protocols (VARA, PACTOR, ARDOP OTA) are **not** CRDOP targets.
+
+---
+
+## RF path matrix
+
+What CRDOP implements per physical interface — hardware choice drives baud ceiling.
+
+| RF path | Connection | Practical max baud | CB | Amateur (VHF/UHF) | Amateur (HF) | CRDOP milestone |
+|---------|------------|-------------------|-----|-------------------|--------------|-----------------|
+| **Audio AFSK** | Mic IN / Speaker OUT / Line | ~4800 theory; **1200 field** | ✅ K24/K25 | ✅ APRS, digipeater access | — | **P0 bench–on-air** |
+| **Audio wide** | Line, de-emphasis off | up to ~9600 (difficult) | rare | experimental | — | not primary |
+| **Direct FSK** | Varactor TX + FM discriminator RX | **9600–19200** | ❌ | ✅ backbone, sat | ❌ | **P1** (DEV-Level 4) |
+| **SSB audio** | USB/LSB suppressed carrier | **300** packet; kHz-BW modes separate | ❌ | 10 m APRS exception | ✅ | **P2 optional** |
+
+**CB note:** 9600+ G3RUH requires direct RF modulation and wide IF — standard CB FM rigs are **not** 9k6-ready. CRDOP does **not** target high baud on 27 MHz.
+
+---
+
+## Band context
+
+### CB (27 MHz CEPT)
+
+| Item | Detail |
+|------|--------|
+| **Primary channel** | **K24** (27.235 MHz) — Packet QSO, APRS-like traffic |
+| **Net / forward** | **K25** (27.245 MHz) — nets, data traffic; proprietary FM-narrow DSP modes appear in practice (reference only — not CRDOP OTA) |
+| **Legal (brief)** | EN 300 433 / ECC (11)03 — voice service primary; FM max **4 W** ERP typical; **data tolerated or explicit** on K24/K25 in several EU administrations. Operator responsibility. |
+| **CRDOP mode** | **1200 AFSK Bell 202**, half-duplex, `persist=255`, short UI frames |
+| **Why not 9600+** | CB rigs lack direct FSK port and wide-IF path; FM voice channel ≈3 kHz — fits 1200/2200 Hz, not G3RUH |
+
+### VHF/UHF (2 m, 70 cm, …)
+
+| Application | Baud | Modulation | CRDOP |
+|-------------|------|------------|-------|
+| **APRS**, packet BBS, digipeater **access** | 1200 | AFSK Bell 202 | **P0** — acoustic/line |
+| Digipeater **backbone**, satellite | 9600–19200 | G3RUH FSK | **P1** — requires data-port radio |
+| IL2P | 1200/2400 | BPSK/QPSK audio | 📋 reference |
+| FX.25 | 1200+ | AX.25 + RS FEC wrapper | 📋 reference for FEC block sizing |
+
+### HF (160 m – 10 m)
+
+| Item | Detail |
+|------|--------|
+| **Standard packet** | **300 baud** AFSK/FSK, **200 Hz shift** |
+| **Common tone pairs** | 1600/1800 Hz (common default), 2110/2310 Hz, others — dial frequency must match pair |
+| **10 m exception** | 1200 AFSK on FM/USB for APRS — same PHY as VHF |
+| **Winlink boundary** | Proprietary HF mail modems = **separate protocol ecosystems** — not CRDOP OTA goals |
+| **CRDOP** | **P2 optional** — 300 bd after P0/P1 stable; SSB USB/LSB audio path |
+
+### Satellite / space (reference)
+
+| Application | Baud | Modulation | CRDOP |
+|-------------|------|------------|-------|
+| Legacy FM packet | 1200 | AFSK Bell 202 | P0 PHY same |
+| Pacsat / wide-IF links | 9600–38400+ | G3RUH FSK/GMSK | P1 extended; >19200 out of scope |
+
+---
+
+## Layer model
+
+CRDOP splits **host integration** from **on-air PHY**. Code mapping to `stacks/crdop/lib/`:
+
+```
+Application (APRS, BBS, HyBBX, max25-terminal)
+ ↓
+AX.25 v2.0 (UI / I-frames) ← stacks/daemon/ax25_codec.py
+ ↓
+HDLC + frequency-toggle + CRC-16 ← hdlc_codec.py (+ bell202_line_code.py)
+ ↓
+Modem PHY (AFSK / future G3RUH) ← afsk_modulator.py, afsk_demodulator.py
+ ↓
+MAX25 sound-proxy → kernel ALSA ← sound_proxy.py (+ include/crdop/sound_proxy.h scaffold)
+ ↓
+Radio (FM audio / direct FSK / SSB)
+```
+
+| Layer | Responsibility | Module / tool |
+|-------|----------------|---------------|
+| **L2 AX.25** | Addresses, UI body, FCS semantics | `ax25_codec.py` (daemon), used by `acoustic_engine.py` |
+| **Framing** | HDLC flags `0x7E`, bit-stuffing, CRC-16-CCITT | `hdlc_codec.py` |
+| **Line code** | Bell 202 frequency-toggle (bit 0 → tone change) | `bell202_line_code.py` |
+| **PHY 1200** | Continuous-phase AFSK 1200/2200 Hz, Goertzel demod | `afsk_modulator.py`, `afsk_demodulator.py` |
+| **PHY 9k6+** | G3RUH scrambler + FSK — **not yet in lib/** | planned P1 (DEV-Level 4) |
+| **PHY 300 HF** | 200 Hz shift tone pairs — **not yet in lib/** | planned P2 optional |
+| **Audio I/O** | ALSA capture/playback, no PulseAudio | `sound_proxy.py` |
+| **Bench integration** | Loopback encode/decode, sniffer | `acoustic_engine.py` |
+| **Host TCP** | M25-family ctrl + KISS-semantics data | `m25_host_protocol.py` → `audio-dummyd` |
+| **Operator tools** | Sniff, calibrate mark/space | `tools/max25-signal-sniffer` |
+
+**Host vs on-air:** `m25_host_protocol.py` carries AX.25 UI **without** HDLC on the data port; `acoustic_engine.encode_ax25_ui()` builds full on-air HDLC + AFSK. Do not confuse MAX25 TCP host with ARDOP FEC/ARQ wire modes.
+
+---
+
+## FEC, duplex & retransmission strategy
+
+**Leitprinzip:** *Lieber öfter senden als oft lange.*
+
+Packet on CB/VHF (poor SNR, QRM, half-duplex collisions) favours **short UI frames** and **frequent repetition** over long payloads and heavy block FEC.
+
+### Half-duplex (CB default)
+
+| Aspect | Strategy |
+|--------|----------|
+| Channel access | CSMA + persist — CB: **`persist=255`** |
+| TX slot | Short UI frames; minimal but stable TXDELAY/TXTAIL |
+| FEC | Shorter codewords; optional 2–3 repeats vs one large block |
+| Retransmit | Application/beacon: **send more often** with small payloads (≤128 B info) |
+| PTT | Explicit — VOX off on CB |
+| INI | `duplex = half`, `EXTRADELAY 150` (CB profile) |
+
+### Full-duplex
+
+| Aspect | Strategy |
+|--------|----------|
+| Channel | Simultaneous TX/RX — no CSMA |
+| FEC | Stronger codes possible when bandwidth allows |
+| Audio | Echo suppression / separate paths — full-duplex sound card |
+| INI | `duplex = full`, `EXTRADELAY 0` |
+
+### FEC layers
+
+| Level | Mechanism | CRDOP status |
+|-------|-----------|--------------|
+| **L1 modem** | CRC-16-CCITT (mandatory), preamble sync | **Done** in `hdlc_codec.py` |
+| **L1 optional** | Lightweight FEC for short blocks | **Planned** — offline AWGN simulator |
+| **L2 AX.25** | UI = no ARQ; I-frames = host may ARQ | Host policy |
+| **Application** | Frequent beacons, staggered dual-TNC | HyBBX / max25d INI |
+| **Reference** | FX.25 (RS wrapper), IL2P (new L2) | Inform design; not mandatory on-air |
+
+### FEC design takeaways (see [docs/FEC-SPEC.md](docs/FEC-SPEC.md))
+
+| Source | Lesson for CRDOP |
+|--------|------------------|
+| **FX.25** | Reed-Solomon FEC **wrapper** around AX.25 — backward-compatible idea; AX.25 bit-stuffing weakens naive FEC |
+| **IL2P** | Eliminates bit-stuffing; packet-sync LFSR scramble; RS FEC — **reference** for future optional L2, not P0 on-air |
+| **Operator** | UI frames have no L2-ARQ — reliability via **short payloads + frequent TX** before heavy block FEC |
+| **VARA / IL2P DSP** | Multi-stage FEC and adaptive rate — **reference for DSP strategy only**, not protocol target |
+
+### Host-protocol alignment
+
+| Component | Status |
+|-----------|--------|
+| Spec | **[HOST-PROTOCOL-SPEC.md](docs/HOST-PROTOCOL-SPEC.md)** — frozen v1.0.0 |
+| `max25d CrdopTcpBackend` (default) | `PROTOCOLMODE KISS`, `[CRDOP AX25 UI …]` display |
+| `m25_host_protocol.py` | Defaults **8515/8516** — matches `crdopc` INI |
+| `audio-dummyd` bench | Same ports via CLI; `audio-dummy` max25d **host** mode may use **8520** when :8515 busy |
+
+---
+
+## Implementation status (`stacks/crdop/lib/`)
+
+Honest mapping — 2026-07-13.
+
+| Component | File / tool | Status | Notes |
+|-----------|-------------|--------|-------|
+| Bell 202 line code | `bell202_line_code.py` | **Done** | Mark 1200 / Space 2200; frequency-toggle encode/decode |
+| Line code tests | `test_bell202_line_code.py` | **Done** | Round-trip unit tests |
+| AFSK modulator | `afsk_modulator.py` | **Done** | Continuous-phase PCM @ 48 kHz default |
+| AFSK demodulator | `afsk_demodulator.py` | **Done** | Per-symbol Goertzel demod |
+| HDLC + CRC | `hdlc_codec.py` | **Done** | Flags, bit-stuff, CRC-16 via `ax25_crc` |
+| Sound-proxy (Python) | `sound_proxy.py` | **In progress** | `arecord`/`aplay` subprocess path; C header scaffold separate |
+| Acoustic bench engine | `acoustic_engine.py` | **In progress** | Full loopback UI→HDLC→AFSK→demod→parse; RF path not closed |
+| M25 host protocol | `m25_host_protocol.py` | **In progress** | TCP ctrl/data for bench; port alignment with `max25d` pending |
+| `audio-dummyd` | `tools/audio-dummyd.py` | **In progress** | M25 host + `AcousticEngine`; default launcher target |
+| `max25-signal-sniffer` | `tools/max25-signal-sniffer.py` | **In progress** | ALSA/WAV/loopback Bell 202 analysis |
+| G3RUH 9600–19200 | — | **Planned** | No module yet; direct FSK radio required |
+| 300 HF AFSK | — | **Planned** | Optional P2 |
+| FEC codec (short blocks) | — | **Planned** | Offline inject-bit-error tests first |
+| `speed_baud` INI → launcher | — | **Not implemented** | Research gap |
+| Native C `crdopc` DSP binary | `include/crdop/` | **Scaffold** | Python lib leads; C port follows validation |
+| RF automated CI | — | **Planned** | Manual acoustic/TNC tests today |
+
+---
+
+## Milestones — modulation delivery (P0 / P1 / P2)
+
+> CRDOP subproject milestones — distinct from stack [DEV-Levels](../../docs/V2.0.0-SCOPE.md#dev-levels-roadmap-stack-wide). P0/P1/P2 work lands primarily in **DEV-Level 4** except bench/minimal path in DEV-Level 1.
+
+### P0 bench — Acoustic bench (current)
+
+**Goal:** Prove Bell 202 + HDLC + AX.25 UI in software loopback and ALSA bench — no RF required.
+
+| Deliverable | Status |
+|-------------|--------|
+| `bell202_line_code` + `afsk_*` + `hdlc_codec` unit path | Done |
+| `acoustic_engine.loopback_self_test()` | Done |
+| `max25-signal-sniffer --loopback` | In progress |
+| `audio-dummyd` + `audio-dummy` max25d device | In progress |
+| Document acceptable sound cards (community list) | Planned |
+| Host protocol single definition (launcher ↔ max25d) | Planned |
+
+**Exit criteria:** Stable loopback decode; sniffer reports AX.25 UI from generated PCM; `test_crdop_backend.py` green.
+
+### P0 on-air — CB/VHF 1200 on-air
+
+**Goal:** Field-validated 1200 AFSK interoperable with standard AX.25 packet peers on CB and VHF APRS-class paths.
+
+| Deliverable | Status |
+|-------------|--------|
+| Acoustic and line-level coupling validation | In progress |
+| Line interface to FM rig (CB channels) | Planned |
+| Half-duplex PTT timing in INI + launcher | In progress |
+| FEC strategy: short frames, beacon stagger | In progress |
+| Hardware interface guide (generic spec) | In progress — [docs/HARDWARE-INTERFACE.md](docs/HARDWARE-INTERFACE.md) |
+| Decode parity vs reference 1200 AFSK captures | Planned |
+
+**Exit criteria:** Verified AX.25 UI exchange with at least one reference 1200 AFSK path (acoustic or line-level).
+
+### P1 — G3RUH 9600–19200
+
+**Goal:** Direct-FSK VHF/UHF backbone rates up to **19200 baud** hard maximum.
+
+| Deliverable | Status |
+|-------------|--------|
+| G3RUH scrambler + FSK mod/demod module | Planned |
+| Data-port radio integration docs | Planned |
+| Wide-IF rig requirements checklist | Planned |
+| Loopback with recorded IQ/baseband fixtures | Planned |
+
+**Prerequisite:** P0 on-air stable; radio with suitable data port and wide-IF path for direct FSK.
+
+**Exit criteria:** Scrambler-compatible exchange with G3RUH reference captures or peer at 9600 minimum.
+
+### P2 — HF 300 baud (optional)
+
+**Goal:** SSB USB/LSB 300 bd packet — 1600/1800 Hz pair first.
+
+| Deliverable | Status |
+|-------------|--------|
+| 300 bd demod/mod (200 Hz shift) | Planned |
+| Tone-pair INI selection | Planned |
+| HF dial-frequency calculator notes | Planned |
+
+**Scope:** Optional; does not block CRDOP-v0.5 if deferred.
+
+---
+
+## Validation targets (generic)
+
+Interop validation uses **reference signal classes**, not product endorsements.
+
+| Reference class | Mode | Interface | CRDOP milestone |
+|-----------------|------|-----------|-----------------|
+| **1200 AFSK hardware modem** | Bell 202 | Serial KISS or acoustic | P0 bench–on-air |
+| **Kernel bit-bang modem** | 1200 AFSK | Parallel/serial | P0 bench tone reference |
+| **Mobile KISS → audio** | 1200 AFSK | Bluetooth/audio bridge | P0 on-air mobile |
+| **G3RUH FSK modem** | 4800–19200 | Direct FSK data port | P1 golden reference |
+| **Multi-mode HF TNC** | 300 HF + 1200 VHF | Multi-mode serial | P2 optional |
+| **Sound-card reference decoder** | 300–9600+ | ALSA | Software decode parity (1200) |
+
+Open-hardware documentation: [docs/HARDWARE-INTERFACE.md](docs/HARDWARE-INTERFACE.md). Audio QA: [docs/SOUNDCARD-QUALIFICATION.md](docs/SOUNDCARD-QUALIFICATION.md).
+
+---
+
+## Technical goals (unchanged intent)
+
+1. **1200 baud Bell 202** — reference AX.25 AFSK; primary on-air target (P0).
+2. **Acoustic compatibility** — verifiable against standard 1200 AFSK tone paths.
+3. **Hardware modem parity** — sound IN/OUT + radio usable like serial/KISS hardware in `max25d`.
+4. **Documented DIY hardware** — generic interface spec for builders ([HARDWARE-INTERFACE.md](docs/HARDWARE-INTERFACE.md)).
+5. **Good sound card enforcement** — kernel ALSA direct; MAX25 sound-proxy API; requirements scale with baud.
+6. **G3RUH to 19200** — incremental after 1200 stable (P1).
+7. **FEC via operator strategy** — frequent short sends before heavy on-air FEC (P0).
+
+---
+
+## Not in MAX25 releases
+
+| Item | Policy |
+|------|--------|
+| `vendor/ardopcf` dev tree | Local dev only (`CRDOP_VENDOR_ARDOPCF=ON`); not in release install |
+| **libax25 / ax25-tools / ax25-apps** bundles | Reference tarballs only — not shipped as CRDOP dependency |
+| VARA / PACTOR / WINMOR implementations | Out of scope |
+| Speeds **>19200 baud** | Out of scope (current phase) |
+
+---
+
+## Next release checklist (CRDOP-v0.5 target)
+
+- [ ] Loopback + acoustic bench test automation in CI
+- [ ] Published acceptable sound-card list (community + lab)
+- [ ] Native `crdopc` / `audio-dummyd` path unified in default build
+- [ ] Field validation on CB reference channel (K24)
+- [ ] Hardware interface guide — [docs/HARDWARE-INTERFACE.md](docs/HARDWARE-INTERFACE.md)
+- [ ] Host protocol alignment (`m25_host_protocol` ↔ `max25d` backend)
+- [ ] `speed_baud` INI wired to launcher
+
+---
+
+## Research synthesis (document map)
+
+Synthesis **2026-07-13** — topics below are covered in this ROADMAP and in-repo CRDOP docs. Site-specific operator INI and lab hardware runbooks stay outside this tree.
+
+| Source topic | Synthesized in this ROADMAP |
+|----------------|----------------------------|
+| `reference/modems-packet-radio/MASTER-SOLUTIONS-CATALOG.md` | Taxonomy, baud table, RF matrix, CRDOP priorities |
+| `cb-packet-solutions.md` | CB band context, K24/K25, legal, 1200-only rationale |
+| `amateur-vhf-uhf-solutions.md` | VHF/UHF table, APRS, G3RUH backbone |
+| `amateur-hf-packet-solutions.md` | HF 300 bd, Winlink boundary |
+| `l2-fec-protocols.md` | FEC layers, FX.25/IL2P takeaways |
+| `modern-softmodems.md` | Class D out-of-scope, decision matrix (generic) |
+| `bell-202-afsk-1200.md` | P0 PHY parameters, P0 bench–on-air |
+| `g3ruh-fsk-9600-19200.md` | P1 direct FSK, DEV-Level 4 |
+| `hf-300-baud-afsk.md` | P2 tone pairs, SSB path |
+| `nrzi-hdlc-ax25-layers.md` | Layer model + `lib/` mapping |
+| `MODULATION-REFERENCE.md` | Modulation priority matrix |
+| `soundcard-requirements.md` | ALSA requirements, baud scaling |
+| `acoustic-coupling-hardware.md` | → [HARDWARE-INTERFACE.md](docs/HARDWARE-INTERFACE.md) |
+| `projects/max25-stack/2026-07-13-crdop-development-master.md` | Product scope, MAX25 integration |
+| `projects/max25-stack/2026-07-13-crdop-fec-duplex-strategy.md` | FEC/duplex section |
+| `reference/2026-07-12-cb-eu-packet.md` | CB legal/channel detail |
+| `reference/2026-07-12-packet-radio-fundamentals.md` | Background — no CRDOP code impact |
+| `reference/2026-07-12-modems-linux.md` | Linux sound-modem landscape — reference |
+| `reference/2026-07-12-linux-ax25-ecosystem.md` | Kernel AX.25 deprecation context |
+| `projects/integration/2026-07-12-max25-hybbx-boundary-final.md` | HyBBX attach / serial ownership |
+| `DEVELOPMENT.md` (operator P0–P2) | Parallel to stack release — see [docs/DEVELOPER.md](docs/DEVELOPER.md) |
+
+**Not in CRDOP tree:** site TNC hardware runbooks, production INI, serial acceptance logs — operator-local only.
+
+### Scenario → CRDOP mode (generic, from research)
+
+| Scenario | CRDOP mode |
+|----------|------------|
+| CB packet QSO (FM audio) | **P0** — 1200 AFSK AX.25 |
+| CB net with heavy QRM | **P0** + short-frame FEC strategy; proprietary FM-narrow DSP = separate protocol |
+| VHF APRS / digipeater access | **P0** — 1200 AFSK |
+| VHF/UHF backbone | **P1** — G3RUH direct FSK (≤19200) |
+| HF packet 300 bd | **P2** optional |
+| HF mail / Winlink-class | **Out of scope** — separate protocols |
+| MAX25 RF broadcast / soft-modem path | **P0** target — native CRDOP in stack |
+
+---
+
+## In-repo technical docs
+
+| Document | Topic |
+|----------|--------|
+| [docs/INDEX.md](docs/INDEX.md) | Documentation index |
+| [docs/SOFTMODEM.md](docs/SOFTMODEM.md) | Product definition |
+| [docs/MAX25-USAGE.md](docs/MAX25-USAGE.md) | MAX25-Stack operator guide |
+| [docs/DEVELOPER.md](docs/DEVELOPER.md) | Developer guide |
+| [docs/HARDWARE-INTERFACE.md](docs/HARDWARE-INTERFACE.md) | Generic radio interface spec |
+| [docs/LICENSE-USAGE.md](docs/LICENSE-USAGE.md) | GPLv3 private + commercial |
+| [docs/HOST-PROTOCOL-SPEC.md](../stacks/crdop/docs/HOST-PROTOCOL-SPEC.md) | M25 host wire (frozen) |
+| [docs/ACOUSTIC-TEST-PROTOCOL.md](../stacks/crdop/docs/ACOUSTIC-TEST-PROTOCOL.md) | P0 bench |
+| [docs/FEC-SPEC.md](../stacks/crdop/docs/FEC-SPEC.md) | FEC/duplex parameters |
+| [docs/SOUNDCARD-QUALIFICATION.md](../stacks/crdop/docs/SOUNDCARD-QUALIFICATION.md) | Audio interface QA |
+| [docs/G3RUH-DESIGN.md](../stacks/crdop/docs/G3RUH-DESIGN.md) | P1 — 9600–19200 direct FSK |
+| [docs/CRDOP.md](../../docs/CRDOP.md) | Static project rule |
+| [docs/AUDIO-ARCHITECTURE.md](docs/AUDIO-ARCHITECTURE.md) | Kernel ALSA, sound-proxy |
+| [docs/PROTOCOL.md](docs/PROTOCOL.md) | Host TCP interface |
+| [docs/CONFIG.md](docs/CONFIG.md) | INI keys |
+
+---
+
+*Roadmap synthesized 2026-07-13 from modem catalog and MAX25 integration notes. Update when DEV-Level gates close or modulation priorities change.*
+.*
git clone -b <branch> https://cgit.mode42.com/<repo>.git
git clone -b <branch> git://cgit.mode42.com/<repo>.git

info@mode42.com