Skip to content

Packaging decisions (S5)

decisionchoicenumbers behind itwhat would reverse it
engine placementcompiler only; executors nativeproxy execution: PK +69%, 100 rows +152% (perf.md §5)none — row data crossing an interface loses in every measurement
Rust runtimewasmtime, wasm on a dedicated threadcold compile 50µs/shape, cache hit 0.7µs; no Go runtime in the tokio process (perf.md §2)a need for <20µs cold compiles at very high shape churn (then libloading of the .dylib, measured 11µs)
PHP runtimeormd daemon over a persistent Unix socket + bounded process-local plan cachecompile round trip once per uncached shape; hot path is PDO onlyFrankenPHP/in-process PHP remains a separate runtime implementation
artifactsormengine-0.0.1.wasm (all hosts), ormd-0.0.1-<os>-<arch>, ormgen-0.0.1-<os>-<arch>, SHA256SUMS (scripts/build-artifacts.sh)— (version stays 0.0.1; file names carry it, never a "latest" symlink)
distributionGo: module path; PHP: composer package with bin/ormd-… next to it; Rust: crate loading the wasm from [engine].wasm (optional include_bytes! documented)a registry publish is a separate decision
configurationDSN and secrets are injected by the application; compiler and schema paths are runtime options
driversGo go-sql-driver/mysql (MPL-2.0), Rust sqlx (MIT/Apache), PHP pdo_mysqlsqlx PK 78µs is the driver's own cost (F2)a measured 2× win from mysql_async on the hot path would justify swapping db.rs only
YAML codecGo go.yaml.in/yaml/v3, PHP symfony/yaml, Rust serde_yaml_ng with yaml-rust2 validation, TypeScript yaml; lock files are committedthe same 96 vectors and invalid-input cases run in all four clientsreplace a library only when the shared vectors and error cases remain unchanged

MIT License · Go / PHP / Rust / TypeScript