mirror of
https://github.com/agessaman/meshcore-bot.git
synced 2026-08-28 23:00:41 +00:00
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.
136 lines
5.4 KiB
Markdown
136 lines
5.4 KiB
Markdown
# TODO
|
||
|
||
Forward-looking task list for meshcore-bot development. Completed work is not
|
||
tracked here — see [CHANGELOG.md](CHANGELOG.md) for shipped changes and
|
||
[BUGS.md](BUGS.md) for known defects.
|
||
|
||
The Inline TODOs section at the bottom is auto-generated by
|
||
`python scripts/update_todos.py` (see [Auto-Update](#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](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-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 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:
|
||
|
||
```bash
|
||
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`:
|
||
|
||
```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._
|
||
|