Files
meshcore-bot/TODO.md
T
agessaman 970e4abe25 docs: refresh TODO and BUGS for 1.0.0
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.
2026-08-07 13:45:09 -07:00

5.4 KiB
Raw Blame History

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 detection
  • repeater_command.py (10%) — repeater list/info formatting
  • sports_command.py (16%) — score formatting, schedule display
  • prefix_command.py (13%) — prefix lookup and collision paths
  • alert_command.py (21%) — alert formatting and thresholds
  • trace_runner.py (24%) — trace execution, path assembly
  • earthquake_service.py (17%) — alert threshold, message format (USGS API is mockable)
  • telegram_bridge_service.py (36%) — message relay, topic routing, listener lifecycle
  • packet_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_id support — 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 deferred observed_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

  • !wx non-US improvement — promote wx_international.py to 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-outfetch_league_scores() (modules/clients/thesportsdb_client.py:305314) gathers ~8 calls (next events + past events + one per day for 6 days). _rate_limit() is correctly serialized by an asyncio.Lock, so those 8 calls take ~17 s wall clock at min_request_interval = 2.1, and the client is a single shared instance (sports_command.py:92) — one sports nfl blocks 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 IndexError handler polish — the base fix shipped (BUG-022); the asyncio exception handler in core.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 # HACK markers found in modules/ or tests/. Run python scripts/update_todos.py to refresh.