Problem
The README mixes the implementation layer into user-facing sections. A non-technical cyclist gets the engineering retelling — issue numbers, spec IDs, internal component names, CI/release plumbing — instead of "what do I get." It reads as built-by-a-megageek-for-megageeks, which repels the actual target reader. The ## For developers section is the right home for tech detail; the leak is everywhere else.
All evidence below is quoted verbatim from the current README on main.
The leaks (quoted)
1. ## Roadmap — the worst offender. It is a dev changelog wearing a user roadmap's clothes. A user does not care about issue numbers, spec IDs, or internal mechanisms:
> #98 — VOICE-R2: turn the presentation strip into an allow-list so no internal metric code can ever leak into athlete-facing prose. — spec ID, "presentation strip", "allow-list".
> #103 — Scope the slow CI tiers to the change: a docs/text-only PR shouldn't pay the database, e2e, and image-build tax... — pure CI internals; zero user relevance.
> #39 — Wire durability ... with \work_above_cp_j` persisted on ingest so the number can be retrieved and cited.—work_above_cp_j`, "persisted on ingest".
> #87 — Two-layer coach answer: a verifiable evidence layer the grounder reads ... split fail-closed... — "grounder", "fail-closed", "two-layer".
> #97 — Make the checkpoint \interrupt_id` stable across pause/resume (a known LangGraph re-run quirk; the fix may be a deterministic id or a documented spec carve-out).—interrupt_id`, "LangGraph re-run quirk", "spec carve-out".
> #93 — Remove false-confidence tests (including GDPR-erasure tests that never exercise the production erase path)... — test-suite internals.
2. Quick start — honest, but written in engine terms.
> ...its connect path is intentionally inert here — it returns \422` until a credential probe is configured — so it will not pull data in the stock OSS container.` — "credential probe", "422", "stock OSS container" at a first-run user.
> # Prefer not to build? A released image exists, but note it is the pinned v0.0.1 snapshot, is linux/amd64 only, and may trail these docs: — "pinned snapshot", "may trail these docs" is release-engineering, not user copy.
3. ## How it works — mostly fine, one config-jargon line:
> Storage is a single connection string: SQLite by default, or PostgreSQL or MariaDB by changing that one setting... — "connection string" / "that one setting".
Proposed changes
Guiding rule: user-facing sections say what the user gets, in plain words. Issue numbers, spec IDs (VOICE-R2), internal component names (grounder, work_above_cp_j, interrupt_id, "credential probe"), and CI/release plumbing live in the GitHub issues/milestones, CONTRIBUTING, the ## For developers section, and the source — never in the user README.
- Rewrite
## Roadmap as user outcomes. Keep the nice codename framing (Banister / Coggan / Seiler + one line on what the release is about). Replace every #NN — <engineering> bullet with at most one plain sentence on what the user will be able to do (e.g. "v0.0.2 — more of the metrics you know, and the coach can cite them"). Drop issue numbers and spec IDs entirely; they already live on the GitHub milestones, which is where a contributor looks.
- Plain-language the intervals.icu note. e.g. "Automatic sync from services like intervals.icu isn't available in this build yet — for now, bring your data in by uploading files (above)." No
422, no "credential probe", no "stock OSS container".
- Plain-language the released-image note. e.g. "Building from source is recommended and runs on any machine. (A prebuilt x86-only image also exists.)" Drop "pinned snapshot / may trail these docs."
- Trim the storage line in How it works to "Runs on SQLite out of the box; point it at PostgreSQL or MariaDB when you outgrow it."
- Leave
## For developers as-is — that is the correct place for the stack, the test tiers, and the OpenAPI surface.
Acceptance
A reader who is a cyclist, not an engineer, can read the whole README and never meet an issue number, a spec ID, an internal component name, or a CI/release detail outside ## For developers. Implementation detail is findable (issues, dev docs, source) but not pushed at the user.
Problem
The README mixes the implementation layer into user-facing sections. A non-technical cyclist gets the engineering retelling — issue numbers, spec IDs, internal component names, CI/release plumbing — instead of "what do I get." It reads as built-by-a-megageek-for-megageeks, which repels the actual target reader. The
## For developerssection is the right home for tech detail; the leak is everywhere else.All evidence below is quoted verbatim from the current README on
main.The leaks (quoted)
1.
## Roadmap— the worst offender. It is a dev changelog wearing a user roadmap's clothes. A user does not care about issue numbers, spec IDs, or internal mechanisms:> #98 — VOICE-R2: turn the presentation strip into an allow-list so no internal metric code can ever leak into athlete-facing prose.— spec ID, "presentation strip", "allow-list".> #103 — Scope the slow CI tiers to the change: a docs/text-only PR shouldn't pay the database, e2e, and image-build tax...— pure CI internals; zero user relevance.> #39 — Wire durability ... with \work_above_cp_j` persisted on ingest so the number can be retrieved and cited.—work_above_cp_j`, "persisted on ingest".> #87 — Two-layer coach answer: a verifiable evidence layer the grounder reads ... split fail-closed...— "grounder", "fail-closed", "two-layer".> #97 — Make the checkpoint \interrupt_id` stable across pause/resume (a known LangGraph re-run quirk; the fix may be a deterministic id or a documented spec carve-out).—interrupt_id`, "LangGraph re-run quirk", "spec carve-out".> #93 — Remove false-confidence tests (including GDPR-erasure tests that never exercise the production erase path)...— test-suite internals.2. Quick start — honest, but written in engine terms.
> ...its connect path is intentionally inert here — it returns \422` until a credential probe is configured — so it will not pull data in the stock OSS container.` — "credential probe", "422", "stock OSS container" at a first-run user.> # Prefer not to build? A released image exists, but note it is the pinned v0.0.1 snapshot, is linux/amd64 only, and may trail these docs:— "pinned snapshot", "may trail these docs" is release-engineering, not user copy.3.
## How it works— mostly fine, one config-jargon line:> Storage is a single connection string: SQLite by default, or PostgreSQL or MariaDB by changing that one setting...— "connection string" / "that one setting".Proposed changes
Guiding rule: user-facing sections say what the user gets, in plain words. Issue numbers, spec IDs (
VOICE-R2), internal component names (grounder,work_above_cp_j,interrupt_id, "credential probe"), and CI/release plumbing live in the GitHub issues/milestones, CONTRIBUTING, the## For developerssection, and the source — never in the user README.## Roadmapas user outcomes. Keep the nice codename framing (Banister / Coggan / Seiler + one line on what the release is about). Replace every#NN — <engineering>bullet with at most one plain sentence on what the user will be able to do (e.g. "v0.0.2 — more of the metrics you know, and the coach can cite them"). Drop issue numbers and spec IDs entirely; they already live on the GitHub milestones, which is where a contributor looks.422, no "credential probe", no "stock OSS container".## For developersas-is — that is the correct place for the stack, the test tiers, and the OpenAPI surface.Acceptance
A reader who is a cyclist, not an engineer, can read the whole README and never meet an issue number, a spec ID, an internal component name, or a CI/release detail outside
## For developers. Implementation detail is findable (issues, dev docs, source) but not pushed at the user.