<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Mikhail / Systems Notes</title>
<link>https://matyunin.fr/</link>
<atom:link href="https://matyunin.fr/index.xml" rel="self" type="application/rss+xml"/>
<description>Distributed systems, formal models, and reproducible experiments.</description>
<generator>quarto-1.10.18</generator>
<lastBuildDate>Sun, 20 Sep 2026 22:00:00 GMT</lastBuildDate>
<item>
  <title>A notebook for thinking in systems</title>
  <dc:creator>Mikhail </dc:creator>
  <link>https://matyunin.fr/posts/writing-systems/</link>
  <description><![CDATA[ 




<div class="callout callout-style-default callout-note callout-titled" title="About this article">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>About this article
</div>
</div>
<div class="callout-body-container callout-body">
<p>This is the first article and a <strong>formatting reference</strong> for this site. The code and measurements are illustrative; they do not report a new research result. Open <code>posts/writing-systems/index.qmd</code> to inspect the source behind every example.</p>
</div>
</div>
<section id="words-structure-and-emphasis" class="level2">
<h2 class="anchored" data-anchor-id="words-structure-and-emphasis">1. Words, structure, and emphasis</h2>
<p>A useful systems article starts with a question, states its assumptions, and makes its evidence inspectable. The same structure works for a paper discussion, a model, or an experiment.</p>
<p>Use <strong>bold for a key claim</strong>, <em>italics for emphasis</em>, <strong><em>both sparingly</em></strong>, and <code>inline_code</code> for identifiers. You can mark <del>superseded wording</del>, <mark>highlight a condition</mark>, show H<sub>2</sub>O and x<sup>2</sup>, or write an escaped symbol: *.</p>
<p>A <a href="https://doi.org/10.1145/3149.214121">link to the original FLP paper</a> gives readers a route to the source. An internal link can point directly to the mathematics section. A footnote is useful for a qualification that would interrupt the main argument.<sup>1</sup></p>
<section id="third-level-heading" class="level3">
<h3 class="anchored" data-anchor-id="third-level-heading">Third-level heading</h3>
<p>Use headings to express the argument’s structure, rather than its visual size.</p>
<section id="fourth-level-heading" class="level4">
<h4 class="anchored" data-anchor-id="fourth-level-heading">Fourth-level heading</h4>
<p>Short supporting detail belongs here.</p>
<section id="fifth-level-heading" class="level5">
<h5 class="anchored" data-anchor-id="fifth-level-heading">Fifth-level heading</h5>
<p>Available when a long reference needs an additional level.</p>
<section id="sixth-level-heading" class="level6">
<h6 class="anchored" data-anchor-id="sixth-level-heading">Sixth-level heading</h6>
<p>Usually unnecessary in a normal article; included here as a rendering example.</p>
<blockquote class="blockquote">
<p>State the failure model before discussing the failure detector.</p>
<p>This is an original editorial note, not a quotation from a cited paper.</p>
</blockquote>
<hr>
</section>
</section>
</section>
</section>
</section>
<section id="lists-and-definitions" class="level2">
<h2 class="anchored" data-anchor-id="lists-and-definitions">2. Lists and definitions</h2>
<p>A preparation checklist:</p>
<ul>
<li>State the question.</li>
<li>Record the assumptions.
<ul>
<li>What may fail?</li>
<li>What does the network guarantee?</li>
</ul></li>
<li>Make the artifact available.</li>
</ul>
<p>A procedure:</p>
<ol type="1">
<li>Start from a baseline.</li>
<li>Change one assumption.</li>
<li>Compare the observed outcomes.</li>
</ol>
<p>A static task list:</p>
<ul class="task-list">
<li><label><input type="checkbox" checked="">Publish the model’s assumptions.</label></li>
<li><label><input type="checkbox" checked="">Label illustrative measurements.</label></li>
<li><label><input type="checkbox">Add a real experimental dataset.</label></li>
</ul>
<dl>
<dt>Safety</dt>
<dd>
A requirement that a forbidden outcome never occurs.
</dd>
<dt>Liveness</dt>
<dd>
A requirement that progress eventually occurs under stated assumptions.
</dd>
</dl>
</section>
<section id="sec-mathematics" class="level2">
<h2 class="anchored" data-anchor-id="sec-mathematics">3. Mathematics</h2>
<p>Inline mathematics fits naturally into a sentence: a strict majority of <img src="https://latex.codecogs.com/png.latex?n"> participants has size <img src="https://latex.codecogs.com/png.latex?q%20=%20%5Clfloor%20n/2%20%5Crfloor%20+%201">.</p>
<p>For a fixed universe <img src="https://latex.codecogs.com/png.latex?V">, let <img src="https://latex.codecogs.com/png.latex?Q_1,Q_2%5Csubseteq%20V">. If both sets contain more than half of <img src="https://latex.codecogs.com/png.latex?V">, then</p>
<p><span id="eq-intersection"><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Baligned%7D%0A%7CQ_1%20%5Ccap%20Q_2%7C%0A&amp;=%20%7CQ_1%7C%20+%20%7CQ_2%7C%20-%20%7CQ_1%20%5Ccup%20Q_2%7C%20%5C%5C%0A&amp;%5Cge%20%7CQ_1%7C%20+%20%7CQ_2%7C%20-%20%7CV%7C%20%5C%5C%0A&amp;%3E%200.%0A%5Cend%7Baligned%7D%0A%5Ctag%7B1%7D"></span></p>
<p>Equation&nbsp;1 establishes set intersection. It is not, by itself, a consensus correctness proof.</p>
<p>A matrix and a piecewise function are also supported:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AA=%5Cbegin%7Bbmatrix%7D0&amp;1&amp;0%5C%5C1&amp;0&amp;1%5C%5C0&amp;1&amp;0%5Cend%7Bbmatrix%7D,%5Cqquad%0Af(x)=%5Cbegin%7Bcases%7D1%20&amp;%20x%3E0,%5C%5C0%20&amp;%20x%5Cle%200.%5Cend%7Bcases%7D%0A"></p>
<div id="thm-intersection" class="theorem">
<p><span class="theorem-title"><strong>Theorem 1 (Majority intersection)</strong></span> Any two strict-majority subsets of the same finite universe intersect.</p>
</div>
<div class="proof">
<p><span class="proof-title"><em>Proof</em>. </span>The set-cardinality identity in Equation&nbsp;1 gives a strictly positive lower bound on the size of the intersection. Therefore the intersection is nonempty.</p>
</div>
</section>
<section id="code-rust-go-and-tla" class="level2">
<h2 class="anchored" data-anchor-id="code-rust-go-and-tla">4. Code: Rust, Go, and TLA+</h2>
<p>These are displayed code blocks. The blog build does <strong>not</strong> execute them.</p>
<section id="rust" class="level3">
<h3 class="anchored" data-anchor-id="rust">Rust</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode rust code-with-copy"><code class="sourceCode rust"><span id="cb1-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">use</span> <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">std::collections::</span>BTreeSet<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-2"></span>
<span id="cb1-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">fn</span> has_majority(acks<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span>BTreeSet<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span><span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">u64</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;,</span> voters<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span>BTreeSet<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span><span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">u64</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">bool</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb1-4">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">let</span> votes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> acks<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>intersection(voters)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>count()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb1-5">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">!</span>voters<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>is_empty() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;&amp;</span> votes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> voters<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>len() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb1-6"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span></code></pre></div></div>
<p>This toy helper counts distinct acknowledgements from members of a fixed voter set. It does not handle terms, configuration changes, or authentication.</p>
</section>
<section id="go" class="level3">
<h3 class="anchored" data-anchor-id="go">Go</h3>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode go code-with-copy"><code class="sourceCode go"><span id="cb2-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">package</span> quorum</span>
<span id="cb2-2"></span>
<span id="cb2-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">func</span> HasMajority<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>acks<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> voters <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">map</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">[</span><span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">uint64</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">]</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">struct</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{})</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">bool</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb2-4">    votes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span></span>
<span id="cb2-5">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> id <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">range</span> acks <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb2-6">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> _<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> ok <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> voters<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">[</span>id<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">];</span> ok <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb2-7">            votes<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">++</span></span>
<span id="cb2-8">        <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span>
<span id="cb2-9">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span>
<span id="cb2-10">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>voters<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;&amp;</span> votes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>voters<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb2-11"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span></code></pre></div></div>
</section>
<section id="tla" class="level3">
<h3 class="anchored" data-anchor-id="tla">TLA+</h3>
<p>The project includes a small custom syntax definition for <code>tla</code>; it highlights common constructs without pretending to be a parser or model checker.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode tla code-with-copy"><code class="sourceCode tla"><span id="cb3-1">--------------------------- <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">MODULE</span> AckSet ---------------------------</span>
<span id="cb3-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">EXTENDS</span> FiniteSets</span>
<span id="cb3-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">CONSTANT</span> Nodes</span>
<span id="cb3-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">VARIABLE</span> acks</span>
<span id="cb3-5"></span>
<span id="cb3-6">Init <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> acks = {}</span>
<span id="cb3-7">Ack(n) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/\</span> n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\in</span> Nodes \ acks</span>
<span id="cb3-8">          <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/\</span> acks' = acks <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\cup</span> {n}</span>
<span id="cb3-9">Next <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\E</span> n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\in</span> Nodes : Ack(n)</span>
<span id="cb3-10">TypeOK <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> acks <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">\subseteq</span> Nodes</span>
<span id="cb3-11">Spec <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> Init <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/\</span> [][Next]_acks</span>
<span id="cb3-12"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">====================================================================</span>=</span></code></pre></div></div>
</section>
<section id="line-numbers-and-annotations" class="level3">
<h3 class="anchored" data-anchor-id="line-numbers-and-annotations">Line numbers and annotations</h3>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>quorum.rs</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="annotated-cell-4" data-filename="quorum.rs" style="background: #f1f3f5;"><pre class="sourceCode numberSource rust code-annotation-code number-lines code-with-copy code-annotated"><code class="sourceCode rust"><span id="annotated-cell-4-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">let</span> voters <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">BTreeSet::</span>from([<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>])<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<a class="code-annotation-anchor" data-target-cell="annotated-cell-4" data-target-annotation="1" onclick="event.preventDefault();">1</a><span id="annotated-cell-4-2" class="code-annotation-target"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">let</span> acks <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">BTreeSet::</span>from([<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>])<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<a class="code-annotation-anchor" data-target-cell="annotated-cell-4" data-target-annotation="2" onclick="event.preventDefault();">2</a><span id="annotated-cell-4-3" class="code-annotation-target"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">assert!</span>(has_majority(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span>acks<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">,</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&amp;</span>voters))<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span><div class="code-annotation-gutter-bg"></div><div class="code-annotation-gutter"></div></code></pre></div></div>
</div>
<dl class="code-annotation-container-grid">
<dt data-target-cell="annotated-cell-4" data-target-annotation="1">1</dt>
<dd>
<span data-code-cell="annotated-cell-4" data-code-lines="2" data-code-annotation="1">Repeated acknowledgements cannot create additional distinct votes.</span>
</dd>
<dt data-target-cell="annotated-cell-4" data-target-annotation="2">2</dt>
<dd>
<span data-code-cell="annotated-cell-4" data-code-lines="3" data-code-annotation="2">This assertion tests one example, not all behaviours of a protocol.</span>
</dd>
</dl>
</section>
<section id="collapsible-code" class="level3">
<h3 class="anchored" data-anchor-id="collapsible-code">Collapsible code</h3>
<details class="code-disclosure">
<summary>
Show the small Go example
</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode go code-with-copy"><code class="sourceCode go"><span id="cb4-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">// A displayed example, not executed by the build.</span></span>
<span id="cb4-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">func</span> majoritySize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">(</span>n <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">int</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">)</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">int</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> n<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span></span></code></pre></div></div>
</details>
<p>A literal command and its output can be displayed separately:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb5-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">python3</span> scripts/blog.py build</span></code></pre></div></div>
<pre class="text"><code>Building a static website from versioned source files.</code></pre>
</section>
</section>
<section id="mermaid-a-live-browser-rendered-diagram" class="level2">
<h2 class="anchored" data-anchor-id="mermaid-a-live-browser-rendered-diagram">5. Mermaid: a live browser-rendered diagram</h2>
<div class="cell" data-layout-align="default">
<div class="cell-output-display">
<div>
<p></p><figure class="figure"><p></p>
<div>
<pre class="mermaid mermaid-js">flowchart TD
  A[Receive acknowledgement] --&gt; B{Known voter?}
  B --&gt;|No| C[Ignore]
  B --&gt;|Yes| D[Add to distinct set]
  D --&gt; E{Strict majority?}
  E --&gt;|No| F[Wait for more]
  E --&gt;|Yes| G[Report threshold reached]
</pre>
</div>
<p></p></figure><p></p>
</div>
</div>
</div>
<p>This depicts only the helper’s counting logic. Reaching a numerical threshold does not establish all the conditions a real protocol requires.</p>
</section>
<section id="plantuml-external-rendering-local-delivery" class="level2">
<h2 class="anchored" data-anchor-id="plantuml-external-rendering-local-delivery">6. PlantUML: external rendering, local delivery</h2>
<div class="diagram-frame">
<div id="fig-acknowledgements" class="quarto-float quarto-figure quarto-figure-center anchored" alt="A coordinator sends proposals to nodes B and C. Both return acknowledgements; the coordinator counts distinct voters.">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-acknowledgements-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://matyunin.fr/posts/writing-systems/acknowledgements.svg" class="img-fluid figure-img" alt="A coordinator sends proposals to nodes B and C. Both return acknowledgements; the coordinator counts distinct voters.">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-acknowledgements-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1: Illustrative request and acknowledgement exchange, not a full consensus protocol.
</figcaption>
</figure>
</div>
</div>
<p>Figure&nbsp;1 is generated from <a href="acknowledgements.puml">the PlantUML source</a> by an <strong>external PlantUML-compatible renderer</strong>. The returned SVG is stored in this repository and served with the site. Rendering details and the source checksum are recorded in <code>acknowledgements.svg.render.json</code>.</p>
<p>To update it after editing the <code>.puml</code> file:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb7-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">python3</span> scripts/blog.py plantuml posts/writing-systems/acknowledgements.puml</span></code></pre></div></div>
<p>No Java or PlantUML installation is required locally. The ordinary blog build uses the saved SVG and does not need the rendering service. Only public diagram source should be sent to a public renderer.</p>
</section>
<section id="tables-figures-and-downloadable-data" class="level2">
<h2 class="anchored" data-anchor-id="tables-figures-and-downloadable-data">7. Tables, figures, and downloadable data</h2>
<p>The following values are <strong>invented formatting data</strong>, not benchmark results.</p>
<div id="tbl-example" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-tbl figure">
<figcaption class="quarto-float-caption-top quarto-float-caption quarto-float-tbl" id="tbl-example-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Table&nbsp;1: Illustrative values for a table.
</figcaption>
<div aria-describedby="tbl-example-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<table class="caption-top table">
<thead>
<tr class="header">
<th style="text-align: left;">Scenario</th>
<th style="text-align: right;">Participants</th>
<th style="text-align: right;">Example latency (ms)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">Baseline</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">12</td>
</tr>
<tr class="even">
<td style="text-align: left;">Additional delay</td>
<td style="text-align: right;">3</td>
<td style="text-align: right;">27</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Larger group</td>
<td style="text-align: right;">5</td>
<td style="text-align: right;">19</td>
</tr>
</tbody>
</table>
</div>
</figure>
</div>
<p>A table can be referenced as Table&nbsp;1. <a href="example-data.csv">Download the same illustrative data</a>.</p>
<div id="fig-example" class="quarto-float quarto-figure quarto-figure-center anchored" alt="Three illustrative bars: baseline 12 milliseconds, additional delay 27, larger group 19.">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-example-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://matyunin.fr/posts/writing-systems/example-chart.svg" class="img-fluid figure-img" alt="Three illustrative bars: baseline 12 milliseconds, additional delay 27, larger group 19." width="640">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-example-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;2: Illustrative latency values; no empirical results are represented.
</figcaption>
</figure>
</div>
<p>Figure&nbsp;2 is a local vector image with alternative text. SVG is useful for diagrams that should remain sharp at different screen sizes.</p>
</section>
<section id="callouts-tabs-and-disclosure" class="level2">
<h2 class="anchored" data-anchor-id="callouts-tabs-and-disclosure">8. Callouts, tabs, and disclosure</h2>
<div class="callout callout-style-default callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Note
</div>
</div>
<div class="callout-body-container callout-body">
<p>Record definitions and context close to the claim they qualify.</p>
</div>
</div>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>Tip
</div>
</div>
<div class="callout-body-container callout-body">
<p>Link the exact commit or release used for an experiment.</p>
</div>
</div>
<div class="callout callout-style-default callout-important callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Important</span>Important
</div>
</div>
<div class="callout-body-container callout-body">
<p>A timeout is evidence of missing observations, not a proof that a process has crashed.</p>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Warning</span>Warning
</div>
</div>
<div class="callout-body-container callout-body">
<p>The scope of a guarantee depends on its assumptions.</p>
</div>
</div>
<div class="callout callout-style-default callout-caution callout-titled">
<div class="callout-header d-flex align-content-center collapsed" data-bs-toggle="collapse" data-bs-target=".callout-6-contents" aria-controls="callout-6" aria-expanded="false" aria-label="Toggle callout">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Caution</span>Caution — click to expand
</div>
<div class="callout-btn-toggle d-inline-block border-0 py-1 ps-1 pe-0 float-end"><i class="callout-toggle"></i></div>
</div>
<div id="callout-6" class="callout-6-contents callout-collapse collapse">
<div class="callout-body-container callout-body">
<p>A small successful test cannot replace an argument covering the required behaviours.</p>
</div>
</div>
</div>
<div class="tabset-margin-container"></div><div class="panel-tabset">
<ul class="nav nav-tabs"><li class="nav-item"><a class="nav-link active" id="tabset-1-1-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-1" aria-controls="tabset-1-1" aria-selected="true" href="">Assumptions</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-2-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-2" aria-controls="tabset-1-2" aria-selected="false" href="">Observation</a></li><li class="nav-item"><a class="nav-link" id="tabset-1-3-tab" data-bs-toggle="tab" data-bs-target="#tabset-1-3" aria-controls="tabset-1-3" aria-selected="false" href="">Limitation</a></li></ul>
<div class="tab-content">
<div id="tabset-1-1" class="tab-pane active" aria-labelledby="tabset-1-1-tab">
<p>A fixed voter set and distinct acknowledgements.</p>
</div>
<div id="tabset-1-2" class="tab-pane" aria-labelledby="tabset-1-2-tab">
<p>A numerical threshold is reached.</p>
</div>
<div id="tabset-1-3" class="tab-pane" aria-labelledby="tabset-1-3-tab">
<p>The example does not establish consensus safety or liveness.</p>
</div>
</div>
</div>
<details>
<summary>
Additional implementation detail
</summary>
<p>This is an HTML disclosure element. Markdown inside it can include <strong>emphasis</strong>, links, and code.</p>
</details>
</section>
<section id="citations-and-provenance" class="level2">
<h2 class="anchored" data-anchor-id="citations-and-provenance">9. Citations and provenance</h2>
<p>For example, the FLP paper is cited as <span class="citation" data-cites="fischer1985">Fischer et al. (1985)</span>. A parenthetical citation looks like this <span class="citation" data-cites="fischer1985">(Fischer et al. 1985)</span>. The reference is stored in the adjacent <code>references.bib</code> file.</p>
<p>A research post should identify which statements come from the cited source and which are the author’s interpretation. Here, the citation demonstrates bibliography rendering; this article is not a summary of FLP.</p>
</section>
<section id="article-history" class="level2">
<h2 class="anchored" data-anchor-id="article-history">10. Article history</h2>
<ul>
<li><strong>2026-09-21:</strong> Initial formatting reference. All example measurements are synthetic.</li>
</ul>
<div class="series-nav">
<p><strong>Series: <a href="../../series/writing-systems.html">Writing about systems</a></strong></p>
<p>Part 1 of 1 · suggested reading order</p>
</div>
</section>
<section id="references" class="level2">
<h2 class="anchored" data-anchor-id="references">References</h2>
<div id="refs" class="references csl-bib-body hanging-indent">
<div id="ref-fischer1985" class="csl-entry">
Fischer, Michael J., Nancy A. Lynch, and Michael S. Paterson. 1985. <span>“Impossibility of Distributed Consensus with One Faulty Process.”</span> <em>Journal of the ACM</em> 32 (2): 374–82. <a href="https://doi.org/10.1145/3149.214121">https://doi.org/10.1145/3149.214121</a>.
</div>
</div>


</section>


<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a><div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>A formatting example is not a complete statement of a distributed algorithm or its proof obligations.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>Technical writing</category>
  <category>Formal methods</category>
  <guid>https://matyunin.fr/posts/writing-systems/</guid>
  <pubDate>Sun, 20 Sep 2026 22:00:00 GMT</pubDate>
</item>
</channel>
</rss>
