Deployed 6c89b0c6556a to 0.x with MkDocs 1.6.1 and mike 2.1.3
Marco Ricci

Marco Ricci commited on 2025-06-18 06:50:33
Zeige 4 geänderte Dateien mit 491 Einfügungen und 116 Löschungen.

... ...
@@ -1225,6 +1225,57 @@
1225 1225
     </label>
1226 1226
     <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1227 1227
       
1228
+        <li class="md-nav__item">
1229
+  <a href="#v0.5" class="md-nav__link">
1230
+    <span class="md-ellipsis">
1231
+      0.5 (2025-06-14)
1232
+    </span>
1233
+  </a>
1234
+  
1235
+    <nav class="md-nav" aria-label="0.5 (2025-06-14)">
1236
+      <ul class="md-nav__list">
1237
+        
1238
+          <li class="md-nav__item">
1239
+  <a href="#removed-in-v0.5" class="md-nav__link">
1240
+    <span class="md-ellipsis">
1241
+      Removed
1242
+    </span>
1243
+  </a>
1244
+  
1245
+</li>
1246
+        
1247
+          <li class="md-nav__item">
1248
+  <a href="#added-in-v0.5" class="md-nav__link">
1249
+    <span class="md-ellipsis">
1250
+      Added
1251
+    </span>
1252
+  </a>
1253
+  
1254
+</li>
1255
+        
1256
+          <li class="md-nav__item">
1257
+  <a href="#changed-in-v0.5" class="md-nav__link">
1258
+    <span class="md-ellipsis">
1259
+      Changed
1260
+    </span>
1261
+  </a>
1262
+  
1263
+</li>
1264
+        
1265
+          <li class="md-nav__item">
1266
+  <a href="#fixed-in-v0.5" class="md-nav__link">
1267
+    <span class="md-ellipsis">
1268
+      Fixed
1269
+    </span>
1270
+  </a>
1271
+  
1272
+</li>
1273
+        
1274
+      </ul>
1275
+    </nav>
1276
+  
1277
+</li>
1278
+      
1228 1279
         <li class="md-nav__item">
1229 1280
   <a href="#v0.4.0" class="md-nav__link">
1230 1281
     <span class="md-ellipsis">
... ...
@@ -1676,6 +1727,57 @@
1676 1727
     </label>
1677 1728
     <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1678 1729
       
1730
+        <li class="md-nav__item">
1731
+  <a href="#v0.5" class="md-nav__link">
1732
+    <span class="md-ellipsis">
1733
+      0.5 (2025-06-14)
1734
+    </span>
1735
+  </a>
1736
+  
1737
+    <nav class="md-nav" aria-label="0.5 (2025-06-14)">
1738
+      <ul class="md-nav__list">
1739
+        
1740
+          <li class="md-nav__item">
1741
+  <a href="#removed-in-v0.5" class="md-nav__link">
1742
+    <span class="md-ellipsis">
1743
+      Removed
1744
+    </span>
1745
+  </a>
1746
+  
1747
+</li>
1748
+        
1749
+          <li class="md-nav__item">
1750
+  <a href="#added-in-v0.5" class="md-nav__link">
1751
+    <span class="md-ellipsis">
1752
+      Added
1753
+    </span>
1754
+  </a>
1755
+  
1756
+</li>
1757
+        
1758
+          <li class="md-nav__item">
1759
+  <a href="#changed-in-v0.5" class="md-nav__link">
1760
+    <span class="md-ellipsis">
1761
+      Changed
1762
+    </span>
1763
+  </a>
1764
+  
1765
+</li>
1766
+        
1767
+          <li class="md-nav__item">
1768
+  <a href="#fixed-in-v0.5" class="md-nav__link">
1769
+    <span class="md-ellipsis">
1770
+      Fixed
1771
+    </span>
1772
+  </a>
1773
+  
1774
+</li>
1775
+        
1776
+      </ul>
1777
+    </nav>
1778
+  
1779
+</li>
1780
+      
1679 1781
         <li class="md-nav__item">
1680 1782
   <a href="#v0.4.0" class="md-nav__link">
1681 1783
     <span class="md-ellipsis">
... ...
@@ -2039,55 +2141,305 @@ Semantic Versioning and Keep a Changelog definitions.</p>
2039 2141
 </li>
2040 2142
 </ul>
2041 2143
 </details>
2144
+<div class="admonition abstract inline end">
2145
+<p class="admonition-title">Legend: symbols</p>
2146
+<p><ul style="list-style-type: none;">
2147
+<li><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span> &mdash; a related bug entry from the wishlist page
2148
+<li><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.06 1.93C7.17 1.92 5.33 3.74 6.17 6H3a2 2 0 0 0-2 2v2a1 1 0 0 0 1 1h9V8h2v3h9a1 1 0 0 0 1-1V8a2 2 0 0 0-2-2h-3.17C19 2.73 14.6.42 12.57 3.24L12 4l-.57-.78c-.63-.89-1.5-1.28-2.37-1.29M9 4c.89 0 1.34 1.08.71 1.71S8 5.89 8 5a1 1 0 0 1 1-1m6 0c.89 0 1.34 1.08.71 1.71S14 5.89 14 5a1 1 0 0 1 1-1M2 12v8a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-8h-9v8h-2v-8z"/></svg></span> &mdash; a related wishlist entry from the wishlist page
2149
+</ul></p>
2150
+</div>
2042 2151
 <aside>
2043 2152
 <p><small>
2044
-(All entries are from the perspective of a user, not a developer.)
2153
+(All entries are from the perspective of a user of the program or the API.
2154
+As an exception, entries partaining to developers of <code>derivepassphrase</code> are
2155
+specifically marked as such.)
2045 2156
 </small></p>
2046 2157
 </aside>
2047 2158
 <!-- scriv changelog start -->
2048 2159
 
2160
+<h2 id="v0.5">0.5 (2025-06-14)<a class="headerlink" href="#v0.5" title="Permanent link">&para;</a></h2>
2161
+<h3 id="removed-in-v0.5">Removed<a class="headerlink" href="#removed-in-v0.5" title="Permanent link">&para;</a></h3>
2162
+<ul>
2163
+<li>
2164
+<p>For <a href="../reference/derivepassphrase.1/"><code>derivepassphrase</code></a>, remove <a href="#added-in-v0.4.0-color-support">support for (automatic) colored
2165
+    output or output with embedded text styling, as introduced in
2166
+    v0.4.0</a>.</p>
2167
+<p>This is a stopgap measure.
2168
+There exist pseudo-standards (the <code>NO_COLOR</code> and <code>FORCE_COLOR</code>
2169
+environment variables) governing how to influence this automatic
2170
+detection, but they are under-specified with regard to their interaction
2171
+with each other.
2172
+Until a consensus is reached and automatic colored/styled output can be
2173
+requested or rejected reliably across different terminal programs, we
2174
+will rather emit only uncolored, unstyled, lowest-common-denominator
2175
+device-independent output.
2176
+→<a href="../wishlist/conventional-configurable-text-styling/" title="Wish entry: “derivepassphrase vault should support conventional and configurable text styling”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.06 1.93C7.17 1.92 5.33 3.74 6.17 6H3a2 2 0 0 0-2 2v2a1 1 0 0 0 1 1h9V8h2v3h9a1 1 0 0 0 1-1V8a2 2 0 0 0-2-2h-3.17C19 2.73 14.6.42 12.57 3.24L12 4l-.57-.78c-.63-.89-1.5-1.28-2.37-1.29M9 4c.89 0 1.34 1.08.71 1.71S8 5.89 8 5a1 1 0 0 1 1-1m6 0c.89 0 1.34 1.08.71 1.71S14 5.89 14 5a1 1 0 0 1 1-1M2 12v8a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-8h-9v8h-2v-8z"/></svg></span></a></p>
2177
+</li>
2178
+</ul>
2179
+<h3 id="added-in-v0.5">Added<a class="headerlink" href="#added-in-v0.5" title="Permanent link">&para;</a></h3>
2180
+<ul>
2181
+<li>
2182
+<p>For the <a class="autorefs autorefs-internal" title="            Vault" href="../reference/derivepassphrase.vault/#derivepassphrase.vault.Vault"><code>Vault</code></a> API, support reporting
2183
+    on whether two master passphrases are interchangable with respect to the
2184
+    service passphrases they can derive.
2185
+    This is an artefact of how the master passphrase is converted to the
2186
+    random bit sequence with which the service passphrases are generated.
2187
+    See the corresponding <a href="../explanation/faq-vault-interchangable-passphrases/">FAQ entry: What are &ldquo;interchangable passphrases&rdquo;
2188
+    in vault?</a> for details, including the
2189
+    practical security (non-)implications.</p>
2190
+<p>The <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a> command-line interface does
2191
+not address this in any manner, mostly because the &ldquo;non-standard&rdquo;
2192
+interchangable variants of a given master password tend to be ugly to
2193
+type in, and because they do not have practical security implications.</p>
2194
+</li>
2195
+<li>
2196
+<p>For the <a class="autorefs autorefs-internal" title="            Vault" href="../reference/derivepassphrase.vault/#derivepassphrase.vault.Vault"><code>Vault</code></a> API, accept arbitrary
2197
+    <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/collections.abc.html#collections.abc.Buffer">Buffer</a> objects as passphrases or service
2198
+    names, beyond <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#bytes"><code>bytes</code></a> and <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/stdtypes.html#bytearray"><code>bytearray</code></a>.</p>
2199
+</li>
2200
+<li>
2201
+<p>Expose <a class="autorefs autorefs-internal" title="            UUID
2202
+
2203
+
2204
+  
2205
+      class-attribute
2206
+      instance-attribute
2207
+  " href="../reference/derivepassphrase.vault/#derivepassphrase.vault.Vault.UUID">the vault UUID</a> and <a class="autorefs autorefs-internal" title="            CHARSETS
2208
+
2209
+
2210
+  
2211
+      class-attribute
2212
+      instance-attribute
2213
+  " href="../reference/derivepassphrase.vault/#derivepassphrase.vault.Vault.CHARSETS">the
2214
+    character sets</a> as public
2215
+    attributes.</p>
2216
+</li>
2217
+<li>
2218
+<p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, support selecting the <a href="#changed-in-v0.5-editor-interface">editor
2219
+    interface</a> when editing notes via the
2220
+    <code>--modern-editor-interface</code> and <code>--vault-legacy-editor-interface</code>
2221
+    options.</p>
2222
+</li>
2223
+<li>
2224
+<p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, support printing the service
2225
+    notes before the passphrase, as an alternative, instead of always
2226
+    printing them <em>after</em> the passphrase.
2227
+    →<a href="../wishlist/print-service-notes-above/" title="Wish entry: “derivepassphrase vault should be able to print service notes above the passphrase”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.06 1.93C7.17 1.92 5.33 3.74 6.17 6H3a2 2 0 0 0-2 2v2a1 1 0 0 0 1 1h9V8h2v3h9a1 1 0 0 0 1-1V8a2 2 0 0 0-2-2h-3.17C19 2.73 14.6.42 12.57 3.24L12 4l-.57-.78c-.63-.89-1.5-1.28-2.37-1.29M9 4c.89 0 1.34 1.08.71 1.71S8 5.89 8 5a1 1 0 0 1 1-1m6 0c.89 0 1.34 1.08.71 1.71S14 5.89 14 5a1 1 0 0 1 1-1M2 12v8a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-8h-9v8h-2v-8z"/></svg></span></a></p>
2228
+</li>
2229
+<li>
2230
+<p>In the <code>--version</code> option of <a href="../reference/derivepassphrase.1/"><code>derivepassphrase</code></a> and each
2231
+    subcommand, additionally report build and environment information, such
2232
+    as supported subcommands, derivation schemes, foreign configuration
2233
+    formats and active <a href="https://peps.python.org/pep-0508/">PEP 508 extras</a>.
2234
+    (Each subcommand only reports the items relevant to that subcommand.)
2235
+    →<a href="../wishlist/report-build-flags-and-features/" title="Wish entry: “derivepassphrase should report its build flags and supported features”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.06 1.93C7.17 1.92 5.33 3.74 6.17 6H3a2 2 0 0 0-2 2v2a1 1 0 0 0 1 1h9V8h2v3h9a1 1 0 0 0 1-1V8a2 2 0 0 0-2-2h-3.17C19 2.73 14.6.42 12.57 3.24L12 4l-.57-.78c-.63-.89-1.5-1.28-2.37-1.29M9 4c.89 0 1.34 1.08.71 1.71S8 5.89 8 5a1 1 0 0 1 1-1m6 0c.89 0 1.34 1.08.71 1.71S14 5.89 14 5a1 1 0 0 1 1-1M2 12v8a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-8h-9v8h-2v-8z"/></svg></span></a></p>
2236
+</li>
2237
+<li>
2238
+<p>For developers: Rewrite the tests concerning <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase
2239
+    vault</code></a> and <code>--notes</code> usage into <a href="https://pypi.org/project/hypothesis/">hypothesis</a>-based tests
2240
+    where feasible.</p>
2241
+</li>
2242
+<li>
2243
+<p>For developers: Add scripts to the source tree to ensure consistent code
2244
+    quality: automatic linting, formatting and type checking, and optional
2245
+    running of the test suite and building of the documentation.
2246
+    The master quality control script doubles as a servicable (but
2247
+    heavyweight) &ldquo;pre-commit&rdquo; hook for git.</p>
2248
+</li>
2249
+</ul>
2250
+<h3 id="changed-in-v0.5">Changed<a class="headerlink" href="#changed-in-v0.5" title="Permanent link">&para;</a></h3>
2251
+<ul>
2252
+<li>
2253
+<p>Support a new, unified interface
2254
+    <a class="autorefs autorefs-internal" title="            ExportVaultConfigDataFunction" href="../reference/derivepassphrase.exporter/#derivepassphrase.exporter.ExportVaultConfigDataFunction"><code>ExportVaultConfigDataFunction</code></a>
2255
+    in the export handlers for &ldquo;storeroom&rdquo; and &ldquo;vault-native&rdquo; configuration
2256
+    data,
2257
+    <a class="autorefs autorefs-internal" title="            export_storeroom_data" href="../reference/derivepassphrase.exporter/#derivepassphrase.exporter.storeroom.export_storeroom_data"><code>export_storeroom_data</code></a>
2258
+    and
2259
+    <a class="autorefs autorefs-internal" title="            export_vault_native_data" href="../reference/derivepassphrase.exporter/#derivepassphrase.exporter.vault_native.export_vault_native_data"><code>export_vault_native_data</code></a>.
2260
+    A new dispatch function
2261
+    <a class="autorefs autorefs-internal" title="            export_vault_config_data" href="../reference/derivepassphrase.exporter/#derivepassphrase.exporter.export_vault_config_data"><code>export_vault_config_data</code></a>
2262
+    automatically calls the correct backend, based on the requested format.</p>
2263
+<p>This is a <strong>breaking API change</strong> due to the change in function
2264
+parameter names and return types.</p>
2265
+</li>
2266
+<li>
2267
+<p>Convert <code>KeyCommentPair</code> from <a class="autorefs autorefs-internal" title="            derivepassphrase._types" href="../reference/derivepassphrase._types/#derivepassphrase._types"><code>derivepassphrase._types</code></a>, and
2268
+    <code>KeyPair</code> and <code>MasterKeys</code> from
2269
+    <a class="autorefs autorefs-internal" title="            derivepassphrase.exporter.storeroom" href="../reference/derivepassphrase.exporter/#derivepassphrase.exporter.storeroom"><code>derivepassphrase.exporter.storeroom</code></a>, to
2270
+    <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/typing.html#typing.NamedTuple"><code>NamedTuple</code>s</a>. Also rename them to
2271
+    <a class="autorefs autorefs-internal" title="            SSHKeyCommentPair" href="../reference/derivepassphrase._types/#derivepassphrase._types.SSHKeyCommentPair"><code>SSHKeyCommentPair</code></a>,
2272
+    <a class="autorefs autorefs-internal" title="            StoreroomKeyPair" href="../reference/derivepassphrase._types/#derivepassphrase._types.StoreroomKeyPair"><code>StoreroomKeyPair</code></a> and
2273
+    <a class="autorefs autorefs-internal" title="            StoreroomMasterKeys" href="../reference/derivepassphrase._types/#derivepassphrase._types.StoreroomMasterKeys"><code>StoreroomMasterKeys</code></a>,
2274
+    respectively, in the <a class="autorefs autorefs-internal" title="            derivepassphrase._types" href="../reference/derivepassphrase._types/#derivepassphrase._types"><code>derivepassphrase._types</code></a> module.</p>
2275
+<p>This is a <strong>breaking API change</strong>.</p>
2276
+</li>
2277
+<li>
2278
+<p>Move the non-essential content of the <a class="autorefs autorefs-internal" title="            derivepassphrase.cli" href="../reference/derivepassphrase.cli/#derivepassphrase.cli"><code>derivepassphrase.cli</code></a> module
2279
+    into the &ldquo;internals&rdquo; subpackage.</p>
2280
+<p>This is a <strong>breaking API change</strong> due to the removal of most functions
2281
+from the <a class="autorefs autorefs-internal" title="            derivepassphrase.cli" href="../reference/derivepassphrase.cli/#derivepassphrase.cli"><code>derivepassphrase.cli</code></a> module.</p>
2282
+</li>
2283
+<li>
2284
+<p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, change the handling of the
2285
+    notes for better compatibility with <i>vault</i>(1) and for better
2286
+    internal consistency:</p>
2287
+<ol>
2288
+<li>
2289
+<p>Correctly require the <code>--config</code> option in addition to the <code>--notes</code>
2290
+    option to request that the service notes be edited, for
2291
+    compatibility with <i>vault</i>(1).
2292
+    Issue a warning if <code>--notes</code> is used without <code>--config</code>.</p>
2293
+</li>
2294
+<li>
2295
+<p><code>notes</code> is now also a valid setting name for <code>--unset</code> to take.</p>
2296
+</li>
2297
+<li>
2298
+<p>Editing the notes successfully in any way, including no-op edits,
2299
+    will register the service name as a known service to
2300
+    <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, even if the settings are
2301
+    otherwise empty.</p>
2302
+</li>
2303
+</ol>
2304
+</li>
2305
+<li>
2306
+<p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, by default, use an <b
2307
+    id="changed-in-v0.5-editor-interface">editor interface</b> that matches
2308
+    <i>vault</i>(1): the contents of the edited text file are used directly
2309
+    as the service notes, without interpretation.</p>
2310
+<p>Previously, we post-processed the text file to remove comments and our
2311
+instruction texts, and interpreted an empty file as a request to abort
2312
+the edit.
2313
+These two editor interfaces (&ldquo;legacy&rdquo; and &ldquo;modern&rdquo;) can be explicitly
2314
+selected, and for the legacy interface, which is less resilient against
2315
+data entry or usage errors, a backup copy of the old notes content is
2316
+made.</p>
2317
+</li>
2318
+<li>
2319
+<p>For developers: Use a different feature matrix and different
2320
+    <a href="https://pypi.org/project/hypothesis/">hypothesis</a> profiles in the test suite.
2321
+    The slowdown caused by coverage measurement is now more accurately
2322
+    estimated and adjusted for in the <a href="https://pypi.org/project/hypothesis/">hypothesis</a> settings.</p>
2323
+</li>
2324
+<li>
2325
+<p>For developers: Clean up, partly reorganize, and document the test
2326
+    suite, at least rudimentarily.
2327
+    Also add several new <a href="https://pypi.org/project/hypothesis/">hypothesis</a>-based tests, particularly to test
2328
+    the core assumptions of the <a class="autorefs autorefs-internal" title="            derivepassphrase.vault" href="../reference/derivepassphrase.vault/#derivepassphrase.vault">vault</a> derivation
2329
+    scheme about sensitivity (or lack thereof) to its inputs and its input
2330
+    formats.</p>
2331
+</li>
2332
+<li>
2333
+<p>For developers: For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, store our
2334
+    <code>vault.json</code> data file in pretty-printed form.
2335
+    This is a stopgap measure to ease debugging and introspection until
2336
+    better built-in query functionality for the effective configuration is
2337
+    available, because users should not be rewarded for meddling around in
2338
+    data files.
2339
+    →<a href="../wishlist/pretty-print-json/" title="Wish entry: “derivepassphrase vault should store and export the vault configuration in pretty-printed JSON”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.06 1.93C7.17 1.92 5.33 3.74 6.17 6H3a2 2 0 0 0-2 2v2a1 1 0 0 0 1 1h9V8h2v3h9a1 1 0 0 0 1-1V8a2 2 0 0 0-2-2h-3.17C19 2.73 14.6.42 12.57 3.24L12 4l-.57-.78c-.63-.89-1.5-1.28-2.37-1.29M9 4c.89 0 1.34 1.08.71 1.71S8 5.89 8 5a1 1 0 0 1 1-1m6 0c.89 0 1.34 1.08.71 1.71S14 5.89 14 5a1 1 0 0 1 1-1M2 12v8a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-8h-9v8h-2v-8z"/></svg></span></a></p>
2340
+</li>
2341
+</ul>
2342
+<h3 id="fixed-in-v0.5">Fixed<a class="headerlink" href="#fixed-in-v0.5" title="Permanent link">&para;</a></h3>
2343
+<ul>
2344
+<li>
2345
+<p>Fix the misbehaving shell completion for <code>zsh</code> in the presence of colons
2346
+    in the completion item.
2347
+    This was due to an overzealous workaround for
2348
+    <a href="https://github.com/pallets/click/issues/2703"><code>pallets/click#2703</code></a>.</p>
2349
+</li>
2350
+<li>
2351
+<p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, when exporting a vault
2352
+    configuration, export a pretty-printed configuration, to ease debugging
2353
+    and introspection.
2354
+    →<a href="../wishlist/pretty-print-json/" title="Wish entry: “derivepassphrase vault should store and export the vault configuration in pretty-printed JSON”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.06 1.93C7.17 1.92 5.33 3.74 6.17 6H3a2 2 0 0 0-2 2v2a1 1 0 0 0 1 1h9V8h2v3h9a1 1 0 0 0 1-1V8a2 2 0 0 0-2-2h-3.17C19 2.73 14.6.42 12.57 3.24L12 4l-.57-.78c-.63-.89-1.5-1.28-2.37-1.29M9 4c.89 0 1.34 1.08.71 1.71S8 5.89 8 5a1 1 0 0 1 1-1m6 0c.89 0 1.34 1.08.71 1.71S14 5.89 14 5a1 1 0 0 1 1-1M2 12v8a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-8h-9v8h-2v-8z"/></svg></span></a></p>
2355
+</li>
2356
+<li>
2357
+<p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, also print the service notes
2358
+    (if any) when deriving a service passphrase, just like <i>vault</i>(1)
2359
+    does.
2360
+    →<a href="../wishlist/print-service-notes/" title="Bug entry: “derivepassphrase vault does not print service notes”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></p>
2361
+</li>
2362
+<li>
2363
+<p>Lock our internals and their configuration against concurrent
2364
+    modifications.
2365
+    →<a href="../wishlist/concurrency-audit/" title="Bug entry: “Audit derivepassphrase for concurrency/thread-safety issues”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></p>
2366
+</li>
2367
+<li>
2368
+<p>Test against PyPy 3.11.</p>
2369
+</li>
2370
+<li>
2371
+<p>Test on <abbr title="Microsoft Windows">The Annoying
2372
+    OS</abbr><sup id="fnref:the-annoying-os"><a class="footnote-ref" href="#fn:the-annoying-os">1</a></sup> in its baseline version, i.e., without SSH
2373
+    agent functionality but with <code>cryptography</code> support.
2374
+    Fix all incompatibilities in the test suite if essential and/or
2375
+    feasible, otherwise document them as skips or expected failures.</p>
2376
+<p>(The latter case currently only concerns one single test that is
2377
+supposed to trigger OS errors while attempting to read the
2378
+<code>derivepassphrase</code> configuration files.
2379
+<abbr title="Microsoft Windows">The Annoying OS</abbr> happily returns
2380
+an empty file instead.)</p>
2381
+</li>
2382
+<li>
2383
+<p>For developers: Include build machinery to ensure consistency of our
2384
+    version number and our diagnostic messages between the documentation and
2385
+    the code, instead of having to check this by hand.</p>
2386
+<p>(The canonical way to get the version number is the
2387
+<a class="autorefs autorefs-external" href="https://docs.python.org/3/library/importlib.metadata.html#importlib.metadata.version"><code>importlib.metadata.version</code></a> standard library interface.)</p>
2388
+</li>
2389
+<li>
2390
+<p>For developers: Test our locking implementation for correctness, on both
2391
+    sides of the API.
2392
+    Specifically, test that the respective platform-specific locking
2393
+    primitives provide the requested mutual exclusion properties, and that
2394
+    the locking system as a whole, when given functioning locking
2395
+    primitives, correctly serializes access to the facilities it is supposed
2396
+    to guard.
2397
+    →<a href="../wishlist/concurrency-testing-in-test-suite/" title="Bug entry: “Test for concurrency and assert thread-safety in derivepassphrase's test suite”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></p>
2398
+</li>
2399
+</ul>
2049 2400
 <h2 id="v0.4.0">0.4.0 (2025-01-07)<a class="headerlink" href="#v0.4.0" title="Permanent link">&para;</a></h2>
2050 2401
 <h3 id="added-in-v0.4.0">Added<a class="headerlink" href="#added-in-v0.4.0" title="Permanent link">&para;</a></h3>
2051 2402
 <ul>
2052 2403
 <li>
2053
-<p>Both <code>derivepassphrase vault</code> and <code>derivepassphrase export vault</code> now
2054
-    support changing the amount of diagnostic output they emit via new
2055
-    command-line options <code>--debug</code>, <code>-v</code>/<code>--verbose</code> and <code>-q</code>/<code>--quiet</code>.
2056
-    Internally, this uses Python&rsquo;s standard <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#module-logging">logging</a> and <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/warnings.html#module-warnings">warnings</a>
2404
+<p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a> and <a href="../reference/derivepassphrase-export-vault.1/"><code>derivepassphrase export
2405
+    vault</code></a>, support changing the amount of diagnostic
2406
+    output we emit via new command-line options <code>--debug</code>, <code>-v</code>/<code>--verbose</code>
2407
+    and <code>-q</code>/<code>--quiet</code>.
2408
+    Internally, we use Python&rsquo;s standard <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/logging.html#module-logging">logging</a> and <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/warnings.html#module-warnings">warnings</a>
2057 2409
     systems.</p>
2058 2410
 </li>
2059 2411
 <li>
2060
-<p><code>derivepassphrase</code> now uses a central configuration file, and additional
2061
-    data files, some of which are service-specific.
2062
-    (The <code>vault.json</code>
2063
-    configuration file is now rebranded as a data file.)
2412
+<p>Use a central configuration file, and additional data files, some of
2413
+    which are service-specific.
2414
+    (The <code>vault.json</code> configuration file is now rebranded as a data file.)
2064 2415
     The configuration files are user-editable, the data files are
2065
-    <code>derivepassphrase</code>-editable.</p>
2416
+    <a href="../reference/derivepassphrase.1/"><code>derivepassphrase</code></a>-editable.</p>
2066 2417
 <p>The configuration files are in TOML format, so installing
2067 2418
 <code>derivepassphrase</code> on Python 3.10 and older requires the
2068 2419
 <a href="https://pypi.org/project/tomli/"><code>tomli</code></a> package.</p>
2069 2420
 </li>
2070 2421
 <li>
2071
-<p><code>derivepassphrase vault --config</code> now supports an <code>--unset</code> option which
2072
-    unsets any given named setting prior to applying any other configuration
2073
-    changes.</p>
2422
+<p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault --config</code></a>, support an <code>--unset</code>
2423
+    option which unsets any given named setting prior to applying any other
2424
+    configuration changes.</p>
2074 2425
 </li>
2075 2426
 <li>
2076
-<p><code>derivepassphrase vault --export</code> can now also export the current
2077
-    configuration as a POSIX <code>sh</code> script, using the <code>--export-as=sh</code> option.
2078
-    The default (and previous behavior) is <code>--export-as=json</code>.</p>
2427
+<p>For <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault --export</code></a>, support exporting
2428
+    the current configuration as a POSIX <code>sh</code> script, using the
2429
+    <code>--export-as=sh</code> option.  The default (and previous behavior) is
2430
+    <code>--export-as=json</code>.</p>
2079 2431
 </li>
2080 2432
 <li>
2081
-<p><code>derivepassphrase</code> now includes basic support for localization: if the
2082
-    necessary translations are installed, then the diagnostics and help
2083
-    texts can be emitted in different languages.
2084
-    Internally, this uses Python&rsquo;s standard <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/gettext.html#module-gettext"><code>gettext</code></a> system.</p>
2433
+<p>Include basic support for localization: if the necessary translations
2434
+    are installed, then the diagnostics and help texts can be emitted in
2435
+    different languages.
2436
+    Internally, we use Python&rsquo;s standard <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/gettext.html#module-gettext"><code>gettext</code></a> system.</p>
2085 2437
 <p>(As of this version, no translations have actually been prepared yet.)</p>
2086 2438
 </li>
2087 2439
 <li>
2088
-<p><code>derivepassphrase</code> now explicitly supports shell completion, in
2089
-    particular filename and service name completion in the <code>export vault</code>
2090
-    and <code>vault</code> subcommands.</p>
2440
+<p>For <a href="../reference/derivepassphrase.1/"><code>derivepassphrase</code></a>, explicitly support shell completion, in
2441
+    particular filename and service name completion in the <a href="../reference/derivepassphrase-export-vault.1/"><code>export
2442
+    vault</code></a> and <a href="../reference/derivepassphrase-vault.1/"><code>vault</code></a> subcommands.</p>
2091 2443
 <p>However, because of restrictions regarding the exchange of data between
2092 2444
 <code>derivepassphrase</code> and the shell, <code>derivepassphrase</code> will not offer any
2093 2445
 service names containing ASCII control characters for completion, and
... ...
@@ -2095,9 +2447,10 @@ a warning will be issued when importing or configuring such a service.
2095 2447
 They may still otherwise be used normally.</p>
2096 2448
 </li>
2097 2449
 <li>
2098
-<p>Support the semi-standard <code>NO_COLOR</code> and the <code>FORCE_COLOR</code> environment
2099
-    variables to suppress or force color output from <code>derivepassphrase</code>.
2100
-    (<code>FORCE_COLOR</code> overrides <code>NO_COLOR</code> if both are set.)</p>
2450
+<p><b id="added-in-v0.4.0-color-support">Support the semi-standard
2451
+    <code>NO_COLOR</code> and the <code>FORCE_COLOR</code> environment variables</b> to suppress
2452
+    or force color output from <a href="../reference/derivepassphrase.1/"><code>derivepassphrase</code></a>.  (<code>FORCE_COLOR</code>
2453
+    overrides <code>NO_COLOR</code> if both are set.)</p>
2101 2454
 </li>
2102 2455
 </ul>
2103 2456
 <h3 id="changed-in-v0.4.0">Changed<a class="headerlink" href="#changed-in-v0.4.0" title="Permanent link">&para;</a></h3>
... ...
@@ -2164,16 +2517,17 @@ They may still otherwise be used normally.</p>
2164 2517
 <h2 id="v0.3.0">0.3.0 (2024-10-15)<a class="headerlink" href="#v0.3.0" title="Permanent link">&para;</a></h2>
2165 2518
 <h3 id="added-in-v0.3.0">Added<a class="headerlink" href="#added-in-v0.3.0" title="Permanent link">&para;</a></h3>
2166 2519
 <ul>
2167
-<li>Convert changelog management from towncrier to <a href="https://pypi.org/project/scriv">scriv</a>.</li>
2520
+<li>Convert changelog management from towncrier to <a href="https://pypi.org/project/scriv/">scriv</a>.</li>
2168 2521
 <li>Add SSH agent spawning support to the test suite.
2169 2522
     Use this support to test the agent functionality on all known major SSH
2170 2523
     agent implementations automatically.
2171
-    (<a href="https://github.com/the-13th-letter/derivepassphrase/issues/12">#12</a>)</li>
2524
+    →<a href="../wishlist/test-suite-isolated-ssh-agent/" title="Wish entry: “Support and isolate OpenSSH's ssh-agent and PuTTY's pageant in the test suite”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.06 1.93C7.17 1.92 5.33 3.74 6.17 6H3a2 2 0 0 0-2 2v2a1 1 0 0 0 1 1h9V8h2v3h9a1 1 0 0 0 1-1V8a2 2 0 0 0-2-2h-3.17C19 2.73 14.6.42 12.57 3.24L12 4l-.57-.78c-.63-.89-1.5-1.28-2.37-1.29M9 4c.89 0 1.34 1.08.71 1.71S8 5.89 8 5a1 1 0 0 1 1-1m6 0c.89 0 1.34 1.08.71 1.71S14 5.89 14 5a1 1 0 0 1 1-1M2 12v8a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-8h-9v8h-2v-8z"/></svg></span></a></li>
2172 2525
 <li>Add <a href="https://pypi.org/project/hypothesis/">hypothesis</a>-based tests to the test suite.</li>
2173 2526
 <li>Update README to add explanations for virtual environments and package
2174 2527
     extras.</li>
2175 2528
 <li>Update README to demonstrate configuration storing and SSH agent use.
2176
-    Include comments on Windows support for SSH agents.</li>
2529
+    Include comments on Windows support for SSH agents.
2530
+    →<a href="../wishlist/windows-ssh-agent-support/" title="Bug entry: “Support PuTTY/Pageant (and maybe OpenSSH/ssh-agent) on Windows”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li>
2177 2531
 <li>Use cross-references in the documentation of function signatures.</li>
2178 2532
 <li>Add proper support for Buffer types in the SSH agent client.
2179 2533
     Any Python object supporting the buffer protocol can be used as input to
... ...
@@ -2196,11 +2550,11 @@ They may still otherwise be used normally.</p>
2196 2550
     standard library does.</p>
2197 2551
 </li>
2198 2552
 <li>
2199
-<p>Rewrite functionality for checking for valid vault(1) configurations:
2200
-    include an actual validation function which throws errors upon
2201
-    encountering format violations, and which allows specifying which types
2202
-    of extensions (unknown settings, <code>derivepassphrase</code>-only settings) to
2203
-    tolerate during validation.</p>
2553
+<p>Rewrite functionality for checking for valid <i>vault</i>(1)
2554
+    configurations: include an actual validation function which throws
2555
+    errors upon encountering format violations, and which allows specifying
2556
+    which types of extensions (unknown settings, <code>derivepassphrase</code>-only
2557
+    settings) to tolerate during validation.</p>
2204 2558
 <p>This is a <strong>breaking API change</strong> because the function return annotation
2205 2559
 changed, from <a class="autorefs autorefs-external" href="https://docs.python.org/3/library/typing.html#typing.TypeGuard"><code>typing.TypeGuard</code></a> to <a class="autorefs autorefs-external" href="https://typing-extensions.readthedocs.io/en/latest/index.html#typing_extensions.TypeIs"><code>typing_extensions.TypeIs</code></a>.
2206 2560
 These were the originally intended semantics, but when
... ...
@@ -2211,38 +2565,40 @@ support this kind of partial type narrowing.</p>
2211 2565
 <p>Fail earlier, and more gracefully/specifically, when we cannot talk to
2212 2566
     the SSH agent because Python does not support UNIX domain sockets on
2213 2567
     this system.
2214
-    In particular, this is the current situation on Windows.</p>
2568
+    In particular, this is the current situation on Windows.
2569
+    →<a href="../wishlist/fail-gracefully-without-af-unix/" title="Bug entry: “Fail gracefully if support for UNIX domain sockets is unavailable”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a>
2570
+    <a href="../wishlist/windows-ssh-agent-support/" title="Bug entry: “Support PuTTY/Pageant (and maybe OpenSSH/ssh-agent) on Windows”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></p>
2215 2571
 <p>This adds another failure case to the <code>SSHAgentClient</code> constructor, and
2216 2572
 therefore constitutes a <strong>breaking API change</strong>.</p>
2217 2573
 </li>
2218 2574
 <li>
2219
-<p>In <code>derivepassphrase vault</code>, accept <code>key</code> and <code>phrase</code> entries just like
2220
-    vault(1) does: <code>key</code> always overrides <code>phrase</code> in the configuration, no
2221
-    matter the level.</p>
2575
+<p>In <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, accept <code>key</code> and <code>phrase</code>
2576
+    entries just like <i>vault</i>(1) does: <code>key</code> always overrides <code>phrase</code>
2577
+    in the configuration, no matter the level.</p>
2222 2578
 <p>This is a command-line only change.</p>
2223 2579
 </li>
2224 2580
 <li>
2225
-<p>In <code>derivepassphrase vault</code>, when importing settings, accept falsy values
2226
-    everywhere <code>vault</code> does, with a warning.
2581
+<p>In <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, when importing settings,
2582
+    accept falsy values everywhere <code>vault</code> does, with a warning.
2227 2583
     Depending on the setting, they are equivalent to zero, the empty string,
2228 2584
     or &ldquo;not set&rdquo;.
2229
-    (<a href="https://github.com/the-13th-letter/derivepassphrase/issues/17">#17</a>)</p>
2585
+    →<a href="../wishlist/falsy-vault-config-values/" title="Bug entry: “derivepassphrase vault differs from vault(1) behavior with falsy stored configuration values”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></p>
2230 2586
 <p>This is a command-line only change, and only affects importing.
2231 2587
 The API provides a new function to normalize falsy settings, but still
2232 2588
 otherwise requires settings to be of the correct type.
2233 2589
 Storing a malformed configuration with such falsy values will still
2234
-generate errors when <code>derivepassphrase vault</code> loads the settings from
2235
-disk.</p>
2590
+generate errors when <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a> loads the
2591
+settings from disk.</p>
2236 2592
 </li>
2237 2593
 <li>
2238
-<p>In <code>derivepassphrase vault</code>, when importing configurations,
2239
-    correctly merge them with the existing one, same as vault(1): keep
2240
-    all named services and their settings (and the global settings if
2594
+<p>In <a href="../reference/derivepassphrase-vault.1/"><code>derivepassphrase vault</code></a>, when importing configurations,
2595
+    correctly merge them with the existing one, same as <i>vault</i>(1):
2596
+    keep all named services and their settings (and the global settings if
2241 2597
     applicable) that are not mentioned in the imported configuration.
2242 2598
     The import procedure is thus more akin to a section-wise import of
2243 2599
     the configurations, instead of a &ldquo;full&rdquo; import, and the resulting
2244 2600
     configuration generally is a merge of both inputs.
2245
-    (<a href="https://github.com/the-13th-letter/derivepassphrase/issues/16">#16</a>)</p>
2601
+    →<a href="../wishlist/amend-vault-config/" title="Bug entry: “derivepassphrase vault --import overwrites config instead of amending it”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></p>
2246 2602
 </li>
2247 2603
 <li>
2248 2604
 <p>The following operations or configuration settings now raise
... ...
@@ -2272,12 +2628,12 @@ disk.</p>
2272 2628
     storeroom formats.</p>
2273 2629
 <p>This feature requires the <code>cryptography</code> Python module, but is available
2274 2630
 even if <code>vault</code> is not installed.
2275
-(<a href="https://github.com/the-13th-letter/derivepassphrase/1">#1</a>)</p>
2631
+→<a href="../wishlist/export-vault-formats/" title="Wish entry: “Support data export from vault v0.2, vault v0.3, and storeroom storage formats”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.06 1.93C7.17 1.92 5.33 3.74 6.17 6H3a2 2 0 0 0-2 2v2a1 1 0 0 0 1 1h9V8h2v3h9a1 1 0 0 0 1-1V8a2 2 0 0 0-2-2h-3.17C19 2.73 14.6.42 12.57 3.24L12 4l-.57-.78c-.63-.89-1.5-1.28-2.37-1.29M9 4c.89 0 1.34 1.08.71 1.71S8 5.89 8 5a1 1 0 0 1 1-1m6 0c.89 0 1.34 1.08.71 1.71S14 5.89 14 5a1 1 0 0 1 1-1M2 12v8a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-8h-9v8h-2v-8z"/></svg></span></a></p>
2276 2632
 </li>
2277 2633
 </ul>
2278 2634
 <h3 id="fixed-in-v0.2.0">Fixed<a class="headerlink" href="#fixed-in-v0.2.0" title="Permanent link">&para;</a></h3>
2279 2635
 <ul>
2280
-<li>Deploy versioned documentation with <a href="https://pypi.org/project/mike">mike</a>.
2636
+<li>Deploy versioned documentation with <a href="https://pypi.org/project/mike/">mike</a>.
2281 2637
     Set up a &ldquo;latest&rdquo; tag and the &ldquo;0.<var>x</var>&rdquo; version of the
2282 2638
     documentation with the contents so far.</li>
2283 2639
 </ul>
... ...
@@ -2288,20 +2644,20 @@ even if <code>vault</code> is not installed.
2288 2644
     Further moved <code>derivepassphrase.Vault</code> and
2289 2645
     <code>derivepassphrase.AmbiguousByteRepresentation</code> into a new submodule
2290 2646
     <code>vault</code>, and renamed submodule <code>ssh_agent_client</code> to <code>ssh_agent</code>.
2291
-    (<a href="https://github.com/the-13th-letter/derivepassphrase/3">#3</a>)</li>
2647
+    →<a href="../wishlist/single-toplevel-module/" title="Bug entry: “Move sequin and ssh_agent_client modules into derivepassphrase package”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li>
2292 2648
 <li>Changed internal error handling and error messages, to better work in
2293 2649
     the context of a command-line tool.
2294
-    (<a href="https://github.com/the-13th-letter/derivepassphrase/4">#4</a>)</li>
2650
+    →<a href="../wishlist/better-error-messages/" title="Bug entry: “Improve common error messages in the command-line interface”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li>
2295 2651
 <li>Combine and consolidate <code>derivepassphrase.types</code> and
2296 2652
     <code>derivepassphrase.ssh_agent.types</code> into a new submodule
2297 2653
     <code>derivepassphrase._types</code>.
2298 2654
     Despite the name, the module is public.
2299
-    (<a href="https://github.com/the-13th-letter/derivepassphrase/7">#7</a>)</li>
2655
+    →<a href="../wishlist/no-stdlib-module-names/" title="Bug entry: “Rename types submodules to _types”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li>
2300 2656
 <li>Warn the user when entering (directly, or via configuration
2301 2657
     editing/importing) a passphrase that is not in the configured Unicode
2302 2658
     normalization form.
2303 2659
     (But don&rsquo;t otherwise reject any textual master passphrases.)
2304
-    (<a href="https://github.com/the-13th-letter/derivepassphrase/9">#9</a>)</li>
2660
+    →<a href="../wishlist/allow-all-unicode-passphrases/" title="Bug entry: “Allow all Unicode text strings as master passphrases”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li>
2305 2661
 <li>
2306 2662
 <p>Move all existing functionality into a subcommand, in anticipation of
2307 2663
     other passphrase derivation schemes, with different settings.
... ...
@@ -2311,11 +2667,13 @@ even if <code>vault</code> is not installed.
2311 2667
 instead of globally.
2312 2668
 Automatically fall back to, and migrate, the old global settings file if
2313 2669
 no subsystem-specific configuration was found.
2314
-(<a href="https://github.com/the-13th-letter/derivepassphrase/10">#10</a>)</p>
2670
+→<a href="../wishlist/other-derivation-schemes/" title="Wish entry: “Consider implementing passphrase schemes other than vault's”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.06 1.93C7.17 1.92 5.33 3.74 6.17 6H3a2 2 0 0 0-2 2v2a1 1 0 0 0 1 1h9V8h2v3h9a1 1 0 0 0 1-1V8a2 2 0 0 0-2-2h-3.17C19 2.73 14.6.42 12.57 3.24L12 4l-.57-.78c-.63-.89-1.5-1.28-2.37-1.29M9 4c.89 0 1.34 1.08.71 1.71S8 5.89 8 5a1 1 0 0 1 1-1m6 0c.89 0 1.34 1.08.71 1.71S14 5.89 14 5a1 1 0 0 1 1-1M2 12v8a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-8h-9v8h-2v-8z"/></svg></span></a>
2671
+<a href="../wishlist/scheme-specific-cli-and-config/" title="Wish entry: “Move vault-specific command-line interface into a separate CLI subcommand and matching configuration file”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.06 1.93C7.17 1.92 5.33 3.74 6.17 6H3a2 2 0 0 0-2 2v2a1 1 0 0 0 1 1h9V8h2v3h9a1 1 0 0 0 1-1V8a2 2 0 0 0-2-2h-3.17C19 2.73 14.6.42 12.57 3.24L12 4l-.57-.78c-.63-.89-1.5-1.28-2.37-1.29M9 4c.89 0 1.34 1.08.71 1.71S8 5.89 8 5a1 1 0 0 1 1-1m6 0c.89 0 1.34 1.08.71 1.71S14 5.89 14 5a1 1 0 0 1 1-1M2 12v8a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-8h-9v8h-2v-8z"/></svg></span></a></p>
2315 2672
 </li>
2316 2673
 <li>
2317
-<p>Make <code>derivepassphrase_export</code> a subcommand: <code>derivepassphrase export</code>.
2318
-    (<a href="https://github.com/the-13th-letter/derivepassphrase/11">#11</a>)</p>
2674
+<p>Make <code>derivepassphrase_export</code> a subcommand: <a href="../reference/derivepassphrase-export.1/"><code>derivepassphrase
2675
+    export</code></a>.
2676
+    →<a href="../wishlist/exporter-script-as-subcommand/" title="Wish entry: “Make the exporter a subcommand of derivepassphrase”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.06 1.93C7.17 1.92 5.33 3.74 6.17 6H3a2 2 0 0 0-2 2v2a1 1 0 0 0 1 1h9V8h2v3h9a1 1 0 0 0 1-1V8a2 2 0 0 0-2-2h-3.17C19 2.73 14.6.42 12.57 3.24L12 4l-.57-.78c-.63-.89-1.5-1.28-2.37-1.29M9 4c.89 0 1.34 1.08.71 1.71S8 5.89 8 5a1 1 0 0 1 1-1m6 0c.89 0 1.34 1.08.71 1.71S14 5.89 14 5a1 1 0 0 1 1-1M2 12v8a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-8h-9v8h-2v-8z"/></svg></span></a></p>
2319 2677
 </li>
2320 2678
 </ul>
2321 2679
 <h3 id="deprecated-in-v0.2.0">Deprecated<a class="headerlink" href="#deprecated-in-v0.2.0" title="Permanent link">&para;</a></h3>
... ...
@@ -2328,14 +2686,14 @@ no subsystem-specific configuration was found.
2328 2686
 <ul>
2329 2687
 <li>Do not crash upon selecting a key on the command-line if there already
2330 2688
     is a key stored in the configuration.
2331
-    (<a href="https://github.com/the-13th-letter/derivepassphrase/5">#5</a>)</li>
2689
+    →<a href="../wishlist/one-time-key-override-fails/" title="Bug entry: “derivepassphrase -k fails when overriding the chosen key on the command-line”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li>
2332 2690
 <li>Create the configuration directory upon saving, if it does not yet
2333 2691
     exist.
2334
-    (<a href="https://github.com/the-13th-letter/derivepassphrase/6">#6</a>)</li>
2692
+    →<a href="../wishlist/configuration-directory-must-exist/" title="Bug entry: “derivepassphrase --config requires configuration directory to exist”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li>
2335 2693
 <li>Isolate the tests properly and consistently from the user&rsquo;s
2336 2694
     configuration, so that user configuration problems do not cause
2337 2695
     unrelated test failures.
2338
-    (<a href="https://github.com/the-13th-letter/derivepassphrase/8">#8</a>)</li>
2696
+    →<a href="../wishlist/test-filesystem-isolation/" title="Bug entry: “Isolate tests properly from the filesystem”"><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a6 6 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6 6 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20z"/></svg></span></a></li>
2339 2697
 <li>Add an alternate MkDocs configuration for building the documentation in
2340 2698
     offline mode.</li>
2341 2699
 <li>Fix typing issues according to <code>mypy</code>&rsquo;s strict mode.</li>
... ...
@@ -2347,14 +2705,12 @@ no subsystem-specific configuration was found.
2347 2705
     distributions.
2348 2706
     (Previously, <code>sdist</code> contained VCS artifacts, and <code>wheel</code> was missing
2349 2707
     some paths.)</li>
2350
-<li>Lint and reformat all code using <a href="https://pypi.org/package/ruff/">ruff</a>.</li>
2351
-<li>Mention
2352
-    <a href="https://pypi.org/package/mkdocstrings-python/"><code>mkdocstrings-python</code></a>
2353
-    in the documentation&rsquo;s page footer.</li>
2708
+<li>Lint and reformat all code using <a href="https://pypi.org/project/ruff/">ruff</a>.</li>
2709
+<li>Mention <a href="https://pypi.org/project/mkdocstrings-python/"><code>mkdocstrings-python</code></a> in the
2710
+    documentation&rsquo;s page footer.</li>
2354 2711
 <li>Remove JavaScript and external font loading from documentation website,
2355 2712
     so that the site works even in restricted browser settings.</li>
2356
-<li>Set up a changelog, using
2357
-    <a href="https://pypi.org/package/towncrier">towncrier</a>.</li>
2713
+<li>Set up a changelog, using <a href="https://pypi.org/project/towncrier/">towncrier</a>.</li>
2358 2714
 </ul>
2359 2715
 <h2 id="v0.1.1">0.1.1 (2024-07-14)<a class="headerlink" href="#v0.1.1" title="Permanent link">&para;</a></h2>
2360 2716
 <h3 id="fixed-in-v0.1.1">Fixed<a class="headerlink" href="#fixed-in-v0.1.1" title="Permanent link">&para;</a></h3>
... ...
@@ -2370,6 +2726,16 @@ no subsystem-specific configuration was found.
2370 2726
 <ul>
2371 2727
 <li>Initial release.</li>
2372 2728
 </ul>
2729
+<div class="footnote">
2730
+<hr />
2731
+<ol>
2732
+<li id="fn:the-annoying-os">
2733
+<p>Hat tip&mdash;and apologies&mdash;to
2734
+<a href="https://github.com/pawamoy/">Timothée Mazzucotelli (<code>@pawamoy</code>)</a> for
2735
+the fitting terminology.&#160;<a class="footnote-backref" href="#fnref:the-annoying-os" title="Jump back to footnote 1 in the text">&#8617;</a></p>
2736
+</li>
2737
+</ol>
2738
+</div>
2373 2739
 
2374 2740
 
2375 2741
 
... ...
@@ -2,206 +2,206 @@
2 2
 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3 3
     <url>
4 4
          <loc>https://the13thletter.info/derivepassphrase/0.x/</loc>
5
-         <lastmod>2025-06-14</lastmod>
5
+         <lastmod>2025-06-18</lastmod>
6 6
     </url>
7 7
     <url>
8 8
          <loc>https://the13thletter.info/derivepassphrase/0.x/changelog/</loc>
9
-         <lastmod>2025-06-14</lastmod>
9
+         <lastmod>2025-06-18</lastmod>
10 10
     </url>
11 11
     <url>
12 12
          <loc>https://the13thletter.info/derivepassphrase/0.x/pycompatibility/</loc>
13
-         <lastmod>2025-06-14</lastmod>
13
+         <lastmod>2025-06-18</lastmod>
14 14
     </url>
15 15
     <url>
16 16
          <loc>https://the13thletter.info/derivepassphrase/0.x/upgrade-notes/</loc>
17
-         <lastmod>2025-06-14</lastmod>
17
+         <lastmod>2025-06-18</lastmod>
18 18
     </url>
19 19
     <url>
20 20
          <loc>https://the13thletter.info/derivepassphrase/0.x/explanation/</loc>
21
-         <lastmod>2025-06-14</lastmod>
21
+         <lastmod>2025-06-18</lastmod>
22 22
     </url>
23 23
     <url>
24 24
          <loc>https://the13thletter.info/derivepassphrase/0.x/explanation/faq-altered-versions/</loc>
25
-         <lastmod>2025-06-14</lastmod>
25
+         <lastmod>2025-06-18</lastmod>
26 26
     </url>
27 27
     <url>
28 28
          <loc>https://the13thletter.info/derivepassphrase/0.x/explanation/faq-vault-interchangable-passphrases/</loc>
29
-         <lastmod>2025-06-14</lastmod>
29
+         <lastmod>2025-06-18</lastmod>
30 30
     </url>
31 31
     <url>
32 32
          <loc>https://the13thletter.info/derivepassphrase/0.x/how-tos/</loc>
33
-         <lastmod>2025-06-14</lastmod>
33
+         <lastmod>2025-06-18</lastmod>
34 34
     </url>
35 35
     <url>
36 36
          <loc>https://the13thletter.info/derivepassphrase/0.x/how-tos/ssh-key/</loc>
37
-         <lastmod>2025-06-14</lastmod>
37
+         <lastmod>2025-06-18</lastmod>
38 38
     </url>
39 39
     <url>
40 40
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/</loc>
41
-         <lastmod>2025-06-14</lastmod>
41
+         <lastmod>2025-06-18</lastmod>
42 42
     </url>
43 43
     <url>
44 44
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase-export-vault.1/</loc>
45
-         <lastmod>2025-06-14</lastmod>
45
+         <lastmod>2025-06-18</lastmod>
46 46
     </url>
47 47
     <url>
48 48
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase-export.1/</loc>
49
-         <lastmod>2025-06-14</lastmod>
49
+         <lastmod>2025-06-18</lastmod>
50 50
     </url>
51 51
     <url>
52 52
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase-vault.1/</loc>
53
-         <lastmod>2025-06-14</lastmod>
53
+         <lastmod>2025-06-18</lastmod>
54 54
     </url>
55 55
     <url>
56 56
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase.1/</loc>
57
-         <lastmod>2025-06-14</lastmod>
57
+         <lastmod>2025-06-18</lastmod>
58 58
     </url>
59 59
     <url>
60 60
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase._internals.cli_helpers/</loc>
61
-         <lastmod>2025-06-14</lastmod>
61
+         <lastmod>2025-06-18</lastmod>
62 62
     </url>
63 63
     <url>
64 64
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase._internals.cli_machinery/</loc>
65
-         <lastmod>2025-06-14</lastmod>
65
+         <lastmod>2025-06-18</lastmod>
66 66
     </url>
67 67
     <url>
68 68
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase._internals.cli_messages/</loc>
69
-         <lastmod>2025-06-14</lastmod>
69
+         <lastmod>2025-06-18</lastmod>
70 70
     </url>
71 71
     <url>
72 72
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase._types/</loc>
73
-         <lastmod>2025-06-14</lastmod>
73
+         <lastmod>2025-06-18</lastmod>
74 74
     </url>
75 75
     <url>
76 76
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase.cli/</loc>
77
-         <lastmod>2025-06-14</lastmod>
77
+         <lastmod>2025-06-18</lastmod>
78 78
     </url>
79 79
     <url>
80 80
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase.exporter/</loc>
81
-         <lastmod>2025-06-14</lastmod>
81
+         <lastmod>2025-06-18</lastmod>
82 82
     </url>
83 83
     <url>
84 84
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase.sequin/</loc>
85
-         <lastmod>2025-06-14</lastmod>
85
+         <lastmod>2025-06-18</lastmod>
86 86
     </url>
87 87
     <url>
88 88
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase.ssh_agent/</loc>
89
-         <lastmod>2025-06-14</lastmod>
89
+         <lastmod>2025-06-18</lastmod>
90 90
     </url>
91 91
     <url>
92 92
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/derivepassphrase.vault/</loc>
93
-         <lastmod>2025-06-14</lastmod>
93
+         <lastmod>2025-06-18</lastmod>
94 94
     </url>
95 95
     <url>
96 96
          <loc>https://the13thletter.info/derivepassphrase/0.x/reference/prerequisites-ssh-key/</loc>
97
-         <lastmod>2025-06-14</lastmod>
97
+         <lastmod>2025-06-18</lastmod>
98 98
     </url>
99 99
     <url>
100 100
          <loc>https://the13thletter.info/derivepassphrase/0.x/tutorials/</loc>
101
-         <lastmod>2025-06-14</lastmod>
101
+         <lastmod>2025-06-18</lastmod>
102 102
     </url>
103 103
     <url>
104 104
          <loc>https://the13thletter.info/derivepassphrase/0.x/tutorials/basic-setup-passphrase/</loc>
105
-         <lastmod>2025-06-14</lastmod>
105
+         <lastmod>2025-06-18</lastmod>
106 106
     </url>
107 107
     <url>
108 108
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/</loc>
109
-         <lastmod>2025-06-14</lastmod>
109
+         <lastmod>2025-06-18</lastmod>
110 110
     </url>
111 111
     <url>
112 112
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/allow-all-unicode-passphrases/</loc>
113
-         <lastmod>2025-06-14</lastmod>
113
+         <lastmod>2025-06-18</lastmod>
114 114
     </url>
115 115
     <url>
116 116
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/amend-vault-config/</loc>
117
-         <lastmod>2025-06-14</lastmod>
117
+         <lastmod>2025-06-18</lastmod>
118 118
     </url>
119 119
     <url>
120 120
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/better-error-messages/</loc>
121
-         <lastmod>2025-06-14</lastmod>
121
+         <lastmod>2025-06-18</lastmod>
122 122
     </url>
123 123
     <url>
124 124
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/concurrency-audit/</loc>
125
-         <lastmod>2025-06-14</lastmod>
125
+         <lastmod>2025-06-18</lastmod>
126 126
     </url>
127 127
     <url>
128 128
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/concurrency-testing-in-test-suite/</loc>
129
-         <lastmod>2025-06-14</lastmod>
129
+         <lastmod>2025-06-18</lastmod>
130 130
     </url>
131 131
     <url>
132 132
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/configuration-directory-must-exist/</loc>
133
-         <lastmod>2025-06-14</lastmod>
133
+         <lastmod>2025-06-18</lastmod>
134 134
     </url>
135 135
     <url>
136 136
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/conventional-configurable-text-styling/</loc>
137
-         <lastmod>2025-06-14</lastmod>
137
+         <lastmod>2025-06-18</lastmod>
138 138
     </url>
139 139
     <url>
140 140
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/export-vault-formats/</loc>
141
-         <lastmod>2025-06-14</lastmod>
141
+         <lastmod>2025-06-18</lastmod>
142 142
     </url>
143 143
     <url>
144 144
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/exporter-script-as-subcommand/</loc>
145
-         <lastmod>2025-06-14</lastmod>
145
+         <lastmod>2025-06-18</lastmod>
146 146
     </url>
147 147
     <url>
148 148
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/fail-gracefully-without-af-unix/</loc>
149
-         <lastmod>2025-06-14</lastmod>
149
+         <lastmod>2025-06-18</lastmod>
150 150
     </url>
151 151
     <url>
152 152
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/falsy-vault-config-values/</loc>
153
-         <lastmod>2025-06-14</lastmod>
153
+         <lastmod>2025-06-18</lastmod>
154 154
     </url>
155 155
     <url>
156 156
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/no-stdlib-module-names/</loc>
157
-         <lastmod>2025-06-14</lastmod>
157
+         <lastmod>2025-06-18</lastmod>
158 158
     </url>
159 159
     <url>
160 160
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/one-time-key-override-fails/</loc>
161
-         <lastmod>2025-06-14</lastmod>
161
+         <lastmod>2025-06-18</lastmod>
162 162
     </url>
163 163
     <url>
164 164
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/other-derivation-schemes/</loc>
165
-         <lastmod>2025-06-14</lastmod>
165
+         <lastmod>2025-06-18</lastmod>
166 166
     </url>
167 167
     <url>
168 168
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/pretty-print-json/</loc>
169
-         <lastmod>2025-06-14</lastmod>
169
+         <lastmod>2025-06-18</lastmod>
170 170
     </url>
171 171
     <url>
172 172
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/print-service-notes-above/</loc>
173
-         <lastmod>2025-06-14</lastmod>
173
+         <lastmod>2025-06-18</lastmod>
174 174
     </url>
175 175
     <url>
176 176
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/print-service-notes/</loc>
177
-         <lastmod>2025-06-14</lastmod>
177
+         <lastmod>2025-06-18</lastmod>
178 178
     </url>
179 179
     <url>
180 180
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/remove-pageant-build-info-check/</loc>
181
-         <lastmod>2025-06-14</lastmod>
181
+         <lastmod>2025-06-18</lastmod>
182 182
     </url>
183 183
     <url>
184 184
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/report-build-flags-and-features/</loc>
185
-         <lastmod>2025-06-14</lastmod>
185
+         <lastmod>2025-06-18</lastmod>
186 186
     </url>
187 187
     <url>
188 188
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/scheme-specific-cli-and-config/</loc>
189
-         <lastmod>2025-06-14</lastmod>
189
+         <lastmod>2025-06-18</lastmod>
190 190
     </url>
191 191
     <url>
192 192
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/single-toplevel-module/</loc>
193
-         <lastmod>2025-06-14</lastmod>
193
+         <lastmod>2025-06-18</lastmod>
194 194
     </url>
195 195
     <url>
196 196
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/test-filesystem-isolation/</loc>
197
-         <lastmod>2025-06-14</lastmod>
197
+         <lastmod>2025-06-18</lastmod>
198 198
     </url>
199 199
     <url>
200 200
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/test-suite-isolated-ssh-agent/</loc>
201
-         <lastmod>2025-06-14</lastmod>
201
+         <lastmod>2025-06-18</lastmod>
202 202
     </url>
203 203
     <url>
204 204
          <loc>https://the13thletter.info/derivepassphrase/0.x/wishlist/windows-ssh-agent-support/</loc>
205
-         <lastmod>2025-06-14</lastmod>
205
+         <lastmod>2025-06-18</lastmod>
206 206
     </url>
207 207
 </urlset>
208 208
\ No newline at end of file
... ...
@@ -32,3 +32,12 @@ a.fixed {
32 32
     font-style: normal;
33 33
     text-decoration: line-through;
34 34
 }
35
+
36
+.md-typeset div.admonition.abstract .emojione,
37
+.md-typeset div.admonition.abstract .gemoji,
38
+.md-typeset div.admonition.abstract .twemoji,
39
+.md-typeset a[href^="wishlist/"] .emojione,
40
+.md-typeset a[href^="wishlist/"] .gemoji,
41
+.md-typeset a[href^="wishlist/"] .twemoji {
42
+    vertical-align: middle;
43
+}
35 44