mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-03-25 00:11:26 -07:00
docs(backlog): update task tracking notes
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
---
|
||||
id: TASK-143
|
||||
title: Keep character dictionary auto-sync non-blocking during startup
|
||||
status: In Progress
|
||||
status: Done
|
||||
assignee:
|
||||
- codex
|
||||
created_date: '2026-03-09 01:45'
|
||||
updated_date: '2026-03-20 09:22'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- dictionary
|
||||
- startup
|
||||
@@ -18,7 +18,7 @@ references:
|
||||
- >-
|
||||
/home/sudacode/projects/japanese/SubMiner/src/main/runtime/current-media-tokenization-gate.ts
|
||||
priority: high
|
||||
ordinal: 38500
|
||||
ordinal: 144500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- '@codex'
|
||||
created_date: '2026-03-19 17:46'
|
||||
updated_date: '2026-03-19 17:54'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- stats
|
||||
- immersion-tracking
|
||||
@@ -19,6 +19,7 @@ references:
|
||||
- src/core/services/stats-server.ts
|
||||
parent_task_id: TASK-177
|
||||
priority: medium
|
||||
ordinal: 132500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- '@codex'
|
||||
created_date: '2026-03-19 19:38'
|
||||
updated_date: '2026-03-19 19:40'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- stats
|
||||
- immersion-tracking
|
||||
@@ -17,6 +17,7 @@ references:
|
||||
- stats/src/lib/dashboard-data.ts
|
||||
parent_task_id: TASK-177
|
||||
priority: medium
|
||||
ordinal: 130500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- '@codex'
|
||||
created_date: '2026-03-19 20:15'
|
||||
updated_date: '2026-03-19 20:17'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- launcher
|
||||
- stats
|
||||
@@ -19,6 +19,7 @@ references:
|
||||
- src/main/runtime/stats-cli-command.test.ts
|
||||
parent_task_id: TASK-177
|
||||
priority: medium
|
||||
ordinal: 129500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- codex
|
||||
created_date: '2026-03-19 20:31'
|
||||
updated_date: '2026-03-19 20:52'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- bug
|
||||
- stats
|
||||
@@ -17,6 +17,7 @@ references:
|
||||
- >-
|
||||
/Users/sudacode/projects/japanese/SubMiner/stats/src/lib/session-detail.test.tsx
|
||||
parent_task_id: TASK-182
|
||||
ordinal: 128500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- codex
|
||||
created_date: '2026-03-18 00:29'
|
||||
updated_date: '2026-03-18 00:55'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- stats
|
||||
- performance
|
||||
@@ -22,6 +22,7 @@ references:
|
||||
- stats/src/types/stats.ts
|
||||
- stats/src/lib/dashboard-data.ts
|
||||
priority: medium
|
||||
ordinal: 138500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- codex
|
||||
created_date: '2026-03-17 23:15'
|
||||
updated_date: '2026-03-17 23:18'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- pr-review
|
||||
- stats
|
||||
@@ -16,6 +16,7 @@ references:
|
||||
- src/core/services/immersion-tracker-service.ts
|
||||
- src/core/services/immersion-tracker-service.test.ts
|
||||
priority: medium
|
||||
ordinal: 139500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
---
|
||||
id: TASK-192
|
||||
title: 'Assess remaining PR #19 review batch'
|
||||
status: Done
|
||||
assignee:
|
||||
- codex
|
||||
created_date: '2026-03-17 23:24'
|
||||
updated_date: '2026-03-17 23:42'
|
||||
labels:
|
||||
- pr-review
|
||||
- stats
|
||||
- docs
|
||||
milestone: m-1
|
||||
dependencies: []
|
||||
references:
|
||||
- docs/superpowers/plans/2026-03-12-immersion-stats-page.md
|
||||
- src/core/services/immersion-tracker/__tests__/query.test.ts
|
||||
- src/core/services/ipc.ts
|
||||
- src/core/services/stats-server.ts
|
||||
- src/main.ts
|
||||
- src/renderer/handlers/keyboard.ts
|
||||
- stats/src
|
||||
priority: medium
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Validate the remaining PR #19 automated review findings against the current branch, implement only the technically correct fixes, and document which comments are stale, already addressed, or not warranted.
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [x] #1 Each remaining review comment is classified as actionable, already fixed, stale, or not warranted
|
||||
- [x] #2 Confirmed bugs or correctness issues are fixed with focused regression coverage where it fits
|
||||
- [x] #3 Final notes record which comments were intentionally not applied and why
|
||||
<!-- AC:END -->
|
||||
|
||||
## Implementation Plan
|
||||
|
||||
<!-- SECTION:PLAN:BEGIN -->
|
||||
1. Inspect the referenced files in batches and compare each comment against current branch behavior.
|
||||
2. Separate correctness/security regressions from stylistic nitpicks and already-fixed items.
|
||||
3. Add tests first for confirmed behavior bugs where practical, apply the smallest safe fixes, and rerun targeted verification.
|
||||
<!-- SECTION:PLAN:END -->
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
<!-- SECTION:NOTES:BEGIN -->
|
||||
Swept the pasted PR #19 review batch against the current branch.
|
||||
|
||||
Classification:
|
||||
- Already fixed on current branch: `src/core/services/immersion-tracker/__tests__/query.test.ts` cleanup rethrow, `src/core/services/ipc.ts` limit validation, `src/core/services/stats-server.ts` max-limit parsing and CORS removal, `src/main.ts` quit-path TDZ issue, `src/renderer/handlers/keyboard.ts` stats-toggle shortcut ordering/config usage, `stats/src/components/vocabulary/WordList.tsx`, `stats/src/hooks/useSessions.ts`, `stats/src/hooks/useTrends.ts` stale-error reset, `src/core/services/__tests__/stats-server.test.ts` kanji endpoint/readability notes, `src/core/services/stats-window.ts`, `stats/src/App.tsx`, `stats/src/components/layout/TabBar.tsx`, `stats/src/components/overview/QuickStats.tsx`, `stats/src/components/overview/WatchTimeChart.tsx`, `stats/src/components/sessions/SessionDetail.tsx`, `stats/src/components/sessions/SessionRow.tsx`, `stats/src/components/trends/DateRangeSelector.tsx`, `stats/src/components/vocabulary/KanjiBreakdown.tsx`, `stats/src/components/vocabulary/VocabularyTab.tsx`, `stats/src/hooks/useVocabulary.ts`, `stats/src/lib/api-client.ts`, `stats/src/types/stats.ts`.
|
||||
- Stale / obsolete against current architecture: `docs/superpowers/plans/2026-03-12-immersion-stats-page.md` path does not exist on this branch; `stats/src/components/trends/TrendsTab.tsx` / monthly-range comments describe older client-side aggregation code that is no longer present because trends now come from `getTrendsDashboard`.
|
||||
- Not warranted as written: `stats/src/lib/formatters.ts` no longer emits negative `Xd ago`; current code short-circuits future timestamps to `just now`, so the reported bug condition is gone even though the suggested wording differs.
|
||||
- Actionable and fixed now: `src/core/services/ipc.ts` no-tracker `statsGetOverview` fallback omitted required hint fields (`totalLookupCount`, `totalLookupHits`, `newWordsToday`, `newWordsThisWeek`). Added the missing fields in the fallback object and updated IPC tests to assert the full shape.
|
||||
|
||||
Verification:
|
||||
- `bun test src/core/services/ipc.test.ts`
|
||||
- `bun test src/core/services/ipc.test.ts --test-name-pattern "empty stats overview shape without a tracker|validates and clamps stats request limits"`
|
||||
- `bash .agents/skills/subminer-change-verification/scripts/classify_subminer_diff.sh src/core/services/ipc.ts src/core/services/ipc.test.ts`
|
||||
|
||||
Repo verifier note:
|
||||
- `bash .agents/skills/subminer-change-verification/scripts/verify_subminer_change.sh --lane core src/core/services/ipc.ts src/core/services/ipc.test.ts`
|
||||
- That verifier run captured a temporary `bun run typecheck` failure in `src/anki-integration.test.ts` and `src/core/services/__tests__/stats-server.test.ts`, but a fresh rerun after the follow-up validation no longer reproduces those diagnostics.
|
||||
- Fresh verification: `bun run typecheck` passes locally.
|
||||
- artifact dir from the earlier failed verifier snapshot: `.tmp/skill-verification/subminer-verify-20260317-234027-i6QJ3n`
|
||||
<!-- SECTION:NOTES:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
The larger pasted PR #19 review batch was not mostly new work on the current branch. After verifying each item against the live code, almost all were already fixed or stale. One additional item was still actionable: the no-tracker fallback returned by `statsGetOverview` in `src/core/services/ipc.ts` omitted required hint fields, which made the fallback shape inconsistent with the normal overview payload. That fallback is now fixed and covered by IPC tests.
|
||||
|
||||
Count-wise: the earlier open CodeRabbit service comments contributed 2 actionable fixes, and this larger pasted batch contributed 1 additional actionable fix on top of those.
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- codex
|
||||
created_date: '2026-03-20 00:12'
|
||||
updated_date: '2026-03-20 00:14'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- stats
|
||||
- immersion-tracker
|
||||
@@ -17,6 +17,7 @@ references:
|
||||
- src/core/services/immersion-tracker/query.ts
|
||||
- src/core/services/immersion-tracker-service.test.ts
|
||||
priority: medium
|
||||
ordinal: 127500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -4,6 +4,7 @@ title: App-owned YouTube subtitle picker flow
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-18 07:52'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels: []
|
||||
dependencies: []
|
||||
references:
|
||||
@@ -13,6 +14,7 @@ references:
|
||||
documentation:
|
||||
- /home/sudacode/projects/japanese/SubMiner/youtube.md
|
||||
priority: medium
|
||||
ordinal: 137500
|
||||
---
|
||||
|
||||
## Description
|
||||
@@ -4,13 +4,16 @@ title: Fix subtitle prefetch cache-key mismatch and active-cue window
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-18 16:05'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels: []
|
||||
dependencies: []
|
||||
references:
|
||||
- /home/sudacode/projects/japanese/SubMiner/src/core/services/subtitle-processing-controller.ts
|
||||
- /home/sudacode/projects/japanese/SubMiner/src/core/services/subtitle-prefetch.ts
|
||||
documentation: []
|
||||
- >-
|
||||
/home/sudacode/projects/japanese/SubMiner/src/core/services/subtitle-processing-controller.ts
|
||||
- >-
|
||||
/home/sudacode/projects/japanese/SubMiner/src/core/services/subtitle-prefetch.ts
|
||||
priority: high
|
||||
ordinal: 136500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -4,15 +4,19 @@ title: Eliminate per-line plain subtitle flash on prefetch cache hit
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-18 16:28'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels: []
|
||||
dependencies:
|
||||
- TASK-196
|
||||
references:
|
||||
- /home/sudacode/projects/japanese/SubMiner/src/core/services/subtitle-processing-controller.ts
|
||||
- /home/sudacode/projects/japanese/SubMiner/src/main/runtime/mpv-main-event-actions.ts
|
||||
- /home/sudacode/projects/japanese/SubMiner/src/main/runtime/mpv-main-event-main-deps.ts
|
||||
documentation: []
|
||||
- >-
|
||||
/home/sudacode/projects/japanese/SubMiner/src/core/services/subtitle-processing-controller.ts
|
||||
- >-
|
||||
/home/sudacode/projects/japanese/SubMiner/src/main/runtime/mpv-main-event-actions.ts
|
||||
- >-
|
||||
/home/sudacode/projects/japanese/SubMiner/src/main/runtime/mpv-main-event-main-deps.ts
|
||||
priority: high
|
||||
ordinal: 135500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -4,6 +4,7 @@ title: Forward launcher log level into mpv plugin script opts
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-18 21:16'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels: []
|
||||
dependencies:
|
||||
- TASK-198
|
||||
@@ -12,8 +13,8 @@ references:
|
||||
- /home/sudacode/projects/japanese/SubMiner/launcher/mpv.ts
|
||||
- /home/sudacode/projects/japanese/SubMiner/launcher/main.test.ts
|
||||
- /home/sudacode/projects/japanese/SubMiner/launcher/aniskip-metadata.test.ts
|
||||
documentation: []
|
||||
priority: medium
|
||||
ordinal: 134500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- '@codex'
|
||||
created_date: '2026-03-19 07:18'
|
||||
updated_date: '2026-03-19 07:28'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- pr-review
|
||||
- anki-integration
|
||||
@@ -19,6 +19,7 @@ references:
|
||||
- src/anki-integration/runtime.ts
|
||||
- src/anki-integration/known-word-cache.ts
|
||||
priority: medium
|
||||
ordinal: 133500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- '@codex'
|
||||
created_date: '2026-03-19 18:47'
|
||||
updated_date: '2026-03-19 19:01'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- bug
|
||||
- macos
|
||||
@@ -20,6 +20,7 @@ references:
|
||||
- >-
|
||||
/Users/sudacode/projects/japanese/SubMiner/src/core/services/overlay-visibility.test.ts
|
||||
priority: high
|
||||
ordinal: 131500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- '@Codex'
|
||||
created_date: '2026-03-20 02:52'
|
||||
updated_date: '2026-03-20 03:02'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- anki
|
||||
- cache
|
||||
@@ -17,6 +17,7 @@ references:
|
||||
- docs/plans/2026-03-19-known-word-cache-incremental-sync-design.md
|
||||
parent_task_id: TASK-204
|
||||
priority: high
|
||||
ordinal: 124500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- codex
|
||||
created_date: '2026-03-20 02:41'
|
||||
updated_date: '2026-03-20 02:46'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels: []
|
||||
milestone: m-1
|
||||
dependencies: []
|
||||
@@ -14,6 +14,7 @@ references:
|
||||
- stats/src/hooks/useSessions.ts
|
||||
- stats/src/hooks/useTrends.ts
|
||||
priority: medium
|
||||
ordinal: 126500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- '@codex'
|
||||
created_date: '2026-03-20 02:51'
|
||||
updated_date: '2026-03-20 02:59'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- pr-review
|
||||
- launcher
|
||||
@@ -22,6 +22,7 @@ references:
|
||||
- src/anki-integration.ts
|
||||
- src/anki-integration/known-word-cache.ts
|
||||
priority: medium
|
||||
ordinal: 125500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- '@codex'
|
||||
created_date: '2026-03-20 03:03'
|
||||
updated_date: '2026-03-20 03:04'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- pr-review
|
||||
- anki-integration
|
||||
@@ -15,6 +15,7 @@ dependencies: []
|
||||
references:
|
||||
- src/anki-integration/anki-connect-proxy.test.ts
|
||||
priority: medium
|
||||
ordinal: 123500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- '@codex'
|
||||
created_date: '2026-03-20 03:37'
|
||||
updated_date: '2026-03-20 03:47'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- pr-review
|
||||
- launcher
|
||||
@@ -17,6 +17,7 @@ references:
|
||||
- launcher/mpv.ts
|
||||
- src/anki-integration.ts
|
||||
priority: medium
|
||||
ordinal: 122500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- codex
|
||||
created_date: '2026-03-20 04:06'
|
||||
updated_date: '2026-03-20 04:33'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- bug
|
||||
- tokenizer
|
||||
@@ -18,6 +18,7 @@ references:
|
||||
- >-
|
||||
/Users/sudacode/projects/japanese/SubMiner/src/core/services/tokenizer.test.ts
|
||||
priority: high
|
||||
ordinal: 120500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- '@Codex'
|
||||
created_date: '2026-03-20 04:09'
|
||||
updated_date: '2026-03-20 04:25'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- stats
|
||||
- bug
|
||||
@@ -17,6 +17,7 @@ references:
|
||||
- src/core/services/immersion-tracker/query.ts
|
||||
- src/core/services/immersion-tracker/session.ts
|
||||
- src/core/services/immersion-tracker-service.ts
|
||||
ordinal: 121500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
---
|
||||
id: TASK-211
|
||||
title: Recover anime episode progress from subtitle timing when checkpoints are missing
|
||||
title: >-
|
||||
Recover anime episode progress from subtitle timing when checkpoints are
|
||||
missing
|
||||
status: Done
|
||||
assignee:
|
||||
- '@Codex'
|
||||
created_date: '2026-03-20 10:15'
|
||||
updated_date: '2026-03-20 10:22'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- stats
|
||||
- bug
|
||||
@@ -14,20 +16,26 @@ dependencies: []
|
||||
references:
|
||||
- src/core/services/immersion-tracker/query.ts
|
||||
- src/core/services/immersion-tracker/__tests__/query.test.ts
|
||||
ordinal: 119500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Anime episode progress can still show `0%` for older sessions that have watch-time and subtitle timing but no persisted `ended_media_ms` checkpoint. Recover progress from the latest retained subtitle/event segment end so already-recorded sessions render a useful progress percentage.
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [x] `getAnimeEpisodes` returns the latest known session position even when `ended_media_ms` is null but subtitle/event timing exists.
|
||||
- [x] Existing ended-session metrics and aggregation totals do not regress.
|
||||
- [x] Regression coverage locks the fallback behavior.
|
||||
<!-- AC:BEGIN -->
|
||||
- [x] #1 `getAnimeEpisodes` returns the latest known session position even when `ended_media_ms` is null but subtitle/event timing exists.
|
||||
- [x] #2 Existing ended-session metrics and aggregation totals do not regress.
|
||||
- [x] #3 Regression coverage locks the fallback behavior.
|
||||
<!-- AC:END -->
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
<!-- SECTION:NOTES:BEGIN -->
|
||||
Added a query-side fallback for anime episode progress: when the newest session for a video has no persisted `ended_media_ms`, `getAnimeEpisodes` now uses the latest retained subtitle-line or session-event `segment_end_ms` from that same session. This recovers useful progress for already-recorded sessions that have timing data but predate or missed checkpoint persistence.
|
||||
|
||||
Verification: `bun test src/core/services/immersion-tracker/__tests__/query.test.ts` passed. `bun run typecheck` passed.
|
||||
<!-- SECTION:NOTES:END -->
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
---
|
||||
id: TASK-212
|
||||
title: Fix mac texthooker helper startup blocking mpv launch
|
||||
status: In Progress
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-20 08:27'
|
||||
updated_date: '2026-03-20 08:45'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- bug
|
||||
- macos
|
||||
@@ -15,6 +15,7 @@ references:
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/main.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/plugin/subminer/process.lua
|
||||
priority: high
|
||||
ordinal: 140500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
---
|
||||
id: TASK-213
|
||||
title: Show character dictionary progress during paused startup waits
|
||||
status: In Progress
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-20 08:59'
|
||||
updated_date: '2026-03-20 09:22'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- bug
|
||||
- ux
|
||||
@@ -18,6 +18,7 @@ references:
|
||||
/Users/sudacode/projects/japanese/SubMiner/src/main/runtime/character-dictionary-auto-sync-notifications.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/main.ts
|
||||
priority: medium
|
||||
ordinal: 141500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
---
|
||||
id: TASK-214
|
||||
title: Jump subtitle sidebar directly to resume position on first resolved cue
|
||||
status: In Progress
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-21 11:15'
|
||||
updated_date: '2026-03-21 11:15'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- bug
|
||||
- ux
|
||||
@@ -12,9 +12,12 @@ labels:
|
||||
- subtitles
|
||||
dependencies: []
|
||||
references:
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/renderer/modals/subtitle-sidebar.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/renderer/modals/subtitle-sidebar.test.ts
|
||||
- >-
|
||||
/Users/sudacode/projects/japanese/SubMiner/src/renderer/modals/subtitle-sidebar.ts
|
||||
- >-
|
||||
/Users/sudacode/projects/japanese/SubMiner/src/renderer/modals/subtitle-sidebar.test.ts
|
||||
priority: medium
|
||||
ordinal: 142500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
---
|
||||
id: TASK-215
|
||||
title: Add startup auto-open option for subtitle sidebar
|
||||
status: In Progress
|
||||
status: Done
|
||||
assignee: []
|
||||
created_date: '2026-03-21 11:35'
|
||||
updated_date: '2026-03-21 11:35'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- feature
|
||||
- ux
|
||||
@@ -13,11 +13,15 @@ labels:
|
||||
dependencies: []
|
||||
references:
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/types.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/config/definitions/defaults-subtitle.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/config/resolve/subtitle-domains.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/renderer/modals/subtitle-sidebar.ts
|
||||
- >-
|
||||
/Users/sudacode/projects/japanese/SubMiner/src/config/definitions/defaults-subtitle.ts
|
||||
- >-
|
||||
/Users/sudacode/projects/japanese/SubMiner/src/config/resolve/subtitle-domains.ts
|
||||
- >-
|
||||
/Users/sudacode/projects/japanese/SubMiner/src/renderer/modals/subtitle-sidebar.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/renderer/renderer.ts
|
||||
priority: medium
|
||||
ordinal: 143500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -5,7 +5,7 @@ status: Done
|
||||
assignee:
|
||||
- codex
|
||||
created_date: '2026-03-21 23:16'
|
||||
updated_date: '2026-03-21 23:28'
|
||||
updated_date: '2026-03-23 03:22'
|
||||
labels:
|
||||
- bug
|
||||
- overlay
|
||||
@@ -18,6 +18,7 @@ references:
|
||||
documentation:
|
||||
- docs/workflow/verification.md
|
||||
priority: high
|
||||
ordinal: 118500
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
id: TASK-218
|
||||
title: 'Delete zero-session media from stats library and trends'
|
||||
status: Done
|
||||
assignee:
|
||||
- codex
|
||||
created_date: '2026-03-22 16:20'
|
||||
updated_date: '2026-03-22 21:10'
|
||||
labels:
|
||||
- stats
|
||||
- immersion-tracker
|
||||
priority: medium
|
||||
dependencies: []
|
||||
references:
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/core/services/immersion-tracker/query.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/core/services/immersion-tracker/lifetime.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/core/services/immersion-tracker/maintenance.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/core/services/immersion-tracker/__tests__/query.test.ts
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Deleting the last retained session for a video still left stale lifetime media rows and trend rollups behind, so the stats dashboard could continue showing ghost entries in Library and Trends after all sessions were gone.
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [x] #1 Deleting the final session for a video removes that media from Library queries and detail reads
|
||||
- [x] #2 Deleting the final session for a video removes stale daily/monthly trend rollups for that media
|
||||
- [x] #3 Regression coverage proves zero-session media disappears from affected stats surfaces after deletion
|
||||
<!-- AC:END -->
|
||||
|
||||
## Implementation Plan
|
||||
|
||||
<!-- SECTION:PLAN:BEGIN -->
|
||||
1. Add a failing regression around deleting the only retained session for a video while preexisting lifetime and rollup rows exist.
|
||||
2. Patch the deletion path to rebuild lifetime and rollup state from retained sessions inside the same transaction.
|
||||
3. Run focused immersion-tracker tests plus the repo-native verifier core lane and record results.
|
||||
<!-- SECTION:PLAN:END -->
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
<!-- SECTION:NOTES:BEGIN -->
|
||||
Added a query regression that seeds a finished session plus stale lifetime media/anime rows and daily/monthly rollups, deletes that only session, and asserts Library, Anime detail, and Trends all drop the media immediately.
|
||||
|
||||
Refactored lifetime rebuild logic so it can run inside an existing delete transaction, then reused that helper from `deleteSession`, `deleteSessions`, and `deleteVideo`.
|
||||
|
||||
Added a rollup rebuild helper that clears existing daily/monthly rollups and reconstructs them from retained telemetry inside the current transaction so deleted sessions cannot leave ghost trend points behind.
|
||||
|
||||
Verification passed:
|
||||
- `bun test src/core/services/immersion-tracker/__tests__/query.test.ts`
|
||||
- `bun test src/core/services/immersion-tracker-service.test.ts`
|
||||
- `bash .agents/skills/subminer-change-verification/scripts/classify_subminer_diff.sh src/core/services/immersion-tracker/query.ts src/core/services/immersion-tracker/lifetime.ts src/core/services/immersion-tracker/maintenance.ts src/core/services/immersion-tracker/__tests__/query.test.ts`
|
||||
- `bash .agents/skills/subminer-change-verification/scripts/verify_subminer_change.sh --lane core src/core/services/immersion-tracker/query.ts src/core/services/immersion-tracker/lifetime.ts src/core/services/immersion-tracker/maintenance.ts src/core/services/immersion-tracker/__tests__/query.test.ts`
|
||||
|
||||
Verifier artifact dir: `.tmp/skill-verification/subminer-verify-20260322-210718-n6sGL8`
|
||||
<!-- SECTION:NOTES:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
Delete paths now rebuild lifetime summaries and trend rollups after removing sessions, so when the last session for a video disappears the stats database also drops that media from Library, related detail reads, and chart data. Added a regression proving a video with only stale lifetime/rollup rows vanishes after its final session is deleted, and verified the change with focused immersion-tracker tests plus the SubMiner core verification lane.
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
id: TASK-219
|
||||
title: 'Restore streamed video progress in anime episodes'
|
||||
status: In Progress
|
||||
assignee:
|
||||
- codex
|
||||
created_date: '2026-03-22 21:25'
|
||||
updated_date: '2026-03-22 21:25'
|
||||
labels:
|
||||
- stats
|
||||
- immersion-tracker
|
||||
- youtube
|
||||
priority: medium
|
||||
dependencies: []
|
||||
references:
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/core/services/immersion-tracker/query.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/core/services/immersion-tracker-service.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/core/services/immersion-tracker/__tests__/query.test.ts
|
||||
- /Users/sudacode/projects/japanese/SubMiner/src/core/services/immersion-tracker-service.test.ts
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Episode progress for streamed media can stay at `0%` because some remote sessions persist `ended_media_ms = 0` even when subtitle timing and watch activity clearly advanced, and the anime episode query currently treats `0` as a valid progress checkpoint.
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [ ] #1 Anime episode progress ignores zero-valued session checkpoints and falls back to subtitle/event timing
|
||||
- [ ] #2 New streamed sessions persist meaningful progress even when playback-position updates are missing or sparse
|
||||
- [ ] #3 Regression tests cover the zero-checkpoint remote-session case
|
||||
<!-- AC:END -->
|
||||
@@ -0,0 +1,66 @@
|
||||
---
|
||||
id: TASK-220
|
||||
title: Restore YouTube overlay mpv keybindings after picker routing
|
||||
status: Done
|
||||
assignee:
|
||||
- codex
|
||||
created_date: '2026-03-22 00:00'
|
||||
updated_date: '2026-03-22 23:49'
|
||||
labels:
|
||||
- bug
|
||||
- overlay
|
||||
- youtube
|
||||
- keyboard
|
||||
dependencies: []
|
||||
references:
|
||||
- src/renderer/handlers/keyboard.ts
|
||||
- src/renderer/modals/youtube-track-picker.ts
|
||||
- src/renderer/handlers/keyboard.test.ts
|
||||
- src/renderer/modals/youtube-track-picker.test.ts
|
||||
documentation:
|
||||
- docs/workflow/verification.md
|
||||
priority: high
|
||||
ordinal: 118800
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- SECTION:DESCRIPTION:BEGIN -->
|
||||
Regression: after adding the YouTube subtitle picker modal path, visible-overlay keydown handling can stop before reaching the shared mpv keybinding dispatch path. Result: default overlay mpv bindings like `Space` pause/play and `q` quit stop working while the overlay owns focus during YouTube playback.
|
||||
<!-- SECTION:DESCRIPTION:END -->
|
||||
|
||||
## Acceptance Criteria
|
||||
<!-- AC:BEGIN -->
|
||||
- [x] #1 Unhandled keys while the YouTube track picker state is active still fall through to the shared overlay mpv keybinding dispatcher.
|
||||
- [x] #2 The YouTube picker continues to consume `Enter` and `Escape` for its own actions.
|
||||
- [x] #3 Renderer regression tests cover both the picker modal key contract and the shared keyboard dispatch fallback.
|
||||
<!-- AC:END -->
|
||||
|
||||
## Implementation Plan
|
||||
|
||||
<!-- SECTION:PLAN:BEGIN -->
|
||||
1. Add a failing renderer keyboard regression test covering YouTube picker state plus shared mpv keybinding fallback.
|
||||
2. Update the global keyboard handler to return early only when the YouTube picker actually handles the key event.
|
||||
3. Update the picker modal handler to return false for unhandled keys while preserving `Enter`/`Escape`.
|
||||
4. Run the cheap renderer verification lane and record results.
|
||||
<!-- SECTION:PLAN:END -->
|
||||
|
||||
## Implementation Notes
|
||||
|
||||
<!-- SECTION:NOTES:BEGIN -->
|
||||
Fixed the regression by making the global renderer keyboard handler stop early for the YouTube picker only when the picker actually consumes the key. The picker modal now returns `false` for unrelated keys, so shared overlay mpv bindings like `Space` and `KeyQ` still dispatch while the visible overlay has focus.
|
||||
|
||||
Added regression coverage in the keyboard handler suite for mpv keybinding fallback during YouTube picker state, plus a picker-modal contract test that keeps `Escape` handled but leaves unrelated keys unclaimed.
|
||||
|
||||
Verification:
|
||||
- `bun test src/renderer/handlers/keyboard.test.ts src/renderer/modals/youtube-track-picker.test.ts`
|
||||
- `bash .agents/skills/subminer-change-verification/scripts/classify_subminer_diff.sh src/renderer/handlers/keyboard.ts src/renderer/handlers/keyboard.test.ts src/renderer/modals/youtube-track-picker.ts src/renderer/modals/youtube-track-picker.test.ts`
|
||||
- `bash .agents/skills/subminer-change-verification/scripts/verify_subminer_change.sh --lane core src/renderer/handlers/keyboard.ts src/renderer/handlers/keyboard.test.ts src/renderer/modals/youtube-track-picker.ts src/renderer/modals/youtube-track-picker.test.ts`
|
||||
- verifier artifact: `.tmp/skill-verification/subminer-verify-20260322-234831-b2m6nJ`
|
||||
<!-- SECTION:NOTES:END -->
|
||||
|
||||
## Final Summary
|
||||
|
||||
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
|
||||
Restored YouTube-session overlay mpv keybindings by removing an unconditional early return added to the renderer keyboard path for the YouTube subtitle picker modal. Unhandled keys now fall through to the shared mpv keybinding dispatcher, while handled picker keys (`Enter`, `Escape`) still stay local to the picker. Added renderer regression tests for both the keyboard fallback path and the picker modal key-consumption contract.
|
||||
<!-- SECTION:FINAL_SUMMARY:END -->
|
||||
Reference in New Issue
Block a user