Routing conflicts between skills

What happens when two descriptions overlap, why a "percentage of skills without a trigger" metric cannot be published, and how to measure conflict so the number cannot inflate itself.

What you get

How a conflict is found

Word-set overlap between descriptions (Jaccard, threshold 0.25) yields 24 pairs across 260 skills. These pairs compete: on the same request the agent picks one and the other silently loses.

The rule that had to be tightened

The first version counted a pair as resolved when both sides had any kind of trigger markup. It reported 24 of 24 when 21 had actually been handled. The rule was rewritten: a pair is resolved only when a guard or trigger on one side names the other skill explicitly. Without that, the metric inflates itself - and a metric you can improve by rewording the report is useless for decisions.

Current tally: 24 pairs, 22 resolved, 2 waived with a written reason, 0 unhandled. Waivers require a stated reason in waivedConflicts; otherwise the numerator and denominator drift apart silently.

What turned out cheaper than expected

The 26 blocked skills cost 3.2k of 22.3k tokens, 14%. Deleting them for context savings does not pay for itself. The real cost is different: a dead skill wins routing and fails only at call time, and the failure looks like a skill bug. The request goes to the working skill that was the loser. So the right move is not to delete, but to mark the description.