<p>The early Jabber community was a hotbed of innovation and experimentation. Although the community produced a large number of interesting protocols and technologies, not all of them were widely adopted. For example, server-side message filtering (implemented in the mod_filter module of the &jabberd; server) was one promising technology that simply did not scale up beyond a few hundred concurrent users. Another potentially helpful technology (though even less well-known) was that of the "Instant Messaging Intelligence Quotient" (IM IQ) as defined by the 'jabber:iq:iq' protocol. For the sake of historical completeness, this specification provides canonical documentation of that protocol.</p>
<section1topic='Concepts and Approach'anchor='concepts'>
<p>It is a harsh reality of the modern Internet that plenty of stupid people have found their way onto today's communication networks (email, Usenet, IM, and the like). Because the early Jabber developers were your typically elitist geeks (whose mantra seems to have been "not everyone can be as smart as we are"), they sought to shield themselves from the inevitable emergence of dumb Jabber users.</p>
<p>At the same time, recognizing the wisdom of the age-old saying "to err is human", they knew that even normally intelligent people sometimes say appallingly stupid things. In fact, such normally intelligent people (well, okay, geniuses) might be the developers themselves! Thus they sought to build protective measures into Jabber servers so that they could avoid appearing dumb.</p>
<p>The early Jabber developers sought to achieve both of these objectives through the design of server-side intelligence detection systems using dedicated protocol elements qualified by the 'jabber:iq:iq' namespace. This protocol implements procedures for discovering, monitoring, and getting feedback on the intelligence of one's own instant messages, as well as that of other users on the network. The "IM IQ" of each user is determined by server-side parsing of messages sent by all registered users of a server, using advanced linguistic analysis techniques (as described under <linkurl='#impl'>Implementation Notes</link> below) enforced by the mod_iq jabberd module.</p>
</section1>
<section1topic='Use Cases'anchor='usecases'>
<section2topic='Discover Another User's IM IQ'anchor='disco-other'>
<p>Before chatting with another user over the network or adding that user to one's Jabber roster, it can be helpful to get a sense of how intelligent or unintelligent that person is. This is done by requesting the person's IM IQ from that person's server by sending an IQ get qualified by the 'jabber:iq:iq' namespace to the person's bare JID (user@host) rather than full JID (similar in this regard to the functionality of &xep0054;).</p>
<examplecaption='Requesting Someone's IM IQ'><![CDATA[
<iqtype='get'
from='kindanormal@example.com/IM'
to='stupidnewbie@example.com'
id='imiq1'>
<queryxmlns='jabber:iq:iq'/>
</iq>
]]></example>
<p>The server then returns the person's IM IQ, expressed as a REQUIRED <num/> integer between zero and 256, and an OPTIONAL <desc/> containing a natural-language descriptive phrase associated with that range of integer values.</p>
<examplecaption='Receiving Someone's IM IQ'><![CDATA[
<iqtype='result'
from='stupidnewbie@example.com'
to='kindanormal@example.com/IM'
id='imiq1'>
<queryxmlns='jabber:iq:iq'>
<num>66</num>
<desc>moron</desc>
</query>
</iq>
]]></example>
</section2>
<section2topic='Discovering One's Own IM IQ'anchor='disco-own'>
<p>In order for a user to discover his or her own IM IQ, the user sends an IQ get without any 'to' address.</p>
<examplecaption='Requesting One's Own IM IQ'><![CDATA[
<iqtype='get'id='myiq'>
<queryxmlns='jabber:iq:iq'/>
</iq>
]]></example>
<examplecaption='Receiving One's Own IM IQ'><![CDATA[
<iqtype='result'id='myiq'>
<queryxmlns='jabber:iq:iq'>
<num>83</num>
<desc>dull</desc>
</query>
</iq>
]]></example>
<p>A user may not agree with his or her IM IQ as computed by the server (after all, everyone thinks they are above average). Therefore it is possible that a user may attempt to change his or her IM IQ by sending an IQ set to the server:</p>
<examplecaption='Attempting to Set One's Own IM IQ'><![CDATA[
<iqtype='set'id='myiq'>
<queryxmlns='jabber:iq:iq'>
<num>143</num>
<desc>genius</desc>
</query>
</iq>
]]></example>
<p>However, allowing users to change their own IM IQs is unacceptable, since it would make such information unreliable. Therefore, if a server receives such an IQ set, it MUST return a ¬allowed; error to the user, and MAY further decrement the user's IM IQ as a result.</p>
<examplecaption='Server Returns Error to User on Attempted Set'><![CDATA[
<p>Even smart people say stupid things, and we are all familiar with the experience of having said something stupid (or just average) and realizing later that one could have said something exceedingly clever. To prevent people from saying stupid things and to help users appear as smart as possible, the mod_iq jabberd module provides hints to users regarding what to say at a given point in a conversation, based on the advanced linguistic analysis technologies described under <linkurl='#impl'>Implementation Guidelines</link> below. A user can ask for a hint by sending the complete message to the server itself, wrapped in a &QUERY; element qualified by the 'jabber:iq:iq' namespace. (While it may be argued that this functionality could be provided client-side, thus saving a roundtrip, it is consistent with the Jabber philosophy of "smart servers, dumb clients" as explained in &xep0134;.)</p>
<examplecaption='Requesting IM IQ Information'><![CDATA[
<iqtype='get'
from='kindanormal@example.com/IM'
to='example.com'
id='hint1'>
<queryxmlns='jabber:iq:iq'>
<messageto='stupidnewbie@example.com'>
<thread>some-thread-id</thread>
<body>d00d, u r dum -- RTFM, OK?</body>
</message>
</query>
</iq>
]]></example>
<p>The server then determines a more intelligent message to send and returns the XML character data of the &BODY; element to the user in a <hint/> element.</p>
<examplecaption='Server Hints at a More Intelligent Message'><![CDATA[
<iqtype='result'
from='example.com'
to='kindanormal@example.com/IM'
id='hint1'>
<queryxmlns='jabber:iq:iq'>
<hint>
I've heard that there's this thing called the Internet, which
contains incredible amounts of helpful information. Have you considered
using it?
</hint>
</query>
</iq>
]]></example>
<p>Messages checked with the server before sending SHOULD NOT affect the user's IM IQ computation; however, the server MAY decrement the user's IM IQ more significantly if the user ends up sending the original message rather than the smarter one provided by the server.</p>
<p>The mod_iq jabberd module uses somewhat out-of-date terminology for intelligence levels <note>See, for example, D. Wechsler, <cite>The Measurement of Adult Intelligence</cite> (Baltimore: The Williams and Wilkins Company), 1944.</note>, as shown in the following table.</p>
<tablecaption='Intelligence Ranges and Descriptions'>
<p>While once common, these terms are now considered politically incorrect. However, please note that this specification merely provides informational documentation of a protocol historically used within the Jabber community, and is not intended to stereotype individuals in any manner whatsoever. A given server implementation of the 'jabber:iq:iq' protocol MAY substitute more modern ranges and terminology if desired or leave out the descriptive phrases entirely, and a given client implementation MAY rename or disguise the descriptive phrases.</p>
<p>That said, it is true that many people on the Jabber network do act like morons, imbeciles, and even idiots.</p>
</section2>
<section2topic='Determination of IM IQ'anchor='impl-determination'>
<p>Using the methods described in the next section, the mod_iq jabberd module assigns and dynamically updates a person's IM IQ based on all the messages sent by the user. Upon registration, each user is assigned a baseline IM IQ of 100 ("intelligent until proven an idiot"), unless the user made errors in the registration process or chose an especially stupid password (e.g., "password"), in which case the initially assigned IM IQ could be as low as 70 ("borderline deficiency"). In a manner similar to server-side "karma" ratings, the IM IQ is then modified dynamically based on the semantic value of the user's outbound messages, up to a high of 256 or down to a low of zero (0).</p>
<p>IM IQ is determined based on a user's actual message traffic only, not on other factors such as inane presence status text or the contacts added to the user's roster. While the latter functionality might have been useful, it would violate the rule of not assigning guilt based on association.</p>
<p>The mod_iq jabberd module makes use of several Analytical Language Engine (ALE) technologies for determining the intelligence of specific messages and thus also a user's IM IQ (the average of all messages sent). These technologies include the following:</p>
<ul>
<li>Phrasal Objectification of Realtime Threads (PORT) -- this is a parsing technique for breaking conversation threads into meaningful phrases, even across message boundaries.</li>
<li>Bayesian Estimation of Entropic Responses (BEER) -- within information theory, entropy is a measure of the rate of information transfer; this technique uses Bayesian estimation methods to determine whether a given message imparts useful information or not.</li>
<li>Situational Analysis of Kladistic Evolution (SAKE) -- kladistics (also spelled "cladistics"), from the Greek "klados" (meaning "branch"), is the study of grouping things into branches that diverge from a common origin; it is used in biology to study descent from a common ancestor, and also in the study of conversation threads to determine how a conversation would evolve depending on things said (or messages sent) at any point in the conversation flow.</li>
<li>Semantic Correlation and Observation of Truth in Conversation Handling (SCOTCH) -- a person may seem intelligent to the casual observer, but his or her messages may actually not provide deep insights or even track reality in a useful or consistent fashion; this technique builds on early semantic web insights to determine the truth value of a given message within the context of a realtime conversation.</li>
<li>Webs of Intelligent Network Endpoints (WINE) -- any given person can engage in conversations with a large number of interlocutors, yet that person's status as an intelligent network endpoint is influenced by reputational factors across the full web of linguistic interactions, not just with any one person; this technique accounts for such reputational effects to paint a complete picture of the person's perceived intelligence across the network.</li>
</ul>
<p>Naturally, because of the powerful and potentially unpredictable effects of these technologies, development of mod_iq was restricted to senior developers on the jabberd team, or at least (for developers in the U.S.) those over the age of 21. <note>See Title 23, Chapter 1, Subchapter 1, Section 158 of the United States federal legal code as enacted by the National Minimum Drinking Age Act of 1984 <<linkurl='http://www.law.cornell.edu/uscode/23/158.shtml'>http://www.law.cornell.edu/uscode/23/158.shtml</link>>.</note></p>
<p>The descriptive phrases for various intelligence levels SHOULD be localized based on the user's preferred language; however, if the server does not support the 'xml:lang' attribute, this localization MAY be performed by the client.</p>
<p>Most people become somewhat insecure when they realize that in fact they are not as smart as they thought they were; for this reason, querying the server for one's own IM IQ is NOT RECOMMENDED on a regular basis.</p>