A functional toolkit for authoring resource-leveling algorithms — compose constraint and scoring blocks, enumerate feasible schedules

feat(level-blocks): family composition rules as registry data master

Lift the family grammar into src/level-blocks/composition.ts as pure data and predicates: FAMILY_ORDER, FAMILY_FOLLOWS, canFollow, sortIntoBandOrder, and FAMILY_CARDINALITY. validateGraph now loops over FAMILY_CARDINALITY instead of hard-coding the exactly-one-search check — behavior identical, existing tests unchanged — so a future per-family bound is a data edit. This is the levelset-side source of truth a canvas connection checker mirrors; a canFollow table test captures the contract so the vendor sync can delete its own copy.


+224 -7
4 changed files