(OH 1.x and OH 2.x Rules DSL only] Why have my Rules stopped running? Why Thread::sleep is a bad idea

Why have one Rule per light? Why not have one Rule for ALL lights? That should be your goal. See Design Pattern: DRY, How Not to Repeat Yourself in Rules DSL for several techniques to achieve generic Rules. If you have generic Rules you eliminate the need for global lambdas entirely and end up with more scalable and easier to maintain Rules. They tend to be shorter and easier to read as well.

You should absolutely not have duplicate code in any Rules. But there are “safer” ways to achieve that than using global lambdas. See the Lambdas section of that link for some of the big problems with using global lambdas.

If you are a developer already you almost certainly will be happier there.

Not true. But the Rules DSL is very opinionated about how it wants you to write your Rules and when you deviate from the “preferred” approach it gets really hard and doesn’t work out so well for you. But if you work to make generic Rules instead of generic functions, there is almost nothing you cannot accomplish and accomplish well using the Rules DSL. If you have lots of global lambdas, you are probably fighting against the language. If you have lots of locks and hashmaps and the like you are probably fighting against the language. If you have lots of Items and lots of Group and lots of Rules with Member of triggers, you are probably coding in a way the Rules DSL likes.

I find that people who already have programming experience can not or will not bend their coding style to the language and end up being much happier with one of the JSR223 languages. You may be one such developer.