Fold the Unreleased section into 1.1.0 and date it. The 1.1.0 heading was written on 2026-09-13 but never tagged, so everything merged since belongs in it; the section also carried two separate "### Added" headings from earlier merges, now consolidated. All 79 entries preserved. Extend the v1.0.0 -> v1.1.0 upgrade guide with the meshcore 2.3.14 requirement, migration 24, and the configuration and behavior changes that landed after the heading was first written.
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-09-20. The v1.1.0 suite reports 57% coverage, and
fail_under = 50.
Test coverage
Coverage is 57% as of v1.1.0. The enforced floor is 50%.
Hardware- and API-dependent modules cap the realistic ceiling, so the list below is ordered by value rather than by percentage. Per-module figures below are from the v1.0.0 run and should be refreshed in a separate coverage review.
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.