Trzysta stacji roboczych, ten sam show, dokładnie ta sama wersja Houdiniego i tego samego pluginu na każdej z nich — bez tego żaden render nie jest powtarzalny.
Rozdział 17 pokazał menedżer pakietów jako czarną skrzynkę, która „rozwiązuje żądaną kombinację wersji". Ten dodatek otwiera tę skrzynkę — pokazuje, jak zapisuje się pojedynczy pakiet i co dokładnie dzieje się w momencie, w którym Rez próbuje pogodzić wymagania kilku pakietów naraz.
Każdy pakiet w Rez opisany jest plikiem deklarującym jego nazwę, wersję i listę zależności — ale te zależności rzadko wskazują jedną, dokładną wersję. Zamiast tego określają zakres: „maya w wersji 2024 lub nowszej", „python w wersji 3.9 albo 3.10". Ta elastyczność ma znaczenie praktyczne — pakiet napisany raz nie musi być aktualizowany za każdym razem, gdy powstanie nowa, kompatybilna wersja jego zależności, dopóki mieści się w zadeklarowanym zakresie.
Kiedy artysta żąda kontekstu z kilkoma pakietami, Rez musi znaleźć dokładnie jedną wersję każdego z nich (i każdej ich zależności, transytywnie) tak, żeby żaden zakres nie został złamany. To zadanie spełniania ograniczeń (constraint satisfaction) — dokładnie ta sama klasa problemu, którą rozwiązują solvery w innych dziedzinach inżynierii. Kiedy dwa pakiety mają sprzeczne wymagania, których nie da się jednocześnie spełnić, Rez nie zgaduje ani nie wybiera arbitralnie — zgłasza dokładnie, które dwa wymagania się wykluczają:
REQUEST: maya-2024 arnold-7 pipeline-tools
maya-2024 requires python-3.9|3.10
arnold-7 requires maya-2023+
pipeline-tools requires python-3.11+
>>> KONFLIKT: python-3.9|3.10 (z maya-2024)
vs python-3.11+ (z pipeline-tools)
Taki komunikat, choć techniczny, jest dokładnie tym, czego potrzebuje Pipeline TD (Rozdział 21), żeby zdiagnozować problem w minutę zamiast godzin — wskazuje precyzyjnie, które dwa pakiety trzeba zaktualizować albo poluzować, żeby żądanie w ogóle dało się rozwiązać.
Kiedy solver znajdzie zgodny zestaw wersji, Rez buduje z niego kontekst (Rozdział 17) — ustawia zmienne środowiskowe takie jak PATH (gdzie szukać uruchamialnych programów) i PYTHONPATH (gdzie szukać modułów Pythona), tak żeby wskazywały dokładnie na rozwiązane wersje, i uruchamia w tym środowisku nowy proces — sesję Mayi, powłokę terminala, zadanie farmy. Ponieważ pełne rozwiązywanie dużego zestawu pakietów bywa kosztowne obliczeniowo, popularne, powtarzalne kombinacje (jak „standardowe środowisko showu X") są zwykle cache'owane, więc kolejne żądanie tego samego zestawu wraca niemal natychmiast, zamiast przeliczać solver od zera.