Project skill toggles are persisted as signed paths such as -api/api-versioning/SKILL.md. The Skills view resolves those paths relative to a skill body beneath skills/, but the session override resolver also accepted a bare skill-name match. After a plugin moved a body from skills/api-versioning/SKILL.md to skills/api/api-versioning/SKILL.md, an old -api-versioning/SKILL.md entry no longer matched the view yet still excluded the session skill because pi exposed skill.name === "api-versioning".
Solution
Session allow, exclusion, and disabled-diagnostic matching now use the same canonical identity as the Skills view: the complete body-relative path beneath the final skills/ segment. Absolute patterns continue to match exact file paths. A flat name/SKILL.md pattern remains compatible only when the discovered body path is itself flat; it cannot match a categorized category/name/SKILL.md body merely by sharing the final directory name.
Prevention
Treat stored setting keys as identities, not labels: compare the complete normalized path at every reader.
When a layout changes, test every reader of the persisted key, including session assembly and diagnostics, not only the UI display.
Preserve legacy compatibility only where the legacy key still identifies the current on-disk path; otherwise ignore it consistently rather than allowing one reader to honor it.