Commit graph

764 commits

Author SHA1 Message Date
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
jedarden
15c082c344 fleet: add idle role to validRoles and add disable/enable tests
- Added "idle" to validRoles map for consistency with disable/enable flow
- Added comprehensive tests for disableNode and enableNode handlers
- Tests cover: disable from tx/rx/tx_rx, already idle, node not found
- Tests cover: enable with saved role, no saved role (defaults to rx),
  already enabled, node not found
- Added round-trip test for full disable/enable cycle

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 14:10:52 -04:00
Argo Workflows CI
9fe1265525 ci: auto-bump version to 0.1.316 2026-05-05 17:51:15 +00:00
jedarden
21829b9738 api: add GET /api/baseline and POST /api/baseline/capture endpoints
Some checks are pending
CI Benchmark - Fusion Loop Timing / Fusion Loop Timing Benchmark (push) Waiting to run
Implements baseline read/capture endpoints for the dashboard. GET /api/baseline
returns [{link_id, snapshot_time_ms, confidence, n_sub}] for all links.
POST /api/baseline/capture starts a 60s quiet-room capture with optional
links filter.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 13:50:31 -04:00
Argo Workflows CI
b067131614 ci: auto-bump version to 0.1.315 2026-05-05 17:40:21 +00:00
jedarden
6d8fc086ff api: register GET /api/status and GET /api/occupancy endpoints
Implements two REST API endpoints as defined in the plan's REST API spec:

1. GET /api/status - Returns system status including:
   - version: Application version string
   - nodes: Number of online nodes
   - blobs: Number of currently tracked blobs
   - uptime_s: Uptime in seconds
   - detection_quality: System-wide detection quality (0-100)

2. GET /api/occupancy - Returns zone occupancy data:
   - zones: Map of zone names to {count, people[]}
     - count: Number of people in the zone
     - people: List of person names (BLE-identified)

These are simple read-only endpoints for dashboard and Home Assistant
integration for quick system checks and occupancy queries without WebSocket.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 13:39:56 -04:00
Argo Workflows CI
2f4c9d71be ci: auto-bump version to 0.1.314 2026-05-05 17:10:31 +00:00
jedarden
37571ece97 api/notifications: register preview endpoint in main.go
The GET /api/notifications/preview endpoint was already implemented
in internal/api/notifications.go but was never registered in main.go.
This commit wires up the NotificationsHandler to enable the test
thumbnail endpoint for UI development and QA.

The endpoint accepts query parameters:
- type: notification type (fall, anomaly, zone_enter, sleep)
- person: person name (optional, defaults to "Alice")

It calls the appropriate Generate*Thumbnail function from the
render package and returns PNG bytes with Content-Type: image/png.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 13:09:54 -04:00
Argo Workflows CI
45aa553a1f ci: auto-bump version to 0.1.313 2026-05-05 16:52:33 +00:00
jedarden
8a642705e8 mqtt: wire security_mode and rebaseline command subscriptions
- Add SubscribeToSecurityMode handler that calls anomalyDetector.SetSecurityMode()
  with SecurityModeArmed for 'arm' and SecurityModeDisarmed for 'disarm'
- Add SubscribeToRebaseline handler that publishes event bus events for baseline capture
- Both subscriptions allow Home Assistant automations to control security and rebaseline
2026-05-05 12:51:37 -04:00