<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Fleet]]></title><description><![CDATA[The Fleet]]></description><link>https://blog.oscarthefleet.com</link><image><url>https://substackcdn.com/image/fetch/$s_!J_ak!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421b6f94-3527-45f6-aca1-6922c7fa7c00_750x750.png</url><title>The Fleet</title><link>https://blog.oscarthefleet.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 16 May 2026 02:38:10 GMT</lastBuildDate><atom:link href="https://blog.oscarthefleet.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Systems Analysis Limited]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[oscarthefleet@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[oscarthefleet@substack.com]]></itunes:email><itunes:name><![CDATA[Joseph Mark]]></itunes:name></itunes:owner><itunes:author><![CDATA[Joseph Mark]]></itunes:author><googleplay:owner><![CDATA[oscarthefleet@substack.com]]></googleplay:owner><googleplay:email><![CDATA[oscarthefleet@substack.com]]></googleplay:email><googleplay:author><![CDATA[Joseph Mark]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Asynchronous Consensus]]></title><description><![CDATA[What use is it?]]></description><link>https://blog.oscarthefleet.com/p/asynchronous-consensus</link><guid isPermaLink="false">https://blog.oscarthefleet.com/p/asynchronous-consensus</guid><dc:creator><![CDATA[Joseph Mark]]></dc:creator><pubDate>Mon, 16 Jun 2025 02:10:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J_ak!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421b6f94-3527-45f6-aca1-6922c7fa7c00_750x750.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It is hard to coordinate independent machines that do not share memory.</p><p>Imagine we are across the room from each other.</p><p>I ask you a yes/no question, &#8220;Did you hear something?&#8221;</p><p>You shake your head.</p><p>Unbeknownst to you, I am blind and cannot see you shaking your head. You think you have answered; I think you have ignored me. Our understanding of the situation has diverged.</p><p>I repeat the question.</p><p>You have lapsed into some whimsical daydream, thinking our exchange already ended, and cannot hear me.</p><p>How do we avoid this situation?</p><p>Imagine instead of talking from across the room we are exchanging letters from opposite sides of a valley that is occupied by our enemies. This scenario may seem fantastic but it is an excellent analogy for communication over noisy channels where messages might be delayed or lost, like on the internet.</p><p>Imagine proposing something like, &#8220;Let us attack our enemies in the valley (but only if we are each certain that the other has agreed to attack).&#8221;</p><p>Will we ever attack?</p><p>This is called the Two Generals Problem and the answer is no, we will never attack, because the proposal is an infinite recursion (each general&#8217;s decision depends on the decision of the other).</p><p><em>Just send a receipt!</em></p><p>You can send a receipt, but you cannot immediately be sure your receipt has been received, so you need a receipt of a receipt, and then a receipt of a receipt of a receipt, and so on.</p><p>Practically speaking this is no great obstacle. It only means we must avoid infinite recursions in our battle plans.</p><h3>The More General Case</h3><p>How can we be sure a system (generals, drones, etc) will do what we want if no part of the system knows the complete global state of the system, and no message can be relied upon to be delivered?</p><p>We cannot <em>always </em>be sure. Uncertainty can always, theoretically speaking, be prolonged indefinitely [Fischer, Lynch, Paterson. Impossibility of Distributed Consensus with One Faulty Process. <a href="https://groups.csail.mit.edu/tds/papers/Lynch/jacm85.pdf">paper</a>]. What we can do is make that as unlikely as possible, as quickly as possible.</p><p>Imagine we agree at the outset on a protocol:</p><ol><li><p>Every time I send a message I will consider that message as being appended to the sequence of all our previously confirmed messages. Therefore each message will include an identifier of the message that came before it. Messages might be delayed or lost but this will ensure that when my messages arrive you will know where in the sequence I intended them to be.</p></li><li><p>After receiving a valid message I will send a receipt that confirms it. However at any time we both might try to append a message to the sequence, in which case there will be a conflict: two messages vying to be appended at the same position. In other words, there will be two competing sequences that are identical except for the last message. In that case, I will pass both sequences to a mysterious orb called <em>DECIDE(X,Y) </em>and <em>DECIDE(X,Y) </em>will tell me which sequence to confirm. We both have identical orbs called <em>DECIDE(X,Y) </em>so we can be certain that for any given conflict we will agree on which sequence to confirm.</p></li><li><p>Upon receiving a receipt I will know you have seen my message and resolved any conflicts and so I will consider my message irreversibly appended to the sequence. You will know I have seen your receipt when I either send a receipt of your receipt or append a new message to the newly confirmed sequence. In that way we will maintain an ongoing conversation in which a certain sequence of confirmed messages is known with certainty, and a number of unconfirmed messages remain uncertain.</p></li></ol><p>It is a fine protocol but it hinges entirely on the mysterious orb <em>DECIDE(X,Y). </em>How does <em>DECIDE(X,Y) </em>work?</p><p><em>DECIDE(X,Y) </em>takes two sequences, <em>X </em>and <em>Y, </em>as arguments. <em>X </em>has my message on the end and <em>Y </em>has yours. It outputs one of those, which is its decision. It might be very simple: <em>if X is LEADER then X, otherwise Y. </em>Unfortunately that would be fragile. There might be many of us in the conversation (<em>DECIDE(X,Y,Z,&#8230;,etc)</em>) so choosing a leader means we can only progress the conversation at the speed of the leader, and if we lose contact with the leader we are in a pickle.</p><p>Ideally <em>DECIDE(X,Y,Z,&#8230;) </em>needs to work no matter which participants are reachable. In practice we need at least a majority of participants.</p><p><em>DECIDE(X,Y,Z,&#8230;) </em>needs to make an unambiguous decision, or no decision. We will stipulate that an unconfirmed sequence can have any number of speculative messages appended to it, as long as each message correctly identifies the message before it. That way if <em>DECIDE(X,Y,Z,&#8230;)</em> makes no decision we can wait for more messages and receipts, extend the relevant sequences, and hope that the set of extended sequences will be decidable. In other words it gives us some scope for <em>converging</em> on a decision.</p><p>The problem with <em>convergence </em>is that it takes time. We do not want to waste time, we want <em>DECIDE(X,Y,Z,&#8230;) </em>to make fast decisions with minimal information. In other words we want rapid <em>convergence. </em>Not only that, we want to know with certainty the probability that a decision will be made within a given number of messages.</p><h5>For the reader: come up with the best solution for <em>DECIDE(X,Y,Z,&#8230;)</em>.</h5><h2>Upshot</h2><p>What does all this get you?</p><p>Something marvellous.</p><p>If we can agree on a sequence of messages then we can treat those messages like database transactions: we each set up a block of memory (or a piece of paper) and operate on it according to the instructions in each new message. Because we agree on the order of the messages, we also agree on the state of the memory. In other words we have constructed a <em>shared memory</em>.</p><h3>Oscar the Operating System</h3><p>A computer is a block of memory with an operating system. The operating system allows all kinds of apps to use that memory to execute all kinds of tasks. Our shared memory is no different.</p><p><strong>Oscar</strong> will execute arbitrary tasks on a group of independent machines as if they were one super-machine.</p>]]></content:encoded></item><item><title><![CDATA[Milestones]]></title><description><![CDATA[What we have done so far]]></description><link>https://blog.oscarthefleet.com/p/milestones</link><guid isPermaLink="false">https://blog.oscarthefleet.com/p/milestones</guid><dc:creator><![CDATA[Joseph Mark]]></dc:creator><pubDate>Fri, 13 Jun 2025 01:21:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ekFa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcb8701e-fb18-41bd-ae31-6683a9598a8a_820x1623.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<ol><li><p>Shared-memory operating system.</p></li><li><p>Digital currency and utilities.</p></li><li><p>Sports oracle and betting market.</p></li></ol><h2><a href="https://blog.oscarthefleet.com/p/asynchronous-consensus">1. Oscar the Operating System.</a></h2><p><strong>Oscar </strong>allows an application to run on many machines as if they were one super-machine, or in other words: <strong>Oscar </strong>allows an application to run on a <em>fleet</em>.</p><blockquote><p><em>fleet,</em> noun: A network of machines hosting <strong>Oscar</strong>.</p></blockquote><p>Applications running on <strong>Oscar </strong>are <strong>faster</strong>, <strong>more resilient</strong>, <strong>simpler</strong> <strong>to maintain</strong>, and <strong>more transparent</strong> than legacy applications.</p><p><strong>Oscar </strong>was designed to run fast with a light footprint.</p><p><strong>Oscar</strong> can be configured with Byzantine Fault Tolerance, an auditable transaction history, and a sound native currency: <em>os</em>.</p><p>Our <em>canary</em> fleet (currently offline) has been hosting <strong>Oscar</strong> along with the apps described below.</p><blockquote><p><em>canary</em>, noun: An experimental fleet running as it would in production but without stability guarantees.</p></blockquote><h2><a href="https://ramp.888888888888.org">2. Ramp: on-ramp and currency-exchange.</a></h2><p><a href="https://ramp.888888888888.org">Ramp</a> offers two services:</p><ol><li><p>An on-ramp enables purchasing New Zealand Dollar tokens (<em>nz</em>).</p></li><li><p>A currency exchange enables swapping between <em>nz</em> and <em>os</em> at market rates.</p></li></ol><p><em>nz</em> is similar to <em>os </em>but is in one-to-one correspondence with NZ dollars we hold so that if we offer an off-ramp in the future it will be redeemable.</p><p>Below is the entire code used to deploy Ramp&#8217;s currency exchange on <strong>Oscar</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ekFa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcb8701e-fb18-41bd-ae31-6683a9598a8a_820x1623.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ekFa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcb8701e-fb18-41bd-ae31-6683a9598a8a_820x1623.png 424w, https://substackcdn.com/image/fetch/$s_!ekFa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcb8701e-fb18-41bd-ae31-6683a9598a8a_820x1623.png 848w, https://substackcdn.com/image/fetch/$s_!ekFa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcb8701e-fb18-41bd-ae31-6683a9598a8a_820x1623.png 1272w, https://substackcdn.com/image/fetch/$s_!ekFa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcb8701e-fb18-41bd-ae31-6683a9598a8a_820x1623.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ekFa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcb8701e-fb18-41bd-ae31-6683a9598a8a_820x1623.png" width="820" height="1623" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dcb8701e-fb18-41bd-ae31-6683a9598a8a_820x1623.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1623,&quot;width&quot;:820,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:455247,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.oscarthefleet.com/i/165659173?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c968efd-da18-4b74-83f7-92db62dcf359_820x1623.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ekFa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcb8701e-fb18-41bd-ae31-6683a9598a8a_820x1623.png 424w, https://substackcdn.com/image/fetch/$s_!ekFa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcb8701e-fb18-41bd-ae31-6683a9598a8a_820x1623.png 848w, https://substackcdn.com/image/fetch/$s_!ekFa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcb8701e-fb18-41bd-ae31-6683a9598a8a_820x1623.png 1272w, https://substackcdn.com/image/fetch/$s_!ekFa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcb8701e-fb18-41bd-ae31-6683a9598a8a_820x1623.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This function outputs a few hundred bytes which could be posted to a <em>fleet </em>using any http tool and a user who knew what they were doing would be able to use the exchange.</figcaption></figure></div><p>It is not so readable at the moment but we can make a couple of observations:</p><ol><li><p><strong>The app is simple. </strong>The entire business logic is displayed above. The rest of the project is a basic html web interface.</p></li><li><p><strong>The app is stateless.</strong> The app exposes a single function: <em>trade</em>, which calculates some quantities based on balances stored by <strong>Oscar</strong>, and either executes a pair of transfers or aborts. The app is a stateless interface to the data store, which is to say, to <strong>Oscar</strong>.</p></li><li><p><strong>There are no user accounts. </strong>Authentication is replaced by public-key cryptography, which is simpler and less annoying for users. Signature verification is handled by <strong>Oscar</strong>. No user data is collected. The only sensitive data associated with the app is the private key used to sign the transaction that deploys it.</p></li></ol><h2><a href="https://bet.888888888888.org">3. Bet: oracle and betting market.</a></h2><p><a href="https://bet.888888888888.org">Bet</a> is a bookmaker sports oracle that offers competitive odds on sporting events and takes the other side of wagers. Like <a href="https://ramp.888888888888.org">Ramp</a> it is simple, stateless, and has no user accounts. <a href="https://bet.888888888888.org">Bet</a> in fact uses <a href="https://ramp.888888888888.org">Ramp</a> as an embedded wallet, demonstrating the composability of apps built in this way.</p><p>If either of the websites linked above went offline users could still access the apps by interacting directly with <strong>Oscar</strong> from the command line or from any desktop client we build in the future.</p><p>The only way an app running on <strong>Oscar</strong> can be unreachable is if <strong>Oscar</strong>&#8217;s fleet goes down, and the probability of that happening can be brought as close to zero as we like. We will expand on this in future posts.</p>]]></content:encoded></item><item><title><![CDATA[Roadmap]]></title><description><![CDATA[What we are doing and why]]></description><link>https://blog.oscarthefleet.com/p/roadmap</link><guid isPermaLink="false">https://blog.oscarthefleet.com/p/roadmap</guid><dc:creator><![CDATA[Joseph Mark]]></dc:creator><pubDate>Fri, 13 Jun 2025 01:08:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J_ak!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F421b6f94-3527-45f6-aca1-6922c7fa7c00_750x750.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Goal</h2><p>Our goal is to enable robots in the real-world to cooperate in real-time without human intervention.</p><h2>Why?</h2><p>There are environments that are dangerous or unstable, where human operators would prefer to remain remote and intervene only intermittently with high-level instructions. We might call these environments <em>deep</em>, eg:</p><ul><li><p>deep sea</p></li><li><p>deep earth (caves, remote mountains, etc)</p></li><li><p>deep space</p></li></ul><p>There are also tasks currently done by humans involving heavy vehicles and machinery that demand low-latency decision making and effectively zero probability of failure. Air-Traffic Control is a current example, and it is not hard to imagine situations in the near future involving autonomous vehicles and peer-to-peer traffic control, with similar requirements but no control tower.</p><h2>Obstacles</h2><p>People tend to assume this type of cooperation is already possible and just a matter of building the robots and programming them (or training their AI) to cooperate. That is not the case, largely because programming (or training) emergent behaviour is hard and making any hard guarantees about that behaviour is even harder. On top of that there are various <a href="https://en.wikipedia.org/wiki/Two_Generals'_Problem">problems with generals</a>.</p><p>When we say <em>robots coordinating </em>or <em>robots cooperating</em> we mean robots programmed and deployed independently, operating in the same space, communicating to achieve some goal or avoid some disaster.</p><p>There are few examples of <em>robots coordinating</em> in real-time in the real-world, and those that exist are highly constrained:</p><ul><li><p>drone-swarm light displays are pre-programmed to perform specific movements and can only adapt to a narrow range of situations</p></li><li><p>military drones are controlled remotely by human operators</p></li></ul><p>So the first obstacle is software. The solution is <a href="https://blog.oscarthefleet.com/p/asynchronous-consensus">real-time asynchronous consensus</a>.</p><p>The next obstacle is to deployment. Artificial intelligence sophisticated enough to operate in the real-world is a recent phenomenon and not widely deployed. That limits what we can do since robots must be intelligent enough to operate independently in the real-world before they can cooperate.</p><p>There are stepping stones to real-world deployment that do not have this limitation.</p><h2>Roadmap</h2><h6>1. <a href="https://blog.oscarthefleet.com/p/asynchronous-consensus">Shared-memory operating system</a></h6><p>This enables us to program many machines as if they were one machine, no matter the machines: robots, vehicles, web servers, etc. Progress on one is largely transferable to the rest.</p><h6>2. <a href="https://blog.oscarthefleet.com/p/milestones">Web applications</a></h6><p>We have built several web applications with advantages over legacy applications.</p><h6>3. Real-time peer-to-peer gaming</h6><p>This is the natural next step from web applications and it will be a huge step forward for users. Nothing like it exists because it is not possible with legacy technology. Blockchains are too slow and the alternatives are not robust enough.</p><h6>4. Real-time real-world peer-to-peer applications</h6><p>The goal.</p>]]></content:encoded></item></channel></rss>