TODO was five months stale, claiming 36.86% coverage against today's 53.21% and tracking a coverage goal already exceeded. Dropped ~180 lines of completed items that duplicate the changelog, refreshed the remaining coverage targets from current data rather than copying March figures forward (graph_trace_helper 2% to 65%, hacker_command to 100%, solar_conditions 7% to 88% all came off the list), and closed out referenced tickets that have since been resolved. Also removed a dangling SESSION_RESUME.md reference, a .claude/ path, and an internal LAN broker address. BUGS now leads with outstanding issues instead of a v0.9.0 fix log, each one re-checked against current code rather than re-dated. BUG-005 is rewritten: the snapshot dashboard and retention work genuinely improved it, so the old figure no longer held. Fixed a table header that declared five columns for four-cell rows, and noted that two archive SHAs predate a history rewrite and no longer resolve.
5.4 KiB
TODO
Forward-looking task list for meshcore-bot development. Completed work is not tracked here — see CHANGELOG.md for shipped changes and BUGS.md for known defects.
The Inline TODOs section at the bottom is auto-generated by
python scripts/update_todos.py (see Auto-Update).
Last updated: 2026-08-07 — v1.0.0 release prep. Coverage 53% (3,981 passed / 11 skipped), fail_under = 35.
Test coverage
Coverage reached 53% at v1.0.0, past the old 40% target. fail_under is
still 35 — worth raising now that there is headroom.
Hardware- and API-dependent modules cap the realistic ceiling, so the list below is ordered by value rather than by percentage. Figures are from the v1.0.0 run.
Pure logic — best value:
greeter_command.py(15%) — greeting detection, per-channel greetings, new-contact detectionrepeater_command.py(10%) — repeater list/info formattingsports_command.py(16%) — score formatting, schedule displayprefix_command.py(13%) — prefix lookup and collision pathsalert_command.py(21%) — alert formatting and thresholdstrace_runner.py(24%) — trace execution, path assemblyearthquake_service.py(17%) — alert threshold, message format (USGS API is mockable)telegram_bridge_service.py(36%) — message relay, topic routing, listener lifecyclepacket_capture_utils.py(12%) — decode and dimension helpers
API/hardware heavy — lower priority:
solarforecast_command.py(11%),map_uploader_service.py(10%),airplanes_command.py(10%),wx_command.py(18%)
Other:
- MQTT fixture parser tests — decode raw hex, validate payload types against
tests/fixtures/mqtt_packets.json. See the MQTT Test Framework section of TESTING.md.
Planned features
Bridges
- Two-way Discord bridge — receive messages from Discord and relay to MeshCore
- Two-way Telegram bridge — relay Telegram messages back into MeshCore channels
- Telegram
message_thread_idsupport — route bridged messages to forum topics (BUG-008) - Bridge DM support — optional, opt-in bridging of DMs (requires a consent mechanism)
Web viewer
- Mobile-responsive improvements — optimize layout for small screens
- Dashboard follow-ups — wire the expand-chart interaction to
/api/dashboard/series(the endpoint exists, no UI yet); consider the deferredobserved_paths(last_seen, path_length, bytes_per_hop, public_key)covering index if refresher timing shows the path-length histogram dominating - Subresource Integrity — the viewer loads eight assets from three CDNs with no SRI hashes; CSP pins the origins but not the file contents
- Evaluate moving the web viewer to a separate installable package
Commands and features
!wxnon-US improvement — promotewx_international.pyto default with US fallback- Repeater auto-purge dry-run mode — log what would be purged without acting
- Feed manager JSON API feeds — support JSON endpoints, not just RSS/Atom
Backlog
- TheSportsDB request fan-out —
fetch_league_scores()(modules/clients/thesportsdb_client.py:305–314) gathers ~8 calls (next events + past events + one per day for 6 days)._rate_limit()is correctly serialized by anasyncio.Lock, so those 8 calls take ~17 s wall clock atmin_request_interval = 2.1, and the client is a single shared instance (sports_command.py:92) — onesports nflblocks every other TheSportsDB-backed command for that whole window. The lock is not the bug: without it the calls burst past the documented free-tier limit and risk 429s. Fix the fan-out instead — collapse the 6 per-day calls into a single range query if the API supports it, cache per-league results for the poll interval, or drop the day-by-day lookahead. Consider a user-visible "working…" ack if latency stays high. - meshcore
IndexErrorhandler polish — the base fix shipped (BUG-022); the asyncio exception handler incore.py:start()suppresses at DEBUG. Revisit whether it can be narrowed.
Triage
- PR #25 — "Add Docker containerization support" — still open; close as
superseded by the in-repo
Dockerfile,docker-compose.yml, and multi-arch build pipeline - Issue #137 — minimal-config install "not responding" — needs a reporter repro with logs before it can be actioned
Auto-Update
The Inline TODOs section below is auto-generated by scanning source files for
# TODO, # FIXME, and # HACK markers. Regenerate it with:
python scripts/update_todos.py
The script also updates the **Last updated:** date at the top of this file, and
--check exits non-zero if the file is stale (for a CI gate).
Or run it as part of a pre-commit hook by adding to .pre-commit-config.yaml:
- repo: local
hooks:
- id: update-todos
name: Update TODO.md inline scan
language: python
entry: python scripts/update_todos.py
pass_filenames: false
Inline TODOs (auto-generated)
Last scanned: 2026-08-07. No
# TODO,# FIXME, or# HACKmarkers found inmodules/ortests/. Runpython scripts/update_todos.pyto refresh.