The problem we are solving is not just "transform some JSON."
It is:
- receive structured input
- extract and normalize useful data
- call external systems using derived requests
- normalize the responses
- combine original and fetched data
- shape the final result
That is too much responsibility for one language.
The architecture should therefore separate:
- pure transformation
- external effects
- enrichment and joins
- final output shaping
- orchestration
We want a family of small tools, not one monolith.
The system has four layers:
SDAEnrichmentShapingAxiom
SDA, Enrichment, and Shaping are semantic engines.
Axiom is the effectful orchestration layer.
Implementation priority is not equal across these layers.
SDA is the cornerstone and the workhorse.
The rest of the system should be built on top of a strong SDA, not alongside a weak one.
SDA is the pure data transformation language.
It is responsible for:
- extracting slices from structured input
- normalization
- validation
- derived values and keys
- reshaping one dataset into another dataset
- explicit semantics for
Null, absence, duplicates, and carrier behavior
SDA must stay pure.
It does not:
- call HTTP services
- read or write files
- manage retries, caching, or auth
- perform workflow control
Rule: SDA computes requests and normalizes responses, but never performs effects.
Enrichment describes how datasets from different sources are combined.
Its concerns are:
- source declarations
- lookup semantics
- unique vs multi matches
- join behavior
- missing and duplicate policies
- provenance and explainability
This may begin as a semantic library before it becomes its own language.
Rule: enrichment should make source usage and join policy explicit, not hide them in host code.
Shaping is responsible for final output construction.
Its concerns are:
- final response contracts
- output schemas
- rendering and layout
- export-oriented structure
- binary or fixed-width output later if needed
This layer exists only if output concerns become distinct enough from pure transformation.
Rule: shaping should stay output-focused and not become a second general-purpose transform language.
Axiom is the orchestration language.
This is the real effectful layer. It coordinates the semantic engines and interacts with the outside world.
Axiom owns:
- stage sequencing
- state-machine transitions
- named inputs and outputs
- HTTP CRUD
- file CRUD
- retries, timeouts, auth, and caching policy
- parsing and routing of intermediate values
- invocation of
SDA,Enrichment, andShaping
Rule: Axiom performs requests and moves workflow state forward, but should not absorb all business transformation logic.
These boundaries matter more than syntax.
SDAstays pure.Axiomowns effects.- Enrichment stays explicit.
- Shaping stays output-focused.
- Each layer should eventually have stable semantics, failures, tests, CLI entry points, and library APIs.
The architecture supports four modes of use.
sdaenrshapeaxiom
This supports shell-first workflows and quick experiments.
The tools should be usable directly from shell scripts and CI pipelines.
Example:
sda -f extract.sda < event.json > useful.json
enr -f join.enr --in useful.json > joined.json
shape -f result.shp < joined.json > result.json
axiom run workflow.axEach semantic engine should also be embeddable from host languages such as Oberon, C, Rust, or Go.
Conceptually:
sda_eval(program, input) -> value | failenr_eval(program, input, source_provider) -> value | failshape_eval(program, input) -> value | bytes | fail
This lets a host language provide the glue before the Axiom orchestration DSL exists.
When workflow patterns stabilize, Axiom becomes the thin declarative glue over the three engines.
The cleanest framing is:
SDAis the pure transformation engineAxiomis the orchestration engine for workflows with external effectsEnrichmentandShapingare distinct semantic layers when their complexity justifies it
In short:
Axiom is not the transformation language.
Axiom is the glue that coordinates transformation, acquisition, enrichment, and shaping.
For implementation planning, this also means:
SDAis the first real productAxiomis a later orchestration layer built aroundSDAEnrichmentandShapingshould split out only when they justify their own surfaces
The pragmatic order is:
- make
SDAsolid as a library and CLI - make
sdauseful enough to stand alone as a shell and ETL tool - build the minimum useful
Axiomruntime for effectful orchestration - split out
Enrichmentif source and join semantics need their own surface - split out
Shapingif output construction diverges from pure transformation - add the Axiom glue syntax only after repeated orchestration patterns are clear
We should not start by building four complete grammars. We should start by building the workhorse well.