diff --git a/backlog/tasks/task-80 - Strengthen-ipc-contract-typing-and-runtime-payload-validation.md b/backlog/tasks/task-80 - Strengthen-ipc-contract-typing-and-runtime-payload-validation.md index 2f37953..7aa9c03 100644 --- a/backlog/tasks/task-80 - Strengthen-ipc-contract-typing-and-runtime-payload-validation.md +++ b/backlog/tasks/task-80 - Strengthen-ipc-contract-typing-and-runtime-payload-validation.md @@ -1,10 +1,11 @@ --- id: TASK-80 title: Strengthen IPC contract typing and runtime payload validation -status: To Do -assignee: [] +status: In Progress +assignee: + - opencode-task80-ipc-contract created_date: '2026-02-18 11:43' -updated_date: '2026-02-18 11:43' +updated_date: '2026-02-22 00:21' labels: - ipc - type-safety @@ -46,9 +47,28 @@ IPC handlers still rely on many `unknown` payload casts in main process paths. T - [ ] #4 Malformed payloads are handled gracefully and test-covered +## Implementation Plan + + +Plan of record (2026-02-22): +1) Add central typed IPC contract module at `src/shared/ipc/contracts.ts` and migrate `src/core/services/ipc.ts`, `src/core/services/anki-jimaku-ipc.ts`, and `src/preload.ts` from string literals to contract constants/types. +2) Add runtime IPC payload validators at `src/shared/ipc/validators.ts` for externally supplied payloads (runtime option id/direction/value boundary, subsync request shape, overlay modal, subtitle position, and kiku/jimaku payloads where renderer-supplied). +3) Wire validators at IPC boundaries so malformed payloads are handled gracefully (return structured `{ ok: false, error }` for invoke handlers or no-op/log for fire-and-forget channels) and avoid unsafe `as` casts in boundary code. +4) Reduce unsafe casts in runtime IPC wiring (`src/main/dependencies.ts`, `src/main.ts`, IPC composer generics) by narrowing types before domain calls. +5) Add/extend IPC tests for malformed payload behavior (`src/core/services/ipc.test.ts`, `src/core/services/anki-jimaku-ipc.test.ts`), then run `bun run build`, `bun run test:core:src`, and `bun run test:core:dist`. +6) Update `docs/architecture.md` with central IPC contract and boundary-validation conventions; then finalize TASK-80 AC/DoD evidence in Backlog MCP. + + +## Implementation Notes + + +2026-02-22: Started execution session opencode-task80-ipc-contract-20260222T001728Z-obrv. Loading IPC boundary code and preparing implementation plan via writing-plans before any code edits. + +Saved plan document: docs/plans/2026-02-22-task-80-ipc-contract-validation.md. Proceeding with executing-plans implementation flow as requested. + + ## Definition of Done - [ ] #1 IPC-related tests pass - [ ] #2 IPC contract docs updated - diff --git a/backlog/tasks/task-82 - Add-end-to-end-smoke-suite-for-launcher-mpv-ipc-and-overlay-runtime.md b/backlog/tasks/task-82 - Add-end-to-end-smoke-suite-for-launcher-mpv-ipc-and-overlay-runtime.md index 51d2fc3..355b9c7 100644 --- a/backlog/tasks/task-82 - Add-end-to-end-smoke-suite-for-launcher-mpv-ipc-and-overlay-runtime.md +++ b/backlog/tasks/task-82 - Add-end-to-end-smoke-suite-for-launcher-mpv-ipc-and-overlay-runtime.md @@ -1,10 +1,11 @@ --- id: TASK-82 title: Add end-to-end smoke suite for launcher mpv ipc and overlay runtime -status: To Do -assignee: [] +status: In Progress +assignee: + - codex-task82-smoke-20260222T002523Z-3j7u created_date: '2026-02-18 11:43' -updated_date: '2026-02-18 11:43' +updated_date: '2026-02-22 00:27' labels: - testing - e2e @@ -52,9 +53,51 @@ Current coverage is strong at unit/service level but thin on end-to-end behavior - [ ] #4 Smoke suite documented in development/release docs +## Implementation Plan + + +Plan-of-record (2026-02-22, codex-task82-smoke-20260222T002523Z-3j7u) + +Goal +- Add deterministic e2e smoke coverage for launcher -> mpv IPC socket -> app overlay start/stop runtime wiring. +- Run suite in CI + release quality gates with actionable failure artifacts. +- Document command, coverage, and release-checklist linkage. + +Execution slices (parallel where safe) +1) Launcher smoke harness (core implementation) + - Create launcher/smoke.e2e.test.ts with fake mpv + fake app fixtures in temp dir. + - Validate startup path, socket readiness, app --start args/env, and post-run --stop behavior. + - Emit actionable artifact logs under .tmp/launcher-smoke/. + +2) Script + workflow wiring (can run in parallel after command exists) + - package.json: add test:launcher:smoke:src and include in launcher lane. + - .github/workflows/ci.yml: run launcher smoke suite and upload smoke artifacts on failure. + - .github/workflows/release.yml: mirror quality-gate step and failure artifact upload. + +3) Docs wiring (parallel with workflows) + - docs/development.md: command usage + what it validates + artifact path. + - docs/installation.md: release/checklist reference to launcher smoke gate. + +4) Validation + closure + - Run focused lane: bun run test:launcher:smoke:src and bun run test:launcher. + - Run integration lane: bun run test:fast. + - Run dist confidence lane: bun run build && bun run test:smoke:dist (or record unrelated blockers). + - Update TASK-82 AC/DoD checks with exact evidence and final summary. + +Scope guardrails +- No commit/push in this run. +- Keep smoke suite dependency-free (local fakes only). +- If new required scope appears, pause and request user scope decision before expanding AC. + + +## Implementation Notes + + +2026-02-22: Started execution with opencode-task82-smoke-20260222T002150Z-p5bp via writing-plans -> executing-plans workflow. + + ## Definition of Done - [ ] #1 Smoke suite passes on baseline branch - [ ] #2 Release checklist references smoke suite - diff --git a/docs/configuration.md b/docs/configuration.md index 5e52924..52b5b4b 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -1,6 +1,6 @@ # Configuration -Settings are stored in `$XDG_CONFIG_HOME/SubMiner/config.jsonc` (or `~/.config/SubMiner/config.jsonc` when `XDG_CONFIG_HOME` is unset). For backward compatibility, SubMiner also reads existing configs from lowercase `subminer` directories. +Settings are stored in `$XDG_CONFIG_HOME/SubMiner/config.jsonc` (or `~/.config/SubMiner/config.jsonc` when `XDG_CONFIG_HOME` is unset). ## Quick Start @@ -41,7 +41,9 @@ SubMiner.AppImage --generate-config --backup-overwrite - `bun run generate:config-example` regenerates both repository `config.example.jsonc` and docs-served `/config.example.jsonc` from the same centralized defaults. - `make generate-config` builds and runs the same default-config generator via local Electron. -Invalid config values are handled with warn-and-fallback behavior: SubMiner logs the bad key/value and continues with the default for that option. +Malformed config syntax (invalid JSON/JSONC) is startup-blocking: SubMiner shows a clear parse error with the config path and asks you to fix the file and restart. + +For valid JSON/JSONC with invalid option values, SubMiner uses warn-and-fallback behavior: it logs the bad key/value and continues with the default for that option. ### Hot-Reload Behavior @@ -424,10 +426,10 @@ AniList integration is opt-in and disabled by default. Enable it to allow SubMin } ``` -| Option | Values | Description | -| ------------- | --------------- | ----------------------------------------------------------------------------------- | -| `enabled` | `true`, `false` | Enable AniList post-watch progress updates (default: `false`) | -| `accessToken` | string | Optional explicit AniList access token override (default: empty string) | +| Option | Values | Description | +| ------------- | --------------- | ----------------------------------------------------------------------- | +| `enabled` | `true`, `false` | Enable AniList post-watch progress updates (default: `false`) | +| `accessToken` | string | Optional explicit AniList access token override (default: empty string) | When `enabled` is `true` and `accessToken` is empty, SubMiner opens an AniList setup helper window. Keep `enabled` as `false` to disable all AniList setup/update behavior. @@ -477,6 +479,8 @@ Jellyfin integration is optional and disabled by default. When enabled, SubMiner "enabled": true, "serverUrl": "http://127.0.0.1:8096", "username": "", + "accessToken": "", + "userId": "", "remoteControlEnabled": true, "remoteControlAutoConnect": true, "autoAnnounce": false, @@ -489,29 +493,28 @@ Jellyfin integration is optional and disabled by default. When enabled, SubMiner } ``` -| Option | Values | Description | -| -------------------------- | --------------- | ---------------------------------------------------------------------------- | -| `enabled` | `true`, `false` | Enable Jellyfin integration and CLI commands (default: `false`) | -| `serverUrl` | string (URL) | Jellyfin server base URL | -| `username` | string | Default username used by `--jellyfin-login` | -| `deviceId` | string | Client device id sent in auth headers (default: `subminer`) | -| `clientName` | string | Client name sent in auth headers (default: `SubMiner`) | -| `clientVersion` | string | Client version sent in auth headers (default: `0.1.0`) | -| `defaultLibraryId` | string | Default library id for `--jellyfin-items` when CLI value is omitted | -| `remoteControlEnabled` | `true`, `false` | Enable Jellyfin cast/remote-control session support | -| `remoteControlAutoConnect` | `true`, `false` | Auto-connect Jellyfin remote session on app startup | -| `autoAnnounce` | `true`, `false` | Auto-run cast-target visibility announce check on connect (default: `false`) | -| `remoteControlDeviceName` | string | Device name shown in Jellyfin cast/device lists | -| `pullPictures` | `true`, `false` | Enable poster/icon fetching for launcher Jellyfin pickers | -| `iconCacheDir` | string | Cache directory for launcher-fetched Jellyfin poster icons | -| `directPlayPreferred` | `true`, `false` | Prefer direct stream URLs before transcoding | -| `directPlayContainers` | string[] | Container allowlist for direct play decisions | -| `transcodeVideoCodec` | string | Preferred transcode video codec fallback (default: `h264`) | +| Option | Values | Description | +| -------------------------- | --------------- | --------------------------------------------------------------------------------------- | +| `enabled` | `true`, `false` | Enable Jellyfin integration and CLI commands (default: `false`) | +| `serverUrl` | string (URL) | Jellyfin server base URL | +| `username` | string | Default username used by `--jellyfin-login` | +| `accessToken` | string | Optional explicit Jellyfin access token override; leave empty to use stored local token | +| `userId` | string | Jellyfin user id bound to token/session | +| `deviceId` | string | Client device id sent in auth headers (default: `subminer`) | +| `clientName` | string | Client name sent in auth headers (default: `SubMiner`) | +| `clientVersion` | string | Client version sent in auth headers (default: `0.1.0`) | +| `defaultLibraryId` | string | Default library id for `--jellyfin-items` when CLI value is omitted | +| `remoteControlEnabled` | `true`, `false` | Enable Jellyfin cast/remote-control session support | +| `remoteControlAutoConnect` | `true`, `false` | Auto-connect Jellyfin remote session on app startup | +| `autoAnnounce` | `true`, `false` | Auto-run cast-target visibility announce check on connect (default: `false`) | +| `remoteControlDeviceName` | string | Device name shown in Jellyfin cast/device lists | +| `pullPictures` | `true`, `false` | Enable poster/icon fetching for launcher Jellyfin pickers | +| `iconCacheDir` | string | Cache directory for launcher-fetched Jellyfin poster icons | +| `directPlayPreferred` | `true`, `false` | Prefer direct stream URLs before transcoding | +| `directPlayContainers` | string[] | Container allowlist for direct play decisions | +| `transcodeVideoCodec` | string | Preferred transcode video codec fallback (default: `h264`) | -Jellyfin auth resolution order: - -1. `SUBMINER_JELLYFIN_ACCESS_TOKEN` (and optional `SUBMINER_JELLYFIN_USER_ID`) environment overrides. -2. Locally stored encrypted Jellyfin session payload saved by login/setup (`accessToken` + `userId`). +When `jellyfin.accessToken` is empty, SubMiner uses the locally stored encrypted token saved from Jellyfin login/setup. Jellyfin direct app CLI commands (`SubMiner.AppImage ...`): @@ -725,7 +728,7 @@ See `config.example.jsonc` for detailed configuration options. | `fontStyle` | string | `"normal"` or `"italic"` (default: `"normal"`) | | `backgroundColor` | string | Any CSS color, including `"transparent"` (default: `"rgb(30, 32, 48, 0.88)"`) | | `enableJlpt` | boolean | Enable JLPT level underline styling (`false` by default) | -| `preserveLineBreaks` | boolean | Preserve line breaks in visible overlay subtitle rendering (`false` by default). Enable to mirror mpv line layout. | +| `preserveLineBreaks` | boolean | Preserve line breaks in visible overlay subtitle rendering (`false` by default). Enable to mirror mpv line layout. | | `frequencyDictionary.enabled` | boolean | Enable frequency highlighting from dictionary lookups (`false` by default) | | `frequencyDictionary.sourcePath` | string | Path to a local frequency dictionary root. Leave empty or omit to use the built-in bundled dictionary search paths. | | `frequencyDictionary.topX` | number | Only color tokens whose frequency rank is `<= topX` (`1000` by default) | diff --git a/docs/subagents/INDEX.md b/docs/subagents/INDEX.md index 664d86e..3816cd0 100644 --- a/docs/subagents/INDEX.md +++ b/docs/subagents/INDEX.md @@ -54,3 +54,6 @@ Read first. Keep concise. | `opencode-task77-sliceb-20260221T232507Z-vzk5` | `opencode-task77-sliceb` | `Implement TASK-77 slice B parser-enrichment stage module + focused tests without touching tokenizer.ts` | `done` | `docs/subagents/agents/opencode-task77-sliceb-20260221T232507Z-vzk5.md` | `2026-02-21T23:27:40Z` | | `opencode-task79-runtime-reducers-20260221T235652Z-n4p7` | `opencode-task79-runtime-reducers` | `Execute TASK-79 explicit runtime state transitions/reducers in main via plan-first workflow` | `done` | `docs/subagents/agents/opencode-task79-runtime-reducers-20260221T235652Z-n4p7.md` | `2026-02-22T00:10:51Z` | | `opencode-task79-sliceb-20260222T000253Z-m2r7` | `opencode-task79-sliceb` | `Implement TASK-79 slice B invariants coverage/tests and composition-boundary docs updates without commit` | `done` | `docs/subagents/agents/opencode-task79-sliceb-20260222T000253Z-m2r7.md` | `2026-02-22T00:04:21Z` | +| `opencode-task80-ipc-contract-20260222T001728Z-obrv` | `opencode-task80-ipc-contract` | `Execute TASK-80 IPC contract typing + runtime payload validation end-to-end without commit` | `planning` | `docs/subagents/agents/opencode-task80-ipc-contract-20260222T001728Z-obrv.md` | `2026-02-22T00:17:28Z` | +| `opencode-task82-smoke-20260222T002150Z-p5bp` | `opencode-task82-smoke` | `Execute TASK-82 e2e smoke suite for launcher/mpv/ipc/overlay end-to-end without commit` | `planning` | `docs/subagents/agents/opencode-task82-smoke-20260222T002150Z-p5bp.md` | `2026-02-22T00:21:50Z` | +| `codex-task82-smoke-20260222T002523Z-3j7u` | `codex-task82-smoke` | `Execute TASK-82 e2e smoke suite for launcher/mpv/ipc/overlay end-to-end without commit` | `planning` | `docs/subagents/agents/codex-task82-smoke-20260222T002523Z-3j7u.md` | `2026-02-22T00:25:23Z` | diff --git a/docs/subagents/agents/codex-docs-unpushed-review-20260221T213707Z-lyej.md b/docs/subagents/agents/codex-docs-unpushed-review-20260221T213707Z-lyej.md index 5582e75..b4f4479 100644 --- a/docs/subagents/agents/codex-docs-unpushed-review-20260221T213707Z-lyej.md +++ b/docs/subagents/agents/codex-docs-unpushed-review-20260221T213707Z-lyej.md @@ -2,7 +2,7 @@ - alias: `codex-docs-unpushed-review` - mission: `Review unpushed commits for docs drift; patch docs to reflect current code/state` -- status: `in_progress` +- status: `done` - started_utc: `2026-02-21T21:37:07Z` - heartbeat_minutes: `5` @@ -30,3 +30,7 @@ ## Log - `2026-02-21T21:37:07Z` start; loaded subagent index/collaboration/backlog state; collecting unpushed commit/doc impact matrix. +- `2026-02-21T21:39:15Z` docs drift patched: + - removed stale lowercase-config fallback claim from `docs/configuration.md` + - added `bun run test:launcher` to `docs/development.md` Testing section +- `2026-02-21T21:39:15Z` no further user-facing doc drift found for current unpushed commit set; ready for handoff. diff --git a/docs/subagents/agents/codex-task75-mpv-osd-buffered-20260221T231816Z-yj32.md b/docs/subagents/agents/codex-task75-mpv-osd-buffered-20260221T231816Z-yj32.md new file mode 100644 index 0000000..8207f17 --- /dev/null +++ b/docs/subagents/agents/codex-task75-mpv-osd-buffered-20260221T231816Z-yj32.md @@ -0,0 +1,48 @@ +# Agent: `codex-task75-mpv-osd-buffered-20260221T231816Z-yj32` + +- alias: `codex-task75-mpv-osd-buffered` +- mission: `Execute TASK-75 move MPV OSD log writes to buffered async path end-to-end` +- status: `done` +- branch: `main` +- started_at: `2026-02-21T23:18:16Z` +- heartbeat_minutes: `5` + +## Current Work (newest first) + +- [2026-02-21T23:48:10Z] handoff: Completed TASK-75. Converted MPV OSD log writes to buffered async queue + flush, wired shutdown flush into lifecycle cleanup, updated runtime/lifecycle tests, marked backlog task Done, no commit. +- [2026-02-21T23:48:10Z] test: `bun run test:core:src` PASS (219 pass, 0 fail); focused runtime tests PASS via `bun build ... --outdir /tmp/task75-tests && node --test /tmp/task75-tests/*.js`; `bun run build` blocked by unrelated pre-existing tokenizer logger typing error. +- [2026-02-21T23:24:00Z] progress: Added plan document `docs/plans/2026-02-21-task-75-mpv-osd-buffered-async.md` and recorded plan-of-record in Backlog `TASK-75`. +- [2026-02-21T23:18:16Z] intent: Load Backlog TASK-75 context, produce plan via writing-plans skill, then implement buffered async MPV OSD logging path with shutdown flush tests. + +## Files Touched + +- `docs/subagents/INDEX.md` +- `docs/subagents/collaboration.md` +- `docs/subagents/agents/codex-task75-mpv-osd-buffered-20260221T231816Z-yj32.md` +- `docs/plans/2026-02-21-task-75-mpv-osd-buffered-async.md` +- `src/main/runtime/mpv-osd-log.ts` +- `src/main/runtime/mpv-osd-log-main-deps.ts` +- `src/main/runtime/mpv-osd-runtime-handlers.ts` +- `src/main/runtime/mpv-osd-log.test.ts` +- `src/main/runtime/mpv-osd-log-main-deps.test.ts` +- `src/main/runtime/mpv-osd-runtime-handlers.test.ts` +- `src/main/runtime/app-lifecycle-actions.ts` +- `src/main/runtime/app-lifecycle-main-cleanup.ts` +- `src/main/runtime/app-lifecycle-actions.test.ts` +- `src/main/runtime/app-lifecycle-main-cleanup.test.ts` +- `src/main/runtime/composers/startup-lifecycle-composer.test.ts` +- `src/main.ts` +- `backlog/tasks/task-75 - Move-mpv-OSD-log-writes-to-buffered-async-path.md` + +## Assumptions + +- Backlog MCP task view for `TASK-75` is source of truth for acceptance criteria. +- Existing `bun run build` failure in tokenizer logger typing is unrelated to TASK-75 scope. + +## Open Questions / Blockers + +- None. + +## Next Step + +- Await user review or follow-up tasks. diff --git a/docs/subagents/agents/codex-task82-smoke-20260222T002523Z-3j7u.md b/docs/subagents/agents/codex-task82-smoke-20260222T002523Z-3j7u.md new file mode 100644 index 0000000..549b6a7 --- /dev/null +++ b/docs/subagents/agents/codex-task82-smoke-20260222T002523Z-3j7u.md @@ -0,0 +1,32 @@ +# Agent Session: codex-task82-smoke-20260222T002523Z-3j7u + +- alias: `codex-task82-smoke` +- mission: `Execute TASK-82 e2e smoke suite for launcher/mpv/ipc/overlay end-to-end without commit` +- status: `planning` +- start_utc: `2026-02-22T00:25:23Z` +- last_update_utc: `2026-02-22T00:25:23Z` + +## Intent + +- Load TASK-82 details from Backlog MCP and preserve plan of record in task. +- Use writing-plans skill for concrete execution plan. +- Execute via executing-plans skill with parallel subagents for independent slices. + +## Planned Files + +- `launcher/smoke.e2e.test.ts` +- `package.json` +- `.github/workflows/ci.yml` +- `.github/workflows/release.yml` +- `docs/development.md` +- `docs/installation.md` + +## Assumptions + +- Existing launcher/mpv readiness primitives from TASK-73/TASK-74 are stable. +- Smoke suite should run with local fakes; no real mpv/jellyfin dependency in CI. +- Existing `docs/plans/2026-02-22-task-82-launcher-e2e-smoke-suite.md` is base plan and may be refined. + +## Log + +- `2026-02-22T00:25:23Z` session started; reading backlog + subagent context; entering planning. diff --git a/docs/subagents/agents/opencode-task72-parse-details-20260221T232137Z-b63t.md b/docs/subagents/agents/opencode-task72-parse-details-20260221T232137Z-b63t.md new file mode 100644 index 0000000..24111dc --- /dev/null +++ b/docs/subagents/agents/opencode-task72-parse-details-20260221T232137Z-b63t.md @@ -0,0 +1,36 @@ +# Agent: `opencode-task72-parse-details-20260221T232137Z-b63t` + +- alias: `opencode-task72-parse-details` +- mission: `Implement TASK-72 Task 2 shared parse-error formatter wiring and tests` +- status: `done` +- branch: `main` +- started_at: `2026-02-21T23:21:37Z` +- heartbeat_minutes: `5` + +## Current Work (newest first) + +- [2026-02-21T23:24:12Z] completed: added shared `buildConfigParseErrorDetails` formatter, rewired startup hot-reload parse-failure branch to use it, expanded tests in `config-validation.test.ts` and `runtime/startup-config.test.ts`; verification passed (`bun run build && node --test dist/main/config-validation.test.js dist/main/runtime/startup-config.test.js`). +- [2026-02-21T23:21:37Z] intent: implement Task 2 from `docs/plans/2026-02-21-task-72-strict-startup-config-loading.md`; scope `src/main/config-validation.ts`, `src/main/runtime/startup-config.ts`, and related tests; run required build+node-test command. + +## Files Touched + +- `docs/subagents/INDEX.md` +- `docs/subagents/collaboration.md` +- `docs/subagents/agents/opencode-task72-parse-details-20260221T232137Z-b63t.md` +- `src/main/config-validation.ts` +- `src/main/runtime/startup-config.ts` +- `src/main/config-validation.test.ts` +- `src/main/runtime/startup-config.test.ts` + +## Assumptions + +- Backlog ticket exists: `TASK-72` (`To Do`), and this run is scoped to Task 2 only. +- Existing startup/hot-reload fail handlers remain source of truth for fatal behavior. + +## Open Questions / Blockers + +- None. + +## Next Step + +- Handoff complete for Task 2 scope. diff --git a/docs/subagents/agents/opencode-task72-strict-startup-config-20260221T232155Z-kf0o.md b/docs/subagents/agents/opencode-task72-strict-startup-config-20260221T232155Z-kf0o.md new file mode 100644 index 0000000..81f5fba --- /dev/null +++ b/docs/subagents/agents/opencode-task72-strict-startup-config-20260221T232155Z-kf0o.md @@ -0,0 +1,33 @@ +# Agent: `opencode-task72-strict-startup-config-20260221T232155Z-kf0o` + +- alias: `opencode-task72-strict-startup-config` +- mission: `Implement Task 1 strict startup constructor loading behavior and malformed startup config tests` +- status: `done` +- branch: `main` +- started_at: `2026-02-21T23:21:55Z` +- heartbeat_minutes: `5` + +## Current Work (newest first) + +- [2026-02-21T23:24:32Z] done: constructor now loads startup config via strict parser and throws `ConfigStartupParseError` on malformed config with path + parse reason + restart action; added malformed-startup test; validation command passed. +- [2026-02-21T23:21:55Z] intent: implement Task 1 from `docs/plans/2026-02-21-task-72-strict-startup-config-loading.md`; scope `src/config/service.ts` + `src/config/config.test.ts`; run `bun run build && node --test dist/config/config.test.js`. + +## Files Planned + +- `src/config/service.ts` +- `src/config/config.test.ts` +- `docs/subagents/INDEX.md` +- `docs/subagents/collaboration.md` +- `docs/subagents/agents/opencode-task72-strict-startup-config-20260221T232155Z-kf0o.md` + +## Assumptions + +- Backlog task exists for TASK-72; this run handles plan Task 1 only and no commit. + +## Open Questions / Blockers + +- None. + +## Next Step + +- Handoff complete; ready for TASK-72 Task 2/Task 3 follow-up wiring in main runtime. diff --git a/docs/subagents/agents/opencode-task77-slice-a-20260222T000100Z-j4p2.md b/docs/subagents/agents/opencode-task77-slice-a-20260222T000100Z-j4p2.md new file mode 100644 index 0000000..a56baa5 --- /dev/null +++ b/docs/subagents/agents/opencode-task77-slice-a-20260222T000100Z-j4p2.md @@ -0,0 +1,35 @@ +# Agent: `opencode-task77-slice-a-20260222T000100Z-j4p2` + +- alias: `opencode-task77-slice-a` +- mission: `Implement TASK-77 slice A parser-selection-stage module + focused tests without touching tokenizer.ts` +- status: `done` +- branch: `main` +- started_at: `2026-02-22T00:01:00Z` +- heartbeat_minutes: `5` + +## Current Work (newest first) + +- [2026-02-22T00:01:00Z] intent: extract pure parse-result selection logic from `src/core/services/tokenizer.ts` into new stage module and add focused tests for selection behavior. +- [2026-02-22T00:01:00Z] plan: write failing tests first in `src/core/services/tokenizer/parser-selection-stage.test.ts`, then add module `src/core/services/tokenizer/parser-selection-stage.ts`, then run targeted test command. +- [2026-02-22T00:03:30Z] complete: added pure parser selection stage module + helper exports and focused tests for scanning preference, mecab fallback split, and suspicious-kana tie-break; verified with `bun test src/core/services/tokenizer/parser-selection-stage.test.ts` (3 pass, 0 fail). + +## Files Touched + +- `docs/subagents/agents/opencode-task77-slice-a-20260222T000100Z-j4p2.md` +- `docs/subagents/INDEX.md` +- `docs/subagents/collaboration.md` +- `src/core/services/tokenizer/parser-selection-stage.ts` +- `src/core/services/tokenizer/parser-selection-stage.test.ts` + +## Assumptions + +- TASK-77 already exists in Backlog (`task_search` hit confirmed). +- Slice A should preserve existing behavior from tokenizer parse candidate selection path only. + +## Open Questions / Blockers + +- None. + +## Next Step + +- Handoff complete. diff --git a/docs/subagents/agents/opencode-task77-sliceb-20260221T232507Z-vzk5.md b/docs/subagents/agents/opencode-task77-sliceb-20260221T232507Z-vzk5.md new file mode 100644 index 0000000..65b61fa --- /dev/null +++ b/docs/subagents/agents/opencode-task77-sliceb-20260221T232507Z-vzk5.md @@ -0,0 +1,36 @@ +# Agent: `opencode-task77-sliceb-20260221T232507Z-vzk5` + +- alias: `opencode-task77-sliceb` +- mission: `Implement TASK-77 slice B parser-enrichment stage module + focused tests without touching tokenizer.ts` +- status: `done` +- branch: `main` +- started_at: `2026-02-21T23:25:07Z` +- heartbeat_minutes: `5` + +## Current Work (newest first) + +- [2026-02-21T23:27:40Z] complete: added `parser-enrichment-stage.ts` with extracted pure overlap + surface-sequence enrichment helpers and narrow API `enrichTokensWithMecabPos1`; added focused stage tests; verified `bun test src/core/services/tokenizer/parser-enrichment-stage.test.ts` passes (3/3). +- [2026-02-21T23:26:40Z] tdd: created `parser-enrichment-stage.test.ts` first; confirmed RED due to missing module; then implemented stage module to GREEN. +- [2026-02-21T23:25:07Z] intent: extract pure MeCab pos1 enrichment logic into dedicated stage module, add focused stage tests, run requested target test command. +- [2026-02-21T23:25:07Z] progress: loaded Backlog overview + TASK-77 context; preparing red-first tests for parser enrichment stage. + +## Files Touched + +- `docs/subagents/agents/opencode-task77-sliceb-20260221T232507Z-vzk5.md` +- `docs/subagents/INDEX.md` +- `docs/subagents/collaboration.md` +- `src/core/services/tokenizer/parser-enrichment-stage.ts` +- `src/core/services/tokenizer/parser-enrichment-stage.test.ts` + +## Assumptions + +- `TASK-77` remains active and this request maps to implementation plan step 2. +- Scope excludes edits to `src/core/services/tokenizer.ts` in this slice. + +## Open Questions / Blockers + +- None. + +## Next Step + +- Handoff slice-B result to user; no tokenizer orchestrator edits in this slice. diff --git a/docs/subagents/agents/opencode-task77-tokenizer-stages-20260221T232016Z-v9k2.md b/docs/subagents/agents/opencode-task77-tokenizer-stages-20260221T232016Z-v9k2.md new file mode 100644 index 0000000..6c68de3 --- /dev/null +++ b/docs/subagents/agents/opencode-task77-tokenizer-stages-20260221T232016Z-v9k2.md @@ -0,0 +1,47 @@ +# Agent: `opencode-task77-tokenizer-stages-20260221T232016Z-v9k2` + +- alias: `opencode-task77-tokenizer-stages` +- mission: `Execute TASK-77 tokenizer pipeline split into parser-selection enrichment and annotation stages end-to-end without commit` +- status: `done` +- branch: `main` +- started_at: `2026-02-21T23:20:16Z` +- heartbeat_minutes: `5` + +## Current Work (newest first) + +- [2026-02-21T23:20:16Z] intent: load Backlog TASK-77 context via MCP, write execution plan with writing-plans skill, execute with executing-plans skill, then run relevant verification gates. +- [2026-02-21T23:20:16Z] progress: initialized agent coordination record and index row before code edits. +- [2026-02-21T23:47:08Z] progress: implemented TASK-77 via stage split (`parser-selection-stage`, `parser-enrichment-stage`, `annotation-stage`) and parser lifecycle runtime extraction; reduced `src/core/services/tokenizer.ts` to orchestration facade. +- [2026-02-21T23:47:08Z] test: `bun test src/core/services/tokenizer.test.ts src/core/services/tokenizer/annotation-stage.test.ts src/core/services/tokenizer/parser-selection-stage.test.ts src/core/services/tokenizer/parser-enrichment-stage.test.ts` PASS (53/53). +- [2026-02-21T23:47:08Z] test: `bun run test:core:src` PASS (219 pass, 6 skip); `bun run build` PASS; `bun run test:core:dist` PASS (214 pass, 10 skip). +- [2026-02-21T23:47:08Z] handoff: TASK-77 backlog finalized to Done with AC/DoD checks and final summary; no commit performed. + +## Files Touched + +- `docs/subagents/agents/opencode-task77-tokenizer-stages-20260221T232016Z-v9k2.md` +- `docs/subagents/INDEX.md` +- `docs/subagents/collaboration.md` +- `docs/plans/2026-02-21-task-77-tokenizer-pipeline-stages.md` +- `package.json` +- `src/core/services/tokenizer.ts` +- `src/core/services/tokenizer/yomitan-parser-runtime.ts` +- `src/core/services/tokenizer/parser-selection-stage.ts` +- `src/core/services/tokenizer/parser-selection-stage.test.ts` +- `src/core/services/tokenizer/parser-enrichment-stage.ts` +- `src/core/services/tokenizer/parser-enrichment-stage.test.ts` +- `src/core/services/tokenizer/annotation-stage.ts` +- `src/core/services/tokenizer/annotation-stage.test.ts` +- `backlog/tasks/task-77 - Split-tokenizer-pipeline-into-parser-selection-enrichment-and-annotation-stages.md` + +## Assumptions + +- TASK-77 exists on Backlog board and is the source of truth for acceptance criteria. +- Scope likely includes tokenizer pipeline modules under `src/` plus associated tests/docs. + +## Open Questions / Blockers + +- None. + +## Next Step + +- Await user review; optional next step is commit/push on request. diff --git a/docs/subagents/agents/opencode-task79-sliceb-20260222T000253Z-m2r7.md b/docs/subagents/agents/opencode-task79-sliceb-20260222T000253Z-m2r7.md new file mode 100644 index 0000000..d6b6b3f --- /dev/null +++ b/docs/subagents/agents/opencode-task79-sliceb-20260222T000253Z-m2r7.md @@ -0,0 +1,36 @@ +# Agent: `opencode-task79-sliceb-20260222T000253Z-m2r7` + +- alias: `opencode-task79-sliceb` +- mission: `Implement TASK-79 slice B invariants coverage/tests and composition-boundary docs updates without commit` +- status: `done` +- branch: `main` +- started_at: `2026-02-22T00:02:53Z` +- heartbeat_minutes: `5` + +## Current Work (newest first) + +- [2026-02-22T00:02:53Z] intent: add invariants coverage for AniList runtime state/media state tests and document runtime ownership/mutation/reducer boundaries under composition guidance. +- [2026-02-22T00:02:53Z] plan: update `src/main/runtime/anilist-state.test.ts`, `src/main/runtime/anilist-media-state.test.ts`, and `docs/architecture.md`; run focused bun tests for both runtime test files. +- [2026-02-22T00:04:21Z] complete: added TASK-79 slice B invariant tests for queue metadata preservation/token-clear non-mutation/media-reset behavior and documented migrated runtime-state reducer ownership rules; verified with `bun test src/main/runtime/anilist-state.test.ts src/main/runtime/anilist-media-state.test.ts` (8 pass, 0 fail). + +## Files Touched + +- `docs/subagents/agents/opencode-task79-sliceb-20260222T000253Z-m2r7.md` +- `docs/subagents/INDEX.md` +- `docs/subagents/collaboration.md` +- `src/main/runtime/anilist-state.test.ts` +- `src/main/runtime/anilist-media-state.test.ts` +- `docs/architecture.md` + +## Assumptions + +- TASK-79 is the owning backlog ticket for this slice. +- Requested scope is test/docs only; no production behavior changes required. + +## Open Questions / Blockers + +- None. + +## Next Step + +- Handoff complete. diff --git a/docs/subagents/agents/opencode-task80-ipc-contract-20260222T001728Z-obrv.md b/docs/subagents/agents/opencode-task80-ipc-contract-20260222T001728Z-obrv.md new file mode 100644 index 0000000..4a9e21b --- /dev/null +++ b/docs/subagents/agents/opencode-task80-ipc-contract-20260222T001728Z-obrv.md @@ -0,0 +1,31 @@ +# Agent Session: opencode-task80-ipc-contract-20260222T001728Z-obrv + +- alias: `opencode-task80-ipc-contract` +- mission: `Execute TASK-80 IPC contract typing + runtime payload validation via writing-plans + executing-plans (no commit).` +- status: `planning` +- started_utc: `2026-02-22T00:17:28Z` +- last_update_utc: `2026-02-22T00:17:28Z` + +## Intent + +- Load TASK-80 from Backlog MCP and capture implementation plan before edits. +- Strengthen typed IPC channel contracts and runtime payload validation at boundaries. +- Reduce unsafe `unknown` casts in IPC handlers and add malformed payload coverage. + +## Planned Files + +- `src/main/ipc.ts` +- `src/main/runtime/*` +- `src/shared/ipc/*` +- `src/main/**/*.test.ts` +- `docs/architecture.md` + +## Assumptions + +- TASK-80 scope is main-process IPC boundary; keep external behavior/backward compatibility. +- Existing validation helpers may exist and should be reused over introducing heavy deps. +- Parallel subagents can split contracts/validation/tests/docs with non-overlapping files. + +## Phase Log + +- `2026-02-22T00:17:28Z` Session started; read backlog overview and TASK-80 details; beginning planning. diff --git a/docs/subagents/agents/opencode-task82-smoke-20260222T002150Z-p5bp.md b/docs/subagents/agents/opencode-task82-smoke-20260222T002150Z-p5bp.md new file mode 100644 index 0000000..7c62110 --- /dev/null +++ b/docs/subagents/agents/opencode-task82-smoke-20260222T002150Z-p5bp.md @@ -0,0 +1,31 @@ +# Agent Session: opencode-task82-smoke-20260222T002150Z-p5bp + +- alias: `opencode-task82-smoke` +- mission: `Execute TASK-82 e2e smoke suite for launcher/mpv/ipc/overlay end-to-end without commit` +- status: `planning` +- start_utc: `2026-02-22T00:21:50Z` +- last_update_utc: `2026-02-22T00:21:50Z` + +## Intent + +- Load TASK-82 details from Backlog MCP. +- Produce plan via writing-plans skill. +- Execute via executing-plans skill; use parallel subagents where safe. + +## Planned Files + +- `launcher/**/*.test.ts` +- `scripts/**` +- `package.json` +- `.github/workflows/*.yml` +- `docs/development.md` +- `docs/RELEASING.md` + +## Assumptions + +- Existing launcher/mpv readiness primitives from TASK-73/TASK-74 available. +- Smoke suite can run with local stubs/mocks; no real mpv/jellyfin dependency in CI. + +## Log + +- `2026-02-22T00:21:50Z` session started; backlog context loaded; moving to planning. diff --git a/docs/subagents/collaboration.md b/docs/subagents/collaboration.md index d20e881..64a243b 100644 --- a/docs/subagents/collaboration.md +++ b/docs/subagents/collaboration.md @@ -71,3 +71,6 @@ Shared notes. Append-only. - [2026-02-22T00:02:53Z] [opencode-task79-sliceb-20260222T000253Z-m2r7|opencode-task79-sliceb] overlap note: implementing TASK-79 slice B only (`src/main/runtime/anilist-state.test.ts`, `src/main/runtime/anilist-media-state.test.ts`, `docs/architecture.md`) for invariants coverage and composition-boundary ownership docs; no runtime behavior code changes. - [2026-02-22T00:04:21Z] [opencode-task79-sliceb-20260222T000253Z-m2r7|opencode-task79-sliceb] completed TASK-79 slice B request: added invariants coverage in AniList runtime/media tests (queue metadata preservation, clear-token non-mutation, guess-only reset, tracking reset idempotence), documented migrated runtime reducer ownership rules in architecture docs, and verified focused tests green (8 pass). - [2026-02-22T00:10:51Z] [opencode-task79-runtime-reducers-20260221T235652Z-n4p7|opencode-task79-runtime-reducers] completed TASK-79 end-to-end: merged slice A/B, added explicit AniList runtime transitions in `src/main/state.ts`, rewired migrated `src/main.ts` mutation paths, fixed `state.ts` core-services import coupling for focused tests, verified `bun test src/main/state.test.ts src/main/runtime/anilist-state.test.ts src/main/runtime/anilist-media-state.test.ts` + `bun run build` + `bun run test:core:src`, and marked backlog task Done. +- [2026-02-22T00:17:28Z] [opencode-task80-ipc-contract-20260222T001728Z-obrv|opencode-task80-ipc-contract] starting TASK-80 via Backlog MCP + writing-plans/executing-plans; scope IPC contract typing/runtime payload validation + malformed payload tests; will parallelize independent slices where possible. +- [2026-02-22T00:21:50Z] [opencode-task82-smoke-20260222T002150Z-p5bp|opencode-task82-smoke] starting TASK-82 via Backlog MCP + writing-plans/executing-plans; scope e2e smoke suite for launcher mpv ipc overlay startup + workflow/docs wiring, no commit. +- [2026-02-22T00:25:23Z] [codex-task82-smoke-20260222T002523Z-3j7u|codex-task82-smoke] overlap note: taking active TASK-82 execution; reusing existing task context/plan artifact, scoping edits to launcher smoke test + workflow/docs wiring + backlog evidence updates only.