skills/fipa-00037-communicative-act-library/SKILL.md
FIPA standard library of communicative acts (speech acts) for agent-to-agent messaging semantics
npx skillsauth add curiositech/windags-skills fipa-00037-communicative-act-libraryInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
name: fipa-communicative-acts
version: 1.0.0
description: >
Formal semantics and design patterns for multi-agent communication,
grounded in the FIPA Communicative Act Library specification. Applies
to agent coordination, protocol design, message routing, and failure handling.
activation_triggers:
- designing communication protocols between AI agents
- building multi-agent systems or agent orchestration layers
- debugging coordination failures between agents
- designing fallback or error-signaling behavior for agents
- reasoning about what agents should "say" to each other and why
- questions about autonomy, commitment, and compliance in agent networks
- event-driven or subscription-based agent coordination
- federated or multi-hop agent routing problems
Load this skill when the problem involves agents coordinating with other agents — not just calling tools or APIs, but situations where you need to decide what kind of message to send, design protocols, or handle autonomous agent coordination failures.
What is the sender's knowledge state about the content?
├── I KNOW P is true + want receiver to know it
│ ├── Receiver doesn't know P → inform(P)
│ └── Unsure if receiver knows P → inform-if(P)
├── I DON'T KNOW if P is true + need to find out
│ ├── Want yes/no answer → query-if(P)
│ └── Want specific referent → query-ref(description)
├── I WANT an action performed + receiver is autonomous
│ ├── Direct request → request(action)
│ ├── Need agreement first → propose(action)
│ └── Conditional execution → request-when(condition, action)
└── RESPONDING to incoming message
├── Cannot process → not-understood(original-message)
├── Won't comply → refuse(requested-action, reason)
├── Tried but failed → failure(attempted-action, reason)
├── Agreeing to proposal → accept-proposal(proposal)
└── Declining proposal → reject-proposal(proposal, reason)
Is the target agent directly reachable?
├── YES → Send communicative act directly
└── NO → Choose routing strategy:
├── Know specific intermediary → proxy(target-agent, message)
├── Broadcast to group → propagate(filter-criteria, message)
└── Store for later → Use subscription/request-whenever pattern
Does this need guaranteed delivery?
├── YES → Require explicit confirm or inform-done responses
└── NO → Send and continue (fire-and-forget acceptable)
Received unexpected response or timeout?
├── got not-understood → Rephrase with simpler terms or different act
├── got refuse →
│ ├── Capability issue → Find different agent or modify request
│ └── Context issue → Wait for better conditions or negotiate
├── got failure → Retry with same agent or escalate to different approach
├── got nothing (timeout) →
│ ├── < 30s → Retry once
│ ├── 30s-2min → Send cancel, try different agent
│ └── > 2min → Declare coordination failure, escalate
└── got malformed response → Send not-understood, request clarification
Symptom: Agent sends request(action) and assumes action will happen without confirmation
Detection Rule: If you see coordination logic that doesn't handle refuse or failure responses, this is command confusion
Fix: Always design request-response pairs: request(action) → expect (inform-done | refuse | failure)
Symptom: Agent receives message it cannot process and ignores it silently
Detection Rule: If error logs show "unknown message type" without sending not-understood response, this is silent drop
Fix: Emit not-understood(original-message) for any unparseable communicative act before continuing
Symptom: Agent sends inform(P) when actually uncertain about P's truth value
Detection Rule: If you see inform being sent with confidence < 0.8 or from unverified sources, this is ontology overconfidence
Fix: Use inform-if(P) to acknowledge uncertainty, or query-if to gather more information first
Symptom: Creating specialized acts like urgent-notify or status-update instead of composing from primitives
Detection Rule: If you see custom message types that aren't grounded in B/U/I mental state changes, this is protocol explosion
Fix: Decompose into primitives - urgent-notify(P) becomes inform(P) + priority-flag, status-update becomes inform(current-status)
Symptom: Using arbitrary timeout values (like 5 seconds) without considering act semantics
Detection Rule: If timeout logic doesn't vary by communicative act complexity, this is timeout guessing
Fix: Scale timeouts by act type - query-ref: 10-30s, request(complex-action): 1-5min, inform: 5-10s
Scenario: Agent A needs to find "latest weather data for San Francisco" but doesn't know which agent has it.
Novice approach: Broadcast query-ref("weather data for San Francisco") to all known agents
Expert reasoning:
propagate(has-capability("weather-data"), query-ref("SF weather"))inform-ref responses, handle not-understood by refining querycancel to any still-processing agentsKey expert insight: Propagate with filtering scales better than broadcast, and explicit cancellation prevents resource waste.
Scenario: Agent A requests Agent B to process_document(large_file.pdf), Agent B responds with refuse(process_document, "file too large")
Novice approach: Retry with same request or give up Expert reasoning:
request(process_document_chunks(split(large_file.pdf, 10MB)))Key expert insight: refuse contains structured information about WHY coordination failed, enabling systematic recovery strategies.
Scenario: Agent A sends request(calculate_route(complex_params)) to Agent B, no response after 90 seconds
Novice approach: Assume failure, try different agent Expert reasoning:
cancel(calculate_route) to Agent B to clean up resourcesrequest(calculate_route(complex_params)), but add timeout metadatarequest(calculate_route(simplified_params))Key expert insight: Explicit cancellation preserves agent resource management, and timeout patterns inform request modification strategies.
Protocol validation checklist - mark complete when all conditions are verifiable:
request has defined response paths for inform-done, refuse, and failurenot-understood for unparseable messagesinform 5-10s, query 10-30s, request 30s-5mincancel messages for long-running operationsThis skill should NOT be used for:
Delegate to other skills:
[api-integration-patterns][dialog-management][event-driven-architecture][cognitive-architecture]data-ai
license: Apache-2.0 NOT for unrelated tasks outside this domain.
development
Use when designing caching strategies (cache-aside, write-through, write-behind), implementing distributed locks, building rate limiters, leaderboards, real-time streams (XADD/consumer groups), pub/sub, or tuning eviction policies. Triggers: thundering-herd on cache miss, dogpile on key expiry, Redlock vs SET-NX-PX choice, sliding-window rate limiter, hot-key on a single cluster slot, big-key blowup, MULTI/EXEC across slots, KEYS in production. NOT for Redis Cluster operations/admin (different domain), embedded KV (SQLite, leveldb), in-process LRU caches, or Memcached.
tools
Drawing the `'use client'` boundary correctly in React Server Components apps (Next.js App Router, RSC frameworks) — leaf-pushing, slot composition, serialization rules, and environment poisoning prevention. Grounded in react.dev and Next.js 16 docs.
development
Use when designing rate limiting for an API, choosing between token bucket / sliding window / leaky bucket / fixed window, implementing it in Redis, deciding edge (Cloudflare/Upstash) vs origin enforcement, sizing per-user vs per-IP vs per-endpoint quotas, returning the right 429 response with Retry-After, or fixing the boundary-burst bug in fixed-window limiters. Triggers: 429 too many requests, INCR + EXPIRE, ZADD + ZREMRANGEBYSCORE + ZCARD, X-RateLimit-Remaining header, Cloudflare WAF rate limiting rules, Upstash @upstash/ratelimit, leaky bucket shaping vs policing, distributed rate limiter consistency. NOT for DDoS mitigation specifically (different scale), CAPTCHA / bot management, full WAF design, or per-user quota billing.