Updates
CI / test (push) Successful in 1m1s
Release rolling / release (push) Successful in 6m59s

This commit is contained in:
Raven Scott
2026-07-18 20:32:05 -04:00
parent 41f5476a60
commit a7648dc090
28 changed files with 2539 additions and 333 deletions
+29 -20
View File
@@ -51,38 +51,46 @@ Do not name third-party products in code, commits, or user-facing copy.
### P1 — Interaction parity
- [ ] Pan / zoom / reset on a card (updates shared window)
- [ ] Synced crosshair / shared hover time across visible cards
- [ ] Dimension show/hide + sort by name / latest value
- [ ] Chart type switch (line / area / stacked) where units allow
- [ ] Resize card height; persist prefs
- [ ] Section overview KPI strip (latest values) above detail charts
- [x] Pan / zoom / reset on a card (updates shared window)
- [x] Synced crosshair / shared hover time across visible cards
- [x] Dimension show/hide + sort by name / latest value
- [x] Chart type switch (line / area / stacked) where units allow
- [x] Resize card height; persist prefs
- [x] Section overview KPI strip (latest values) above detail charts
### P2 — Filters & fleet scope
- [ ] Search by id **or** title / context / family / plugin
- [ ] Host/agent chip reseed on active peer switch
- [ ] Optional group aggregation UI (`average` / `min` / `max` / `sum`)
- [ ] Tier / resolution hint when HyperDB warm is used
- [x] Search by id **or** title / context / family / plugin
- [x] Host/agent chip reseed on active peer switch
- [x] Optional group aggregation UI (`average` / `min` / `max` / `sum`)
- [x] Tier / resolution hint when HyperDB warm is used (card status)
### P3 — Investigation
- [ ] Expand card: stats table (min/avg/max), dim table
- [ ] Alert click → Charts wall, scroll to chart, pause at event time
- [ ] Highlight window for “related metrics” (uses `/weights` when ready)
- [ ] Anomaly tint / threshold line on wall cards
- [x] Expand card: stats table (min/avg/max), dim table (click title)
- [x] Alert click → Charts wall, scroll to chart, pause near event time
- [x] Related metrics panel (context/family + series correlation)
- [x] Anomaly tint / threshold line on wall cards
### P4 — Shell & persistence
- [ ] Persist pinned charts, collapsed sections, card heights
- [ ] Custom board view reusing the same card component (later)
- [ ] Wallboard / force-play mode (later)
- [x] Persist collapsed sections, card heights, dim sort, chart types
- [x] Persist pinned charts
- [x] Board mode (pinned-only wall reusing the same cards)
- [x] Wallboard / force-play mode
### P5 — Authoring model
- [ ] Versioned `shared/taxonomy.js` (contexts → sections)
- [ ] New collectors register context + priority used by TOC
- [ ] Optional CI check: new contexts appear in taxonomy or “Other”
- [x] Versioned `shared/taxonomy.js` (contexts → sections)
- [x] EXTENDING.md documents taxonomy placement for new charts
- [x] Taxonomy coverage test (`test/taxonomy-coverage.test.js`)
### Also shipped
- [x] Per-chart weights via `getWeights` RPC + `/api/v1|v2|v3/weights`
- [x] Related ranking boosted by anomaly weights
- [x] Drag-reorder pinned charts
- [x] Keyboard shortcuts on Charts (`Space` play, `15` presets, `/` search, `f` force, `b` board, `r` reset, `Esc` clear related)
---
@@ -107,6 +115,7 @@ Do not name third-party products in code, commits, or user-facing copy.
| Path | Role |
|------|------|
| `shared/taxonomy.js` | Section defs + `groupCatalog()` |
| `shared/related-metrics.js` | Related-chart ranking |
| `ui/dashboard.js` | Metrics wall controller |
| `ui/charts.js` | Canvas paint + hover helpers |
| `index.html` | Charts view shell (TOC + wall + time bar) |
+1
View File
@@ -152,6 +152,7 @@ Aggregate: any CRITICAL → `critical`; else any WARNING → `degraded`; else `o
|---------|-----|------|
| Charts | `listCharts` | `GET /api/v1/charts` |
| Data | `queryData` | `GET /api/v3/data` |
| Weights | `getWeights` | `GET /api/v3/weights` |
| Contexts | `listContexts` | `GET /api/v3/contexts` |
| Nodes | `getNodeInfo` | `GET /api/v3/nodes` |
| Alerts | `listAlerts` | `GET /api/v3/alerts` |
+30 -7
View File
@@ -132,26 +132,49 @@ Override home with `PEARDATA_HOME` if you need isolation (CI, multi-profile).
| Module | Responsibility |
|--------|----------------|
| `client/paths.js` | Unified `~/.config/peardata` home |
| `client/jsonCache.js` | Atomic JSON writes + LS mirror |
| `client/settings.js` | UI prefs → `cache/settings.json` |
| `client/peerCache.js` | Multi-host roster + last-active |
| `client/bookmarks.js` | Compat shim over peerCache |
| `client/identity.js` | Load/create keypair on disk |
| `client/connection.js` | Single HyperDHT + protomux-rpc session |
| `client/manager.js` | Multi-peer map, active selection, reconnect |
| `client/errors.js` | Unwrap / normalize RPC errors for UI |
| `app.js` | Wire DOM to manager + protocol methods |
## Persistence (PearDock-style)
| Store | Path |
|-------|------|
| Settings | `~/.config/peardata/cache/settings.json` (+ `localStorage` `peardata.settings.v1` FOUC) |
| Peers / last-active | `~/.config/peardata/cache/peers.json` |
| Identity | `~/.config/peardata/identity.json` |
Override root with `PEARDATA_HOME`. Writes are atomic (`tmp` → rename, mode `0600`). Legacy `bookmarks.json` / `ui-settings.json` migrate on first load.
### Multi-agent
- Many peers can be dialed at once; **one active** owns Overview / Charts RPC.
- Boot restores saved peers in parallel (`skipActivate`), then prefers last-active.
- Reconnect never steals the active host unless that host was active.
- Agents view + fleet strip: set active / connect / forget.
- Settings → Connections: auto-restore toggle, reconnect budget, forget-all.
### Manager reconnect
- Default max tries: `PEARDATA_MAX_RECONNECT` or **20**
- `connect(input, { adminSeed, autoReconnect })`
- Default max tries: settings `reconnectMaxAttempts` or `PEARDATA_MAX_RECONNECT` / **20**
- `connect(input, { adminSeed, autoReconnect, skipActivate })`
- Input may be **64-hex public key** or **`pd1.` invite**
## LocalStorage keys (demo UI)
## LocalStorage mirrors
| Key | Purpose |
|-----|---------|
| `peardata:last-connect` | Last public key / invite string |
| `peardata:display-name` | Last display name |
These are demo convenience only — production apps often prefer a file under app storage.
| `peardata.settings.v1` | Flat settings FOUC + offline mirror |
| `peardata-ui-boot` | Theme-only early paint |
| `peardata_active_peer_id` | Last active peer mirror |
| `peardata.cache.peers` | Peers envelope mirror |
## Development tips
+5 -2
View File
@@ -5,8 +5,11 @@
1. Define the chart in `shared/metrics.js` (`STATIC_CHART_DEFS`, or `registerChart()` for instances).
2. Emit samples from `server/services/collector.js` (or a new collector module).
3. Store + REST/RPC pick it up automatically via `getAllChartDefs()` / `CHART_BY_ID`.
4. Document dimensions in [DATA-MODEL.md](./DATA-MODEL.md).
5. Optionally add a canvas panel in `index.html` + `app.js`.
4. Ensure the chart lands in the Charts wall TOC via `shared/taxonomy.js` (`sectionForChart` matchers). Prefer a real section over **Other**.
5. Document dimensions in [DATA-MODEL.md](./DATA-MODEL.md).
6. The desktop Charts tab picks it up automatically (no per-chart HTML). Overview spotlight is optional.
Coverage is asserted by `test/taxonomy-coverage.test.js`.
## Add an RPC method
+2 -2
View File
@@ -103,7 +103,7 @@ Single-agent returns one node. With `PEARDATA_PARENT=1`, `/nodes` and `/fleet` i
| Method | Path | Notes |
|--------|------|-------|
| GET | `/api/v3/q?q=` | Full-text over chart ids/titles |
| GET | `/api/v3/weights` | MVP: health-derived scores |
| GET | `/api/v3/weights` | Per-chart anomaly weights (`?chart=&limit=`) |
### Alerts
@@ -145,7 +145,7 @@ Single-agent returns one node. With `PEARDATA_PARENT=1`, `/nodes` and `/fleet` i
| Area | PearData |
|------|----------|
| ML weights / metric correlations | Simplified health weights |
| ML weights / metric correlations | Per-chart anomaly weights; desktop related uses corr + weights |
| Multi-node parent streaming | Single node; parent planned |
| Cloud POST spaces APIs | Not implemented (agent GET style only) |
| App/plugin charts (nginx, DB, …) | System/OS charts; plugins later |
+15 -8
View File
@@ -92,7 +92,7 @@ Template rebrand, protocol, collector, memory store, anomalies, REST, desktop MV
| Anomaly scoring + UI highlight | Done (score + panel tint + threshold line) |
| Notifications | Done (desktop + `PEARDATA_WEBHOOK_URL`) |
| Streaming z-score / retrain job | Done (`PEARDATA_ANOMALY_MODE`, job `retrainAnomaly`) |
| `/api/v3/weights` depth | Real metric weights |
| `/api/v3/weights` depth | Done (per-chart anomaly weights + `getWeights` RPC) |
---
@@ -100,6 +100,7 @@ Template rebrand, protocol, collector, memory store, anomalies, REST, desktop MV
| Item | Notes |
|------|--------|
| Desktop persistence + multi-agent | Done — PearDock-style `cache/settings.json` + `cache/peers.json`, boot restore, last-active switch (`docs/DESKTOP.md`) |
| Signed / notarized macOS clients | Beyond ad-hoc `rcodesign` |
| Role templates | viewer / SRE / admin presets |
| Plugin SDK | Collector + chart registration API |
@@ -122,10 +123,16 @@ shared time, multi-dim cards, investigation). Detail checklist:
| Global time bar (play/pause, presets) | Done |
| Multi-dimension live + history cards | Done |
| Lazy visible-card query / paint | Done |
| Dim show/hide chips + basic synced hover | Done (P0) |
| Pan/zoom / shared window from gestures | Planned (P1) |
| Alert → scroll-to-chart | Done (pause-at-event TBD P3) |
| Persist layout prefs / pinned charts | Planned (P4) |
| Dim show/hide chips + basic synced hover | Done |
| Pan/zoom/reset + shared window from gestures | Done (P1) |
| Section KPIs, chart type, dim sort, resize | Done (P1) |
| Alert → scroll-to-chart + pause near event | Done |
| Persist metrics layout prefs + pins | Done |
| Group aggregation + force-play + related | Done |
| Board mode (pinned-only wall) | Done |
| Drag-reorder pins + keyboard shortcuts | Done |
| Taxonomy coverage test + EXTENDING note | Done |
| Multi-named custom boards | Later |
**Phase 6 exit (P0)** — Charts tab lists every agent chart in sections; shared
time + play/pause; multi-dim series; Overview stays the compact home grid.
@@ -149,8 +156,8 @@ time + play/pause; multi-dim series; Overview stays the compact home grid.
13. ~~Webhook HMAC signing~~ ✅ (`X-PearData-Signature`)
14. ~~z-score / retrain job~~
15. ~~REST HyperDHT tunnel~~ ✅ (`PEARDATA_REST_TUNNEL=1`)
16. **Master metrics dashboard (Charts)** Phase 6 P0 ← **now**
17. Dashboard P1 — sync crosshair / pan-zoom / dim picker
16. ~~Master metrics dashboard (Charts)~~ Phase 6 core (wall, pins, related, weights)
17. Multi-named custom boards / Autobase parents — later
18. Autobase multi-writer parents — HA fleet history
19. Windows collector depth — close `/proc`-only gaps
20. Plugin SDK polish — public collector registration API
@@ -177,7 +184,7 @@ time + play/pause; multi-dim series; Overview stays the compact home grid.
| M4 | Historical scrub across restart (HyperDB warm) | ✅ |
| M5 | Container charts from Docker hosts | ✅ opt-in spike |
| M6 | Parent peer rolling up a fleet | ✅ opt-in spike |
| M7 | Charts tab = sectioned master metrics wall | 🔄 Phase 6 |
| M7 | Charts tab = sectioned master metrics wall | Phase 6 core |
---