-
Notifications
You must be signed in to change notification settings - Fork 0
Umbrella Python Services To Rust
ai-task: noetl/ai-meta#45 (CLOSED) · Opened: 2026-06-02 · Closed: 2026-06-02 (same day) · Status: ❌ Superseded by Umbrella: System Pool Design · ADR (v2 revised): System Worker Pool and WASM Plug-in Surface
Closed 2026-06-02 before any code work landed. The "compiled Rust rewrite of publisher + projector + server" framing was dropped within hours of being filed: the team decided that publisher + projector belong as system playbooks (not compiled Rust binaries), executed on the system worker pool. The HTTP server stays Python for now; its migration is a separate concern from the playbook-plug-in story. See the closing comment on the issue for the full audit trail. All future migration work flows through Umbrella: System Pool Design.
Replace the three remaining Python pods in the active runtime path with Rust equivalents:
| Pod (today) | Module | Function |
|---|---|---|
noetl-server |
Python FastAPI / uvicorn | Catalog, /api/execute, /api/events, SSE |
noetl-outbox-publisher |
python -m noetl.outbox_publisher |
Postgres event_outbox → NATS NOETL_EVENTS
|
noetl-projector-0 |
python -m noetl.projector |
NATS noetl.events.> → Postgres noetl.event
|
The noetl-worker Python pool (still claims agent tool kind)
is tracked under Umbrella: Rust Worker Migration
not here.
After the placement analysis on #45, the chosen shape:
One crate (
noetl/server), one image (ghcr.io/noetl/server:<v>), four binaries (server/publisher/projector/system_pool) selected via--mode=flag. Postgres-style: one source tree, multiple roles via separate binaries that share the same library.
See noetl/server wiki — Runtime shape for the implementation-level layout, and noetl/ops wiki — System worker pool for the deploy shape.
Smallest surface first to amortise the shared-library scaffolding:
| Step | Binary | Replaces | Status |
|---|---|---|---|
| 1 | --mode=publisher |
noetl-outbox-publisher |
Not started |
| 2 | --mode=projector |
noetl-projector-0 |
Not started |
| 3 | --mode=server |
noetl-server |
Not started |
| 4 | --mode=system |
(new — see system-pool umbrella) | Not started |
Steps 1 + 2 drop two of the three Python pods even before step 3 ships — useful intermediate checkpoint.
Step 4 is the system worker pool (per Umbrella: System Pool Design); depends on step 3 for catalog reads.
- Reads from Postgres outbox table via
LISTEN/NOTIFY(latency win over today's poll loop). - Publishes to
NOETL_EVENTSNATS stream with the same envelope contract Python uses today. - Same metrics surface (
noetl_publisher_*) peragents/rules/observability.md. - Kind validation:
repos/ops/automation/development/noetl.yamlreapplied with the publisher Deployment image flipped toghcr.io/noetl/server:<v> --mode=publisher. Smoke test: insert intoevent_outbox, observe NATS message land within 100ms. - Wiki update: noetl-server wiki Home table + Runtime shape page; noetl-ops wiki manifests list.
- Sharded StatefulSet preserved — pod name → consumer name, filter subject hashes by execution_id.
- Batch-INSERT into
noetl.eventwithON CONFLICT (event_id) DO NOTHINGfor idempotency. - Same metrics (
noetl_projector_*). - Kind validation: same playbook; smoke test: publish to
noetl.events.<subject>, observe row innoetl.eventtable.
The big one. Route inventory in noetl-server wiki — full HTTP API parity with the Python implementation:
-
/api/catalog/list,/api/catalog/register,/api/catalog/resource,/api/catalog/{path}/ui_schema -
/api/execute,/api/executions/{id},/api/executions/{id}/events -
/api/events(theput_resultboundary the Rust worker already uses) -
/api/credentials/*,/api/keychain/* -
/api/runtime/contract(the gateway + SPA contract) - SSE endpoints
Kind validation: full regression suite passes against the new server.
See Umbrella: System Pool Design for the design + tracking.
| Date | Event |
|---|---|
| 2026-06-02 | Issue filed during session 2026-06-02; placement analysis comment captured the same-crate/four-binary decision. |
| 2026-06-02 | ADR merged via noetl/docs#176 → published at https://noetl.dev/docs/architecture/system_pool_and_wasm_plugins. Bumped via ai-meta@eda6eed. |
| 2026-06-02 | Cross-linked wiki pages went live: noetl-server wiki — Runtime shape and noetl-ops wiki — System worker pool. |
| 2026-06-02 | No code work started yet. |
-
Start with
--mode=publisher. Smallest LoC, narrowest surface, validates the shared-library scaffolding. Estimated ~1 week of dedicated work. - Add the shared library in step 1. Don't try to bring it to perfection before step 2 — adjust as the second binary surfaces new requirements.
- Sequence the deployment cutover — publisher first, then projector, then server. Each step independently rollback-able by reverting the Deployment image.
- Umbrella: System Pool Design — sibling design, depends on this.
- Umbrella: Rust Worker Migration — covers the worker-side migration (this umbrella covers non-worker).
- ADR: System Worker Pool and WASM Plug-in Surface.
- noetl-server wiki: Runtime shape.
- noetl-ops wiki: System worker pool.
- Home — overview
- Repo Map
- Releases
- Sessions Log
- Secrets Wallet (#61) — SECURITY (design)
- Rust Server Port (#49) — PRIMARY
- Decoupled Context + Event Chain (#115) — RFC (design), reframes #101
- Orchestrator Scaling (#101) — reframed by #115; consume side = #115 Phase 1
- Event WAL + Derivable Storage (#104) — Round 01 (locator) PR open
- WASM Plug-in Compilation (#105) — system-pool plug-in hot-reload (ADR Phase 4)
- System Pool Design (#46) — PRIMARY
- Regression Baseline Migration (#98) — e2e
- Subscription / Listener Tool (#90) — RFC
- Container Tool Callback (#43)
- Rust Worker Parity Gaps (#47 · #48)
- Event Envelope Reconciliation (#51 in TaskList)
- Cursor Loop Mode (#100) — server v3.8.0 + tools v3.10.1, 2026-06-15
- Transfer Tool Credentials (#99) — tools v3.10.0 + worker v5.22.0, 2026-06-14
- Explicit Input Binding (#77) — v3.0.0 shipped 2026-06-09
- Rust Worker Migration (#30)
- Python Services → Rust (#45)
- Issue Tracking
- Wiki Convention
- Handoffs
- Deployment Validation
- Execution Model
- Data Access Boundary
- Observability
- noetl/noetl wiki — app + DSL
- noetl/server wiki — Rust control plane
- noetl/worker wiki — Rust pull worker
- noetl/tools wiki — tool registry crate
- noetl/cli wiki — CLI + local mode
- noetl/gateway wiki — gatekeeper
- noetl/ops wiki — Helm + manifests
- noetl/travel wiki — domain SPA reference
- Docs site — engineer-facing architecture