# Focused settings persistence correction for PR #468 Head `23217bb12d8691d368a1ce602c80aca0dc7a20d0`, branch `feat/ui-settings`. Original failed head `c0a6d3df9795d1141ca37d7e14e91dc856abec8f`. Base `b14edf12252bd7dc1981bd83e8afcedfc4ee6f79`. Typing now updates the setting in memory on each input. The normal writer saves after 500 ms without another input, or immediately when the edit completes. Completion handles blur, Enter in a single-line field, Tab, closing the settings tab, and closing its popout. Enter in a textarea remains a newline. The timer runs on the main window, following QuickAdd commit `0142db3d`. Completion never reapplies input text. This preserves a value that sync changes after a debounced save. The field displays the current setting when completion occurs. The existing writer, merge rules, import locks, and quit refusal remain unchanged. The verifier's experimental quit-task patch was not adopted. No player or view file changed in this correction. Accepted residual: quitting or reloading before the 500 ms typing pause has elapsed can lose the unsaved burst. This is not a limit of 500 ms of typing; an uninterrupted burst can be longer. ## Red and green proof Both committed focused-field journeys leave Episode note path focused, wait 750 ms, then quit and restart the whole isolated app or issue the CLI renderer reload. They assert the persisted path and the restarted plugin's value. At c0a6d3d both failed. Quit expected `Focused/quit/{{title}}.md` and reload expected `Focused/reload/{{title}}.md`; both read `Initial/{{title}}.md`. `focused-red.log` records 2 failed tests. The same journeys pass after the fix in `focused-green.log`, with all 9 targeted runtime tests passing. A further real-app check found that reverting to a field's original text after its debounced save produces no native `change` event on blur. The first candidate retained `Paused/{{title}}.md` instead of `Initial/{{title}}.md`. An explicit blur listener fixes it. The committed unit and E2E regression both failed without that listener. See `revert-unit-red.log`, `revert-e2e-red.log`, `before-revert-blur.json`, and `after-revert-blur.json`. Unit tests use the real DataFileWriter with counted saves. Observation waits for queued saves and never calls `flushSaves()`, since flushing would hide a missing debounce or completion save. The typing test asserts memory after each input, zero writes through 499 ms after the final input, and exactly one write at 500 ms. It also checks completion adds no duplicate. Other cases cover timer cancellation, same-field sync after saving, number validation, textareas, Enter, and the episode-limit store. The implementation delegate planted eight defects and its targeted tests caught each one. Its logs predate the final explicit-blur test. The final full unit suite includes all of them. `focused-unit-mutations.tsv` preserves the candidate results. ## Runtime and writes Obsidian 1.14.4, installer 1.14.4, headless Linux, Node v22.23.2. Only the isolated runner was used. The vault is `.obsidian-e2e-vaults/podnotes-feat-ui-settings`, whose PodNotes artifact links this worktree's `main.js`. `final-bundle.json` records its absolute path and SHA-256. No shared dev vault was used. The exact text `V468/My podcastnote.md` contains 22 characters. CDP inserted each character separately in 177 ms, with a maximum gap of 14 ms. Immediately afterward, memory held the full path while disk still held the empty path. `npm run count:writes` then measured one attempted and completed write, zero failures, intact data, and an unchanged plugin. Tab after the debounce added zero writes. The prior independent master measurement was 22 writes for the same text. See `typing-writes.json` and `typing.log`. The normal-session sequence was measured on c0a6d3d and on the final implementation with the same fixture and actions. Cumulative completed writes were identical. | Action | Before | After | | --- | ---: | ---: | | Play | 1 | 1 | | Pause | 2 | 2 | | Seek | 2 | 2 | | Volume | 3 | 3 | | Rate | 3 | 3 | | Capture | 3 | 3 | | Settings open and close | 3 | 3 | | Auto-queue off | 4 | 4 | The fixture serves a 90-second, 16 kHz mono WAV from `http://podnotes.test:`. `before-normal-session.json` and `after-normal-session.json` contain the request and per-step recorder results. `after-completions.json` records successful Tab, Enter, blur, tab switch, modal close, plugin reload, and actual popout close checks. These probes observe disk without forcing pending settings drafts to save. ## Checks and size Every command used `TMPDIR=/data/home/tmp/podnotes-ui3 fnm exec --using 22 -- ...`. - `npm run lint`, `npm run format:check`, `npm run typecheck`, and `npm run build` passed. - `npm run test` passed 121 files and 2,475 tests, including the Svelte checks. - `npm run test:tooling` passed 2 files and 13 tests. - `npm run docs:build` passed 18 pages and all 112 legacy fragments. - `npm run size` passed with 306,423 raw bytes and 97,629 gzip bytes at level 9. - Full fresh-vault `npm run test:e2e`: passed 21 files and 152 tests in 544.95 seconds on the exact head above. The final bundle adds 252 raw and 93 gzip bytes to c0a6d3d. The whole UI3 PR is still 5,351 raw and 707 gzip bytes smaller than the base. It has 2,371 gzip bytes of room under the 100,000-byte gate. `gates.log`, the `gate-*.log` files, and `full-e2e.log` contain the output. The fresh suite began only after stopping the instance and moving the previous isolated vault into the ignored evidence directory. The suite stopped its isolated instance. The final runner dry run reports no remaining PIDs.. ## Integration and dispatch #466 was still open when the final checks began. Whichever PR merges second must preserve #466's CaptureService notice and unify the player's rate menu with `src/utility/playbackRate.ts`'s `PLAYBACK_RATES`. Implementation was delegated to `claudeAgent/claude-opus-5-5` with one source writer. Parent work reproduced the bug, reviewed the fix, added and proved the explicit-blur correction, and performed the runtime, count, size, and final gate checks. The original UI3 architecture and review rounds remain documented in the earlier report. The coordinator owns the independent delta verification.