Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
96 changes: 96 additions & 0 deletions .planning/INBOX-TRIAGE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# GSD Inbox Triage — HanSur94/FastSense — 2026-07-08

Scope: **issues only** (`--issues`). Report-only run — no labels applied, nothing closed.

## Summary

| Metric | Value |
|---|---|
| Open issues | **149** |
| Closed issues (all time) | **0** |
| Auto-generated enhancements (feature-scout) | 147 |
| Good-first-issue | 2 (#321, #327) |
| Unlabeled outliers | 2 (#71, #151) |
| Created in last 8 days | 29 (~3.6/day) |
| Older than 30 days | 2 (#71, #151) |

Age buckets: <7d: 29 · 7–14d: 109 · 14–30d: 9 · >30d: 2

## Headline finding: the backlog is write-only

149 issues have ever been filed; **zero have ever been closed**. feature-scout files
~3–4 enhancement issues per day and nothing consumes them — no merged PR references
any open issue, and feature-build (the consumer) is gated on human approval that has
never been granted. At the current rate the backlog doubles roughly every 6 weeks.

Compounding this: **the approval gate has no vocabulary.** The label taxonomy has no
`approved` / `approved-feature` label, so there is no mechanism to mark an issue as
picked for feature-build. The pipeline is structurally stuck.

## Duplicates (action: close one of each pair)

1. **#363 duplicates #291** — both propose `TagRegistry.toStructs()` (serialize the
whole catalog, inverse of `loadFromStructs`). #363 (2026-07-06) is the newer,
better-evidenced write-up (cites the hand-rolled inline version in
`tests/test_compositetag.m:408`). Recommend: close **#291** as duplicate, keep #363.
2. **#344 duplicates #221** — both propose exporting *all pages* of a multi-page
dashboard as images (#221 `exportImagePages`, 2026-06-24; #344 `exportReport(dir)`,
2026-07-03). Same feature, different name. Recommend: close **#221** as duplicate,
keep #344 (stronger milestone-tied motivation).

feature-scout's dedup missed both pairs — likely because the titles share few words.

## Stale / administrative closures

- **#71** "smoke test: claude-agent workflow" (2026-04-24, 75 days) — a test issue for
the `claude-agent.yml` workflow. Served its purpose. Close as completed.
- **#151** "Discussion: v3.1 Live Tag Pipeline architectural exploration" (2026-05-19,
50 days) — `LiveTagPipeline.m` has since shipped in `libs/SensorThreshold/` (49 KB).
Close as completed, or convert to a GitHub Discussion if the remaining ideas matter.

## Already-implemented check

Extracted the proposed API name from all 120 titles that contain one and cross-checked
against every function defined in `libs/**/*.m` (1,463 definitions). 14 raw hits, all
false positives (same method name on a *different* class — e.g. widgets have
`setTimeRange` but #224 asks for it on `DashboardEngine`). **No open issue is already
implemented.** Issue quality from feature-scout is genuinely good: bodies consistently
carry problem/motivation with file:line evidence, proposed API with examples, scope,
and alternatives.

## Template compliance

Not applicable — the repo has **no `.github/ISSUE_TEMPLATE/`, no PR templates, and no
CONTRIBUTING.md**. If the issue-first/approval-gated flow is intended to be real,
these are the missing enforcement artifacts.

## Label taxonomy gaps

Current labels: bug, documentation, duplicate, enhancement, good first issue,
help wanted, invalid, question, wontfix, auto-generated, docs.

Missing for the intended pipeline:
- `approved` (or `approved-feature`) — the gate feature-build needs to pick work
- `needs-triage` — for unclassified human-filed issues
- Optional: per-library labels (lib:Dashboard, lib:FastSense, lib:SensorThreshold,
lib:EventDetection) — with 149 issues, component filtering is the only way to
navigate; the current spread is Tag 18, DashboardEngine 13, widgets ~40, etc.

## Component distribution (top)

Tag 18 · DashboardEngine 13 · FastSense 7 · ScatterWidget 7 · EventDetection 7 ·
PlantLogStore 5 · EventStore 5 · EventViewer 5 · FastSenseWidget 5 · MonitorTag 4

## Recommended actions (in order)

1. Close the 2 duplicates (#291, #221) with a duplicate label + pointer comment.
2. Close #71 (done) and #151 (shipped as LiveTagPipeline).
3. Create the `approved` label and approve a first small batch — the two
`good first issue` items (#321 EventViewer.exportImage, #327 Tag.cumulativeIntegral)
are ideal starters — so feature-build has something to consume.
4. Consider throttling feature-scout (e.g. weekly instead of ~daily) until the
consume rate is nonzero; otherwise the backlog is pure noise accumulation.
5. Add per-library labels if the backlog will stay >100 items.

Re-run with `/gsd-inbox --issues --label` to auto-apply recommended labels, or
`--close-incomplete` (not needed — nothing scores below threshold).
30 changes: 30 additions & 0 deletions .planning/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,36 @@ Plans:
Plans:
- [ ] TBD (promote with /gsd:review-backlog when ready)

### Phase 999.2: Tag Analysis Toolkit ✅ COMPLETE 2026-07-08 (6 methods; #327 shipped separately on main via PR #331)

**Goal:** Add a toolbox-free, kind-aware analysis API to the `Tag` family (`libs/SensorThreshold/Tag.m` + subclasses) so engineers can compute statistics and derived series directly from any tag without pulling in the Signal Processing / Statistics toolboxes. All additive, backward-compatible, Octave-safe. Build keystone-first — `getStats()` is the shared primitive the rest lean on.

**Source:** GitHub issue triage 2026-07-08 (see `.planning/INBOX-TRIAGE.md`). All 7 issues carry the `approved` label on HanSur94/FastSense; full specs (problem/motivation, proposed API + examples, scope, alternatives) live in each issue body. Dependency graph: `getStats()` (#223) is cited by ~40 downstream open issues — the single highest-leverage item in the backlog.
**Requirements:** TBD (each GitHub issue body is the working spec — #223/#308/#326/#312/#316/#328/#327)
**Plans:** 7/7 plans complete

Plans (build order — keystone first; all methods land in `libs/SensorThreshold/Tag.m`):
- [x] 999.2-01-PLAN.md (Wave 1) — #223 `Tag.getStats()` public stats primitive (N/Min/Max/Mean/Rms/Std/First/Last/TimeStart/TimeEnd). KEYSTONE
- [x] 999.2-02-PLAN.md (Wave 2, depends 01) — #308 `Tag.resampleUniform(dt)` uniform-grid resample (kind-aware interpolation)
- [x] 999.2-03-PLAN.md (Wave 2, depends 01) — #326 `Tag.derivative()` kind-aware rate-of-change series (gradient over getXY)
- [x] 999.2-04-PLAN.md (Wave 2, depends 01) — #312 `Tag.movingStat(window, type)` rolling mean/std/max/min/rms/median series
- [x] 999.2-05-PLAN.md (Wave 2, depends 01) — #316 `Tag.exceedance(level)` time-above/below-threshold analysis
- [x] 999.2-06-PLAN.md (Wave 2, depends 01) — #328 `Tag.crossings(level)` level-crossing times + direction (cycle/period)
- [~] 999.2-07-PLAN.md — #327 `Tag.cumulativeIntegral()` SUPERSEDED: shipped independently on main (PR #331, quick 260629-tgy); this branch keeps main's canonical version

> Note: all 7 plans append methods to the single shared file `libs/SensorThreshold/Tag.m`. The six Wave-2 plans are logically independent (star dependency on 01) but share this file — execute-phase must serialize edits to Tag.m across concurrently-running Wave-2 plans (each test file is distinct and never conflicts).

### Phase 999.3: EventViewer image export parity ✅ SHIPPED ON MAIN (PR #333, quick 260629-tt3) — this branch dropped its duplicate

**Goal:** Give `EventViewer` (`libs/EventDetection/EventViewer.m`) an `exportImage(path)` method that saves the timeline figure as PNG/JPEG, matching the existing `DashboardEngine`/`DetachedMirror` export capability. Additive, backward-compatible; copy the existing single-figure capture backend.

**Source:** GitHub issue triage 2026-07-08 (see `.planning/INBOX-TRIAGE.md`). Issue #321 carries `approved` + `good first issue` on HanSur94/FastSense. Low-risk parity win — good starter / parallel-track task.
**Requirements:** TBD (GitHub issue #321 body is the working spec)
**Plans:** 0 plans

Plans:
- [x] #321 `EventViewer.exportImage(path)` — save timeline figure as PNG/JPEG (parity with DashboardEngine)

### Phase 1040: Companion Notification Center

**Goal:** Add an acknowledgeable in-app notification inbox to `FastSenseCompanion` — a collapsible right-hand `NotificationCenterPane` (toggled by a toolbar bell + unacked-count badge) that live-lists unacknowledged threshold-violation events from the shared `EventStore` and lets operators acknowledge them (dismiss = `EventStore.acknowledgeEvent`, shared + audited). Predominantly a new UI surface over existing event + acknowledge infrastructure.
Expand Down
6 changes: 4 additions & 2 deletions .planning/STATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,17 @@ progress:
See: .planning/PROJECT.md (updated 2026-05-13)

**Core value:** A MATLAB engineer can ingest a million-sample sensor stream, monitor thresholds, build sub-second-responsive dashboards, and navigate it all from a single Companion app — without leaving MATLAB and without external toolboxes.
**Current focus:** None — all planned milestones shipped (v1.0–v4.0, Companion, Plant Log, polish through Phase 1041). Repo in polish/housekeeping; backlog Phase 999.1 (in-app help) remains unplanned.
**Current focus:** Backlog Tag-analysis features from the 2026-07-08 issue triage. Phases 999.2 (Tag Analysis Toolkit) + 999.3 (EventViewer image export) COMPLETE on branch (see below). Backlog Phase 999.1 (in-app help) remains unplanned.

## Current Position

Phase: — (none active; latest shipped = Phase 1041, MERGED via PR #189 on 2026-06-03)
Plan: —
Milestone: v3.0 FastSense Companion — SHIPPED 2026-04-30; v3.1 Plant Log Integration — SHIPPED 2026-05-19; v4.0 Multi-User LAN Concurrency — SHIPPED 2026-05 via PR #152 (parallel branch); v1.0 perf line — COMPLETE via PR #114. No milestone in flight.
Status: Phase 1041 complete — inline time-range control (toolbar dropdown + Custom date strip) shipped; PR #189 MERGED 2026-06-03. No planned milestone in flight — repo in polish/housekeeping. Outstanding: 12 wiki-bot dup PRs were closed to 1 (#190) + workflow root-caused (260609-mcz); backlog Phase 999.1 (in-app help system) unplanned; ROADMAP v4.0 boxes stale (shipped on main via #152 — router misreports, see memory gsd-router-stale-v4-misroute).
Last activity: 2026-06-29 - Completed quick task 260629-tgy: Tag.cumulativeIntegral() trapezoidal totalizer (#327) — 32/32 TestTag pass, merged via PR #331. Prior: 260629-tt3 EventViewer.exportImage() PNG/JPEG export (#321) — merged via PR #333.
Last activity: 2026-07-08 - Implemented the approved features from the GitHub issue triage via GSD (PR #376, branch claude/github-issues-triage-df4390). Phase 999.2 Tag Analysis Toolkit adds 6 methods to libs/SensorThreshold/Tag.m — getStats #223 (keystone), resampleUniform #308, derivative #326, movingStat #312, exceedance #316, crossings #328 — all toolbox-free/Octave-safe/additive. NOTE: #327 cumulativeIntegral and #321 EventViewer.exportImage were independently shipped on main first (PRs #331/#333, quick tasks 260629-tgy/tt3) while this branch was in flight; on merge of main, this branch keeps main's canonical cumulativeIntegral + exportImage and its duplicates/tests were dropped. Verified via matlab MCP: 6 new Tag-method test files pass; TestTag (main's #327 suite) + TestEventViewer green; TestDerivedTag 35/35 (no regression).

Previous: 2026-06-29 - Completed quick task 260629-tgy: Tag.cumulativeIntegral() trapezoidal totalizer (#327) — 32/32 TestTag pass, merged via PR #331. Prior: 260629-tt3 EventViewer.exportImage() PNG/JPEG export (#321) — merged via PR #333. Earlier: 260624-nvf StatusWidget MonitorTag crash fix (code 14b3d529).

### Note on parallel v4.0 work (main branch state)

Expand Down
Empty file.
Loading
Loading