Architecture decisions¶
Each record says what was decided, why, and what it costs. They are short on purpose: the code and its tests are the detail.
| ADR | Decision | Since |
|---|---|---|
| 001 | Backends are plugins, found by name | 0.7.0 |
| 002 | Backends say what they can do; tasks are checked before they run | 0.7.0 |
| 003 | One order for choosing a backend; the task never names it | 0.7.0 |
| 004 | Your transform gets native frames; the engine gets the port | 0.7.0 |
| 005 | One transform for every engine: Narwhals, detected not declared | 0.7.0 |
| 006 | The run record is correct before it is sold: every row, any order, same on every engine | 0.7.0 |
The rule behind all of them¶
The engine is a hexagon. The core (ubunye/core) holds the contract and the
decisions; everything that touches the outside world (Spark, pandas, a database,
a cloud) is an adapter behind a port, found through an entry point. The core
never imports an engine. A test reads every import in ubunye/core, even ones
inside functions, and fails if one names Spark, pandas or pyarrow.