diff --git a/mateclaw-server/src/main/java/vip/mate/skill/controller/SkillController.java b/mateclaw-server/src/main/java/vip/mate/skill/controller/SkillController.java
index 4e5037c7..0313762f 100644
--- a/mateclaw-server/src/main/java/vip/mate/skill/controller/SkillController.java
+++ b/mateclaw-server/src/main/java/vip/mate/skill/controller/SkillController.java
@@ -9,6 +9,7 @@ import vip.mate.common.result.R;
import vip.mate.agent.AgentService;
import vip.mate.agent.binding.model.AgentSkillBinding;
import vip.mate.agent.binding.repository.AgentSkillBindingMapper;
+import vip.mate.agent.binding.service.AgentBindingService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import vip.mate.agent.model.AgentEntity;
import vip.mate.skill.lessons.SkillLessonsService;
@@ -48,6 +49,7 @@ public class SkillController {
private final SkillLessonsService lessonsService;
private final AgentSkillBindingMapper agentSkillBindingMapper;
private final AgentService agentService;
+ private final AgentBindingService agentBindingService;
@Operation(summary = "获取技能分页列表(RFC-042 §2.1)")
@GetMapping
@@ -230,35 +232,84 @@ public class SkillController {
// ==================== Reverse lookup (RFC-090 §7) ====================
/**
- * RFC-090 §7 — list agents (employees) currently bound to this
- * skill so the skill card can render "Used by N employees" with a
- * click-through. Returns lightweight {id, name, icon} rows; the
- * full agent object would balloon the card payload.
+ * RFC-090 §7 / §14.2 — list agents (employees) for which this
+ * skill is reachable.
+ *
+ *
Two coverage paths, both reflected in the response:
+ *
+ * - Explicit — there's a {@code mate_agent_skill} row
+ * with this skill id and {@code enabled=true}.
+ * - Implicit — the agent has no explicit skill binding
+ * at all ({@code AgentBindingService.getBoundSkillIds}
+ * returns null), which the three-state contract treats as
+ * "use every globally-enabled skill". Most users never wire
+ * explicit bindings, so without this branch the count was
+ * always zero even for skills clearly visible to the LLM.
+ *
+ *
+ * Each row carries {@code binding: "explicit" | "implicit"} so
+ * the UI can label the relationship.
*/
- @Operation(summary = "List agents bound to this skill (RFC-090)")
+ @Operation(summary = "List agents that can use this skill (RFC-090 §14.2)")
@GetMapping("/{id}/employees")
public R>> employees(@PathVariable Long id) {
- List bindings = agentSkillBindingMapper.selectList(
+ // Explicit bindings: agent_skill rows pointing to this skill.
+ List explicitBindings = agentSkillBindingMapper.selectList(
new LambdaQueryWrapper()
.eq(AgentSkillBinding::getSkillId, id)
.eq(AgentSkillBinding::getEnabled, true));
- List