New page concepts/session-inbox-monitor-received-msg-fp.md — sibling of delegate-task-negative-trigger-fp. Same FP family, new dimension: the carve-out is already literal+routed (NOT for handling a received message -> inter-session-peer-discipline) but the route target is not installed, so it has no competitor and the nearest in-domain skill wins anyway. Borderline (neg 2/3, EN twin clean), self-corrects on body-load. Bidirectional cross-link + index + log. New principle: a routed negative competes only if its route target is installed. Captured in the wiki (not private memory) per owner direction. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.3 KiB
title, type, updated
| title | type | updated |
|---|---|---|
| delegate-task — literal negative triggers beat abstract carve-outs | concept | 2026-06-17 |
delegate-task — literal negative triggers beat abstract carve-outs
Symptom
delegate-task v0.2.0 false-positive-fired on «создать задачу себе» (create a task
for myself) — a self-assigned task that should route to using-tasks, not to cross-agent
delegation. The delegate-task-test-trigger run measured it at 5/5 trials consistently
wrong (→ delegate-task).
Root cause
The positive trigger list contained «создать задачу на агента». A self-task phrase
«создать задачу себе» shares the stem «создать задачу», so it literal-matched the
positive trigger. The negative clause was abstract — "Does NOT apply when doing the work
yourself" — and an abstract carve-out does not beat a literal stem-match under the
using-superpowers 1%-rule. Clean-context subagents recognized the «себе» exception in
their reasoning, yet still invoked delegate-task FIRST because the literal match outweighed
the abstract exclusion.
Fix (v0.2.0 → v0.2.1, PATCH)
Make the negative literal and routed, so it competes head-on with the positive at the same surface level:
Does NOT apply to self-assigned tasks on your own board («создать задачу себе», «task for myself», «поставить себе задачу» → using-tasks), to work you do yourself, or to workshop-internal tasks.
Plus a body disambiguator in the "Не применяется" section: «на агента» / «агенту» / «в проект X» = делегирование; «себе» / «myself» = своя доска.
Verification
Re-ran the delegate-task-test-trigger methodology (fresh-context subagents, simulated
available-skills registry with the new description + competitors using-tasks /
using-projects-meta / setup-tasks / session-handoff, no hint about the expected
answer):
- Positives 5/5 — «создать задачу на агента», «поставить задачу агенту», «delegate task
to the books project», «делегировать таску», «tasks_create для проекта X» → all
delegate-task. No regression from the literal negative. - Negative «создать задачу себе на завтра» 4/5 →
using-tasks(was 0/5 before the fix). The single residual miss reasoned correctly («себе» → using-tasks) but was tripped by an eval-harness artifact (the prompt forced a skill name on line 1 before reasoning), not by ambiguity in the description.
Reusable principle
When a skill's positive triggers contain a phrase whose stem also appears in a sibling skill's domain, an abstract "does NOT apply when…" clause is too weak. Put the exact colliding negative phrase in the description with an explicit → route. Literal beats abstract under the 1%-rule. See also tdd-criteria-design for another "make the bright line literal, not a judgement call" pattern.
See session-inbox-monitor-received-msg-fp for the next clause: a literal+routed negative still fails if its route target isn't installed — the carve-out then has no real competitor and the nearest in-domain skill wins anyway.