Skip to content

Unified production workflow comparison ​

New collection, 2026-10-23: formal-release SQLite and recovery report. Go 1.26.0, Core v0.5.0, Durable/official sqlitestore v0.1.0; 171 valid records and all 36 recoveries ok. Another 45 Temporal checkpoint configuration errors remain as diagnostics, not performance failures; overall status: COMPLETED_WITH_ERRORS. Only reliable confirmation, the Temporal native-persistence baseline and recovery were rerun, not full execution/observation/resources. Historical identities, backends and numbers below remain unchanged.

The new round keeps Pulse/Durable, Eino and Temporal throughout execution, observation, resources, reliable confirmation and recovery. The full report/four figures, 234-group compact CSV, versions/raw hashes and reproduction code live together in Pulse rather than duplicating raw artifacts in both repositories. See Pulse #427 and Durable #41.

Measured on 2026-10-17. Public Pulse v0.4.2-0.20261017111210-aa02dd107a43, Durable v0.0.0-20261017105818-71c693fc82ef, Eino v0.9.21, Temporal SDK v1.50.0 / CLI v1.9.1 / Server v1.32.0. The shared benchmark host uses Go1.26.0; the official Server binary was built with Go1.26.8. The isolated benchmark pins both latest repositories without local replace. Durable's production go.mod retains its original dependency: combined validation is not a production dependency upgrade.

Reading reliable dimensions ​

DimensionPulse / DurableEinoTemporal
Native executionPulse in memorycompose Graph in memoryNative persistent Service/Activities
Reliable saveStore confirms complete node chains before publicationNo automatic per-node save on ordinary success; checkpoint on active interruptNative event history and Activity confirmation
SQLiteBenchmark host through existing StoreBenchmark host through CheckPointStoreReal Server embedded in CLI
Process recoveryKill host after confirmed prefix, then ResumeExit after active checkpoint; new-process resumeNo-in-flight prefix, worker kill; Server restart separately

SQLite uses WAL/FULL while retaining different transaction layouts and save granularity. The Durable benchmark host encodes the complete RunRecord as JSON in SQLite's record BLOB column, with Revision-based CAS. It borrows filestore OS locks for local ownership only, never calls its Load/Save methods, and does not save a second JSON run file. This is a benchmark adapter, not a newly delivered production SQLite backend, distributed lease or fencing. No equivalent ordinary per-node confirmation measurement for Eino does not mean its extension mechanisms cannot support persistent applications. Active interruption is distinct from arbitrary-crash recovery.

chain/rounds=1 reliable reuse medians (ms):

NodesPulse + DurableEinoTemporal
17.1326Active interrupt separately253.826
1045.5552Active interrupt separately197.6637
100503.4885Active interrupt separately5049.4483
10008553.1903Active interrupt separately—
10000—Active interrupt separately—

Durable uses three repeats; Temporal references this round's native durable points with five batches, rather than a second equivalent experiment. — is an incomplete whole-case cost, not zero or an extrapolation. All three ten-thousand-node Durable shapes hit the 60s case budget, so this round does not accept ten-thousand-step reliable scale.

Results and evidence boundaries ​

The four matrices retain all 1062 planned identities and 234 groups: 947 completed, 25 time limits, 90 not_repeated, no business-result validation errors; all 36 recovery scenarios completed. Recovery uses chain N=10/100/1000, rounds=256, confirmed prefixes 5/10/10. The parent independently reads Pulse SQLite and execution audit, hashes Eino's saved blob, or uses a separate Temporal client to confirm native history with no in-flight Activity. Final values and no prefix rerun are checked; arbitrary in-flight external effects are not promised exactly once.

Native cases include a first run plus a full reuse, while recovery only completes the suffix. Successful recovery does not imply native completion within the same budget. Store lengths include DB/WAL/SHM, not cumulative writes or per-step costs. Cumulative Go allocations differ from RSS; Temporal's process-local allocations exclude Server. Resources use separate equal-work two-run cases and the complete process tree.

Latest public Core with Durable passed build/vet/full race and real process-exit recovery. New adapters passed full race, live Temporal failure/cancellation reuse/history concurrency checks, and independent sampler counterexamples/review. The full report retains unfavorable or surprising results, including slower recovery with the Temporal Server left alive, without claiming a cause absent controlled diagnosis.

The older scale report and checkpoint cost page preserve historical versions and numbers; they do not enter this unified comparison. Raw JSONL, logs, databases, binaries and full machine inventories remain in external evidence rather than Git. No release tag was created.

Target v0.1.0 · Go 1.26+ · Pulse v0.5.0 · Release status: GitHub Releases · MIT