Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
114 commits
Select commit Hold shift + click to select a range
a68b183
docs: start milestone v5.0 Multi-Machine Fleet
HanSur94 Jun 2, 2026
8d7e7a9
docs: research v5.0 Multi-Machine Fleet (stack/features/architecture/…
HanSur94 Jun 2, 2026
0265af2
docs: lock v5.0 comparison UX (machine-first compare builder, CMP-06)…
HanSur94 Jun 2, 2026
9ffcca3
docs: create milestone v5.0 roadmap (6 phases, 1041-1046)
HanSur94 Jun 2, 2026
635f3d3
docs(1041): research CanonicalMapper phase domain
HanSur94 Jun 2, 2026
c30e145
docs(1041): add validation strategy
HanSur94 Jun 2, 2026
26a32e3
docs(1041): UI design contract (CanonicalMapEditor)
HanSur94 Jun 2, 2026
1840bef
docs(1041): create CanonicalMapper phase plan (4 plans, 4 waves)
HanSur94 Jun 2, 2026
7ac1362
docs(1041): revise plans per checker feedback (3 warnings)
HanSur94 Jun 2, 2026
98b3bb5
chore(1041): register libs/Fleet on MATLAB path and scaffold directory
HanSur94 Jun 3, 2026
01bc812
test(1041): add TestCanonicalMapper suite (30 RED methods)
HanSur94 Jun 3, 2026
8e628cf
docs(1041): complete plan 01 (test scaffold + Fleet path)
HanSur94 Jun 3, 2026
f6b5b64
feat(1041): CanonicalMapper scaffold + normalize_/editDistance_ (plan…
HanSur94 Jun 3, 2026
40059b7
feat(1041): suggest() clustering + confidence + unit-mismatch (plan 0…
HanSur94 Jun 3, 2026
f1dd6db
docs(1041): complete plan 02 (mapper core — 17/30 green)
HanSur94 Jun 3, 2026
d4082e8
feat(1041): override/confirm + reviewPending/unmapped/isResolvable (p…
HanSur94 Jun 3, 2026
3767825
feat(1041): toStruct/fromStruct + save/load JSON round-trip (plan 03 …
HanSur94 Jun 3, 2026
0940749
docs(1041): complete plan 03 (override/persist/query — 29/30 green)
HanSur94 Jun 3, 2026
78067f7
feat(1041): CanonicalMapEditor uifigure + promote/override/save (plan…
HanSur94 Jun 3, 2026
e5d15de
docs(1041): complete plan 04 (CanonicalMapEditor — 30/30 green, UAT a…
HanSur94 Jun 3, 2026
8f67297
fix(1041): reviewPending vouched-entry bug + save tmp leak + editor f…
HanSur94 Jun 3, 2026
1fdd679
docs(1041): verification (passed 5/5) + code review + summary update
HanSur94 Jun 3, 2026
65b9d54
docs(1041): mark phase complete (CanonicalMapper — 30/30, verified, U…
HanSur94 Jun 3, 2026
ace3830
docs(1042): capture phase context
HanSur94 Jun 3, 2026
06c6f21
docs(state): record phase 1042 context session
HanSur94 Jun 3, 2026
e30af8b
docs(1042): research phase — Machine + Fleet + Pipeline DI Seam
HanSur94 Jun 3, 2026
4b74e2e
docs(1042): research + validation strategy
HanSur94 Jun 3, 2026
b977102
docs(1042): pattern map (new Fleet files -> analogs)
HanSur94 Jun 3, 2026
d2f31f3
docs(1042): create phase plan (Machine + Fleet + Pipeline DI Seam — 4…
HanSur94 Jun 3, 2026
2b7f688
docs(1042): finalize phase plan (4 plans, 3 waves) + decision citations
HanSur94 Jun 3, 2026
4f2e303
feat(1042-01): add Fleet-private normalizeToCell_ helper
HanSur94 Jun 7, 2026
071cd8c
test(1042-01): add RED MATLAB class suites TestMachine + TestFleet
HanSur94 Jun 7, 2026
c5ba190
test(1042-01): add RED Octave flat tests test_machine + test_fleet
HanSur94 Jun 7, 2026
f6a5016
docs(1042-01): complete Wave-0 test scaffold + normalizeToCell_ plan …
HanSur94 Jun 7, 2026
4e488b3
feat(1042-02): add tagSource_ DI seam to BatchTagPipeline
HanSur94 Jun 7, 2026
e12d980
feat(1042-02): add tagSource_ DI seam to LiveTagPipeline
HanSur94 Jun 7, 2026
4550e7f
docs(1042-02): complete pipeline tagSource_ DI seam plan summary
HanSur94 Jun 7, 2026
7709e1c
fix(1042-03): add set.RawSource setter to SensorTag for post-construc…
HanSur94 Jun 7, 2026
eec33ed
feat(1042-03): implement Machine handle class — isolated catalog + in…
HanSur94 Jun 7, 2026
3148ee0
docs(1042-03): complete Machine catalog class plan summary
HanSur94 Jun 7, 2026
5fa5406
Revert "fix(1042-03): add set.RawSource setter to SensorTag for post-…
HanSur94 Jun 7, 2026
cec9826
fix(1042-03): construct SensorTag with RawSource NV-pair; keep RawSou…
HanSur94 Jun 7, 2026
3bfb979
feat(1042-04): Fleet handle class — collection, duplicate-Id guard, f…
HanSur94 Jun 7, 2026
b9fcb1a
docs(1042-04): complete Fleet persistence + search plan (FLEET-01/04/…
HanSur94 Jun 7, 2026
455a707
test(1042-04): make canonical-map round-trip assertion non-vacuous
HanSur94 Jun 7, 2026
2f2d45e
docs(1042): phase verification passed (13/13 must-haves, 63 tests gre…
HanSur94 Jun 7, 2026
a27682e
docs(state): pause autonomous after phase 1042 (resume at 1043)
HanSur94 Jun 7, 2026
3d4b8bc
docs(1043): capture phase context
HanSur94 Jun 7, 2026
be1822b
docs(1043): research phase — resolver seam + backward-compat planning…
HanSur94 Jun 7, 2026
a4b6ff0
docs(1043): validation strategy
HanSur94 Jun 7, 2026
3bf5e4c
docs(1043): create phase plan — resolver seam + backward compat (3 pl…
HanSur94 Jun 7, 2026
a872203
docs(1043): record planning (3 plans) + roadmap wave annotations
HanSur94 Jun 7, 2026
c6b6cd0
test(1043-01): RED class suite TestFleetDashboardResolver covering SC…
HanSur94 Jun 7, 2026
185fc5a
test(1043-01): RED Octave flat test_dashboard_resolver covering SC1/S…
HanSur94 Jun 7, 2026
23139cd
docs(1043-01): complete RED test scaffold plan (DASH-01, DASH-02)
HanSur94 Jun 7, 2026
f74d597
feat(1043-02): FastSenseWidget.fromStruct gains optional tagResolver arg
HanSur94 Jun 7, 2026
86f971b
feat(1043-02): DashboardSerializer threads tagResolver into fromStruct
HanSur94 Jun 7, 2026
a8a0c51
feat(1043-02): DashboardEngine.load accepts TagResolver NV key + pass…
HanSur94 Jun 7, 2026
54b85a7
docs(1043-02): complete resolver threading load path plan (DASH-01, D…
HanSur94 Jun 7, 2026
3c6d918
feat(1043-03): linesForWidget gains 'tag' case + machineVar arg; expo…
HanSur94 Jun 7, 2026
a03e026
docs(1043-03): complete .m export machine-scoping plan (DASH-01 SC4)
HanSur94 Jun 7, 2026
d867aed
docs(1043): phase verification passed (SC1-SC4, 5 regression suites g…
HanSur94 Jun 7, 2026
a84fee4
docs(state): pause autonomous after 1043 (resume at 1044)
HanSur94 Jun 8, 2026
a42687a
docs(1044): smart discuss context
HanSur94 Jun 8, 2026
c490bc4
docs(1044): UI design contract — Companion Machine Dimension
HanSur94 Jun 8, 2026
1391514
docs(1044): research phase — companion machine dimension
HanSur94 Jun 8, 2026
1ba4d77
docs(1044): research + validation strategy
HanSur94 Jun 8, 2026
27ac2f6
docs(1044): create phase plan — companion machine dimension (5 plans,…
HanSur94 Jun 8, 2026
7d92139
docs(1044): pattern map (7/7 analogs)
HanSur94 Jun 8, 2026
a0ceff0
docs(1044): mark phase planned (5 plans, ready to execute)
HanSur94 Jun 8, 2026
8018da1
feat(1044-01): add Fleet.machineIds() insertion-order accessor
HanSur94 Jun 8, 2026
13a87fb
feat(1044-02): add MachineSelectorPane + filterMachines helper
HanSur94 Jun 8, 2026
7b9d0e6
feat(1044-03): 'Fleet' NV pair + conditional [3 4] grid / [1 11] toolbar
HanSur94 Jun 10, 2026
d252cb0
docs(1044): mark research open questions resolved
HanSur94 Jun 10, 2026
de07e98
feat(1044-04): machine-switch wiring + four-site TagRegistry.find red…
HanSur94 Jun 10, 2026
48ea44a
test(1044-05): four fleet class-suite tests (MACH-02/03/04/05)
HanSur94 Jun 10, 2026
60cb8ee
docs(1044): execution summaries + verification (passed, 4/4 SC)
HanSur94 Jun 10, 2026
31eb43b
docs(1044): mark phase complete in ROADMAP + STATE (4/4 SC verified)
HanSur94 Jun 10, 2026
2ddc75d
docs(1044): add code review report (0 critical, 6 warnings, 7 info)
HanSur94 Jun 10, 2026
6c3e4c3
fix(1044): WR-01 use StartDelay for singleShot debounce timer
HanSur94 Jun 10, 2026
0e573d8
fix: debounce StartDelay in TagCatalogPane + DashboardListPane (pre-e…
HanSur94 Jun 10, 2026
0a266bf
fix(1044): WR-02 re-assert active machine highlight after filter rebuild
HanSur94 Jun 10, 2026
879af2a
fix(1044): WR-03 graceful overlay degradation for unregistered tags i…
HanSur94 Jun 10, 2026
825bf18
fix(1044): WR-04 re-register EventViewer destruction listeners in set…
HanSur94 Jun 10, 2026
dce60cf
fix(1044): WR-05 route empty Registry_ through static TagRegistry path
HanSur94 Jun 10, 2026
2d24ed4
fix(1044): WR-06 validate fleet machine Dashboards in constructor
HanSur94 Jun 10, 2026
424cf52
docs(1044): record fix round 1 in review report
HanSur94 Jun 10, 2026
e2b5894
Revert "fix: debounce StartDelay in TagCatalogPane + DashboardListPan…
HanSur94 Jun 10, 2026
a1d408b
docs(1044): fix round 1 verification + revert rationale
HanSur94 Jun 10, 2026
aa03f6e
fix(1044): UI-review warnings — pane-scoped warning id + ordering-inv…
HanSur94 Jun 10, 2026
2157065
chore: ui-reviews scaffold gitignore
HanSur94 Jun 10, 2026
896d03b
docs(1045): smart discuss context
HanSur94 Jun 10, 2026
e91c2aa
docs(1045): UI design contract (checker 6/6 — color FLAG corrected)
HanSur94 Jun 10, 2026
b974bd0
docs(1045): research phase — CanonicalMapper API, openAdHocPlot exten…
HanSur94 Jun 10, 2026
679f99b
docs(1045): research + validation strategy
HanSur94 Jun 10, 2026
9b275ee
docs(1045): create phase plan — cross-machine comparison view (5 plan…
HanSur94 Jun 10, 2026
e3aabe0
docs(1045): revise plans per checker (CMP-03 coverage, runner-invokin…
HanSur94 Jun 10, 2026
44cd5f1
docs(1045): mark phase planned (5 plans, checker-verified; override v…
HanSur94 Jun 10, 2026
4f6f6a3
feat(1045-01): CanonicalMapper.resolve + Fleet.mapper + compare resol…
HanSur94 Jun 10, 2026
c77d181
feat(1045-02): openAdHocPlot SeriesColors/SeriesLabels NV args
HanSur94 Jun 10, 2026
7d2fcf9
feat(1045-03): CompareBuilderDialog — modeless builder + resolve-once…
HanSur94 Jun 16, 2026
7e52ce5
docs(1045-03): plan summary — CompareBuilderDialog (10/10 smoke, publ…
HanSur94 Jun 16, 2026
e9261de
feat(1045-04): CompareBuilderDialog Confirm / Promote / theme (CMP-06)
HanSur94 Jun 16, 2026
bdb8684
docs(1045-04): plan summary — Confirm/Promote/theme (9/9 smoke, in-me…
HanSur94 Jun 16, 2026
98a6546
feat(1045-05): wire Compare builder into the companion + CMP class-suite
HanSur94 Jun 16, 2026
1aa9ec5
docs(1045-05): plan summary — companion wiring + 7 CMP tests (91/0 su…
HanSur94 Jun 16, 2026
c2e7478
docs(1045): verify phase passed (5/5 SC, human-approved) + backfill 0…
HanSur94 Jun 16, 2026
cb4d70b
fix(1045): apply code-review findings (WR-01/02/03 + IN-01/04/05)
HanSur94 Jun 16, 2026
7e0477f
docs(1046): discuss — clone/remap decisions + verified foundation
HanSur94 Jun 16, 2026
e080318
docs(1046): plan phase — clone/remap (2 plans, 2 waves, checker-VERIF…
HanSur94 Jun 16, 2026
09f64b4
docs(1046): mark phase planned (2 plans, checker-verified; execute pe…
HanSur94 Jun 16, 2026
84961e2
docs(v5.0): drop Phase 1046 (clone/remap) — milestone delivered at 5 …
HanSur94 Jun 16, 2026
6745d01
docs(v5.0): milestone audit PASSED — 5/5 phases, integration WIRED, E…
HanSur94 Jun 17, 2026
453abf2
docs(v5.0): record PR #206 opened to main
HanSur94 Jun 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 23 additions & 21 deletions .planning/PROJECT.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,39 +46,41 @@ Users can organize complex dashboards into navigable sections and pop out any wi

## Current State

**Shipped:** v2.0 Tag-Based Domain Model (2026-04-17)
**Shipped:** v2.0 Tag-Based Domain Model (2026-04-17); v3.0 FastSense Companion (2026-04-30); v4.0 Multi-User LAN Concurrency (verifying, 2026-06-02)

The SensorThreshold subsystem has been fully rebooted on a unified `Tag` foundation. Legacy `Sensor`/`Threshold`/`StateChannel`/`CompositeThreshold` classes are deleted. All consumers (FastSenseWidget, dashboard widgets, EventDetection, LiveEventPipeline) operate through the Tag API (`addTag`, `getXY`, `valueAt`). Events bind to tags via `EventBinding` registry and render as toggleable round markers in FastSense. All `examples/` scripts have been migrated to the Tag API and a dedicated 5-script showcase lives under `examples/02-sensors/tags/`.

**Vocabulary:** `SensorTag`, `StateTag`, `MonitorTag`, `CompositeTag`, `TagRegistry`, `EventBinding`. FastSense API: `addTag(t)`.

**Companion (Phase 1040, 2026-06-02):** the FastSenseCompanion **Event Viewer** now hosts an acknowledgeable notification inbox (`NotificationCenterPane`) as a horizontally-resizable right panel (draggable divider); a toolbar **bell** shows the unacked count + highest-severity color and opens the viewer. Dismiss == shared, audited `EventStore.acknowledgeEvent`.

## Current Milestone: v2.1 Tag-API Tech Debt Cleanup
## Current Milestone: v5.0 Multi-Machine Fleet

**Goal:** Close the 4 non-blocking tech debt items surfaced by the v2.0 milestone audit so the Tag-API codebase is free of dead code, test-skip gaps, and stubbed example demos.
**Goal:** Ingest, browse, dashboard, and compare data across a growing fleet of near-identical machines from the FastSense Companion — including overlaying the same logical sensor across machines whose sensor keys differ.

**Target items (from `.planning/milestones/v2.0-MILESTONE-AUDIT.md`):**
- Stub or delete `EventDetector.detect(tag, threshold)` dead code referencing the deleted `Threshold` API
- Fix `DashboardSerializer` `.m` script export to handle `source.type='tag'` (currently silently omits Tag-bound widgets; JSON path works)
- Clean up 93 `Threshold(` constructor references across 42 MATLAB-only suite test files (fail on MATLAB, skip on Octave today)
- Rewrite `examples/05-events/example_event_detection_live.m` and `example_event_viewer_from_file.m` as fully-migrated `MonitorTag + EventStore + EventBinding` pipelines (remove deprecation stubs)
**Target features:**
- Fleet/Machine data model — new `libs/Fleet/`: `Machine` (own isolated tag catalog + `DataRoot` + dashboards + ingestion, mirrors `TagRegistry` read API) and `Fleet` (searchable machines + config persistence). Global `TagRegistry` singleton left untouched.
- Per-machine ingestion — existing `BatchTagPipeline`/`LiveTagPipeline` scoped per machine (own `DataRoot`); default global-registry path unchanged (backward compatible).
- Canonical/logical-sensor mapping — automated rules + overrides + unmapped/ambiguous-tail surfacing; bridges differing keys across machines and scales to 20+/growing fleets.
- Companion machine dimension — searchable machine selector; selecting a machine reuses the existing `setProject(machine.Dashboards, machine)`; legacy `Registry`/`Dashboards` constructor args still work (single implicit machine).
- Per-machine dashboards + clone/remap — hand-built, independent per machine; clone a dashboard onto another machine with tag bindings rebound via the canonical map; `DashboardSerializer` gains a machine-scoped resolver.
- Cross-machine comparison view — a **machine-first compare builder**: select machines, then set each machine's data (a shared-sensor quick-fill via the canonical map, or a separate tag per machine), overlaid in its own figure (reuses `openAdHocPlot` Overlay; pulls Tag objects from each machine's catalog).

**Deferred to future milestones:**
- Asset hierarchy (Asset tree, templates, tag-to-asset binding, browse rollups)
- Custom event GUI (click-drag region selection in FastSense → label dialog)
- Calc tags / formula evaluator for arbitrary derived tags
- Tri-state / continuous severity MonitorTag output
- WebBridge parity for Tag API features
**Key decisions carried in (from in-session brainstorm):**
- Data model = Approach ① (Machine/Fleet layer). `TagRegistry` is static-only (a `persistent` map, 72 static call sites across 31 files) so it cannot be instanced — each `Machine` owns its own `containers.Map` instead, leaving the global registry and all existing single-machine usage untouched.
- The one existing-code seam: `DashboardSerializer` must resolve `(machineId, localKey)` via Fleet→Machine instead of the global `TagRegistry.get` when (de)serializing a machine's tag-bound dashboards. Runtime widget resolution is unaffected (widgets hold Tag objects).

**Deferred:**
- Exact machine-selector placement (left rail vs top dropdown vs tabs) and comparison-view layout — resolved in a dedicated UI phase.
- WebBridge parity for fleet features.
- Cross-machine MonitorTag/event rollups and fleet-wide background monitoring (builds on v4.0 concurrency + Phase 1039/1040 monitoring; not in this milestone).

### Out of Scope

- Drag-and-drop visual rearrangement — complexity vs. value for MATLAB-script-driven workflows
- Cross-filtering between widgets — would require a data binding framework
- Interactive controls (dropdowns, sliders) — DashboardEngine is visualization, not control panel
- Browser/WebBridge parity for new features — future milestone
- GroupWidget children individual detach buttons — v1 limitation, top-level only
- Time panel in multi-page mode — works on active page only (known limitation)
- Forced dashboard templating across machines — user chose hand-built, independent per-machine dashboards (clone/remap tooling instead).
- Refactoring `TagRegistry` to be instantiable (Approach ③) — rejected for backward-compat risk to 72 call sites.
- Namespaced compound keys in the global registry (Approach ②) — rejected for key-sprawl and forced per-machine filtering everywhere.
- Drag-and-drop visual rearrangement, cross-widget filtering, interactive controls — unchanged from prior milestones (DashboardEngine is visualization, not control panel).

## Context

Expand Down Expand Up @@ -148,4 +150,4 @@ This document evolves at phase transitions and milestone boundaries.
4. Update Context with current state

---
*Last updated: 2026-06-02 — Phase 1040 (Companion Notification Center) complete*
*Last updated: 2026-06-02 — Milestone v5.0 Multi-Machine Fleet started*
Loading