Commit graph

773 commits

Author SHA1 Message Date
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
Argo Workflows CI
26a27b748c ci: auto-bump version to 0.1.327 2026-05-06 01:55:07 +00:00
jedarden
a0ed41e899 fix(simulator): remove unused variables from propagation engine
Cleaned up unused variables in ray-based propagation model:
- Removed unused directPathLoss in computeReflectionPower
- Removed unused reflectionZ in floor/ceiling reflection functions

The propagation engine implements:
- Direct path computation (TX -> walker -> RX)
- First-order reflections (walls, floor, ceiling)
- Path loss model using log-distance
- Wall attenuation based on material type
- Fresnel zone modulation

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 21:54:33 -04:00
Argo Workflows CI
58f85b48b7 ci: auto-bump version to 0.1.326 2026-05-06 01:41:06 +00:00
jedarden
80d070d0d3 feat(placement): add space key to place virtual nodes at camera target
- Press space bar to place a new virtual node at camera target position
- Node is placed at intersection of camera ray with ground plane
- Position is clamped to room bounds
- Height defaults to 80% of room height or 1.5m minimum
- Virtual nodes are rendered as ghost wireframe nodes (via viz3d.js)
- Links to/from virtual nodes are dashed (via viz3d.js)

This completes the 'space + virtual node placement' feature for the
simulator, reusing the 3D editor with ghost wireframe nodes and dashed links.
2026-05-05 21:40:48 -04:00
Argo Workflows CI
425236c746 ci: auto-bump version to 0.1.325 2026-05-06 01:24:13 +00:00
jedarden
c46dfa21fc feat(simulator): implement 3D editor reuse with ghost wireframe nodes and dashed links
- Refactored simulate.js to properly use existing HTML structure from simulator.html
- Added ghost wireframe node visualization using THREE.OctahedronGeometry with wireframe material
- Implemented dashed links between virtual nodes using THREE.LineDashedMaterial
- Added CSS for selected state highlighting and proper panel positioning
- Reused TransformControls from 3D editor for node placement
- Virtual nodes appear as teal-colored wireframe octahedrons
- Links between virtual nodes render as teal dashed lines
- GDOP overlay updates in real-time as nodes are dragged

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 21:23:33 -04:00
Argo Workflows CI
1e03f17e24 ci: auto-bump version to 0.1.324 2026-05-06 00:27:41 +00:00
jedarden
d185817a0b feat(simulator): add viz3d.js dependency to simulator.html
The simulator page now includes the viz3d.js 3D visualization layer
which provides the scene management API needed by the simulator.
This ensures the simulator 3D scene is properly initialized.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 20:27:22 -04:00
jedarden
bf0f5b4b54 test(simulator): fix tests to match current API
Component 17 pre-deployment simulator is fully implemented. This commit
updates the test file to match the current API after refactoring:

- Changed from PropagationModel.PathLoss() to PhysicsModel.PathLossdB()
- Changed from PropagationModel.WallLoss() to PhysicsModel.WallAttenuation()
- Changed from PropagationModel.ReceivedPower() to PropagationModel.ExpectedRSSI()
- Changed from PropagationModel.PhaseAt() to PhaseAtSubcarrier()
- Changed from PropagationModel.DeltaRMS() to PhysicsModel.DeltaRMS()
- Removed non-existent IsInFirstFresnelZone() - use FresnelZoneNumber() instead
- Removed non-existent SimulateCSIData(), GenerateCSIFrame(), GenerateCSIFrames(), ComputeLinkMetrics()

All simulator tests now pass.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 20:27:22 -04:00
Argo Workflows CI
10956f8c44 ci: auto-bump version to 0.1.323 2026-05-05 22:34:31 +00:00
jedarden
f18916d3a9 feat(replay): implement time-travel debugging with parameter tuning
- Add 'Pause Live' button that freezes 3D view and reveals timeline scrubber
- Implement scrubbing backward/forward through recorded history (1×, 2×, 5×)
- 3D scene renders blobs exactly as detected at scrubbed time, including trails
- Add parameter tuning overlay with sliders for detection parameters:
  - Detection threshold (deltaRMS)
  - Baseline time constant (tau)
  - Fresnel weight decay rate
  - Subcarrier selection count (NBVI)
  - Breathing sensitivity
- Adjusting slider re-runs pipeline on recorded CSI with new parameters
- Add 'Apply to Live' button that writes tuned parameters to running pipeline

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 18:33:37 -04:00
Argo Workflows CI
9515e06110 ci: auto-bump version to 0.1.322 2026-05-05 21:38:55 +00:00
jedarden
179f9e6ea4 feat(api): implement GET /api/zones/:id/history occupancy history endpoint
- Add hourly zone history snapshot recording that runs every hour
- Returns [{timestamp, count, people:[]}] in hourly buckets
- Supports period query parameter: 24h (default), 7d, 30d
- Zone history is persisted in zone_history SQLite table
- Initial snapshot recorded on startup for the current hour
2026-05-05 17:38:22 -04:00
Argo Workflows CI
b69431d657 ci: auto-bump version to 0.1.321 2026-05-05 21:27:52 +00:00
jedarden
911c1ff154 test(api/zones): add comprehensive test for GET /api/zones/:id/history
Add TestGetZoneHistoryWithData which verifies:
- Response format with timestamp, count, and people array
- Period query parameter (24h, 7d, 30d)
- Correct number of hourly buckets returned
- People array parsing from JSON

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 17:27:32 -04:00
Argo Workflows CI
8a2681b26a ci: auto-bump version to 0.1.320 2026-05-05 21:19:55 +00:00
jedarden
9f9df2f70c zones: implement GET /api/zones/:id/history endpoint
Implement hourly occupancy history endpoint that returns zone_history
records from the database. The endpoint returns hourly snapshots with
count and people list, supporting period query parameter (24h, 7d, 30d).

Changes:
- Modified GetZoneHistory to query zone_history table instead of
  computing from crossing_events
- Added encoding/json import to parse people JSON field
- Split database schema creation into manager_migrate.go for editability
- Split zone history snapshot logic into manager_history.go
- Updated tests to insert zone_history data instead of crossing_events

The zone_history table stores pre-aggregated hourly snapshots written
by RecordZoneHistorySnapshot, which should be called periodically.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 17:19:35 -04:00
Argo Workflows CI
408f3b6a78 ci: auto-bump version to 0.1.319 2026-05-05 19:30:29 +00:00
jedarden
71c105c85d api: complete GET /api/portals/:id/crossings endpoint
Add crossing_events table (migration 16) for portal crossing log with
cursor pagination support. The endpoint returns [{timestamp, direction,
person, blob_id, from_zone, to_zone}] with ?limit and ?before cursor
pagination parameters.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 15:30:08 -04:00
Argo Workflows CI
d032ce8199 ci: auto-bump version to 0.1.318 2026-05-05 18:31:54 +00:00
jedarden
62133dff5b api: complete GET /api/portals/:id/crossings endpoint
- Add ID field to CrossingEvent struct for database row ID
- Update GetPortalCrossings to query and return the database id column
- Fix getPortalCrossings handler to populate all response fields:
  - ID: database row ID
  - PortalID: portal ID from the crossing event
  - BlobID: blob identifier
  - Direction: a_to_b or b_to_a
  - FromZone: source zone name
  - ToZone: destination zone name
  - Timestamp: crossing timestamp
  - Person: BLE identity if available
- Update tests to verify all fields are properly set

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 14:31:31 -04:00
Argo Workflows CI
a60777cc47 ci: auto-bump version to 0.1.317 2026-05-05 18:11:22 +00:00