Files
claude-skills/.wiki/concepts/delegate-task-negative-trigger-fp.md
vitya 951bc62c04 docs(wiki): capture session-inbox-monitor received-msg FP as concept
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>
2026-06-17 11:28:31 +03:00

3.3 KiB
Raw Blame History

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.