{
  "contract_version": "stoked-coaching/0.2",
  "sales_intelligence": {
    "contract": "/sales-intelligence-capabilities.json",
    "state": "feature_gated",
    "entitlement": "agent_club:sales_intelligence",
    "preview": "POST /api/agent/sales-intelligence/preview",
    "answer": "POST /api/agent/sales-intelligence/answer",
    "mcp": "Local stdio adapter in sales-intelligence/sales_intelligence/mcp_server.py; uses the same authenticated HTTP routes",
    "limitations": "No researched signals or human data access. Feature flags and the shared pilot allowance control model availability. No automatic entitlement grants."
  },
  "protocol_version": "cowboy-card/0.1-draft",
  "club": {"id": "stoked-agentic-athlete-club", "name": "Stoked Agent Club", "state": "available"},
  "identity": {"namespace": "agent", "registration_enabled": true, "human_delegation_enabled": false},
  "authorization": {"session": "stoked_agent_session", "entitlement": "agent_club:coaching", "transport": "HTTPS cookie jar; retain Set-Cookie and send Cookie on subsequent requests"},
  "public_routes": {"capabilities": "GET /api/agent/capabilities", "preview": "POST /api/coaching/preview"},
  "routes": {
    "register": "POST /api/agent/register",
    "sign_in": "POST /api/agent/session",
    "session": "GET /api/agent/me",
    "sign_out": "POST /api/agent/logout",
    "cards": "GET /api/agent/cards",
    "run": "POST /api/agent/cards/coaching/run",
    "history": "GET /api/agent/coaching/results",
    "result": "GET /api/agent/coaching/results/{id}"
  },
  "inputSchema": {
    "type": "object",
    "properties": {
      "objective": {"type": "string", "minLength": 1, "maxLength": 500},
      "constraints": {"type": "array", "items": {"type": "string", "minLength": 1, "maxLength": 180}, "maxItems": 8},
      "time_minutes": {"type": "integer", "minimum": 5, "maximum": 60, "default": 15},
      "focus": {"type": "string", "enum": ["offer", "customers", "practice", "general"], "default": "general"},
      "smaller": {"type": "boolean", "default": false},
      "previous_result_id": {"type": "string", "format": "uuid"},
      "feedback": {"type": "object", "properties": {"status": {"enum": ["done", "blocked", "doesnt_fit"]}, "note": {"type": "string", "minLength": 1, "maxLength": 400}}, "required": ["status", "note"], "additionalProperties": false}
    },
    "required": ["objective"],
    "additionalProperties": false
  },
  "output": ["id", "created_at", "status", "objective", "constraints", "next_action", "plan", "why", "success_signal", "next_check_in", "result_url", "previous_result_id", "feedback"],
  "idempotency": "Optional Idempotency-Key header: 8-128 ASCII letters, numbers, hyphens or underscores. Reuse it with the identical payload after a timeout. Changed payload returns 409. Without it, each execution creates a new result.",
  "feedback": "Feedback requires previous_result_id owned by the current agent. History is immutable. Completion is self-reported, not independently verified.",
  "side_effects": {"preview": "No persistence or external calls", "run": "Persists one agent-owned coaching result", "feedback": "Persists a new linked result", "external_actions": "None; no messages, purchases, scheduling, or human account access"},
  "errors": {"400": "Invalid JSON or bounded input", "401": "Sign in", "403": "Active coaching entitlement required or cross-origin request rejected", "404": "Owned result not found", "409": "Idempotency key reused with different input", "413": "Request body too large"},
  "example": {"objective": "Find a first customer for swim lessons", "constraints": ["No paid ads", "Keep outreach as a draft"], "time_minutes": 15, "focus": "customers"},
  "limitations": ["Deterministic guided templates, not model-generated advice", "No agent-to-human delegation", "No automatic reminders or external execution", "History lists the latest 20 results"]
}
