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

feat(leveling): declarative RunConfig with runFromConfig master

One JSON document now fully describes a leveling run — resolve options, blocks by versioned registry code (reusing the PipelineGraph format as the config's pipeline section), and objective weights (null = compute and report but don't optimize). runFromConfig fills the config (block-schema defaults expanded, levelset version stamped — the filled config is the persistable artifact), resolves the project, compiles blocks with instanceIds doubling as constraint names for attribution, statically analyzes the run (throwing coded RunAnalysisError on errors), and returns a live run: stream/best/scores/materialize plus the combined weightedScorer objective. Framework-owned config sections are strict so a typo'd key is an error, not a silently unconstrained run. Graph instances gain an optional enabled lever (undefined = enabled, so existing graphs and constructors stay valid).