docs(architecture): consolidate canonical docs and archive roadmap noise

This commit is contained in:
2026-02-21 19:04:19 -08:00
parent 4ad8109508
commit 47301d7492
7 changed files with 144 additions and 169 deletions

View File

@@ -1,10 +1,11 @@
---
id: TASK-101
title: Consolidate architecture docs and archive task noise
status: To Do
assignee: []
status: Done
assignee:
- codex-task101-docs-archive
created_date: '2026-02-21 07:15'
updated_date: '2026-02-21 07:15'
updated_date: '2026-02-22 03:01'
labels:
- documentation
- maintainability
@@ -37,16 +38,49 @@ Architecture guidance is fragmented across long-lived docs and task notes. Conso
## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #1 Runtime composition guidance exists in one canonical location.
- [ ] #2 Duplicated/stale architecture notes removed from long-lived docs.
- [ ] #3 Task evidence retained in backlog/archive, not lost.
- [ ] #4 Docs build and links pass after consolidation.
- [x] #1 Runtime composition guidance exists in one canonical location.
- [x] #2 Duplicated/stale architecture notes removed from long-lived docs.
- [x] #3 Task evidence retained in backlog/archive, not lost.
- [x] #4 Docs build and links pass after consolidation.
<!-- AC:END -->
## Implementation Plan
<!-- SECTION:PLAN:BEGIN -->
1) Canonicalize runtime architecture guidance in `docs/architecture.md` and remove task-ID provenance wording so architecture guidance remains timeless.
2) Trim duplicated runtime architecture bullets from `docs/development.md` Contributor Notes and point contributors to `/architecture` as canonical guidance.
3) Convert `docs/structure-roadmap.md` from a full task-history roadmap into a short archival note that points to canonical architecture docs and states historical detail is retained in backlog task records.
4) Record a changelog of moved/removed sections in TASK-101 notes/final summary to preserve evidence that was removed from long-lived docs.
5) Run `bun run docs:build` and finalize AC/DoD checks in Backlog once docs build/link validation passes.
<!-- SECTION:PLAN:END -->
## Implementation Notes
<!-- SECTION:NOTES:BEGIN -->
Plan captured in docs/plans/2026-02-22-task-101-architecture-doc-consolidation.md before edits.
Initial removal/move inventory: (a) TASK-tagged provenance bullets in docs/architecture.md Why This Design, (b) duplicated runtime-composer/domain-ownership bullets in docs/development.md Contributor Notes, (c) TASK-27 split-sequence/migration-risk body in docs/structure-roadmap.md.
Doc consolidation changelog (pass 1):
- docs/architecture.md: removed task-ID provenance bullets from `Why This Design` and replaced with timeless architecture wording.
- docs/development.md: removed duplicated runtime-composer/domain-registry/MPV-split architecture bullets from `Contributor Notes`; added single canonical pointer to `/architecture`.
- docs/structure-roadmap.md: replaced full TASK-27 roadmap/migration-risk/split-sequence body with archival notice that redirects to canonical architecture docs and backlog historical records.
<!-- SECTION:NOTES:END -->
## Final Summary
<!-- SECTION:FINAL_SUMMARY:BEGIN -->
Consolidated runtime architecture guidance into canonical long-lived docs and removed task-history noise:
- `docs/architecture.md`: removed task-ID provenance bullets from `Why This Design` and kept architecture rationale timeless.
- `docs/development.md`: trimmed duplicated architecture implementation bullets in `Contributor Notes`; retained a direct canonical link to `/architecture`.
- `docs/structure-roadmap.md`: replaced full TASK-27 roadmap body with archival notice pointing to canonical architecture guidance.
Task-noise evidence is preserved in Backlog records (TASK-101 implementation notes/final summary plus existing backlog archive/task history) rather than long-lived docs. Verification: `bun run docs:build` passed (VitePress build complete, no link errors).
<!-- SECTION:FINAL_SUMMARY:END -->
## Definition of Done
<!-- DOD:BEGIN -->
- [ ] #1 Change log of moved/removed doc sections included in task notes.
- [ ] #2 `bun run docs:build` passes.
- [ ] #3 Contributor-facing entry points link to canonical architecture section.
- [x] #1 Change log of moved/removed doc sections included in task notes.
- [x] #2 `bun run docs:build` passes.
- [x] #3 Contributor-facing entry points link to canonical architecture section.
<!-- DOD:END -->

View File

@@ -251,8 +251,8 @@ flowchart TD
- **Better testability:** most behavior can be tested without Electron windows/mpv.
- **Better reviewability:** PRs can be scoped to one subsystem.
- **Backward compatibility:** CLI flags and IPC channels can remain stable while internals evolve.
- **Extracted composition root:** TASK-27 refactored `main.ts` into focused modules under `src/main/`, isolating startup, lifecycle, IPC, CLI, and domain-specific runtime wiring.
- **Split MPV service:** TASK-27.4 separated `mpv.ts` into transport (`mpv-transport.ts`), protocol (`mpv-protocol.ts`), state (`mpv-state.ts`), and properties (`mpv-properties.ts`) layers for improved maintainability.
- **Extracted composition root:** `main.ts` delegates to focused modules under `src/main/` for startup, lifecycle, IPC, CLI, and domain runtime wiring.
- **Split MPV service layers:** MPV internals are separated into transport (`mpv-transport.ts`), protocol (`mpv-protocol.ts`), state (`mpv-state.ts`), and properties (`mpv-properties.ts`) for maintainability.
## Extension Rules

View File

@@ -83,6 +83,40 @@ bun run test:core:dist # optional full dist core suite
bun run test:subtitle:dist # subtitle dist lane (currently placeholder)
```
## Maintainability Guardrails
Run guardrails locally before opening a PR:
```bash
bun run check:file-budgets:strict
bun run check:main-fanin:strict
bun run check:runtime-cycles:strict
```
Expected success output includes:
- `[OK] hotspot budget check (strict) — no hotspots over limit`
- `[OK] main runtime fan-in (strict) — ...`
- `[OK] runtime cycle check (strict) - ... no cycles detected`
Hotspot budget baselines (2026-02-22):
| File | Baseline LOC | Limit LOC |
| ----------------------------------------- | ------------ | --------- |
| `src/main.ts` | 2978 | 3150 |
| `src/config/service.ts` | 116 | 140 |
| `src/core/services/tokenizer.ts` | 232 | 260 |
| `launcher/main.ts` | 101 | 130 |
| `src/config/resolve.ts` | 33 | 55 |
| `src/main/runtime/composers/contracts.ts` | 13 | 30 |
Troubleshooting guardrail failures:
- File budget hotspot failure: split logic by runtime/domain boundaries and keep orchestration facades thin.
- Main fan-in failure: move runtime imports behind `src/main/runtime/domains/*` or composer barrels.
- Runtime cycle failure: break bidirectional imports by extracting shared helpers into leaf modules.
- Optional broad-budget audit (legacy/global): run `bun run scripts/check-file-budgets.ts --strict --enforce-global`.
## Config Generation
```bash
@@ -124,11 +158,8 @@ Run `make help` for a full list of targets. Key ones:
- To add/change generated config template blocks/comments, update `src/config/definitions/template-sections.ts`.
- Keep `src/config/definitions.ts` as the composed public API (`DEFAULT_CONFIG`, registries, template export) that wires domain modules together.
- Overlay window/visibility state is owned by `src/core/services/overlay-manager.ts`.
- Main process composition is split across `src/main/` modules plus focused runtime composers under `src/main/runtime/composers/*` (for example AniList tracking and MPV runtime assembly clusters).
- Runtime composer contracts should use shared helpers in `src/main/runtime/composers/contracts.ts` (`ComposerInputs`, `ComposerOutputs`, and `BuiltMainDeps`) so required deps remain compile-time enforced.
- Runtime domain imports for `src/main.ts` should route through `src/main/runtime/domains/*`; shared domain access point is `src/main/runtime/registry.ts`.
- Runtime architecture/module-boundary conventions are documented in [Architecture](/architecture); keep contributor changes aligned with that canonical guide.
- Linux packaged desktop launches pass `--background` using electron-builder `build.linux.executableArgs` in `package.json`.
- MPV service has been split into transport, protocol, state, and properties layers in `src/core/services/`.
- Prefer direct inline deps objects in `src/main/` modules for simple pass-through wiring.
- Add a helper/adapter service only when it performs meaningful adaptation, validation, or reuse (not identity mapping).
- See [Architecture](/architecture) for the composition model and extension rules.

View File

@@ -1,153 +1,7 @@
# Structure Roadmap for TASK-27
# Structure Roadmap (Archived)
Date: 2026-02-14
This page previously contained TASK-27 migration planning details.
## 1) Oversized refactor candidates (>=400 LOC)
| File | Concern | Status | Reason |
| ------------------------------ | ------------------------------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `src/main.ts` | Bootstrap / composition root / orchestration | Active | Main entrypoint owns startup, lifecycle orchestration, service construction, state mutation surfaces, and IPC bindings |
| `src/anki-integration.ts` | Domain service orchestration / integrations | Active | 2.6k+ LOC, high cyclomatic coupling to mpv/subtitle timing and mining flows |
| `src/core/services/mpv.ts` | MPV protocol + app state bridge | Active | ~780 LOC, large protocol and behavior mix, 22-entry dep interface |
| `src/core/services/subsync.ts` | Subsync orchestration (ffsubsync/alass workflows) | Active | ~494 LOC, file IO + mpv command orchestration + result shaping |
| `src/renderer/positioning.ts` | Renderer positioning layout policy | Active (downstream of TASK-27.5) | 513 LOC, layout/rules + platform-specific behavior in one module |
| `src/config/service.ts` | Config load/validation | Active support | ~601 LOC, central schema validation + mutation APIs |
| `src/types.ts` | Shared contract surface | Active support | ~640 LOC, foundational type exports driving module boundaries |
| `src/config/definitions.ts` | Config schema/registry definitions | Active support | ~480 LOC, dense constants/interfaces used by config runtime and docs |
| `src/media-generator.ts` | Media generation helpers | Active support | ~431 LOC, utility-heavy with multiple generation flows |
## 2) API contracts by target file
### `src/main.ts` (bootstrap + composition root)
- **Entry points**: Electron main process boot path (executed by package `main` entry).
- **Contract responsibilities**:
- parse CLI/env and select startup flow through `runStartupBootstrapRuntimeService`
- register app-level lifecycle and command handlers (`runAppLifecycleService`, `handleCliCommandService`)
- instantiate core services (mpv, overlay runtime, IPC handlers, shortcuts, tokenizer, config services)
- hold mutable application runtime state:
- parser/Yomitan windows and extension state
- mpv client and tracker/state
- overlay/app bootstrap flags and modal/shortcut state
- runtime option and anki integration containers
- **Primary callers/integration points**:
- Electron event loop (`app.whenReady`, `process` signals)
- startup/bootstrap services, service adapters in `src/core/services`
### `src/core/services/mpv.ts` (protocol + facade)
- **Core exports**: `MpvIpcClient`, `MPV_REQUEST_ID_SECONDARY_SUB_VISIBILITY`, `MpvIpcClientDeps`
- **Primary responsibilities / API**:
- connection management (`connect`, `setSocketPath`, `request`, `send`, `requestProperty`)
- protocol message handling (`processBuffer`, private message handlers for `property-change` and request IDs)
- reconnection lifecycle (`scheduleReconnect`, `failPendingRequests`)
- mpv control actions (`setSubVisibility`, `replayCurrentSubtitle`, `playNextSubtitle`)
- state restoration (`restorePreviousSecondarySubVisibility`)
- **Current caller set**:
- `src/main.ts` (construction + lifecycle + service invocations)
- `src/main/ipc-mpv-command.ts` (runtime control API)
- `src/core/services/subsync.ts` (`requestProperty`, request ID usage)
- tests under `src/core/services/mpv.test.ts`
- **Observed coupling risk**:
- `MpvIpcClientDeps` mixes protocol config with app-level side effects (subtitle broadcast, tokenizer, overlay updates, config reads)
### `src/anki-integration.ts`
- **Class export**: `AnkiIntegration`
- **Primary public operations (validated from external callsites)**:
- lifecycle: `start`, `stop`, `destroy`
- card flow: `createSentenceCard`, `updateLastAddedFromClipboard`, `triggerFieldGroupingForLastAddedCard`, `markLastCardAsAudioCard`
- runtime patching: `applyRuntimeConfigPatch`
- **State dependencies (constructor)**:
- config, subtitle timing tracker, mpv client, OSD/notification callbacks
- **Primary callers**:
- `src/core/services/overlay-runtime-init.ts` (initial integration creation)
- `src/core/services/anki-jimaku.ts` (enable/disable and field-grouping RPC)
- `src/core/services/mining.ts` (delegates mining actions)
### `src/core/services/subsync.ts`
- **Exports**: `runSubsyncManualService`, `openSubsyncManualPickerService`, `triggerSubsyncFromConfigService`
- **Caller set**:
- `src/core/services/subsync-runner.ts` (runtime wrappers)
- `src/core/services/mpv-jimaku/`? (through runtime services and IPC command handlers)
### `src/config/service.ts`
- **Class export**: `ConfigService`
- **Primary API**:
- `reloadConfig`, `saveRawConfig`, `patchRawConfig`
- read methods: `getConfig`, `getRawConfig`, `getWarnings`, `getConfigPath`
- **Primary callers**:
- `src/main.ts`, `src/core/services/cli-command` and runtime config consumers
### `src/renderer/positioning.ts`
- **Public style/runtime contract**
- exported calculation helpers for subtitle Y-position and inset offsets
- event handlers for window geometry and subtitle-size changes
- **Primary callers**:
- `src/renderer/handlers/*`
- `src/renderer/subtitle-render.ts`
## 3) Split sequence / dependency ordering
Adopted sequence (from TASK-27 parent):
1. `TASK-27.3` (Anki integration split)
2. `TASK-27.2` (main.ts composition-root split) — depends on TASK-7 and TASK-27.3
3. `TASK-27.4` (mpv-service protocol/transport/property/facade split) — depends on TASK-27.1 and absorbs TASK-8
4. `TASK-27.5` (renderer positioning split) — downstream
## 4) Compatibility and migration risks per split
### TASK-27.3 / anki integration surface
- Risk: interface breakage in field-grouping preview/build/enable flow
- Mitigation: keep constructor params and public methods stable; preserve IPC payload shapes
### TASK-27.2 (composition root)
- Risk: lifecycle/cleanup regressions from moving startup hooks and shutdown behavior
- Mitigation: preserve service construction order and keep existing event registration boundaries
Migration note:
- `src/main.ts` now delegates composition edges to `src/main/startup.ts`, `src/main/app-lifecycle.ts`, `src/main/startup-lifecycle.ts`, `src/main/ipc-runtime.ts`, `src/main/cli-runtime.ts`, and `src/main/subsync-runtime.ts`.
- Overlay/modal interaction has been moved into `src/main/overlay-runtime.ts` (window selection, modal restore set tracking, runtime-options palette/modal close handling) so `main.ts` now uses a dedicated runtime service for modal routing instead of inline window bookkeeping.
- Stateful runtime session data has moved to `src/main/state.ts` via `createAppState()` so `main.ts` no longer owns the `AppState` shape inline, only importing and mutating the shared state instance.
- Behavioral contract remains stable: startup flow, CLI dispatch, IPC handlers, and subsync orchestration keep existing external behavior; only dependency wiring moved out of `main.ts`.
### TASK-27.4 (mpv-service)
- Risk: request/deps interface changes could break control and subsync interactions
- Mitigation: preserve public `MpvClient` methods, request semantics, and reconnect events while splitting internal modules
### TASK-27.4 expected event flow snapshot (current)
- `connect()` establishes socket and starts `observe_property` subscriptions via `subscribeToProperties()`.
- `processBuffer()` uses `splitMpvMessagesFromBuffer()` to parse JSON lines and route each message to `handleMessage()`.
- `dispatchMpvProtocolMessage()` now owns protocol-level handling for:
- `event === "property-change"` updates (subtitle text/ASS/timing, media/path/title, track metrics, secondary subtitles, visibility restore flags)
- `request_id` responses for startup state fetches and dynamic property queries
- shutdown handling and pending request resolution
- `handleMessage()` now delegates state mutation and side effects through `MpvProtocolHandleMessageDeps` to the client facade (`emit(...)`, state fields, `sendCommand`, etc.).
- Reconnect path stays behavior-critical:
- socket close/error clears pending requests and calls `scheduleReconnect()`
- timer callback calls `connect()` after exponential-ish delay
### TASK-27.5 (renderer positioning)
- Risk: UI placement drift on platform edge cases
- Mitigation: keep existing DOM state updates and geometry math in place while refactoring module boundaries
## 5) Global smoke checklist (required for all TASK-27 subtasks)
- App starts and connects to MPV
- Subtitle text appears in overlay
- Card mining creates a note in Anki
- Field grouping modal opens and resolves
- Global shortcuts work (mine, toggle overlay, copy subtitle)
- Secondary subtitle display works
- TypeScript compiles with no new errors
- Manual smoke checklist executed for runtime behavior
- Canonical runtime architecture guidance now lives in `docs/architecture.md`.
- Contributor-facing implementation expectations are in `docs/development.md` and link back to `docs/architecture.md`.
- Historical task-level migration context is preserved in Backlog task records and archive folders.

View File

@@ -57,4 +57,9 @@ Read first. Keep concise.
| `opencode-task80-ipc-contract-20260222T001728Z-obrv` | `opencode-task80-ipc-contract` | `Execute TASK-80 IPC contract typing + runtime payload validation end-to-end without commit` | `done` | `docs/subagents/agents/opencode-task80-ipc-contract-20260222T001728Z-obrv.md` | `2026-02-22T00:56:00Z` |
| `opencode-task82-smoke-20260222T002150Z-p5bp` | `opencode-task82-smoke` | `Execute TASK-82 e2e smoke suite for launcher/mpv/ipc/overlay end-to-end without commit` | `done` | `docs/subagents/agents/opencode-task82-smoke-20260222T002150Z-p5bp.md` | `2026-02-22T00:54:29Z` |
| `codex-task82-smoke-20260222T002523Z-3j7u` | `codex-task82-smoke` | `Execute TASK-82 e2e smoke suite for launcher/mpv/ipc/overlay end-to-end without commit` | `done` | `docs/subagents/agents/codex-task82-smoke-20260222T002523Z-3j7u.md` | `2026-02-22T00:53:25Z` |
| `opencode-task81-launcher-modules-20260222T005725Z-8oh8` | `opencode-task81-launcher-modules` | `Execute TASK-81 launcher command-module/process-adapter refactor end-to-end without commit` | `in_progress` | `docs/subagents/agents/opencode-task81-launcher-modules-20260222T005725Z-8oh8.md` | `2026-02-22T00:57:25Z` |
| `opencode-task81-launcher-modules-20260222T005725Z-8oh8` | `opencode-task81-launcher-modules` | `Execute TASK-81 launcher command-module/process-adapter refactor end-to-end without commit` | `done` | `docs/subagents/agents/opencode-task81-launcher-modules-20260222T005725Z-8oh8.md` | `2026-02-22T01:09:30Z` |
| `codex-task99-guardrails-20260222T010930Z-m9q2` | `codex-task99-guardrails` | `Execute TASK-99 maintainability guardrail expansion and runtime cycle checks end-to-end without commit` | `done` | `docs/subagents/agents/codex-task99-guardrails-20260222T010930Z-m9q2.md` | `2026-02-22T03:01:34Z` |
| `opencode-task84-keybindings-gating-20260222T011624Z-llor` | `opencode-task84-keybindings-gating` | `Execute TASK-84 gate feature-dependent keybindings behind config flags end-to-end without commit` | `done` | `docs/subagents/agents/opencode-task84-keybindings-gating-20260222T011624Z-llor.md` | `2026-02-22T01:35:30Z` |
| `codex-task98-source-tests-20260222T021156Z-a1b2` | `codex-task98-source-tests` | `Execute TASK-98 shift core tests to source level and trim dist coupling end-to-end without commit` | `done` | `docs/subagents/agents/codex-task98-source-tests-20260222T021156Z-a1b2.md` | `2026-02-22T02:36:00Z` |
| `codex-task101-docs-archive-20260222T024156Z-hneu` | `codex-task101-docs-archive` | `Execute TASK-101 consolidate architecture docs and archive task-noise evidence` | `done` | `docs/subagents/agents/codex-task101-docs-archive-20260222T024156Z-hneu.md` | `2026-02-22T03:01:38Z` |
| `codex-fix-ci-20260222T025848Z-0xdl` | `codex-fix-ci` | `Inspect failing GitHub Actions PR checks and implement approved fix` | `in_progress` | `docs/subagents/agents/codex-fix-ci-20260222T025848Z-0xdl.md` | `2026-02-22T02:58:55Z` |

View File

@@ -0,0 +1,42 @@
# Agent: codex-task101-docs-archive-20260222T024156Z-hneu
- alias: codex-task101-docs-archive
- mission: Execute TASK-101 consolidate architecture docs and archive task-noise evidence
- status: done
- branch: main
- started_at: 2026-02-22T02:41:56Z
- heartbeat_minutes: 5
## Current Work (newest first)
- [2026-02-22T03:01:38Z] handoff: TASK-101 done; backlog AC/DoD checked and status set Done; docs build verified.
- [2026-02-22T03:01:38Z] change: updated `docs/architecture.md` to remove task-number provenance wording from long-lived architecture rationale.
- [2026-02-22T03:01:38Z] change: trimmed duplicated architecture guidance in `docs/development.md` Contributor Notes and kept canonical `/architecture` pointer.
- [2026-02-22T03:01:38Z] change: replaced `docs/structure-roadmap.md` body with archival notice + canonical architecture pointer.
- [2026-02-22T03:01:38Z] test: `bun run docs:build` pass.
- [2026-02-22T02:41:56Z] intent: load TASK-101 full context from Backlog MCP; write execution plan via writing-plans skill; execute via executing-plans skill with parallel subagents where possible.
- [2026-02-22T02:41:56Z] planned files: `docs/architecture.md`, `docs/development.md`, `docs/subagents/collaboration.md`, `docs/subagents/INDEX.md`, `docs/subagents/agents/codex-task101-docs-archive-20260222T024156Z-hneu.md`, backlog TASK-101 notes via MCP.
- [2026-02-22T02:41:56Z] assumptions: canonical architecture source likely `docs/architecture.md`; task-noise migration should preserve evidence in `backlog/archive` and task notes instead of deleting historical context.
## Files Touched
- `docs/subagents/INDEX.md`
- `docs/subagents/agents/codex-task101-docs-archive-20260222T024156Z-hneu.md`
- `docs/plans/2026-02-22-task-101-architecture-doc-consolidation.md`
- `docs/architecture.md`
- `docs/development.md`
- `docs/structure-roadmap.md`
- `docs/subagents/collaboration.md`
- Backlog task `TASK-101` (MCP updates only)
## Assumptions
- Backlog is initialized and TASK-101 exists with actionable acceptance criteria.
## Open Questions / Blockers
- none
## Next Step
- Await next assigned task.

View File

@@ -78,3 +78,12 @@ Shared notes. Append-only.
- [2026-02-22T00:54:29Z] [opencode-task82-smoke-20260222T002150Z-p5bp|opencode-task82-smoke] completed TASK-82 implementation pass: launcher smoke e2e stabilized (`launcher/smoke.e2e.test.ts`), CI/release smoke + artifact upload wired, docs updated (`docs/development.md`, `docs/installation.md`), and verification lanes green (`test:launcher:smoke:src`, `test:launcher`, `test:fast`, `build`, `test:smoke:dist`, `docs:build`).
- [2026-02-22T00:53:25Z] [codex-task82-smoke-20260222T002523Z-3j7u|codex-task82-smoke] completed TASK-82: added `launcher/smoke.e2e.test.ts`, wired `test:launcher:smoke:src` + CI/release smoke gates with `.tmp/launcher-smoke` failure artifact upload, docs updated (`docs/development.md`, `docs/installation.md`), launcher/fast/docs lanes green; `build + test:smoke:dist` still blocked by unrelated TASK-80 IPC typing errors.
- [2026-02-22T00:57:25Z] [opencode-task81-launcher-modules-20260222T005725Z-8oh8|opencode-task81-launcher-modules] starting TASK-81 via Backlog MCP + writing-plans/executing-plans; expected scope `launcher/main.ts` command extraction, process adapters, and launcher tests while preserving CLI behavior/exit codes.
- [2026-02-22T01:09:30Z] [opencode-task81-launcher-modules-20260222T005725Z-8oh8|opencode-task81-launcher-modules] completed TASK-81 implementation pass: extracted launcher command handlers under `launcher/commands/*`, added `launcher/process-adapter.ts` seam + thin `launcher/main.ts` dispatcher, added adapter-mocked command tests (`launcher/commands/command-modules.test.ts`), and validated `bun run test:launcher && bun run test:core:src` green.
- [2026-02-22T01:09:30Z] [codex-task99-guardrails-20260222T010930Z-m9q2|codex-task99-guardrails] starting TASK-99 via Backlog MCP + writing-plans/executing-plans; scope expected around guardrail budgets, runtime cycle-check fixture coverage, CI fail-fast wiring, and contributor docs.
- [2026-02-22T03:01:34Z] [codex-task99-guardrails-20260222T010930Z-m9q2|codex-task99-guardrails] completed TASK-99 implementation pass: added hotspot budget thresholds + baseline reporting in `scripts/check-file-budgets.ts`, added runtime cycle checker + fixture-backed tests (`scripts/check-runtime-cycles*.ts`), wired CI fail-fast guardrail step, updated contributor docs with guardrail commands/baselines, and verified guardrail/docs/test lanes green.
- [2026-02-22T01:16:24Z] [opencode-task84-keybindings-gating-20260222T011624Z-llor|opencode-task84-keybindings-gating] starting TASK-84 via Backlog MCP + writing-plans/executing-plans; expected scope keybinding feature-flag gating, disabled-integration startup guards (Jellyfin case), tests, and docs.
- [2026-02-22T01:35:30Z] [opencode-task84-keybindings-gating-20260222T011624Z-llor|opencode-task84-keybindings-gating] completed TASK-84: gated Anki-dependent shortcuts in `src/core/utils/shortcut-config.ts`, added Jellyfin `enabled` startup guards in `src/main.ts` + `jellyfin-remote-session-lifecycle.ts`, added focused tests (`shortcut-config`, jellyfin lifecycle, warmups), updated config docs, and validated focused tests + `test:core:src` + `docs:build`.
- [2026-02-22T02:11:56Z] [codex-task98-source-tests-20260222T021156Z-a1b2|codex-task98-source-tests] starting TASK-98 closure pass via Backlog MCP + writing-plans/executing-plans; validating remaining DoD evidence and finalization status, no commit.
- [2026-02-22T02:36:00Z] [codex-task98-source-tests-20260222T021156Z-a1b2|codex-task98-source-tests] completed TASK-98 closure: validated `test:fast` + `build` + `test:smoke:dist` all pass on current HEAD, captured timing repro (`2.18s` source lane, `0.21s` dist smoke), confirmed script/workflow/docs split unchanged, and finalized Backlog task to Done.
- [2026-02-22T02:41:56Z] [codex-task101-docs-archive-20260222T024156Z-hneu|codex-task101-docs-archive] starting TASK-101 via Backlog MCP + writing-plans/executing-plans; scope architecture docs consolidation, stale-note cleanup, archive evidence retention, and docs link/build verification.
- [2026-02-22T03:01:38Z] [codex-task101-docs-archive-20260222T024156Z-hneu|codex-task101-docs-archive] completed TASK-101: canonicalized runtime architecture wording in `docs/architecture.md`, trimmed duplicated architecture bullets in `docs/development.md`, converted `docs/structure-roadmap.md` to archival notice, `bun run docs:build` passed, and backlog TASK-101 finalized Done with AC/DoD evidence.