You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- ✓ Events attached to tags with FastSense overlay rendering — v2.0
46
+
- ✓ Tag ingestion pipeline: raw `.csv`/`.txt`/`.dat` → per-tag `.mat` via `BatchTagPipeline` + `LiveTagPipeline`; `SensorTag`/`StateTag` gain `RawSource` NV-pair — validated in Phase 1012
46
47
47
48
## Current State
48
49
49
-
**Shipped:** v2.0 Tag-Based Domain Model (2026-04-17)
50
+
**Shipped:** v2.0 Tag-Based Domain Model (2026-04-17) + Phase 1012 Tag Pipeline (2026-04-22)
50
51
51
-
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.
52
+
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. Raw data files are ingested to per-tag `.mat` via `BatchTagPipeline` (synchronous) or `LiveTagPipeline` (timer-driven), driven off each tag's `RawSource` struct.
-[x] 1006-03-PLAN.md — Stale test expectations E1-E9 cluster + E10 grid-snap diagnostic+fix (MATLABFIX-E; wave 2)
373
373
-[x] 1006-04-PLAN.md — DashboardEngine.exportImage → exportgraphics() for headless MATLAB CI (MATLABFIX-F; wave 2)
374
+
375
+
### Phase 1012: Tag Pipeline — raw files to per-tag MAT via registry, batch and live
376
+
377
+
**Goal:** Deliver a MATLAB pipeline that ingests arbitrary delimited raw files (.csv/.txt/.dat) and emits per-tag .mat files keyed off TagRegistry, in two modes: BatchTagPipeline (synchronous one-shot) and LiveTagPipeline (timer-driven incremental append via modTime+lastIndex, mirroring MatFileDataSource). Outputs round-trip through the existing SensorTag.load() contract unchanged; MonitorTag/CompositeTag remain lazy per MONITOR-03. Binding lives on a new RawSource struct property on SensorTag + StateTag (Tag base untouched per Pitfall 1). Per-tag try/catch isolation + end-of-run TagPipeline:ingestFailed throw. Shared delimited-text parser (textscan-based, Octave 7+ compatible — no readtable/readmatrix).
378
+
**Requirements**: No exclusive REQ-IDs (v2.0 closed at Phase 1011 MIGRATE-03); scope captured by CONTEXT.md decisions D-01..D-19 (see 1012-CONTEXT.md).
**Core value:** Users can organize complex dashboards into navigable sections and pop out any widget for detailed analysis without losing the dashboard context.
-[Phase 1012]: BatchTagPipeline: LastFileParseCount captured pre-reset so verifyError+property-read works
244
+
-[Phase 1012]: BatchTagPipeline: D-17 proven via MonitorTag.recomputeCount_ (no FastSenseDataStore dependency in tests)
245
+
-[Phase 1012]: BatchTagPipeline: isIngestable_ docstring rewritten to avoid tripping the Pitfall 10 regex gate
246
+
-[Phase 1012]: Plan 05: Inline-lambda predicate instead of @ClassName.staticPrivate handle -- Octave 7+ rejects cross-class private-method handles at TagRegistry.find call time
247
+
-[Phase 1012]: Plan 05: Removed the static isIngestable_ block in LiveTagPipeline to eliminate single-source-of-truth drift; predicate now lives only inline in eligibleTags_
248
+
-[Phase 1012]: Plan 05: Added Dependent TagStateCount property so testTagStateGCDropsUnregistered observes GC without relaxing tagState_ access
249
+
-[Phase 1012]: Plan 05: LastFileParseCount assigned OUTSIDE outer try/catch in onTick_ so partial-failure ticks still update observability
240
250
241
251
### Roadmap Evolution
242
252
@@ -245,6 +255,7 @@ Recent decisions affecting current work:
- Milestone v2.0 added: Tag-Based Domain Model (Ambitious tier — A+B+C+E) — full SensorThreshold reboot under unified `Tag` root + MonitorTag time-series + CompositeTag aggregation + events attached to tags
247
257
- Phases 1004-1011 mapped (2026-04-16): 8-phase strangler-fig decomposition — Tag introduced as parallel hierarchy in Phase 1004; legacy classes deleted only in Phase 1011. 45/45 v2.0 REQs mapped (TAG, MONITOR, COMPOSITE, META, EVENT, ALIGN, MIGRATE). Phase 1009 owns no exclusive REQ-IDs (structural consumer-migration phase).
258
+
- Phase 1012 added (2026-04-22): Tag Pipeline end-to-end — connect TagRegistry to arbitrary raw data files (.dat/.txt/.csv/...), process raw → per-tag .mat files with tag data + metadata, live pipeline variant, load .mat for plotting/dashboarding, including monitor tags.
248
259
249
260
### Pending Todos
250
261
@@ -256,6 +267,7 @@ None yet.
256
267
- Phase 1006: MonitorTag live-tick performance unverified — bench at phase exit (≤10% regression vs. legacy `Sensor.resolve` at 12-widget tick)
257
268
- Phase 1008: CompositeTag merge-sort streaming aggregation must avoid N×M union materialization — 8 children × 100k samples bench gates phase exit (<50MB peak, <200ms compute)
258
269
- Phase 1009: Per-widget consumer migration is many small commits, not one big PR — each commit must keep `tests/run_all_tests.m` AND the golden integration test green
270
+
- Phase 1012 deferred: BatchTagPipeline.eligibleTags_ fails on Octave due to cross-class private-method handle rejection - see .planning/phases/1012-.../deferred-items.md
0 commit comments