Pycom has evolved from a repository where every line of code was written manually to a fully agentic development stack. Using opencode — a CLI-based AI coding environment — backed by the Ollama Pro plan with access to the GLM-5.1 Cloud model (currently around £15/month), the project now operates with custom skills, specialised agents, structured expertise management, and automated quality gates that keep the codebase consistent and the protocol layer correct. The combination of opencode's skill system and a capable cloud-hosted model means every session starts with deep project context and ends with consistent, reviewed and tested code.
From Solo to Agentic
In the early days, every feature, bug fix, and protocol implementation was hand-coded and tested against the radio. The codebase has grown to over 25,000 lines across 40+ modules, with a CI-V command reference spanning 542 commands. Managing that complexity manually was becoming unsustainable. Today, opencode is configured with persistent context — AGENTS.md, docs/CODING_STANDARDS.md, and docs/PR_REVIEW_CRITERIA.md — that guides every session. These files encode project conventions (decimal-nibble encoding rules, threading constraints, naming standards, read-only library boundaries) so that the AI agent produces code that is consistent with the existing codebase from the start, rather than needing correction afterwards.
A dedicated expertise manager called mulch records patterns, failures, decisions, and conventions across sessions. Before each task, opencode queries mulch to avoid re-introducing known-bad patterns or repeating investigations that were already resolved. Findings are recorded under domains like gotchas, architecture, connection-flow, and scope-protocol, building a living knowledge base that persists between conversations.
Custom Skills & Tools
opencode skills provide domain-specific expertise on demand. Each skill is loaded contextually — when a question or task matches its domain, the full skill instructions and reference data are injected into the session. The table below shows the skills currently configured for Pycom:
opencode skills configured for the Pycom project
| Skill | Purpose | Mechanism |
| CI-V Reference | Look up IC-9700 CI-V commands, hex codes, data encodings, sub-commands, and protocol details | scripts/civ_explore.py — parses the 542-command reference CSV and auxiliary encoding docs. Subcommands: search, lookup, info, encoding, frame, validate |
| Pcap Debugger | Analyse ICOM 9700/7610 Wireshark network traces — decode control, CI-V, and audio streams; inspect socket lifecycle and protocol compliance | pcap_explorer.py — dissects pcap/pcapng files, extracts CI-V command/response pairs, audio streams, and timing data |
| Signal Model Sync | Synchronise, retrain, and verify the ONNX signal classifier between the project and ~/Pycom/signals/ | scripts/sync_signals_dir.sh — runs verification, fine-tuning, and model deployment in one step |
| Model Retraining | Retrain the ONNX signal classifier from labelled captures and deploy to dist | scripts/retrain_model.py — supports --fine-tune from bundled base model and --from-scratch modes |
| Expertise Management | Record and query structured project expertise across sessions | mulch CLI (v0.6.3) — domains: gotchas, architecture, connection-flow, scope-protocol, op-log-level, python-style, test-automation |
| Test Runner | Discover, run, and diagnose tests with full pytest/coverage integration | pytest with SerialMock, flake8 lint classes, venv isolation via scripts/run_tests.sh |
| Persistent Context | Guide every session with project conventions, constraints, and coding standards | AGENTS.md, docs/CODING_STANDARDS.md, docs/PR_REVIEW_CRITERIA.md — loaded automatically by opencode at session start |
Specialised Agents
Beyond skills, opencode is configured with dedicated subagents that handle specific workflows autonomously:
- PR Reviewer — Analyses pull requests and diffs against project standards (coding conventions, threading rules, CI-V protocol constraints, read-only boundaries). Catches architectural violations before merge.
- Docs Maintainer — Audits documentation for staleness, duplication, and inconsistency. When features change, it updates the relevant docs to stay in sync with the code.
- Test Runner — Discovers and runs the appropriate test modules, interprets failures, and suggests fixes. Knows the project's pytest configuration, coverage targets, and SerialMock patterns.
- Explore Agent — Fast codebase search for files, patterns, and architectural answers. Used when you need to find "where is X implemented" or "how does Y work" without reading every file.
Two Repositories
Pycom's codebase is split across two repositories:
- pycom-radio-controller — The main application repository. Contains the GUI, radio controller, signal detection, satellite tracking, configuration, and all the agentic tooling described above.
- ICOM_UDP — A separate repository containing the ICOM UDP transport library. This provides scope data parsing, audio streaming, and network-based CI-V communication for radios with built-in Wi-Fi/Ethernet.
The UDP library is copied into the main repo at lib/icom_udp/ as a read-only dependency. Files are set chmod 444 to prevent accidental edits. All changes must be made upstream in the ICOM_UDP repository first, then synced via scripts/sync_icom_udp.sh. This separation ensures the library can be developed and tested independently while keeping the main repo's copy in sync.
Self-Hosted Gitea
All source control, CI, and issue tracking runs on a self-hosted Gitea instance. The setup provides:
- Git hosting — Private repositories for both pycom-radio-controller and ICOM_UDP, with full branch and merge management.
- CI Action Runner — A Gitea Actions workflow (
.gitea/workflows/pyinstaller.yaml) builds distributable packages on every push to main. It produces a macOS .app bundle and a Windows .exe, both packaged for distribution. The build excludes dev-only dependencies (pytest, coverage, flake8, torch) via --exclude-module flags.
- Issue tracking — Bugs, feature requests, and milestone tracking (including the UDP transport migration plan) are all managed in Gitea Issues.
Test Suite
The Pycom test suite is built on pytest with hardware-free testing as a core principle. Since the app communicates with a physical ICOM IC-9700 via serial, every test must work without the radio connected:
Pycom test suite categories and approach
| Category | Files | Approach |
| Protocol & Encoding | tests/radio/test_pycomIC9700.py | Pure-function tests for BCD, decimal-nibble, and CI-V frame construction — the highest-value tests in the codebase |
| Radio Controller | tests/radio/test_radioController.py | Threaded command queue with SerialMock — verifies queue semantics, timeout handling, and factory creation |
| Signal Detection | tests/signal/ (4 files) | Statistical detector, classifier, patch extraction, training metadata |
| Satellite Tracking | tests/csnsat/test_csnSatManager.py | Doppler rate calculation, offset handling, polling logic with mocked network calls |
| Config & Providers | tests/config/, tests/provider/ | Config round-trips with temp directories, API response parsing with mocked requests |
| Rigctl & RC-28 | tests/rigctl/, tests/rc28/ | TCP command parsing, HID event parsing — no hardware needed |
| Build & Lint | tests/build/test_syntax.py | ast.parse syntax validation + flake8 critical/lint checks integrated as pytest classes |
| Regression | tests/regression/test_known_bugs.py | Known bugs documented as tests — fail until fixed, then become permanent guards |
Every test run creates a fresh virtual environment via scripts/run_tests.sh, installs dependencies, runs the full suite with coverage, and tears down — ensuring no contamination between runs. Coverage targets range from 90%+ for protocol/encoding code down to 40% for GUI code, with an overall target of 75%+.
The Agentic Advantage
The transition from solo manual coding to agentic development has fundamentally changed the pace and quality of Pycom's delivery. In the months since adopting the opencode stack, features that previously took weeks of careful manual implementation — each requiring protocol reference lookups, encoding verification, threading audit, and manual testing against the radio — now ship in days or even hours. The CI-V Explore skill eliminated constant context-switching to the ICOM manual; the pcap debugger turned hours of trace analysis into minutes; mulch ensures that hard-won knowledge about decimal-nibble gotchas and threading constraints is never lost between sessions.
Recent feature velocity illustrates the shift: AI signal detection and classification with a trainable ONNX model and 15-mode classifier, 542-command CI-V coverage with validated encoding reference, full UDP transport library integration for network-based radio control, and a redesign of the main display tab with enhanced support for dual transceivers — all developed and merged with AI-assisted code review, automated testing, and structured expertise management. The test suite alone grew from zero to 45+ test files covering protocol encoding, command queues, signal processing, configuration, and regression guards — something that would have taken far longer to build manually.
The key insight: agentic development doesn't replace understanding — it amplifies it. The project's AGENTS.md, coding standards, and mulch expertise records ensure the AI operates within well-defined constraints, while the specialised agents handle review, documentation, and testing that would otherwise be bottlenecks. The result is a system that allows me to test ideas and ship faster without cutting corners.