ну и тут нужно уточнить, что формального описания графа зависимостей нет. таски просто запрашивают из контекста значения и ждут их расчёта. это делается в коде таска, а не каким-то инжектом на старте. в том числе из-за того, что таски не атомарны и часть работы отгружают раньше завершения. хотя с этим можно побороться и устранить такую вольность
Я делаю формальный граф задачи и поиск циклов при загрузке задачи. В принципе поиск циклов можно делать на старте корутины, она же помнит своего "родителя", вот и проверить, есть ли в цепочке родителей она сама.
с формальным графом много сложностей. например, сложно сделать мутабельный набор задач. такое используется редко, но бывает (если расчёты связаны с действиями пользователя). не особо понятно как делать перерасчёт графа без жёсткой синхронизации на это время. у нас например кроме добавления нод бывают и удаления (вброшена более свежая задача, старую нет смысла считать)
для некоторых таких вещей мы используем drools, так как в нём как раз решены проблемы мутабельного формального графа. но с ним пока не удалось разобраться, как сделать красивый менеджмент контейнеров (мы не можем всегда всё хранить в памяти). жалко что у него ничего встроенного на эту тему нет.
а вообще drools это довольно тяжеловесная штука. все эти его приколы с мавен репозиториями в проде и сложность интеграции... слава богам есть embedded версия, с которой всё проще, но хотелось бы чего-то ещё более лёгкого