chore: commit unstaged workspace changes

This commit is contained in:
2026-02-21 02:32:00 -08:00
parent 1c424b4a0b
commit ab1d5f19fd
16 changed files with 780 additions and 37 deletions

View File

@@ -0,0 +1,52 @@
---
id: TASK-94
title: Fix Kiku duplicate detection for Yomitan-marked duplicates
status: Done
assignee:
- codex-duplicate-kiku-20260221T043006Z-5vkz
created_date: '2026-02-21 04:33'
updated_date: '2026-02-21 01:40'
labels:
- bug
- anki
- kiku
dependencies: []
priority: high
ordinal: 65000
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Kiku field grouping no longer detects duplicate cards in scenarios where the mined card is clearly marked duplicate by Yomitan/N+1 workflow. Restore duplicate detection so duplicate note lookup succeeds for equivalent expression/word cards and Kiku grouping can run.
<!-- SECTION:DESCRIPTION:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [x] #1 Repro case covered by automated regression test in duplicate-detection path.
- [x] #2 Kiku duplicate detection returns duplicate note id for the repro case.
- [x] #3 Targeted tests for duplicate detection pass.
<!-- AC:END -->
## Implementation Notes
<!-- SECTION:NOTES:BEGIN -->
Added regression test `src/anki-integration/duplicate.test.ts` for a cross-field duplicate case where current note uses `Expression` and candidate uses `Word` with same value.
Updated duplicate matching in `src/anki-integration/duplicate.ts` to try alternate field-name aliases (`word` <-> `expression`) when resolving candidate note fields for exact-value verification.
Follow-up fix: duplicate search query now also probes alias fields (`word` <-> `expression`) and merges candidate note ids before exact verification, so duplicates are still found when only the alias field is indexed/populated on existing cards.
Second follow-up fix: duplicate detection now evaluates both source values when current note contains both `Expression` and `Word` (previously only one was used, depending on field-order). Query and exact verification now run against all source duplicate candidates.
Third follow-up fix: if deck-scoped duplicate queries return no results, detection now retries the same source/alias query set collection-wide (no deck filter) before exact verification. This aligns with cases where Yomitan shows duplicates outside the configured mining deck.
Fourth follow-up fix: if field-specific queries miss entirely, detection now falls back to phrase/plain-text queries (deck-scoped then collection-wide) and still requires exact `Expression/Word` value verification before selecting a duplicate note.
Fifth follow-up: added explicit duplicate-search debug logs (query strings, hit counts, candidate counts, exact-match note id) to improve runtime diagnosis in live launcher runs.
Verification:
- `bun run build`
- `node dist/anki-integration/duplicate.test.js`
- `node --test dist/anki-integration.test.js`
<!-- SECTION:NOTES:END -->

View File

@@ -0,0 +1,52 @@
---
id: TASK-96
title: Decouple secondary subtitle lifecycle from visible/invisible overlays
status: To Do
assignee: []
created_date: '2026-02-21 04:41'
updated_date: '2026-02-21 04:41'
labels:
- subtitles
- overlay
- architecture
dependencies: []
priority: high
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Secondary subtitle behavior should not depend on visible/invisible overlay state transitions. Introduce an independent lifecycle so secondary subtitle rendering, visibility mode (`always`/`hover`/`never`), and positioning stay stable even when primary overlays are toggled or rebound.
<!-- SECTION:DESCRIPTION:END -->
## Suggestions
<!-- SECTION:SUGGESTIONS:BEGIN -->
- Isolate secondary subtitle state management from primary overlay window orchestration.
- Route secondary subtitle updates through a dedicated service/controller boundary.
- Keep MPV secondary subtitle property handling independent from overlay visibility toggles.
<!-- SECTION:SUGGESTIONS:END -->
## Action Steps
<!-- SECTION:PLAN:BEGIN -->
1. Inventory existing coupling points between secondary subtitle updates and overlay visibility/bounds services.
2. Introduce explicit secondary subtitle lifecycle state and transitions.
3. Refactor event wiring so visible/invisible overlay toggles do not mutate secondary subtitle state.
4. Validate display modes (`always`/`hover`/`never`) continue to work with independent lifecycle.
5. Add regression tests for overlay toggles, reconnect/restart, and mode-switch behavior.
<!-- SECTION:PLAN:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 Toggling visible or invisible overlays does not alter secondary subtitle lifecycle state.
- [ ] #2 Secondary subtitle display mode behavior remains correct across overlay state transitions.
- [ ] #3 Secondary subtitle behavior survives MPV reconnect/restart without overlay-coupling regressions.
- [ ] #4 Automated tests cover decoupled lifecycle behavior and prevent re-coupling.
<!-- AC:END -->
## Definition of Done
<!-- DOD:BEGIN -->
- [ ] #1 Relevant unit/integration tests pass
- [ ] #2 Documentation/comments updated where lifecycle ownership changed
<!-- DOD:END -->

View File

@@ -0,0 +1,52 @@
---
id: TASK-97
title: Add intro skip playback control
status: To Do
assignee: []
created_date: '2026-02-21 04:41'
updated_date: '2026-02-21 04:41'
labels:
- playback
- ux
dependencies: []
priority: medium
---
## Description
<!-- SECTION:DESCRIPTION:BEGIN -->
Add an intro skip control so users can jump past opening sequences quickly during playback. Start with a reliable manual control (shortcut/action) and clear user feedback after seek.
<!-- SECTION:DESCRIPTION:END -->
## Suggestions
<!-- SECTION:SUGGESTIONS:BEGIN -->
- Add a configurable skip duration (for example 60/75/90 seconds).
- Expose skip intro via keybinding and optional UI action in overlay/help.
- Show transient confirmation (OSD/overlay message) after skip action.
<!-- SECTION:SUGGESTIONS:END -->
## Action Steps
<!-- SECTION:PLAN:BEGIN -->
1. Define config and keybinding surface for intro skip duration and trigger.
2. Implement intro skip command that performs bounded seek in active playback session.
3. Wire command to user trigger path (keyboard + optional on-screen action if present).
4. Emit user feedback after successful skip (current time + skipped duration).
5. Add tests for command dispatch, seek bounds, and config fallback behavior.
<!-- SECTION:PLAN:END -->
## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 User can trigger intro skip during playback with configured shortcut/action.
- [ ] #2 Skip performs bounded seek and never seeks before start or beyond stream duration.
- [ ] #3 Skip duration is configurable with sane default.
- [ ] #4 User receives visible confirmation after skip.
- [ ] #5 Automated tests cover config + seek behavior.
<!-- AC:END -->
## Definition of Done
<!-- DOD:BEGIN -->
- [ ] #1 Playback control tests pass
- [ ] #2 User-facing config/docs updated for intro skip control
<!-- DOD:END -->