SFFMC v0.12.0 — Workflow Resume + hardening + perf
v0.12.0 (2026-06-18)
Workflow Resume Passthrough + 6 P0 coverage tests + journal/checkpoint performance + per-session state isolation.
Added
- Workflow Resume Passthrough — when OpenCode restarts mid-workflow, in-flight runs are now marked "paused" (recoverable from journal) instead of "crashed". Use
runtime.resume({ runID })to continue. - Health check factory — 13 health checks consolidated behind a single factory pattern, removing duplicated boilerplate.
- Journal format v1 — journals now include a version header for forward compatibility. Existing v0 journals still parse correctly.
workflow:resumedevent — emitted when a paused workflow is resumed viaruntime.resume({ runID }).- 6 P0 coverage tests — race conditions in lock acquisition, agent abort at semaphore, depth-limit enforcement, budget-exceeded detection, debounced counter flush, structural error propagation.
Changed
- Performance: journal files now stream-parse on load (was full-read into memory). (workflow package)
- Performance:
readToolCallsreads the checkpoint file once instead of twice. (extra package) - Performance:
appendJournalSynccoalescesfsynccalls in a 50ms window; explicitflushJournalSync()API for durability. (workflow package)
Fixed
- Cross-session state leak in
auto-maxandmax-mode: per-session state previously stashed on the sharedctxobject could leak across sessions in long-running processes. Moved to per-instanceMap<sessionID, …>in plugin state. - Inconsistent logger usage: 10
console.*calls inextra/checkpoint.tsandextra/judge.tsmigrated to the sharedcreateLoggerhelper.
Removed
- 4 dead
MemoryConfigfields (reconBudgets.memory,.checkpoint,.taskTree,.agents) — onlyreconBudgets.tailwas actually read. - Unused
MAX_COMMANDimport and deadtriggeredLogfield inauto-max. - Duplicate
RichPluginContextre-declarations inextra/dream.tsandextra/judge.ts(now imported from@sffmc/shared).
Hygiene
- Pinned
@types/bunandbun-typesfrom"latest"to"1.3.14". Purged orphanednode_modules(stalebetter-sqlite3@11.10.0). - Test count: 570 passing (was 546).