start splitting by purpose, revise build recursion