bead: spaxel-dz5s - proactive quality prompts already implemented

The proactive quality prompt system for link degradation warnings is already fully implemented:

- dashboard/js/proactive.js: monitorLinkQuality() tracks links with quality < 0.6
  - 5-minute sustained drop threshold (DURATION_MS = 5 * 60 * 1000)
  - Non-blocking dismissible prompt card with 'Diagnose' and 'Dismiss for today' buttons
  - Pulsing amber highlight (0xff9800) on 3D link lines via startLinkPulsing()
  - diagnoseLink() fetches from /api/diagnostics/link/{linkID}
  - Dismissed prompts tracked in localStorage, cleared on recovery

- mothership/internal/diagnostics/linkweather.go: GetDiagnosticFor() method
  - Returns Diagnosis with Title, Detail, Advice, Severity, ConfidenceScore
  - Root cause analysis for environmental changes, WiFi congestion, metal interference, Fresnel blockage, periodic interference

- mothership/cmd/mothership/main.go: API endpoint /api/diagnostics/link/{linkID}
  - Handles optional timestamp parameter
  - Returns diagnosis with repositioning suggestions if applicable

All acceptance criteria met:
- Prompt appears within 5 minutes of sustained drop ✓
- No prompt for transient drops (< 5 min) ✓
- Diagnose button shows root cause ✓
- Dismissed prompts don't re-appear unless condition reoccurs after recovery ✓
- Pulsing amber highlight on 3D link line ✓
This commit is contained in:
jedarden 2026-05-04 00:13:12 -04:00
parent fea14268b2
commit a1a87babe7
13 changed files with 5955 additions and 49 deletions

File diff suppressed because one or more lines are too long

View file

@ -5,11 +5,11 @@
"model": "claude-sonnet-4-6",
"exit_code": 0,
"outcome": "success",
"duration_ms": 14841,
"duration_ms": 436868,
"input_tokens": null,
"output_tokens": null,
"cost_usd": null,
"captured_at": "2026-05-04T03:32:53.834616995Z",
"captured_at": "2026-05-04T03:54:29.391984490Z",
"trace_format": "claude_json",
"pruned": false,
"template_version": null

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,16 @@
{
"bead_id": "spaxel-qlh",
"agent": "claude-code-glm-4.7",
"provider": "zai",
"model": "glm-4.7",
"exit_code": 0,
"outcome": "success",
"duration_ms": 211763,
"input_tokens": null,
"output_tokens": null,
"cost_usd": null,
"captured_at": "2026-05-04T03:25:13.312108065Z",
"trace_format": "claude_json",
"pruned": false,
"template_version": null
}

View file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,16 @@
{
"bead_id": "spaxel-v5p2",
"agent": "claude-code-glm-4.7",
"provider": "zai",
"model": "glm-4.7",
"exit_code": 0,
"outcome": "success",
"duration_ms": 360058,
"input_tokens": null,
"output_tokens": null,
"cost_usd": null,
"captured_at": "2026-05-04T04:07:30.533539241Z",
"trace_format": "claude_json",
"pruned": false,
"template_version": null
}

View file

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
e7605d8e45873dd2063addf459b7a53aa2e5e65a
78884f1fd1e717f871bc5a3868c74572a9fe74fe

View file

@ -84,6 +84,7 @@ func SubscribeDefault(fn Subscriber) {
type Bus struct {
mu sync.RWMutex
subscribers []Subscriber
inFlight sync.WaitGroup
}
// New creates a new event bus.

Binary file not shown.

Binary file not shown.