<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<br><div><div>On 2010-02-16, at 13:38 , Michael Bridgen wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">James,</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">As a preface, let me note that 0-9-1 is in part a rationalisation of the specification, and in part an encoding of what brokers actually implement.<span class="Apple-converted-space">&nbsp; </span>0-8 had ambiguities and inconsistencies quite aside from the more obvious mistakes (like the grammar for the protocol header), but what the brokers ended up implementing was by and large consistent.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">If you're planning to implement an AMQP peer, personally speaking I would go for 0-9-1 and forget about 0-8.</div></blockquote><div><br></div>your note, below, refers to rabbitmq's imminent plans. how does this reflect the state and intentions of other brokers?</div><div><br></div><div><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp;Not only has it fewer mistakes, but it is also (or will be soon, see below) a stable point of interoperability.</div></blockquote><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div> <blockquote type="cite"><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">james anderson wrote:</div> <blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">a recently built rabbitmq server server indicates - even to the level<span class="Apple-converted-space">&nbsp; </span>of the response server properties, that it implements "amqp 8-0", but</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">a. if one connects with a 9-1 version token, it does not disconnect.<span class="Apple-converted-space">&nbsp; </span>it proceeds to negotiate the connection.</div> </blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">That is expected behaviour for a 0-8 broker, at the least by some interpretations of the spec - if the client specifies a higher version number than supported by the server then negotiation proceeds with the server sending the version it supports.</div> </blockquote></blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">The protocol negotiation is a bit odd.<span class="Apple-converted-space">&nbsp; </span>In the technical spec (PDF) it says what you have said above; in the XML it adds the rule "The server MUST provide a protocol version that is lower than or equal to that requested by the client in the protocol header."</div></blockquote><div><br></div>i must admit, page-8/lines-3-5 of amqp-xml-doc0-8.pdf resisted comprehension. in the end, however, the second sentence, can be interpreted to restrict the meaning of a lower protocol number to indicate only how far down the broker can go, as that sentence precludes the broker from sending the start command if it can not support the requested - higher - version.</div><div>anyway, i take from your remarks, that other implementors reached different conclusions.</div><div><br><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Hence you can have a negotiation which goes:</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Client: Hi, I would like to use protocol 0-9-1</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Server: Sure!<span class="Apple-converted-space">&nbsp; </span>I support that.<span class="Apple-converted-space">&nbsp; </span>OK, let's use version 0-8</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Client: WTF?</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">So yeah, a bit nuts.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div> <blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">that is to say, page-52/line-38 and the diagrams at page-52/line32 and page-53/line-11 of amqp8-0.pdf are no more a misrepresentation of "accordingly" for a purported r8.0 broker than the indication in `amqp-xml-doc0-8.pdf` that it applies to "AMQ Protocol (major=10, minor=3)"?</div> <blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">NB: the correct protocol header for 0-9-1 is in fact AMQP 0-0-9-1, whereas for 0-8 it is AMQP 1-1-8-0, and for 0-9 it is AMQP 1-1-0-9. Yes, that is crazy.</div> </blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">cool.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">hmmm... what does the ampq 1-1-9-1 protocol header from the r8.0 and the r9.1 specs actually mean?</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">is that what you intended, above, with "AMQP 0-0-9-1"?</div> </blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">In 0-9-1 the protocol header is 'AMQP0091'.<span class="Apple-converted-space">&nbsp; </span>The last four digits are the constant 0 (protocol-id, whatever that is), then the major, minor and revision numbers.<span class="Apple-converted-space">&nbsp; </span>The 0-8 and 0-9 specs gave these digits a different meaning (and the first two were effectively constants).</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">I just tried connecting to a RabbitMQ from default branch and giving a 0-9-1 header, and it wrote AMQP1180 and closed the connection, as specified.<span class="Apple-converted-space">&nbsp; </span>From which branch did you build?</div></blockquote><div><br></div>from the 1.7.1 release.</div><div>i had misunderstood the version-to-header mapping and had, in fact, sent it a 0.9r0 protocol header, not a 0.9r1 header. to wit:</div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 9px/normal Monaco; min-height: 12px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">? (defparameter *c* (make-instance 'amqp:connection :uri "amqp://guest:guest@localhost/"))</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CONNECTION #xF753016&gt;: open-connection: requesting version: #(65 77 81 80 1 1 0 9)/:AMQP-1-1-0-9-1.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CONNECTION #xF753016&gt;: open-connection: byte-zero: 1, updated class to AMQP-1-1-0-9-1:CONNECTION.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CHANNEL [amqp://localhost/].0 #xF757B2E&gt;: process-command: #&lt;CONNECTION #xF753016&gt; #&lt;CONNECTION.START #xF759DEE&gt; . (:VERSION-MAJOR 8 :VERSION-MINOR 0 :SERVER-PROPERTIES (:|product| "RabbitMQ" :|version| "1.7.1" :|platform| "Erlang/OTP" :|copyright| "Copyright (C) 2007-2009 LShift Ltd., Cohesive Financial Technologies LLC., and Rabbit Technologies Ltd." :|information| "Licensed under the MPL.&nbsp; See <a href="http://www.rabbitmq.com">http://www.rabbitmq.com</a>/") :MECHANISMS "PLAIN AMQPLAIN" :LOCALES "en_US")</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CONNECTION #xF753016&gt;: send-method: START-OK . (:CLIENT-PROPERTIES NIL :MECHANISM "PLAIN" :RESPONSE "guestguest" :LOCALE "en_US")</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-style-span" style="font-size: 9px; ">[20100216T123124Z00] DEBUG #&lt;CONNECTION #xF753016&gt;: encoding: CONNECTION.START-OK . (:CLIENT-PROPERTIES NIL :MECHANISM "PLAIN" :RESPONSE&nbsp;"guestguest" :LOCALE "en_US")</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CONNECTION #xF753016&gt;: send-method: #&lt;CONNECTION.START-OK #xF75A34E&gt;&nbsp; #&lt;OUTPUT-FRAME [(+)METHOD|0|c.0|t.0].{CONNECTION.START-OK}[36/4088: 0 10 0 11 0 0 0 0 ... 115 116 5 101 110 95 85 83] #xF75A446&gt;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CHANNEL [amqp://localhost/].0 #xF757B2E&gt;: process-command: #&lt;CONNECTION #xF753016&gt; #&lt;CONNECTION.TUNE #xF75B67E&gt; . (:CHANNEL-MAX 0 :FRAME-MAX 131072 :HEARTBEAT 0)</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CONNECTION #xF753016&gt;: send-method: TUNE-OK . (:CHANNEL-MAX 0 :FRAME-MAX 131072 :HEARTBEAT 0)</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CONNECTION #xF753016&gt;: encoding: CONNECTION.TUNE-OK . (:CHANNEL-MAX 0 :FRAME-MAX 131072 :HEARTBEAT 0)</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CONNECTION #xF753016&gt;: send-method: #&lt;CONNECTION.TUNE-OK #xF75B886&gt;&nbsp; #&lt;OUTPUT-FRAME [(+)METHOD|0|c.0|t.0].{CONNECTION.TUNE-OK}[12/4088: 0 10 0 31 0 0 0 2 0 0 0 0] #xF75A446&gt;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CONNECTION #xF753016&gt;: send-method: OPEN . (:VIRTUAL-HOST "/")</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CONNECTION #xF753016&gt;: encoding: CONNECTION.OPEN . (:VIRTUAL-HOST "/")</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CONNECTION #xF753016&gt;: send-method: #&lt;CONNECTION.OPEN #xF75BBEE&gt;&nbsp; #&lt;OUTPUT-FRAME [(+)METHOD|0|c.0|t.0].{CONNECTION.OPEN}[8/4088: 0 10 0 40 1 47 0 0] #xF75A446&gt;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T123124Z00] DEBUG #&lt;CHANNEL [amqp://localhost/].0 #xF757B2E&gt;: process-command: #&lt;CONNECTION #xF753016&gt; #&lt;CONNECTION.OPEN-OK #xF75BE5E&gt; . NIL</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">*C*</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-style-span" style="font-size: 9px; ">? (type-of *c*)</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">AMQP-1-1-0-9-1:CONNECTION</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font class="Apple-style-span" size="1"><span class="Apple-style-span" style="font-size: 9px;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-style-span" style="font-size: 9px; ">to which it responded with a Connection.Start with a version 8 in the properties.</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-style-span" style="font-size: 9px; ">having now rewired it to follow the suggested version-&gt;header mapping i observe the expected response to a 'standard' 0.9r1 header:</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font class="Apple-style-span" size="1"><span class="Apple-style-span" style="font-size: 9px;"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">? (defparameter *c* (make-instance 'amqp:connection :uri "amqp://guest:guest@localhost/"))</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T180229Z00] DEBUG #&lt;CONNECTION #x102F73F6&gt;: open-connection: requesting version: #(65 77 81 80 0 0 9 1)/:AMQP-1-1-0-9-1.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T180229Z00] DEBUG #&lt;CONNECTION #x102F73F6&gt;: open-connection: parsed version: #(65 77 81 80 1 1 8 0) / :AMQP-1-1-0-8-0.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T180229Z00] DEBUG #&lt;CONNECTION #x102F73F6&gt;: open-connection: updated class to AMQP-1-1-0-8-0:CONNECTION.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T180229Z00] DEBUG #&lt;CONNECTION #x102F73F6&gt;: open-connection: requesting version: #(65 77 81 80 1 1 8 0)/:AMQP-1-1-0-8-0.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">[20100216T180229Z00] DEBUG #&lt;CONNECTION #x102F73F6&gt;: open-connection: byte-zero: 1, connection class AMQP-1-1-0-8-0:CONNECTION.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">&gt; Error: Frame length exceeds buffer size: 73728, #&lt;VECTOR 4087 type (UNSIGNED-BYTE 8), simple&gt;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">&gt; While executing: CCL::%ASSERTION-FAILURE</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">&gt; Type Command-/ to continue, Command-. to abort.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">&gt; If continued: test the assertion again.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">See the Restarts� menu item for further choices.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Monaco" size="1" style="font: 9.0px Monaco">1 &gt;&nbsp;</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">the frame size error being the same as that which had led yesterday to the realization that it was using 7-byte headers.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br></div></span></font></div><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div> <blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">b. it does not use the 8-byte frame headers which appear in every<span class="Apple-converted-space">&nbsp; </span>instance of the amqp0-8 specification the net had yielded, but rather<span class="Apple-converted-space">&nbsp; </span>7-byte headers that are specified for 9-1.</div> </blockquote></blockquote></blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&gt;&gt;</div> <blockquote type="cite"><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">All implementations of 0-8 actually use a 7-byte header. Hence the correction in 0-9-1.</div> </blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">do these two sentences boggle any other minds?</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">a naive reader of the r8.0 specification might misconstrue it to require, that such a correction would apply to a broker which purports to follow the r9.1 spec, but not to broker which purports to follow the r8.0 spec. in this light, i have rescanned the r8.0 spec, but did not observe any formulations of the order "or any later protocol version." ok. anyway, i gather that page-35/line-26 and page-53/line-29 of amqp8-0.pdf are history. is there anything else of which a naive implementor should be aware?</div> </blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Many things, I should think, sadly.<span class="Apple-converted-space">&nbsp; </span>The things corrected, or cleared up, in 0-9-1 give some indication.</div></blockquote><div><br></div>what does this imply for the way the broker handles realms and tickets?</div><div><br></div><div>is is that</div><div>1. every 0.8r0 and 0.9r* broker follows 0.9r1 framing specifications.</div><div>2. the respective 0.8 and 0.9 brokers each otherwise implement the classes/methods/arguments/rules in the respective .xml version of the specification.</div><div><br></div><div>?</div><div><br><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&gt; [...]</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div> <blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">? are there actually any r9.0 brokers in the wild?</div> </blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Qpid's Java broker implements 0-9 and 0-9-1, inter alia.<span class="Apple-converted-space">&nbsp; </span>RabbitMQ has a branch implementing 0-9-1 (amqp_0_9_1 in the broker and most of the client repos), which should make its way into releases once work on the new persister is done.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div> <blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">on a meta level: how does this community achieve interoperability, other by knowing each other's code?</div> </blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Also by using each other's code; e.g., we use Qpid's (Python) test suites, in part, and they have been using our 0-9-1 (Java) test suite.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">mikeb.</div> </blockquote></div><br></body></html>