Lapin Futé v1 delivery map #1
- @github-anthodev opened this issue · Aug 29, 2026edited
Destination
A new user can install Lapin Futé, enter a personal PRIM API key in companion options, configure up to six local favorites for Île-de-France bus, metro, tram, RER and Transilien services, and consult departures and supported traffic information on a supported Pebble. The app uses a watch and phone only, with static configuration/catalog hosting and no dedicated backend.
Binding architecture and behavior
- One RePebble Alloy embedded-JavaScript watchapp targets emery and gabbro. PebbleKit JS owns direct PRIM HTTPS requests, normalization, phone-local cache, configuration synchronization and display preparation. The watch renders prepared records and owns navigation, local clock/countdowns and bounded protocol state.
- The configuration page and offline-generated catalog are static HTTPS assets. Catalog generation is operator tooling, not a runtime server. No hosted relay, server-side user database or server-owned PRIM key is required.
- Each user supplies a personal PRIM key. It remains phone-local at rest and is sent directly to the authorized PRIM host. The page sees only a newly entered replacement, never the stored key on reopening. No key reaches the watch, AppMessage, public assets or operational logs.
- Six favorites is the uniform read/save/synchronization limit. The app has not been published; there is no legacy seven/eight-favorite migration path.
- Domain schema version 1; display wire version 2; 19 explicit aliases. SDK key 15025 is a separate transport exchange. Fixed XS split: 57,344 bytes, stack 3,584, slots 41,472, chunks 12,288. Inbox 768 bytes, outbox 192 bytes, unsent watch queue four messages.
- PRIM retrieval is event-driven: app open, active-favorite selection after 500 ms settling, or explicit manual refresh. Events obey the 60-second fresh-cache and single-flight policy. Cache-only navigation and synchronization recovery are not new upstream-fetch triggers. No periodic/background polling, automatic retry loop, Wakeup, Worker or timeline refresh.
- Changed DIFF releases result datasets only after a complete valid inventory and nonzero NEED, displays synchronization loading and preserves old committed favorite metadata until successful commit. Recovery requests overview then visible detail from phone cache only. No-op/reorder stays warm. FULL keeps its destructive semantics; an already-opened runtime does not automatically fetch results after FULL and permits manual recovery.
- Authored UI copy ships in French and English, with English fallback outside French. Preserve user/source label content subject to existing display fitting and supported-control normalization contracts.
Delivery state and evidence
Issues #2–#7 and watch redesign #16 are closed. The phone-only/D2 implementation was pushed as d894f407 on feature/redesign-watch-experience/watch/16. PR #17 is now merged into develop as a46bf24ac09c8c752207a60434830706b31320b9. This establishes integration, not release or physical acceptance.
Reported integration baseline:
- 214 host tests, both release builds, modeled radio and 19-alias gates pass; shared/runtime reviews approved.
- Actual SDK companion and emery/gabbro emulator fixture runs exercised six-favorite synchronization, navigation, traffic, changed/no-op/reordered DIFF, FULL manual recovery and retained reopen without reseeding.
- Each emulator completed 600 seconds with the app open but inactive, with no new AppMessages or fixture requests. This does not prove silence after app closure.
- The bounded six-favorite corpus left at least 10% chunk-arena reserve at measured natural compacted-live samples: emery 1,468 bytes / 11.95%; gabbro 1,348 bytes / 10.97%. These are not universal transient/lifetime peaks or a 50-refresh soak result.
- Detailed evidence is currently local under var/production-verification/, including integration-status.json and budget/report.json. Attach durable sanitized evidence to the owning ticket before treating it as remotely auditable acceptance. Ignored local files are not published repository evidence.
The final fixture campaign made no live PRIM calls and does not establish physical-device, real-phone end-to-end or controlled 24-hour battery acceptance.
Remaining work and order
- #8 Harden failures and compatibility: useful-stale boundary, fault/key/quota/security matrix, rapid-input and 50-refresh soak, physical recovery and battery proof. Reuse valid existing evidence instead of rerunning completed scenarios.
- #9 Ship Lapin Futé version 1, after #8: static configuration/catalog deployment, production phone-to-PRIM journeys, release assets, current license/attribution, privacy, rollback and physical release gates.
For lifecycle silence, inspect existing evidence first. Only if app-closed behavior remains unproven or affected by a change, run one targeted 120-second app-closed observation. Do not require a new ten-minute observation or repeat equivalent evidence in the release ticket. This user-approved change does not remove the separate soak or 24-hour physical battery gates.
Execution notes
- Work on the first unblocked child with incomplete acceptance criteria; claim it before concurrent implementation.
- Current repository contracts and exact runtime evidence are authoritative. Earlier closed issues describe history, not a requirement to restore the backend.
- Record results and coverage limits in the owning issue. Close only when its criteria are met, then add a linked summary here. Do not present fixtures/emulators as production or physical proof.
- Verify current official publication, hosting and licensing requirements rather than assuming a provider or publication channel.
Decisions so far
- #2: foundation and contracts delivered; current D2 supersedes historical wire details.
- #3: IDFM catalog delivered; runtime selection now uses static assets.
- #4: departure normalization delivered; production ownership now resides in the phone companion.
- #5: bilingual configuration delivered, now using static catalog selection and a six-favorite cap.
- #6: phone-local persistence and synchronization delivered; current DIFF/FULL behavior is defined above.
- #7: Pebble consultation delivered.
- #16: watch redesign issue closed; pushed D2 implementation and bounded emulator evidence recorded above. Publication remains #9.
Out of scope
Journey planning; nearby-stop/location search; background polling, alerts or reminders; national SNCF coverage outside Île-de-France; user accounts; telemetry; native Android/iOS apps; favorite export; cloud synchronization. Existing PRIM traffic display is in scope; richer disruption features beyond the current contract require a separate decision.
- @github-anthodev · Sep 13, 2026edited
Lapin Futé v1.0.0 is now shipped.
- #8 and #9 are closed
- RePebble: https://apps.repebble.com/6d6aa01b7ecb4cfea469a183
- GitHub release: https://github.com/Anthodev/lapin-fute/releases/tag/v1.0.0
- Production configuration site: https://lapin-fute.b-cdn.net/
- Successful release workflow: https://github.com/Anthodev/lapin-fute/actions/runs/34755154247
Closing the v1 delivery map. Any future physical-device or long-duration battery evidence can be tracked as dedicated follow-up work rather than keeping the shipped v1 map open.
Sign in to comment.