Description
.github/workflows/fray-unit-tests.yaml uses a paths-filter that only runs fray tests when files under lib/fray/**, uv.lock, or the workflow itself change. Because fray depends on iris (lib/fray → lib/iris per AGENTS.md), changes to iris can break fray tests without CI noticing — on main or on the iris-only PR that caused the break.
Concrete instance: iris commit cf05d94ee (2026-04-12, "Enforce constraint/attribute case-normalization via AttributeValue") changed Constraint to store values: tuple[AttributeValue, ...] with no .value attribute. Five assertions in lib/fray/tests/test_v2_iris.py (TestConvertConstraints, TestConvertConstraintsDeviceAlternatives) started failing against the new API but went unnoticed on main for two days. The break only surfaced on PR #4725, which touched fray.
Definition of Done
- Fray tests run in CI on any change that can affect them (at minimum:
lib/iris/** in addition to the existing paths), OR
- A justification is documented for why cross-layer breakage is acceptable to discover only on the next fray-touching PR.
- Same review applied to other per-subproject workflows with
paths-filter that skip on upstream-layer changes (zephyr, marin, levanter) if the same pattern exists.
Description
.github/workflows/fray-unit-tests.yamluses apaths-filterthat only runs fray tests when files underlib/fray/**,uv.lock, or the workflow itself change. Because fray depends on iris (lib/fray→lib/irisper AGENTS.md), changes to iris can break fray tests without CI noticing — on main or on the iris-only PR that caused the break.Concrete instance: iris commit
cf05d94ee(2026-04-12, "Enforce constraint/attribute case-normalization via AttributeValue") changedConstraintto storevalues: tuple[AttributeValue, ...]with no.valueattribute. Five assertions inlib/fray/tests/test_v2_iris.py(TestConvertConstraints,TestConvertConstraintsDeviceAlternatives) started failing against the new API but went unnoticed on main for two days. The break only surfaced on PR #4725, which touched fray.Definition of Done
lib/iris/**in addition to the existing paths), ORpaths-filterthat skip on upstream-layer changes (zephyr, marin, levanter) if the same pattern exists.