Tracking issue for the 2026 improvement program: framework comparison → gap analysis (deduplicated against the existing tracker) → roadmap. 37 new issues were opened as part of this program (#406 –#446 ); everything else referenced below already existed.
1. Where actor-ts stands (framework comparison)
Capability
Akka 3 / Pekko
Orleans
Erlang/Elixir
Proto.Actor
Temporal/Restate
Cloudflare DO
actor-ts
Core actors + supervision
✅
✅ (grains)
✅
✅
—
partial
✅
Cluster + sharding + singleton
✅
✅
✅
✅
—
managed
✅
Event sourcing + projections
✅
partial
Mnesia
basic
✅ (workflows)
—
✅ (5 backends)
CRDTs / distributed data
✅
—
—
—
—
—
✅ (8 types)
Reliable delivery
✅
✅
—
—
✅
—
✅
Streams w/ backpressure
✅
Orleans Streams
GenStage/Broadway
—
—
—
❌ → #147 /#54
Durable timers/reminders
—
✅
—
—
✅
✅ (alarms)
❌ → #168
Saga / durable workflows
✅ (Akka 3)
—
—
—
✅
—
❌ → #179 /#88
AI-agent runtime
✅ (2025 pivot)
via MS AF
—
—
✅ (headline)
—
❌ → #421 (flagship)
DevTools / observer UI
commercial
dashboard
✅ observer
—
✅ UI
—
❌ → #445
Browser/edge story
—
—
—
—
—
✅
❌ → #446 (unique opportunity)
Multi-runtime TS-native
—
—
—
—
SDK only
Workers only
✅ Bun+Node+Deno
Verdict: ~95 % parity with the classic Akka core; the open gaps were almost all already ticketed here. The differentiators nobody else can copy cheaply: TS-native full stack on three runtimes, and (upcoming) durable AI agents + isomorphic actors.
2. Positioning
"The TypeScript-native actor runtime — and the durable AI-agent runtime for TS." Batteries included, dependencies excluded .
3. Dependency policy (binding — details in #419 )
4. Documentation definition-of-done (binding — details in #420 )
No feature is done without: concept guide (EN + DE ), full JSDoc on public APIs, runnable example, HOCON config reference, CHANGELOG entry. Large modules (agents, jobs, client, devtools) additionally get their own docs chapter + example app.
5. Milestones (order, not version promises — versions are assigned at release cut)
M1 — Security hardening (first)
Foundation (land early, everything after inherits it):
Security triage of the open backlog, in waves — most urgent first: #110 , #121 , #126 + #136 , #117 + #141 , #406 .
S1 input validation & injection: [Security] Tag strings may flow unescaped into CQL/SQL queries #136 , [Security] PersistenceId accepts arbitrary characters (NUL, .., control chars) #133 , [Security] Actor names accept control chars, allowing log injection #134 , [Security] ActorPath.child(name) doesn't reject path-traversal segments #126 , [Security] Object-storage list() returns malformed keys not validated #123 , [Security] HTTP redirect target not validated (open redirect risk) #125 , fix(io/tcp): TcpSocketOptionsValidator should validate the nested framing.maxLineLen #372 , feat(io/sse): make the SSE inbound buffer cap an SseOptions field #371 , [Security] Guard HOCON deepMerge and key-path assignment against prototype pollution #406 (new: HOCON prototype pollution) — [Security] Guard HOCON deepMerge and key-path assignment against prototype pollution #406 done (three further vectors found while fixing: single-segment __proto__, ${__proto__} substitution reads, and deepMerge carrying an own __proto__)
S2 crypto correctness: [Security] AES-GCM IV reuse not prevented by wrapper API #110 , [Security] Key-version byte overflow after >256 rotations #111 , [Security] HKDF info-parameter is static across deployments #108 , [Security] No default snapshot-policy guidance for DurableState #107
S3 cluster protocol auth: [Security] ClusterClient envelope.from spoofing reroutes replies #121 , [Security] Joining-member version-hijack via pre-claimed higher version #114 , [Security] Gossip-replay attack via missing timestamp validation #112 , [Security] ClusterClient TLS config not validated at construction time #144 , [Security] SeedProvider DNS resolution not pinned, vulnerable to DNS hijack #145 , [Security] Heartbeat sequence-number accepts NaN / Infinity #115
S4 unbounded growth / DoS: [Security] Receptionist subscribers set is unbounded #137 , [Security] Cluster member map grows unbounded under adversarial gossip #138 , [Security] DistributedPubSubMediator per-topic subscriber list unbounded #139 , [Security] Tombstone TTL never expires when removedAt is Infinity / garbage #113 , [Security] Global ask-counter overflow after 2^31 calls #119 , [Security] Prometheus cardinality attack via user-controlled label values #131 , [Security] JSON.stringify on error paths can hang on circular references #146 , [Bug] BoundedMailbox drop-head overflow is a no-op while the mailbox is suspended #407 (new: BoundedMailbox suspended drop-head bug) — [Bug] BoundedMailbox drop-head overflow is a no-op while the mailbox is suspended #407 done ; note the suspension window is ActorCell.failToParent, i.e. every supervision escalation, so the default bounded mailbox lost its bound exactly when it mattered
S5 HTTP headers & info-leak: [Security] Missing X-Content-Type-Options: nosniff header on responses #127 , [Security] CORS default may be too permissive #128 , [Security] MDC context leak across async-storage tenant boundaries #129 , [Security] Traceparent values written to plain-text debug logs #132 , [Security] Error messages leak filesystem paths / stack frames in user-facing responses #130 , feat(http): built-in dependency-free HTML sanitizer for untrusted markup #355 , fix(http): default 500 response leaks err.message across all three backends #356 , fix(http): request body-size limit parity across backends #357 , feat(http/ws): per-route / configurable WS transport frame cap on Express + Fastify #373
S6 races & resource leaks: [Security] DurableState ETag-refresh race in upsert path #117 , [Security] setIfAbsent atomicity is backend-dependent under high contention #141 , [Security] PersistentActor accepts out-of-order events from snapshot store #122 , [Security] PersistentFSM stateTimeout race on rapid transitions #143 , [Security] DistributedData pending-writes map can accumulate stale timeouts #140 , [Security] PromiseActorRef.tell timer leak on duplicate reply #118 , [Security] SqliteJournal lock contention via filesystem flock() #124
S7 persistence robustness (in progress in a parallel worktree features/persistence-hardening — tracked here, not re-planned): [Bug] Silent in-memory fallback masks a misconfigured persistence plugin (data-loss footgun) #377 , [Bug] Injected shared pool ended by individual store close() (Postgres/MariaDB); object-storage backend double-close #378 , [Bug] Journal highestSeq rewinds to 0 after a full delete (relational + in-memory) #379 , [Bug] Cassandra journal: start() not single-flight; consistency option dead; misleading logged-batch comment #380 , [Feature] Remove dead persistence API surface (batchSize/clock, durableStatePluginId, recovery.mode, consistency) #381 , [Bug] Broken persistence examples (scylla-ledger snapshotPolicy, cassandra-plugin-hello import path) #382 , [Bug] Inconsistent JournalError wrapping + doubled 'require requires' hint + non-uniform lazy-import #383
M2 — Performance & robustness
M3 — Packaging, DX & CI
M4 — Flagship: actor-ts/agents
[Feature] actor-ts/agents — LLM agents as supervised, durable actors (epic) #421 epic — MVP: [Feature] agents: provider-neutral ChatModel interface + SDK-free OpenAI / Anthropic / Ollama adapters #422 , [Feature] agents: ToolRegistry with tools-as-actors (absorbs #202) #423 , [Feature] agents: AgentActor — event-sourced conversation loop #424 , [Feature] agents: deterministic testkit — Scripted / Recording / Replay ChatModel #425 , [Feature] agents: OTel GenAI semconv spans + Prometheus metrics #426 — follow-ups: [Feature] agents: MCP client — consume external MCP servers as tools (SDK-free) #427 , [Feature] agents: MCP server — expose actor tools over MCP (SDK-free) #428 , [Feature] agents: orchestration — agent-as-tool, handoff, sharded agents, typed facade #429 , [Feature] agents: human-in-the-loop approval gate #430
[Feature] LLM-Tool-Call-as-Actor primitive #202 is absorbed by [Feature] actor-ts/agents — LLM agents as supervised, durable actors (epic) #421 — closed as absorbed, after verifying each part is carried: [Feature] agents: ToolRegistry with tools-as-actors (absorbs #202) #423 (tool dispatch/retry/circuit-breaking), [Feature] agents: AgentActor — event-sourced conversation loop #424 (durable per-conversation state, crash recovery, token/cost audit), [Feature] agents: OTel GenAI semconv spans + Prometheus metrics #426 (OTel + Prometheus), [Feature] agents: orchestration — agent-as-tool, handoff, sharded agents, typed facade #429 (cluster scaling)
M5 — Feature parity & patterns
Existing: #147 (streams subset first; #54 full DSL after), #168 (reminders), #179 + #88 (saga), #169 (placement), #170 (stateless workers), #156 , #151 , #159 , #177 .
New: #431 (jobs — after #168 ), #433 (DLQ), #434 (OpenAPI), #432 (presence).
M6 — DevTools & simulation
M7 — Isomorphic actors (browser & edge)
[Meta] Isomorphic actors — browser & edge program #446 program umbrella → [Feature] actor-ts/client — typed browser/frontend client (ask over WebSocket/HTTP) #435 (typed client), [Feature] React/Vue/Svelte bindings for the actor-ts client (useActor, useAsk, useTopic) #436 (bindings), [Feature] Browser-side ActorSystem with Web Workers #210 , [Feature] Cross-runtime cluster (Bun + Node + Deno + Browser in one cluster) #215 , [Feature] WASM/Edge-runtime subpackage (Cloudflare Workers / Deno Deploy) #209 (+ D1/libSQL backends from [Feature] Additional persistence backends: MongoDB, DynamoDB, MSSQL, libSQL/Turso, Cloudflare D1 (umbrella) #438 )
M8 — Integrations (continuous, demand-driven)
New: #437 (cloud brokers), #438 (persistence backends) — DONE, closed : MongoDB, DynamoDB, MS SQL, libSQL/Turso and Cloudflare D1 all shipped with the full journal + snapshot + durable-state trio, EN+DE docs and live integration suites; follow-ons split out as #490 and #491 , #439 (lease backends), #440 (observability pack), #441 (Helm), #443 (Effect interop — parked), #444 (delta CRDTs — parked).
Existing same category: #15 , #16 , #72 , #73 , #74 , #160 , #4 , #5 .
6. Deliberately NOT re-ticketed (dedup)
Streams (#54 /#147 ), reminders (#168 ), saga (#179 /#88 ), virtual-actor features (#169 –#175 ), gen_statem/trap_exit/via-registry/RPC (#163 –#166 ), multi-DC (#149 ), simulation/time-travel/hot-reload/chaos/visualizer (#200 –#206 ), edge/browser (#209 /#210 /#215 ), Avro/Protobuf (#73 ), schema-registry client (#72 ), router strategies (#153 /#154 /#69 ), the code-quality catalog (#235 –#282 ), CRDT property tests (done), CI coverage restore (#325 ), ZeroMQ/STOMP (#15 /#16 ), HTML sanitizer (#355 ), persistence robustness (#377 –#383 , parallel session).
7. 1.0 criteria
M1–M3 complete; publint/attw/knip green; coverage floor restored to 89; bench gates holding; security backlog empty; API freeze + CHANGELOG discipline.
Tracking issue for the 2026 improvement program: framework comparison → gap analysis (deduplicated against the existing tracker) → roadmap. 37 new issues were opened as part of this program (#406–#446); everything else referenced below already existed.
1. Where actor-ts stands (framework comparison)
Verdict: ~95 % parity with the classic Akka core; the open gaps were almost all already ticketed here. The differentiators nobody else can copy cheaply: TS-native full stack on three runtimes, and (upcoming) durable AI agents + isomorphic actors.
2. Positioning
"The TypeScript-native actor runtime — and the durable AI-agent runtime for TS." Batteries included, dependencies excluded.
3. Dependency policy (binding — details in #419)
4. Documentation definition-of-done (binding — details in #420)
No feature is done without: concept guide (EN + DE), full JSDoc on public APIs, runnable example, HOCON config reference, CHANGELOG entry. Large modules (agents, jobs, client, devtools) additionally get their own docs chapter + example app.
5. Milestones (order, not version promises — versions are assigned at release cut)
M1 — Security hardening (first)
Foundation (land early, everything after inherits it):
Security triage of the open backlog, in waves — most urgent first: #110, #121, #126 + #136, #117 + #141, #406.
__proto__,${__proto__}substitution reads, anddeepMergecarrying an own__proto__)ActorCell.failToParent, i.e. every supervision escalation, so the default bounded mailbox lost its bound exactly when it matteredfeatures/persistence-hardening— tracked here, not re-planned): [Bug] Silent in-memory fallback masks a misconfigured persistence plugin (data-loss footgun) #377, [Bug] Injected shared pool ended by individual store close() (Postgres/MariaDB); object-storage backend double-close #378, [Bug] Journal highestSeq rewinds to 0 after a full delete (relational + in-memory) #379, [Bug] Cassandra journal: start() not single-flight; consistency option dead; misleading logged-batch comment #380, [Feature] Remove dead persistence API surface (batchSize/clock, durableStatePluginId, recovery.mode, consistency) #381, [Bug] Broken persistence examples (scylla-ledger snapshotPolicy, cassandra-plugin-hello import path) #382, [Bug] Inconsistent JournalError wrapping + doubled 'require requires' hint + non-uniform lazy-import #383M2 — Performance & robustness
M3 — Packaging, DX & CI
M4 — Flagship: actor-ts/agents
M5 — Feature parity & patterns
Existing: #147 (streams subset first; #54 full DSL after), #168 (reminders), #179 + #88 (saga), #169 (placement), #170 (stateless workers), #156, #151, #159, #177.
New: #431 (jobs — after #168), #433 (DLQ), #434 (OpenAPI), #432 (presence).
M6 — DevTools & simulation
DEVTOOLS_PROTOCOL_VERSION = 1) behind a./devtoolssubpath exportM7 — Isomorphic actors (browser & edge)
M8 — Integrations (continuous, demand-driven)
New: #437 (cloud brokers), #438 (persistence backends) — DONE, closed: MongoDB, DynamoDB, MS SQL, libSQL/Turso and Cloudflare D1 all shipped with the full journal + snapshot + durable-state trio, EN+DE docs and live integration suites; follow-ons split out as #490 and #491, #439 (lease backends), #440 (observability pack), #441 (Helm), #443 (Effect interop — parked), #444 (delta CRDTs — parked).
Existing same category: #15, #16, #72, #73, #74, #160, #4, #5.
6. Deliberately NOT re-ticketed (dedup)
Streams (#54/#147), reminders (#168), saga (#179/#88), virtual-actor features (#169–#175), gen_statem/trap_exit/via-registry/RPC (#163–#166), multi-DC (#149), simulation/time-travel/hot-reload/chaos/visualizer (#200–#206), edge/browser (#209/#210/#215), Avro/Protobuf (#73), schema-registry client (#72), router strategies (#153/#154/#69), the code-quality catalog (#235–#282), CRDT property tests (done), CI coverage restore (#325), ZeroMQ/STOMP (#15/#16), HTML sanitizer (#355), persistence robustness (#377–#383, parallel session).
7. 1.0 criteria
M1–M3 complete; publint/attw/knip green; coverage floor restored to 89; bench gates holding; security backlog empty; API freeze + CHANGELOG discipline.