Yes, this is very much what Hamilton is meant to do! And something we’re actively developing out — both with Hamilton and the DAGWorks product.
The high-level design (and there are a few variants of it) is:
1. Have a single DAG that specifies everything end-to-end (E.G. instead of loading data to/from places, just pass it through
2. Break that out into the “tasks” you mentioned above — using additional data
loaders/
materializers to save/load intermediate results
3. Run those tasks on top of the macro-orchestration system — run Hamilton within DAGSter, dbt python, prefect, airflow, etc…
4. Get full column-level/micro-lineage, inspect intermediate results, plug whatever metadata you need into the systems you mentioned above/others, etc…
The advantages to this design are pretty unique to Hamilton:
1. You can test the whole thing end to end, locally, using small data
2. You can view fine-grained/logical lineage on a per-task basis
3. You can be flexible about how you want to break it up — say that you actually want to combine tasks (1) and (2), or run it all in one, that’s all super simple with a bit of configuration.
or you want to break task (1) into two different pieces, that’s fairly easy as well.
So it’s a slight paradigm shift — don’t think about the tasks, think about the logic. Then you can create the tasks from the logic itself, knowing what data you want to be available and where.
Does this make sense? IMO this is one of the great reasons to use Hamilton — start small then grow out.