<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Homebrew on Nick Liu - Software Engineer</title><link>https://nick-liu.com/tags/homebrew/</link><description>Recent content in Homebrew on Nick Liu - Software Engineer</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>nickboy@users.noreply.github.com (Nick Liu)</managingEditor><webMaster>nickboy@users.noreply.github.com (Nick Liu)</webMaster><copyright>2026 Nick Liu</copyright><lastBuildDate>Sun, 04 Oct 2026 23:08:13 -0700</lastBuildDate><atom:link href="https://nick-liu.com/tags/homebrew/index.xml" rel="self" type="application/rss+xml"/><item><title>A cask upgrade left the binary hanging. A copy of it started instantly.</title><link>https://nick-liu.com/posts/inode-not-the-file/</link><pubDate>Sun, 04 Oct 2026 00:00:00 +0000</pubDate><author>nickboy@users.noreply.github.com (Nick Liu)</author><guid>https://nick-liu.com/posts/inode-not-the-file/</guid><description>&lt;div class="lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl"&gt;&#10; &#10;A Homebrew cask upgrade on 2026-08-28 left my `claude` binary hanging forever on `--version`. No error, no exit, just a prompt that never came back. For two days nothing looked wrong, because every session already open kept working perfectly. The first person to notice was the first person to open a new one.&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The signature was valid. The bytes were intact. A byte-identical copy of the&#10;file, sitting in the same directory, started instantly while the original&#10;hung. That left exactly one thing it could be, and it was not the file.&lt;/p&gt;</description><content:encoded>&lt;div class="lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl"&gt;&#10; &#10;A Homebrew cask upgrade on 2026-08-28 left my `claude` binary hanging forever on `--version`. No error, no exit, just a prompt that never came back. For two days nothing looked wrong, because every session already open kept working perfectly. The first person to notice was the first person to open a new one.&#10;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;The signature was valid. The bytes were intact. A byte-identical copy of the&#10;file, sitting in the same directory, started instantly while the original&#10;hung. That left exactly one thing it could be, and it was not the file.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Two days of looking fine&#10; &lt;div id="two-days-of-looking-fine" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#two-days-of-looking-fine" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;The reason this hid for two days is the part worth keeping, and it has&#10;nothing to do with the bug itself.&lt;/p&gt;&#10;&lt;p&gt;When an upgrade replaces a binary, the old file is unlinked, but a process&#10;that is already running holds its inode open. The bytes stay on disk, with&#10;no name pointing at them, until the last process using them exits. So every&#10;session started before the upgrade kept running the old copy and never&#10;touched the broken one.&lt;/p&gt;&#10;&lt;div class="not-prose diagram diagram-light"&gt;&lt;svg id="d0d29a9f314bf51celight" width="100%" xmlns="http://www.w3.org/2000/svg" class="flowchart" style="max-width: 536.46875px;" viewBox="0 0 536.46875 502" role="graphics-document document" aria-roledescription="flowchart-v2"&gt;&lt;style&gt;#d0d29a9f314bf51celight{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#d0d29a9f314bf51celight .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#d0d29a9f314bf51celight .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#d0d29a9f314bf51celight .error-icon{fill:rgb(255, 255, 255);}#d0d29a9f314bf51celight .error-text{fill:#000000;stroke:#000000;}#d0d29a9f314bf51celight .edge-thickness-normal{stroke-width:1px;}#d0d29a9f314bf51celight .edge-thickness-thick{stroke-width:3.5px;}#d0d29a9f314bf51celight .edge-pattern-solid{stroke-dasharray:0;}#d0d29a9f314bf51celight .edge-thickness-invisible{stroke-width:0;fill:none;}#d0d29a9f314bf51celight .edge-pattern-dashed{stroke-dasharray:3;}#d0d29a9f314bf51celight .edge-pattern-dotted{stroke-dasharray:2;}#d0d29a9f314bf51celight .marker{fill:rgb(74, 86, 92);stroke:rgb(74, 86, 92);}#d0d29a9f314bf51celight .marker.cross{stroke:rgb(74, 86, 92);}#d0d29a9f314bf51celight svg{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif;font-size:16px;}#d0d29a9f314bf51celight p{margin:0;}#d0d29a9f314bf51celight .label{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif;color:#333;}#d0d29a9f314bf51celight .cluster-label text{fill:#000000;}#d0d29a9f314bf51celight .cluster-label span{color:#000000;}#d0d29a9f314bf51celight .cluster-label span p{background-color:transparent;}#d0d29a9f314bf51celight .label text,#d0d29a9f314bf51celight span{fill:#333;color:#333;}#d0d29a9f314bf51celight .node rect,#d0d29a9f314bf51celight .node circle,#d0d29a9f314bf51celight .node ellipse,#d0d29a9f314bf51celight .node polygon,#d0d29a9f314bf51celight .node path{fill:rgb(255, 255, 255);stroke:rgb(204, 216, 222);stroke-width:1px;}#d0d29a9f314bf51celight .rough-node .label text,#d0d29a9f314bf51celight .node .label text,#d0d29a9f314bf51celight .image-shape .label,#d0d29a9f314bf51celight .icon-shape .label{text-anchor:middle;}#d0d29a9f314bf51celight .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#d0d29a9f314bf51celight .rough-node .label,#d0d29a9f314bf51celight .node .label,#d0d29a9f314bf51celight .image-shape .label,#d0d29a9f314bf51celight .icon-shape .label{text-align:center;}#d0d29a9f314bf51celight .node.clickable{cursor:pointer;}#d0d29a9f314bf51celight .root .anchor path{fill:rgb(74, 86, 92)!important;stroke-width:0;stroke:rgb(74, 86, 92);}#d0d29a9f314bf51celight .arrowheadPath{fill:#000000;}#d0d29a9f314bf51celight .edgePath .path{stroke:rgb(74, 86, 92);stroke-width:1px;}#d0d29a9f314bf51celight .flowchart-link{stroke:rgb(74, 86, 92);fill:none;}#d0d29a9f314bf51celight .edgeLabel{background-color:rgb(182, 240, 255);text-align:center;}#d0d29a9f314bf51celight .edgeLabel p{background-color:rgb(182, 240, 255);}#d0d29a9f314bf51celight .edgeLabel rect{opacity:0.5;background-color:rgb(182, 240, 255);fill:rgb(182, 240, 255);}#d0d29a9f314bf51celight .labelBkg{background-color:rgba(182, 240, 255, 0.5);}#d0d29a9f314bf51celight .cluster rect{fill:rgb(255, 255, 255);stroke:rgb(129, 146, 154);stroke-width:1px;}#d0d29a9f314bf51celight .cluster text{fill:#000000;}#d0d29a9f314bf51celight .cluster span{color:#000000;}#d0d29a9f314bf51celight .node .collapsed-indicator{fill:rgb(129, 146, 154);stroke:none;opacity:0.6;}#d0d29a9f314bf51celight .node .collapsed-separator{stroke:rgb(129, 146, 154);stroke-width:0.75px;}#d0d29a9f314bf51celight div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif;font-size:12px;background:rgb(255, 255, 255);border:1px solid rgb(129, 146, 154);border-radius:2px;pointer-events:none;z-index:100;}#d0d29a9f314bf51celight .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#d0d29a9f314bf51celight rect.text{fill:none;stroke-width:0;}#d0d29a9f314bf51celight .icon-shape,#d0d29a9f314bf51celight .image-shape{background-color:rgb(182, 240, 255);text-align:center;}#d0d29a9f314bf51celight .icon-shape p,#d0d29a9f314bf51celight .image-shape p{background-color:rgb(182, 240, 255);padding:2px;}#d0d29a9f314bf51celight .icon-shape .label rect,#d0d29a9f314bf51celight .image-shape .label rect{opacity:0.5;background-color:rgb(182, 240, 255);fill:rgb(182, 240, 255);}#d0d29a9f314bf51celight .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#d0d29a9f314bf51celight .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#d0d29a9f314bf51celight .node .neo-node{stroke:rgb(204, 216, 222);}#d0d29a9f314bf51celight [data-look="neo"].node rect,#d0d29a9f314bf51celight [data-look="neo"].cluster rect,#d0d29a9f314bf51celight [data-look="neo"].node polygon{stroke:url(#d0d29a9f314bf51celight-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#d0d29a9f314bf51celight [data-look="neo"].swimlane.cluster rect{filter:none;}#d0d29a9f314bf51celight [data-look="neo"].node path{stroke:url(#d0d29a9f314bf51celight-gradient);stroke-width:1px;}#d0d29a9f314bf51celight [data-look="neo"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#d0d29a9f314bf51celight [data-look="neo"].node .neo-line path{stroke:rgb(204, 216, 222);filter:none;}#d0d29a9f314bf51celight [data-look="neo"].node circle{stroke:url(#d0d29a9f314bf51celight-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#d0d29a9f314bf51celight [data-look="neo"].node circle .state-start{fill:#000000;}#d0d29a9f314bf51celight [data-look="neo"].icon-shape .icon{fill:url(#d0d29a9f314bf51celight-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#d0d29a9f314bf51celight [data-look="neo"].icon-shape .icon-neo path{stroke:url(#d0d29a9f314bf51celight-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#d0d29a9f314bf51celight :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id="d0d29a9f314bf51celight_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"&gt;&lt;path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51celight_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"&gt;&lt;path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51celight_flowchart-v2-pointEnd-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="11.5" refY="7" markerUnits="userSpaceOnUse" markerWidth="10.5" markerHeight="14" orient="auto"&gt;&lt;path d="M 0 0 L 11.5 7 L 0 14 z" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51celight_flowchart-v2-pointStart-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="1" refY="7" markerUnits="userSpaceOnUse" markerWidth="11.5" markerHeight="14" orient="auto"&gt;&lt;polygon points="0,7 11.5,14 11.5,0" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"&gt;&lt;/polygon&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51celight_flowchart-v2-circleEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="11" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"&gt;&lt;circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"&gt;&lt;/circle&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51celight_flowchart-v2-circleStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-1" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"&gt;&lt;circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"&gt;&lt;/circle&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51celight_flowchart-v2-circleEnd-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refY="5" refX="12.25" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"&gt;&lt;circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"&gt;&lt;/circle&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51celight_flowchart-v2-circleStart-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-2" refY="5" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"&gt;&lt;circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"&gt;&lt;/circle&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51celight_flowchart-v2-crossEnd" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="12" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"&gt;&lt;path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51celight_flowchart-v2-crossStart" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="-1" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"&gt;&lt;path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51celight_flowchart-v2-crossEnd-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="17.7" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"&gt;&lt;path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51celight_flowchart-v2-crossStart-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="-3.5" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"&gt;&lt;path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5; stroke-dasharray: 1, 0;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;g class="root"&gt;&lt;g class="clusters"&gt;&lt;/g&gt;&lt;g class="edgePaths"&gt;&lt;path d="M172.6,86L163.315,90.167C154.031,94.333,135.461,102.667,126.176,110.333C116.891,118,116.891,125,116.891,128.5L116.891,132" id="d0d29a9f314bf51celight-L_A_B_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_A_B_0" data-points="W3sieCI6MTcyLjYwMDQ2Mzg2NzE4NzUsInkiOjg2fSx7IngiOjExNi44OTA2MjUsInkiOjExMX0seyJ4IjoxMTYuODkwNjI1LCJ5IjoxMzZ9XQ==" data-look="classic" marker-end="url(#d0d29a9f314bf51celight_flowchart-v2-pointEnd)"&gt;&lt;/path&gt;&lt;path d="M116.891,238L116.891,242.167C116.891,246.333,116.891,254.667,116.891,262.333C116.891,270,116.891,277,116.891,280.5L116.891,284" id="d0d29a9f314bf51celight-L_B_C_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_B_C_0" data-points="W3sieCI6MTE2Ljg5MDYyNSwieSI6MjM4fSx7IngiOjExNi44OTA2MjUsInkiOjI2M30seyJ4IjoxMTYuODkwNjI1LCJ5IjoyODh9XQ==" data-look="classic" marker-end="url(#d0d29a9f314bf51celight_flowchart-v2-pointEnd)"&gt;&lt;/path&gt;&lt;path d="M346.415,86L355.7,90.167C364.985,94.333,383.555,102.667,392.84,112.333C402.125,122,402.125,133,402.125,138.5L402.125,144" id="d0d29a9f314bf51celight-L_A_D_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_A_D_0" data-points="W3sieCI6MzQ2LjQxNTE2MTEzMjgxMjUsInkiOjg2fSx7IngiOjQwMi4xMjUsInkiOjExMX0seyJ4Ijo0MDIuMTI1LCJ5IjoxNDh9XQ==" data-look="classic" marker-end="url(#d0d29a9f314bf51celight_flowchart-v2-pointEnd)"&gt;&lt;/path&gt;&lt;path d="M116.891,366L116.891,370.167C116.891,374.333,116.891,382.667,116.891,390.333C116.891,398,116.891,405,116.891,408.5L116.891,412" id="d0d29a9f314bf51celight-L_C_E_0" class="edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_C_E_0" data-points="W3sieCI6MTE2Ljg5MDYyNSwieSI6MzY2fSx7IngiOjExNi44OTA2MjUsInkiOjM5MX0seyJ4IjoxMTYuODkwNjI1LCJ5Ijo0MTZ9XQ==" data-look="classic" marker-end="url(#d0d29a9f314bf51celight_flowchart-v2-pointEnd)"&gt;&lt;/path&gt;&lt;path d="M402.125,226L402.125,232.167C402.125,238.333,402.125,250.667,402.125,260.333C402.125,270,402.125,277,402.125,280.5L402.125,284" id="d0d29a9f314bf51celight-L_D_F_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_D_F_0" data-points="W3sieCI6NDAyLjEyNSwieSI6MjI2fSx7IngiOjQwMi4xMjUsInkiOjI2M30seyJ4Ijo0MDIuMTI1LCJ5IjoyODh9XQ==" data-look="classic" marker-end="url(#d0d29a9f314bf51celight_flowchart-v2-pointEnd)"&gt;&lt;/path&gt;&lt;path d="M402.125,366L402.125,370.167C402.125,374.333,402.125,382.667,402.125,390.333C402.125,398,402.125,405,402.125,408.5L402.125,412" id="d0d29a9f314bf51celight-L_F_G_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_F_G_0" data-points="W3sieCI6NDAyLjEyNSwieSI6MzY2fSx7IngiOjQwMi4xMjUsInkiOjM5MX0seyJ4Ijo0MDIuMTI1LCJ5Ijo0MTZ9XQ==" data-look="classic" marker-end="url(#d0d29a9f314bf51celight_flowchart-v2-pointEnd)"&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class="edgeLabels"&gt;&lt;g class="edgeLabel"&gt;&lt;g class="label" data-id="L_A_B_0" transform="translate(0, 0)"&gt;&lt;foreignObject width="0" height="0"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="edgeLabel"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="edgeLabel"&gt;&lt;g class="label" data-id="L_B_C_0" transform="translate(0, 0)"&gt;&lt;foreignObject width="0" height="0"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="edgeLabel"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="edgeLabel"&gt;&lt;g class="label" data-id="L_A_D_0" transform="translate(0, 0)"&gt;&lt;foreignObject width="0" height="0"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="edgeLabel"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="edgeLabel"&gt;&lt;g class="label" data-id="L_C_E_0" transform="translate(0, 0)"&gt;&lt;foreignObject width="0" height="0"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="edgeLabel"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="edgeLabel"&gt;&lt;g class="label" data-id="L_D_F_0" transform="translate(0, 0)"&gt;&lt;foreignObject width="0" height="0"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="edgeLabel"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="edgeLabel"&gt;&lt;g class="label" data-id="L_F_G_0" transform="translate(0, 0)"&gt;&lt;foreignObject width="0" height="0"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="edgeLabel"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="nodes"&gt;&lt;g class="node default" id="d0d29a9f314bf51celight-flowchart-A-0" data-look="classic" transform="translate(259.5078125, 47)"&gt;&lt;rect class="basic label-container" style="" x="-106.5625" y="-39" width="213.125" height="78"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-76.5625, -24)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="153.125" height="48"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;08-28: cask upgrade&lt;br&gt;replaces the binary&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="node default" id="d0d29a9f314bf51celight-flowchart-B-1" data-look="classic" transform="translate(116.890625, 187)"&gt;&lt;rect class="basic label-container" style="" x="-108.890625" y="-51" width="217.78125" height="102"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-78.890625, -36)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="157.78125" height="72"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;old inode is unlinked,&lt;br&gt;but still held open by&lt;br&gt;every running session&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="node default" id="d0d29a9f314bf51celight-flowchart-C-3" data-look="classic" transform="translate(116.890625, 327)"&gt;&lt;rect class="basic label-container" style="" x="-103.4140625" y="-39" width="206.828125" height="78"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-73.4140625, -24)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="146.828125" height="48"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;those sessions keep&lt;br&gt;working perfectly&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="node default" id="d0d29a9f314bf51celight-flowchart-D-5" data-look="classic" transform="translate(402.125, 187)"&gt;&lt;rect class="basic label-container" style="" x="-126.34375" y="-39" width="252.6875" height="78"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-96.34375, -24)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="192.6875" height="48"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;the NEW file on disk&lt;br&gt;hangs forever on --version&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="node default" id="d0d29a9f314bf51celight-flowchart-E-7" data-look="classic" transform="translate(116.890625, 455)"&gt;&lt;rect class="basic label-container" style="" x="-103.3046875" y="-39" width="206.609375" height="78"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-73.3046875, -24)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="146.609375" height="48"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;nothing looks wrong&lt;br&gt;for two days&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="node default" id="d0d29a9f314bf51celight-flowchart-F-9" data-look="classic" transform="translate(402.125, 327)"&gt;&lt;rect class="basic label-container" style="" x="-115.171875" y="-39" width="230.34375" height="78"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-85.171875, -24)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="170.34375" height="48"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;08-30: someone opens&lt;br&gt;a new session&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="node default" id="d0d29a9f314bf51celight-flowchart-G-11" data-look="classic" transform="translate(402.125, 455)"&gt;&lt;rect class="basic label-container" style="" x="-88.296875" y="-39" width="176.59375" height="78"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-58.296875, -24)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="116.59375" height="48"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;the hang finally&lt;br&gt;becomes visible&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id="d0d29a9f314bf51celight-drop-shadow" height="130%" width="130%"&gt;&lt;feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"&gt;&lt;/feDropShadow&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id="d0d29a9f314bf51celight-drop-shadow-small" height="150%" width="150%"&gt;&lt;feDropShadow dx="2" dy="2" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"&gt;&lt;/feDropShadow&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id="d0d29a9f314bf51celight-gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="100%" y2="0%"&gt;&lt;stop offset="0%" stop-color="rgb(204, 216, 222)" stop-opacity="1"&gt;&lt;/stop&gt;&lt;stop offset="100%" stop-color="rgb(28, 209, 255)" stop-opacity="1"&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;/svg&gt;&lt;/div&gt;&#10; &lt;div class="not-prose diagram diagram-dark"&gt;&lt;svg id="d0d29a9f314bf51cedark" width="100%" xmlns="http://www.w3.org/2000/svg" class="flowchart" style="max-width: 536.46875px;" viewBox="0 0 536.46875 502" role="graphics-document document" aria-roledescription="flowchart-v2"&gt;&lt;style&gt;#d0d29a9f314bf51cedark{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#d0d29a9f314bf51cedark .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#d0d29a9f314bf51cedark .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#d0d29a9f314bf51cedark .error-icon{fill:#a44141;}#d0d29a9f314bf51cedark .error-text{fill:#ddd;stroke:#ddd;}#d0d29a9f314bf51cedark .edge-thickness-normal{stroke-width:1px;}#d0d29a9f314bf51cedark .edge-thickness-thick{stroke-width:3.5px;}#d0d29a9f314bf51cedark .edge-pattern-solid{stroke-dasharray:0;}#d0d29a9f314bf51cedark .edge-thickness-invisible{stroke-width:0;fill:none;}#d0d29a9f314bf51cedark .edge-pattern-dashed{stroke-dasharray:3;}#d0d29a9f314bf51cedark .edge-pattern-dotted{stroke-dasharray:2;}#d0d29a9f314bf51cedark .marker{fill:lightgrey;stroke:lightgrey;}#d0d29a9f314bf51cedark .marker.cross{stroke:lightgrey;}#d0d29a9f314bf51cedark svg{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif;font-size:16px;}#d0d29a9f314bf51cedark p{margin:0;}#d0d29a9f314bf51cedark .label{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif;color:#ccc;}#d0d29a9f314bf51cedark .cluster-label text{fill:#F9FFFE;}#d0d29a9f314bf51cedark .cluster-label span{color:#F9FFFE;}#d0d29a9f314bf51cedark .cluster-label span p{background-color:transparent;}#d0d29a9f314bf51cedark .label text,#d0d29a9f314bf51cedark span{fill:#ccc;color:#ccc;}#d0d29a9f314bf51cedark .node rect,#d0d29a9f314bf51cedark .node circle,#d0d29a9f314bf51cedark .node ellipse,#d0d29a9f314bf51cedark .node polygon,#d0d29a9f314bf51cedark .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#d0d29a9f314bf51cedark .rough-node .label text,#d0d29a9f314bf51cedark .node .label text,#d0d29a9f314bf51cedark .image-shape .label,#d0d29a9f314bf51cedark .icon-shape .label{text-anchor:middle;}#d0d29a9f314bf51cedark .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#d0d29a9f314bf51cedark .rough-node .label,#d0d29a9f314bf51cedark .node .label,#d0d29a9f314bf51cedark .image-shape .label,#d0d29a9f314bf51cedark .icon-shape .label{text-align:center;}#d0d29a9f314bf51cedark .node.clickable{cursor:pointer;}#d0d29a9f314bf51cedark .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#d0d29a9f314bf51cedark .arrowheadPath{fill:lightgrey;}#d0d29a9f314bf51cedark .edgePath .path{stroke:lightgrey;stroke-width:1px;}#d0d29a9f314bf51cedark .flowchart-link{stroke:lightgrey;fill:none;}#d0d29a9f314bf51cedark .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#d0d29a9f314bf51cedark .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#d0d29a9f314bf51cedark .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#d0d29a9f314bf51cedark .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#d0d29a9f314bf51cedark .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#d0d29a9f314bf51cedark .cluster text{fill:#F9FFFE;}#d0d29a9f314bf51cedark .cluster span{color:#F9FFFE;}#d0d29a9f314bf51cedark .node .collapsed-indicator{fill:rgba(255, 255, 255, 0.25);stroke:none;opacity:0.6;}#d0d29a9f314bf51cedark .node .collapsed-separator{stroke:rgba(255, 255, 255, 0.25);stroke-width:0.75px;}#d0d29a9f314bf51cedark div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,noto sans,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#d0d29a9f314bf51cedark .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#d0d29a9f314bf51cedark rect.text{fill:none;stroke-width:0;}#d0d29a9f314bf51cedark .icon-shape,#d0d29a9f314bf51cedark .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#d0d29a9f314bf51cedark .icon-shape p,#d0d29a9f314bf51cedark .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#d0d29a9f314bf51cedark .icon-shape .label rect,#d0d29a9f314bf51cedark .image-shape .label rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#d0d29a9f314bf51cedark .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#d0d29a9f314bf51cedark .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#d0d29a9f314bf51cedark .node .neo-node{stroke:#ccc;}#d0d29a9f314bf51cedark [data-look="neo"].node rect,#d0d29a9f314bf51cedark [data-look="neo"].cluster rect,#d0d29a9f314bf51cedark [data-look="neo"].node polygon{stroke:url(#d0d29a9f314bf51cedark-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#d0d29a9f314bf51cedark [data-look="neo"].swimlane.cluster rect{filter:none;}#d0d29a9f314bf51cedark [data-look="neo"].node path{stroke:url(#d0d29a9f314bf51cedark-gradient);stroke-width:1px;}#d0d29a9f314bf51cedark [data-look="neo"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#d0d29a9f314bf51cedark [data-look="neo"].node .neo-line path{stroke:#ccc;filter:none;}#d0d29a9f314bf51cedark [data-look="neo"].node circle{stroke:url(#d0d29a9f314bf51cedark-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#d0d29a9f314bf51cedark [data-look="neo"].node circle .state-start{fill:#000000;}#d0d29a9f314bf51cedark [data-look="neo"].icon-shape .icon{fill:url(#d0d29a9f314bf51cedark-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#d0d29a9f314bf51cedark [data-look="neo"].icon-shape .icon-neo path{stroke:url(#d0d29a9f314bf51cedark-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#d0d29a9f314bf51cedark :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}&lt;/style&gt;&lt;g&gt;&lt;marker id="d0d29a9f314bf51cedark_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"&gt;&lt;path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51cedark_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"&gt;&lt;path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51cedark_flowchart-v2-pointEnd-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="11.5" refY="7" markerUnits="userSpaceOnUse" markerWidth="10.5" markerHeight="14" orient="auto"&gt;&lt;path d="M 0 0 L 11.5 7 L 0 14 z" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51cedark_flowchart-v2-pointStart-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="1" refY="7" markerUnits="userSpaceOnUse" markerWidth="11.5" markerHeight="14" orient="auto"&gt;&lt;polygon points="0,7 11.5,14 11.5,0" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"&gt;&lt;/polygon&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51cedark_flowchart-v2-circleEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="11" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"&gt;&lt;circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"&gt;&lt;/circle&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51cedark_flowchart-v2-circleStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-1" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"&gt;&lt;circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"&gt;&lt;/circle&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51cedark_flowchart-v2-circleEnd-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refY="5" refX="12.25" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"&gt;&lt;circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"&gt;&lt;/circle&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51cedark_flowchart-v2-circleStart-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-2" refY="5" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"&gt;&lt;circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"&gt;&lt;/circle&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51cedark_flowchart-v2-crossEnd" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="12" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"&gt;&lt;path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51cedark_flowchart-v2-crossStart" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="-1" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"&gt;&lt;path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51cedark_flowchart-v2-crossEnd-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="17.7" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"&gt;&lt;path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;marker id="d0d29a9f314bf51cedark_flowchart-v2-crossStart-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="-3.5" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"&gt;&lt;path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5; stroke-dasharray: 1, 0;"&gt;&lt;/path&gt;&lt;/marker&gt;&lt;g class="root"&gt;&lt;g class="clusters"&gt;&lt;/g&gt;&lt;g class="edgePaths"&gt;&lt;path d="M172.6,86L163.315,90.167C154.031,94.333,135.461,102.667,126.176,110.333C116.891,118,116.891,125,116.891,128.5L116.891,132" id="d0d29a9f314bf51cedark-L_A_B_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_A_B_0" data-points="W3sieCI6MTcyLjYwMDQ2Mzg2NzE4NzUsInkiOjg2fSx7IngiOjExNi44OTA2MjUsInkiOjExMX0seyJ4IjoxMTYuODkwNjI1LCJ5IjoxMzZ9XQ==" data-look="classic" marker-end="url(#d0d29a9f314bf51cedark_flowchart-v2-pointEnd)"&gt;&lt;/path&gt;&lt;path d="M116.891,238L116.891,242.167C116.891,246.333,116.891,254.667,116.891,262.333C116.891,270,116.891,277,116.891,280.5L116.891,284" id="d0d29a9f314bf51cedark-L_B_C_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_B_C_0" data-points="W3sieCI6MTE2Ljg5MDYyNSwieSI6MjM4fSx7IngiOjExNi44OTA2MjUsInkiOjI2M30seyJ4IjoxMTYuODkwNjI1LCJ5IjoyODh9XQ==" data-look="classic" marker-end="url(#d0d29a9f314bf51cedark_flowchart-v2-pointEnd)"&gt;&lt;/path&gt;&lt;path d="M346.415,86L355.7,90.167C364.985,94.333,383.555,102.667,392.84,112.333C402.125,122,402.125,133,402.125,138.5L402.125,144" id="d0d29a9f314bf51cedark-L_A_D_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_A_D_0" data-points="W3sieCI6MzQ2LjQxNTE2MTEzMjgxMjUsInkiOjg2fSx7IngiOjQwMi4xMjUsInkiOjExMX0seyJ4Ijo0MDIuMTI1LCJ5IjoxNDh9XQ==" data-look="classic" marker-end="url(#d0d29a9f314bf51cedark_flowchart-v2-pointEnd)"&gt;&lt;/path&gt;&lt;path d="M116.891,366L116.891,370.167C116.891,374.333,116.891,382.667,116.891,390.333C116.891,398,116.891,405,116.891,408.5L116.891,412" id="d0d29a9f314bf51cedark-L_C_E_0" class="edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_C_E_0" data-points="W3sieCI6MTE2Ljg5MDYyNSwieSI6MzY2fSx7IngiOjExNi44OTA2MjUsInkiOjM5MX0seyJ4IjoxMTYuODkwNjI1LCJ5Ijo0MTZ9XQ==" data-look="classic" marker-end="url(#d0d29a9f314bf51cedark_flowchart-v2-pointEnd)"&gt;&lt;/path&gt;&lt;path d="M402.125,226L402.125,232.167C402.125,238.333,402.125,250.667,402.125,260.333C402.125,270,402.125,277,402.125,280.5L402.125,284" id="d0d29a9f314bf51cedark-L_D_F_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_D_F_0" data-points="W3sieCI6NDAyLjEyNSwieSI6MjI2fSx7IngiOjQwMi4xMjUsInkiOjI2M30seyJ4Ijo0MDIuMTI1LCJ5IjoyODh9XQ==" data-look="classic" marker-end="url(#d0d29a9f314bf51cedark_flowchart-v2-pointEnd)"&gt;&lt;/path&gt;&lt;path d="M402.125,366L402.125,370.167C402.125,374.333,402.125,382.667,402.125,390.333C402.125,398,402.125,405,402.125,408.5L402.125,412" id="d0d29a9f314bf51cedark-L_F_G_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_F_G_0" data-points="W3sieCI6NDAyLjEyNSwieSI6MzY2fSx7IngiOjQwMi4xMjUsInkiOjM5MX0seyJ4Ijo0MDIuMTI1LCJ5Ijo0MTZ9XQ==" data-look="classic" marker-end="url(#d0d29a9f314bf51cedark_flowchart-v2-pointEnd)"&gt;&lt;/path&gt;&lt;/g&gt;&lt;g class="edgeLabels"&gt;&lt;g class="edgeLabel"&gt;&lt;g class="label" data-id="L_A_B_0" transform="translate(0, 0)"&gt;&lt;foreignObject width="0" height="0"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="edgeLabel"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="edgeLabel"&gt;&lt;g class="label" data-id="L_B_C_0" transform="translate(0, 0)"&gt;&lt;foreignObject width="0" height="0"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="edgeLabel"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="edgeLabel"&gt;&lt;g class="label" data-id="L_A_D_0" transform="translate(0, 0)"&gt;&lt;foreignObject width="0" height="0"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="edgeLabel"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="edgeLabel"&gt;&lt;g class="label" data-id="L_C_E_0" transform="translate(0, 0)"&gt;&lt;foreignObject width="0" height="0"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="edgeLabel"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="edgeLabel"&gt;&lt;g class="label" data-id="L_D_F_0" transform="translate(0, 0)"&gt;&lt;foreignObject width="0" height="0"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="edgeLabel"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="edgeLabel"&gt;&lt;g class="label" data-id="L_F_G_0" transform="translate(0, 0)"&gt;&lt;foreignObject width="0" height="0"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="edgeLabel"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="nodes"&gt;&lt;g class="node default" id="d0d29a9f314bf51cedark-flowchart-A-0" data-look="classic" transform="translate(259.5078125, 47)"&gt;&lt;rect class="basic label-container" style="" x="-106.5625" y="-39" width="213.125" height="78"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-76.5625, -24)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="153.125" height="48"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;08-28: cask upgrade&lt;br&gt;replaces the binary&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="node default" id="d0d29a9f314bf51cedark-flowchart-B-1" data-look="classic" transform="translate(116.890625, 187)"&gt;&lt;rect class="basic label-container" style="" x="-108.890625" y="-51" width="217.78125" height="102"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-78.890625, -36)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="157.78125" height="72"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;old inode is unlinked,&lt;br&gt;but still held open by&lt;br&gt;every running session&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="node default" id="d0d29a9f314bf51cedark-flowchart-C-3" data-look="classic" transform="translate(116.890625, 327)"&gt;&lt;rect class="basic label-container" style="" x="-103.4140625" y="-39" width="206.828125" height="78"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-73.4140625, -24)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="146.828125" height="48"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;those sessions keep&lt;br&gt;working perfectly&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="node default" id="d0d29a9f314bf51cedark-flowchart-D-5" data-look="classic" transform="translate(402.125, 187)"&gt;&lt;rect class="basic label-container" style="" x="-126.34375" y="-39" width="252.6875" height="78"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-96.34375, -24)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="192.6875" height="48"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;the NEW file on disk&lt;br&gt;hangs forever on --version&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="node default" id="d0d29a9f314bf51cedark-flowchart-E-7" data-look="classic" transform="translate(116.890625, 455)"&gt;&lt;rect class="basic label-container" style="" x="-103.3046875" y="-39" width="206.609375" height="78"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-73.3046875, -24)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="146.609375" height="48"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;nothing looks wrong&lt;br&gt;for two days&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="node default" id="d0d29a9f314bf51cedark-flowchart-F-9" data-look="classic" transform="translate(402.125, 327)"&gt;&lt;rect class="basic label-container" style="" x="-115.171875" y="-39" width="230.34375" height="78"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-85.171875, -24)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="170.34375" height="48"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;08-30: someone opens&lt;br&gt;a new session&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;g class="node default" id="d0d29a9f314bf51cedark-flowchart-G-11" data-look="classic" transform="translate(402.125, 455)"&gt;&lt;rect class="basic label-container" style="" x="-88.296875" y="-39" width="176.59375" height="78"&gt;&lt;/rect&gt;&lt;g class="label" style="" transform="translate(-58.296875, -24)"&gt;&lt;rect&gt;&lt;/rect&gt;&lt;foreignObject width="116.59375" height="48"&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"&gt;&lt;span class="nodeLabel"&gt;&lt;p&gt;the hang finally&lt;br&gt;becomes visible&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/foreignObject&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;defs&gt;&lt;filter id="d0d29a9f314bf51cedark-drop-shadow" height="130%" width="130%"&gt;&lt;feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#FFFFFF"&gt;&lt;/feDropShadow&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;defs&gt;&lt;filter id="d0d29a9f314bf51cedark-drop-shadow-small" height="150%" width="150%"&gt;&lt;feDropShadow dx="2" dy="2" stdDeviation="0" flood-opacity="0.06" flood-color="#FFFFFF"&gt;&lt;/feDropShadow&gt;&lt;/filter&gt;&lt;/defs&gt;&lt;linearGradient id="d0d29a9f314bf51cedark-gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="100%" y2="0%"&gt;&lt;stop offset="0%" stop-color="#cccccc" stop-opacity="1"&gt;&lt;/stop&gt;&lt;stop offset="100%" stop-color="hsl(180, 0%, 18.3529411765%)" stop-opacity="1"&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;/svg&gt;&lt;/div&gt;&#10;&lt;p&gt;The window between breaking this and noticing it was therefore set by how&#10;long I keep sessions open, which on this machine is days.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;The one comparison that ruled out everything else&#10; &lt;div id="the-one-comparison-that-ruled-out-everything-else" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-one-comparison-that-ruled-out-everything-else" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;My first instinct was that the file was damaged. It was not:&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; codesign --verify --strict /opt/homebrew/bin/claude&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;That returned clean in 0.15 seconds, signed by Developer ID Anthropic PBC.&#10;Content and signature were both intact. A damaged download would have failed&#10;right there.&lt;/p&gt;&#10;&lt;p&gt;Then I tried to take the environment out of the picture:&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; env -i &lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/probe &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin:/bin /opt/homebrew/bin/claude --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;#&lt;/span&gt; still hangs&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;Empty environment, fresh HOME, no config to read. Same hang. I also cleared&#10;&lt;code&gt;com.apple.quarantine&lt;/code&gt;, which changed nothing, and found that&#10;&lt;code&gt;com.apple.provenance&lt;/code&gt; cannot be removed at all.&lt;/p&gt;&#10;&lt;p&gt;The experiment that actually decided it was much simpler. I copied the file&#10;next to itself and ran the copy:&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; cp /opt/homebrew/bin/claude /opt/homebrew/bin/claude-copy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; /opt/homebrew/bin/claude-copy --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;#&lt;/span&gt; instant&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;One command, and most of my remaining theories died together. The copy sat&#10;in the same directory as the original, held the same bytes, ran under the&#10;same environment, and lived on the same filesystem. Path, content, config&#10;and disk were all ruled out in a single comparison. What is left, when a&#10;file and a copy of that file in the same folder behave differently, is the&#10;inode.&lt;/p&gt;&#10;&lt;p&gt;The fix follows from that. Copy over the original, which gives it a fresh&#10;inode holding the same bytes:&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; cp /opt/homebrew/bin/claude-copy /opt/homebrew/bin/claude&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;$&lt;/span&gt; codesign --verify --strict /opt/homebrew/bin/claude &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; signature ok&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;signature ok&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;Why the old inode hung, I still cannot tell you. The upgrade looks like it&#10;was interrupted partway through, and this was a 302 MB cask binary, so there&#10;was plenty of time to interrupt. I can describe the shape of the fault and&#10;the test that identifies it. The mechanism underneath stays unexplained, and&#10;I would rather write that down than invent something that sounds complete.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Two traps that gave me confident wrong answers&#10; &lt;div id="two-traps-that-gave-me-confident-wrong-answers" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#two-traps-that-gave-me-confident-wrong-answers" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Before the copy experiment, I wasted real time on two things that looked&#10;like evidence.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;sample&lt;/code&gt; showed only &lt;code&gt;_dyld_start&lt;/code&gt;, and I believed it.&lt;/strong&gt; A truncated stack&#10;with nothing but the loader entry point looks exactly like &amp;ldquo;stuck in the&#10;dynamic linker&amp;rdquo;. It is not evidence of that. &lt;code&gt;claude&lt;/code&gt; is a single-file&#10;bundled binary, and bundlers embed a runtime whose frames do not&#10;symbolicate, so the stack is cut short rather than genuinely short. I had a&#10;theory about dyld before I had a result that supported one.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;My first three probes never ran &lt;code&gt;claude&lt;/code&gt; at all.&lt;/strong&gt; This one is funnier and&#10;more useful. I wrapped the call in a timeout, like this:&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# reports rc=0 and never executes claude once&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timeout &lt;span class="m"&gt;25&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; claude --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;&lt;code&gt;command&lt;/code&gt; is a shell builtin. &lt;code&gt;timeout&lt;/code&gt; is a program, and a program that&#10;execs cannot see builtins, shell functions, or aliases. So &lt;code&gt;timeout&lt;/code&gt; looked&#10;for a binary named &lt;code&gt;command&lt;/code&gt;, and the whole thing reported success without&#10;the probed program ever starting. Three runs, three clean exit codes, zero&#10;actual measurements.&lt;/p&gt;&#10;&lt;p&gt;That one is not even a new lesson here. My own rules already say a builtin&#10;can intercept something you took for a binary, which is how &lt;code&gt;log show&lt;/code&gt; once&#10;reported zero errors from a log holding tens of thousands. This is the same&#10;confusion pointing the other way: anything that execs, so &lt;code&gt;timeout&lt;/code&gt;,&#10;&lt;code&gt;xargs&lt;/code&gt;, &lt;code&gt;nohup&lt;/code&gt;, &lt;code&gt;sudo&lt;/code&gt;, cannot see what the shell resolves for you. Wrap a&#10;shell-resolved name in one of those and you quietly probe something else.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;The check could not live where the other checks live&#10; &lt;div id="the-check-could-not-live-where-the-other-checks-live" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-check-could-not-live-where-the-other-checks-live" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;The obvious place for a new guard was the block that already asks each tool&#10;to parse its config and report back. I could not put it there, and the&#10;reason is the whole design.&lt;/p&gt;&#10;&lt;p&gt;Those checks assume the tool exits. This failure is a tool that does not&#10;exit. A check written in that style would have inherited the hang and taken&#10;the entire maintenance run down with it. A check that can hang the thing it&#10;is checking is worse than no check, so this one refuses to run unbounded.&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dm_launch_probe&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# $1 = seconds, rest = command and args&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;local&lt;/span&gt; &lt;span class="nv"&gt;secs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; rc tmo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;tmo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TIMEOUT_CMD&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$tmo&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;tmo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt; -v timeout 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; -v gtimeout 2&amp;gt;/dev/null&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;command&lt;/span&gt; -v &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$tmo&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; skipped&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; 0&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$tmo&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$secs&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$rc&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; in&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 0&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; ok &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 124&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; hang &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; *&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;fail &lt;/span&gt;&lt;span class="nv"&gt;$rc&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;esac&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Four verdicts, because two would mislead&#10; &lt;div id="four-verdicts-because-two-would-mislead" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#four-verdicts-because-two-would-mislead" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Verdict&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;What it means&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Where the fix is&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;ok&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;the binary started and reached its own code&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;nothing to do&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;fail &amp;lt;rc&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;the tool is rejecting something it can see&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;its config or arguments&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;hang&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;it never reached its own code&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;the filesystem, so give it a new inode&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;skipped&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;there is no usable timeout command&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;the probe itself, not the probed tool&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;The split between &lt;code&gt;hang&lt;/code&gt; and &lt;code&gt;fail&lt;/code&gt; is the point. A non-zero exit means the&#10;program started, read something, and said no. A timeout means it never got&#10;as far as its own code, so nothing it can see is relevant and its config is&#10;the wrong place to look. My repo has already paid once for printing one&#10;remedy for two different causes, so these two print different remedies, and&#10;the hang branch tells me to re-verify the signature after replacing the&#10;inode.&lt;/p&gt;&#10;&lt;p&gt;The fourth verdict earns its place too. GNU &lt;code&gt;timeout&lt;/code&gt; reserves 124 for&#10;a real timeout and 127 for &amp;ldquo;command cannot be found&amp;rdquo;, so a &lt;code&gt;TIMEOUT_CMD&lt;/code&gt;&#10;pointing at something missing would have reported &lt;code&gt;fail 127&lt;/code&gt;. That reads as&#10;a verdict about &lt;code&gt;claude&lt;/code&gt; when it is really a verdict about my own probe.&#10;Misattribution like that is the exact thing this function exists to prevent,&#10;so a broken probe says &lt;code&gt;skipped&lt;/code&gt; and stays honest.&lt;/p&gt;&#10;&lt;p&gt;All four verdicts were produced on purpose before I trusted them, and two&#10;were proven by breaking them: folding 124 into the fail branch turns the&#10;hang test red, and dropping the &lt;code&gt;command -v&lt;/code&gt; validation turns the skipped&#10;test red.&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;run_test &lt;span class="s2"&gt;&amp;#34;launch probe: a clean exit is ok&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;[ \&amp;#34;\$(dm_launch_probe 5 /usr/bin/true)\&amp;#34; = ok ]&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;run_test &lt;span class="s2"&gt;&amp;#34;launch probe: a non-zero exit is fail, with the code&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;[ \&amp;#34;\$(dm_launch_probe 5 /usr/bin/false)\&amp;#34; = &amp;#39;fail 1&amp;#39; ]&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;run_test &lt;span class="s2"&gt;&amp;#34;launch probe: a hang is hang, not fail&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;[ \&amp;#34;\$(dm_launch_probe 2 /bin/sleep 30)\&amp;#34; = hang ]&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;run_test &lt;span class="s2"&gt;&amp;#34;launch probe: a broken timeout command skips, not fails&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;[ \&amp;#34;\$(TIMEOUT_CMD=/nonexistent-timeout dm_launch_probe 2 /usr/bin/true)\&amp;#34; = skipped ]&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&#10;&lt;h2 class="relative group"&gt;CI caught what my machine could not&#10; &lt;div id="ci-caught-what-my-machine-could-not" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#ci-caught-what-my-machine-could-not" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;My Mac has coreutils installed, so &lt;code&gt;timeout&lt;/code&gt; is always there and all four&#10;tests pass locally. A GitHub runner does not: macOS ships no &lt;code&gt;timeout&lt;/code&gt; at&#10;all. On CI the probe correctly returned &lt;code&gt;skipped&lt;/code&gt; for every case, which&#10;turned three of my four assertions red.&lt;/p&gt;&#10;&lt;p&gt;The fourth one passed.&lt;/p&gt;&#10;&lt;p&gt;That asymmetry is the tell, and it is the same shape as the inverted test in&#10;the previous post of this series. Three tests that assert a specific verdict&#10;go red the moment every verdict becomes &lt;code&gt;skipped&lt;/code&gt;. The survivor is the one&#10;comparing &lt;code&gt;skipped&lt;/code&gt; against &lt;code&gt;skipped&lt;/code&gt;, so it had never been able to tell any&#10;two outcomes apart in the first place.&lt;/p&gt;&#10;&lt;p&gt;The guard went on the machine rather than on the repo, because having a&#10;timeout command is a property of the machine. It also announces itself&#10;rather than disappearing:&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;skipped (no timeout command)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;Four tests vanished behind a rename in this repo earlier the same month and&#10;the suite stayed green, so a block that silently stops running is a shape I&#10;now actively look for. A suite has three outcomes, and the third one has to&#10;be visible.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;The number I got wrong, and the claim I narrowed&#10; &lt;div id="the-number-i-got-wrong-and-the-claim-i-narrowed" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-number-i-got-wrong-and-the-claim-i-narrowed" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Two corrections came out of review, and both made the thing smaller.&lt;/p&gt;&#10;&lt;p&gt;I set the timeout at 20 seconds and justified it badly. I wrote that a real&#10;hang would cost 20 seconds of every maintenance run forever, which sounds&#10;expensive until you notice runs are daily. It costs 20 seconds once a day,&#10;which is nothing. The failure that actually costs something is the opposite&#10;one: a false hang reported on a working tool teaches me to ignore the check,&#10;and then the check is decoration. That argument points at a generous cap&#10;rather than a tight one. The measured warm start is 0.04 to 0.05 seconds&#10;over three runs, so 20 seconds is roughly 400 times the warm path. It stays&#10;at 20, and if it ever moves it moves longer.&lt;/p&gt;&#10;&lt;p&gt;The honest part: that reasoning covers the warm path, which I measured. The&#10;cold path, with Gatekeeper assessment and a cold loader cache right after an&#10;upgrade, I have measured exactly zero times. The cap is a guess about a&#10;number I do not have. What replaces the guess is already scheduled, because&#10;the next cask upgrade is the cold path, so I time it then.&lt;/p&gt;&#10;&lt;p&gt;The second correction was to what the check claims. My first version printed&#10;&amp;ldquo;claude launches OK&amp;rdquo;. It does not know that. It knows one narrow thing:&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude launch probe (--version) started&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;&lt;code&gt;--version&lt;/code&gt; proves the binary started and reached its own code. It proves&#10;nothing about whether a real session works. A narrower claim is an accurate&#10;one, and this particular narrow claim happens to sit directly on top of the&#10;failure it guards: the break was at the loader and inode layer, and&#10;&lt;code&gt;--version&lt;/code&gt; exercises that same layer. The check is not standing in for the&#10;fault. It sits on the fault&amp;rsquo;s own ground.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Lessons&#10; &lt;div id="lessons" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#lessons" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;A file and a copy of that file in the same directory differ in exactly one&#10;way. When a binary misbehaves and its copy does not, you have already&#10;found the layer.&lt;/li&gt;&#10;&lt;li&gt;An upgrade that only breaks new processes has a delay built in, as long as&#10;your longest-lived session. Probe on a schedule, not on symptoms.&lt;/li&gt;&#10;&lt;li&gt;A hang and a non-zero exit need separate remedies. One means the tool read&#10;something and refused; the other means it never reached its own code.&lt;/li&gt;&#10;&lt;li&gt;A verdict about your own instrument must never be printed as a verdict&#10;about the thing it measures.&lt;/li&gt;&#10;&lt;li&gt;Programs that exec cannot see builtins, shell functions, or aliases. Wrap&#10;a shell-resolved name in &lt;code&gt;timeout&lt;/code&gt; and you measure something else entirely.&lt;/li&gt;&#10;&lt;li&gt;When one assertion survives a change that reddens its neighbours, suspect&#10;the survivor. It is usually the one that cannot distinguish anything.&lt;/li&gt;&#10;&lt;li&gt;Write down which half of your reasoning rests on a measurement and which&#10;half is a guess, along with the event that will replace the guess.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;References&#10; &lt;div id="references" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#references" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.gnu.org/software/coreutils/manual/html_node/timeout-invocation.html" target="_blank" rel="noreferrer"&gt;GNU coreutils: &lt;code&gt;timeout&lt;/code&gt; invocation&lt;/a&gt;&#10;(exit status 124 for a timeout, 127 when the command cannot be found)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://bun.com/docs/bundler/executables" target="_blank" rel="noreferrer"&gt;Bun: single-file executables&lt;/a&gt;&#10;(one example of the bundled-runtime shape that produces a truncated&#10;&lt;code&gt;sample&lt;/code&gt; stack)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://formulae.brew.sh/cask/claude-code" target="_blank" rel="noreferrer"&gt;Homebrew cask: claude-code&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;codesign(1)&lt;/code&gt; and &lt;code&gt;xattr(1)&lt;/code&gt; on macOS, plus&#10;&lt;a href="https://developer.apple.com/documentation/security/notarizing-macos-software-before-distribution" target="_blank" rel="noreferrer"&gt;Apple&amp;rsquo;s notarization documentation&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;The probe, its four tests, and the triage playbook:&#10;&lt;a href="https://github.com/nickboy/dotfiles" target="_blank" rel="noreferrer"&gt;nickboy/dotfiles&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</content:encoded></item></channel></rss>