Commit graph

795 commits

Author SHA1 Message Date
jedarden
2c8bbcf646 fix(fleet): remove duplicate route registration to prevent chi panic
Some checks are pending
CI Benchmark - Fusion Loop Timing / Fusion Loop Timing Benchmark (push) Waiting to run
- Remove duplicate node-specific routes (role, label, locate, delete) from
  FleetHandler.RegisterRoutes to avoid chi panic on duplicate registration
- Keep only unique FleetHandler routes: /api/fleet/health, /api/fleet/history,
  /api/fleet/optimise, /api/fleet/simulate
- Add startup smoke test TestRouteRegistrationNoPanic to verify both Handler
  and FleetHandler can be registered on same router without panic

main.go registers both fleet.NewHandler and fleet.NewFleetHandler on the
same router, which previously caused chi to panic due to duplicate routes:
  POST /api/nodes/{mac}/role
  PATCH /api/nodes/{mac}/label
  POST /api/nodes/{mac}/locate
  DELETE /api/nodes/{mac}

The Handler has comprehensive node/room/mode endpoints while FleetHandler
focuses on health/optimization/simulation, so duplicates are removed from
FleetHandler.

Closes: bf-3o15x
2026-05-24 09:47:54 -04:00
jedarden
b7bffd1388 chore(marathon): GLM-4.7 launcher; origin->Forgejo (mirrors to GitHub)
Some checks are pending
CI Benchmark - Fusion Loop Timing / Fusion Loop Timing Benchmark (push) Waiting to run
2026-05-24 09:37:25 -04:00
jedarden
107deb0b7d docs(plan): add Installation & Onboarding Test Plan with simulated ESP32 devices
Detailed IO-1..IO-11 scenarios validating the full new-user journey (fresh install ->
first-run PIN setup -> device onboarding -> operational) entirely via the spaxel-sim
ESP32 simulator, hardware-free and deterministic in CI. IO-1/3/4/6 are release hard-gates.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:59:01 -04:00
jedarden
80e5805960 chore: remove mothership server binary + scratch binaries + stray .bak
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:55:54 -04:00
jedarden
7a2e856d53 chore: remove remaining compiled binaries (sim, spaxel-sim, cmd/sim/spaxel-sim, mothership/spaxel-sim)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:54:56 -04:00
jedarden
08c419fecc chore: remove mothership/sim binary (missed in artifact cleanup)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:54:35 -04:00
jedarden
7a06c8e1dd chore: remove committed code artifacts (binaries + node_modules)
Delete compiled Go binaries (sim, spaxel-sim, cmd/sim/spaxel-sim, mothership/{sim,spaxel-sim},
*.test, acceptance.test) and the tracked dashboard/node_modules/ (6689 files) that were
polluting the repo. Add .gitignore rules so they stay out. Dashboard deps regenerate via npm ci.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:54:12 -04:00
jedarden
9fe974e0d7 MQTT command/rebaseline and HA auto-discovery lifecycle management already implemented
All functionality specified in the task is already in place:
- HA discovery configs published with retain=true on first connect
- Discovery re-published when zones/persons are added/renamed via callbacks
- Empty retained payload published on zone/person deletion
- MQTT command subscriptions wired (rebaseline, security_mode, system_mode)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 10:14:28 -04:00
jedarden
86b903f090 Remove unused findLinksForZone function causing build error
The MQTT command/rebaseline and HA auto-discovery lifecycle management
were already implemented. Only removed an unused stub function that was
causing compilation to fail.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 09:58:25 -04:00
Argo Workflows CI
bf3c1a6b2b ci: auto-bump version to 0.1.346 2026-05-06 12:29:07 +00:00
jedarden
55a09ec0f0 Implement TX slot collision detection and adaptive re-stagger
- Add CollisionDetector in fleet/collision.go that tracks frame arrivals from TX nodes
- Detect collisions when CSI frames from different TX nodes arrive within 3ms
- Calculate collision rate over 60-second sliding window
- Trigger adaptive re-stagger when collision rate exceeds 5% threshold
- Re-stagger generates random slot offsets to break up persistent collisions
- Rate limit re-stagger to minimum 30-second intervals
- Integrate with ingestion server to record frame arrivals
- Integrate with fleet manager to push updated config messages on re-stagger
- Add comprehensive unit tests for collision detection logic

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 08:28:24 -04:00
Argo Workflows CI
115156807a ci: auto-bump version to 0.1.345 2026-05-06 11:48:09 +00:00
jedarden
b7bb1e00b0 Implement fleet status page with full table view and bulk actions
- Added dashboard/static/js/fleet.js: core fleet management module with API functions for node operations (identify, reboot, update, remove), bulk operations (update all, re-baseline all), role assignment, config export/import, and camera fly-to integration
- Added dashboard/static/css/fleet-page.css: complete styling for fleet table with sortable columns, status indicators, action buttons, bulk actions bar, filters, modals, and responsive layout
- Fleet table columns: Name, MAC, Status, Firmware, Uptime, Position, Role, Health, Packet Rate, Temperature, Actions
- Bulk actions: Update All (rolling OTA with 30s stagger), Re-baseline All, Export Config, Import Config
- Camera fly-to: clicking position coordinates stores MAC in localStorage and navigates to live view with highlight
- All node actions execute correctly: identify (blink LED), update firmware, remove from fleet, re-assign role
- CSV export generates downloadable report with all node metrics

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 07:47:34 -04:00
Argo Workflows CI
2973ccaf5f ci: auto-bump version to 0.1.344 2026-05-06 11:34:38 +00:00
jedarden
b55147b8d9 Implement fleet status page with full table view, bulk actions, and camera fly-to
Features implemented:
- Full table with sortable columns: Name, MAC, Role, Position, Firmware, RSSI, Status, Uptime, Actions
- Role dropdown for changing node roles
- Position column with camera fly-to on click
- Firmware version with update badge
- Bulk actions: Update All, Re-baseline All, Export Config, Import Config, CSV Report
- Node actions: Restart, Update, Remove, Identify (blink LED)
- Responsive design for desktop and mobile
- Toast notifications and modal dialogs
2026-05-06 07:34:01 -04:00
Argo Workflows CI
78bf88a7ff ci: auto-bump version to 0.1.343 2026-05-06 11:04:48 +00:00
jedarden
e3c95ebc4c Implement mobile-responsive expert mode for Spaxel dashboard
Complete mobile touch interaction support for the 3D expert dashboard:

- Touch orbit/pan/zoom: Single-finger rotate, two-finger pan, pinch-zoom
  (Three.js OrbitControls native support)

- Hamburger menu for panel navigation: Collapsible sidebar with:
  * Fleet Status
  * Zones
  * Automation Triggers
  * Settings

- Bottom sheet panels on mobile: Slide-up panels with drag-to-close
  gesture, 70vh max height, safe-area inset support

- Touch-optimized buttons: Minimum 44×44px tap targets throughout

- No hover-dependent UI: All interactions work via touch

- Long-press context menu: Mobile replacement for right-click

Files:
- dashboard/static/js/mobile.js - Mobile interaction controller
- dashboard/static/css/mobile.css - Mobile-specific styles

Acceptance:
✓ Three.js scene responds to touch gestures
✓ Hamburger menu opens panel navigation
✓ Panels slide in from bottom on mobile
✓ All buttons are touch-friendly (≥44px)
✓ No features require hover
✓ Long-press context menu works on mobile

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 07:04:24 -04:00
jedarden
c7d37b834d Implement mobile-responsive expert mode for Spaxel dashboard
- Add hamburger menu for mobile panel navigation
- Create bottom sheet panels that slide from bottom on mobile
- Implement touch-optimized UI with 44x44px minimum tap targets
- Add mobile-specific panel content for Fleet Status, Zones, Triggers, Settings
- Support drag-to-close gesture on bottom sheets
- Maintain existing desktop panel behavior
- Integrate with existing systems (Viz3D, SpaxelPanels, SpatialQuickActions)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 07:04:24 -04:00
Argo Workflows CI
8cfd0699c6 ci: auto-bump version to 0.1.342 2026-05-06 10:19:36 +00:00
jedarden
3d0bb8bf45 Implement Component 36: Guided Troubleshooting
Proactive contextual help that appears when users encounter problems,
but never when things are working well.

Trigger conditions:
- Detection quality drop: Zone-level quality below 60% for >24h
  triggers helpful banner with guided diagnostics flow
- Repeated setting changes: Same settings key modified 3+ times
  within 60-minute sliding window triggers helpful hint
- Node offline: Any node offline for >2 hours shows troubleshooting
- First-time feature discovery: Brief tooltip shown once per feature
- After false positive feedback: Inline response explaining adjustments
- After successful calibration: Positive reinforcement message

Implementation:
- ZoneQualityTracker: Tracks per-zone detection quality, triggers
  callbacks when quality degrades
- EditTracker: Monitors settings edits for repeated changes
- FleetNotifier: Tracks node offline events
- DiscoveryTracker: Manages first-time feature tooltips
- API endpoints: /api/guided/* for diagnostics and feedback

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 06:19:00 -04:00
Argo Workflows CI
a3bca68150 ci: auto-bump version to 0.1.341 2026-05-06 10:14:52 +00:00
jedarden
092810c8d9 Implement Component 36: Guided Troubleshooting
Implemented proactive contextual help that appears when users encounter
problems, but never when things are working well.

Trigger conditions:
- Detection quality drops: Zone-level detection quality below 60%
  for >24 hours triggers helpful banner with guided diagnostics flow
- Repeated setting changes: Same qualifying settings key modified 3+
  times within 60-minute sliding window triggers hint banner
- Node offline: Any node offline for >2 hours shows timeline event
  with expandable troubleshooting steps
- First-time feature discovery: Brief, non-intrusive tooltips shown
  once per feature
- After false positive feedback: Inline response explaining threshold
  adjustments
- After successful calibration: Positive reinforcement message
  showing quality improvement

Design principles:
- Reactive, not proactive: help appears only when something seems wrong
- Dismissible in one tap: never blocks UI
- Never repeats after dismissal (stored in localStorage)
- Always explains what will happen next
- Never condescending: assumes user is intelligent

All tests pass (go test ./internal/guidedtroubleshoot/... and
npm test -- --testPathPattern=troubleshoot).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 06:14:08 -04:00
Argo Workflows CI
a2ccac0ebe ci: auto-bump version to 0.1.340 2026-05-06 10:09:37 +00:00
jedarden
0e1aa1e014 Implement Component 35: Morning Briefing
- Add briefing dashboard adapter wiring to hub for morning briefing push
- Morning briefing provides warm summary when user first opens dashboard each day
- Content includes: sleep summary, who is home, overnight anomalies, system health, predictions, learning progress
- Briefing generated automatically and stored as daily record in briefings table
- Delivered via dashboard (card overlay on first open), push notification at configured time, or webhook
- Display modes supported: expert mode (overlay), simple mode (first card), ambient mode (fade-in text)
- Briefing scheduler generates daily briefings and sends push notifications
- API endpoints: GET/POST /api/briefing/* for managing briefings
2026-05-06 06:09:01 -04:00
Argo Workflows CI
12ae1d97d7 ci: auto-bump version to 0.1.339 2026-05-06 09:01:41 +00:00
jedarden
7ed7806828 Implement Component 35: Morning Briefing
- Go function GenerateBriefing(date, person) assembles briefing in priority order
- Sections: critical alerts → sleep → who's home → anomalies → system health → predictions → learning
- Stored as daily record in briefings table with sections_json
- Expert mode: card overlay on first open, dismissible, slides away after 10s
- Simple mode: morning card as first card in layout
- Ambient mode: text fades in on first person detection, stays for 30s
- Delivery via dashboard, push notification, or webhook
- All acceptance criteria met
2026-05-06 05:01:05 -04:00
Argo Workflows CI
ee1164da86 ci: auto-bump version to 0.1.338 2026-05-06 07:59:39 +00:00
jedarden
b4e5b187e7 Implement Component 31: Ambient Dashboard Mode
Dedicated display mode for wall-mounted tablets or always-on screens.
Served at /ambient as separate lightweight route.

Implementation:
- Simplified, stylized top-down floor plan with clean lines and soft rounded corners
- People appear as softly glowing colored circles (BLE-identified) or neutral dots (unknown)
- Room labels show subtle occupancy: 'Kitchen · Alice' or 'Bedroom · Empty'
- Smooth, calm animations with interpolated positions (no jitter, no snapping)
- Canvas 2D renderer for minimal resource usage (no Three.js)
- Time-of-day awareness: morning (bright/cool), day (neutral), evening (warm/amber), night (very dim)
- Auto-dim when house empty for 30+ minutes with 'All secure' text
- Alert mode: pulsing red border, large text, action buttons for fall/security events
- Morning briefing integration: shows briefing text on first person detection

Files:
- dashboard/ambient.html - Ambient mode page
- dashboard/js/ambient.js - Ambient controller with WebSocket
- dashboard/js/ambient_renderer.js - Canvas 2D renderer with time-of-day palettes
- dashboard/js/ambient_briefing.js - Morning briefing integration
- dashboard/css/ambient.css - Comprehensive styling with time-of-day themes

Acceptance:
- Runs unattended on wall-mounted tablet for 7+ days
- Time-of-day palette transitions smoothly
- Alert mode breaks the calm appropriately
- Morning briefing displays on first detection
- Resource usage: <30 MB RAM, <5% CPU target
2026-05-06 03:59:12 -04:00
jedarden
0141820981 Implement Component 31: Ambient Dashboard Mode
- Fix auto-dim timeout from 60 seconds to 30 minutes (30 * 60 * 1000ms)
- Add auth.js dependency to ambient.html for proper authentication
- Rewrite ambient.test.js to remove problematic require() statements
- Update ambient.js with proper time-of-day handling
- Enhance ambient.css with time-of-day palette themes

Ambient mode provides a simplified, always-on display for wall-mounted
tablets with Canvas 2D rendering, time-of-day awareness, auto-dim after
30min of no presence, alert mode with pulsing red border, and morning
briefing integration.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 03:59:12 -04:00
Argo Workflows CI
1d0a0fa984 ci: auto-bump version to 0.1.337 2026-05-06 07:01:37 +00:00
jedarden
1092642893 Implement simple mode (progressive disclosure) for household members
- Card-based mobile-first UI for non-technical users
- Room cards showing occupancy count, person names, and status color
- Activity feed with chronological event list from timeline
- Alert banner for fall detection, anomaly alerts, and system warnings
- Quick actions: arm/disarm security, re-baseline, silence alerts
- Sleep summary card showing last night's sleep data
- Toggle between simple/expert mode with localStorage preference
- Added /simple route in mothership for serving simple mode page
- Added purple color scale to tokens.css for sleep features

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 03:01:04 -04:00
Argo Workflows CI
91716f3fdf ci: auto-bump version to 0.1.336 2026-05-06 05:58:02 +00:00
jedarden
c0057b5e82 Implement simple mode (progressive disclosure) for household members
- Add simple.html: mobile-first card-based UI without 3D scene
- Room cards show occupancy count, person names, and status color
- Activity feed displays chronological events from timeline
- Alert banner for fall detection, anomaly alerts, system warnings
- Quick actions: arm/disarm security, re-baseline, silence alerts
- Sleep summary card showing last night's sleep data
- Simple/expert mode toggle button in all views
- Mobile-responsive layout with touch-friendly interface
- Per-user default mode stored in localStorage

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 01:57:28 -04:00
Argo Workflows CI
7b6f46b410 ci: auto-bump version to 0.1.335 2026-05-06 05:05:15 +00:00
jedarden
654f86bdfc Fix Fresnel zone debug overlay mouse interaction bugs
Some checks are pending
CI Benchmark - Fusion Loop Timing / Fusion Loop Timing Benchmark (push) Waiting to run
- Raycast against both wireframe and fill meshes for reliable detection
- Wireframe is always present even when fill has 0 opacity (zones 2+)
- Sort intersections by distance to get the closest intersection
- Fixes hover detection not working properly for multi-zone Fresnel ellipsoids
2026-05-06 01:04:46 -04:00
jedarden
9739d87ac8 Fix Fresnel zone debug overlay mouse interaction bugs
- Fixed onFresnelMouseMove to properly iterate through arrays of ellipsoids
- Fixed showFresnelTooltip to access ellipsoid data from array correctly
- Enhanced tooltip to show zone count and improved units display

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 00:56:42 -04:00
Argo Workflows CI
b97dfb8f0d ci: auto-bump version to 0.1.334 2026-05-06 04:27:24 +00:00
jedarden
b8a204ad8a simulator: build and update spaxel-sim CLI tool
- Rebuilt spaxel-sim binary with latest code
- Copied binary to mothership directory for use in integration tests
- All tests pass (go test ./... && go vet ./...)
2026-05-06 00:26:51 -04:00
Argo Workflows CI
1897dab7cc ci: auto-bump version to 0.1.333 2026-05-06 04:18:14 +00:00
jedarden
b34892edfc simulator: implement spaxel-sim CLI tool
Implemented the CSI simulator CLI tool for testing Spaxel without
hardware. The simulator connects to a running mothership via WebSocket
and streams synthetic CSI binary frames.

Features:
- Virtual nodes positioned at corners, evenly distributed
- Walker random walk with Gaussian velocity updates (σ=0.3 m/s per axis per 50ms)
- Synthetic CSI generation using propagation model (path-loss + Fresnel zones)
- Binary frame format matching ingestion/frame.go (24-byte header + n_sub*2 payload)
- RSSI calculation: clamp(-30 - path_loss_dB, -90, -30)
- BLE advertisement simulation every 5s when --ble flag is set
- Reject detection: exits non-zero on {type:'reject'} from mothership
- Per-second stats: frame counts and blob count (from GET /api/blobs poll)

CLI Interface:
  spaxel-sim --mothership ws://localhost:8080/ws/node --token <token> \
             --nodes 4 --walkers 1 --rate 20 --duration 60s --ble \
             --seed 42 --space '6x5x2.5'

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-06 00:17:42 -04:00
Argo Workflows CI
f74b522939 ci: auto-bump version to 0.1.332 2026-05-06 03:46:33 +00:00
jedarden
2094f08a91 simulator: add periodic blob count polling to stats reporting
Add fetchBlobCount() function that queries the mothership's /api/blobs
endpoint and updates reportStats() to include blob count in periodic
statistics. Also updates printFinalStats() to show final blob count.

This completes the acceptance criteria for printing per-second frame
counts AND blob counts from GET /api/blobs poll.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 23:46:04 -04:00
Argo Workflows CI
f2353ffbe6 ci: auto-bump version to 0.1.331 2026-05-06 03:35:10 +00:00
jedarden
a2b0a73dd7 simulator: fix GDOP overlay and shopping list JSON output
- Fix GetShoppingList to use proper GDOP-based accuracy estimation
  instead of simplified implementation
- Fix simulation flow to run synchronously and display results
  immediately instead of polling
- Update GDOP legend HTML structure with proper styling hooks
- Add shopping list container with "add node at worst spot" button

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 23:34:43 -04:00
Argo Workflows CI
86ea9356e6 ci: auto-bump version to 0.1.330 2026-05-06 03:11:54 +00:00
jedarden
714c51acf6 simulator: fix GDOP overlay and shopping list JSON output
- Fix infinity handling in accuracy_map for GDOP overlay JSON output
- Convert average_gdop infinity to string for JSON compatibility
- Use 9999.0 sentinel value for infinity in accuracy_map array

This fixes the 'unsupported value: +Inf' error when using --gdop-overlay flag.
Both --gdop-overlay and --shopping-list now output valid JSON.
2026-05-05 23:11:26 -04:00
Argo Workflows CI
f10a517b11 ci: auto-bump version to 0.1.329 2026-05-06 02:44:04 +00:00
jedarden
a2abacb48d simulator: CSI simulator with synthetic walkers and propagation model
- Implements full CSI simulator CLI at cmd/sim/
- Synthetic CSI frame generation using two-ray propagation model (direct + first-order reflection)
- Walker types: random-walk, path-following, node-to-node traversal
- User-defined paths via JSON file (--path-file)
- Wall attenuation with material properties (drywall, brick, concrete, glass, metal)
- BLE advertisement simulation (--ble flag)
- Ground truth CSV output with walker positions and per-link deltaRMS
- Scenario support: fall detection, OTA, bag-on-couch
- Blob count verification via --verify flag
- Seed-based reproducibility for deterministic tests
- Full test coverage (33 tests passing)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 22:43:32 -04:00
Argo Workflows CI
ade0b10ac9 ci: auto-bump version to 0.1.328 2026-05-06 02:17:22 +00:00
jedarden
5ad6730524 fix(simulator): fix TestTwoRayModel wall reflection test case
The test was using a wall at x=10 from y=0 to y=5, which still creates
a valid reflection geometry for TX at (1,1) and RX at (3,3). The
reflection point calculation correctly finds that the reflected ray
would intersect the wall at y≈2.125, which is within the wall's bounds.

Fixed the test to use a wall that truly cannot create a valid reflection:
vertical wall at x=2 from y=10 to y=15. The reflection of TX (1,1) across
x=2 would be at (3,1). The line from (3,1) to RX (3,3) is vertical at x=3,
which never intersects the wall at x=2.

The simulator implements:
- Synthetic walkers (random walk, path-following, node-to-node)
- CSI generation with two-ray propagation model
- Wall attenuation (drywall: 3dB, brick/concrete: 10dB, glass: 2dB, metal: 20dB)
- Fresnel zone-based deltaRMS computation
- BLE simulation and CSV ground truth output

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 22:16:49 -04:00