Coach Poulpy
A training platform: Android and iOS apps first, guest-only and offline, with a server and website to come. One Kotlin Multiplatform core holds every decision about workouts; the apps only render and talk to hardware. The README maps the modules and how to run each part.
Read before you work
CONTEXT.md: the glossary. Name things with its terms in code, issues, tests and UI copy.docs/adr/: decisions that look odd without their reason. Read the ones touching your area; say so explicitly if your change contradicts one.docs/architecture.md: the overview, for anything spanning modules.docs/design-system.mdanddocs/brand.md: before any screen, colour, copy or Poulpy change.CONTRIBUTING.md: the issue-to-PR flow and labels.docs/agents/refining-issues.md: how to turn a Quick idea into an agent-ready issue ("refine #N").docs/agents/refining-issues.md: how to turn a Quick idea into an agent-ready issue ("refine #N").docs/agents/code-graph.md: the code graph (codegraph_exploreMCP tool, orcodegraph explorein Bash). Use it first to find code and see what depends on it.docs/agents/areas.md: the rules per area (model and schema, screens and mockups, Poulpy, translations, housekeeping). Read the sections for the areas you touch; there are no role threads to consult.
Prove a change works
sh
./gradlew jvmTest jsTest :server:test :tools:i18n:test # shared logic, server and the string generator
node design/build-tokens.mjs --check # theme files match design/tokens.json
node design/build-poulpy.mjs --check # Poulpy drawings match their generator
node design/build-body-map.mjs --check # body map figures match their generator
node design/build-body-map-shapes.mjs --check # body map shapes for the apps match design/body-map.jsonAndroid and iOS only build in CI (.github/workflows/ci.yml); a PR is done when CI is green. Bluetooth, sound, haptics, background running and installs need a real phone: label the issue device-test and say what to check.
House rules
- Logic goes in shared Kotlin with a test; Compose and SwiftUI code stays thin and mirrors the other platform.
- Theme files, Poulpy drawings and body map figures are generated: edit
design/tokens.json,design/build-poulpy.mjsordesign/build-body-map.mjsand regenerate. The apps' body map shapes followdesign/body-map.json: rundesign/build-body-map-shapes.mjsafter it changes. - Mockups are plain HTML in
design/mockups/(ADR 0016), styled only withvar(--cp-*)from the token CSS,shared/mockup.cssanddesign/poulpy/*.svg. A new screen or redesign starts indrafts/; nothing is built until a PR moves it toagreed/. The claude.ai canvas is scratch only. - Every user-facing string is added to
i18n/messages/enandi18n/messages/fr(app.jsonfor screens,domain.jsonfor shared words,catalog.jsonfor exercise text). Android, iOS andDomainTextare generated from them at build time; never write a native string file. Seei18n/README.md. - Catalog slugs never change; set
"retired": trueinstead of deleting, and raiseversion. - Poulpy is never guilt: pain or rehab always shows the blue side, and errors are crimson with an icon, never ember.
- A schema change is a new SQLDelight migration; existing phones keep their data.
- The docs site is the source of truth. The Docs site workflow comments each PR's preview and the docs pages, sections and mockups to review (
site/review-links.mjs); never post a review comment of your own. Put anything the reviewer must know in the PR description, and sayCloses #nso the mockups drawn for that issue are linked. - One review per PR, not one per area. Only the Maintainer is a long-running thread; every other task is a short thread that reads these docs.
- Branches are named
<type>/<issue-number>-<short-description>in English (feat/21-training-plans, ordocs/brand-decisionswith no issue); typesfeat,fix,docs,chore,design. Never a random suffix, session id orclaude/prefix, even if a tool suggests one.
Agent skills
Issue tracker
Issues live in GitHub Issues on tkint/coach-poulpy. See docs/agents/issue-tracker.md.
Triage labels
The default five triage roles, label names unchanged. See docs/agents/triage-labels.md.
Domain docs
Single context: CONTEXT.md and docs/adr/ at the root. See docs/agents/domain.md.