chore(backlog): add phase-0 milestone and tasks 126–139
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
5bc64a5b4e
commit
7faaa5c977
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
id: m-2
|
||||
title: "Phase 0 Prototype"
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
Initial working prototype: Pico firmware, PWA with CV pipeline, demo guide, slide deck, and first user tests
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
---
|
||||
id: TASK-126
|
||||
title: Repo structure setup
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:51'
|
||||
labels:
|
||||
- setup
|
||||
- repo
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: high
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Create directory structure (docs/, firmware/, app/js/, app/css/, app/guides/), move existing spec docs to docs/, write README.md
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 Directory structure matches plan
|
||||
- [ ] #2 Existing docs moved to docs/
|
||||
- [ ] #3 README.md with project overview, quick start, and structure
|
||||
<!-- AC:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
Repo structured, docs moved, README written with full project overview, hardware setup, command protocol, and licence info.
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
---
|
||||
id: TASK-127
|
||||
title: Guide JSON format + bicycle brake pad guide
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:51'
|
||||
labels:
|
||||
- content
|
||||
- guide
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: high
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Define the guide JSON schema and create the demo guide (bicycle-brake-pads.json) with 10 steps including detection labels, fallback strategies, completion conditions, and timed hints.
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 Guide JSON validates against schema
|
||||
- [ ] #2 10 steps with audio_text, pointer_target, completion_condition
|
||||
- [ ] #3 Fallback strategies for non-COCO parts
|
||||
- [ ] #4 Timed hints on each step
|
||||
<!-- AC:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
bicycle-brake-pads.json created with 10 realistic steps, COCO anchor + relative_to fallbacks, dwell/manual completion, and 2 hints per step.
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
---
|
||||
id: TASK-128
|
||||
title: Pico firmware — servo + LED drivers
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:51'
|
||||
labels:
|
||||
- firmware
|
||||
- hardware
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: high
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Write config.py, servo_driver.py (PCA9685 I2C, smooth interpolation), and led_driver.py (GPIO PWM brightness) for Raspberry Pi Pico.
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 PCA9685 init at 50Hz, set_angle with 500-2500us mapping
|
||||
- [ ] #2 Smooth interpolation in configurable degree steps
|
||||
- [ ] #3 LED PWM 0-255, blink helper, deinit cleanup
|
||||
- [ ] #4 Config centralises all pin/calibration constants
|
||||
<!-- AC:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
Three firmware files: config.py (constants), servo_driver.py (PCA9685 two-class design with smooth interp), led_driver.py (hardware PWM on GP15).
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
---
|
||||
id: TASK-129
|
||||
title: Pico firmware — command parser + USB serial
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:51'
|
||||
labels:
|
||||
- firmware
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: high
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Write command_parser.py (JSON line parser, validates & dispatches to servo/LED) and transport_usb.py (non-blocking USB serial listener at 115200 baud).
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 Parses all command types: pan/tilt, led, led_pwm, home, ping
|
||||
- [ ] #2 Returns JSON ack with current position
|
||||
- [ ] #3 Graceful error handling for malformed JSON
|
||||
- [ ] #4 Non-blocking stdin poll with buffer overflow guard
|
||||
<!-- AC:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
command_parser.py: stateless dispatcher with strict validation, defined processing order. transport_usb.py: select.poll non-blocking with 512-char overflow guard.
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
---
|
||||
id: TASK-130
|
||||
title: Pico firmware — BLE transport (Pico W)
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:51'
|
||||
labels:
|
||||
- firmware
|
||||
- ble
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: high
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Write transport_ble.py (BLE GATT Nordic UART Service) and main.py (auto-detect transport, cooperative poll loop). BLE advertises as 'GaiaAR', chunks notifications to 20-byte MTU.
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 NUS service with correct UUIDs registered
|
||||
- [ ] #2 IRQ handler queues to pending list, no heavy work in interrupt
|
||||
- [ ] #3 MTU chunking for notifications
|
||||
- [ ] #4 Auto-reconnect advertising on disconnect
|
||||
- [ ] #5 main.py soft-imports bluetooth for Pico/Pico W compat
|
||||
<!-- AC:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
transport_ble.py: GATT NUS with chunked notify, per-connection line buffers, auto-readvertise. main.py: soft BLE import, cooperative dual-transport loop, error-resilient.
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
---
|
||||
id: TASK-131
|
||||
title: PWA — camera feed + shell
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:51'
|
||||
labels:
|
||||
- pwa
|
||||
- frontend
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: high
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Write index.html (three views: setup/guide/complete), main.css (dark workshop theme, mobile-first), and camera.js (rear camera getUserMedia wrapper).
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 Three-view HTML shell with hidden attr toggling
|
||||
- [ ] #2 Dark theme with amber/green accents, 48px+ touch targets
|
||||
- [ ] #3 Camera feed fills viewport with environment-facing preference
|
||||
- [ ] #4 Graceful fallback for desktop webcams
|
||||
<!-- AC:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
index.html (183 lines), main.css (732 lines dark workshop theme), camera.js (environment-facing, desktop fallback).
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
---
|
||||
id: TASK-132
|
||||
title: PWA — transport abstraction (simulator + serial + BLE)
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:52'
|
||||
labels:
|
||||
- pwa
|
||||
- transport
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: high
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Write transport.js (GaiaTransport base class, SerialTransport via Web Serial, BLETransport via Web Bluetooth NUS, SimulatorTransport) and simulator.js (virtual pan/tilt panel with crosshair + LED indicator).
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 Base class with connect/disconnect/send/onMessage/isConnected
|
||||
- [ ] #2 SerialTransport: Web Serial 115200 baud, JSON lines
|
||||
- [ ] #3 BLETransport: NUS UUIDs, TX notify subscription, 20-byte MTU chunking
|
||||
- [ ] #4 SimulatorTransport: passes to Simulator.update()
|
||||
- [ ] #5 Simulator: floating panel with crosshair dot + LED circle + readout
|
||||
<!-- AC:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
transport.js: 3 implementations + factory. simulator.js: DOM panel with crosshair grid, LED indicator, angle readout. ?transport=simulator URL param works.
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
---
|
||||
id: TASK-133
|
||||
title: PWA — guide engine (step sequencing + audio)
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:52'
|
||||
labels:
|
||||
- pwa
|
||||
- guide
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: high
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Write guide-engine.js (load/sequence/advance steps, dwell timer completion detection, onStepChange/onGuideComplete callbacks), audio-engine.js (Web Speech TTS wrapper), and guide-store.js (IndexedDB offline cache).
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 Guide engine normalises both canonical and on-disk JSON schemas
|
||||
- [ ] #2 Dwell timer tracks continuous detection, resets on break
|
||||
- [ ] #3 TTS with English voice preference and queue support
|
||||
- [ ] #4 IndexedDB store with save/get/list/delete/importFromUrl
|
||||
<!-- AC:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
guide-engine.js: dual schema normalisation, dwell timer. audio-engine.js: SpeechSynthesis with voice selection. guide-store.js: IndexedDB gaia-guides store.
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
id: TASK-134
|
||||
title: PWA — MediaPipe CV pipeline + pointer mapper
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:52'
|
||||
labels:
|
||||
- pwa
|
||||
- cv
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: high
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Write cv-pipeline.js (MediaPipe ObjectDetector from CDN, EfficientDet Lite 0 float16, VIDEO mode, detection overlay drawing) and pointer-mapper.js (FOV-based bbox→pan/tilt angle conversion with exponential smoothing).
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 Dynamic import from MediaPipe CDN with GPU delegate + CPU fallback
|
||||
- [ ] #2 detectForVideo returns normalised bboxes with centerX/centerY
|
||||
- [ ] #3 drawDetections: green for target, amber dashed for others, HiDPI aware
|
||||
- [ ] #4 pixelToAngles: mirrored X axis, 80/60 FOV default
|
||||
- [ ] #5 relativeTarget for fallback anchor offsets
|
||||
- [ ] #6 Exponential smoothing factor 0.3
|
||||
<!-- AC:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
cv-pipeline.js: MediaPipe Tasks Vision CDN, EfficientDet Lite 0, normalised detections, styled overlay. pointer-mapper.js: FOV mapping, EMA smoothing, relative fallback.
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
---
|
||||
id: TASK-135
|
||||
title: PWA — offline support (SW + IndexedDB)
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:52'
|
||||
labels:
|
||||
- pwa
|
||||
- offline
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: medium
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Write sw.js (service worker with 3 cache buckets: shell/guides/mediapipe, cache-first for shell+CDN, network-first for guides, offline fallback) and manifest.json (PWA install metadata).
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 Three versioned cache buckets
|
||||
- [ ] #2 Shell pre-cached on install, old caches cleaned on activate
|
||||
- [ ] #3 CACHE_GUIDE_URL message handler for dynamic guide caching
|
||||
- [ ] #4 Offline fallback: cached index.html for nav, error JSON for guides
|
||||
- [ ] #5 PWA manifest with standalone display and portrait orientation
|
||||
<!-- AC:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
sw.js (210 lines): 3 cache buckets, pre-cache on install, clients.claim(), offline fallback. manifest.json with simulator shortcut.
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
id: TASK-136
|
||||
title: End-to-end hardware test
|
||||
status: To Do
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:52'
|
||||
labels:
|
||||
- testing
|
||||
- hardware
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: high
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Test full pipeline with physical hardware: Pico + PCA9685 + servos + LED. Verify USB serial command/ack, BLE connect from nRF Connect, servo movement, LED control. Test PWA↔Pico over both transports.
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 USB: echo JSON to /dev/ttyACM0, servo moves, LED on, ack received
|
||||
- [ ] #2 BLE: nRF Connect write to NUS RX, verify TX response
|
||||
- [ ] #3 PWA serial mode: connect, guide step sends pan/tilt, servo tracks
|
||||
- [ ] #4 PWA BLE mode: same as serial but wireless
|
||||
- [ ] #5 No firmware crash on malformed input
|
||||
<!-- AC:END -->
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
id: TASK-137
|
||||
title: 'Fill slide deck gaps (slides 8, 9, 13, 14, A3, A4)'
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:52'
|
||||
labels:
|
||||
- docs
|
||||
- slides
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: medium
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Write missing content for 4 slides in SLIDE_DECK_PROMPT.md (BT communication, single earbud, manufacturing, IP/Commons) and 2 slides in ANNEX_PROMPT.md (healthcare/first aid, closing platform statement).
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 Slide 8: BT 5.0 dual connection, NUS, <20ms latency, USB-C fallback
|
||||
- [ ] #2 Slide 9: single earbud spec — IPX4, 4h+, physical button, TTS-driven
|
||||
- [ ] #3 Slide 13: Phase 1 CEM 500 units, Phase 2 local 3D-print + kit
|
||||
- [ ] #4 Slide 14: triple licence stack (CERN-OHL-S, AGPL, CC BY-SA)
|
||||
- [ ] #5 A3: healthcare/first aid — wound care, CPR, tourniquet
|
||||
- [ ] #6 A4: closing — platform not product, Commons logic
|
||||
<!-- AC:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
All 6 GAP placeholders replaced with full slide content matching deck tone and format. BT, earbud, manufacturing, IP, healthcare, closing slides complete.
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
id: TASK-138
|
||||
title: Document headlamp mounting interface
|
||||
status: To Do
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:52'
|
||||
labels:
|
||||
- hardware
|
||||
- docs
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: medium
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Measure and document the slide-and-lock interface on the Decathlon Forclaz headlamp. Create a technical drawing or dimensioned sketch for the custom module housing design. Include tolerances for 3D printing.
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 Physical measurements of headlamp mounting interface
|
||||
- [ ] #2 Dimensioned sketch or CAD file in docs/
|
||||
- [ ] #3 Print tolerances documented for FDM PETG/ASA
|
||||
- [ ] #4 Photos of reference headlamp for comparison
|
||||
<!-- AC:END -->
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
id: TASK-139
|
||||
title: First user test (5 users)
|
||||
status: To Do
|
||||
assignee: []
|
||||
created_date: '2026-03-29 20:52'
|
||||
labels:
|
||||
- testing
|
||||
- ux
|
||||
milestone: m-2
|
||||
dependencies: []
|
||||
priority: medium
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Recruit 5 users with no prior bicycle repair experience. Test full end-to-end flow: put on headset, connect phone, follow brake pad guide to completion. Document usability issues, completion rate, time, and qualitative feedback.
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 5 users complete the test session
|
||||
- [ ] #2 Completion rate and time recorded per user
|
||||
- [ ] #3 Usability issues documented with severity ratings
|
||||
- [ ] #4 Post-test interview notes captured
|
||||
- [ ] #5 Summary report with top 3 improvement priorities
|
||||
<!-- AC:END -->
|
||||
Loading…
Reference in New Issue