| Design choice | Detail |
| SPL stays canonical in your repo; rendered per-target at build time | The same .sql source produces compiled Informix C UDRs, Informix Java UDRs, MSSQL T-SQL, MySQL stored routines, Oracle PL/SQL, or DB2 LUW SQL PL on demand — you commit one version of the procedure logic and let the converter render whichever targets your deployment needs that release. |
| Six output backends (informix-udr / java / mssql / mysql / oracle / db2) share one parser + typed IR | A hand-rolled SPL lexer + recursive-descent parser produces a small set of vendor-neutral dataclasses (Procedure, Define, Foreach, Return, OnException, …); per-target template emitters consume the same IR. Adding a new backend is one new emitter, no parser changes. |
| CLI-first; no runtime dependency on the converter | Generated code is plain .c / .sql you can hand-edit, version-control, and ship without the SQLMorph binary on the deployment box. Drive it from CI/CD via sqlmorph -t informix-udr -o out path/to/spl/; the output bundle is what production sees. |
| Anthropic API fallback for expressions templates can't handle | Disk-cached for deterministic re-runs. The converter takes a deliberate path through templates first; only when an expression-level idiom doesn't match does it surface the LLM. Cached responses make subsequent runs fully reproducible without re-querying. |