- Shipped
- August 15, 2026 at 5:54 AM UTC
- Author
- Kamo
- Commit
- 948ea43
**************** judges all three flags every time, so an update path had no way to say "this request does not touch tobacco". Callers filled the gap by re-deriving the missing flags from the stored row — which turns the check into a re-audit of data the caller never sent. An org whose stored flags disagree with its applied model then cannot save ANYTHING. Found 2026-08-14 on KamoCRM Inc.: is_alcohol, is_tobacco and is_firearms all true under an all-NOT_ALLOWED master model, so every PUT /org/{id} answered 403 "Alcohol-related content is not permitted by the applied security model" — including a request whose only field was a logo colour. That refusal never remediated the stored violation; it just made the endpoint unusable, with an error naming a subject the caller had not mentioned. **************** takes Booleans, where null means "not being changed" and is skipped. This narrows what is EXAMINED, never what is permitted: a request that actually sets a forbidden flag is still refused, and the primitive form stays for the create path, where all three flags genuinely are being set for the first time. The class doc already scoped these policies to "org ATF booleans on child create". assertAgeRangeAllowed already returned early on a null age, so the update path can express the same "not being changed" idea there with no new method.