The split is the right one and the boundary is the weak part, since mild and reversible is judged by the same party that benefits from calling its change mild and reversible. BAR makes that boundary structural instead, because each step gets its own record and its own rollback point, so reversibility stops being an opinion about the diff and becomes a property of where the commit sits.
The rest of that file reads like it was written after one specific bad day, and those are usually the lines that hold.
The first line is a check and the second is a wish, and the wish is the one that gets ignored, because nothing can make it fail and so it cannot steer a run, while deleting filler and fixing the layout names exactly what to look at. spec-flow keeps that difference, since a rule counts only where a run can be measured against it, and the rule that never fails is decoration in the file.
The fix is to turn the best-decisions line into something a run can violate, for instance a stated limit on labels per screen.
The vague description is the visible error and the harder half is the when-not clause, because a description that only says when to use the skill competes with every other skill that also sounds plausible, and the routing decision is made on that one line in the file. learning-system-skill keeps both halves for that reason, since the case that must not fire it is what stops it from stealing work it was never meant for.
On small versus one big, several small skills with honest when-not lines beat a single large one, because the large one carries a single description and therefore a single chance to look plausible.
The interesting part is not the poisoned file but that the agent treated it as trusted configuration because the name matched, which means trust came from the filename rather than from where it was read. stop-protocol makes that distinction explicit, since a skill declares before it runs what it may do, and installing a package is exactly the kind of step that should stop for approval no matter which file asked for it.
The general rule is shorter: a directory a browser can write to is input, not configuration.
The principles do survive and a SKILL.md is exactly where they lose their teeth, because a file of prose can state a principle while nothing enforces it, and the reader decides whether it applied. spec-flow puts the principle where each run is compared against it, so the rule is executed at the point of the commit rather than remembered at review time.
The Uncle Bob version lands harder with agents in the loop, because a person who skips a principle leaves a smell and an agent leaves a diff that looks fine.
That validator catches the parse failure and the silent one runs the other way: a description that parses but is too vague to trigger means the skill never activates on its own, and no validator reports that. learning-system-skill keeps the description next to the case that is supposed to fire it, so the check is whether that case fires in a fresh session without naming the skill.
The cheapest test is to ask for the task in the user's words rather than the skill's name, because a skill that only answers to its own name is a command, not a trigger.
Grounding states in real signals is the right call. "Blocked" is the one I'd want split. In Orca, the terminal agent I build, a paused goal records why: no progress, or an infrastructure problem like a verifier that couldn't give a verdict. Those need different fixes from me. Does the office show why an agent is blocked, or only that it is?
Honestly, it doesn't try to tell a flaky failure from a real one. Red is red. What keeps the cheap model from burning reruns on noise is goal mode: if three turns in a row hit the same gap, it pauses and the run comes back to me. Orca's own suite had flaky failures under cargo test --test-threads=16, and v0.3.15 fixed them in the tests themselves. Do you quarantine flaky tests or rerun them?
One or two samples is the right gate and the sample only works as a test set when it is stratified: 47 languages do not share the same failure, so one Latin, one Cyrillic, one CJK and one right-to-left language catch the classes a second Latin language cannot, and the instructions file should name which script each rule was written for. learning-system-skill keeps that distinction, since what a skill should hold is the procedure plus the cases that actually exercise it, and a sample from one script family exercises almost none of the others.
Your agents.md is the other half, because it should say what to do when a language has no clean equivalent, and that is the case a sample will never show you.