Prioritized list of features, capabilities, and technical debt for Future Debrief.
This document is maintained by the opportunity-scout and backlog-prioritizer agents, with human oversight.
| Dimension | Description | 1 | 3 | 5 |
|---|---|---|---|---|
| Value | Capability improvement to Debrief | Nice-to-have, cosmetic | Useful enhancement, improves workflow | Core capability, enables new use cases |
| Media | Interest for blog/LinkedIn posts | Internal improvement, hard to visualize | Interesting technical story | Visual, demo-able, compelling narrative |
| Autonomy | Suitability for AI-assisted development | Needs significant human judgment/testing | Some verification needed | Clear acceptance criteria, testable |
Total = Value + Media + Autonomy (max 15)
| Level | Meaning | Model |
|---|---|---|
| Low | Straightforward, limited scope | Haiku |
| Medium | Moderate scope, some design decisions | Sonnet |
| High | Significant scope, complex design | Opus |
| Status | Meaning | Trigger |
|---|---|---|
| needs-interview | Quick capture, awaiting detailed requirements | /idea --defer |
| proposed | Item added, awaiting review | Scout adds, ideas-guy adds, or human submits |
| approved | Strategically reviewed, ready for spec | Ideas-guy approves |
| specified | Spec created, linked below | /speckit.start {ID} |
| clarified | Ambiguities resolved | /speckit.clarify |
| planned | Implementation plan ready | /speckit.plan |
| tasked | Tasks broken down | /speckit.tasks |
| implementing | Active development | /speckit.implement or /bugfix |
| complete | Done (row struck through) | /speckit.implement completes or /bugfix PR merged |
1. IDEATION
the-ideas-guy ──generates──> strategic ideas ──────────┐
opportunity-scout ──explores──> technical opportunities │
▼
BACKLOG.md
│
┌───────────────────┬───────────────────┘
│ │
▼ ▼
(needs-interview) (proposed)
Quick capture Full detail
│ │
│ │
2. INTERVIEW │ │
/interview ────┘ │
completes requirements gathering │
│ │
└─────────────> proposed <──┘
│
3. SCORING (backlog-prioritizer)
scores V/M/A for proposed items
│
4. REVIEW (the-ideas-guy)
reviews scored items against STRATEGY.md
├── Approve → status: approved
├── Park → STRATEGY.md Parking Lot
└── Reject → STRATEGY.md Rejected Log
│
5. SPECIFICATION ▼
/speckit.start {ID} ← requires status: approved
│
OR (for Bug items only): │
/bugfix {ID} ──────────────┼──> implementing ──> complete
│ (skips specify → tasked)
| Command | Required Status | Error if Wrong Status |
|---|---|---|
/interview |
needs-interview |
"Item {ID} doesn't need an interview (status: {status})" |
/speckit.start |
approved |
"Item {ID} needs interview first. Run /interview to complete requirements gathering." (if needs-interview) |
/speckit.start |
approved |
"Item {ID} has status '{status}'. Only 'approved' items can be started." (other statuses) |
Quick Capture Path (via /idea --defer):
- User captures idea quickly → status:
needs-interview - Later, user runs
/interview→ conducts full interview → status:proposed - Normal flow continues: scoring → approval → specification
Full Detail Path (via /idea):
- User provides full detail with interview → status:
proposed - Normal flow continues: scoring → approval → specification
When an item has status approved:
/speckit.start 007 # Validates item is approved, creates spec, updates this fileThis bridges backlog approval to the speckit workflow by:
- Validating the item exists and has status
approved - Creating a feature branch and specification
- Updating this file: status →
specified, description → link to spec
Bug items (Category: Bug) skip the full speckit pipeline. A bug fix restores existing specified behaviour — it doesn't need a new spec, plan, or task breakdown.
/bugfix 013 # Validates item is approved + Category is Bug, then fix → test → PRFast-track status flow:
approved → implementing → complete
What is skipped: specification, clarification, planning, task breakdown, media content, evidence artifacts.
What still applies: tests required (Constitution Art. VI), atomic commits (Art. XIII), PR with summary and test plan.
Constitution note: Article VIII ("Specs before code") applies to significant new implementations. A bug fix restores behaviour already defined by a prior feature's spec, so it falls outside this gate.
Large features broken down into multiple backlog items.
| ID | Title | Description | Status | Items |
|---|---|---|---|---|
| 024 | Storyboarding Briefings | Add storyboarding capability for mission/exercise briefings | specified | #215, #216, #217, #218 |
| E01 | Tool Implementation Sequence | Implement 63 documented legacy tools in phased order | approved | |
| E03 | Buffer Zone Analysis Demo | Reactive PROV cascade with 5-tool chain for stakeholder demo | approved | |
| E04 | Results Visualization | Vega-Lite based results viewing infrastructure | approved | |
| E06 | Architectural Consistency | Fix implementation drift and constitutional violations from six-axis review | approved | |
| E07 | Sensor Data Pipeline | Port legacy sensor capabilities in 7 phases: schema, import, rendering, array offsets, residuals, TMA, interactive drag | proposed | |
| E09 | Provenance Graph | Reference data currency tracking and solution comparison (shadow tracks) | proposed | #145, #146, #147, #148, #150, #151, #149 |
| E10 | NL-Assisted Catalog Discovery | Natural language search over STAC catalog, integrated with CQL2 filter engine | proposed | #180, #181, #182, #183, #184, #185, #186, #187, #188, #189, #190 |
| E11 | Schema-First Boundary Typing | Root every data-parse boundary in LinkML or a declared TS schema; eliminate residual Record<string, unknown> boundary casts |
approved | #206 (audit) — additional items added per phase |
| E12 | Shared @debrief/tools-ts package | Extract TypeScript tool implementations into a shared workspace package; eliminate cross-app deep imports | approved | — added per migration phase |
| ID | Category | Description | V | M | A | Total | Complexity | Status |
|---|---|---|---|---|---|---|---|---|
| 230 | Enhancement | Storyboard edit suite webview wiring + web-shell harness + error triage — follow-up for #218's deferred items. Ships the three wiring gaps in the VS Code webview (chevron expand + double-click + right-click overflow menu; client-side reducer consuming the 3 inbound + 11 outbound postMessages; storyboardPanelView.refresh() enriched with SceneEditViewModel[] + pendingUndoToast), an interactive web-shell harness with full reducer (so Playwright drives the polish loop end-to-end from the primary E2E surface), thin code-server E2E for VS Code-native chrome only, plus triage of the two pre-existing errors (Capture failed — viewport not reported race + Failed to load plot STAC-load diagnostic). Unblocks the T068/T087/T094 Playwright + T097 screenshots + T101/T102 blog post deferred from #218. Estimate 6–8 dev-days. (follow-up to #218) |
4 | 4 | 4 | 12 | Medium | approved |
Building [Feature] posts per shipped standalone spec, epic rollups replacing per-spec posts for multi-spec arcs (charter-first detection with [Ex] fallback), and composite posts clustering temporally+thematically-related standalones (5-day window AND ≥1 shared tag; 5–10 day near-miss band surfaced for author review). Produces ARCHIVE-REBUILD.md at repo root with index + runbook so the debrief.github.io maintainer can wipe and republish future posts from scratch. No modifications to existing specs/*/ files; all output at new paths. Script deleted in same PR. Depends on #511 (combine-articles-cache-specs) for the Building title template + evidence/opening-context.md contract. Pre-specify interview record preserved at specs/228-regenerate-blog-archive/spec-draft.md. |
||||||||
| 229 | Feature | Storyboarding v2 epic — consolidated follow-up covering the three post-#024 presentation-layer items (distraction-free briefing renderer, animated time-range Scenes with time_range != null interpolation, and MP4/GIF video export of a Storyboard traversal). With #218 shipping the #024 MVP, the next storyboarding improvements are all presentation-layer; grouping into one epic lets the team sequence them coherently. (requires #215–#218 MVP; ties to spec.md Out of Scope entries) |
- | - | - | - | High | needs-interview |
| 221 | Enhancement | Capture actor setting — expose a VS Code setting (debrief.storyboard.captureActor) that overrides the OS-username default used in LogEntry.agent for Storyboard captures. Today the extension falls back to os.userInfo().username with a "vscode-user" fallback (see #216 research R6a); this is fine for a single-analyst station but multi-user ops rooms may want a fixed callsign or operator code. Low urgency; surface during #218 edit-suite work if no one else picks it up. (follow-up to #216) |
2 | 2 | 4 | 8 | Low | proposed |
| 222 | Infrastructure | [E11] Promote MCP transport envelopes to LinkML — the audit (#206) flagged 16 hand-typed MCP / tool-system shapes across shared/utils/src/mcp-types.ts, shared/components/src/ToolMatch/mcpAdapter.ts, apps/vscode/src/services/mcpToolAdapter.ts, apps/web-shell/src/mocks/calcService.ts, services/session-state/src/server/mcp.ts, and services/session-state/src/log/types.ts (MCPRequest, MCPToolResponse, MCPErrorResponse, MCPContentItem, MCPToolDefinition, MCPSelectionRequirement, MCPParamSchema, ToolResult, ToolDefinition, ToolParameterMeta, ToolExecutor, ToolVersionResolver, ToolName, ToolResultForLog, ToolExecutionResultForReplay, ToolsUpdateMessage). These cross the Python↔TS boundary via MCP JSON-RPC and must be rooted in LinkML. See docs/type-audit-2026.md §3.1 for the per-site list. |
3 | 2 | 4 | 9 | Medium | approved |
| 223 | Infrastructure | [E11] Promote STAC catalog hand-types to LinkML — the audit (#206) flagged StacItem (3 sites), StacCatalog (2 sites) and related aliases in apps/vscode/src/types/stac.ts and apps/web-shell/src/mocks/stacService.ts. STAC payloads persist to disk (Python writes, TS reads) and are authoritative wire shapes — they must be rooted in LinkML so the two sides cannot drift. See docs/type-audit-2026.md §3.2 (drift cluster) and §3.1. |
3 | 2 | 4 | 9 | Medium | approved |
| 224 | Infrastructure | [E11] Promote session-state wire shapes to LinkML — the audit (#206) flagged 6 cross-domain session-state types in services/session-state/src/log/types.ts and services/session-state/src/types/index.ts: StateSnapshot, FeatureProvenance, ModifiedFeature, InputFeatureState, BranchPointLocation, CreateSnapshotOptions. These serialise to disk and across the Python MCP boundary. See docs/type-audit-2026.md §3.1. |
3 | 2 | 4 | 9 | Medium | approved |
| 225 | Infrastructure | [E11] Promote loader↔main IPC envelopes to LinkML — the audit (#206) flagged 5 IPC response/request shapes hand-authored in apps/loader/src/main/ipc/stac.ts and apps/vscode/src/commands/openPlot.ts: CreatePlotResponse, AddFeaturesResponse, ListPlotsResponse, OpenPlotArgs, ParseResult. These cross Electron main↔renderer and VS Code↔loader boundaries and should be derivable from a single source. See docs/type-audit-2026.md §3.1. |
3 | 2 | 4 | 9 | Medium | approved |
| 226 | Infrastructure | [E11] Resolve real drift clusters surfaced by the type-audit — the audit (#206) found 25 drift clusters (same-name different-shape declarations). Excluding Storybook Story / React component Props local-convention clusters (routed to #227) and drift clusters whose resolution is already owned by a domain-specific E11 child (#204 GeoJSON, #222 MCP, #223 STAC, #224 session-state, #225 IPC), the residual drift set that lands here includes DebriefConfig, ExtensionMessage, ExtensionToWebviewMessage, FilterState, IncomingMessage, PlotTimeRange, PointMetadataEntry, PropertiesCommitMessage, SetCurrentTimeMessage, StylePropertyDescriptor, TimeControllerState, WebviewMessage, WebviewReadyMessage, WizardStep — each should be deduplicated by promoting the winning shape to LinkML or refactoring callers. See docs/type-audit-2026.md §3.2. |
3 | 2 | 4 | 9 | Medium | approved |
| 227 | Infrastructure | [E11] Storybook / React component local-convention drift rollup — the audit (#206) mechanically flagged Story (38 sites) and Props (14 sites) as drift candidates because each file re-declares these names with different shapes. Both are well-understood per-file conventions rather than semantic drift. This item exists so those rows have a backlog home (per spec FR-006) and so the rule can be re-evaluated if the Storybook/React setup changes; no code action expected unless the audit methodology changes. |
1 | 1 | 5 | 7 | Low | approved |
| 220 | Tech Debt | Stale-viewport guard on Storyboard capture — add an async await nextFrame() (or 50ms debounce) at the start of captureScene.ts so Leaflet moveend has fired before the viewport snapshot is read from session-state. Closes a narrow silent-failure window where a rapid-pan + immediate Ctrl/Cmd+Alt+C captures the viewport from before the final pan gesture settled. Low practical risk (humans take > 100ms between pan-finish and keystroke) but this is Article I.3 (no silent failures) hygiene. (follow-up to #216) |
3 | 1 | 4 | 8 | Low | proposed |
| 231 | Tech Debt | Fix screenshot handling in regenerated blog archive — revive the one-shot generator deleted in #228 (commit 19406178), patch the three stitchers so epic rollups and composite posts preserve member-spec images (34 of 57 source references silently dropped in PR #518 — zero images in every composite, zero in every rollup), add a path rewriter that converts source-relative ./evidence/... paths to Jekyll's /assets/images/future-debrief/<slug>/ convention, add Orphan Screenshots + Broken Image References sections to ARCHIVE-REBUILD.md (19 orphans across specs 085/118/142), re-run, re-delete. Generator is ephemeral per #228 FR-009. (follow-up to #228) |
2 | 3 | 4 | 9 | Medium | approved |
| 219 | Tech Debt | Buffer item.json asset-entry updates to save-time — today #216's sceneThumbnailService.writeSceneThumbnail rewrites item.json on every capture (PNG write + asset entry merge + JSON rename-on-tmp). Per-capture cost is sub-10ms so not a perf blocker, but it entangles the "in-memory session state" vs "persisted plot" boundary that the rest of the editor maintains cleanly (features.geojson is flushed at save-time only). Shift asset-entry updates to an in-memory buffer, reconcile with item.json at the save path (where other on-disk mutations already live). Architectural cleanness win, not a perf win. (follow-up to #216) |
3 | 1 | 3 | 7 | Low | proposed |
| 218 | Feature | [E024 4/4] Storyboarding: edit suite + housekeeping — Inline rename, markdown description, soft-delete + toast-undo, update-to-current (atomic re-snapshot), duplicate (prompted timestamp), copy-to-other-storyboard (deep-copied thumbnail); stale-thumbnail detection + per-Scene refresh; every edit op lands in the Analysis Log Panel (#176) with the Scene thumbnail. Turns raw captures into a briefing-ready narrative. (requires #215, #216, #217, #174, #176) | 3 | 3 | 3 | 9 | High | implementing |
flyTo + time-slider tween, scrub-window lock, on-map Scene rectangles for the active Storyboard, missing-data hard-block. Delivers the epic's stated core value — guided walk-throughs of recorded exercises. (requires #215, #216) |
||||||||
Storyboard + Scene + Viewport + HistoryEntry sources, generated Pydantic / JSON Schema / TypeScript bindings, Article II adherence tests (golden fixtures, Python↔TS round-trip, Pydantic-vs-LinkML JSON Schema equality), and a headless shared TypeScript CRUD module at shared/components/storyboard/ enforcing ordering / duplicate-timestamp rejection / feature_set_hash / missing-data detection / append-only provenance. Authoritative Key Entities for the whole epic. |
||||||||
@debrief/utils re-duplication — add a lint or CI check that fails if a file matching apps/*/src/utils/bounds.ts reappears, or more generally if any apps/* file exports a symbol already exported from @debrief/utils. Makes the SC-001 guarantee from #200 durable; without it, a future contributor could reintroduce a local bounds.ts without friction. Candidate implementations: custom ESLint rule (no-restricted-exports-flavoured), or a small CI script under scripts/. (follow-up to #200) |
||||||||
shared/components/src/utils/bounds.ts with @debrief/utils — that copy operates on LinkML-typed DebriefFeature arrays and carries additional helpers (expandBounds, isPointInBounds, bboxOverlapsViewport, viewportToBounds, filterBySpatialExtent). Unification requires reconciling three feature-type families (DebriefFeature / SafeFeature / GeoJSONFeature) and migrating four consumers. Must also settle the pre-computed-bbox fast-path policy on the unified implementation (absorb #211 at approval time if #211 is still open). Legitimately larger scope than #200's generic-GeoJSON consolidation — treat as its own cleanup. (follow-up to #200; absorbs #211 on approval) |
||||||||
| 212 | Tech Debt | Replace hand-written SafeFeature / GeoJSONFeature with LinkML-generated equivalents — two hand-written TypeScript feature types in shared/utils/src/types.ts (one with a required, typed geometry; one with geometry: SafeGeometry | null + coordinates: unknown). Pre-dates #200 but is an Article II tripwire — any "schema-adjacent" in-tree type should be LinkML-generated. #200 widens calculateBounds to a structural minimum that sidesteps the smell; this item closes it. (predates #200; follow-up) |
3 | 1 | 3 | 7 | Medium | proposed |
| 211 | Tech Debt | Pre-computed-bbox fast-path in @debrief/utils calculateBounds — honour feature.bbox when present and skip the per-feature coordinate walk. shared/components/src/utils/bounds.ts already does this; @debrief/utils does not. Convergent-behaviour improvement that reduces one delta between the two implementations and is a prerequisite for any future unification (see #213). (follow-up to #200) |
3 | 1 | 4 | 8 | Low | proposed |
| 210 | Tech Debt | Un-skip webview log-panel E2E suite — tests/e2e/test-log-panel.spec.ts is currently test.describe.fixme(...) pending issue #143 (webview iframe selector instability in code-server). Once #143 resolves, convert back to active tests; these cover the real integration path (code-server → LogPanel webview iframe → VS Code message bus) that Storybook cannot exercise. (requires #143, #176) |
3 | 1 | 4 | 8 | Low | approved |
| 209 | Tech Debt | LogPanel axe-core accessibility audit — run @axe-core/playwright against every LogPanel Storybook story in light + dark + vscode theme variants; produce evidence/176-log-panel-ux/a11y-audit.md with violations + fixes. Context: Feature 176 covers roving-tabindex (#176 T008) and aria-selected on cards (#176 T007), but full a11y audit has not been run. @axe-core/playwright is a new but widely-used MIT dep. (follow-up to #176) |
4 | 2 | 4 | 10 | Low | approved |
| 208 | Tech Debt | Add kind discriminator to TimelineEntry — extend the UI projection in shared/components/src/LogPanel/types.ts with kind?: 'snapshot' | 'tool' | 'tune', populated by the VS Code host in apps/vscode/src/views/logPanelView.ts. Feature 176 decision 2A detects snapshot entries via ToolCategory === 'snapshot' — works short-term but conflates visual category with entry semantics. Future features (snapshot button, tune marker, manual rationale entries) need a proper discriminator. (follow-up to #176, depends on PROV-side signal) — Implemented schema-rooted on branch 208-timeline-entry-kind-v2; supersedes PR #508 (UI-only rename of coupling) and PR #507 (planning-only). See ADR-023. |
3 | 1 | 4 | 8 | Low | implementing |
| 207 | Feature | Tool manifest lookup for category resolution — replace the static TOOL_ID_TO_CATEGORY map in shared/components/src/LogPanel/toolCategories.ts with a lookup against a tool manifest. Today the interim static map only knows tools we hand-listed; new tools in contrib/ or services/calc/ get the neutral-grey fallback even when they have a clear category. Spec research R1 explicitly flags this as interim and the spec §12 Q1 requires manifest-declared categories. (follow-up to #176, blocked on tool manifest schema definition) |
3 | 2 | 3 | 8 | Medium | proposed |
apps/, shared/, and services/; classify as schema-rooted / boundary / single-domain-exception / drift-candidate; produce report; open follow-up items for every promote-to-LinkML and drift finding not already covered by #203 – #205. Feeds the phase list for E11. |
||||||||
'full'|'trail' vs 'normal'|'snailTrail'; 'playing'|'paused' vs 'stopped'|'playing'|'paused'). Define DisplayModeEnum + PlaybackStateEnum in LinkML, regenerate, delete both hand-typed copies per enum. Session-state's superset PlaybackState wins; components widens. |
||||||||
GeoJSONFeature is defined twice in TS with different shapes (@debrief/utils vs services/session-state) because there's no LinkML class for the loose "any GeoJSON Feature" parse-boundary type. Add RawGeoJSONFeature to the LinkML schema, regenerate, delete both TS copies. Document usage as parse-boundary-only; narrow to DebriefFeature past the boundary. |
||||||||
Coordinate, ViewportPolygon, TimeFilter defined twice in TS (components + session-state) using tuples, while LinkML has Coordinate = {longitude, latitude} object form. Adopt object form as canonical end to end; add toGeoJSONCoord / fromGeoJSONCoord helpers in @debrief/utils to confine tuple handling to GeoJSON boundary. |
||||||||
apps/loader/src/main/** as unused; almost certain false-positive from knip not tracing electron-builder config. Confirm main/index.ts is the declared entry, confirm IPC modules are reachable, add knip config stanza whitelisting the entry so future runs stay clean. |
||||||||
ResolvedPositionStyle interfaces with drifted shapes (symbol: 'circle'|'square'|'triangle' + label vs the 5-symbol components version + labelText). Canonicalise in @debrief/utils; symbol field uses PositionStyleSymbolEnum from @debrief/schemas (not a hand-typed union); field name labelText. |
||||||||
~~Consolidate bounds utilities into @debrief/utils — apps/vscode/src/utils/bounds.ts is a ~116-line 95%-identical copy of shared/utils/src/bounds.ts; vscode version has a null-guard the shared version is missing. Lift null-guard into utils, reconcile SafeFeature/GeoJSONFeature at the call site, delete the vscode copy + duplicate test, switch mapPanel.ts to import from @debrief/utils.~~ |
||||||||
decisions.md; (b) merge LogTimelineProps + LogByFeatureProps into single LogPanelProps; (c) delete orphaned shared/components/diff/ sub-package; (d) add specs/** to knip ignore; (e) fix plotName placeholder in loader's useLoadWorkflow + promote 3 remaining TODOs to GitHub issues. |
||||||||
| 198 | Enhancement | [E10] NL search — keyring-unavailable distinct banner — when context.secrets.get() throws (locked/missing OS keyring on Linux), surface a specific keyring-unavailable outcome + banner rather than folding it into the generic not-configured path; different diagnosis (unlock keyring vs re-enter key) (requires #191) |
3 | 1 | 4 | 8 | Low | approved |
| 197 | Feature | [E10] NL search — per-prompt audit trail (opt-in) — optional verbose log capturing prompts + responses for forensic review; separate setting + separate log channel; off by default; structured for SIEM ingest (requires #191 structured telemetry) | 3 | 2 | 3 | 8 | Medium | approved |
| 196 | Feature | [E10] NL search — non-Anthropic providers — pluggable provider choice via debrief.nlSearch.provider setting (Claude / OpenAI / ollama); LLMClient abstraction already supports new factories, main work is per-provider prompt adaptation + error-class mapping (requires #191, provider-neutral prompt validation harness) |
4 | 3 | 3 | 10 | High | approved |
| 195 | Feature | [E10] NL search in Layers & Tools panels — extend NL-mode to other VS Code webview surfaces once #191 proves out in the Catalog Overview; FilterBar llmClient prop carries over, wiring is presentational (requires #191) |
4 | 3 | 4 | 11 | Medium | approved |
| 194 | Infrastructure | Cross-cutting PROV log rotation — unify per-item (debrief:provenance_log → provenance_log_archive.jsonl, introduced by #191) and per-feature (existing LogService properties.provenance[]) PROV log rotation/archival under one policy. Today: #191 caps item-level at 500 entries + JSONL archive; feature-level PROV logs are unbounded. Make archival behaviour, cap values, and on-disk archive shape consistent across both levels so retention, replay, and eventual catalog-level audit exports have one mental model. Context: Article III.3 (audit trail immutable) + bounded-growth constraint surfaced during /speckit.review for #191. (requires #191) |
3 | 2 | 3 | 8 | Medium | proposed |
| 193 | Enhancement | Platform autocomplete + vessel class picker in PropertiesPanel — richer PlatformArrayWidget UX that pulls candidates from platform-registry.json (#180): nationality flag/code lookup, vessel class tree navigator (domain → class → role → type), known-platform autocomplete on id. Today #191 ships a plain add-row widget — analysts typing "NELSON" get zero help. Context: completes the PropertiesPanel Story 1 (editing debrief:platforms) to the same ergonomic bar as the filter chips built in #186. (requires #191, #180) |
3 | 3 | 3 | 9 | Medium | proposed |
| 192 | Feature | Extend Properties Panel to feature + sub-feature editing in plot view — reuses #447's ActivityPanel shell; form content swaps on selection.primary/selection.featureIds (one feature → feature editor; track-point path → sub-feature editor; cleared → plot editor); includes LinkML extension for point-level metadata (requires #447) |
3 | 2 | 2 | 7 | High | approved |
| 145 | Infrastructure | [E09] Reference data source schema — LinkML models for reference source types (web-page, REST API, local file, other session), currency states, captured values, and selector expressions | 4 | 2 | 4 | 10 | Medium | proposed |
| 146 | Feature | [E09] Web page reference fetcher service — Python service to fetch URL + XPath/CSS selector, compare against captured value, determine currency state (current/changed/unavailable/source-structure-changed) (requires #145) | 4 | 3 | 3 | 10 | Medium | proposed |
| 147 | Feature | [E09] Session currency check orchestrator — batch currency check on session open and manual refresh trigger; aggregates results across all reference sources in a session (requires #146) | 4 | 2 | 4 | 10 | Medium | proposed |
| 148 | Feature | [E09] Currency change notification modal — blocking modal listing all changed sources with per-source view-diff, accept-update, reject-update controls; batches multiple changes into single modal (requires #147) | 4 | 4 | 2 | 10 | High | proposed |
| 149 | Feature | [E09] Analysis Log reference data presentation — source indicator icons and warning badges on Analysis Log cards; detail/flip view showing reference value at capture, source URI, and currency status (requires #145) | 3 | 3 | 4 | 10 | Medium | proposed |
| 150 | Feature | [E09] Downstream recalculation on accept — when analyst accepts updated reference value, re-execute all affected downstream tools via PROV dependency graph; cascading re-run with updated inputs (requires #148) | 5 | 4 | 2 | 11 | High | proposed |
| 151 | Feature | [E09] Shadow track rendering and lifecycle — render previous solution as faded overlay on map during recalculation; auto-display on any recalc trigger, dismiss button in Analysis Log, replacement on subsequent recalc, transient-only (requires #150) | 4 | 5 | 3 | 12 | Medium | proposed |
shared/data/platform-registry.yaml with platforms as leaf instances under their class; Python + TypeScript loaders; seeded with 10 known platforms |
||||||||
display_name, nationality, vessel_class, vessel_type, vessel_role, domain on TrackProperties; debrief:platforms STAC extension replacing flat aggregates; regen Pydantic + TS types (requires #180) |
||||||||
platform_id values against registry after import; log warnings listing unregistered IDs (import still succeeds) (requires #180) |
||||||||
platform_id against registry tree at save; overlay analyst-set overrides; emit fully resolved debrief:platforms on item.json (requires #180, #181) |
||||||||
preview/workspace/samples/local-store/, re-import 72 legacy files through enriched pipeline; populate registry; all schema tests pass (requires #182, #183) |
||||||||
array_filter evaluator — extend shared/components/src/filter-engine/ to evaluate array_filter() for compound predicates on platforms[]; matchers + CQL2-JSON serialization; unit tests (requires #181) |
||||||||
array_filter CQL2 expressions (requires #185) |
||||||||
array_filter syntax; generator + headless harness; ships a hand-authored fixture corpus so CI and offline stakeholder demos run with zero live-LLM dependency (requires #185, #187) |
||||||||
LLMClient interface backed by a real provider; auth, endpoint config, MCP/proxy/direct decision; drops in as a config toggle to expand #189 beyond the fixture corpus (requires #188, #189) |
||||||||
start_datetime/end_datetime from track position timestamps during REP file loading; enables accurate Timeline/Gantt view and Duration filter |
||||||||
| ~~Import legacy Debrief sample data into STAC catalog — build DPF parser, import all REP/DPF/DSF files (~148 files) from legacy repo, commit demo STAC catalog for stakeholder engagement~~ | ||||||||
| 135 | Enhancement | [E08] Populate STAC extension properties on plot save — update plot-save to write debrief:vessel_classes, debrief:tags, debrief:author, debrief:track_names, debrief:nationalities into item.json on save (requires #125) |
4 | 2 | 4 | 10 | Medium | proposed |
kind attribute values in LinkML schema [E06] — Python/TS produce different kind values; define in LinkML and propagate constants (Blocking) |
||||||||
| 104 | Bug | Align range-bearing tool: selection requirements + GeoJSON output [E06] — Python accepts TRACK+SHAPE and returns non-GeoJSON; TS requires 2 TRACK and returns GeoJSON; align both (F-2.4, F-2.5) | 4 | 3 | 4 | 11 | Medium | approved |
| 105 | Tech Debt | Unify tool type definitions and consolidate MCP adapters [E06] — VS Code hand-authored types shadow schema-generated types; two mcpAdapter files diverge; no legacy to support (F-5.1, F-5.2) | 4 | 2 | 4 | 10 | Medium | approved |
| 106 | Tech Debt | Add post-execution output validation to TS tools [E06] — Python validates tool output; TS has zero post-execution validation (requires #103) | 4 | 2 | 4 | 10 | Medium | approved |
| 107 | Bug | Align area-summary tool input semantics [E06] — Python expects context.bounds; TS extracts bbox from coordinates; same algorithm, different contract | 4 | 2 | 4 | 10 | Low | approved |
| 108 | Tech Debt | Wire drawing mode and palette to session-state store [E06] — both frontends use local useState instead of session-state; drawing mode resets on webview re-render (F-3.1, F-3.2) | 3 | 2 | 5 | 10 | Low | approved |
| 109 | Tech Debt | Unify result layer lifecycle across frontends [E06] — web-shell uses persistent app state; VS Code uses ephemeral webview state; neither persists to STAC | 4 | 3 | 3 | 10 | High | approved |
| 110 | Tech Debt | Investigate and resolve tool-level undo gap in VS Code [E06] — web-shell has full tool undo via Log Service; VS Code only has UI-state undo; Log Service exists but VS Code never invokes it | 4 | 3 | 3 | 10 | High | approved |
| 111 | Tech Debt | Add periodic heartbeat re-validation for Python dependencies [E06] — after activation, if debrief-calc becomes unavailable, status bar stays green until next tool execution fails | 3 | 2 | 5 | 10 | Low | approved |
| 123 | Tech Debt | Add disabled and rationale fields to Python LogEntry model — fields exist in LinkML schema (log-entry.yaml:61-69) and TypeScript types but not in Python Pydantic model (models.py); Art. II.1 violation, same gap pattern as #116's inputState fix |
3 | 1 | 5 | 9 | Low | proposed |
| 142 | Infrastructure | VS Code E2E webview reliability — research sprint — resolveWebviewView never fires in openvscode-server, causing ~15 test files (~50+ tests) to self-skip; research sprint to find reliable approach for real extension webview content in headless Playwright CI (subsumes #135) |
5 | 3 | 2 | 10 | High | specified |
~~Fix openPlotViaStacTree timeout in CI E2E tests — openPlotViaStacTree() times out (~42s) in every CI run; 18 test suites skipped; STAC tree never populates in openvscode-server despite config being pre-seeded; see plan doc for 3 solution options~~ |
||||||||
| 091 | Feature | Add tool parameter context menus for pre-execution configuration — successive inline context menus in webview to collect parameter values before tool execution; presets defined in LinkML | 4 | 4 | 3 | 11 | High | specified |
| 068 | Feature | Implement Phase 5 tools: track/analysis [E01] — 8 high-complexity TMA, zig detection, and plotting tools (requires #062, #064, #067) | 5 | 5 | 3 | 13 | High | approved |
| 066 | Feature | Implement Phase 3 tools: track/manipulation [E01] — 12 group, merge, split, trim, interpolate tools (requires #062, #064) | 5 | 4 | 4 | 13 | High | approved |
| 064 | Feature | Implement Phase 1 tools: track/measurement [E01] — 19 foundational calculation tools (requires #049, #062, #063) | 5 | 4 | 4 | 13 | High | approved |
| 084 | Feature | Wire buffer zone analysis demo end-to-end [E03] — 5-step reactive PROV cascade with edit-mode map interaction (requires #076, #078-082, E04 #086, E04 #089) | 5 | 5 | 2 | 12 | High | approved |
Positions/Sensors/Track Segments grouping rows under tracks with embedded sensors; each named sensor expands to its contacts (requires #116) |
||||||||
| 120 | Feature | [E07] Bearing and frequency residual analysis [E07] — Doublet infrastructure, stacked dots custom React component, Doppler calculations (requires #116, #119) — deferred pending executive sponsorship | - | - | - | - | High | proposed |
| 121 | Feature | [E07] TMA data model and solution generation [E07] — TMA schemas, Absolute/Relative segments, solution generation from sensor cuts (requires #116, #120) — deferred pending executive sponsorship | - | - | - | - | High | proposed |
| 122 | Feature | [E07] TMA interactive drag [E07] — rotate/shear/stretch drag modes with live residual feedback (requires #121, #120) — deferred pending executive sponsorship | - | - | - | - | High | proposed |
| 063 | Infrastructure | Analyse tool specs for phased implementation sequence [E01] — dependency graph, phase groupings, and per-phase backlog items for 63 documented tools | 5 | 3 | 4 | 12 | Medium | approved |
| 079 | Feature | Implement move-track tool [E03] — offset track by range/bearing with map drag support (requires #049, #062) | 4 | 4 | 4 | 12 | Medium | specified |
| 081 | Feature | Implement point-in-zone-classifier tool [E03] — classify and recolor reference points by buffer zone membership (requires #049, #078, #080) | 4 | 4 | 4 | 12 | Medium | specified |
| 082 | Feature | Implement zone-histogram-generator tool [E03] — outputs dataset/zone_histogram, point counts per buffer zone (requires #049, #081) | 4 | 4 | 4 | 12 | Medium | approved |
| 011 | Documentation | Create Jupyter notebook example demonstrating debrief-calc Python API | 4 | 4 | 4 | 12 | Low | approved |
| 065 | Feature | Implement Phase 2 tools: track/styling + dataset/export [E01] — 15 styling and export tools (requires #064) | 4 | 3 | 4 | 11 | Medium | approved |
| 060 | Feature | Add resample track tool spec (requires #049) | 4 | 3 | 4 | 11 | Medium | approved |
| 002 | Feature | Add MCP wrapper for debrief-io service | 4 | 3 | 4 | 11 | Medium | approved |
| 089 | Feature | Result view auto-refresh on logical ID change [E04] — watches logical result IDs, re-renders preserving viewport; absorbs E03 #083 (requires #086, #087, #088) | 4 | 4 | 3 | 11 | Medium | approved |
| 027 | Infrastructure | Add automated screenshot capture for Storybook stories | 3 | 4 | 4 | 11 | Medium | approved |
dict[str, Any]; add debrief_schemas dependency, validate at service boundary, replace hardcoded enums with schema imports |
||||||||
| 008 | Feature | Design and implement extension discovery mechanism for contrib packages | 4 | 3 | 3 | 10 | High | approved |
| 090 | Infrastructure | E04 sample data workshop: identify realistic generators for all result types [E04] — collaborative workshop using E03 demo scenario; pseudocode + golden fixtures for all result categories (prerequisite for #085) | 5 | 3 | 2 | 10 | Low | approved |
| 058 | Feature | Add flip shape horizontal tool spec (requires #049) | 2 | 2 | 5 | 9 | Low | approved |
| 059 | Feature | Add flip shape vertical tool spec (requires #049) | 2 | 2 | 5 | 9 | Low | approved |
| 099 | Infrastructure | Browser-based VS Code extension preview via Heroku Review Apps — code-server container with Debrief extension + sample data, auto-deployed per PR | 3 | 4 | 4 | 11 | Medium | tasked |
[a-z0-9_-] only) to STAC Extension spec from #125; add validation in create_plot() for custom IDs (BP-5) |
||||||||
_add_item_link() for human-readable link titles; add titles to structural links (root, parent, self) in Items |
||||||||
derived_from links for provenance — add STAC-native derived_from link relation at Item level to complement existing debrief:provenance asset properties |
||||||||
| 152 | Enhancement | Group narrative entries into a NarrativeLog container — introduce kind=NARRATIVE_LOG feature type that groups related narrative entries under a single GeoJSON Feature with shared style/provenance/track_id; follows SensorData embedding pattern; reduces duplication and enables log-level visibility toggling in layers panel |
3 | 3 | 4 | 10 | Medium | proposed |
| 140 | Enhancement | [E08] Viewport persistence across sessions — save CatalogOverview map viewport (center, zoom) to VS Code webview state and restore on panel re-open; enables analysts to resume geographic browsing where they left off (requires #130) | 2 | 2 | 4 | 8 | Low | proposed |
| 141 | Enhancement | [E08] R-tree spatial index for large catalogs — replace linear AABB scan in filterBySpatialExtent with an R-tree index (e.g., rbush) for catalogs with 1000+ exercises; current O(n) scan is sub-millisecond for 200 items but would lag at scale (requires #130) |
2 | 1 | 4 | 7 | Low | proposed |
| 029 | Tech Debt | Add unit tests for VS Code extension providers | 4 | 2 | 5 | 11 | Low | proposed |
| 004 | Infrastructure | Add contrib folder scaffolding with example extension (requires #008) | 3 | 3 | 4 | 10 | Low | proposed |
| 033 | Tech Debt | Re-enable debrief-stac tests in pytest | 4 | 2 | 4 | 10 | Low | proposed |
| 034 | Tech Debt | Remove synchronous fs calls from VS Code stacService | 3 | 2 | 5 | 10 | Low | proposed |
| 001 | Infrastructure | Extract shared MCP utilities into mcp-common package | 3 | 2 | 4 | 9 | Medium | proposed |
| 037 | Tech Debt | Fix test isolation in debrief-config tests | 3 | 1 | 5 | 9 | Low | proposed |
| 053 | Tech Debt | Remove migration-specific tool commands after Legacy Debrief migration complete (keep /tool.spec and /tool.implement for general use) | 2 | 1 | 5 | 8 | Low | proposed |
| 018 | Infrastructure | Add VS Code multi-root workspace configuration | 3 | 1 | 5 | 9 | Low | shipped |
- Feature — New user-facing capability
- Enhancement — Improvement to existing capability
- Bug — Defect in existing functionality (links to GitHub issue)
- Tech Debt — Internal improvement, cleanup, refactoring
- Infrastructure — Build, CI/CD, tooling improvements
- Documentation — Docs, examples, tutorials
- Items without scores are awaiting prioritization
- Ideas-guy and scout add items (status:
proposed) - Prioritizer scores proposed items (V/M/A)
- Ideas-guy reviews scored items → changes status to
approved, parks, or rejects /speckit.start {ID}requires statusapproved- Completed items remain (struck through) for historical reference