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 ./...)
This commit is contained in:
parent
1897dab7cc
commit
b8a204ad8a
6 changed files with 8 additions and 4 deletions
|
|
@ -7,7 +7,7 @@
|
|||
{"id":"bf-2enwo","title":"Simulator: ray-based propagation engine (internal/sim/propagation.go — direct path + first-order reflections)","description":"","design":"","acceptance_criteria":"","notes":"","status":"closed","priority":2,"issue_type":"task","assignee":"claude-code-glm-4.7-foxtrot","created_at":"2026-05-06T00:40:16.873911203Z","updated_at":"2026-05-06T01:55:05.181196917Z","closed_at":"2026-05-06T01:55:05.181196917Z","close_reason":"Completed","source_system":"","source_repo":".","deleted_by":"","delete_reason":"","original_type":"","compaction_level":0,"compacted_at_commit":"","sender":""}
|
||||
{"id":"bf-2lfti","title":"Activity timeline (Component 27)","description":"## Goal\nImplement universal event stream timeline that serves as primary navigation for time and space.\n\n## Scope\n- Event types: detections, zone transitions, portal crossings, automation triggers, alerts (fall/anomaly/security), system events (node online/offline, OTA, baseline changes), learning milestones\n- Tap any event → 3D view jumps to that exact moment via time-travel\n- Inline actions per event: thumbs up/down (feedback), 'Why?' (explainability), create automation from event\n- Filters: By person, by zone, by event type, by time range (combinable)\n- Search: Natural language queries like 'kitchen occupied after midnight last week'\n- Scroll up = go back in time. Open dashboard after being away → scroll up to see everything that happened\n\n## Location\ndashboard/static/js/timeline.js (new module)\ninternal/api/events.go (GET /api/events endpoint already exists)\n\n## Acceptance\n- Timeline sidebar in expert mode shows all events in scrollable stream\n- Simple mode: timeline IS the main view as activity feed, with room cards above it\n- Tap event → 3D scene shows state at that moment\n- Search filters events correctly\n- FTS5 index on events table for natural language search","design":"","acceptance_criteria":"","notes":"","status":"closed","priority":2,"issue_type":"task","assignee":"claude-code-glm-4.7-foxtrot","created_at":"2026-05-05T04:05:43.262510021Z","updated_at":"2026-05-05T22:00:56.387536287Z","closed_at":"2026-05-05T22:00:56.387536287Z","close_reason":"Component 27 - Activity Timeline already fully implemented.\n\nTimeline sidebar (expert mode): sidebar-timeline.js provides collapsible panel with scrollable events, category checkboxes, person/zone filters, date range selector, text search with fuzzy matching, cursor pagination, virtualization for 1000+ events, WebSocket real-time updates.\n\nSimple mode activity feed: simple.html imports timeline.js as ES6 module; timeline is main view below room cards.\n\nTap-to-time-travel: Both timeline.js and sidebar-timeline.js implement handleSeek() calling SpaxelReplay.jumpToTime() to jump 3D view to event timestamp.\n\nSearch: Fuzzy matching client-side + FTS5 server-side via /api/events?q= parameter.\n\nFTS5 index: events.go creates events_fts virtual table with triggers for automatic full-text indexing.\n\nAll acceptance criteria met.","source_repo":".","compaction_level":0}
|
||||
{"id":"bf-2nofd","title":"Ambient dashboard mode (Component 31)","description":"## Goal\nDedicated display mode for wall-mounted tablets or always-on screens. Served at /ambient as separate lightweight route.\n\n## Scope\n- Simplified, stylized top-down floor plan — clean lines, soft rounded corners, no UI chrome\n- People appear as softly glowing colored circles (BLE-identified) or neutral dots (unknown), with names\n- Room labels show subtle occupancy: 'Kitchen · Alice' or 'Bedroom · Empty'\n- Smooth, calm animations: dots drift with interpolated positions, no jitter, no snapping\n- No toolbar, no buttons, no panels — just floor plan, people, small status line\n- Time-of-day awareness: morning (bright/cool), day (neutral), evening (warm/amber), night (very dim, minimal)\n- Adaptive behavior: house empty 30+ min → screen goes fully dark, 'All secure' in tiny text\n- Alert event: entire display transitions to alert mode with pulsing red border, large text, action buttons\n- Morning briefing integration: when first person detected, display briefly shows briefing text before fading to ambient\n\n## Implementation\n/ambient route serving lightweight HTML page\nNo Three.js — use Canvas 2D or SVG for minimal resource usage\nWebSocket receives same dashboard feed but only uses blob positions, zone counts, alerts\n<30 MB RAM, <5% CPU on 2018 iPad\n\n## Acceptance\n- Ambient mode runs unattended on wall-mounted tablet for 7+ days\n- Time-of-day palette transitions smoothly\n- Alert mode breaks the calm appropriately\n- Morning briefing displays on first detection\n- Resource usage: <30 MB RAM, <5% CPU","design":"","acceptance_criteria":"","notes":"","status":"open","priority":2,"issue_type":"task","created_at":"2026-05-05T04:06:11.529140576Z","updated_at":"2026-05-05T04:06:11.529140576Z","source_repo":".","compaction_level":0}
|
||||
{"id":"bf-2povs","title":"CSI simulator (spaxel-sim CLI)","description":"## Goal\nGo CLI tool that opens WebSocket connections as virtual nodes and sends synthetic CSI binary frames for development/testing without hardware.\n\n## CLI Interface\nspaxel-sim --mothership ws://localhost:8080/ws/node --token <node_token> --nodes 4 --walkers 1 --rate 20 --duration 60s --ble --seed 42 --space '6x5x2.5'\n\n## Synthetic CSI Generation\n- Each virtual node has fixed position (corners, evenly distributed)\n- Each walker follows random walk: Gaussian velocity updates (σ=0.3 m/s per axis per 50ms), reflected at walls\n- For each TX→RX link pair at each tick: compute amplitude and phase using propagation model (path-loss + wall penetration + reflection)\n- Inject Gaussian noise: amplitude_noisy[k] = amplitude × (1 + N(0, 0.05))\n- Serialize into 24-byte binary frame format with n_sub=64\n- rssi = clamp(-30 - path_loss_dB, -90, -30), noise_floor = -95\n\n## Location\ncmd/sim/main.go (new package)\n\n## Acceptance\n- Simulator exits non-zero if it receives {type:'reject'} from mothership\n- Prints per-second frame counts and blob count (from GET /api/blobs poll)\n- Integration test: run simulator for 30s, assert blob count > 0\n- --ble flag also sends simulated BLE advertisements every 5s","design":"","acceptance_criteria":"","notes":"","status":"open","priority":2,"issue_type":"task","created_at":"2026-05-05T04:05:43.376407159Z","updated_at":"2026-05-05T04:05:43.376407159Z","source_repo":".","compaction_level":0}
|
||||
{"id":"bf-2povs","title":"CSI simulator (spaxel-sim CLI)","description":"## Goal\nGo CLI tool that opens WebSocket connections as virtual nodes and sends synthetic CSI binary frames for development/testing without hardware.\n\n## CLI Interface\nspaxel-sim --mothership ws://localhost:8080/ws/node --token <node_token> --nodes 4 --walkers 1 --rate 20 --duration 60s --ble --seed 42 --space '6x5x2.5'\n\n## Synthetic CSI Generation\n- Each virtual node has fixed position (corners, evenly distributed)\n- Each walker follows random walk: Gaussian velocity updates (σ=0.3 m/s per axis per 50ms), reflected at walls\n- For each TX→RX link pair at each tick: compute amplitude and phase using propagation model (path-loss + wall penetration + reflection)\n- Inject Gaussian noise: amplitude_noisy[k] = amplitude × (1 + N(0, 0.05))\n- Serialize into 24-byte binary frame format with n_sub=64\n- rssi = clamp(-30 - path_loss_dB, -90, -30), noise_floor = -95\n\n## Location\ncmd/sim/main.go (new package)\n\n## Acceptance\n- Simulator exits non-zero if it receives {type:'reject'} from mothership\n- Prints per-second frame counts and blob count (from GET /api/blobs poll)\n- Integration test: run simulator for 30s, assert blob count > 0\n- --ble flag also sends simulated BLE advertisements every 5s","design":"","acceptance_criteria":"","notes":"","status":"in_progress","priority":2,"issue_type":"task","assignee":"claude-code-glm-4.7-foxtrot","created_at":"2026-05-05T04:05:43.376407159Z","updated_at":"2026-05-06T04:18:08.545444969Z","source_repo":".","compaction_level":0}
|
||||
{"id":"bf-2xykf","title":"Time-travel debugging with parameter tuning","description":"## Goal\nImplement pause live view, scrub timeline, replay 3D scene from recorded CSI with parameter tuning overlay.\n\n## Scope\n- Dashboard toolbar: 'Pause Live' button freezes 3D view and reveals timeline scrubber\n- Scrub backward/forward through recorded history (1×, 2×, 5×, or frame-by-frame)\n- 3D scene renders blobs exactly as they were detected at scrubbed time, including trails\n- Parameter tuning overlay: sliders for detection threshold, baseline time constant, Fresnel weight decay, subcarrier selection count, breathing sensitivity\n- Adjusting slider re-runs pipeline on recorded CSI with new parameters\n- 'Apply to Live' button writes tuned parameters to running pipeline\n\n## Location\ndashboard/static/js/timetravel.js (new module)\ninternal/replay/ (package already exists)\n\n## Acceptance\n- 'Pause Live' calls POST /api/replay/start with from=now-60s\n- Scrubber seeks to timestamp via POST /api/replay/seek\n- 3D view shows replay frames with replay:true flag\n- Parameter slider changes trigger PATCH /api/replay/params\n- 3D view immediately shows how detection would have differed\n- 'Apply to Live' calls POST /api/replay/apply-params","design":"","acceptance_criteria":"","notes":"","status":"closed","priority":2,"issue_type":"task","assignee":"claude-code-glm-4.7-foxtrot","created_at":"2026-05-05T04:05:43.329902167Z","updated_at":"2026-05-05T22:34:13.436161012Z","closed_at":"2026-05-05T22:34:13.436161012Z","close_reason":"Implemented time-travel debugging with parameter tuning:\n- Pause Live button freezes 3D view and reveals timeline scrubber\n- Scrub backward/forward through recorded history (1x, 2x, 5x)\n- 3D scene renders blobs exactly as detected at scrubbed time with trails\n- Parameter tuning overlay with sliders for all detection parameters\n- Adjusting slider re-runs pipeline on recorded CSI with new parameters\n- Apply to Live button writes tuned parameters to running pipeline","source_repo":".","compaction_level":0}
|
||||
{"id":"bf-3a2py","title":"Acceptance scenario integration tests (AS-1 through AS-6)","description":"## Goal\nImplement the 6 acceptance scenarios from plan §Acceptance Scenarios as verifiable integration tests in test/acceptance/.\n\n## Scenarios to implement\n\nAS-1: First-time setup in under 5 minutes\n - Start fresh mothership container, open /api/auth/setup, set PIN\n - Run spaxel-sim --nodes 1 (simulates provisioned node)\n - Assert: node appears in /api/nodes within 30s\n\nAS-2: Person detected while walking\n - spaxel-sim --nodes 2 --walkers 1 --duration 60s\n - Poll /api/blobs every second\n - Assert: blob count > 0 for >80% of the run\n\nAS-3: Fall alert fires correctly\n - spaxel-sim with a walker that drops Z rapidly (spike downward velocity, then stays at Z<0.5)\n - Assert: events table contains fall_alert within 15s of trigger\n - Assert: webhook endpoint (test HTTP server) receives POST\n\nAS-4: BLE identity resolves to person name\n - Register a BLE device as 'Alice' via POST /api/ble/devices\n - spaxel-sim --ble (sends BLE reports for that address alongside blobs)\n - Assert: /api/blobs returns at least one blob with person='Alice'\n\nAS-5: OTA update succeeds / rollback on bad firmware\n - Already partially covered by existing OTA rollback integration test\n - Extend to verify the VERIFIED badge path (valid firmware + node reconnects with new version)\n\nAS-6: Replay shows recorded history\n - Run 60s of sim data\n - POST /api/replay/start with a 30s window\n - Assert: replay blobs are returned via WebSocket with replay:true flag\n\n## Location\ntest/acceptance/*.go — one file per scenario, parallel to test/integration/\n\n## Acceptance\nAll 6 scenarios pass in the Argo CI workflow using spaxel-sim as the test harness","design":"","acceptance_criteria":"","notes":"","status":"closed","priority":2,"issue_type":"test","assignee":"claude-code-glm-4.7-golf","created_at":"2026-05-02T12:09:24.898852471Z","updated_at":"2026-05-05T11:39:18.097311991Z","closed_at":"2026-05-05T11:39:18.097311991Z","close_reason":"Implemented all 6 acceptance scenarios as verifiable integration tests in test/acceptance/\n\nAS-1: First-time setup in under 5 minutes\n- Fresh mothership container starts successfully\n- PIN setup works via /api/auth/setup\n- spaxel-sim --nodes 1 connects and appears in /api/nodes within 30s\n\nAS-2: Person detected while walking\n- spaxel-sim --nodes 2 --walkers 1 runs for 60 seconds\n- GET /api/blobs returns at least 1 blob during walk\n- Detection ratio > 80% of run duration\n\nAS-3: Fall alert fires correctly\n- spaxel-sim with fall scenario triggers rapid Z descent\n- Fall alert appears in /api/events within 30 seconds\n- Webhook endpoint receives POST with alert payload\n\nAS-4: BLE identity resolves to person name\n- BLE device registered via POST /api/ble/devices\n- spaxel-sim --ble sends BLE advertisements\n- Blob appears with person='Alice' within 15 seconds\n\nAS-5: OTA update succeeds / rollback on bad firmware\n- spaxel-sim --scenario ota simulates successful OTA\n- Node firmware version increments after update\n- Rollback scenario triggers rollback on boot failure\n\nAS-6: Replay shows recorded history\n- 60s of sim data generates CSI buffer\n- POST /api/replay/start creates replay session\n- Replay blobs returned with replay:true flag\n- Seek functionality works within 1 second target\n\nAll tests use spaxel-sim as the test harness for simulating CSI data without hardware.","source_repo":".","compaction_level":0}
|
||||
{"id":"bf-3d55l","title":"Fuzz tests: binary frame parser and JSON protocol","description":"## Goal\nAdd property-based/fuzz tests for the two highest-impact input parsing surfaces, per plan §Testing Strategy → Property-Based / Fuzz Tests.\n\n## Targets\n\n1. FuzzParseBinaryFrame — internal/ingestion/frame_fuzz_test.go\n Seed corpus: valid frame, truncated header, n_sub mismatch, channel=0, n_sub>128\n Property: never panic; drop/parse/error all OK\n\n2. FuzzParseJSONFrame — internal/ingestion/json_fuzz_test.go\n Seed corpus: hello, health, ble, motion_hint, ota_status, unknown type\n Property: never panic; unknown types return typed error\n\n3. Phase sanitization property test — internal/pipeline/phase/phase_property_test.go\n For all valid int8 I/Q pairs, Sanitize output never contains NaN or Inf\n\n## Acceptance\n- go test -fuzz=FuzzParseBinaryFrame ./internal/ingestion/ -fuzztime=60s: no panic found\n- go test -fuzz=FuzzParseJSONFrame ./internal/ingestion/ -fuzztime=60s: no panic found\n- Phase sanitization property test passes for all int8 I/Q corner cases","design":"","acceptance_criteria":"","notes":"","status":"closed","priority":2,"issue_type":"test","assignee":"claude-code-glm-4.7-golf","created_at":"2026-05-02T12:08:47.919183889Z","updated_at":"2026-05-04T10:01:38.755721488Z","closed_at":"2026-05-04T10:01:38.755721488Z","close_reason":"Completed","source_repo":".","compaction_level":0}
|
||||
|
|
@ -26,7 +26,7 @@
|
|||
{"id":"bf-5txbb","title":"Fleet status page","description":"## Goal\nFull table view of all registered nodes with all metrics, bulk actions, camera fly-to on click.\n\n## Scope\nTable columns:\n- Name: user-assigned friendly name\n- MAC: hardware address\n- Role: TX/RX/TX_RX — editable dropdown\n- Position: (x, y, z) — click to highlight node in 3D view and fly camera to it\n- Firmware: version string + 'Update available' badge\n- RSSI: last reported WiFi signal strength\n- Status: ONLINE/STALE/OFFLINE with colored indicator\n- Uptime: time since last boot\n- Actions: Restart, Update, Remove, Identify (blink LED)\n\nGlobal actions:\n- Update All (rolling OTA)\n- Re-baseline All\n- Export Config\n- Import Config\n\n## Location\ndashboard/static/js/fleet.js (new module, extract from existing code)\ninternal/api/fleet.go (already exists)\n\n## Acceptance\n- Table shows all registered nodes\n- Click position → camera flies to node in 3D view\n- Role dropdown changes node role\n- Actions execute correctly\n- Bulk actions work on all nodes\n- Export/import config works","design":"","acceptance_criteria":"","notes":"","status":"open","priority":2,"issue_type":"task","created_at":"2026-05-05T04:06:29.834674580Z","updated_at":"2026-05-05T04:06:29.834674580Z","source_repo":".","compaction_level":0}
|
||||
{"id":"bf-5vhya","title":"CI: pipeline timing benchmark gate","description":"## Goal\nAdd a benchmark that enforces the fusion loop timing budget as a CI quality gate, per plan §Quality Gates / Definition of Done (item 9).\n\n## What to build\n\nFile: internal/localizer/fusion/timing_budget_test.go\n\nRun the full fusion pipeline (phase sanitization → feature extraction → Fresnel accumulation → peak extraction → UKF update) against synthetic CSI data from spaxel-sim output.\n\nAssert:\n- Median fusion iteration < 15 ms over 600 iterations (60 seconds at 10 Hz)\n- P99 < 40 ms (hard limit)\n\n## CI integration\nAdd to Argo Workflows CI step after go test ./...:\n go test -bench=BenchmarkFusionLoop -benchtime=60s -count=1 ./internal/localizer/fusion/ | tee /tmp/bench.txt\n # fail if median exceeds 15ms threshold\n\n## Acceptance\n- Benchmark runs in the Argo CI workflow\n- Workflow fails if median latency exceeds 15 ms on the CI runner (allowance: 2x for slower hardware → 30 ms CI threshold, 15 ms production target)","design":"","acceptance_criteria":"","notes":"","status":"closed","priority":2,"issue_type":"task","assignee":"claude-code-glm-4.7-golf","created_at":"2026-05-02T12:09:00.487025943Z","updated_at":"2026-05-04T14:25:01.352506963Z","closed_at":"2026-05-04T14:25:01.352506963Z","close_reason":"Implementation already complete in commit 7afbdc9. The timing budget benchmark:\n\n1. File: mothership/internal/localizer/fusion/timing_budget_test.go\n - Runs full fusion pipeline (phase sanitization → feature extraction → Fresnel accumulation → peak extraction → UKF update)\n - Uses synthetic CSI data simulating 4 nodes with 2 walkers\n - Runs 600 iterations (60 seconds at 10 Hz)\n\n2. Timing constraints enforced:\n - Median fusion iteration: 2.6ms (well below 15ms production target and 30ms CI threshold)\n - P99: ~10ms (well below 40ms hard limit)\n\n3. CI integration: .github/workflows/benchmark-ci.yml\n - Benchmark runs on every push/PR to main\n - Workflow fails if median exceeds 30ms (CI threshold)\n - Workflow fails if P99 exceeds 40ms (hard limit)\n\nAll acceptance criteria met.","source_repo":".","compaction_level":0}
|
||||
{"id":"bf-5wb3n","title":"MQTT bidirectional commands: security_mode and rebaseline subscriptions","description":"Plan specifies that the mothership subscribes to {prefix}/command/security_mode (arm|disarm) and {prefix}/command/rebaseline (zone name or 'all') so Home Assistant automations can control these without opening the dashboard. The mqtt package has SubscribeToSystemMode but no SubscribeToRebaseline, and neither command subscription is wired in main.go to actual arm/disarm or rebaseline actions. Needs: (1) SubscribeToRebaseline in mqtt/client.go, (2) wiring both subscriptions to the relevant internal handlers in main.go when MQTT is configured.","design":"","acceptance_criteria":"","notes":"","status":"closed","priority":2,"issue_type":"task","assignee":"claude-code-glm-4.7-foxtrot","created_at":"2026-05-02T18:25:06.167277244Z","updated_at":"2026-05-05T16:52:27.277793127Z","closed_at":"2026-05-05T16:52:27.277793127Z","close_reason":"Completed","source_repo":".","compaction_level":0}
|
||||
{"id":"bf-5wfsa","title":"Pre-deployment simulator (Component 17)","description":"## Goal\nBefore purchasing hardware, users can define their space, place virtual nodes, and run physics-based simulation to see expected detection quality.\n\n## Scope\n- Space definition: same 3D editor used for real setup — draw room boxes, set dimensions\n- Virtual nodes: place ghost nodes (wireframe, dashed links) that participate in GDOP computation\n- Simulation engine: simplified ray-based propagation (direct path + first-order reflections)\n- Synthetic walkers: virtual people moving along user-defined paths or random walk\n- Visualization: GDOP overlay, expected detection quality, coverage gaps highlighted\n- Outputs: minimum node count recommendation, optimal positions for N nodes, accuracy estimates, shopping list\n\n## Location\ndashboard/static/js/simulator.js (new module)\ninternal/sim/propagation.go (new package)\n\n## Acceptance\n- User draws room, places 2-4 virtual nodes\n- Click 'Simulate' → synthetic walkers generate CSI using same propagation model\n- GDOP overlay shows expected detection quality across floor\n- 'Shopping list' shows recommended node count and positions\n- 'Add another node here' highlights worst-GDOP positions","design":"","acceptance_criteria":"","notes":"","status":"in_progress","priority":2,"issue_type":"task","assignee":"claude-code-glm-4.7-foxtrot","created_at":"2026-05-05T04:05:43.355796818Z","updated_at":"2026-05-06T03:24:38.658363537Z","source_repo":".","compaction_level":0,"dependencies":[{"issue_id":"bf-5wfsa","depends_on_id":"bf-5xftp","type":"blocks","created_at":"2026-05-06T00:40:16.874228656Z","created_by":"batch","thread_id":""},{"issue_id":"bf-5wfsa","depends_on_id":"bf-2enwo","type":"blocks","created_at":"2026-05-06T00:40:16.875275352Z","created_by":"batch","thread_id":""},{"issue_id":"bf-5wfsa","depends_on_id":"bf-5rulx","type":"blocks","created_at":"2026-05-06T00:40:16.875320778Z","created_by":"batch","thread_id":""},{"issue_id":"bf-5wfsa","depends_on_id":"bf-4qwmy","type":"blocks","created_at":"2026-05-06T00:40:16.875374254Z","created_by":"batch","thread_id":""}]}
|
||||
{"id":"bf-5wfsa","title":"Pre-deployment simulator (Component 17)","description":"## Goal\nBefore purchasing hardware, users can define their space, place virtual nodes, and run physics-based simulation to see expected detection quality.\n\n## Scope\n- Space definition: same 3D editor used for real setup — draw room boxes, set dimensions\n- Virtual nodes: place ghost nodes (wireframe, dashed links) that participate in GDOP computation\n- Simulation engine: simplified ray-based propagation (direct path + first-order reflections)\n- Synthetic walkers: virtual people moving along user-defined paths or random walk\n- Visualization: GDOP overlay, expected detection quality, coverage gaps highlighted\n- Outputs: minimum node count recommendation, optimal positions for N nodes, accuracy estimates, shopping list\n\n## Location\ndashboard/static/js/simulator.js (new module)\ninternal/sim/propagation.go (new package)\n\n## Acceptance\n- User draws room, places 2-4 virtual nodes\n- Click 'Simulate' → synthetic walkers generate CSI using same propagation model\n- GDOP overlay shows expected detection quality across floor\n- 'Shopping list' shows recommended node count and positions\n- 'Add another node here' highlights worst-GDOP positions","design":"","acceptance_criteria":"","notes":"","status":"closed","priority":2,"issue_type":"task","assignee":"claude-code-glm-4.7-foxtrot","created_at":"2026-05-05T04:05:43.355796818Z","updated_at":"2026-05-06T03:35:02.980287642Z","closed_at":"2026-05-06T03:35:02.980287642Z","close_reason":"Completed","source_repo":".","compaction_level":0,"dependencies":[{"issue_id":"bf-5wfsa","depends_on_id":"bf-5xftp","type":"blocks","created_at":"2026-05-06T00:40:16.874228656Z","created_by":"batch","thread_id":""},{"issue_id":"bf-5wfsa","depends_on_id":"bf-2enwo","type":"blocks","created_at":"2026-05-06T00:40:16.875275352Z","created_by":"batch","thread_id":""},{"issue_id":"bf-5wfsa","depends_on_id":"bf-5rulx","type":"blocks","created_at":"2026-05-06T00:40:16.875320778Z","created_by":"batch","thread_id":""},{"issue_id":"bf-5wfsa","depends_on_id":"bf-4qwmy","type":"blocks","created_at":"2026-05-06T00:40:16.875374254Z","created_by":"batch","thread_id":""}]}
|
||||
{"id":"bf-5xftp","title":"Simulator: space + virtual node placement (3D editor reuse, ghost wireframe nodes, dashed links)","description":"","design":"","acceptance_criteria":"","notes":"","status":"closed","priority":2,"issue_type":"task","assignee":"claude-code-glm-4.7-foxtrot","created_at":"2026-05-06T00:40:16.873186445Z","updated_at":"2026-05-06T01:41:31.736203803Z","closed_at":"2026-05-06T01:41:31.736203803Z","close_reason":"Implemented space + virtual node placement for the simulator:\n\n1. Space key handler: Press space bar to place a new virtual node at camera target position\n2. Node placement logic: Intersection of camera ray with ground plane, clamped to room bounds\n3. Default height: 80% of room height or 1.5m minimum\n4. 3D editor reuse: Uses existing TransformControls for dragging and positioning\n5. Ghost wireframe nodes: Virtual nodes rendered as translucent wireframe octahedra (teal color)\n6. Dashed links: Links to/from virtual nodes rendered as dashed teal lines\n\nThe implementation adds placeVirtualNodeAtCameraTarget() to placement.js which:\n- Calculates camera ray intersection with ground plane (y=0)\n- Clamps position to room bounds\n- Sets reasonable default height\n- Calls addVirtualNode() to create the node via REST API\n\nThis completes the pre-deployment simulator feature, allowing users to plan\nnode placement before purchasing hardware.","source_system":"","source_repo":".","deleted_by":"","delete_reason":"","original_type":"","compaction_level":0,"compacted_at_commit":"","sender":""}
|
||||
{"id":"bf-5y8tm","title":"Fresnel zone debug overlay","description":"## Goal\nToggle-able wireframe ellipsoids between active links in the 3D scene for debugging coverage geometry.\n\n## Scope\n- Toggle button in toolbar: 'Fresnel zones'\n- When enabled: render first Fresnel zone ellipsoids as wireframe meshes between active link pairs\n- Helps users understand coverage geometry visually\n- Shows zone 1 (most sensitive) as green wireframe\n- Multiple zones per link can be shown (zones 1-5)\n\n## Location\ndashboard/static/js/viz3d.js (extend existing 3D visualization)\n\n## Acceptance\n- Toggle button shows/hides Fresnel zone ellipsoids\n- Zones render correctly for all active TX→RX links\n- Update in real-time as nodes are moved\n- Performance: <5ms render time for 8-node fleet (28 links)","design":"","acceptance_criteria":"","notes":"","status":"open","priority":2,"issue_type":"task","created_at":"2026-05-05T04:05:43.410156795Z","updated_at":"2026-05-05T04:05:43.410156795Z","source_repo":".","compaction_level":0}
|
||||
{"id":"bf-ao8eq","title":"Detection explainability (Component 28)","description":"## Goal\nImplement 'Why is this here?' on any blob/alert that shows exactly why the system made that decision.\n\n## Scope\n- X-ray overlay: non-contributing visual elements dim to 20% opacity\n- Links that contributed to detection glow, brightness proportional to deltaRMS contribution\n- Fresnel zone ellipsoids appear for active links\n- BLE match: dotted line from matched device's strongest node to blob, labeled with RSSI\n- Detail sidebar: per-link contribution table (link name, deltaRMS, threshold, Fresnel zone number, learned weight)\n- Confidence breakdown: spatial confidence + identity confidence with percentages\n\n## Location\ndashboard/static/js/explainability.js (new module)\ninternal/api/explain.go (new package)\n\n## Acceptance\n- Tap/click blob in 3D view → 'Why?' button appears\n- Tap 'Why?' → X-ray overlay activates, showing contributing links\n- Detail sidebar shows per-link breakdown\n- For alerts: specific conditions that triggered with values vs thresholds\n- Makes false positive cause obvious","design":"","acceptance_criteria":"","notes":"","status":"closed","priority":2,"issue_type":"task","assignee":"claude-code-glm-4.7-foxtrot","created_at":"2026-05-05T04:05:43.300430327Z","updated_at":"2026-05-05T22:16:31.461661320Z","closed_at":"2026-05-05T22:16:31.461661320Z","close_reason":"Completed","source_repo":".","compaction_level":0}
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
714c51acf6ab0a6f9e8f0f62b3f94b54a2705f59
|
||||
b34892edfcb82b5137fd8bac58e96490fa7c0995
|
||||
|
|
|
|||
Binary file not shown.
6
go.work
6
go.work
|
|
@ -1,4 +1,8 @@
|
|||
go 1.25.0
|
||||
|
||||
use ./mothership
|
||||
use ./test/acceptance
|
||||
|
||||
use (
|
||||
./cmd/sim
|
||||
./test/acceptance
|
||||
)
|
||||
|
|
|
|||
BIN
mothership/sim
BIN
mothership/sim
Binary file not shown.
BIN
mothership/spaxel-sim
Executable file
BIN
mothership/spaxel-sim
Executable file
Binary file not shown.
Loading…
Add table
Reference in a new issue