chore(backlog): maintain task backlog and add changelog fragments

- Move completed tasks (85, 117, 118, 155) to backlog/completed/
- Delete superseded task files (166 verification, 172 drilldown)
- Add stats dashboard milestone m-1
- Add new tasks (190, 194)
- Update task metadata across remaining backlog items
- Add changelog fragments for stats, mpv args, and subtitle filtering
This commit is contained in:
2026-03-18 02:25:07 -07:00
parent 1cb129b0b7
commit 48f10dbb03
53 changed files with 224 additions and 217 deletions

View File

@@ -0,0 +1,8 @@
---
id: m-1
title: "Stats Dashboard"
---
## Description
Milestone: Stats Dashboard

View File

@@ -4,6 +4,7 @@ title: Add Jellyfin remote-session subtitle streaming to texthooker
status: To Do
assignee: []
created_date: '2026-03-08 03:46'
updated_date: '2026-03-18 05:27'
labels:
- jellyfin
- texthooker
@@ -19,20 +20,17 @@ references:
documentation:
- 'https://api.jellyfin.org/'
priority: medium
ordinal: 1000
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Allow SubMiner to follow subtitles from a separate Jellyfin client session, such as a TV app, without requiring local mpv playback. The feature should fetch the active subtitle stream from Jellyfin, map the remote playback position to subtitle cues, and feed the existing subtitle tokenization plus annotated texthooker websocket pipeline so texthooker-only mode can be used while watching on another device.
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 User can target a remote Jellyfin session and stream its current subtitle cue into SubMiner's existing subtitle-processing pipeline without launching local Jellyfin playback in mpv.
- [ ] #2 Texthooker-only mode can display subtitle updates from the tracked remote Jellyfin session through the existing annotation websocket feed.
- [ ] #3 Remote session changes are handled safely: item changes, subtitle-track changes, pause/seek/stop, and session disconnects clear or refresh subtitle state without crashing.

View File

@@ -4,6 +4,7 @@ title: Add native AI API key secret storage
status: To Do
assignee: []
created_date: '2026-03-08 07:25'
updated_date: '2026-03-18 05:27'
labels:
- ai
- config
@@ -17,20 +18,17 @@ references:
/Users/sudacode/projects/japanese/SubMiner/src/core/services/jellyfin-token-store.ts
- /Users/sudacode/projects/japanese/SubMiner/src/main.ts
priority: medium
ordinal: 2000
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Store the shared AI provider API key using the app's native secret-storage pattern so users do not need to keep the OpenRouter key in config files or shell commands.
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 Users can configure the shared AI provider without storing the API key in config.jsonc.
- [ ] #2 The app persists and reloads the shared AI API key using encrypted native secret storage when available.
- [ ] #3 Behavior is defined for existing ai.apiKey and ai.apiKeyCommand configs, including compatibility during migration.

View File

@@ -7,14 +7,14 @@ status: Done
assignee:
- codex
created_date: '2026-03-09 00:00'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- enhancement
- overlay
- mpv
- aniskip
dependencies: []
ordinal: 42500
ordinal: 43500
---
## Description

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- codex
created_date: '2026-03-08 18:24'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- bug
- macos
@@ -19,7 +19,7 @@ references:
- >-
/Users/sudacode/projects/japanese/SubMiner/scripts/get-mpv-window-macos.swift
priority: high
ordinal: 52500
ordinal: 53500
---
## Description

View File

@@ -1,11 +1,11 @@
---
id: TASK-133
title: Improve AniList character dictionary parity with upstream guide
status: In Progress
status: To Do
assignee:
- OpenCode
created_date: '2026-03-08 21:06'
updated_date: '2026-03-10 06:18'
updated_date: '2026-03-18 05:27'
labels:
- dictionary
- anilist
@@ -24,6 +24,7 @@ documentation:
- >-
/Users/sudacode/projects/japanese/SubMiner/docs/plans/2026-03-08-anilist-character-dictionary-parity.md
priority: high
ordinal: 3000
---
## Description

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- codex
created_date: '2026-03-09 00:00'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- ci
- release
@@ -18,7 +18,7 @@ references:
- src/release-workflow.test.ts
- 'https://github.com/ksyasuda/SubMiner/actions/runs/22836585479'
priority: high
ordinal: 51500
ordinal: 52500
---
## Description

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- codex
created_date: '2026-03-08 20:24'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- release
- patch
@@ -16,7 +16,7 @@ references:
- CHANGELOG.md
- release/release-notes.md
priority: high
ordinal: 50500
ordinal: 51500
---
## Description

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- codex
created_date: '2026-03-08 20:41'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- ci
- release
@@ -18,7 +18,7 @@ references:
- build/signpath-windows-artifact-config.xml
- src/release-workflow.test.ts
priority: high
ordinal: 48500
ordinal: 49500
---
## Description

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- codex
created_date: '2026-03-08 20:44'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- release
- patch
@@ -16,7 +16,7 @@ references:
- CHANGELOG.md
- release/release-notes.md
priority: high
ordinal: 49500
ordinal: 50500
---
## Description

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- codex
created_date: '2026-03-09 00:00'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- release
- windows
@@ -15,7 +15,7 @@ references:
- package.json
- src/release-workflow.test.ts
priority: high
ordinal: 44500
ordinal: 45500
---
## Description

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- codex
created_date: '2026-03-09 00:00'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- release
- patch
@@ -16,7 +16,7 @@ references:
- CHANGELOG.md
- release/release-notes.md
priority: high
ordinal: 45500
ordinal: 46500
---
## Description

View File

@@ -4,7 +4,7 @@ title: Fix guessit title parsing for character dictionary sync
status: Done
assignee: []
created_date: '2026-03-09 00:00'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- dictionary
- anilist
@@ -17,7 +17,7 @@ references:
- >-
/home/sudacode/projects/japanese/SubMiner/src/core/services/anilist/anilist-updater.test.ts
priority: high
ordinal: 43500
ordinal: 44500
---
## Description

View File

@@ -4,7 +4,7 @@ title: Refresh current subtitle after character dictionary sync completes
status: Done
assignee: []
created_date: '2026-03-09 00:00'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- dictionary
- overlay
@@ -15,7 +15,7 @@ references:
/home/sudacode/projects/japanese/SubMiner/src/main/runtime/character-dictionary-auto-sync.ts
- /home/sudacode/projects/japanese/SubMiner/src/main.ts
priority: high
ordinal: 41500
ordinal: 42500
---
## Description

View File

@@ -4,7 +4,7 @@ title: Show character dictionary auto-sync progress on OSD
status: Done
assignee: []
created_date: '2026-03-09 01:10'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- dictionary
- overlay
@@ -17,7 +17,7 @@ references:
/home/sudacode/projects/japanese/SubMiner/src/main/runtime/character-dictionary-auto-sync-notifications.ts
- /home/sudacode/projects/japanese/SubMiner/src/main.ts
priority: medium
ordinal: 40500
ordinal: 41500
---
## Description

View File

@@ -4,7 +4,7 @@ title: Keep character dictionary auto-sync non-blocking during startup
status: Done
assignee: []
created_date: '2026-03-09 01:45'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- dictionary
- startup
@@ -17,7 +17,7 @@ references:
- >-
/home/sudacode/projects/japanese/SubMiner/src/main/runtime/current-media-tokenization-gate.ts
priority: high
ordinal: 37500
ordinal: 38500
---
## Description

View File

@@ -6,7 +6,7 @@ title: >-
status: Done
assignee: []
created_date: '2026-03-09 10:40'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- startup
- overlay
@@ -21,7 +21,7 @@ references:
- >-
/home/sudacode/projects/japanese/SubMiner/src/main/runtime/character-dictionary-auto-sync-notifications.ts
priority: medium
ordinal: 36500
ordinal: 37500
---
## Description

View File

@@ -5,14 +5,14 @@ status: Done
assignee:
- codex
created_date: '2026-03-09 00:00'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- bug
- overlay
- aniskip
- linux
dependencies: []
ordinal: 46500
ordinal: 47500
---
## Description

View File

@@ -5,14 +5,14 @@ status: Done
assignee:
- codex
created_date: '2026-03-09 00:00'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- windows
- plugin
- regression
dependencies: []
priority: medium
ordinal: 47500
ordinal: 48500
---
## Description

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- codex
created_date: '2026-03-09 01:10'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- release
- patch
@@ -25,7 +25,7 @@ references:
- scripts/build-changelog.test.ts
- docs/RELEASING.md
priority: high
ordinal: 38500
ordinal: 39500
---
## Description

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- codex
created_date: '2026-03-09 01:11'
updated_date: '2026-03-16 05:13'
updated_date: '2026-03-18 05:28'
labels:
- tooling
- formatting
@@ -20,7 +20,7 @@ references:
- scripts/build-win-unsigned.mjs
- src
priority: medium
ordinal: 39500
ordinal: 40500
---
## Description

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- codex
created_date: '2026-03-11 08:28'
updated_date: '2026-03-16 06:25'
updated_date: '2026-03-18 05:28'
labels:
- linux
- packaging
@@ -20,6 +20,7 @@ references:
- docs-site/launcher-script.md
- README.md
priority: medium
ordinal: 116500
---
## Description

View File

@@ -1,65 +0,0 @@
---
id: TASK-166
title: Harden SubMiner change verification for authoritative agentic runtime checks
status: Done
assignee: []
created_date: '2026-03-13 05:19'
updated_date: '2026-03-16 05:13'
labels:
- testing
- agents
- verification
dependencies: []
references:
- >-
/home/sudacode/projects/japanese/SubMiner/.agents/skills/subminer-change-verification/scripts/verify_subminer_change.sh
- >-
/home/sudacode/projects/japanese/SubMiner/.agents/skills/subminer-change-verification/scripts/classify_subminer_diff.sh
- >-
/home/sudacode/projects/japanese/SubMiner/.agents/skills/subminer-change-verification/SKILL.md
documentation:
- /home/sudacode/projects/japanese/SubMiner/testing-plan.md
- /home/sudacode/projects/japanese/SubMiner/docs-site/development.md
ordinal: 22500
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Tighten the SubMiner change-verification classifier and verifier so the implementation matches the approved agentic verification plan: authoritative runtime verification must fail closed when unavailable, lane naming should use real-runtime semantics, session and artifact identities must be unique, and the verifier must be safer for parallel agent use.
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [x] #1 The verifier uses `real-runtime` terminology instead of `real-gui` for authoritative runtime verification
- [x] #2 Requested authoritative runtime verification fails closed with a non-green outcome when it cannot run, and unknown lanes do not pass open
- [x] #3 The verifier allocates a unique session identifier and artifact root that does not rely on second-level timestamp uniqueness alone
- [x] #4 The verifier summary/report output includes explicit top-level status and session metadata needed for agent aggregation
- [x] #5 The classifier and verifier better reflect runtime-escalation cases for launcher/plugin/socket/runtime-sensitive changes
- [x] #6 Regression tests cover the new verifier/classifier behavior
<!-- AC:END -->
## Implementation Plan
<!-- SECTION:PLAN:BEGIN -->
1. Add regression tests for classifier/verifier behavior before changing the scripts.
2. Harden `verify_subminer_change.sh` to use `real-runtime` terminology, fail closed for blocked/unknown authoritative verification, and emit unique session metadata in summaries.
3. Update `classify_subminer_diff.sh` and the skill doc to use `real-runtime` escalation language and better flag launcher/plugin/runtime-sensitive paths.
4. Run targeted regression tests plus a focused dry-run verifier check, then record outcomes and blockers in the task.
<!-- SECTION:PLAN:END -->
## Implementation Notes
<!-- SECTION:NOTES:BEGIN -->
Added `scripts/subminer-change-verification.test.ts` to regression-test classifier/verifier behavior around `real-runtime` naming, fail-closed authoritative verification, unknown lanes, and unique session metadata.
Reworked `verify_subminer_change.sh` to normalize `real-gui` to `real-runtime`, emit unique session IDs and richer summary metadata, block authoritative runtime verification when unavailable, and fail closed for unknown lanes.
Updated `classify_subminer_diff.sh` to emit `real-runtime-candidate` for launcher/plugin/runtime-sensitive paths, and updated the active skill doc wording to match the new lane terminology.
<!-- SECTION:NOTES:END -->
## Final Summary
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
Hardened the SubMiner change-verification tooling to match the approved agentic verification plan. The verifier now uses `real-runtime` terminology for authoritative runtime verification, preserves compatibility with the deprecated `real-gui` alias, fails closed for unknown lanes, and returns a blocked non-green outcome when requested authoritative runtime verification cannot run. It now allocates a unique session ID and artifact root by default, writes richer session metadata and top-level status into `summary.json`/`summary.txt` plus `reports/summary.*`, and records path selection mode, blockers, and session-local env roots for agent aggregation. The classifier now emits `real-runtime-candidate` for launcher/plugin/runtime-sensitive paths, and the active skill doc uses the same terminology. Verification ran via `bun test scripts/subminer-change-verification.test.ts`, direct dry-run smoke checks for blocked `real-runtime` and failed unknown-lane execution, and a targeted classifier invocation for launcher/plugin paths.
<!-- SECTION:FINAL_SUMMARY:END -->

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- Codex
created_date: '2026-03-17 18:10'
updated_date: '2026-03-17 18:14'
updated_date: '2026-03-18 05:28'
labels:
- release
- packaging
@@ -16,9 +16,12 @@ references:
- /home/sudacode/projects/japanese/SubMiner/.github/workflows/release.yml
- /home/sudacode/projects/japanese/SubMiner/scripts/update-aur-package.sh
- /home/sudacode/projects/japanese/SubMiner/scripts/update-aur-package.test.ts
- /home/sudacode/projects/japanese/SubMiner/packaging/aur/subminer-bin/PKGBUILD
- /home/sudacode/projects/japanese/SubMiner/packaging/aur/subminer-bin/.SRCINFO
- >-
/home/sudacode/projects/japanese/SubMiner/packaging/aur/subminer-bin/PKGBUILD
- >-
/home/sudacode/projects/japanese/SubMiner/packaging/aur/subminer-bin/.SRCINFO
priority: medium
ordinal: 107500
---
## Description

View File

@@ -11,6 +11,7 @@ labels:
- stats
- database
- anilist
milestone: m-1
dependencies: []
references:
- >-

View File

@@ -1,11 +1,12 @@
---
id: TASK-170
title: 'Fix imm_words POS filtering and add stats cleanup maintenance command'
title: Fix imm_words POS filtering and add stats cleanup maintenance command
status: Done
assignee: []
created_date: '2026-03-13 00:00'
updated_date: '2026-03-14 18:31'
updated_date: '2026-03-18 05:31'
labels: []
milestone: m-1
dependencies: []
priority: high
ordinal: 9010
@@ -14,25 +15,19 @@ ordinal: 9010
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
`imm_words` is currently populated from raw subtitle text instead of tokenized subtitle metadata, so ignored functional/noise tokens leak into stats and no POS metadata is stored. Fix live persistence to follow the existing token annotation exclusion rules and add an on-demand stats cleanup command to remove stale bad vocabulary rows from the stats DB.
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [x] #1 New `imm_words` inserts use tokenized subtitle data, persist POS metadata, and skip tokens excluded by existing POS-based vocabulary ignore rules.
- [x] #2 `subminer stats cleanup` supports `-v` / `--vocab`, defaults to vocab cleanup, and removes stale bad `imm_words` rows on demand.
- [x] #3 Regression coverage exists for persistence filtering, cleanup behavior, and stats cleanup CLI wiring.
<!-- AC:END -->
## Final Summary
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
Fixed `imm_words` persistence so the tracker now consumes tokenized subtitle data, stores POS metadata (`part_of_speech`, `pos1`, `pos2`, `pos3`), preserves distinct surface/lemma fields (`word` vs `headword`) when tokenization provides them, and skips vocabulary rows excluded by the existing POS/noise rules instead of mining raw subtitle fragments. Added `subminer stats cleanup` with default vocab cleanup plus `-v/--vocab`; the cleanup pass now repairs stale `headword`, `reading`, and `part_of_speech` values, attempts best-effort MeCab backfill for legacy rows, and removes rows that still have no usable POS metadata or fail the vocab filters.
Verification:
@@ -41,5 +36,4 @@ Verification:
- `bun test src/core/services/immersion-tracker-service.test.ts src/core/services/immersion-tracker/__tests__/query.test.ts src/core/services/immersion-tracker/storage-session.test.ts launcher/parse-args.test.ts launcher/commands/command-modules.test.ts src/main/runtime/stats-cli-command.test.ts src/main/runtime/mpv-main-event-main-deps.test.ts src/core/services/cli-command.test.ts`
- `bun run docs:test`
- `bun run docs:build`
<!-- SECTION:FINAL_SUMMARY:END -->

View File

@@ -10,6 +10,7 @@ labels:
- immersion
- stats
- database
milestone: m-1
dependencies: []
references:
- >-

View File

@@ -5,20 +5,24 @@ status: Done
assignee:
- '@codex'
created_date: '2026-03-16 10:45'
updated_date: '2026-03-16 23:04'
updated_date: '2026-03-18 05:28'
labels:
- bug
- macos
- overlay
dependencies: []
references:
- /Users/sudacode/projects/japanese/SubMiner/src/core/services/overlay-window.ts
- /Users/sudacode/projects/japanese/SubMiner/src/core/services/overlay-visibility.ts
- /Users/sudacode/projects/japanese/SubMiner/src/core/services/overlay-runtime-init.ts
- /Users/sudacode/projects/japanese/SubMiner/src/window-trackers/macos-tracker.ts
- >-
/Users/sudacode/projects/japanese/SubMiner/src/core/services/overlay-window.ts
- >-
/Users/sudacode/projects/japanese/SubMiner/src/core/services/overlay-visibility.ts
- >-
/Users/sudacode/projects/japanese/SubMiner/src/core/services/overlay-runtime-init.ts
- >-
/Users/sudacode/projects/japanese/SubMiner/src/window-trackers/macos-tracker.ts
- /Users/sudacode/projects/japanese/SubMiner/src/main.ts
priority: high
ordinal: 53000
ordinal: 54500
---
## Description

View File

@@ -1,64 +0,0 @@
---
id: TASK-172
title: Wire immersion occurrence drilldown into stats API and vocabulary drawer
status: Done
assignee:
- codex
created_date: '2026-03-14 12:05'
updated_date: '2026-03-16 05:13'
labels:
- immersion
- stats
- ui
dependencies:
- TASK-171
ordinal: 18500
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Expose the new immersion word/kanji occurrence queries through the stats server and add a right-side Vocabulary drawer that shows recent occurrence rows with paging when a word or kanji is clicked.
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [x] #1 Stats server exposes word and kanji occurrence endpoints with bounded recent-first paging.
- [x] #2 Stats client/types support loading occurrence pages for a selected word or kanji.
- [x] #3 Vocabulary tab opens a right drawer for the selected word/kanji, shows recent occurrences, and supports loading more.
- [x] #4 Focused regression coverage exists for the server endpoint contract, and the stats UI still typechecks/builds.
- [x] #5 Verification covers the cheapest sufficient backend and stats-UI lanes.
<!-- AC:END -->
## Implementation Notes
<!-- SECTION:NOTES:BEGIN -->
2026-03-14: Design approved in-thread. Chosen UX: click a word chip or kanji glyph to open a right-side drawer with recent-first occurrences, initial cap 50, plus “Load more”.
2026-03-14: Implemented `/api/stats/vocabulary/occurrences` and `/api/stats/kanji/occurrences` with `limit` + `offset` paging. The drawer uses direct stats HTTP client calls and keeps existing aggregate vocabulary data flow intact.
2026-03-14: Verification commands run:
- `bun test src/core/services/__tests__/stats-server.test.ts`
- `bun run typecheck`
- `cd stats && bun run build`
- `bun run docs:test`
- `bun run docs:build`
- `cd stats && bunx tsc --noEmit`
- `bash .agents/skills/subminer-change-verification/scripts/verify_subminer_change.sh --lane core src/core/services/stats-server.ts src/core/services/__tests__/stats-server.test.ts`
2026-03-14: Verification results:
- stats server endpoint tests: passed
- root typecheck: passed
- stats UI production build: passed
- docs-site test/build: passed
- `cd stats && bunx tsc --noEmit`: passed after removing stale `hasCoverArt` prop usage in the library stats UI
- verifier result: passed (`typecheck`, `test:fast`)
- verifier artifacts: `.tmp/skill-verification/subminer-verify-20260314-120900-J0VvB0/`
<!-- SECTION:NOTES:END -->
## Final Summary
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
Wired occurrence drilldown into the stats server and Vocabulary tab. Words and kanji now open a right-side drawer that loads recent occurrence rows 50 at a time and supports “Load more”.
Added bounded recent-first occurrence endpoints to the stats HTTP API, extended the stats client/type surface, and made word chips plus kanji glyphs selectable with active-state styling.
Updated the immersion-tracking docs to mention vocabulary occurrence drilldown. Verified with focused stats-server tests, root typecheck, stats UI production build, docs-site test/build, the repo verifier core lane, and a direct `stats` package typecheck after removing the stale `MediaHeader` prop mismatch.
<!-- SECTION:FINAL_SUMMARY:END -->

View File

@@ -8,6 +8,7 @@ updated_date: '2026-03-16 05:13'
labels:
- stats
- ui
milestone: m-1
dependencies: []
priority: low
ordinal: 17500

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- codex
created_date: '2026-03-15 10:18'
updated_date: '2026-03-16 06:46'
updated_date: '2026-03-18 05:28'
labels:
- bug
- tokenizer
@@ -20,6 +20,7 @@ references:
- /Users/sudacode/projects/japanese/SubMiner/scripts/get_frequency.ts
- /Users/sudacode/projects/japanese/SubMiner/scripts/test-yomitan-parser.ts
priority: high
ordinal: 115500
---
## Description

View File

@@ -5,11 +5,12 @@ status: Done
assignee:
- codex
created_date: '2026-03-17 09:15'
updated_date: '2026-03-17 09:41'
updated_date: '2026-03-18 05:28'
labels:
- stats
- immersion-tracking
- yomitan
milestone: m-1
dependencies: []
references:
- vendor/subminer-yomitan/ext/js/app/frontend.js
@@ -23,6 +24,7 @@ references:
documentation:
- docs/plans/2026-03-17-yomitan-lookup-stats-design.md
priority: medium
ordinal: 114500
---
## Description

View File

@@ -5,11 +5,12 @@ status: Done
assignee:
- codex
created_date: '2026-03-17 14:59'
updated_date: '2026-03-17 15:13'
updated_date: '2026-03-18 05:28'
labels:
- pr-review
- immersion-tracker
- stats
milestone: m-1
dependencies: []
references:
- >-
@@ -21,6 +22,7 @@ references:
- >-
/Users/sudacode/projects/japanese/SubMiner/src/core/services/immersion-tracker/__tests__/query.test.ts
priority: medium
ordinal: 113500
---
## Description

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- codex
created_date: '2026-03-17 15:15'
updated_date: '2026-03-17 15:19'
updated_date: '2026-03-18 05:28'
labels:
- sqlite
- immersion-tracking
@@ -15,6 +15,7 @@ documentation:
- >-
/Users/sudacode/projects/japanese/SubMiner/docs/plans/2026-03-17-sqlite-tuning.md
priority: medium
ordinal: 111500
---
## Description

View File

@@ -5,11 +5,12 @@ status: Done
assignee:
- codex
created_date: '2026-03-17 15:16'
updated_date: '2026-03-17 15:18'
updated_date: '2026-03-18 05:28'
labels:
- launcher
- stats
- tests
milestone: m-1
dependencies: []
references:
- >-
@@ -18,6 +19,7 @@ references:
- >-
/Users/sudacode/projects/japanese/SubMiner/launcher/commands/command-modules.test.ts
priority: medium
ordinal: 112500
---
## Description

View File

@@ -5,13 +5,15 @@ status: Done
assignee:
- codex
created_date: '2026-03-17 15:31'
updated_date: '2026-03-17 15:55'
updated_date: '2026-03-18 05:28'
labels:
- cli
- launcher
- stats
milestone: m-1
dependencies: []
priority: medium
ordinal: 110500
---
## Description

View File

@@ -5,11 +5,12 @@ status: Done
assignee:
- '@codex'
created_date: '2026-03-18 01:41'
updated_date: '2026-03-18 01:45'
updated_date: '2026-03-18 05:28'
labels:
- bug
- stats
- ui
milestone: m-1
dependencies: []
references:
- >-
@@ -19,6 +20,7 @@ references:
- >-
/Users/sudacode/projects/japanese/SubMiner/stats/src/lib/media-session-list.test.tsx
parent_task_id: TASK-182
ordinal: 101500
---
## Description

View File

@@ -5,7 +5,7 @@ status: Done
assignee:
- Codex
created_date: '2026-03-17 19:28'
updated_date: '2026-03-17 19:31'
updated_date: '2026-03-18 05:28'
labels:
- stabilization
- ci
@@ -14,6 +14,7 @@ references:
- package.json
- docs/workflow/verification.md
priority: medium
ordinal: 106500
---
## Description

View File

@@ -5,11 +5,12 @@ status: Done
assignee:
- codex
created_date: '2026-03-17 22:58'
updated_date: '2026-03-17 23:00'
updated_date: '2026-03-18 05:28'
labels:
- bug
- stats
- ui
milestone: m-1
dependencies: []
references:
- >-
@@ -18,6 +19,7 @@ references:
- >-
/Users/sudacode/projects/japanese/SubMiner/src/core/services/immersion-tracker/query.ts
priority: medium
ordinal: 104500
---
## Description

View File

@@ -5,10 +5,11 @@ status: Done
assignee:
- codex
created_date: '2026-03-17 23:19'
updated_date: '2026-03-17 23:29'
updated_date: '2026-03-18 05:28'
labels:
- stats
- ui
milestone: m-1
dependencies: []
references:
- /Users/sudacode/projects/japanese/SubMiner/stats/src/App.tsx
@@ -21,6 +22,7 @@ references:
- >-
/Users/sudacode/projects/japanese/SubMiner/stats/src/components/library/MediaDetailView.tsx
priority: medium
ordinal: 103500
---
## Description

View File

@@ -5,10 +5,11 @@ status: Done
assignee:
- codex
created_date: '2026-03-17 23:42'
updated_date: '2026-03-17 23:57'
updated_date: '2026-03-18 05:28'
labels:
- stats
- ui
milestone: m-1
dependencies: []
references:
- >-
@@ -31,6 +32,7 @@ documentation:
- >-
/Users/sudacode/projects/japanese/SubMiner/docs/plans/2026-03-17-episode-detail-session-accordion.md
priority: medium
ordinal: 102500
---
## Description

View File

@@ -1,14 +1,15 @@
---
id: TASK-187.1
title: Auto-expand targeted session when opening media detail
status: In Progress
status: Done
assignee:
- codex
created_date: '2026-03-18 01:32'
updated_date: '2026-03-18 01:36'
updated_date: '2026-03-18 05:28'
labels:
- stats
- ui
milestone: m-1
dependencies: []
references:
- stats/src/lib/stats-navigation.ts
@@ -19,6 +20,7 @@ references:
- stats/src/lib/stats-navigation.test.ts
parent_task_id: TASK-187
priority: medium
ordinal: 117500
---
## Description
@@ -29,11 +31,11 @@ When a navigation path opens episode/media detail with a known session ID, the m
## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 Media detail navigation state can carry an optional target session ID alongside the selected video.
- [ ] #2 Any navigation path that opens media detail with a known session ID causes that session row to auto-expand when the episode history loads.
- [ ] #3 Session-tab fallback for orphan sessions without a video still behaves as it does now.
- [ ] #4 Media detail auto-expansion clears or stabilizes its one-shot navigation state so normal manual expand/collapse behavior still works after landing.
- [ ] #5 Relevant navigation/component tests cover the targeted media-detail auto-expand behavior.
- [x] #1 Media detail navigation state can carry an optional target session ID alongside the selected video.
- [x] #2 Any navigation path that opens media detail with a known session ID causes that session row to auto-expand when the episode history loads.
- [x] #3 Session-tab fallback for orphan sessions without a video still behaves as it does now.
- [x] #4 Media detail auto-expansion clears or stabilizes its one-shot navigation state so normal manual expand/collapse behavior still works after landing.
- [x] #5 Relevant navigation/component tests cover the targeted media-detail auto-expand behavior.
<!-- AC:END -->
## Implementation Plan

View File

@@ -1,7 +1,7 @@
---
id: TASK-188
title: Refactor stats chart data pipeline to use backend-aggregated series
status: In Progress
status: Done
assignee:
- codex
created_date: '2026-03-18 00:29'
@@ -10,6 +10,7 @@ labels:
- stats
- performance
- refactor
milestone: m-1
dependencies: []
references:
- src/core/services/immersion-tracker/query.ts
@@ -31,12 +32,12 @@ Reduce long-term dashboard performance debt by moving chart aggregation out of t
## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 Stats API exposes chart-oriented aggregated trend data needed by the trends dashboard without requiring raw session lists for those charts.
- [ ] #2 The trends dashboard consumes the new aggregated API responses and no longer rebuilds its main chart datasets from raw sessions in the render path.
- [ ] #3 Time-range and grouping behavior remain correct for recent and all-time views, with explicit handling that keeps older history performant.
- [ ] #4 Existing overview and anime detail charts continue to behave correctly, or are migrated to the shared aggregation path where it reduces debt.
- [ ] #5 Tests cover backend aggregation/query behavior and frontend consumption of the new response shapes.
- [ ] #6 Internal docs are updated to describe the new stats chart data flow and scaling rationale.
- [x] #1 Stats API exposes chart-oriented aggregated trend data needed by the trends dashboard without requiring raw session lists for those charts.
- [x] #2 The trends dashboard consumes the new aggregated API responses and no longer rebuilds its main chart datasets from raw sessions in the render path.
- [x] #3 Time-range and grouping behavior remain correct for recent and all-time views, with explicit handling that keeps older history performant.
- [x] #4 Existing overview and anime detail charts continue to behave correctly, or are migrated to the shared aggregation path where it reduces debt.
- [x] #5 Tests cover backend aggregation/query behavior and frontend consumption of the new response shapes.
- [x] #6 Internal docs are updated to describe the new stats chart data flow and scaling rationale.
<!-- AC:END -->
## Implementation Plan

View File

@@ -0,0 +1,54 @@
---
id: TASK-190
title: Add hover popups for session chart events
status: Done
assignee:
- Codex
created_date: '2026-03-17 22:20'
updated_date: '2026-03-18 05:28'
labels:
- stats
- ui
- bug
milestone: m-1
dependencies: []
references:
- stats/src/components/sessions/SessionDetail.tsx
- stats/src/lib/session-events.ts
- stats/src/hooks/useSessions.ts
- stats/src/lib/api-client.ts
- docs/plans/2026-03-17-session-event-hover-popups-design.md
priority: medium
ordinal: 105500
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Add hover/focus popups to session chart event markers so pauses, seeks, lookups, and card-mine events explain themselves inline. Card-mine events should lazy-load available Anki note info and present it in a richer popup with browse affordances.
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [x] #1 Hovering or focusing a session-chart marker opens an event-specific popup.
- [x] #2 Pause, seek, and lookup popups show concise event copy derived from marker metadata.
- [x] #3 Card-mine popups lazily fetch and cache Anki note info by note id.
- [x] #4 Card-mine popups show a formatted fallback when note info is missing or still loading.
- [x] #5 Regression tests cover event payload shaping and popup rendering behavior.
<!-- AC:END -->
## Implementation Plan
<!-- SECTION:PLAN:BEGIN -->
1. Add failing tests for event metadata shaping and popup content selection.
2. Extend session-event shaping to parse payload JSON into typed marker metadata.
3. Add lazy note-info fetch/cache state for card-mine markers.
4. Render interactive marker overlay + custom popup in the session detail chart.
5. Run targeted stats/core verification and update this task with the result.
<!-- SECTION:PLAN:END -->
## Outcome
<!-- SECTION:OUTCOME:BEGIN -->
Completed. Session-chart event markers now open event-specific hover/focus popups, including lazy-loaded Anki note info for card-mine events with browse affordances. Verification passed via targeted stats tests, `bun run typecheck`, and the core verification lane in `.tmp/skill-verification/subminer-verify-20260317-222545-CQzyqK`.
<!-- SECTION:OUTCOME:END -->

View File

@@ -0,0 +1,34 @@
---
id: TASK-194
title: Redesign YouTube subtitle acquisition around download-first track selection
status: To Do
assignee: []
created_date: '2026-03-18 07:52'
labels: []
dependencies: []
references:
- /home/sudacode/projects/japanese/SubMiner/launcher/youtube/orchestrator.ts
- /home/sudacode/projects/japanese/SubMiner/launcher/youtube/manual-subs.ts
- /home/sudacode/projects/japanese/SubMiner/src/core/services/tokenizer.ts
documentation:
- /home/sudacode/projects/japanese/SubMiner/youtube.md
priority: medium
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Replace the current YouTube subtitle-generation-first flow with a download-first flow that enumerates available YouTube subtitle tracks, prompts for primary and secondary track selection before playback, downloads selected tracks into external subtitle files for mpv, and preserves generation as an explicit mode and as fallback behavior in auto mode. Keep the existing SubMiner tokenization and annotation pipeline as the downstream consumer of downloaded subtitle files.
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 Launcher and config expose YouTube subtitle acquisition modes `download`, `generate`, and `auto`, with `download` as the default for launcher YouTube playback.
- [ ] #2 YouTube playback enumerates available subtitle tracks before mpv launch and presents a selection UI that supports primary and secondary subtitle choices.
- [ ] #3 Selected YouTube subtitle tracks are downloaded to external subtitle files and loaded into mpv before playback starts when download mode succeeds.
- [ ] #4 `auto` mode attempts download-first for the selected tracks and falls back to generation only when required tracks cannot be downloaded or download fails.
- [ ] #5 `generate` mode preserves the existing whisper/AI generation path as an explicit opt-in behavior.
- [ ] #6 Downloaded YouTube subtitle files integrate with the existing SubMiner subtitle/tokenization/annotation pipeline without regressing current overlay behavior.
- [ ] #7 Tests cover mode selection, subtitle-track enumeration/selection flow, download-first success path, and fallback behavior for auto mode.
- [ ] #8 User-facing config and launcher docs are updated to describe the new modes and default behavior.
<!-- AC:END -->

View File

@@ -0,0 +1,4 @@
type: fixed
area: stats
- Restored the cross-anime word table behavior in stats vocabulary surfaces so shared vocabulary entries no longer disappear or merge incorrectly across related media.

View File

@@ -0,0 +1,4 @@
type: fixed
area: stats
- Load full session timelines by default in stats session detail views so long sessions preserve complete telemetry history instead of being truncated by a fixed sample limit.

View File

@@ -0,0 +1,4 @@
type: added
area: launcher
- Added launcher passthrough for `-a/--args` so mpv receives raw extra launch flags (`--fs`, `--ytdl-format`, custom audio/video settings, etc.) from the `subminer` command.

View File

@@ -0,0 +1,4 @@
type: changed
area: overlay
- Excluded interjections and sound-effect tokens from subtitle annotation styling so they no longer inherit misleading lexical highlight treatment while still remaining visible and non-interactive in the subtitle line.