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]tools
Building resilient distributed systems with circuit breakers, retries with full-jitter exponential backoff, retry budgets (per-request 3-attempt + per-client 10% ratio per Google SRE), deadline propagation, and the cascading-failure math (4 layers × 3 retries = 64x amplification). Grounded in Resilience4j, Microsoft Cloud Patterns, AWS Architecture Blog (Marc Brooker), and Google SRE Book.
testing
Designing HTTP cache headers that work correctly across browsers, CDNs, and shared proxies — `Cache-Control` directives per RFC 9111, `stale-while-revalidate` and `stale-if-error` per RFC 5861, the Vary header for varying responses, and surrogate keys for tag-based purging. Grounded in IETF RFCs and Cloudflare/Fastly docs.
development
Use when designing or fixing a Content Security Policy on a real site, choosing between nonce-based and hash-based CSP, adding strict-dynamic, debugging "Refused to execute inline script" errors, deploying CSP in report-only mode first, configuring report-to / report-uri, or auditing an existing policy for unsafe-inline / unsafe-eval / wildcards. Triggers: "CSP blocks legitimate inline script", strict-dynamic, nonce-{RANDOM}, sha256-{HASH}, object-src none, base-uri none, frame-ancestors, Trusted Types, X-Content-Security-Policy obsolete, report-only vs enforced. NOT for general HTTP security headers (HSTS, COOP/COEP), Trusted Types deep dive, CORS configuration, or building a WAF.
tools
Choosing and operating an HTTP API versioning strategy that doesn't break clients — Stripe's date-based pinned versions, the Deprecation/Sunset header pair (RFC 9745 + RFC 8594), URI vs header vs media-type approaches, and the version-transformer pattern. Grounded in Stripe's published architecture and IETF RFCs.