design: interConflict silently skips conditional profiles — static conflict detection is incomplete #24
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
DSL.Validate.interConflictfilters out all conditional profiles before checking for enable/disable conflicts:This means a conditional profile that enables a service and an unconditional profile that disables the same service pass validation without error — even if the condition is always true at runtime.
Example
If steam is always running, the executor receives conflicting instructions for
fooon every activation cycle.Rationale (current design)
The filter is intentional: two profiles that are never simultaneously active cannot conflict at the static level, so deferring to the runtime scheduler is correct for the general case. This is tested and documented via the existing test case.
What is missing
interConflictorvalidateexplaining why conditional profiles are excluded. A reader unfamiliar with the design assumption (at-most-one-active) will find the filter surprising.Suggestion
At minimum, add a comment in
interConflictexplaining the mutual-exclusion assumption. Long-term, consider adding aMutuallyExclusiveprofile relationship declaration that enables static conflict checks for declared-exclusive conditional profiles.