<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Memo on BXM.net</title>
    <link>https://bxm.net/tags/memo/</link>
    <description>Recent content in Memo on BXM.net</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 22 Oct 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://bxm.net/tags/memo/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>BXM 0.1.0 Launches With Canon and Memo, Two Open Source Tools for Repeatable Results</title>
      <link>https://bxm.net/bxm-0.1.0-launches-with-canon-and-memo-two-open-source-tools-for-repeatable-results/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://bxm.net/bxm-0.1.0-launches-with-canon-and-memo-two-open-source-tools-for-repeatable-results/</guid>
      <description>&lt;p&gt;BXM 0.1.0 is out. It&amp;rsquo;s two small command-line tools in one repository, open source under the Apache License 2.0, with builds for Linux, macOS and Windows.&lt;/p&gt;&#xA;&lt;p&gt;They share one idea. Same input, same bytes, same result. Canon applies it to data and Memo applies it to work.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;BXM Canon&lt;/strong&gt; is a binary encoding with exactly one valid form for every value. Two programs that encode the same data get the same bytes, whatever order they wrote the keys in and however they spelled the numbers. A hash or a signature taken on one machine holds on every other. The decoder refuses any byte string that isn&amp;rsquo;t the one encoding of its value, so a second spelling can&amp;rsquo;t sneak in through the back door.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why CI Pipelines Redo Work Nobody Changed and How a Command Memoizer Stops It</title>
      <link>https://bxm.net/why-ci-pipelines-redo-work-nobody-changed-and-how-a-command-memoizer-stops-it/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://bxm.net/why-ci-pipelines-redo-work-nobody-changed-and-how-a-command-memoizer-stops-it/</guid>
      <description>&lt;p&gt;Watch a CI log for a week and count the steps that produced exactly the same output as last time. Code generation from schemas that didn&amp;rsquo;t change. Image resizing for assets nobody touched. Test fixtures rebuilt from the same seed data. A documentation site rendered from the same pages. Each step is a few seconds or a few minutes. On every push, on every branch, on every laptop, it adds up to hours a week of machines doing work they&amp;rsquo;ve already done.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How BXM Was Tested With Two Million Damaged Inputs, Sixteen Processes and a Killed Run</title>
      <link>https://bxm.net/how-bxm-was-tested-with-two-million-damaged-inputs-sixteen-processes-and-a-killed-run/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://bxm.net/how-bxm-was-tested-with-two-million-damaged-inputs-sixteen-processes-and-a-killed-run/</guid>
      <description>&lt;p&gt;Each BXM tool makes one main promise. Canon promises that every value has exactly one encoding. Memo promises that it never hands you a wrong or half-restored output. Most of the testing went into trying to break those two promises, and the results are recorded in the repository&amp;rsquo;s &lt;code&gt;test/results&lt;/code&gt; folder by a script anyone can run again.&lt;/p&gt;&#xA;&lt;h2 id=&#34;canon&#34;&gt;Canon&lt;/h2&gt;&#xA;&lt;p&gt;The property behind Canon is short to state: if the decoder accepts a byte string, encoding the decoded value gives back exactly the same bytes. If that holds, no value can have a second accepted spelling.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Memo in GitHub Actions Skipped a Rust Release Build and Caught Runners With Different Compilers</title>
      <link>https://bxm.net/memo-in-github-actions-skipped-a-rust-release-build-and-caught-runners-with-different-compilers/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://bxm.net/memo-in-github-actions-skipped-a-rust-release-build-and-caught-runners-with-different-compilers/</guid>
      <description>&lt;p&gt;Most CI jobs build the same thing again and again. A docs fix or a typo in a README triggers the whole pipeline, and the release build runs as if the code had changed. This case study puts BXM Memo in front of one such step, a release build of the &lt;code&gt;bxm-canon&lt;/code&gt; binary, and keeps Memo&amp;rsquo;s cache between jobs with &lt;code&gt;actions/cache&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The workflow is in the &lt;a href=&#34;https://github.com/softdevstudio/bxm&#34;&gt;repository&lt;/a&gt; as &lt;code&gt;.github/workflows/case-study-memo.yml&lt;/code&gt;. Five jobs run one after another, each on a fresh GitHub-hosted runner. &lt;code&gt;plain&lt;/code&gt; builds without Memo for the baseline. &lt;code&gt;cold&lt;/code&gt; builds through Memo with an empty cache, &lt;code&gt;warm&lt;/code&gt; changes nothing, &lt;code&gt;docs&lt;/code&gt; edits the README, and &lt;code&gt;source&lt;/code&gt; edits a Rust source file. The inputs are &lt;code&gt;canon/src/**&lt;/code&gt;, &lt;code&gt;Cargo.toml&lt;/code&gt; and &lt;code&gt;Cargo.lock&lt;/code&gt;, and the salt is &lt;code&gt;rustc --version&lt;/code&gt;, so a different compiler means a different result. We ran the whole workflow twice.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Replaying 13 Commits Through Memo Cut Test Time From 228 to 79 Seconds and Turned Up Two Flaky Tests</title>
      <link>https://bxm.net/replaying-13-commits-through-memo-cut-test-time-from-228-to-79-seconds-and-turned-up-two-flaky-tests/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://bxm.net/replaying-13-commits-through-memo-cut-test-time-from-228-to-79-seconds-and-turned-up-two-flaky-tests/</guid>
      <description>&lt;p&gt;BXM&amp;rsquo;s repository has two packages with their own test suites: Canon, tested with &lt;code&gt;cargo test&lt;/code&gt;, and Memo, tested with &lt;code&gt;go test&lt;/code&gt;. Most commits touch one of them, or neither. A docs change or a new JavaScript build script doesn&amp;rsquo;t change either suite&amp;rsquo;s result, yet a plain CI job runs both every time.&lt;/p&gt;&#xA;&lt;p&gt;So we replayed the repository&amp;rsquo;s own history. All 13 commits from 0.1.0 to the end of 0.3.0 were checked out one after another, and both suites ran at each one. That happened twice: once plain, and once with each suite behind Memo. Canon&amp;rsquo;s suite takes &lt;code&gt;canon/**&lt;/code&gt; and the spec&amp;rsquo;s test vectors as inputs. Memo&amp;rsquo;s takes &lt;code&gt;memo/**&lt;/code&gt;. Memo needs a declared output, so each suite writes its log to a file and that file is the output.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why Did My Build Step Run Again, Six Cache Misses and What Memo Said About Each</title>
      <link>https://bxm.net/why-did-my-build-step-run-again-six-cache-misses-and-what-memo-said-about-each/</link>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://bxm.net/why-did-my-build-step-run-again-six-cache-misses-and-what-memo-said-about-each/</guid>
      <description>&lt;p&gt;A cache that misses without saying why is almost as annoying as no cache. Someone notices the step ran again, nobody knows why, and the cache key gets a random suffix &amp;ldquo;to be safe&amp;rdquo;. After that the cache never hits.&lt;/p&gt;&#xA;&lt;p&gt;BXM Memo keeps the manifest of the last run of each named job. On a miss it compares the two and says what changed. We put that to work on a small report step: a Python script that totals sales per region from monthly CSV files into &lt;code&gt;out/report.txt&lt;/code&gt;. The step runs through Memo with the script and &lt;code&gt;data/*.csv&lt;/code&gt; as inputs, &lt;code&gt;REPORT_CURRENCY&lt;/code&gt; as an environment variable that changes the result, and the Python version as the salt.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
