Add batch mode with pre-computed per-version blessings
Replace the lock-based first-come-first-served blessing system with a
heuristic-based pre-computed blessing map. The new `batch` command:
Phase 1: Solves all target packages up front
Phase 2: Computes blessings using ocaml-docs-ci's heuristic
- Primary: maximize deps_count (prefer richer universes)
- Secondary: maximize revdeps_count (stability tiebreaker)
Phase 3: Forks workers with pre-computed blessing maps
Key changes:
- blessing.ml: Rewritten from flock-based locking to compute_blessings
algorithm that picks the best universe per (package, version) pair
- config.ml: Added blessed_map field for passing blessing decisions
- linux.ml: generate_docs reads blessing from config map instead of
filesystem locks
- s.ml: doc_layer_hash now includes blessed status so blessed/non-blessed
builds produce different doc layers with correct HTML paths
- main.ml: New run_batch function, batch CLI command, --blessed-map flag
on health-check for external worker support
Every version of every package now gets its own blessed documentation,
not just the first version to finish building.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>