CI: switch from python:3.12-slim container to ubuntu-latest +
actions/setup-python. The slim image has no node, but
actions/checkout@v4 is a JavaScript action and the runner expects
node inside the job container. Default ubuntu-latest images on
Forgejo (catthehacker/ubuntu:act-*) ship node; setup-python adds
Python on top.
Submodules: vendor MeshCore firmware and meshcore_py source under
reference/ so the firmware/library behavior is verifiable inline
(parse_status field offsets, send_chan_msg's OK-only ack, etc).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Concept spec calls for `<testname>.tsv`. Filename is now
`<testname>-<station>-<ts>.tsv` so reruns of the same test name
don't clobber prior runs and multiple stations stay distinguishable.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This repo was produced primarily by an LLM, so most of it is not
eligible for copyright protection to begin with. CC0 covers any
portion that turns out to be copyrightable.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds the modjam package: a MeshCore-backed test station service for
Pi (IDLE + RUNNING states, cuesheet-driven), a control station REPL
for the Mac, and a UDP simulator that swaps in for the radio when
SIMULATOR=true (drops cross-config packets and a configurable
fraction of test-payload datagrams to mimic real radio loss).
docker-compose runs three sim stations + control on a bridge net.
TSV log format matches the reference traces.
Pytest suite covers protocol codec, cuesheet builder, TSV logger,
config loader, and UDP radio packet routing/loss; .forgejo/workflows
runs it on push to main and on PRs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>