<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/css/main.css"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Théo Zimmermann's blog</title>
    <description>Mostly a place to share ideas and thoughts.</description>
    <link>https://www.theozimmermann.net/</link>
    <atom:link href="https://www.theozimmermann.net/en/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Thu, 30 Jul 2026 11:17:12 +0200</pubDate>
    <lastBuildDate>Thu, 30 Jul 2026 11:17:12 +0200</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
	  
        <item>
          <title>Are your dependencies dead? And how maintainers can help (and get help)</title>
          <description>This weekend, I read &quot;Weekend at Bernie&apos;s&quot;, a recent blog post from Andrew Nesbitt, in which he tries to quantify how many of the critical dependencies of various ecosystems are effectively &quot;dead&quot;. The post was very interesting, and I like the methodology he used. But what I noticed (besides the relatively high percentage of &quot;dead&quot; critical dependencies) was the large number of dependencies that are in an &quot;unknown&quot; state, i.e., for which we don&apos;t know whether they are maintained or not.</description>
          <pubDate>Wed, 13 May 2026 16:50:00 +0200</pubDate>
          <link>https://www.theozimmermann.net/2026/05/maintenance-md/</link>
          <guid isPermaLink="true">https://www.theozimmermann.net/2026/05/maintenance-md/</guid>
          
          
		  <content:encoded><![CDATA[<p>This weekend, I read <a href="https://nesbitt.io/2026/05/08/weekend-at-bernies.html">“Weekend at Bernie’s”</a>, a recent blog post from Andrew Nesbitt, in which he tries to quantify how many of the critical dependencies of various ecosystems are effectively “dead”.
The post was very interesting, and I like the methodology he used. But what I noticed (besides the relatively high percentage of “dead” critical dependencies) was the large number of dependencies that are in an “unknown” state, i.e., for which we don’t know whether they are maintained or not. They are not active, but this does not mean that their maintainers are unreachable if there is a problem to fix, such as a security vulnerability. On the other hand, we don’t have evidence that their maintainers are still reachable, because nobody has tried to reach them for a while, and they have not actively updated the repository either.</p>

<p>Besides, I would add that even for dependencies that are active, or dormant but responsive, users might still be at risk if everything depends on a single maintainer, who could go missing at any time. This is a common risk in open source software, close to the famous “bus factor” problem, which I tried to quantify <a href="https://dl.acm.org/doi/pdf/10.1145/3387940.3392209">more than 6 years ago</a>,<sup id="fnref:cpmo" role="doc-noteref"><a href="#fn:cpmo" class="footnote" rel="footnote">1</a></sup> using data that were already coming at the time from Andrew Nesbitt.</p>

<p>We keep reminding users that open source software comes with no guarantee, and in particular no guarantee of future maintenance, so they have no right to complain if they don’t support the project, financially or otherwise.
But that does not mean that all open source dependencies carry the same risks. Some of them are effectively “dead” or insufficiently maintained to be safe to use, but others, on the contrary, are well maintained, and perfectly safe to use.
So it would be nice if there was a way for projects to signal their maintenance status.</p>

<p>Of course, it is not as easy as declaring “this project is maintained”, as this could very well be true when the declaration is committed to the repository, but it might no longer be true two years later when a problem arises and requires attention.</p>

<p>So here is my proposal, inspired by several sources, including the recent work on adding an <a href="https://github.com/ocaml/opam-repository/blob/master/governance/policies/archiving.md#specification-of-the-x--fields-used-in-the-archiving-process"><code class="language-plaintext highlighter-rouge">x-maintenance-intent</code> field</a> to opam (the OCaml package manager) metadata, as well as the ongoing work of my postdoc Antonin Delpeuch on helping projects make their governance explicit through a <a href="https://antonin.delpeuch.eu/posts/the-pull-request-hack-is-not-enough/#get-a-governance-model"><code class="language-plaintext highlighter-rouge">GOVERNANCE.md</code> file</a>.</p>

<h2 id="a-maintenancemd-file">A <code class="language-plaintext highlighter-rouge">MAINTENANCE.md</code> file</h2>

<p>This would be a file that could be added to the root of a repository (like the current practice for standard files such as <code class="language-plaintext highlighter-rouge">README.md</code>, <code class="language-plaintext highlighter-rouge">CONTRIBUTING.md</code>, <code class="language-plaintext highlighter-rouge">CODE_OF_CONDUCT.md</code>, <code class="language-plaintext highlighter-rouge">GOVERNANCE.md</code>, <code class="language-plaintext highlighter-rouge">SECURITY.md</code>, etc.)<sup id="fnref:inflation" role="doc-noteref"><a href="#fn:inflation" class="footnote" rel="footnote">2</a></sup> that would contain information about the maintenance intent and status of the project. Here are the sections that I would expect to find in such a file (and we could “normalize” them so that tools can consume them<sup id="fnref:format" role="doc-noteref"><a href="#fn:format" class="footnote" rel="footnote">3</a></sup> and display them in package registries, for instance):</p>

<ul>
  <li>
    <p><strong>Maintenance intent</strong>: what types of maintenance activities the project intends to perform (e.g., “the project is actively developed and new features are regularly added”, “the project is in maintenance mode and only bug fixes and security patches are provided”, “the project is mostly dormant but the maintainers will respond to vulnerability reports and critical bug fixes”, or “the project was developed as a fun hobby project and there is no intent to support users or any commitment to fix security issues”).</p>
  </li>
  <li>
    <p><strong>Active versions</strong>: which versions of the project are actively maintained (e.g., “only the latest major version is maintained”, “versions 2 and 3 are maintained, but 2 only receives security patches”).</p>
  </li>
  <li>
    <p><strong>Maintenance team</strong>: who is responsible for maintenance activities. In particular, who has commit rights, who currently handles the releases, who else has rights to publish new versions to the package registry and could step in if the main maintainer goes missing, etc.</p>
  </li>
  <li>
    <p><strong>Maintenance team check-in</strong>: as part of the above section, a statement about how often each maintainer is expected to check in to show that they are still active and reachable. This could be done by committing to the repository, or even by committing to the <code class="language-plaintext highlighter-rouge">MAINTENANCE.md</code> file itself if no other activity was needed. The commit to the <code class="language-plaintext highlighter-rouge">MAINTENANCE.md</code> file could also be used to record the last time the team member checked that they still had access to the package registry. We could also invent a new badge that would show when this author last committed to the repository. This information is particularly important because it would allow us to distinguish between “dormant but responsive” and “dead” dependencies (that Andrew Nesbitt had to classify as “unknown” in his analysis).</p>
  </li>
  <li>
    <p><strong>How to help</strong>: if the project accepts help, for instance, in the form of funding (and what kind of additional maintenance activities this may guarantee), or in the form of engineering effort (including looking for new maintainers). Of course, after the event-stream and xz incidents, one might be wary of accepting new maintainers and some could argue that explicitly asking for help can even make projects a target of social engineering attacks, but on the other hand, it may be better to be transparent about this need and look for new maintainers early, rather than wait for maintainers to burn out and have to appoint new ones in a hurry. In particular, this declaration does not mean that the project has to appoint anyone who proposes to help.</p>
  </li>
</ul>

<p>Note that the goal of this new file is not to repeat or replace the information that can already be found in other files, such as <code class="language-plaintext highlighter-rouge">GOVERNANCE.md</code> for how new maintainers are appointed, or <code class="language-plaintext highlighter-rouge">SECURITY.md</code> for how to report security vulnerabilities. Any information that is already present elsewhere can be simply linked from the <code class="language-plaintext highlighter-rouge">MAINTENANCE.md</code> file.</p>

<p>All in all, the file could look like this:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gh"># Maintenance intent</span>

Project X is currently in maintenance mode, and only bug fixes and security
patches are provided.

<span class="gu">## Active versions</span>

The latest major version (3.x) receives regular bug fixes and security 
patches. Version 2.x only receives security patches, and version 1.x is no
longer maintained.

<span class="gu">## Maintenance team</span>
<span class="p">
-</span> Alice (@alice):
<span class="p">  -</span> Commit rights, release manager, has access to the package registry.
<span class="p">  -</span> Checks in at least once every 3 months.
<span class="p">  -</span> Last check-in to <span class="sb">`MAINTENANCE.md`</span>: 2026-05-01 (confirmed access to the package registry).
<span class="p">  -</span> Last commit to the repository: <span class="err">\</span>
    !<span class="p">[</span><span class="nv">check-in badge</span><span class="p">](</span><span class="sx">https://img.shields.io/badge/does-not-exists-yet?project=X&amp;who=alice&amp;freq=3m</span><span class="p">)</span>
<span class="p">-</span> Bob (@bob):
<span class="p">  -</span> Commit rights, has access to the package registry.
<span class="p">  -</span> Checks in at least once every 6 months.
<span class="p">  -</span> Last check-in to <span class="sb">`MAINTENANCE.md`</span>: 2026-01-15 (confirmed access to the package registry).
<span class="p">  -</span> Last commit to the repository: <span class="err">\</span>
    !<span class="p">[</span><span class="nv">check-in badge</span><span class="p">](</span><span class="sx">https://img.shields.io/badge/does-not-exists-yet?project=X&amp;who=bob&amp;freq=6m</span><span class="p">)</span>
<span class="p">-</span> Carol (@carol):
<span class="p">  -</span> Commit rights.
<span class="p">  -</span> Checks in at least once every 6 months.
<span class="p">  -</span> Last check-in to <span class="sb">`MAINTENANCE.md`</span>: 2024-09-23.
<span class="p">  -</span> Last commit to the repository: <span class="err">\</span>
    !<span class="p">[</span><span class="nv">check-in badge</span><span class="p">](</span><span class="sx">https://img.shields.io/badge/does-not-exists-yet?project=X&amp;who=carol&amp;freq=6m</span><span class="p">)</span>

<span class="gu">## How to help</span>

Maintainers are not currently accepting financial support and do not have
the bandwidth to review new feature proposals. Getting new maintainers on
board could help make the project more active and accept new features again.
</code></pre></div></div>

<p>In the example above, Carol has not checked in to the <code class="language-plaintext highlighter-rouge">MAINTENANCE.md</code> file for more than 6 months, but the badge could still show that her last commit to the repository was within the last six months.</p>

<h2 id="what-do-you-think">What do you think?</h2>

<p>My goal with this proposal is to come up with a methodology that would be lightweight for maintainers to implement, but would also help with transparency toward users about a project’s status and automatically signal when there is an issue with maintainers’ availability.
I am particularly interested in hearing from maintainers whether this is something they would be willing to adopt.</p>

<p>In particular, I believe that we should stop reasoning that, just because an open source package happens to have many dependents, the author should have a particular responsibility toward its users. If there are good mechanisms to communicate maintenance intent and status, then users can make informed decisions about which dependencies to use, and maintainers can also explain under what conditions they are willing to provide support. Authors who created packages as just a hobby can be transparent about not wanting to support users, and users are free to fork the project and maintain it themselves if they are not satisfied with the level of maintenance provided by the original author.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:cpmo" role="doc-endnote">
      <p>In the linked article, there is also a part where I examine how ecosystem members can self-organize to mitigate the risks of package abandonment. If you are interested in this part, here is a more recent and more in-depth article I wrote on the topic: <a href="https://telecom-paris.hal.science/hal-03976601/document">“A grounded theory of Community Package Maintenance Organizations”</a>. <a href="#fnref:cpmo" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:inflation" role="doc-endnote">
      <p>One may notice that there is a kind of inflation in the number of such files that one expects to find in a given repository. I don’t think this is a problem in itself, as each of these files has a clearly defined role and can be read and understood independently of the others. Keeping files separate helps with modularity. The fact that they are all expected to be located at the root of a project might be seen as a problem, however (and this is without counting the similar inflation of configuration files also expected to be there). Maybe something could be done about the latter issue, such as standardizing a directory under which these markdown files are expected to be found (and similarly for the configuration files). <a href="#fnref:inflation" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:format" role="doc-endnote">
      <p>I was initially hesitating between a clearly machine-readable format like YAML and a more human-oriented format like Markdown. In the end, I figured that what you put in it is mostly going to be free-form text (too many constraints would hurt), but if you make the sections standard, provide a template, and offer tools to check whether your file matches the template, then your Markdown file can still be consumed by programs. <a href="#fnref:format" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>
]]></content:encoded>
        </item>
	  
    
	  
    
	  
        <item>
          <title>Managing known issues: a refinement of the stale bot approach</title>
          <description>There are a few universal problems that maintainers of successful open source projects end up facing. One of them is coping with a large number of open issues. This problem is often unavoidable because the available manpower to fix bugs and limitations rarely scales as fast as the manpower to report them. Therefore, the number of open bugs in the issue tracker of popular projects can end up growing and growing until a point where it becomes hard to manage.</description>
          <pubDate>Tue, 02 Nov 2021 20:00:00 +0100</pubDate>
          <link>https://www.theozimmermann.net/2021/11/known-issues/</link>
          <guid isPermaLink="true">https://www.theozimmermann.net/2021/11/known-issues/</guid>
          
          
		  <content:encoded><![CDATA[<p>There are a few universal problems that maintainers of successful open source projects end up facing.
One of them is coping with a large number of open issues.</p>

<p>This problem is often unavoidable because the available manpower to fix bugs and limitations rarely scales as fast as the manpower to report them.
Therefore, the number of open bugs in the issue tracker of popular projects can end up growing and growing until a point where it becomes hard to manage.<sup id="fnref:nixpkgs-issues" role="doc-noteref"><a href="#fn:nixpkgs-issues" class="footnote" rel="footnote">1</a></sup></p>

<h2 id="the-stale-bot-approach">The stale bot approach</h2>

<p>To alleviate this problem, many open source projects are nowadays choosing to rely on “stale bots”, bots that automatically act on inactive issues (and pull requests), generally to close them.
Wessel <em>et al.</em><sup id="fnref:wessel" role="doc-noteref"><a href="#fn:wessel" class="footnote" rel="footnote">2</a></sup> have done a preliminary study of projects that use the most well-known stale bot: <a href="https://github.com/apps/stale">https://github.com/apps/stale</a>.</p>

<p>However, everyone that has spent time writing a careful bug report, only to see that it got no reply, but the one of the bot that closed it for being stale, can testify that this doesn’t feel like a great experience and doesn’t give much incentive to report the next bug you encounter. Open source maintainers are often aware of this: to illustrate, see this <a href="https://github.com/NixOS/rfcs/pull/51">long discussion</a> of nixpkgs maintainers and contributors about the introduction of a stale bot, or this <a href="https://blog.gradle.org/stale-issue-backlog">blog post</a> of the Gradle project to justify their use of a stale bot (which they link to in every message posted by the bot).</p>

<p>I think that there are many research opportunities to study stale bots usage beyond what Wessel <em>et al.</em><sup id="fnref:wessel:1" role="doc-noteref"><a href="#fn:wessel" class="footnote" rel="footnote">2</a></sup> did. Some research questions that come to mind:</p>

<ol>
  <li>In which context are stale bots introduced by project maintainers?</li>
  <li>Are project maintainers satisfied with the stale bot solution?</li>
  <li>How do issue reporters perceive the use of the stale bot?</li>
  <li>What consequences does it have on the behavior of issue reporters? (Do they refrain from reporting new bugs they discover?)</li>
</ol>

<p>To be addressed, these research questions would probably require a combination of quantitative and qualitative methods: mining software repositories, coding public discussions and blog posts, interviewing maintainers and issue reporters, econometrics methods to derive causality from quasi-experiments.</p>

<p>In the meantime, and without this evidence-based knowledge, as an open source maintainer, I am personally reluctant to introduce a stale bot to close our huge issue backlog in the Coq repository. Instead, I wish to explore alternative triaging approaches that scale.</p>

<h2 id="documenting-known-issues">Documenting known issues</h2>

<p>Releasing software with known issues happens all the time. Some known issues are left unfixed because of lack of manpower to fix them and because they are not of top priority. Some known issues are left unfixed because fixing them is hard and designing a proper solution will take time. In both cases, it is perfectly acceptable to release software, but acknowledging and documenting known issues is always a good idea.</p>

<p>First, documenting known issues can avoid users spending time on things which do not work and getting frustrated. When there are known workarounds, documenting them will help users figure out how to proceed instead.</p>

<p>Second, keeping a list of known issues can also avoid getting duplicate reports when users encounter these issues. And when duplicate reports are created nonetheless, they can help maintainers figure out that this is really a duplicate and where the canonical issue is to be found.</p>

<p>For users to easily find out about known issues, they should be documented close to the feature they are a limitation of. And when they are introduced in a new release, they should appear in the release notes.</p>

<p>For issue reporters and maintainers to quickly find a known issue, an index of known issue can be a useful thing to have. But it is not a strict requirement if they can easily locate the documentation of the corresponding feature (and the known issues are easy to spot from there).</p>

<p>If documented known issues provide a link to the canonical discussion, this can also help potential contributors become active participants in the resolution.</p>

<h2 id="keeping-the-list-of-open-issues-focused">Keeping the list of open issues focused</h2>

<p>Accumulating a long list of open issues that are not actively worked on can be legitimately viewed as inefficient.</p>

<p>While closing issues which are not actively worked on with a stale bot risks burying them and leading to duplicate reports, closing inactive but documented known issues should not create such problems. Because they are documented, known issues are not just forgotten about. Ideally, the documentation even comes with a test case (within or separate from the documentation) that will help discover when they are accidentally closed or become irrelevant. Furthermore, if at any point, anyone wants to contribute to the discussion of the known issue, it is easy for them to do so if a link from the documentation to the canonical discussion is available.</p>

<p>Therefore, it seems reasonable to refine the stale bot approach into a novel stale known issue approach. This approach would roughly work in the following way:</p>

<ol>
  <li>When a bug or a limitation is reported, it should be confirmed (reproduced).</li>
  <li>A confirmed bug or limitation which does not look like it will be fixed by the time of the next release should be documented as a known issue.</li>
  <li>A documented known issue which is not receiving activity should be closed.</li>
  <li>Any known issue receiving new activity (a new comment or a contributor self-assigning the issue) should be reopened (and reclosed if it becomes stale again).</li>
</ol>

<p>The contributing documentation should direct potential contributors to the list of known issues, in addition to the list of open ones.</p>

<p>A bot and a clever use of labels or GitHub new <a href="https://docs.github.com/en/issues/trying-out-the-new-projects-experience/about-projects">projects</a> can serve to implement and automate the above process.</p>

<h2 id="introducing-this-approach-in-a-project-with-a-big-backlog">Introducing this approach in a project with a big backlog</h2>

<p>If we want to adopt this approach in the Coq project, the first thing we need to do is to handle the backlog of known, but undocumented issues.</p>

<p>Developers have expressed the need to document known issues several times in the past, so this objective is shared.<sup id="fnref:coq-known-issues" role="doc-noteref"><a href="#fn:coq-known-issues" class="footnote" rel="footnote">3</a></sup> What I’m not sure will be shared is the scope of known issues needing to be documented, but we can start with the ones that are consensual and work our way from there.</p>

<p>In PR <a href="https://github.com/coq/coq/pull/15102">#15102</a>, I am introducing a special directive so that we can document (and highlight) known issues in the Coq reference manual. I am also experimenting with using a <a href="https://github.com/orgs/coq/projects/3/views/4">GitHub project</a> to manage the list of known issues, those that need documentation and those that are documented. The project also provides a custom field to add a link from the issue to its documentation. In the future, we could add a column/status for the known issues that are documented and stale, and thus that could be (temporarily) closed.</p>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:nixpkgs-issues" role="doc-endnote">
      <p>As an illustration, let me take the case of the <a href="https://github.com/NixOS/nixpkgs">nixpkgs repository</a>, where a small assessment I did two years ago, <a href="https://github.com/NixOS/rfcs/pull/51#issuecomment-527974188">in response to a request from contributors</a>, shows that the average time to close issues has been slowly increasing over time: <a href="https://github.com/Zimmi48/nixpkgs-issues/blob/master/nixpkgs-issues.ipynb">https://github.com/Zimmi48/nixpkgs-issues/blob/master/nixpkgs-issues.ipynb</a> <a href="#fnref:nixpkgs-issues" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:wessel" role="doc-endnote">
      <p>Wessel, M., Steinmacher, I., Wiese, I., &amp; Gerosa, M. A. (2019). Should I stale or should I close? An analysis of a bot that closes abandoned issues and pull requests. In 2019 IEEE/ACM 1st International Workshop on Bots in Software Engineering (BotSE) (pp. 38-42). IEEE. <a href="#fnref:wessel" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:wessel:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a></p>
    </li>
    <li id="fn:coq-known-issues" role="doc-endnote">
      <p>See the most recent discussion in a <a href="https://github.com/coq/coq/wiki/Coq-Call-2021-10-13">Coq Call</a> and an <a href="https://github.com/coq/coq/issues/12665">issue from one year ago</a> describing a plan. <a href="#fnref:coq-known-issues" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>
]]></content:encoded>
        </item>
	  
    
	  
    
	  
        <item>
          <title>Leaving room for proofs of False in an adversarial context</title>
          <description>Imagine a crypto-currency-based market for mechanically verifiable proofs of theorems and for programs with proofs that they meet their specifications. Simply described, people can attach bounties to mathematical conjectures and other people can try to come up with a proof. If they manage to do so, they submit a formalized version that will be checked automatically and they will receive the reward. In this market where trust is based on automatic proof checkers, we can imagine how disruptive a proof of False may be.</description>
          <pubDate>Thu, 30 Nov 2017 23:00:00 +0100</pubDate>
          <link>https://www.theozimmermann.net/2017/11/proof-of-false/</link>
          <guid isPermaLink="true">https://www.theozimmermann.net/2017/11/proof-of-false/</guid>
          
          
		  <content:encoded><![CDATA[<p>Imagine a crypto-currency-based market for mechanically verifiable proofs
of theorems and for programs with proofs that they meet their specifications.
Simply described, people can attach bounties to mathematical conjectures and
other people can try to come up with a proof. If they manage to do so, they
submit a formalized version that will be checked automatically and they will
receive the reward.</p>

<p>In this market where trust is based on automatic proof checkers, we can
imagine how disruptive a proof of False may be: someone who is able to
make the checker believe that they can prove False can actually
prove any theorem and therefore is able to claim payment for any awaiting
conjecture. They can also produce programs that do not really meet the
specifications they claim to meet.</p>

<p>Until we can have absolute certainty that a proof checker, such as the
kernel of a proof assistant, does not make it possible to prove False,<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>
we need to leave room for this possibility and take measures so that it does
not break havoc.<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup></p>

<p>To prevent a large disruptive effect, we need to have counter-measures for
when a proof of False is found, and as soon as we acknowledge this, it becomes
clear that we need to incentivize people to prove False and to share their
proofs, by paying them for such a proof<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup> (in order to trigger said
counter-measures).</p>

<h2 id="what-would-counter-measures-be-like">What would counter-measures be like?</h2>

<p>The basic idea is rather simple: as soon as a proof of False has been found,
freeze the entire market for the time it takes for the developers of the proof
checker to release a new version where the bug has been fixed. Once such a
version is released, check all existing proofs and put transactions that are
linked to a proof that does not check anymore on hold. If a proof was relying
on a lemma that has been invalidated, the proof (and the associated
transaction) can still be saved by finding an alternative proof to the lemma.
Alternatively, if a transaction is associated to a theorem whose negation
happens to be provable, or if no valid proof can be found for a reasonable
delay, revert the transaction.</p>

<p>This looks like transaction history rewriting, like the hard fork of Ethereum
blockchain after
<a href="https://en.wikipedia.org/wiki/Ethereum#The_DAO_event">the DAO event</a>, but this
is different because here the reverting of such transactions is part of the
predefined crypto-currency protocol so there is no debating to do on the
legitimacy of such an action.</p>

<h2 id="how-to-make-sure-that-people-share-their-proof-of-false-rather-than-using-them-to-steal-other-peoples-money">How to make sure that people share their proof of False rather than using them to steal other people’s money?</h2>

<p>All proofs are public and people may look at them carefully to see whether
they look suspicious or not. If a proof looks suspicious, then the person who
finds the proof suspicious can try to derive a proof of False from it, either
by proving that the theorem that is proved is actually wrong, or by extracting
the fallacious argument (hack exploiting a critical bug) from the proof and
using it to prove False directly. Then the person gets the reward and the
original author of the suspicious proof loses their own rewards. Given that
this is bound to happen, the self-interest of the original author pushes them
to share their proof of False directly.</p>

<h2 id="where-does-the-money-for-paying-proofs-of-false-come-from">Where does the money for paying proofs of False come from?</h2>

<p>The first solution that comes to the mind is to create these rewards out of
fin air. Unfortunately, sudden creation of money decreases the value of the
currency for everyone, and thus each proof of False has a negative impact on
the whole market. This impact is unpredictable.</p>

<p>Another solution is inspired by CDS
(<a href="https://en.wikipedia.org/wiki/Credit_default_swap">credit default swaps</a>):
people can bet that no proof of False will be found by buying these bonds.
The bonds have a predictable growth rate. Whenever a proof of False is found,
the bonds serve to pay the reward and thus some people lose money but the
actual market is unaffected (the money to pay the CDS rent is created<sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">4</a></sup> in a
fully predictable way).</p>

<p>This form of self-insurance would moreover be a strong driver to get a more
and more resilient proof checker.</p>

<p>We could discuss how these bonds would work in more details, although this
is not the subject of this post. Bonds could be created at regular intervals
and so the longer since the last proof of False, the bigger the reward is
(and the less interesting not sharing a proof of False becomes). The rent
for these bonds could slowly decrease over time to compensate for the
creation of new bonds (but sufficiently slowly so that people are well
compensated for their initial investment). At bond creation, there could be
an auction to choose who gets to buy it first and at what price.</p>

<p>Note that this might not be completely sufficient to avoid a sudden bad
impact of a proof of False on the market, because if people start to believe
that there is no proof of False left to be found, then they can start to
think that the (large) reward for such a proof is never going to be
claimed, and thus that this represents an amount of money that is actually
out of the currency system. If such a belief is then contradicted, this
would still create a shock.</p>

<h2 id="limitations">Limitations</h2>

<p>A first, important, limitation is the strong link required between the proof
market and the crypto-currency itself. This is not without reason though, as
smart contracts (which are basically programs) based upon invalidated proofs
that they meet certain specifications would need to be invalidated as well.</p>

<p>A second limitation is the uncertainty that this places upon any transaction
in the system. If some transactions happen to be reverted, then the wallet
that was used to send you money may not have had enough money to actually do so.
Then you will lose whatever exceeding amount you have received from this wallet.
If this means that you, in turn, would not have been able to realize some
transactions you previously conducted, the recipient may lose part of their
money as well…</p>

<p>This inherent risk to any transaction may be evaluated and taken into account.
With a public transaction record, it is easy to compute a risk factor
depending on the amount available in the payer’s wallet, the part of this
money that comes directly from rewards in the proof market and how long the
associated proofs have been there, and recursively the risk associated to each
of the transactions the rest of the money comes from. If this risk is too
high, it might be a reason to refuse a transaction. Otherwise, the associated
risk might just be taken into account as a supplementary fee.</p>

<p>An alternative solution to both of these limitations is to make the proof
market use its own reward tokens that can be converted into real digital coins
only after some time has elapsed. Then only the internal transactions in the
proof market can be reverted and there is no risk associated to transactions
that take place outside of it. This supposes to define what delay would be
sufficient to guarantee with near certainty that the proofs that were submitted
are not suspicious.</p>

<h2 id="conclusion">Conclusion</h2>

<p>We may legitimately ask whether this whole protocol is necessary. At the
moment, proof checkers are not critical enough applications to be fully
trustworthy in an adversarial context. They are very helpful to verify critical
applications, but in this case the proof author is not trying to fool the
checker, and the risk of accidentally exploiting a bug is much lower.
We could wait until a proof checker is, itself, formally verified (a huge task
but still bound to happen in the future). However, we would still be trusting
a conjecture: that the underlying logic is consistent.<sup id="fnref:5" role="doc-noteref"><a href="#fn:5" class="footnote" rel="footnote">5</a></sup> That in itself may
not be viewed as such a big problem, given that the whole field of
cryptography, and therefore crypto-currencies as well, already depend on a
<a href="https://en.wikipedia.org/wiki/One-way_function">conjecture</a>.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>Actually we won’t ever reach this level of certainty: even if we could guarantee that there are no implementation bugs left, there could still be inconsistencies in the mathematical theory that is used itself. We can never be fully sure such inconsistency is not present because of Gödel’s second incompleteness theorem. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>This echoes <a href="https://www.youtube.com/watch?v=O45LaFsaqMA">Vladimir Voevodsky proposal</a> of getting ready to work on mathematical proofs in inconsistent settings. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p>The idea of paying for a formal proof of a theorem and in particular for a proof of False is not novel, cf. <a href="https://www.reddit.com/r/Bitcoin/comments/1u6oza/proof_market_submit_proof_get_paid_with_bitcoin/ceffmdl/">this comment</a> on /r/Bitcoin in early 2014. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:4" role="doc-endnote">
      <p>Or, if you want to avoid money creation, the rent of these bonds can be paid by an insurance fee on all transactions in the proof market. <a href="#fnref:4" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:5" role="doc-endnote">
      <p>A conjecture that itself can never be completely solved, because of Gödel’s second incompleteness theorem. <a href="#fnref:5" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>
]]></content:encoded>
        </item>
	  
    
	  
        <item>
          <title>Notes on successfully migrating 4900 bug reports from Bugzilla to GitHub issues</title>
          <description>I started contributing to Coq in 2015. This year, the Coq development team was organizing the first Coding Sprint (later renamed into the Coq Implementors Workshop) and was accepting pull requests on the GitHub repository to get patches from external contributors. Back in these days, almost none of the development was carried out through pull requests (I opened PR #68). Things have changed dramatically since then.</description>
          <pubDate>Tue, 31 Oct 2017 15:00:00 +0100</pubDate>
          <link>https://www.theozimmermann.net/2017/10/bugzilla-to-github/</link>
          <guid isPermaLink="true">https://www.theozimmermann.net/2017/10/bugzilla-to-github/</guid>
          
          
		  <content:encoded><![CDATA[<h2 id="prelude">Prelude</h2>

<p>I started contributing to Coq in 2015. This year, the Coq development team
was organizing the first Coding Sprint (later renamed into the Coq Implementors
Workshop) and was accepting pull requests on the GitHub repository to get
patches from external contributors<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. Back in these days, almost none of the
development was carried out through pull requests (I opened PR #68). Things
have changed dramatically since then.</p>

<p><img src="/images/coq-pull-requests-over-time.png" alt="Pull request creation on the Coq repository over time" /></p>

<p>Pull requests are now used routinely to review other developers’ patches before
integrating them; continuous integration was introduced to automatically test
whether a proposed change breaks a number of tracked external developments
(plugins and libraries)<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>. These new processes have brought much stability
to the software at the price of a reasonably small overhead. They have also
demonstrated to be an excellent tool for sharing knowledge.</p>

<p>Meanwhile, bugs continued to be reported on <a href="https://www.bugzilla.org/">Bugzilla</a>,
the bug tracker that was used since July 2007 (after a first migration from
<a href="https://www.samba.org/jitterbug/">JitterBug</a>). Bugzilla suffered from many
drawbacks that were made all the more apparent when comparing to the much nicer
experience we were having in pull request discussions on GitHub.</p>

<p>Simply setting e-mail notifications for new bug reports was a hard task: we
had the mailing list <a href="mailto:coq-bugs-redist@lists.gforge.inria.fr">coq-bugs-redist@lists.gforge.inria.fr</a> which was connected
to a Bugzilla account that was put in cc of all new bug reports. But to
subscribe to this mailing list, you had to get moderator approval and, for some
time, no one was administrating this mailing list anymore<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>.</p>

<p>More importantly, the lack of edition features, the difficulty to search an
issue, the loading times, the intimidating UI had a (non-quantified but probably)
significant impact on the developers, who tended to prefer slightly off-topic
discussions and digressions in a pull request thread, rather than discussing
each specific issue in a separate thread on Bugzilla.</p>

<p>In April 2017, I opened a <a href="https://github.com/coq/coq/wiki/BugzillaVsOtherTools">wiki page</a>
to discuss the possible
alternatives. Having a strong preference for gathering all our tools on GitHub,
I documented this one (and no one really documented any other alternative,
even if they existed).</p>

<p>In August, the Coq website was down for more than a week because of an
over-reaction of the IT services to an alleged hacking of the bug tracker
(<a href="https://sympa.inria.fr/sympa/arc/coq-club/2017-08/msg00040.html">in fact just a spam</a>). This was a good opportunity to
<a href="https://sympa.inria.fr/sympa/arc/coqdev/2017-08/msg00019.html">discuss once more</a>
a migration to GitHub issues (with hosting less dynamic, subject-to-attack,
content as a nice benefit).</p>

<p>While I was initially proposing a transition during which we would be using both
bug trackers in parallel, the need to keep bug numbers as much as possible
was expressed and a script was found<sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">4</a></sup> which was designed for that purpose.</p>

<h2 id="the-migration-script">The migration script</h2>

<p>The migration script that was found is a Python script<sup id="fnref:5" role="doc-noteref"><a href="#fn:5" class="footnote" rel="footnote">5</a></sup> which takes an export
from Bugzilla to XML as input and uses the GitHub API to create new issues
for every bug reports. It inserts first the bug reports whose number it can keep<sup id="fnref:6" role="doc-noteref"><a href="#fn:6" class="footnote" rel="footnote">6</a></sup>
and only when this is done it inserts bug reports that need to be renumbered.</p>

<p>Because issue numbers are attributed by GitHub at creation time and are not
chosen by the issue author, it is not possible to skip some non-existent bug
number. That’s why the script contained an initial check that the input bug
numbers are contiguous. This was not the case for the Coq Bugzilla: many bugs
had been deleted, especially in the early years. Thus, the first modification
that I did to this script was to use postponed bug reports to fill the holes
(missing bug numbers) to recreate continuity in the result. This worked
because the number of pull requests was already higher than the number of holes.</p>

<p>To increase the predictability of new issue numbers, it was important that no
issue or pull request be opened during the few hours that the migration took
to complete. This was achieved thanks to the “cool-down” feature that GitHub
provides.</p>

<p><img src="/images/cool-down-github.png" alt="Temporary interaction limit settings" /></p>

<p>We wanted to limit interaction permissions as much as possible during the
migration, but removing contributors also meant losing the ability to assign
issues to them. The solution that was found was to add all the people who had
bug reports assigned to them to the External team of the Coq organization,
then temporarily restrict the permissions of this team to “Read” (basically the
same thing as anyone else given that this is a public repository).</p>

<p><img src="/images/teams-github.png" alt="Team and collaborator settings" /></p>

<p>Another critical issue with the script was that the GitHub API was limiting issue
creation to 300, after what it refused any new posting for the next 30 minutes
(not just through the API by the way, during my tests I was also prevented from
manually posting comments during this delay). While I initially implemented a
wait-period, this limitation was going to make the migration unbearably long.
Fortunately, after reaching out to GitHub support, they explained that this
limitation was imposed on any interaction that emitted notifications but that
they also provided a
<a href="https://gist.github.com/jonmagic/5282384165e0f86ef105">beta API specifically dedicated to issue import</a> that had many notable advantages, one of them being that new issues created
through this API did not emit notifications, and thus were not submitted to
the same rate limits.</p>

<p>There are many more advantages to this API: you can create at once an issue and
many comments, set creation dates for each of them, assign someone, set a
milestone and some labels, etc. Adapting the script to this API was easy: the
main difference is that the API is asynchronous. To ensure that issue numbers
are predictable, you must make it synchronous by sending GET requests to check
whether an issue has been created before sending the next one. On the advice
of GitHub support, I implemented a back-off approach: first wait one second
before sending the GET request, if still pending wait for twice that time
before sending another request, if still pending wait for twice the previous
time, etc. The one-second delay meant that we could not import more than 3600
issues per hour in theory (in practice the migration almost took four hours,
which indicates that many times it took more than one second to import an
issue; I did not collect this information, unfortunately).</p>

<p>On the other hand, the API still has some limitations: you can’t recreate the
complete history of closing/re-opening and assignments, the labels and the
assignees are put at issue import time, whereas you can set the
closing date. I regret not having set the <code class="language-plaintext highlighter-rouge">updated_at</code> field: I did not see
what purpose it served: in fact it is useful when you sort issues by “Recently
updated” (then GitHub displays the date of the last update).</p>

<p>This API does not allow you to choose the author of issues / comments
either and requires API requests to be authenticated with a repository
administrator API token. That’s why our bot account
<a href="https://github.com/coqbot">@coqbot</a> appears as the author of all imported
issues and comments.</p>

<p>Some other improvements of the script included saving a trace of imported
bug reports with the Bugzilla / GitHub ID correspondence, and using this
to safely recover from possible crashes, fixing most references to other
bug reports, and some very Coq-specific stuff like not displaying comment
authors for the first 1657 comments because these were imported from
JitterBug to Bugzilla ten years ago and the migration attributed all the
comments in a given bug report to the initial reporter.</p>

<p>The <a href="https://gist.github.com/Zimmi48/d923e52f64fe17c72852d9c148bfcdc6#file-bugzilla2github">resulting script</a>
is, I believe, largely improved over the original one but also not as generic.
If you wish to use it for your own migration, feel free to do so and don’t
forget to remove the Coq-specific material first. If you want to share the
result, especially if it is more generic, and thus a better basis for future
users, I will be happy to add the link from this post.</p>

<h2 id="epilogue">Epilogue</h2>

<p>The migration was formally approved at the Coq Working Group on Oct 3-4th, 2017,
and was conducted right after the 8.7.0 release, on the morning of October
18th. It was preceded by a series of e-mails to announce it and
the fact that both bug trackers (the old and the new one) would be read-only
for the duration of the migration.</p>

<p>All the bugs with a number below 1154 had to be renumbered, you can find
a nice correspondence table with a search bar
<a href="https://github.com/coq/coq/blob/master/dev/bugzilla2github_stripped.csv">here</a>.
All the other bugs kept their number.</p>

<p>While the migration went smoothly, only time will tell how effective the
change was on the development organization. I plan to fiddle with the GitHub
API some more to get interesting statistics of issue creation before and
after the migration (with the cool advantage that dates have been preserved
for bug reports from before the migration), how long it takes to solve a
bug on average, the growth of unsolved issues, etc. If you know of some
services or scripts that already provides such statistics, I would be happy
to know about them.</p>

<p>In other news, Pierre Letouzey has
<a href="https://github.com/coq/coq/wiki/WikiMigration">migrated the Coq wiki to GitHub</a>
as well :) which means that the Coq website is fully static now.</p>

<h3 id="updates">Updates</h3>

<ul>
  <li>Pierre has reused the correspondence table to redirect previous Bugzilla URLs
to new GitHub ones. For instance, <a href="https://coq.inria.fr/bugs/show_bug.cgi?id=2">https://coq.inria.fr/bugs/show_bug.cgi?id=2</a>
now redirects to <a href="https://github.com/coq/coq/issues/1156">https://github.com/coq/coq/issues/1156</a> and
<a href="https://coq.inria.fr/bugs/show_bug.cgi?id=1153">https://coq.inria.fr/bugs/show_bug.cgi?id=1153</a> now redirects to
<a href="https://github.com/coq/coq/issues/5970">https://github.com/coq/coq/issues/5970</a>.</li>
  <li>Erik Martin-Dorel has adapted the script to the migration of issues from a GitHub
repository to another one and has used it successfully to migrate the 101 issues
from <a href="https://github.com/psteckler/ProofGeneral">https://github.com/psteckler/ProofGeneral</a> to
<a href="https://github.com/ProofGeneral/PG">https://github.com/ProofGeneral/PG</a>. The new script is available at
<a href="https://github.com/erikmd/github-issues-import-api-tools">https://github.com/erikmd/github-issues-import-api-tools</a>.</li>
</ul>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>As can be seen on the graphic, pull requests started being opened much before (in August 2011) but the Coding Sprint marked (to my knowledge) the time when the Coq development team started to encourage contributors to open them. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>See the documentation of the continuous integration here: <a href="https://github.com/coq/coq/tree/master/dev/ci#continuous-integration-for-the-coq-proof-assistant">https://github.com/coq/coq/tree/master/dev/ci#continuous-integration-for-the-coq-proof-assistant</a> <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p>In <a href="https://sympa.inria.fr/sympa/arc/coqdev/2017-04/msg00025.html">this thread</a>, we discover that the administrator of the mailing list was someone who had left the development team for several years. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:4" role="doc-endnote">
      <p>By Guillaume Melquiond, <a href="https://sympa.inria.fr/sympa/arc/coqdev/2017-08/msg00042.html">https://sympa.inria.fr/sympa/arc/coqdev/2017-08/msg00042.html</a> <a href="#fnref:4" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:5" role="doc-endnote">
      <p>It is now available on the following GitHub repository:
  <a href="https://github.com/berestovskyy/bugzilla2github">https://github.com/berestovskyy/bugzilla2github</a>.
  It has received a number of improvements since then. <a href="#fnref:5" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:6" role="doc-endnote">
      <p>On GitHub, issue reports and pull requests share a common set of identifiers. Given that about 1100 pull requests were opened on the Coq GitHub repository before the start of the migration, that was as many numbers that couldn’t be used for issue reports. <a href="#fnref:6" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>
]]></content:encoded>
        </item>
	  
    
	  
        <item>
          <title>Exploring the Stack Exchange way</title>
          <description>Like every programmer, I have known the Stack Overflow Q&amp;A website for a long time now. For our community, it probably was one of the most important innovations of the recent years and it is now a routinely used tool. Have a question on programming? You google it, and you are most likely to find, among the first results, one or several questions on Stack Overflow with good answers to your problem. A little bit like when googling for a general notion, one of the first results should probably be a Wikipedia page.</description>
          <pubDate>Sat, 24 Dec 2016 12:00:00 +0100</pubDate>
          <link>https://www.theozimmermann.net/2016/12/stackoverflow/</link>
          <guid isPermaLink="true">https://www.theozimmermann.net/2016/12/stackoverflow/</guid>
          
          
		  <content:encoded><![CDATA[<h2 id="introducing-stack-overflow">Introducing Stack Overflow</h2>

<p>Like every programmer, I have known the <a href="http://stackoverflow.com/">Stack Overflow</a> Q&amp;A website for a long time now.
For our community, it probably was one of the most important innovations of the recent years
and it is now a routinely used tool.
Have a question on programming?
You google it, and you are most likely to find, among the first results,
one or several questions on Stack Overflow with good answers to your problem.
A little bit like when googling for a general notion,
one of the first results should probably be a Wikipedia page.</p>

<p>This is one of the key aspects of the platform.
Most of its traffic comes from search engines and, similarly to Wikipedia, most viewers are just that: viewers.
The platform does not try and actually does not want to convert most of the viewers into users
because they would not bring significant value
(value for the platform being good questions and most importantly good answers).
In that respect, it is taking a very different approach compared to all the “social” platforms that pop up these days,
and in particular it is much different from Quora, a competitor Q&amp;A platform,
which used to require signing up just to view a single question
(I never did; now it asks me to sign up to view a second question).</p>

<p>The second and the most known component of the platform formula is to award “reputation”.
Users earn reputation points by asking good questions and giving good answers and being up-voted by other users.
Reputation has an inherent value for some programmers because it can help demonstrate to future employers
that you possess expert skills which have been recognized by others.
The same teacher who encouraged the students in my class to create a blog and a LinkedIn account
also told us about earning reputation on Stack Overflow.</p>

<p>Reputation is also key to getting more involved in the community itself
as you can unlock new privileges when reaching certain levels.
Thus, it acts as XP in video games and it actually helps gamifying the whole activity of helping each other out.
And it acts as a filter.
By not getting full access to the website features right from the start,
new users are taken through a path which will teach them how to properly interact with it.
Only with some reputation can you start up-voting, later you can start leaving comments,
later still you can start down-voting.</p>

<p>The community self-moderates.
Moderation is crowd-sourced, as people with enough moderation can vote to close down bad questions.
The dreaded down-vote is one main source of moderation.
And it is one of the barrier to overpass when you are a new user
because you are most likely to not fully understand the website requirements<sup id="fnref:newbie" role="doc-noteref"><a href="#fn:newbie" class="footnote" rel="footnote">1</a></sup>.
Thus people may down-vote your question. It can feel a bit harsh.
But then if you are wise, you edit or delete your question and learn from the experience<sup id="fnref:deleting" role="doc-noteref"><a href="#fn:deleting" class="footnote" rel="footnote">2</a></sup>.</p>

<p>Questions should show research: don’t ask what is obvious.
Questions are supposed to serve as a canonical documentation for later viewers: duplicates are banned.
While it is generally not recommended to dig up an old thread on a traditional forum,
it is very much encouraged to add your answer or a comment or your vote to an old question.</p>

<p>StackOverflow is organized with tags, and this is very useful given the number of questions the site receives.
Given that I am not too much into mainstream technologies,
I can reduce drastically the number of questions I see by
<a href="http://stackexchange.com/filters/252631/open-source-elm-coq-nix">following only the tags which I am interested in</a>.
This year, I started following the Coq tag for the same reason I follow the Coq-Club mailing list:
to know what the questions of beginners are, and to learn from the answers that other people give.</p>

<h2 id="the-adventure-of-crowd-sourced-documentation">The adventure of crowd-sourced documentation</h2>

<p>In August of this year, Stack Overflow introduced Documentation in public beta.
They got my attention immediately as I want to see how they can apply their reputation-based methodology
to the more complicated problem of mass collaboration for writing.
So far, only Wikipedia has developed a successful model for such mass collaboration.</p>

<p>Wikipedia’s model is based on a posteriori moderation:
anyone can contribute anytime and their edit is live immediately,
but some people and some bots are constantly reviewing recent changes
and when changes do not respect the rules, or obviously decrease the page’s quality, they are reverted.</p>

<p>On the contrary, Stack Overflow’s model revolves around reputation-based a priori moderation.
To start proposing changes to the documentation on one particular programming language,
you will first have to demonstrate your skills by getting up-votes for an answer on this language.</p>

<p>According to Michael Nielsen in <em>Reinventing discovery</em>, the wiki-novel “A Million Penguins”
was a failure mainly because moderation was done by a limited group of persons (students in fact)
who could not keep up with all the contributions which arrived due to the publicity around the project.
Stack Overflow does not do this mistake by having a large body of reviewers
(anyone above a certain level of reputation).
Although several positive reviews are necessary to approve an edit,
there have still been problems with bad edits being approved too often<sup id="fnref:audits" role="doc-noteref"><a href="#fn:audits" class="footnote" rel="footnote">3</a></sup>.
While reverts (“rollbacks”) are possible, they are not supposed to be part of the standard workflow.</p>

<p>After being curious at the beginning and even contributing some documentation about Elm (a programming language I recently got interested in),
I was a bit disappointed by the current result and stopped participating
(this was also the beginning of my PhD so I had other topics with higher priority).
Still, I think this will be interesting to see what this Documentation feature gives
after a longer period of gradual improvements.</p>

<p><em>Update:</em> As of August 2017, Stack Overflow has decided to shutdown the documentation,
showing once again how hard organizing collaborative writing is.</p>

<h2 id="the-stack-exchange-galaxy">The Stack Exchange galaxy</h2>

<p>As Stack Overflow kicked off right from the start,
<a href="http://stackexchange.com/sites?expand=true#oldest">new Q&amp;A sites</a> were added by the team
so that other domains and other communities could benefit from the same reputation-based software.
No site has ever reached the size of Stack Overflow, which is huge,
but some of them have become pretty well-known on their own and all have an active community.</p>

<p>Nowadays, the process to create a new site is entirely community-driven.
There is a series of steps to go through, and a special site dedicated to the creation of new sites:
<a href="http://area51.stackexchange.com/">Area 51</a>.
This is somewhat comforting me a little from the fact that the software is not open source<sup id="fnref:free" role="doc-noteref"><a href="#fn:free" class="footnote" rel="footnote">4</a></sup>.
You cannot run your own instance, but at least if you gain enough momentum you can start a new site on a new topic.</p>

<p>Among the sites that were added lately
(only one and a half year ago actually, so it is seven years younger than Stack Overflow) is
<a href="http://opensource.stackexchange.com/">a beta site on free and open source software</a>.
I registered four months ago to answer <a href="http://opensource.stackexchange.com/questions/4254/">a question</a>
which was on the verge of being closed because people thought it was not answerable objectively.
Since then, I’ve answered 46 more questions, always happy to spread the good word
and to help out people who struggle to understand the complicated world of copyright and licenses
(questions about licenses are what this site gets the most).
This has also helped me <a href="http://opensource.stackexchange.com/users/5858/zimm-i48">gain reputation</a>
faster than on StackOverflow, and thus has allowed me to test and better understand the various
priviledges and moderation tools so that I could write this blog post.</p>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:newbie" role="doc-endnote">
      <p>The website tries very hard to discourage you from posting your question though. It displays the rules, tries to automatically identify bad questions (too much code is one criterion), proposes you similar questions that might contain an answer. The problem is that people on the Internet are used to not reading the rules and feel like they are always in a hurry. This is something that people on Stack Overflow do not tolerate. <a href="#fnref:newbie" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:deleting" role="doc-endnote">
      <p>There is even a “peer-pressure” badge for deleting a question that was down-voted. That was my very first badge! <a href="#fnref:deleting" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:audits" role="doc-endnote">
      <p>Stack Overflow had to introduce “audits” in <a href="http://meta.stackoverflow.com/questions/336627/documentation-update-october-20th">an update of the Documentation feature</a> to automatically spot and ban the reviewers who approve anything, like blatant vandalism for instance. <a href="#fnref:audits" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:free" role="doc-endnote">
      <p>But it looks like they thought about open sourcing it: <a href="http://meta.stackexchange.com/questions/3086/will-open-sourcing-stack-overflow-destroy-our-business-model">http://meta.stackexchange.com/questions/3086/will-open-sourcing-stack-overflow-destroy-our-business-model</a>. <a href="#fnref:free" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>
]]></content:encoded>
        </item>
	  
    
	  
        <item>
          <title>Does electronic voting undermine democracy?</title>
          <description>If you ask a random person in the world of computing, there are good chances they will not have a good opinion on electronic voting. Indeed, this population, more informed than average, knows that there is no information system without flaws, whether they come from bugs, design errors, or intensional insertion of &quot;backdoors&quot;. Moreover, the majority of the electronic voting systems in use today require to give the keys of the voting boxes to a &quot;trusted third party&quot;, without any possible check on the correct conduct of the ballot, from which a legitimate distrust arises, all the more important when the stakes of an election are great.</description>
          <pubDate>Tue, 23 Feb 2016 17:00:00 +0100</pubDate>
          <link>https://www.theozimmermann.net/2016/02/electronic-voting/</link>
          <guid isPermaLink="true">https://www.theozimmermann.net/2016/02/electronic-voting/</guid>
          
          
		  <content:encoded><![CDATA[<p>If you ask a random person in the world of computing, there are good chances they will not have a good opinion on electronic voting. Indeed, this population, more informed than average, knows that there is no information system without flaws, whether they come from <a href="https://en.wikipedia.org/wiki/Software_bug">bugs</a>, design errors, or intensional insertion of “<a href="https://en.wikipedia.org/wiki/Backdoor_%28computing%29">backdoors</a>”. Moreover, the majority of the electronic voting systems in use today require to give the keys of the voting boxes to a “trusted third party”, without any possible check on the correct conduct of the ballot, from which a legitimate distrust arises, all the more important when the stakes of an election are great.</p>

<figure>
 <img src="http://kinea.media/static/vote-electronique/klifton.jpg" />
 <figcaption>Illustration by Klifton Kleinmann.</figcaption>
</figure>

<p>But it would be absolutely naive to be content with rejecting electronic voting on the whole because it is already in use everywhere: from professional elections, to associations… and even in certain political elections. Moreover, many politicians are now advocating for a general implementation of electronic voting, in particular with the aim of improving the rate of participation. We therefore shouldn’t refuse to look at and analyze the risks and benefits induced by this type of ballot. Or rather, we should say, <em>these</em> types of ballots. Electronic voting can be of two very different kinds: voting machines and Internet voting. We will deal with both but take care to distinguish between their issues.</p>

<p><a href="http://kinea.media/en/politics-society/electronic-voting-democracy">Read the rest of this article on Kinea</a>, the multilingual magazine where it was published.</p>
]]></content:encoded>
        </item>
	  
    
	  
    
	  
    
  </channel>
</rss>
