readVoiceFields/patchFrontmatter split on \r?\n; patchFrontmatter and renderNote write in the note's own line-ending style. Before: a CRLF note's '---\r' was not recognised, the patch prepended a second frontmatter block and the record fell out of the queue.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
T1.1: tsconfig.core.json (types: []) covers src/core; typecheck runs both
passes, so process/Buffer in core fail compilation. tests/core-types.test.ts
compiles a fixture with Node globals under both configs and rejects config
errors as false positives. The fixture is excluded from the root tsconfig.
O-2: devDependencies pinned to the locked versions, .npmrc save-exact=true.
Lock updated only in the root specifiers: npm install on macOS would prune
optional rolldown binaries for other platforms.
Refs #3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QKHeGuAYh4W1jNdjMConZa
- I-1 (F-1): claimAll() now also moves this device's own `retry` records
and own stale `sent` records to `saved` via the `claim` transition
(device = own), same as it already does for other devices' claimable
records, then runs a normal tick() so everything sends without waiting
for the next retry time. The returned count still only reflects records
reassigned from other devices. Adds `ownReclaimable()` to schedule.ts.
- M-1 (F-2): pass() wraps each per-record operation (staleOwn update and
each send) in try/catch, remembers the first error, keeps processing the
rest of the due queue, and rethrows the first error after both loops
complete — so one permanently failing record no longer blocks newer
records behind it. list()/load() failures still reject tick()
immediately, as before.
- F-4a: send()'s post-request update now also requires
`r.device === env.deviceId && r.sentAt === sent.sentAt`, so a late
transcription result can never overwrite a record another device (or a
newer send) has since taken over.
- F-4b: pass()'s staleOwn loop now also stops when the abort signal fires;
retry() and claimAll() return early (false / 0) without writing once
disposed.
- F-4d: retry() no-op it.each now also covers `sent` (own, fresh).
Refs #1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>