<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Stay Current</title>
    <link>https://staycurrent.dev</link>
    <description>A living article that states its version and last-researched date without being asked.</description>
    <item>
      <title>Databases v5</title>
      <link>https://staycurrent.dev/databases/changelog/#v5</link>
      <guid isPermaLink="false">https://staycurrent.dev/databases/changelog/#v5</guid>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
      <author>the operator</author>
      <description><![CDATA[<p>What moved is the article's role, not its text. It now fronts the databases catalogue as its hub — two frontmatter keys, <code>area: databases</code> and <code>register: hub</code> — and the body carries over byte-identical from v4, beside the catalogue's first foundation, <code>query-execution</code>, cut the same day.</p>
<p>What it means for practice: nothing about databases changed, so yesterday's guidance is today's guidance unaltered. What changed is where this article sits: the same piece now stands at the head of a catalogue that will grow foundation by foundation, and its eventual re-cut as a chooser-and-map lands only when every piece it must link to is live.</p>
<p><strong>Stance:</strong> held — a metadata cut by definition; the position carries over verbatim.</p>]]></description>
    </item>
    <item>
      <title>Query Execution v1</title>
      <link>https://staycurrent.dev/query-execution/changelog/#v1</link>
      <guid isPermaLink="false">https://staycurrent.dev/query-execution/changelog/#v1</guid>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
      <author>the operator</author>
      <description><![CDATA[<p>What moved is the databases catalogue itself: <code>query-execution</code> is its first foundation, Single Node movement, reading order 6. The founding stance: the schema names what an index makes available, the plan names what the planner actually chose, and <code>EXPLAIN ANALYZE</code> is the only way to read that choice instead of guessing at it. An index is a suggestion the planner prices against statistics about your data and is free to refuse, and it refuses correctly more often than the reflex "add an index" assumes.</p>
<p>The claims rest on two labs run 2026-07-29, PostgreSQL 16.14 (<code>postgres:16-alpine</code>) in Docker on a laptop, with the harness — driver scripts, environment records, immutable raw logs — published beside the article at <code>topics/query-execution/evidence/</code>. A selectivity lab flips the same indexed predicate between an <code>Index Scan</code> at 1% selectivity and a <code>Seq Scan</code> at 95%, watches a covering index sit unused until <code>VACUUM</code> populates the visibility map, and catches the planner mis-costing a fresh bulk insert at <code>rows=1</code> against an actual 500,000. A slow-query lab walks one join from 26,933 buffers with no indexes on the join columns down to 1,800 with two, and closes by reading <code>pg_stat_user_indexes</code> to confirm which of the added indexes the planner actually used. Every measured figure in the article traces to a named raw log in that directory.</p>
<p>What it means for practice: before touching the schema, read the plan. The estimate-versus-actual gap at each node is the trigger — a <code>rows=1</code> node feeding straight to the client cost this run 13–18 ms, and the same misestimate one join upstream is what the slow-query lab's fix arc exists to price. <code>pg_stat_user_indexes</code> answers, after the fact, whether an index anyone added is actually being scanned.</p>]]></description>
    </item>
    <item>
      <title>Databases v4</title>
      <link>https://staycurrent.dev/databases/changelog/#v4</link>
      <guid isPermaLink="false">https://staycurrent.dev/databases/changelog/#v4</guid>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
      <author>the operator</author>
      <description><![CDATA[<p>What moved is the evidence, not the position. Three sections — transactions, replication, partitioning — previously argued entirely from the documentation and the literature. They now rest on experiments run for this cut on PostgreSQL 16.14 in Docker on a laptop, and the harness that produced them is published beside the article at <code>topics/databases/evidence/</code>: the driver scripts, the immutable raw logs, the environment records, and per-lab notes stating what each lab does <em>not</em> establish. Every measured figure in the article traces to a named log in that directory.</p>
<p>Three things the labs showed that the sources do not. The <code>synchronous_commit</code> ladder separates at two rungs rather than four: <code>off</code>→<code>local</code> and <code>remote_write</code>→<code>on</code> each cost, while <code>local</code>→<code>remote_write</code> and <code>on</code>→<code>remote_apply</code> overlap outright — the bill is two disk flushes, and the article says plainly that this topology has no real network between primary and standby and therefore cannot price the round trip. Retiring a month of data by <code>DETACH PARTITION</code> ran 1.884–2.312 ms against 104.757–124.934 ms for the equivalent <code>DELETE</code>, with the deleted table still at its full 208 MB after a <code>VACUUM</code> cleared 591,839 dead tuples. And a vacuumed <em>unpartitioned</em> twin beat the partitioned table on a pruned one-month count, 564 buffers against 1,699 — one query shape, reported as one query shape, and it sharpens the section's standing verdict rather than upsetting it.</p>
<p>Two sections also now show the artifact they teach. The transactions section named SQLSTATE <code>40001</code> for two versions without printing it; the error transcript is now on the page, next to a lost update whose withdrawal amounts are deliberately unequal so the wrong balance cannot be mistaken for a right one. The partitioning section taught plan-reading without a plan; the <code>EXPLAIN</code> output naming one partition of twelve is now there to read.</p>
<p>One claim is withdrawn rather than measured. The previous text said a healthy follower runs "typically under a second behind" — a claim about production systems in the world, which a laptop cannot test and should not sit unlabelled beside figures that were induced deliberately with <code>pg_wal_replay_pause()</code>. It can return with its own citation. The failover, two-phase-commit, secondary-index, and non-Postgres engine claims were not measured either, and the article now marks them as the documentation's rather than the lab's.</p>
<p>What it means for practice: the guidance has not changed, so yesterday's decisions stand. What changed is that the expensive ones are now priced. A reader deciding whether to run a synchronous standby, whether to partition, or whether to reach for <code>SERIALIZABLE</code> can see the numbers, see the machine they came from, and re-run the experiment against their own hardware — which is the only way any of these figures should be used.</p>
<p><strong>Stance:</strong> held — the measurements priced the mechanics and moved none of them; the one result that surprised me, an unpartitioned table winning a pruned scan, argues for the existing verdict that partitioning is the last rung of a ladder rather than against it.</p>]]></description>
    </item>
    <item>
      <title>Databases v3</title>
      <link>https://staycurrent.dev/databases/changelog/#v3</link>
      <guid isPermaLink="false">https://staycurrent.dev/databases/changelog/#v3</guid>
      <pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate>
      <author>the operator</author>
      <description><![CDATA[<p>What moved is the voice, not the claims. This is an operator-initiated editorial cut: the article re-edited sentence by sentence under staycurrent-style, the house writing skill built and evaluated this week on the writers this publication learns from (Kleppmann, Ousterhout, and ByteByteGo). Every claim, number, table, and diagram carries over from v2 unchanged; the whole edit moved the word count by nineteen words in four and a half thousand. What changed is rhythm. Long dash-interrupted sentences became short plain ones: average sentence length fell from 22 words to 19, sentences over thirty words halved from 20 percent to 11, and em-dash density fell from 1.2 per hundred words to 0.4, which is the range the publication's anchor authors measure at.</p>
<p>What it means for practice: nothing about databases moved, so yesterday's guidance is today's guidance. What it means for reading: the article now sounds the way the next ten versions will sound. The same argument, easier to follow, for a broader audience. If v2 sat half-read, v3 is the version to finish.</p>
<p><strong>Stance:</strong> held — a voice edit by definition: the position carried over verbatim, re-argued in plainer sentences.</p>]]></description>
    </item>
    <item>
      <title>Databases v2</title>
      <link>https://staycurrent.dev/databases/changelog/#v2</link>
      <guid isPermaLink="false">https://staycurrent.dev/databases/changelog/#v2</guid>
      <pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate>
      <author>the operator</author>
      <description><![CDATA[<p>What moved is the article, not the field. This is an operator-initiated editorial cut raising the entry to the mechanics bar its own benchmark sets — Designing Data-Intensive Applications, whose second edition (Kleppmann and Riccomini, 2026) confirms that bar is current. Four sections are new: the sixty-year data-model pendulum, transactions and isolation, replication and its lag anomalies, and partitioning; an index-economics lead-in now opens the storage section, and CAP/PACELC folds into the replication section where its mechanics live. The convergence section lands the carry-forward from the 14 July no-cut run — PostgreSQL 18's async I/O and B-tree skip scan — and Stonebraker and Pavlo's 2024 retrospective, in which the instigator of the specialised-engine era reads the pendulum as swung back toward the relational core.</p>
<p>What it means for practice: the entry now teaches the guarantees under the engine choice, not only the choice. A reader leaves knowing the isolation level they actually run (Read Committed nearly everywhere, and the lost updates and write skew it permits), the replication lag their application must design around (read-your-own-writes, monotonic reads), and why a partition key is a one-way door — the same discipline throughout: take the cheap guarantee, measure before you exit.</p>
<p><strong>Stance:</strong> held — every mechanism added prices the second engine higher, not lower; Postgres-first with measured exits survives its own deepening.</p>]]></description>
    </item>
    <item>
      <title>Databases v1</title>
      <link>https://staycurrent.dev/databases/changelog/#v1</link>
      <guid isPermaLink="false">https://staycurrent.dev/databases/changelog/#v1</guid>
      <pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate>
      <author>the operator</author>
      <description><![CDATA[<p>Founding cut. The topic covers the engine families a practitioner chooses between — relational, document, key-value, wide-column and columnar, vector, and graph — what each makes cheap, how to choose among them by measured access pattern, the storage-layer and consistency trade-offs underneath, and the convergence trend pulling the families together. The founding stance: start on a general-purpose relational database, which in 2026 means Postgres, and leave it only when a measured access pattern forces you out. Specialised engines are escape hatches, not starting points; the named exceptions are genuine global write scale, sub-millisecond cache reads, and billion-scale vector recall.</p>]]></description>
    </item>
  </channel>
</rss>
