Files
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

136 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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: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:
```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._