F...... [100%] =================================== FAILURES =================================== ____ test_habitable_roof_keeps_stair_access_and_actual_room_guarantees[x-9] ____ bay = 9, axis = 'x' @pytest.mark.parametrize('bay', (9, 11, 13)) @pytest.mark.parametrize('axis', ('x', 'z')) def test_habitable_roof_keeps_stair_access_and_actual_room_guarantees(bay, axis): design = Blueprint((RoomSpec(0, 0, 0, 'living'),), bay=bay, roof_axis=axis, roof_design=RoofDesign((1, 2)), attic_purpose='bedroom') > scene = lodge_scene(design, 4, garden=False) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ test/test_building_space.py:17: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hearth/lodges.py:51: in lodge_scene scene.compose_choice(adapted('building', design, '/land')) hearth/kernel/scene.py:155: in compose_choice trial._select_child('', choice, Frame(), Scope(self.seed)) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , parent = '' choice = Choice(key='building', candidates=(Child(key='building', component=Building(design=Blueprint(rooms=(RoomSpec(x=0, z=0,...origin=(0, 0, 0), turn=0), bindings=(), seed=None)), score=, tolerance=0.5) frame = Frame(origin=(0, 0, 0), turn=0), scope = Scope(seed=4, key=()) def _select_child(self, parent, choice, frame, scope): accepted = [] rejected = [] path = parent + '/' + choice.key for i, option in enumerate(choice.candidates[:self.limits.search]): trial = self._fork() try: trial._instantiate(path, option.component, option.params, frame.compose(option.frame), option.bindings, parent or None, scope.child(choice.key, option.seed).child(f'alternative-{i}')) trial._check(False, completed_scope=path) accepted.append((choice.score(trial.view, path), i, trial)) except ContractError as exc: rejected.append(exc.diagnostic) if not accepted: rules = {d.rule for d in rejected} if len(rules) == 1 and len(choice.candidates) <= self.limits.search: error = ContractError(next(iter(rules)), path, conditions='All declared alternatives violate the same condition: ' + str(rejected[0])) else: error = SearchExhausted('search-budget', path, conditions=str(rejected)) error.attempts = len(rejected) error.candidates = [d.__dict__ for d in rejected] > raise error E hearth.kernel.errors.ContractError: clearance: /building at None: All declared alternatives violate the same condition: clearance: /building/room-0-0-0/stairs at (5, 12, 7): Protected player headroom is obstructed hearth/kernel/scene.py:359: ContractError =========================== short test summary info ============================ FAILED test/test_building_space.py::test_habitable_roof_keeps_stair_access_and_actual_room_guarantees[x-9] 1 failed, 6 passed in 2.96s