Skip to content

Badges, an enforced coverage floor, and two exports that were not API - #23

Merged
danielededo merged 1 commit into
mainfrom
claude/activity-presentation
Aug 23, 2026
Merged

danielededo merged 1 commit into
mainfrom
claude/activity-presentation

Conversation

@danielededo

Copy link
Copy Markdown
Owner

Presentation

Badges. CI was alone up there. The licence and the four versions that decide whether somebody cares about the repository at all now sit beside it — each linked to the file that states the version rather than to a vendor's home page, so a reader can check the claim in one click. Six is a row, not a wall.

Deliberately no test-count badge and no coverage badge: both are numbers that rot, and this repository has already had two rounds of stale counts corrected. Which leads to the more useful change.

The coverage floor is enforced instead of advertised. CI already ran --cov — and printed it, so nothing could fail on it. It now runs --cov-fail-under=90, which means the green CI badge says the floor held, not merely that the suite passed. Actual coverage is 96.46%, so 90 leaves headroom for a change to be mid-flight; the lowest modules are database.py at 76% and health.py at 79%, both failure paths.

I checked that the gate bites, rather than only that it passes: pytest exits 1 at a 99% floor and 0 at 90. A guard I hadn't seen fail is a guard I hadn't tested.

The opening now says what the project refuses to do. "No external services" is abstract; the absent map tile server is concrete, and it is the line that actually separates this from every other training log — drawing your routes over a borrowed basemap means telling a stranger where you exercise.

Code

IMPLAUSIBLE_SPEED_MS and GRID_POINTS were exported from utils/track.js and imported by nobody. Both are used only inside their own module, so the export was speculative API surface. Now plain constants.

Nothing else was found to delete

I looked, and I would rather report an empty result than manufacture a diff:

  • no orphan modules — every file under src/ is reached
  • no dead backend definitions — the crude "defined here, referenced nowhere else" sweep flagged 39 candidates and every one turned out to be a FastAPI route handler or a same-file dataclass
  • no unused CSS: .panel 26 uses, .muted 59, .table-scroll 3
  • every declared dependency imported
  • every one of the twelve screenshots referenced by a document
  • the four empty __init__.py files are package markers, not litter
  • 2.3 MB tracked in total

One thing did go: a stray node_modules/ at the repo root holding nothing but a .vite cache — my own leftover from an earlier session. It was gitignored, so this PR doesn't show it.

A CHANGELOG was considered and left out. With no tags and no releases it would restate the git log and the feature list, and the question it would actually answer — does this pull need a backfill? — the Updating section already answers.

Verified

343 backend tests with the gate satisfied, 232 frontend, ruff check, ruff format --check, eslint and the production build all clean. The badge markdown was rendered to HTML to confirm six images, each wrapped in a link, each with alt text, on one paragraph so GitHub lays them out as a row.

One thing I could not verify: the egress proxy here returns 403 for img.shields.io, so I could not fetch the badge images to confirm they render. The URLs follow shields' documented static form and a missing logo slug degrades to a badge without a logo rather than a broken image — but worth a glance at the rendered README rather than my word.


Generated by Claude Code

Presentation, in the three places a visitor actually looks.

**Badges.** CI was alone; now the licence and the four versions that decide
whether somebody cares about the repository at all sit beside it, each linked
to the file that states the version rather than to a vendor's home page. Six
is a row, not a wall. No test-count badge and no coverage badge on purpose:
both are numbers that rot, and this repository has already had two rounds of
stale counts corrected.

**The coverage floor is enforced instead.** CI ran `--cov` and printed the
result, which nothing could fail on. It now runs `--cov-fail-under=90`, so the
green CI badge means the floor held rather than merely that the suite passed.
Actual coverage is 96.46%, leaving headroom for a change to be mid-flight; the
lowest modules are database.py at 76% and health.py at 79%, both failure paths.
Checked that the gate bites, not just that it passes: pytest exits 1 at a 99%
floor and 0 at 90.

**The opening says what the project refuses to do.** "No external services"
was abstract; the absent map tile server is concrete, and it is the line that
separates this from every other training log.

Code: `IMPLAUSIBLE_SPEED_MS` and `GRID_POINTS` were exported from
utils/track.js and imported by nobody. Both are used only inside their own
module, so the export was speculative API surface. Now plain constants.

Nothing else was found to delete. No orphan modules, no unused CSS, no dead
backend definitions, no unreferenced images, every declared dependency
imported, and the four empty __init__.py files are package markers rather than
litter. A CHANGELOG was considered and left out: with no tags and no releases
it would restate the git log and the feature list, and the question it would
answer — whether a pull needs a backfill — the Updating section already
answers.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019mNxXmXqwMZf6MG8PoWbq4
@danielededo
danielededo merged commit 6576f8f into main Aug 23, 2026
4 checks passed
@danielededo
danielededo deleted the claude/activity-presentation branch August 23, 2026 07:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant