<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Unstack]]></title><description><![CDATA[Notes on projects, apps, and the things we build.]]></description><link>https://unstack.io/</link><image><url>https://unstack.io/favicon.png</url><title>Unstack</title><link>https://unstack.io/</link></image><generator>Unstack</generator><lastBuildDate>Tue, 25 Aug 2026 00:09:22 GMT</lastBuildDate><atom:link href="https://unstack.io/rss" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Know your feedback loop]]></title><description><![CDATA[<p>Let's say I challenged you to get good at something you've never done before. One option is shooting free throws. The other is hiring new employees. Which do you think you'd pick up quicker?</p>
<p>Free throws, obviously. And the reason is mostly the feedback loop.</p>
<p>Shoot a free throw and</p>]]></description><link>https://unstack.io/know-your-feedback-loop</link><guid isPermaLink="false">9</guid><dc:creator><![CDATA[Scott Robinson]]></dc:creator><pubDate>Tue, 28 Jul 2026 17:00:43 GMT</pubDate><content:encoded><![CDATA[<p>Let's say I challenged you to get good at something you've never done before. One option is shooting free throws. The other is hiring new employees. Which do you think you'd pick up quicker?</p>
<p>Free throws, obviously. And the reason is mostly the feedback loop.</p>
<p>Shoot a free throw and you know within a second whether it went in. You adjust and try again. Hire a manager and it might take months - or years - before you figure out whether you got it right. Even then, half the time you still can't tell how much was the hire vs. the team they inherited, the market, luck, whatever else was going on.</p>
<p>You improve at the speed of your feedback. More precisely, at the speed <em>and quality</em> of it. Once you start noticing that, a lot of skills and decisions start looking less like talent problems and more like loop problems.</p>
<h2 id="shortloopscompresslearning">Short loops compress learning</h2>
<p>Short feedback loops give you more reps, and you usually catch mistakes sooner - before they compound. That compresses the learning curve. It's also why some domains get so competitive (sports especially). Everybody else is getting those same reps, and they're getting them constantly.</p>
<p>Coding is a clean example. You write something, run it, watch what happens, change it, repeat - usually within a few minutes. Changing a company culture, raising a child, picking an executive: you might wait years before you know if your judgment was any good.</p>
<p><strong>Short loop</strong></p>
<pre class="d2-diagram-fence"><div class="d2-diagram"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="v0.7.0-HEAD" preserveAspectRatio="xMidYMid meet" viewBox="0 0 645 142" width="645" height="142"><svg class="d2-378692534 d2-svg" width="645" height="142" viewBox="-1 -1 645 142"><rect x="-1.000000" y="-1.000000" width="645.000000" height="142.000000" rx="0.000000" fill="transparent" stroke-width="0"></rect><style type="text/css">
.d2-378692534 .text-bold {
	font-family: "d2-378692534-font-bold";
}
@font-face {
	font-family: d2-378692534-font-bold;
	src: url("data:application/font-woff;base64,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");
}
.d2-378692534 .text-italic {
	font-family: "d2-378692534-font-italic";
}
@font-face {
	font-family: d2-378692534-font-italic;
	src: url("data:application/font-woff;base64,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");
}</style><style type="text/css">.shape {
  shape-rendering: geometricPrecision;
  stroke-linejoin: round;
}
.connection {
  stroke-linecap: round;
  stroke-linejoin: round;
}
.blend {
  mix-blend-mode: multiply;
  opacity: 0.5;
}

		.d2-378692534 .fill-N1{fill:#374151;}
		.d2-378692534 .fill-N2{fill:#6b7280;}
		.d2-378692534 .fill-N3{fill:#9ca3af;}
		.d2-378692534 .fill-N4{fill:#d1d5db;}
		.d2-378692534 .fill-N5{fill:#e5e7eb;}
		.d2-378692534 .fill-N6{fill:#f3f4f6;}
		.d2-378692534 .fill-N7{fill:#f9fafb;}
		.d2-378692534 .fill-B1{fill:#6b7280;}
		.d2-378692534 .fill-B2{fill:#6b7280;}
		.d2-378692534 .fill-B3{fill:#d1d5db;}
		.d2-378692534 .fill-B4{fill:#d1d5db;}
		.d2-378692534 .fill-B5{fill:#f3f4f6;}
		.d2-378692534 .fill-B6{fill:#ffffff;}
		.d2-378692534 .fill-AA2{fill:#f3f4f6;}
		.d2-378692534 .fill-AA4{fill:#d1d5db;}
		.d2-378692534 .fill-AA5{fill:#374151;}
		.d2-378692534 .fill-AB4{fill:#ffffff;}
		.d2-378692534 .fill-AB5{fill:#6b7280;}
		.d2-378692534 .stroke-N1{stroke:#374151;}
		.d2-378692534 .stroke-N2{stroke:#6b7280;}
		.d2-378692534 .stroke-N3{stroke:#9ca3af;}
		.d2-378692534 .stroke-N4{stroke:#d1d5db;}
		.d2-378692534 .stroke-N5{stroke:#e5e7eb;}
		.d2-378692534 .stroke-N6{stroke:#f3f4f6;}
		.d2-378692534 .stroke-N7{stroke:#f9fafb;}
		.d2-378692534 .stroke-B1{stroke:#6b7280;}
		.d2-378692534 .stroke-B2{stroke:#6b7280;}
		.d2-378692534 .stroke-B3{stroke:#d1d5db;}
		.d2-378692534 .stroke-B4{stroke:#d1d5db;}
		.d2-378692534 .stroke-B5{stroke:#f3f4f6;}
		.d2-378692534 .stroke-B6{stroke:#ffffff;}
		.d2-378692534 .stroke-AA2{stroke:#f3f4f6;}
		.d2-378692534 .stroke-AA4{stroke:#d1d5db;}
		.d2-378692534 .stroke-AA5{stroke:#374151;}
		.d2-378692534 .stroke-AB4{stroke:#ffffff;}
		.d2-378692534 .stroke-AB5{stroke:#6b7280;}
		.d2-378692534 .background-color-N1{background-color:#374151;}
		.d2-378692534 .background-color-N2{background-color:#6b7280;}
		.d2-378692534 .background-color-N3{background-color:#9ca3af;}
		.d2-378692534 .background-color-N4{background-color:#d1d5db;}
		.d2-378692534 .background-color-N5{background-color:#e5e7eb;}
		.d2-378692534 .background-color-N6{background-color:#f3f4f6;}
		.d2-378692534 .background-color-N7{background-color:#f9fafb;}
		.d2-378692534 .background-color-B1{background-color:#6b7280;}
		.d2-378692534 .background-color-B2{background-color:#6b7280;}
		.d2-378692534 .background-color-B3{background-color:#d1d5db;}
		.d2-378692534 .background-color-B4{background-color:#d1d5db;}
		.d2-378692534 .background-color-B5{background-color:#f3f4f6;}
		.d2-378692534 .background-color-B6{background-color:#ffffff;}
		.d2-378692534 .background-color-AA2{background-color:#f3f4f6;}
		.d2-378692534 .background-color-AA4{background-color:#d1d5db;}
		.d2-378692534 .background-color-AA5{background-color:#374151;}
		.d2-378692534 .background-color-AB4{background-color:#ffffff;}
		.d2-378692534 .background-color-AB5{background-color:#6b7280;}
		.d2-378692534 .color-N1{color:#374151;}
		.d2-378692534 .color-N2{color:#6b7280;}
		.d2-378692534 .color-N3{color:#9ca3af;}
		.d2-378692534 .color-N4{color:#d1d5db;}
		.d2-378692534 .color-N5{color:#e5e7eb;}
		.d2-378692534 .color-N6{color:#f3f4f6;}
		.d2-378692534 .color-N7{color:#f9fafb;}
		.d2-378692534 .color-B1{color:#6b7280;}
		.d2-378692534 .color-B2{color:#6b7280;}
		.d2-378692534 .color-B3{color:#d1d5db;}
		.d2-378692534 .color-B4{color:#d1d5db;}
		.d2-378692534 .color-B5{color:#f3f4f6;}
		.d2-378692534 .color-B6{color:#ffffff;}
		.d2-378692534 .color-AA2{color:#f3f4f6;}
		.d2-378692534 .color-AA4{color:#d1d5db;}
		.d2-378692534 .color-AA5{color:#374151;}
		.d2-378692534 .color-AB4{color:#ffffff;}
		.d2-378692534 .color-AB5{color:#6b7280;}.appendix text.text{fill:#374151}.md{--color-fg-default:#374151;--color-fg-muted:#6b7280;--color-fg-subtle:#9ca3af;--color-canvas-default:#f9fafb;--color-canvas-subtle:#f3f4f6;--color-border-default:#6b7280;--color-border-muted:#6b7280;--color-neutral-muted:#f3f4f6;--color-accent-fg:#6b7280;--color-accent-emphasis:#6b7280;--color-attention-subtle:#6b7280;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-dark-d2-378692534);mix-blend-mode:overlay}.sketch-overlay-B2{fill:url(#streaks-dark-d2-378692534);mix-blend-mode:overlay}.sketch-overlay-B3{fill:url(#streaks-normal-d2-378692534);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-normal-d2-378692534);mix-blend-mode:color-burn}.sketch-overlay-B5{fill:url(#streaks-bright-d2-378692534);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-378692534);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-bright-d2-378692534);mix-blend-mode:darken}.sketch-overlay-AA4{fill:url(#streaks-normal-d2-378692534);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-darker-d2-378692534);mix-blend-mode:lighten}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-378692534);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-dark-d2-378692534);mix-blend-mode:overlay}.sketch-overlay-N1{fill:url(#streaks-darker-d2-378692534);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-378692534);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-378692534);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-378692534);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-378692534);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-378692534);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-378692534);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}</style><g class="YWN0aW9u"><g class="shape"><rect x="12.000000" y="40.000000" width="142.000000" height="77.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="83.000000" y="76.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px"><tspan x="83.000000" dy="0.000000">Take the shot /</tspan><tspan x="83.000000" dy="16.000000">ship the change</tspan></text></g><g class="cmVzdWx0"><g class="shape"><rect x="346.000000" y="12.000000" width="118.000000" height="63.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="405.000000" y="48.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px">Clear result</text></g><g class="dXBkYXRl"><g class="shape"><rect x="544.000000" y="47.000000" width="87.000000" height="63.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="587.500000" y="83.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px">Adjust</text></g><g class="KGFjdGlvbiAtJmd0OyByZXN1bHQpWzBd"><marker id="mk-d2-378692534-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#6b7280" class="connection fill-B1" stroke-width="2"></polygon> </marker><path d="M 156.000000 66.416000 L 184.000000 66.416000 S 194.000000 66.416000 194.000000 56.416000 L 194.000000 53.500000 S 194.000000 43.500000 204.000000 43.500000 L 342.000000 43.500000" stroke="#6b7280" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-378692534-3488378134)" mask="url(#d2-378692534)"></path><text x="238.500000" y="42.000000" fill="#6b7280" class="text-italic fill-N2" style="text-anchor:middle;font-size:12px"><tspan x="238.500000" dy="0.000000">seconds</tspan><tspan x="238.500000" dy="14.000000">minutes</tspan></text></g><g class="KHJlc3VsdCAtJmd0OyB1cGRhdGUpWzBd"><path d="M 466.000000 43.500000 L 494.000000 43.500000 S 504.000000 43.500000 504.000000 53.500000 L 504.000000 58.750000 S 504.000000 68.750000 514.000000 68.750000 L 540.000000 68.750000" stroke="#6b7280" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-378692534-3488378134)" mask="url(#d2-378692534)"></path></g><g class="KHVwZGF0ZSAtJmd0OyBhY3Rpb24pWzBd"><path d="M 542.000000 89.750000 L 514.000000 89.750000 S 504.000000 89.750000 504.000000 99.750000 L 504.000000 105.000000 S 504.000000 115.000000 494.000000 115.000000 L 204.000000 115.000000 S 194.000000 115.000000 194.000000 105.000000 L 194.000000 102.083000 S 194.000000 92.083000 184.000000 92.083000 L 158.000000 92.083000" stroke="#6b7280" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-378692534-3488378134)" mask="url(#d2-378692534)"></path><text x="350.000000" y="113.000000" fill="#6b7280" class="text-italic fill-N2" style="text-anchor:middle;font-size:12px"><tspan x="350.000000" dy="0.000000">next</tspan><tspan x="350.000000" dy="14.000000">attempt</tspan></text></g><mask id="d2-378692534" maskUnits="userSpaceOnUse" x="-1" y="-1" width="645" height="142">
<rect x="-1" y="-1" width="645" height="142" fill="white"></rect>
<rect x="216.000000" y="30.000000" width="45" height="28" fill="black"></rect>
<rect x="327.000000" y="101.000000" width="46" height="28" fill="black"></rect>
</mask></svg></svg></div></pre>
<p><strong>Long loop</strong></p>
<pre class="d2-diagram-fence"><div class="d2-diagram"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="v0.7.0-HEAD" preserveAspectRatio="xMidYMid meet" viewBox="0 0 806 131" width="806" height="131"><svg class="d2-3375031578 d2-svg" width="806" height="131" viewBox="-1 -1 806 131"><rect x="-1.000000" y="-1.000000" width="806.000000" height="131.000000" rx="0.000000" fill="transparent" stroke-width="0"></rect><style type="text/css">
.d2-3375031578 .text-bold {
	font-family: "d2-3375031578-font-bold";
}
@font-face {
	font-family: d2-3375031578-font-bold;
	src: url("data:application/font-woff;base64,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");
}
.d2-3375031578 .text-italic {
	font-family: "d2-3375031578-font-italic";
}
@font-face {
	font-family: d2-3375031578-font-italic;
	src: url("data:application/font-woff;base64,d09GRgABAAAAAAyYAAoAAAAAE6QAARhRAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAGAAAABgW1SVeGNtYXAAAAFUAAAAiAAAAKwCwAPCZ2x5ZgAAAdwAAAZXAAAIfPPOp/toZWFkAAAINAAAADYAAAA2G7Ur2mhoZWEAAAhsAAAAJAAAACQLeAi+aG10eAAACJAAAABoAAAAaC5+A81sb2NhAAAI+AAAADYAAAA2HUIbVG1heHAAAAkwAAAAIAAAACAAMgD2bmFtZQAACVAAAAMmAAAIMgntVzNwb3N0AAAMeAAAACAAAAAg/8YAMgADAeEBkAAFAAACigJY//EASwKKAlgARAFeADIBIwAAAgsFAwMEAwkCBCAAAHcAAAADAAAAAAAAAABBREJPAAEAIP//Au7/BgAAA9gBESAAAZMAAAAAAeYClAAAACAAA3icbMw9asIAGIDhJ03apm3apr86ehNP4KYHEAkiDoIg4mH8d3fyLq6e5BPU0Xd94EUilaCQWaGulMo1NLV09FQGRiamZhHcpK2r0jc0vkqc4hiH2McutrGJdSxjEfPL+36JmgepzKMnz3IvXr0pvPvwqfTl249ff/45AwAA//8BAAD//1EsIHB4nFxVX2wjZ/W93zeTmWTjOLHHnsnM+k88nz3jOGM79sSeOFnbcZw4Tmw3m3STX367cXZTtVG3W1DUZRHVstqylapFQtF21Rd4QAgQAvZt+4SEWlGQCFQVIFWoCHgpNJV2qQqWhWhFxmjsZOP0ZXRlS/fce+4554MeCALgL+M3gII+GAQnuAF0LkBRumEQgdJVlbCsoXIcG7yD9u98hy5e/Cj8vc80P73wjZ9U/nHlAX7j8EX0Sv32bfPS3eee+7/Hj80I+uNjAAAEBAD/HN8D0eqpc4JucDpFuHTaICxFKJUwDEuRV+sZni79sv5qpdon2ejlX2hZnmbsvUv4nvndu3fRM4e76CXthbH75g/R5n3tqmbuAYI6AE7he8BavYkRYAn1oxtvDaB3B96+gWvF4uGbnRmWW028g+8BD9AjK6mJtDUD43bxerJTMsj37DWGXnqq0jczP3nRvVJd9dyxXd1xx0W0a34zKpdqm9fQffPa3ssAGNRWE/0HNcBlbSdYHXNYT/KCbugUMQjDqMm0YSgKke3Y7eLfnKlqS1u6mnXQXG4730uTDaeyHNTcSU+wmPInbJfWSi9v6uFA1pTKofhMLP4nRY4s1pP5rDU/Bn+rif6J98FtXUqQFZWwhNNZVk+n9STvdtmxmszh1IRCZIZlef6RmnVQrvxeTeVx8EK0DZ8KFlO+8VF5hcRcui0cyOL9t654xy6uW9AzkcW6nstGQh8rMiAItZroIWqA59R2rLUQc0ybwDAfLD+r1bZT2jk+yine8fV0ZmokzctSzbZTn7u+FpfFccE9t1ucLUmOpCvU2cXq/TZqgASh7u6828WwAYY/7k3p6XRqoo349/Wr0crmuFHw2XrMX/WNFCPejODzrny7hSnnKElt2V7Ynt9d1WLnkx7dnj8fEh26249C/cMDnoR/DTCgVhA1UAP8EOvwZ3RwDIYhp6/HMNSp0z1IrJOgZz6cW7KLyoV49vzY4mZCyTkoLr/DXc+QFXmMT3hIQffF/6J4U4JcnXle0dbXil/5/6R1T+ryDgqMRX6vyKOljfHp6Y4e/QDoA7x/5ImTO7JtY6QmrDNS/r3a+BA9uqrlUr256jmaLnvKsXm8/zhL4oVJf9D8LdJcwwOVSMz8catl9YTP8UOswDAAMCCWT7A+wftga2NRFh5HVJb179Wu4M823rnxVH1XwvumF6F3zY8+eekmINBaTfgc74PTYis10bGI23V0mi8VmJu1Wwg5KIZFZ3hb3iHia4evs32UE+Fpmn6Cix+hBkQ6O3ZWFI4WZU5t2r30dp6llaeVqURPfCOUTdN0rpal6QV3WZu3OCjx5bF5dLAYTBhhTS9MOnyubh5OqhOeUcNi5GSGL9JsIY6uxk6x3Eb4Iskd/Vre/zNqwCB4u/XbMWFbs0cmeX95S1vaSi5f1ipbkeiKnk5aH9vzl+avr8U635nZ3bnZheLu3GzpybxfRw0Y6ppXYJXjOftpbzUqus8OScGqP4sO6lq2b643P22+B6j131YT3UINULsVnppQVMUKvPSJgd0uXmjbjflBoi6OCzNKJDs6Gctoi1psyRPj9ICSSI/kJsZXbRNhxR+OEUn1S7nRsUIo6Au7pKjfpzjlc1p0LmTNfK7VRBv4xSdZkTY4ksc6q7OE6sqKn81M0Ciz0F8NFs7etN3KUB7ZLvU7huK2fHRQGkDOTM9rr+XMR06nz3emx2AHrd6TrSb6FB1YPhFOcvtIidxR1j54opKyd0Gbr1oBG75gmzUcfg6lzfc50Tof2jClJaJ3tFkCwL9GBxAAsBzB84KethqeVBShFKXzNl0l1SGEED14duiVigNjRNulodvlv162t3/1Dn4VHZgfynOyPCcjX1cloTOkHAyWiflvQK13WnH0N3QAEgDbvk87gLrRkR0zZ0bsotMZKojOp6tKTy9FO0LOb1XND8Xp8h9YNtOXTRL0sflpoEZIVUaOw3/Fa1pHl1utJvo+/imIVq4aOfroNVCPnwiKZdsUdvz3OhWZyiixsMfgR70r0dKqOp3V6BIvqh5+OPQbfWkqlQmNxjxCzKcuFhILU1PF2O88vKR5eVE71iq8hw6A6uSKf7v2DDowpfZ/C7gCD/FD6AfgukC/xvmI4PISXBF4MTDMiyP/AwAA//8BAAD//43UuigAAAEAAAABGFEILGgLXw889QABA+gAAAAA2F2gzAAAAADdZi83/r3+3QgdA8kAAgADAAIAAAAAAAAAAQAAA9j+7wAACED+vf28CB0D6ADC/9EAAAAAAAAAAAAAABoCdAAkAMgAAALBACMB/gBdAmgATwIZACcCGAAfAbMAJQHhACUCEwABAgsAHwDtAB8B3AAfAPgALAMfAB8CDQAfAgMAJwFWAB8Bkv/8AUUAPAIQADgCwwBGAcD/wgGZAF4A7QAfAAAARwAAAC4ALgBcAHAAmADQAQgBNgFwAbgB4gHuAggCKgJsApYCxALiAx4DTAN4A7ID4gQaBCgEPgAAAAEAAAAaAIwADABmAAcAAQAAAAAAAAAAAAAAAAAEAAN4nJyU204bVxSGPwfbbXq6qFBEbtC+TKVkTKMQJeHKlKCMinDqcXqQqkqDPT6I8czIM5iSJ+h136Jvkas+Rp+i6nW1fy+DHUVBIAT8e/Y6/Gutf21gk//YoFa/C/zdnBuusd382fAdvmgeGd5gv/mZ4ToPG/8YbjBovDXc5EGja/gT3tX/NPwpT+q/Gb7LVv3Q8Oc8rm8a/nLD8a/hr3jCuwWuwTP+MFxji8LwHTb51fAG97CYtTr32DHc4Gu2DTfZBnpMqEiZkDHCMWTCiDNmJJREJMyYMCRhgCOkTUqlrxmxkGP0wa8xERUzYkUcU+FIiUiJKRlbxLfyynmtjEOdZnbXpmJMzIk8TonJcOSMyMlIOFWcioqCF7RoUdIX34KKkoCSCSkBOTNGtOhwyBE9xkwocRwqkmcWkTOk4pxY+Z1Z+M70ScgojdUZGQPxdOKXyDvkCEeHQrarkY/WIjzE8aO8Pbdctt8S6NetMFvPu2QTM1c/U3Ul1c25JjjWrc/b5gfhihe4W/Vnncn1PRrof6XIJ5xp/gNNKhOTDOe2aBNJQZG7j2Nf55BIHfmJkB6v6PCGns5tunRpc0yPkJfy7dDF8R0djjmQRyi8uDuUYo75Bcf3hLLxsRPrz2JiCb9TmLpLcZypjimFeu6ZB6o1UYU3n7DfoXxNHaV8+tojb+k0v0x7FjMyVRRiOFUvl9oorX8DU8RUtfjZXt37bZjb7i23+IJcO+zVuuDkJ7dgdN1Ug/c0c66fgJgBOSey6JMzpUXFhXi/JuaMFMeBuvdKW1LRvvTxeS6kkoSpGIRkijOj0N/YdBMZ9/6a7p29JQP5e6anl1XdJotTr65m9EbdW95F1uVkZQItm2q+oqa+uGam/UQ7tco/km+p1y3nEaHiLnb7Q6/ADs/ZZY+xsvR1M7+886+Et9hTB05JZDWUpn0NjwnYJeApu+zynKfv9XLJxhkft8ZnNX+bA/bpsHdtNQvbDvu8XIv28cx/ie2O6nE8ujw9u/U0H9xAtd9o367eza4m56cxt2hX23FMzNRzcVurNbn7BP8DAAD//wEAAP//cqFRQAAAAAMAAP/1AAD/zgAyAAAAAAAAAAAAAAAAAAAAAAAAAAA=");
}</style><style type="text/css">.shape {
  shape-rendering: geometricPrecision;
  stroke-linejoin: round;
}
.connection {
  stroke-linecap: round;
  stroke-linejoin: round;
}
.blend {
  mix-blend-mode: multiply;
  opacity: 0.5;
}

		.d2-3375031578 .fill-N1{fill:#374151;}
		.d2-3375031578 .fill-N2{fill:#6b7280;}
		.d2-3375031578 .fill-N3{fill:#9ca3af;}
		.d2-3375031578 .fill-N4{fill:#d1d5db;}
		.d2-3375031578 .fill-N5{fill:#e5e7eb;}
		.d2-3375031578 .fill-N6{fill:#f3f4f6;}
		.d2-3375031578 .fill-N7{fill:#f9fafb;}
		.d2-3375031578 .fill-B1{fill:#6b7280;}
		.d2-3375031578 .fill-B2{fill:#6b7280;}
		.d2-3375031578 .fill-B3{fill:#d1d5db;}
		.d2-3375031578 .fill-B4{fill:#d1d5db;}
		.d2-3375031578 .fill-B5{fill:#f3f4f6;}
		.d2-3375031578 .fill-B6{fill:#ffffff;}
		.d2-3375031578 .fill-AA2{fill:#f3f4f6;}
		.d2-3375031578 .fill-AA4{fill:#d1d5db;}
		.d2-3375031578 .fill-AA5{fill:#374151;}
		.d2-3375031578 .fill-AB4{fill:#ffffff;}
		.d2-3375031578 .fill-AB5{fill:#6b7280;}
		.d2-3375031578 .stroke-N1{stroke:#374151;}
		.d2-3375031578 .stroke-N2{stroke:#6b7280;}
		.d2-3375031578 .stroke-N3{stroke:#9ca3af;}
		.d2-3375031578 .stroke-N4{stroke:#d1d5db;}
		.d2-3375031578 .stroke-N5{stroke:#e5e7eb;}
		.d2-3375031578 .stroke-N6{stroke:#f3f4f6;}
		.d2-3375031578 .stroke-N7{stroke:#f9fafb;}
		.d2-3375031578 .stroke-B1{stroke:#6b7280;}
		.d2-3375031578 .stroke-B2{stroke:#6b7280;}
		.d2-3375031578 .stroke-B3{stroke:#d1d5db;}
		.d2-3375031578 .stroke-B4{stroke:#d1d5db;}
		.d2-3375031578 .stroke-B5{stroke:#f3f4f6;}
		.d2-3375031578 .stroke-B6{stroke:#ffffff;}
		.d2-3375031578 .stroke-AA2{stroke:#f3f4f6;}
		.d2-3375031578 .stroke-AA4{stroke:#d1d5db;}
		.d2-3375031578 .stroke-AA5{stroke:#374151;}
		.d2-3375031578 .stroke-AB4{stroke:#ffffff;}
		.d2-3375031578 .stroke-AB5{stroke:#6b7280;}
		.d2-3375031578 .background-color-N1{background-color:#374151;}
		.d2-3375031578 .background-color-N2{background-color:#6b7280;}
		.d2-3375031578 .background-color-N3{background-color:#9ca3af;}
		.d2-3375031578 .background-color-N4{background-color:#d1d5db;}
		.d2-3375031578 .background-color-N5{background-color:#e5e7eb;}
		.d2-3375031578 .background-color-N6{background-color:#f3f4f6;}
		.d2-3375031578 .background-color-N7{background-color:#f9fafb;}
		.d2-3375031578 .background-color-B1{background-color:#6b7280;}
		.d2-3375031578 .background-color-B2{background-color:#6b7280;}
		.d2-3375031578 .background-color-B3{background-color:#d1d5db;}
		.d2-3375031578 .background-color-B4{background-color:#d1d5db;}
		.d2-3375031578 .background-color-B5{background-color:#f3f4f6;}
		.d2-3375031578 .background-color-B6{background-color:#ffffff;}
		.d2-3375031578 .background-color-AA2{background-color:#f3f4f6;}
		.d2-3375031578 .background-color-AA4{background-color:#d1d5db;}
		.d2-3375031578 .background-color-AA5{background-color:#374151;}
		.d2-3375031578 .background-color-AB4{background-color:#ffffff;}
		.d2-3375031578 .background-color-AB5{background-color:#6b7280;}
		.d2-3375031578 .color-N1{color:#374151;}
		.d2-3375031578 .color-N2{color:#6b7280;}
		.d2-3375031578 .color-N3{color:#9ca3af;}
		.d2-3375031578 .color-N4{color:#d1d5db;}
		.d2-3375031578 .color-N5{color:#e5e7eb;}
		.d2-3375031578 .color-N6{color:#f3f4f6;}
		.d2-3375031578 .color-N7{color:#f9fafb;}
		.d2-3375031578 .color-B1{color:#6b7280;}
		.d2-3375031578 .color-B2{color:#6b7280;}
		.d2-3375031578 .color-B3{color:#d1d5db;}
		.d2-3375031578 .color-B4{color:#d1d5db;}
		.d2-3375031578 .color-B5{color:#f3f4f6;}
		.d2-3375031578 .color-B6{color:#ffffff;}
		.d2-3375031578 .color-AA2{color:#f3f4f6;}
		.d2-3375031578 .color-AA4{color:#d1d5db;}
		.d2-3375031578 .color-AA5{color:#374151;}
		.d2-3375031578 .color-AB4{color:#ffffff;}
		.d2-3375031578 .color-AB5{color:#6b7280;}.appendix text.text{fill:#374151}.md{--color-fg-default:#374151;--color-fg-muted:#6b7280;--color-fg-subtle:#9ca3af;--color-canvas-default:#f9fafb;--color-canvas-subtle:#f3f4f6;--color-border-default:#6b7280;--color-border-muted:#6b7280;--color-neutral-muted:#f3f4f6;--color-accent-fg:#6b7280;--color-accent-emphasis:#6b7280;--color-attention-subtle:#6b7280;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-dark-d2-3375031578);mix-blend-mode:overlay}.sketch-overlay-B2{fill:url(#streaks-dark-d2-3375031578);mix-blend-mode:overlay}.sketch-overlay-B3{fill:url(#streaks-normal-d2-3375031578);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-normal-d2-3375031578);mix-blend-mode:color-burn}.sketch-overlay-B5{fill:url(#streaks-bright-d2-3375031578);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-3375031578);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-bright-d2-3375031578);mix-blend-mode:darken}.sketch-overlay-AA4{fill:url(#streaks-normal-d2-3375031578);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-darker-d2-3375031578);mix-blend-mode:lighten}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-3375031578);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-dark-d2-3375031578);mix-blend-mode:overlay}.sketch-overlay-N1{fill:url(#streaks-darker-d2-3375031578);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-3375031578);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-3375031578);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-3375031578);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-3375031578);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-3375031578);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-3375031578);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}</style><g class="YWN0aW9u"><g class="shape"><rect x="12.000000" y="47.000000" width="128.000000" height="63.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="76.000000" y="83.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px">Make the hire</text></g><g class="cmVzdWx0"><g class="shape"><rect x="329.000000" y="12.000000" width="131.000000" height="63.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B2 fill-B6" style="stroke-width:2;stroke-dasharray:6.000000,5.919384;"></rect></g><text x="394.500000" y="48.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px">Team results?</text></g><g class="dXBkYXRl"><g class="shape"><rect x="663.000000" y="40.000000" width="129.000000" height="77.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="727.500000" y="76.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px"><tspan x="727.500000" dy="0.000000">Unclear what</tspan><tspan x="727.500000" dy="16.000000">to change</tspan></text></g><g class="KGFjdGlvbiAtJmd0OyByZXN1bHQpWzBd"><marker id="mk-d2-3375031578-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#6b7280" class="connection fill-B1" stroke-width="2"></polygon> </marker><path d="M 142.000000 68.750000 L 170.000000 68.750000 S 180.000000 68.750000 180.000000 58.750000 L 180.000000 53.500000 S 180.000000 43.500000 190.000000 43.500000 L 325.000000 43.500000" stroke="#6b7280" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3375031578-3488378134)" mask="url(#d2-3375031578)"></path><text x="221.500000" y="42.000000" fill="#6b7280" class="text-italic fill-N2" style="text-anchor:middle;font-size:12px"><tspan x="221.500000" dy="0.000000">months</tspan><tspan x="221.500000" dy="14.000000">years</tspan></text></g><g class="KHJlc3VsdCAtJmd0OyB1cGRhdGUpWzBd"><marker id="mk-d2-3375031578-2177206569" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#6b7280" class="connection fill-B2" stroke-width="2"></polygon> </marker><path d="M 462.000000 43.500000 L 613.000000 43.500000 S 623.000000 43.500000 623.000000 53.500000 L 623.000000 56.416000 S 623.000000 66.416000 633.000000 66.416000 L 659.000000 66.416000" stroke="#6b7280" fill="none" class="connection stroke-B2" style="stroke-width:2;stroke-dasharray:10.000000,9.865639;" marker-end="url(#mk-d2-3375031578-2177206569)" mask="url(#d2-3375031578)"></path><text x="572.500000" y="42.000000" fill="#6b7280" class="text-italic fill-N2" style="text-anchor:middle;font-size:12px"><tspan x="572.500000" dy="0.000000">weak</tspan><tspan x="572.500000" dy="14.000000">attribution</tspan></text></g><g class="KHVwZGF0ZSAtJmd0OyBhY3Rpb24pWzBd"><path d="M 661.000000 92.083000 L 633.000000 92.083000 S 623.000000 92.083000 623.000000 102.083000 L 623.000000 105.000000 S 623.000000 115.000000 613.000000 115.000000 L 190.000000 115.000000 S 180.000000 115.000000 180.000000 105.000000 L 180.000000 99.750000 S 180.000000 89.750000 170.000000 89.750000 L 144.000000 89.750000" stroke="#6b7280" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3375031578-3488378134)" mask="url(#d2-3375031578)"></path></g><mask id="d2-3375031578" maskUnits="userSpaceOnUse" x="-1" y="-1" width="806" height="131">
<rect x="-1" y="-1" width="806" height="131" fill="white"></rect>
<rect x="200.000000" y="30.000000" width="43" height="28" fill="black"></rect>
<rect x="544.000000" y="30.000000" width="57" height="28" fill="black"></rect>
</mask></svg></svg></div></pre>
<p>Same cycle either way - act, observe, update. What changes is how long you wait, how clear the signal is, and whether you can actually connect the result back to what you did.</p>
<h2 id="easyenvironmentsandhardones">Easy environments and hard ones</h2>
<p>Some environments make this almost unfair. Clear rules, repeatable situations, quick accurate feedback - golf, chess, a lot of crafts. You get a huge number of attempts and you know pretty quickly how you did.</p>
<p>Other environments are the opposite. Business, investing, leadership, hiring. Feedback shows up late, noisy, or just wrong. You don't get clean reps. And most of the work that actually matters lives here, which means "just practice more" isn't really a strategy. You have to get better at learning from worse information.</p>
<h2 id="knowyourloop">Know your loop</h2>
<p>The useful habit is looking at a skill or decision and asking what the feedback loop actually looks like. A few concrete properties matter more than the rest:</p>
<p>Latency - how long until feedback arrives? Seconds, weeks, years?</p>
<p>Frequency - how many repetitions do you actually get? You can shoot hundreds of free throws in an afternoon. Finding the right investor happens a handful of times in a career, if that.</p>
<p>Fidelity - does the feedback measure what you care about, or are you tracking a proxy that only vaguely relates to the real goal?</p>
<p>Attribution - can you connect the result to a given decision? Revenue went up after a reorg. Was it the reorg, or the product launch that shipped the same quarter?</p>
<p>Cost - how expensive is each attempt? Cheap attempts invite experimentation. Expensive ones make people freeze, or overfit to one data point. Would SpaceX have made it with half the capital?</p>
<p>Reversibility - can you recover after being wrong? Shipping a feature behind a flag is reversible. Signing a five-year contract, or making a very public bet, often isn't.</p>
<p>These properties sit on different parts of the loop:</p>
<pre class="d2-diagram-fence"><div class="d2-diagram"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="v0.7.0-HEAD" preserveAspectRatio="xMidYMid meet" viewBox="0 0 752 143" width="752" height="143"><svg class="d2-3480683073 d2-svg" width="752" height="143" viewBox="-1 -1 752 143"><rect x="-1.000000" y="-1.000000" width="752.000000" height="143.000000" rx="0.000000" fill="transparent" stroke-width="0"></rect><style type="text/css">
.d2-3480683073 .text-bold {
	font-family: "d2-3480683073-font-bold";
}
@font-face {
	font-family: d2-3480683073-font-bold;
	src: url("data:application/font-woff;base64,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");
}
.d2-3480683073 .text-italic {
	font-family: "d2-3480683073-font-italic";
}
@font-face {
	font-family: d2-3480683073-font-italic;
	src: url("data:application/font-woff;base64,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");
}</style><style type="text/css">.shape {
  shape-rendering: geometricPrecision;
  stroke-linejoin: round;
}
.connection {
  stroke-linecap: round;
  stroke-linejoin: round;
}
.blend {
  mix-blend-mode: multiply;
  opacity: 0.5;
}

		.d2-3480683073 .fill-N1{fill:#374151;}
		.d2-3480683073 .fill-N2{fill:#6b7280;}
		.d2-3480683073 .fill-N3{fill:#9ca3af;}
		.d2-3480683073 .fill-N4{fill:#d1d5db;}
		.d2-3480683073 .fill-N5{fill:#e5e7eb;}
		.d2-3480683073 .fill-N6{fill:#f3f4f6;}
		.d2-3480683073 .fill-N7{fill:#f9fafb;}
		.d2-3480683073 .fill-B1{fill:#6b7280;}
		.d2-3480683073 .fill-B2{fill:#6b7280;}
		.d2-3480683073 .fill-B3{fill:#d1d5db;}
		.d2-3480683073 .fill-B4{fill:#d1d5db;}
		.d2-3480683073 .fill-B5{fill:#f3f4f6;}
		.d2-3480683073 .fill-B6{fill:#ffffff;}
		.d2-3480683073 .fill-AA2{fill:#f3f4f6;}
		.d2-3480683073 .fill-AA4{fill:#d1d5db;}
		.d2-3480683073 .fill-AA5{fill:#374151;}
		.d2-3480683073 .fill-AB4{fill:#ffffff;}
		.d2-3480683073 .fill-AB5{fill:#6b7280;}
		.d2-3480683073 .stroke-N1{stroke:#374151;}
		.d2-3480683073 .stroke-N2{stroke:#6b7280;}
		.d2-3480683073 .stroke-N3{stroke:#9ca3af;}
		.d2-3480683073 .stroke-N4{stroke:#d1d5db;}
		.d2-3480683073 .stroke-N5{stroke:#e5e7eb;}
		.d2-3480683073 .stroke-N6{stroke:#f3f4f6;}
		.d2-3480683073 .stroke-N7{stroke:#f9fafb;}
		.d2-3480683073 .stroke-B1{stroke:#6b7280;}
		.d2-3480683073 .stroke-B2{stroke:#6b7280;}
		.d2-3480683073 .stroke-B3{stroke:#d1d5db;}
		.d2-3480683073 .stroke-B4{stroke:#d1d5db;}
		.d2-3480683073 .stroke-B5{stroke:#f3f4f6;}
		.d2-3480683073 .stroke-B6{stroke:#ffffff;}
		.d2-3480683073 .stroke-AA2{stroke:#f3f4f6;}
		.d2-3480683073 .stroke-AA4{stroke:#d1d5db;}
		.d2-3480683073 .stroke-AA5{stroke:#374151;}
		.d2-3480683073 .stroke-AB4{stroke:#ffffff;}
		.d2-3480683073 .stroke-AB5{stroke:#6b7280;}
		.d2-3480683073 .background-color-N1{background-color:#374151;}
		.d2-3480683073 .background-color-N2{background-color:#6b7280;}
		.d2-3480683073 .background-color-N3{background-color:#9ca3af;}
		.d2-3480683073 .background-color-N4{background-color:#d1d5db;}
		.d2-3480683073 .background-color-N5{background-color:#e5e7eb;}
		.d2-3480683073 .background-color-N6{background-color:#f3f4f6;}
		.d2-3480683073 .background-color-N7{background-color:#f9fafb;}
		.d2-3480683073 .background-color-B1{background-color:#6b7280;}
		.d2-3480683073 .background-color-B2{background-color:#6b7280;}
		.d2-3480683073 .background-color-B3{background-color:#d1d5db;}
		.d2-3480683073 .background-color-B4{background-color:#d1d5db;}
		.d2-3480683073 .background-color-B5{background-color:#f3f4f6;}
		.d2-3480683073 .background-color-B6{background-color:#ffffff;}
		.d2-3480683073 .background-color-AA2{background-color:#f3f4f6;}
		.d2-3480683073 .background-color-AA4{background-color:#d1d5db;}
		.d2-3480683073 .background-color-AA5{background-color:#374151;}
		.d2-3480683073 .background-color-AB4{background-color:#ffffff;}
		.d2-3480683073 .background-color-AB5{background-color:#6b7280;}
		.d2-3480683073 .color-N1{color:#374151;}
		.d2-3480683073 .color-N2{color:#6b7280;}
		.d2-3480683073 .color-N3{color:#9ca3af;}
		.d2-3480683073 .color-N4{color:#d1d5db;}
		.d2-3480683073 .color-N5{color:#e5e7eb;}
		.d2-3480683073 .color-N6{color:#f3f4f6;}
		.d2-3480683073 .color-N7{color:#f9fafb;}
		.d2-3480683073 .color-B1{color:#6b7280;}
		.d2-3480683073 .color-B2{color:#6b7280;}
		.d2-3480683073 .color-B3{color:#d1d5db;}
		.d2-3480683073 .color-B4{color:#d1d5db;}
		.d2-3480683073 .color-B5{color:#f3f4f6;}
		.d2-3480683073 .color-B6{color:#ffffff;}
		.d2-3480683073 .color-AA2{color:#f3f4f6;}
		.d2-3480683073 .color-AA4{color:#d1d5db;}
		.d2-3480683073 .color-AA5{color:#374151;}
		.d2-3480683073 .color-AB4{color:#ffffff;}
		.d2-3480683073 .color-AB5{color:#6b7280;}.appendix text.text{fill:#374151}.md{--color-fg-default:#374151;--color-fg-muted:#6b7280;--color-fg-subtle:#9ca3af;--color-canvas-default:#f9fafb;--color-canvas-subtle:#f3f4f6;--color-border-default:#6b7280;--color-border-muted:#6b7280;--color-neutral-muted:#f3f4f6;--color-accent-fg:#6b7280;--color-accent-emphasis:#6b7280;--color-attention-subtle:#6b7280;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-dark-d2-3480683073);mix-blend-mode:overlay}.sketch-overlay-B2{fill:url(#streaks-dark-d2-3480683073);mix-blend-mode:overlay}.sketch-overlay-B3{fill:url(#streaks-normal-d2-3480683073);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-normal-d2-3480683073);mix-blend-mode:color-burn}.sketch-overlay-B5{fill:url(#streaks-bright-d2-3480683073);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-3480683073);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-bright-d2-3480683073);mix-blend-mode:darken}.sketch-overlay-AA4{fill:url(#streaks-normal-d2-3480683073);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-darker-d2-3480683073);mix-blend-mode:lighten}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-3480683073);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-dark-d2-3480683073);mix-blend-mode:overlay}.sketch-overlay-N1{fill:url(#streaks-darker-d2-3480683073);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-3480683073);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-3480683073);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-3480683073);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-3480683073);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-3480683073);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-3480683073);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}</style><g class="YWN0aW9u"><g class="shape"><rect x="12.000000" y="51.000000" width="154.000000" height="77.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="89.000000" y="87.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px"><tspan x="89.000000" dy="0.000000">Action</tspan><tspan x="89.000000" dy="16.000000">(cost · frequency)</tspan></text></g><g class="ZmVlZGJhY2s="><g class="shape"><rect x="353.000000" y="12.000000" width="176.000000" height="77.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="441.000000" y="48.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px"><tspan x="441.000000" dy="0.000000">Feedback</tspan><tspan x="441.000000" dy="16.000000">(fidelity · attribution)</tspan></text></g><g class="dXBkYXRl"><g class="shape"><rect x="609.000000" y="51.000000" width="129.000000" height="77.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="673.500000" y="87.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px"><tspan x="673.500000" dy="0.000000">Update</tspan><tspan x="673.500000" dy="16.000000">(reversibility)</tspan></text></g><g class="KGFjdGlvbiAtJmd0OyBmZWVkYmFjaylbMF0="><marker id="mk-d2-3480683073-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#6b7280" class="connection fill-B1" stroke-width="2"></polygon> </marker><path d="M 168.000000 76.916000 L 349.000000 76.916000" stroke="#6b7280" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3480683073-3488378134)" mask="url(#d2-3480683073)"></path><text x="259.500000" y="81.000000" fill="#6b7280" class="text-italic fill-N2" style="text-anchor:middle;font-size:12px">latency</text></g><g class="KGZlZWRiYWNrIC0mZ3Q7IHVwZGF0ZSlbMF0="><path d="M 531.000000 76.916000 L 605.000000 76.916000" stroke="#6b7280" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3480683073-3488378134)" mask="url(#d2-3480683073)"></path></g><g class="KHVwZGF0ZSAtJmd0OyBhY3Rpb24pWzBd"><path d="M 607.000000 102.583000 L 579.000000 102.583000 S 569.000000 102.583000 569.000000 112.583000 L 569.000000 119.000000 S 569.000000 129.000000 559.000000 129.000000 L 216.000000 129.000000 S 206.000000 129.000000 206.000000 119.000000 L 206.000000 112.583000 S 206.000000 102.583000 196.000000 102.583000 L 170.000000 102.583000" stroke="#6b7280" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-3480683073-3488378134)" mask="url(#d2-3480683073)"></path></g><mask id="d2-3480683073" maskUnits="userSpaceOnUse" x="-1" y="-1" width="752" height="143">
<rect x="-1" y="-1" width="752" height="143" fill="white"></rect>
<rect x="239.000000" y="69.000000" width="41" height="16" fill="black"></rect>
</mask></svg></svg></div></pre>
<p>Latency is the wait between action and feedback. Fidelity and attribution are about the signal - is it clean, and does it clearly point back to what you did? Reversibility is whether the update can actually change the next action, or whether you're locked in. Cost and frequency are more about the cycle as a whole: how often you get to go around, and what each lap costs.</p>
<p>Look at things this way for a while and you'll start noticing where a loop is weak. That's usually where you're stuck.</p>
<h2 id="manufactureshorterloops">Manufacture shorter loops</h2>
<p>People who get good at long-feedback work usually aren't just more patient. They're building shorter loops inside the long one.</p>
<p>They don't wait five years to learn whether a strategy worked. They create intermediate signals along the way. In practice that tends to look like:</p>
<p>Make smaller bets. A pilot, a prototype, a limited rollout. Same direction as the big decision, but cheaper and faster to learn from.</p>
<p>Track leading indicators, not just the final outcome. Usage, retention, hiring pipeline quality - whatever tends to move before the thing you actually care about.</p>
<p>Write predictions down beforehand. "I think this will do X by Y date, because Z." When the result finally shows up, you have something to compare against. Without that, it's too easy to rewrite history into a story where you basically knew all along.</p>
<p>Review the decision separately from the outcome. A good process can produce a bad result. A bad process can get lucky. Grade yourself only on outcomes and you may just be amplifying noise.</p>
<p>Update before you're certain. Waiting for the final result often means waiting too long. Adjust as intermediate signals come in.</p>
<p><strong>Long loop</strong></p>
<pre class="d2-diagram-fence"><div class="d2-diagram"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="v0.7.0-HEAD" preserveAspectRatio="xMidYMid meet" viewBox="0 0 426 89" width="426" height="89"><svg class="d2-4278281576 d2-svg" width="426" height="89" viewBox="-1 -1 426 89"><rect x="-1.000000" y="-1.000000" width="426.000000" height="89.000000" rx="0.000000" fill="transparent" stroke-width="0"></rect><style type="text/css">
.d2-4278281576 .text-bold {
	font-family: "d2-4278281576-font-bold";
}
@font-face {
	font-family: d2-4278281576-font-bold;
	src: url("data:application/font-woff;base64,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");
}
.d2-4278281576 .text-italic {
	font-family: "d2-4278281576-font-italic";
}
@font-face {
	font-family: d2-4278281576-font-italic;
	src: url("data:application/font-woff;base64,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");
}</style><style type="text/css">.shape {
  shape-rendering: geometricPrecision;
  stroke-linejoin: round;
}
.connection {
  stroke-linecap: round;
  stroke-linejoin: round;
}
.blend {
  mix-blend-mode: multiply;
  opacity: 0.5;
}

		.d2-4278281576 .fill-N1{fill:#374151;}
		.d2-4278281576 .fill-N2{fill:#6b7280;}
		.d2-4278281576 .fill-N3{fill:#9ca3af;}
		.d2-4278281576 .fill-N4{fill:#d1d5db;}
		.d2-4278281576 .fill-N5{fill:#e5e7eb;}
		.d2-4278281576 .fill-N6{fill:#f3f4f6;}
		.d2-4278281576 .fill-N7{fill:#f9fafb;}
		.d2-4278281576 .fill-B1{fill:#6b7280;}
		.d2-4278281576 .fill-B2{fill:#6b7280;}
		.d2-4278281576 .fill-B3{fill:#d1d5db;}
		.d2-4278281576 .fill-B4{fill:#d1d5db;}
		.d2-4278281576 .fill-B5{fill:#f3f4f6;}
		.d2-4278281576 .fill-B6{fill:#ffffff;}
		.d2-4278281576 .fill-AA2{fill:#f3f4f6;}
		.d2-4278281576 .fill-AA4{fill:#d1d5db;}
		.d2-4278281576 .fill-AA5{fill:#374151;}
		.d2-4278281576 .fill-AB4{fill:#ffffff;}
		.d2-4278281576 .fill-AB5{fill:#6b7280;}
		.d2-4278281576 .stroke-N1{stroke:#374151;}
		.d2-4278281576 .stroke-N2{stroke:#6b7280;}
		.d2-4278281576 .stroke-N3{stroke:#9ca3af;}
		.d2-4278281576 .stroke-N4{stroke:#d1d5db;}
		.d2-4278281576 .stroke-N5{stroke:#e5e7eb;}
		.d2-4278281576 .stroke-N6{stroke:#f3f4f6;}
		.d2-4278281576 .stroke-N7{stroke:#f9fafb;}
		.d2-4278281576 .stroke-B1{stroke:#6b7280;}
		.d2-4278281576 .stroke-B2{stroke:#6b7280;}
		.d2-4278281576 .stroke-B3{stroke:#d1d5db;}
		.d2-4278281576 .stroke-B4{stroke:#d1d5db;}
		.d2-4278281576 .stroke-B5{stroke:#f3f4f6;}
		.d2-4278281576 .stroke-B6{stroke:#ffffff;}
		.d2-4278281576 .stroke-AA2{stroke:#f3f4f6;}
		.d2-4278281576 .stroke-AA4{stroke:#d1d5db;}
		.d2-4278281576 .stroke-AA5{stroke:#374151;}
		.d2-4278281576 .stroke-AB4{stroke:#ffffff;}
		.d2-4278281576 .stroke-AB5{stroke:#6b7280;}
		.d2-4278281576 .background-color-N1{background-color:#374151;}
		.d2-4278281576 .background-color-N2{background-color:#6b7280;}
		.d2-4278281576 .background-color-N3{background-color:#9ca3af;}
		.d2-4278281576 .background-color-N4{background-color:#d1d5db;}
		.d2-4278281576 .background-color-N5{background-color:#e5e7eb;}
		.d2-4278281576 .background-color-N6{background-color:#f3f4f6;}
		.d2-4278281576 .background-color-N7{background-color:#f9fafb;}
		.d2-4278281576 .background-color-B1{background-color:#6b7280;}
		.d2-4278281576 .background-color-B2{background-color:#6b7280;}
		.d2-4278281576 .background-color-B3{background-color:#d1d5db;}
		.d2-4278281576 .background-color-B4{background-color:#d1d5db;}
		.d2-4278281576 .background-color-B5{background-color:#f3f4f6;}
		.d2-4278281576 .background-color-B6{background-color:#ffffff;}
		.d2-4278281576 .background-color-AA2{background-color:#f3f4f6;}
		.d2-4278281576 .background-color-AA4{background-color:#d1d5db;}
		.d2-4278281576 .background-color-AA5{background-color:#374151;}
		.d2-4278281576 .background-color-AB4{background-color:#ffffff;}
		.d2-4278281576 .background-color-AB5{background-color:#6b7280;}
		.d2-4278281576 .color-N1{color:#374151;}
		.d2-4278281576 .color-N2{color:#6b7280;}
		.d2-4278281576 .color-N3{color:#9ca3af;}
		.d2-4278281576 .color-N4{color:#d1d5db;}
		.d2-4278281576 .color-N5{color:#e5e7eb;}
		.d2-4278281576 .color-N6{color:#f3f4f6;}
		.d2-4278281576 .color-N7{color:#f9fafb;}
		.d2-4278281576 .color-B1{color:#6b7280;}
		.d2-4278281576 .color-B2{color:#6b7280;}
		.d2-4278281576 .color-B3{color:#d1d5db;}
		.d2-4278281576 .color-B4{color:#d1d5db;}
		.d2-4278281576 .color-B5{color:#f3f4f6;}
		.d2-4278281576 .color-B6{color:#ffffff;}
		.d2-4278281576 .color-AA2{color:#f3f4f6;}
		.d2-4278281576 .color-AA4{color:#d1d5db;}
		.d2-4278281576 .color-AA5{color:#374151;}
		.d2-4278281576 .color-AB4{color:#ffffff;}
		.d2-4278281576 .color-AB5{color:#6b7280;}.appendix text.text{fill:#374151}.md{--color-fg-default:#374151;--color-fg-muted:#6b7280;--color-fg-subtle:#9ca3af;--color-canvas-default:#f9fafb;--color-canvas-subtle:#f3f4f6;--color-border-default:#6b7280;--color-border-muted:#6b7280;--color-neutral-muted:#f3f4f6;--color-accent-fg:#6b7280;--color-accent-emphasis:#6b7280;--color-attention-subtle:#6b7280;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-dark-d2-4278281576);mix-blend-mode:overlay}.sketch-overlay-B2{fill:url(#streaks-dark-d2-4278281576);mix-blend-mode:overlay}.sketch-overlay-B3{fill:url(#streaks-normal-d2-4278281576);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-normal-d2-4278281576);mix-blend-mode:color-burn}.sketch-overlay-B5{fill:url(#streaks-bright-d2-4278281576);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-4278281576);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-bright-d2-4278281576);mix-blend-mode:darken}.sketch-overlay-AA4{fill:url(#streaks-normal-d2-4278281576);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-darker-d2-4278281576);mix-blend-mode:lighten}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-4278281576);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-dark-d2-4278281576);mix-blend-mode:overlay}.sketch-overlay-N1{fill:url(#streaks-darker-d2-4278281576);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-4278281576);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-4278281576);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-4278281576);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-4278281576);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-4278281576);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-4278281576);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}</style><g class="c3RyYXRlZ3k="><g class="shape"><rect x="12.000000" y="12.000000" width="100.000000" height="63.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="62.000000" y="48.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px">Strategy</text></g><g class="b3V0Y29tZQ=="><g class="shape"><rect x="280.000000" y="12.000000" width="132.000000" height="63.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="346.000000" y="48.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px">Final outcome</text></g><g class="KHN0cmF0ZWd5IC0mZ3Q7IG91dGNvbWUpWzBd"><marker id="mk-d2-4278281576-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#6b7280" class="connection fill-B1" stroke-width="2"></polygon> </marker><path d="M 114.000000 43.500000 L 276.000000 43.500000" stroke="#6b7280" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-4278281576-3488378134)" mask="url(#d2-4278281576)"></path><text x="196.000000" y="48.000000" fill="#6b7280" class="text-italic fill-N2" style="text-anchor:middle;font-size:12px">years</text></g><mask id="d2-4278281576" maskUnits="userSpaceOnUse" x="-1" y="-1" width="426" height="89">
<rect x="-1" y="-1" width="426" height="89" fill="white"></rect>
<rect x="180.000000" y="36.000000" width="32" height="16" fill="black"></rect>
</mask></svg></svg></div></pre>
<p>Versus the same strategy with a manufactured loop you can run many times before the final outcome arrives:</p>
<p><strong>Manufactured loop</strong></p>
<pre class="d2-diagram-fence"><div class="d2-diagram"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="v0.7.0-HEAD" preserveAspectRatio="xMidYMid meet" viewBox="0 0 597 143" width="597" height="143"><svg class="d2-2627236806 d2-svg" width="597" height="143" viewBox="-1 -1 597 143"><rect x="-1.000000" y="-1.000000" width="597.000000" height="143.000000" rx="0.000000" fill="transparent" stroke-width="0"></rect><style type="text/css">
.d2-2627236806 .text-bold {
	font-family: "d2-2627236806-font-bold";
}
@font-face {
	font-family: d2-2627236806-font-bold;
	src: url("data:application/font-woff;base64,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");
}
.d2-2627236806 .text-italic {
	font-family: "d2-2627236806-font-italic";
}
@font-face {
	font-family: d2-2627236806-font-italic;
	src: url("data:application/font-woff;base64,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");
}</style><style type="text/css">.shape {
  shape-rendering: geometricPrecision;
  stroke-linejoin: round;
}
.connection {
  stroke-linecap: round;
  stroke-linejoin: round;
}
.blend {
  mix-blend-mode: multiply;
  opacity: 0.5;
}

		.d2-2627236806 .fill-N1{fill:#374151;}
		.d2-2627236806 .fill-N2{fill:#6b7280;}
		.d2-2627236806 .fill-N3{fill:#9ca3af;}
		.d2-2627236806 .fill-N4{fill:#d1d5db;}
		.d2-2627236806 .fill-N5{fill:#e5e7eb;}
		.d2-2627236806 .fill-N6{fill:#f3f4f6;}
		.d2-2627236806 .fill-N7{fill:#f9fafb;}
		.d2-2627236806 .fill-B1{fill:#6b7280;}
		.d2-2627236806 .fill-B2{fill:#6b7280;}
		.d2-2627236806 .fill-B3{fill:#d1d5db;}
		.d2-2627236806 .fill-B4{fill:#d1d5db;}
		.d2-2627236806 .fill-B5{fill:#f3f4f6;}
		.d2-2627236806 .fill-B6{fill:#ffffff;}
		.d2-2627236806 .fill-AA2{fill:#f3f4f6;}
		.d2-2627236806 .fill-AA4{fill:#d1d5db;}
		.d2-2627236806 .fill-AA5{fill:#374151;}
		.d2-2627236806 .fill-AB4{fill:#ffffff;}
		.d2-2627236806 .fill-AB5{fill:#6b7280;}
		.d2-2627236806 .stroke-N1{stroke:#374151;}
		.d2-2627236806 .stroke-N2{stroke:#6b7280;}
		.d2-2627236806 .stroke-N3{stroke:#9ca3af;}
		.d2-2627236806 .stroke-N4{stroke:#d1d5db;}
		.d2-2627236806 .stroke-N5{stroke:#e5e7eb;}
		.d2-2627236806 .stroke-N6{stroke:#f3f4f6;}
		.d2-2627236806 .stroke-N7{stroke:#f9fafb;}
		.d2-2627236806 .stroke-B1{stroke:#6b7280;}
		.d2-2627236806 .stroke-B2{stroke:#6b7280;}
		.d2-2627236806 .stroke-B3{stroke:#d1d5db;}
		.d2-2627236806 .stroke-B4{stroke:#d1d5db;}
		.d2-2627236806 .stroke-B5{stroke:#f3f4f6;}
		.d2-2627236806 .stroke-B6{stroke:#ffffff;}
		.d2-2627236806 .stroke-AA2{stroke:#f3f4f6;}
		.d2-2627236806 .stroke-AA4{stroke:#d1d5db;}
		.d2-2627236806 .stroke-AA5{stroke:#374151;}
		.d2-2627236806 .stroke-AB4{stroke:#ffffff;}
		.d2-2627236806 .stroke-AB5{stroke:#6b7280;}
		.d2-2627236806 .background-color-N1{background-color:#374151;}
		.d2-2627236806 .background-color-N2{background-color:#6b7280;}
		.d2-2627236806 .background-color-N3{background-color:#9ca3af;}
		.d2-2627236806 .background-color-N4{background-color:#d1d5db;}
		.d2-2627236806 .background-color-N5{background-color:#e5e7eb;}
		.d2-2627236806 .background-color-N6{background-color:#f3f4f6;}
		.d2-2627236806 .background-color-N7{background-color:#f9fafb;}
		.d2-2627236806 .background-color-B1{background-color:#6b7280;}
		.d2-2627236806 .background-color-B2{background-color:#6b7280;}
		.d2-2627236806 .background-color-B3{background-color:#d1d5db;}
		.d2-2627236806 .background-color-B4{background-color:#d1d5db;}
		.d2-2627236806 .background-color-B5{background-color:#f3f4f6;}
		.d2-2627236806 .background-color-B6{background-color:#ffffff;}
		.d2-2627236806 .background-color-AA2{background-color:#f3f4f6;}
		.d2-2627236806 .background-color-AA4{background-color:#d1d5db;}
		.d2-2627236806 .background-color-AA5{background-color:#374151;}
		.d2-2627236806 .background-color-AB4{background-color:#ffffff;}
		.d2-2627236806 .background-color-AB5{background-color:#6b7280;}
		.d2-2627236806 .color-N1{color:#374151;}
		.d2-2627236806 .color-N2{color:#6b7280;}
		.d2-2627236806 .color-N3{color:#9ca3af;}
		.d2-2627236806 .color-N4{color:#d1d5db;}
		.d2-2627236806 .color-N5{color:#e5e7eb;}
		.d2-2627236806 .color-N6{color:#f3f4f6;}
		.d2-2627236806 .color-N7{color:#f9fafb;}
		.d2-2627236806 .color-B1{color:#6b7280;}
		.d2-2627236806 .color-B2{color:#6b7280;}
		.d2-2627236806 .color-B3{color:#d1d5db;}
		.d2-2627236806 .color-B4{color:#d1d5db;}
		.d2-2627236806 .color-B5{color:#f3f4f6;}
		.d2-2627236806 .color-B6{color:#ffffff;}
		.d2-2627236806 .color-AA2{color:#f3f4f6;}
		.d2-2627236806 .color-AA4{color:#d1d5db;}
		.d2-2627236806 .color-AA5{color:#374151;}
		.d2-2627236806 .color-AB4{color:#ffffff;}
		.d2-2627236806 .color-AB5{color:#6b7280;}.appendix text.text{fill:#374151}.md{--color-fg-default:#374151;--color-fg-muted:#6b7280;--color-fg-subtle:#9ca3af;--color-canvas-default:#f9fafb;--color-canvas-subtle:#f3f4f6;--color-border-default:#6b7280;--color-border-muted:#6b7280;--color-neutral-muted:#f3f4f6;--color-accent-fg:#6b7280;--color-accent-emphasis:#6b7280;--color-attention-subtle:#6b7280;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-dark-d2-2627236806);mix-blend-mode:overlay}.sketch-overlay-B2{fill:url(#streaks-dark-d2-2627236806);mix-blend-mode:overlay}.sketch-overlay-B3{fill:url(#streaks-normal-d2-2627236806);mix-blend-mode:color-burn}.sketch-overlay-B4{fill:url(#streaks-normal-d2-2627236806);mix-blend-mode:color-burn}.sketch-overlay-B5{fill:url(#streaks-bright-d2-2627236806);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-2627236806);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-bright-d2-2627236806);mix-blend-mode:darken}.sketch-overlay-AA4{fill:url(#streaks-normal-d2-2627236806);mix-blend-mode:color-burn}.sketch-overlay-AA5{fill:url(#streaks-darker-d2-2627236806);mix-blend-mode:lighten}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-2627236806);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-dark-d2-2627236806);mix-blend-mode:overlay}.sketch-overlay-N1{fill:url(#streaks-darker-d2-2627236806);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-2627236806);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-2627236806);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-2627236806);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-2627236806);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-2627236806);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-2627236806);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}</style><g class="YmV0"><g class="shape"><rect x="12.000000" y="58.000000" width="118.000000" height="63.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="71.000000" y="94.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px">Smaller bet</text></g><g class="c2lnbmFs"><g class="shape"><rect x="311.000000" y="12.000000" width="102.000000" height="77.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="362.000000" y="48.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px"><tspan x="362.000000" dy="0.000000">Leading</tspan><tspan x="362.000000" dy="16.000000">indicator</tspan></text></g><g class="dXBkYXRl"><g class="shape"><rect x="493.000000" y="58.000000" width="90.000000" height="63.000000" stroke="#6b7280" fill="#ffffff" class=" stroke-B1 fill-B6" style="stroke-width:2;"></rect></g><text x="538.000000" y="94.500000" fill="#374151" class="text-bold fill-N1" style="text-anchor:middle;font-size:14px">Update</text></g><g class="KGJldCAtJmd0OyBzaWduYWwpWzBd"><marker id="mk-d2-2627236806-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#6b7280" class="connection fill-B1" stroke-width="2"></polygon> </marker><path d="M 132.000000 79.250000 L 160.000000 79.250000 S 170.000000 79.250000 170.000000 69.250000 L 170.000000 60.500000 S 170.000000 50.500000 180.000000 50.500000 L 307.000000 50.500000" stroke="#6b7280" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2627236806-3488378134)" mask="url(#d2-2627236806)"></path><text x="206.500000" y="55.000000" fill="#6b7280" class="text-italic fill-N2" style="text-anchor:middle;font-size:12px">weeks</text></g><g class="KHNpZ25hbCAtJmd0OyB1cGRhdGUpWzBd"><path d="M 415.000000 50.500000 L 443.000000 50.500000 S 453.000000 50.500000 453.000000 60.500000 L 453.000000 69.250000 S 453.000000 79.250000 463.000000 79.250000 L 489.000000 79.250000" stroke="#6b7280" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2627236806-3488378134)" mask="url(#d2-2627236806)"></path></g><g class="KHVwZGF0ZSAtJmd0OyBiZXQpWzBd"><path d="M 491.000000 100.250000 L 463.000000 100.250000 S 453.000000 100.250000 453.000000 110.250000 L 453.000000 119.000000 S 453.000000 129.000000 443.000000 129.000000 L 180.000000 129.000000 S 170.000000 129.000000 170.000000 119.000000 L 170.000000 110.250000 S 170.000000 100.250000 160.000000 100.250000 L 134.000000 100.250000" stroke="#6b7280" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2627236806-3488378134)" mask="url(#d2-2627236806)"></path></g><mask id="d2-2627236806" maskUnits="userSpaceOnUse" x="-1" y="-1" width="597" height="143">
<rect x="-1" y="-1" width="597" height="143" fill="white"></rect>
<rect x="189.000000" y="43.000000" width="35" height="16" fill="black"></rect>
</mask></svg></svg></div></pre>
<p>When feedback is slow, patience alone doesn't cut it. You have to find ways to learn before the final result arrives.</p>
<h2 id="fastfeedbackcanstillteachthewronglesson">Fast feedback can still teach the wrong lesson</h2>
<p>Short loops aren't automatically good. A tighter loop makes you improve quickly at whatever it rewards (anyone who's trained an LLM has seen this). That doesn't mean it rewards the right thing.</p>
<p>Social media, gambling, click-through rates, short-term revenue - all of these give you immediate feedback that can feel positive at first. They're also excellent at training you to optimize the proxy until the proxy <em>is</em> the goal. More likes, more clicks, more bookings this quarter... and somehow less of what you actually wanted.</p>
<p>There's a related problem with local maxima. When the loop is fast and the current approach seems to be working, you keep doing the same thing. You stop trying anything structurally different, because the short loop keeps telling you you're on the right track. Until you plateau.</p>
<p>Speed isn't the only lever. If the signal is fast but wrong, you'll get worse at the thing that counts while getting better at the thing that doesn't.</p>
<h2 id="learningwhentheworldisslow">Learning when the world is slow</h2>
<p>Anyone can improve when the result is immediate. Free throws, code, games with clear scores - the loop does a lot of the work for you.</p>
<p>The harder part is improving when consequences show up months or years later. Which, inconveniently, is most of the decisions that matter - who you hire, what you build, which strategy you commit to, or how you raise your kids.</p>
<p>Know the loop you're in, and which parts of it are working against you. When the real feedback is far away, manufacture something shorter in the meantime. And don't confuse a fast proxy with the thing you actually care about.</p>
<p>Good judgment is keeping learning even when the world is slow to tell you whether you were right.</p>
]]></content:encoded></item><item><title><![CDATA[What is AI good at?]]></title><description><![CDATA[<p>AI is great at coding and mediocre at writing for the same reason: most useful code is really about pattern reuse and most <em>good</em> writing is not.</p>
<p>At first, this might seem backwards. Both code and essays are just text, but code has to follow exact rules while an essay</p>]]></description><link>https://unstack.io/what-is-ai-good-at</link><guid isPermaLink="false">8</guid><dc:creator><![CDATA[Scott Robinson]]></dc:creator><pubDate>Sat, 18 Jul 2026 05:02:29 GMT</pubDate><content:encoded><![CDATA[<p>AI is great at coding and mediocre at writing for the same reason: most useful code is really about pattern reuse and most <em>good</em> writing is not.</p>
<p>At first, this might seem backwards. Both code and essays are just text, but code has to follow exact rules while an essay can be written countless ways. You might expect a language model to be better at the less constrained task. In practice, those constraints are actually part of what makes coding easier for AI.</p>
<p>I've been thinking about this quite a bit since this tweet, so I figured I'd put some thoughts on paper (keyboard?).</p>
<a class="tweet" href="https://x.com/ScottWRobinson/status/2076758105057014270" target="_blank">
    <img src="https://s3.unstack.io/content/files/6fb9c09576ce62b194d9c4a97e2995dc.png">
</a>
<p>Coding and writing require very different things.</p>
<h3 id="whyaiissogoodatcoding">Why AI is so good at coding</h3>
<p>The biggest difference is that most programming does not require a new idea. Building an auth flow, a settings page, or an API endpoint is usually applying patterns that thousands of developers have applied before. Sure, the details change, but much of the implementation is familiar. That is exactly the kind of work AI is good at: recognizing a pattern, adapting it to the situation, and producing a working solution.</p>
<p>Code also has a much tighter feedback loop, giving AI/agents an immediate way to validate their work. It either compiles or it doesn't. Tests pass or fail. Types line up or they don't. An AI can write some code, check the result, and correct itself. The space of possible solutions is large, but at least boundaries are visible.</p>
<h3 id="itsnotreallycodingversuswriting">It's not really "coding versus writing"</h3>
<p>Good writing is different. A good essay has to do more than assemble ideas into polished sentences. It needs an idea of its own - or at least a familiar idea seen from a perspective that makes the reader reconsider it. The writer's job is both to find that point of view and communicate it to the reader: to make a connection others missed, develop an argument worth considering, or turn an experience into an insight.</p>
<p>There is no test suite for that. A paragraph can be grammatically perfect, logically coherent, and still completely uninteresting. This is why AI writing often feels so average. Average code can be useful in many tasks. It just needs to follow conventions, handle the common cases, and ultimately get a job done. But average writing is usually the writing we skip.</p>
<p>The distinction is not really coding versus writing, though. It is work that applies established patterns versus work that depends on a viewpoint or new idea.</p>
<p>AI <em>can</em> be very good at writing when the writing is mostly about applying patterns or logic: release notes, documentation, status updates, summaries, and routine emails. In those cases, originality may even be a liability. The goal is to communicate known information clearly, where introducing new ideas can actually be detrimental.</p>
<p>And AI can struggle with coding when the work is not about building blocks: choosing an architecture with uncommon constraints, coming up with a new algorithm, or making a judgment call where information is limited. Those tasks require taste, lots of context, or a genuinely new approach.</p>
<h3 id="abetterwaytojudgeatask">A better way to judge a task</h3>
<p>Knowing this gives us a better way to decide what kinds of questions to ask AI. Instead of bucketing your task as "writing", "coding", "design", "research", etc., ask yourself what a good answer <em>requires</em>.</p>
<p>Does it require finding and applying a well-established pattern? Does it have unique constraints that are unlikely to be encountered elsewhere? Can the result be easily checked with a test, a trusted source, a calculation, or some other metric? If so, AI is likely to be useful.</p>
<p>On the other hand, if it requires taking a position, deciding what matters, or creating something whose value depends on taste, there is no clear feedback beyond "what feels right". Sure, AI may still help you think through a problem, but it should not be the one making the final call.</p>
<p>You can apply this filter almost anywhere. AI can summarize a legal document more reliably than it can invent a novel legal argument. It can build a page from an existing design system more reliably than it can create a brand from scratch (or at least one worth copying). It can compare logical options (well, <a href="https://x.com/ItakGol/status/2022317097477407103" target="_blank" rel="noopener noreferrer nofollow">not all the time</a>) more reliably than it can decide the amount of risk your company should take.</p>
<p>On the other side, boundaries are rarely absolute. AI can occasionally produce an original connection, and people do plenty of formulaic writing. But this mental model is useful because it predicts where AI will be dependable and where it will need more supervision.</p>
<p>The right question is not necessarily "Can AI do this?". It is, "What <em>kind</em> of work does this task actually require?".</p>
]]></content:encoded></item><item><title><![CDATA[Write code like a human will maintain it]]></title><description><![CDATA[<p>One of the best things about LLMs is that they'll write code for you, all day long. Who cares about DRY? You don't have to be the one updating the same long conditional in four different files - the AI will just do it for you! Right?</p>
<p>I've noticed myself</p>]]></description><link>https://unstack.io/write-code-like-a-human-will-maintain-it</link><guid isPermaLink="false">7</guid><dc:creator><![CDATA[Scott Robinson]]></dc:creator><pubDate>Fri, 10 Jul 2026 02:51:07 GMT</pubDate><content:encoded><![CDATA[<p>One of the best things about LLMs is that they'll write code for you, all day long. Who cares about DRY? You don't have to be the one updating the same long conditional in four different files - the AI will just do it for you! Right?</p>
<p>I've noticed myself letting it slide recently on a project I'd been building with AI. I needed the same access check in a handful of places: a route handler, a background job, an API endpoint, a webhook, etc. Each time, I'd describe what I needed, the model would generate something that worked, and I'd merge it.</p>
<p>Each version looked roughly like this:</p>
<pre><code class="hljs"><span class="hljs-keyword">if</span> (user.isActive &amp;&amp; user.hasPermission(<span class="hljs-string">'read'</span>) &amp;&amp;
    !user.isSuspended &amp;&amp; account.status === <span class="hljs-string">'open'</span>) {
    <span class="hljs-comment">// do a thing</span>
}
</code></pre>
<p>Essentially the same conditionals every time. Four conditions, maybe slightly different variable names, copy-pasted logic with a word or two changed. There's a much cleaner way to do this - a shared helper, for example, like something I'd extract if I were writing this myself. But I didn't. The code worked! The tests passed and I wasn't the one who'd have to touch it again.</p>
<p>That's the laziness here: if it doesn't follow best practices, or I know a piece of code will be a pain to maintain, what difference does it make? When I need to change something later, the LLM deals with it, not me.</p>
<p><em>Except</em> the LLM doesn't write in a vacuum. It reads your codebase. The files you have open, the patterns that are already there, and the recent changes you've made. <strong>Every shortcut you merge into your codebase is a signal about how things are done here</strong>. The next time you ask the LLM for another endpoint with the same access rules, the model won't start from first principles. It'll start from the other four copies already sitting in your repo.</p>
<p>So you ask for a fifth endpoint, and you get a fifth conditional, with the same copied code. You ask for a refactor, and the model preserves all five, because that's what your code looks like. The bad pattern isn't a one-off anymore, it's considered to be your style.</p>
<p>If you let things go on like this, can you really trust that the LLM will catch every instance if you try to fix it later?</p>
<p>Sure, a few of these aren't catastrophic. That's how it always starts, but code smells do stack up. Each duplicated conditional, each "god" function, each "I'll clean this up later" merge adds another layer of signaling to the next prompt. Eventually you can't easily prompt your way out of it. At least not without getting your hands dirty and rolling up your sleeves.</p>
<p>The most frustrating part: I thought I was outsourcing maintenance to the LLM, but the slippery slope I found myself on was actually training it to have ever-worsening habits.</p>
<p>Write code like a human will maintain it. LLMs are sponges that soak up everything you do and repeat it back to you. So make sure it's good.</p>
]]></content:encoded></item><item><title><![CDATA[Mod Logs: Save every change, thank yourself later]]></title><description><![CDATA[<p>After over twelve years of building web and desktop apps, I finally added a modification log to one. One table. A few columns. Some of the simplest infrastructure I've ever built, and the one I wish I'd had from day one.</p>
<p>A modification log is just a table that tracks</p>]]></description><link>https://unstack.io/mod-logs-save-every-change-thank-yourself-later</link><guid isPermaLink="false">6</guid><dc:creator><![CDATA[Scott Robinson]]></dc:creator><pubDate>Sat, 20 Jun 2026 04:47:32 GMT</pubDate><content:encoded><![CDATA[<p>After over twelve years of building web and desktop apps, I finally added a modification log to one. One table. A few columns. Some of the simplest infrastructure I've ever built, and the one I wish I'd had from day one.</p>
<p>A modification log is just a table that tracks changes to your data. Not a new idea. Still incredibly useful.</p>
<p>You can do a lot with it later:</p>
<ul>
<li>Audit trail</li>
<li>Display historical trends</li>
<li>Track user activity</li>
<li>Replay data to replicate bugs</li>
<li>See the state of your database at any point in time</li>
</ul>
<p>You don't need to build any of that on day one. Just log the changes. Whenever you need one of those use cases, the data is already sitting there.</p>
<p>They're also pretty simple to implement. One table, a handful of fields:</p>
<ul>
<li><code>parent_model</code></li>
<li><code>parent_id</code></li>
<li><code>field_name</code></li>
<li><code>old_value</code></li>
<li><code>new_value</code></li>
<li><code>user_id</code></li>
<li><code>created_at</code></li>
</ul>
<p>That's flexible enough to cover any model in the app. I'd start with your core ones - users, orders, whatever actually drives the business - and expand from there. Any time a tracked model updates, you write a new row for each field that changed.</p>
<p>Then you need to populate it. A few common approaches:</p>
<ul>
<li>Explicit logging in API routes: after each create, update, or delete, write one row per changed field.</li>
<li>Model hooks: use your ORM's callbacks (<code>before_save</code>, <code>after_update</code>, etc.) so you don't have to touch every route.</li>
<li>Write-Ahead Logging (WAL): if your database has one, inspect the WAL and write those changes into the mod log.</li>
</ul>
<p>Pick whatever fits your codebase. What matters is consistency - every change to a tracked model should land in the log.</p>
<p>Reading the data back is the harder part. Normal tables store current state: one row per user, one row per post, one row per order. A modification log stores <em>history</em> - one row per field change. So answering "what did this record look like last Tuesday?" means replaying those changes up to a point in time.</p>
<h2 id="anexample">An Example</h2>
<p>Say we have a <code>line_items</code> table for items in an order. Quantities go up, go down, sometimes the row gets soft-deleted.</p>
<pre><code class="hljs"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> line_items (
    id               <span class="hljs-type">INT</span> <span class="hljs-keyword">PRIMARY</span> KEY,
    product_id       <span class="hljs-type">INT</span>,
    customer_id      <span class="hljs-type">INT</span>,
    quantity_ordered <span class="hljs-type">INT</span>,
    <span class="hljs-keyword">year</span>             <span class="hljs-type">INT</span>,
    is_deleted       <span class="hljs-type">BOOLEAN</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">FALSE</span>
);
</code></pre>
<p>Question we want to answer: as of end of day on January 10th, what was total <code>quantity_ordered</code> for 2026 orders?</p>
<p>These queries get expensive at scale, so they're usually better as scheduled reports than live dashboards. Here's an approach that worked for us in Postgres:</p>
<pre><code class="hljs"><span class="hljs-keyword">WITH</span> latest_modifications <span class="hljs-keyword">AS</span> (
    <span class="hljs-comment">-- Step 1: For each line item + field, keep only the most recent</span>
    <span class="hljs-comment">-- change that happened on or before the cutoff date.</span>
    <span class="hljs-keyword">SELECT</span>
        ml.parent_id <span class="hljs-keyword">AS</span> line_item_id,
        ml.field_name,
        ml.new_value,
        <span class="hljs-built_in">ROW_NUMBER</span>() <span class="hljs-keyword">OVER</span> (
            <span class="hljs-keyword">PARTITION</span> <span class="hljs-keyword">BY</span> ml.parent_id, ml.field_name
            <span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> ml.created_at <span class="hljs-keyword">DESC</span>
        ) <span class="hljs-keyword">AS</span> row_num
    <span class="hljs-keyword">FROM</span> modification_logs ml
    <span class="hljs-keyword">WHERE</span> ml.parent_model <span class="hljs-operator">=</span> <span class="hljs-string">'line_items'</span>
      <span class="hljs-keyword">AND</span> ml.created_at <span class="hljs-operator">&lt;=</span> <span class="hljs-number">1768024800000</span>   <span class="hljs-comment">-- Jan 10 cutoff</span>
),

line_items_snapshot <span class="hljs-keyword">AS</span> (
    <span class="hljs-comment">-- Step 2: Pivot row-oriented log entries into column-oriented state.</span>
    <span class="hljs-comment">-- One row per line item, with the latest known value for each field.</span>
    <span class="hljs-keyword">SELECT</span>
        lm.line_item_id,
        <span class="hljs-built_in">COALESCE</span>(
            <span class="hljs-built_in">MAX</span>(<span class="hljs-keyword">CASE</span>
                <span class="hljs-keyword">WHEN</span> lm.field_name <span class="hljs-operator">=</span> <span class="hljs-string">'quantity_ordered'</span>
                 <span class="hljs-keyword">AND</span> <span class="hljs-built_in">TRIM</span>(lm.new_value) <span class="hljs-operator">!=</span> <span class="hljs-string">''</span>
                <span class="hljs-keyword">THEN</span> lm.new_value::<span class="hljs-type">DOUBLE PRECISION</span>
            <span class="hljs-keyword">END</span>), <span class="hljs-number">0</span>
        ) <span class="hljs-keyword">AS</span> quantity_ordered,
        <span class="hljs-built_in">MAX</span>(<span class="hljs-keyword">CASE</span>
            <span class="hljs-keyword">WHEN</span> lm.field_name <span class="hljs-operator">=</span> <span class="hljs-string">'year'</span>
            <span class="hljs-keyword">THEN</span> lm.new_value::<span class="hljs-type">INT</span>
        <span class="hljs-keyword">END</span>) <span class="hljs-keyword">AS</span> <span class="hljs-keyword">year</span>,
        <span class="hljs-built_in">COALESCE</span>(
            <span class="hljs-built_in">MAX</span>(<span class="hljs-keyword">CASE</span>
                <span class="hljs-keyword">WHEN</span> lm.field_name <span class="hljs-operator">=</span> <span class="hljs-string">'is_deleted'</span>
                 <span class="hljs-keyword">AND</span> <span class="hljs-built_in">TRIM</span>(lm.new_value) <span class="hljs-operator">=</span> <span class="hljs-string">'1'</span>
                <span class="hljs-keyword">THEN</span> <span class="hljs-number">1</span> <span class="hljs-keyword">ELSE</span> <span class="hljs-number">0</span>
            <span class="hljs-keyword">END</span>), <span class="hljs-number">0</span>
        )::<span class="hljs-type">BOOLEAN</span> <span class="hljs-keyword">AS</span> is_deleted
    <span class="hljs-keyword">FROM</span> latest_modifications lm
    <span class="hljs-keyword">WHERE</span> lm.row_num <span class="hljs-operator">=</span> <span class="hljs-number">1</span>   <span class="hljs-comment">-- latest change per field only</span>
    <span class="hljs-keyword">GROUP</span> <span class="hljs-keyword">BY</span> lm.line_item_id
),

line_items_with_details <span class="hljs-keyword">AS</span> (
    <span class="hljs-comment">-- Step 3: Join to the live table for fields that were set at creation</span>
    <span class="hljs-comment">-- and never modified — and therefore never logged.</span>
    <span class="hljs-keyword">SELECT</span>
        lis.line_item_id,
        lis.quantity_ordered,
        lis.year,
        lis.is_deleted,
        li.product_id
    <span class="hljs-keyword">FROM</span> line_items_snapshot lis
    <span class="hljs-keyword">LEFT</span> <span class="hljs-keyword">JOIN</span> line_items li
        <span class="hljs-keyword">ON</span> lis.line_item_id <span class="hljs-operator">=</span> li.id::TEXT
)

<span class="hljs-comment">-- Step 4: Aggregate with query filters</span>
<span class="hljs-keyword">SELECT</span>
    <span class="hljs-built_in">COALESCE</span>(<span class="hljs-built_in">SUM</span>(lit.quantity_ordered), <span class="hljs-number">0</span>) <span class="hljs-keyword">AS</span> total_quantity_ordered
<span class="hljs-keyword">FROM</span> line_items_with_details lit
<span class="hljs-keyword">WHERE</span> lit.year <span class="hljs-operator">=</span> <span class="hljs-number">2026</span>
  <span class="hljs-keyword">AND</span> lit.is_deleted <span class="hljs-operator">=</span> <span class="hljs-literal">FALSE</span>;
</code></pre>
<p>From a high level, here is how it works:</p>
<ol>
<li><strong>Rank changes</strong>: For each line item and field, find the most recent log entry on or before the cutoff date.</li>
<li><strong>Pivot to columns</strong>: Turn one-row-per-change into one-row-per-line-item, with the latest value for each field.</li>
<li><strong>Join</strong>: Pull fields from the live <code>line_items</code> table that were never modified and therefore never logged.</li>
<li><strong>Aggregate</strong>: Sum the quantity ordered.</li>
</ol>
<p>The query uses <strong>Common Table Expressions</strong> (CTEs) - which is basically a virtual table defined with <code>WITH name AS (...)</code>. Each CTE behaves like a regular table while the query runs, but nothing is actually written to disk. When the query finishes, the virtual table is gone. Here we use three of them to break the reconstruction into steps you can read top to bottom: filter for the latest changes, pivot log rows into columns, join back to the live table, then aggregate. You could write this as one giant nested subquery, but CTEs make each stage explicit and much easier to debug.</p>
<p>For any app with reasonable activity, this will result in millions (or even billions!) of lines being logged. With each line representing a single field change, the table grows fast. Even with proper indexing, reconstructing historical state is slow enough that you'll usually want to run these queries in a scheduled job rather than on every page load.</p>
<p>That seems like a fair tradeoff to me. You get a complete audit trail and the ability to answer historical questions, all from one table you can add on day one. Start logging changes to your core models now, and the audit trails, trend charts, and bug replays can come whenever you need them.</p>
]]></content:encoded></item><item><title><![CDATA[Software companies are now like home builders]]></title><description><![CDATA[<p>For most of the history of software development, developers were closer to machine shops than anything else.</p>
<p>If you wanted software, you needed specialists with years of experience. Building <em>good</em> software was hard, so the ability to build it was valuable.</p>
<p>That's changed, and we're all watching it happen in</p>]]></description><link>https://unstack.io/software-companies-are-now-like-home-builders</link><guid isPermaLink="false">5</guid><dc:creator><![CDATA[Scott Robinson]]></dc:creator><pubDate>Thu, 04 Jun 2026 16:20:01 GMT</pubDate><content:encoded><![CDATA[<p>For most of the history of software development, developers were closer to machine shops than anything else.</p>
<p>If you wanted software, you needed specialists with years of experience. Building <em>good</em> software was hard, so the ability to build it was valuable.</p>
<p>That's changed, and we're all watching it happen in real time.</p>
<p>AI is dropping the cost of software development fast. What used to take a team of engineers can now get built by one person with a few AI tools and a small budget for tokens.</p>
<p>So developers are starting to look less like machine shops and more like home builders.</p>
<p>Almost anyone can build a house. Give them a blueprint, the right tools, some subcontractors - the construction itself isn't really the hard part anymore. Whether they can build a <em>good</em> one is a different story.</p>
<p>What separates home builders usually isn't who swings a hammer better. It's the stuff around the build: attracting customers, relationships, design, taste, understanding what the customer actually needs, reliability, project management, reputation.</p>
<p>Two builders can start with the same materials and end up with totally different houses. Software is heading the same way - if it isn't already there - and you'll notice it most at software companies themselves.</p>
<p>For a long time, software companies competed mostly on engineering. Hire better engineers, build things your competitors couldn't. That was the moat.</p>
<p>Today a lot of competitors can ship roughly the same product. So distribution, customer relationships, support, brand, and product judgment matter more. Same stuff that separates home builders, basically - reputation, relationships, taste, getting customers, trust.</p>
<p>Writing usable code is getting less scarce. More people than ever can turn an idea into something that runs.</p>
<p>A working product and a good product are still very different things.</p>
<p>As AI makes it easier to build, the skills that matter more are the ones around the build: figuring out what customers need, picking the right features, making decent tradeoffs, and shipping something people actually want to use.</p>
<p>Inside companies, developers are adapting too. Instead of laying every brick themselves, they're coordinating subcontractors - LLMs, coding agents, APIs, third-party integrations, open-source libraries. More of the job is deciding <em>what</em> should get built, reviewing the work, and making sure the pieces fit. That shift is happening inside companies whose competitive edge is already moving elsewhere.</p>
<p>There's been a lot of discourse on this. The usual question is whether anyone can build software now (yes). The more interesting one is what happens once everyone can.</p>
<h3 id="whatdoesthismeanforsoftwarecompanies">What does this mean for software companies?</h3>
<p>Once just about everyone can build software, what actually sets a software business apart?</p>
<p>A lot of the same things that set home builders apart: customer acquisition, distribution, trust, reputation, relationships, brand, product judgment, support. Engineering still matters - just not as the only thing that does.</p>
<p>AI makes software easier to build. It doesn't magically make everyone capable of building Stripe, AWS, Figma, or PostHog. The hard parts of running systems at that scale are still out of reach for vibe coders.</p>
<p>For decades, software companies won because they could build things others couldn't.</p>
<p>You can still win. You just win differently now - by knowing what to build, being a good partner to build it with, and going about the process in a way that doesn't fall apart.</p>
<p>Software development isn't worthless. The value is shifting. It used to come from being able to build. More and more it comes from knowing what to build, how to build it, and who you're building it for.</p>
<p>When building gets easy, construction stops being the differentiator.</p>
]]></content:encoded></item><item><title><![CDATA[Theseus Slop]]></title><description><![CDATA[<p>There has been a very active debate (<a href="https://news.ycombinator.com/item?id=48019025" target="_blank" rel="noopener noreferrer nofollow">1</a>, <a href="https://arxiv.org/abs/2505.19443" target="_blank" rel="noopener noreferrer nofollow">2</a>, <a href="https://addyo.substack.com/p/treat-ai-generated-code-as-a-draft" target="_blank" rel="noopener noreferrer nofollow">3</a>) on how useful AI is for programming. It speeds up development, but sometimes at the cost of quality and understanding what you are building.</p>
<p>I'm seeing more and more cases where engineers take an existing or legacy codebase and use</p>]]></description><link>https://unstack.io/theseus-slop</link><guid isPermaLink="false">4</guid><dc:creator><![CDATA[Scott Robinson]]></dc:creator><pubDate>Tue, 26 May 2026 02:39:26 GMT</pubDate><content:encoded><![CDATA[<p>There has been a very active debate (<a href="https://news.ycombinator.com/item?id=48019025" target="_blank" rel="noopener noreferrer nofollow">1</a>, <a href="https://arxiv.org/abs/2505.19443" target="_blank" rel="noopener noreferrer nofollow">2</a>, <a href="https://addyo.substack.com/p/treat-ai-generated-code-as-a-draft" target="_blank" rel="noopener noreferrer nofollow">3</a>) on how useful AI is for programming. It speeds up development, but sometimes at the cost of quality and understanding what you are building.</p>
<p>I'm seeing more and more cases where engineers take an existing or legacy codebase and use AI to refactor, optimize, and improve it. Over time, the codebase hardly resembles the original in design, implementation, and sometimes architecture. Sure, it still deploys and passes tests, and it still lives in the same repo. But in many cases the developers don't actually understand how it works anymore.</p>
<p>I want a term for this: <strong>Theseus Slop</strong>.</p>
<p><strong>Theseus Slop</strong> is what happens when LLMs gradually replace the code in a system you already had, eventually replacing almost every line of code, function, and file, until it feels like a different codebase altogether. Unlike vibe coding a project from scratch, this usually begins with code that you understand and ends with code that you do not.</p>
<p><img src="https://s3.unstack.io/theseus-slop-2.png" alt="Theseus Slop: Code replaced line by line"></p>
<p>Maybe you've seen this by now: a legacy service gets "modernized" over a few months, the domain is still the same, the repo name is unchanged, but the auth flow, API integrations, error handling, and even folder layout feel foreign. You can ship features, but you can't explain why a particular guard clause exists.</p>
<h2 id="wherethenamecomesfrom">Where the name comes from</h2>
<p>The term comes from the <a href="https://en.wikipedia.org/wiki/Ship_of_Theseus" target="_blank" rel="noopener noreferrer nofollow">Ship of Theseus</a>, also called Theseus's Paradox, a thought experiment about identity and change. In the paradox, a ship is gradually repaired by replacing each part with a new one, until nothing of the original remains. That raises two questions:</p>
<ul>
<li>Is the ship with all new parts still the same Ship of Theseus?</li>
<li>If it is not, at exactly what point did it stop being the original?</li>
</ul>
<p><img src="https://s3.unstack.io/theseus-slop-1.png" alt="Theseus Ship: A ship repaired plank by plank"></p>
<p>There is no clean answer. It depends what you mean by "the same". Same exact design? Same functionality? Same crew or name on the boat?</p>
<p>Vibe coding does something similar at a glance, but Theseus Slop is the slower version on code you already owned: each piece swapped out until the whole is unfamiliar, with no single moment where anyone called it a rewrite.</p>
<p>You cannot name the exact commit where your understanding ended, any more than you can name the plank that ended the original ship.</p>
<h2 id="thequestions">The questions</h2>
<p>The same two questions apply to codebases.</p>
<p><strong>Is it the same codebase?</strong> You can see the Git history and how the codebase has evolved over time. The product name and deployment target are all the same. But the structure of modules, the patterns for I/O, and the implicit conventions or even overall style may not be. Under one set of criteria - continuous version control, same overall functionality - you have one system. Under another - shared mental model among the people who maintain it - you may have replaced it without ever declaring a rewrite. You might not even realize it until you try to explain how it works to someone else.</p>
<p><strong>Is it still yours?</strong> You wrote much of the first version. You approved all of the AI's generated diffs. Ownership in that sense is intact. Yet "yours" also means you made all of the design decisions and can reason about it when asked: trace a bug, reject a bad abstraction, explain a tradeoff in review. Theseus Slop is the gap between owning the repo and understanding how it works. The code is in your repo, but the design decisions are not in your head.</p>
<h2 id="whendoesitmatter">When does it matter?</h2>
<p>What's the counterargument?</p>
<p>The old ship (code) needed replacing. If it's truly a legacy project, then it's already a liability. If AI-assisted refactors fix bugs, remove dead paths, shrink modules, or align the system with how the product works today, the replacement may be an improvement in every measurable way. Yes, potential confusion among maintainers is a cost, but so was paralysis around code everyone was too afraid to edit.</p>
<p>I would guess some teams argue the gap does not matter much if the repo has a solid set of tests, types, and documentation. You don't need to keep the old architecture in your head if behavior is well known and well documented.</p>
<p>It seems to me that both points hold in many projects. The disagreement is not whether AI can improve code - it clearly can - but whether the remaining gap in understanding matters for <em>your</em> situation.</p>
<p>There are other factors to consider as well:</p>
<p><strong>Stakes.</strong> Theseus Slop hurts when you must debug under pressure, review security-sensitive changes, onboard a new engineer, or work through an audit that requires you to know <em>how</em> the system works and not just what it does. It doesn't matter as much when you are throwing together a prototype, exploring an idea for a weekend, or just writing a one-off script.</p>
<p><strong>Scale.</strong> A solo developer working on a small tool can better handle an unfamiliar structure. The complexity is usually less anyway. But a team on a long-lived, critical production system magnifies the problem: there is no subject matter expert who can answer questions about their section of the codebase and you must rely on AI to regurgitate an accurate explanation back to you.</p>
<h2 id="whynameit">Why name it</h2>
<p>My attempt to coin the term "Theseus Slop" is not an argument against using AI on existing code. But it's a label for a certain outcome: incremental replacement (without thorough review) at the expense of comprehension. For any important project, it's a risk that needs to be understood and avoided. For everything else, it's a risk that needs to be managed.</p>
]]></content:encoded></item><item><title><![CDATA[Terms of Service]]></title><description><![CDATA[<h2 id="thegist">The Gist</h2>
<p>Unstack Software LLC ("Unstack", "we", "us", or "our") operates <a href="https://unstack.io/" target="_blank" rel="noopener noreferrer nofollow">unstack.io</a> (the "Site"), a blog and content site. We hope you ("You" or "Your") enjoy reading it. Please use the Site responsibly. If you post comments or other content, keep it lawful and respectful. We may remove content</p>]]></description><link>https://unstack.io/terms</link><guid isPermaLink="false">3</guid><dc:creator><![CDATA[Scott Robinson]]></dc:creator><pubDate>Sat, 16 May 2026 19:10:13 GMT</pubDate><content:encoded><![CDATA[<h2 id="thegist">The Gist</h2>
<p>Unstack Software LLC ("Unstack", "we", "us", or "our") operates <a href="https://unstack.io/" target="_blank" rel="noopener noreferrer nofollow">unstack.io</a> (the "Site"), a blog and content site. We hope you ("You" or "Your") enjoy reading it. Please use the Site responsibly. If you post comments or other content, keep it lawful and respectful. We may remove content or restrict access if you don't.</p>
<p>The articles, posts, and other materials on the Site are for general information and entertainment. They are not professional advice. Your use of the Site is at your own risk.</p>
<p>These Terms of Use (the "Terms"), the Site, and our practices may change from time to time. We will try to warn you about material changes, but we make no guarantees.</p>
<p>That's the basic idea, but You must read through the entire document below and agree with all the details before You use the Site.</p>
<h2 id="youragreementwithunstack">Your Agreement with Unstack</h2>
<p>Your use of the Site is governed by these Terms. The "Service" means the Site at <a href="https://unstack.io/" target="_blank" rel="noopener noreferrer nofollow">https://unstack.io/</a> and its subdomains, including all pages, articles, posts, media, and any features we make available in connection with the Site (such as comments, sharing controls, newsletters, search, or other interactive elements).</p>
<p>By accessing or using the Service, You agree to these Terms. If You do not agree, do not use the Service.</p>
<p>Unstack may change the Terms from time to time. If we make material changes, we may post the updated Terms on the Site and update the effective date. Your continued use of the Service after the changes take effect constitutes acceptance of the updated Terms. If You do not agree to the changes, stop using the Service.</p>
<p>If you have any questions about the Terms, please contact us at <a href="mailto:support@unstack.io">support@unstack.io</a>.</p>
<h2 id="whomayusethesite">Who May Use the Site</h2>
<ul>
<li>You may not use the Service if You are barred from receiving services under the laws of the United States or other applicable countries, including the country in which You are resident or from which You use the Service.</li>
<li>You must be at least 13 years old to use the Service. If You are under 18, You represent that You have your parent or guardian's permission to use the Service.</li>
<li>If You create an account or submit content that requires registration, You must provide accurate information and You must be a human. Accounts or submissions created by automated methods are not permitted except where we explicitly allow them.</li>
</ul>
<h2 id="useofthesite">Use of the Site</h2>
<ul>
<li>Your use of the Service must comply with all applicable laws, regulations, and ordinances.</li>
<li>You agree not to engage in any activity that interferes with or disrupts the Service, including attempting to overload, scrape, or probe our systems without permission.</li>
<li>You may not use the Service to transmit malware, spam, or unsolicited communications.</li>
<li>You may not attempt to gain unauthorized access to any part of the Service, other users' accounts, or our systems or networks.</li>
<li>We may limit or suspend access to the Service, or remove content, at our sole discretion, with or without notice.</li>
</ul>
<h2 id="commentsandusercontent">Comments and User Content</h2>
<p>The Service may allow You to post comments, feedback, or other material ("User Content"). You retain ownership of Your User Content, but by submitting it You grant Unstack a worldwide, non-exclusive, royalty-free, perpetual license to use, host, store, reproduce, modify, publish, display, and distribute Your User Content solely as needed to operate, promote, and improve the Service.</p>
<p>You represent and warrant that:</p>
<ul>
<li>You own or have the necessary rights to submit Your User Content;</li>
<li>Your User Content does not violate these Terms or any applicable law; and</li>
<li>Your User Content does not infringe the intellectual property, privacy, or other rights of any third party.</li>
</ul>
<p>You agree not to submit User Content that is unlawful, defamatory, harassing, hateful, obscene, fraudulent, misleading, or that promotes illegal activity or violence. We do not pre-screen User Content and are not responsible for it. We may remove or refuse any User Content at any time, for any reason or no reason.</p>
<h2 id="interactivefeatureslinksandsharing">Interactive Features, Links, and Sharing</h2>
<p>The Service may include links to third-party websites, embedded content, social sharing buttons, comment systems, newsletters, or other interactive features. These features may be operated by us or by third parties. Your use of third-party features may be subject to those parties' terms and privacy policies.</p>
<p>When You use sharing or embed features, You understand that content may be visible on third-party platforms according to those platforms' settings and policies. We are not responsible for how third parties handle information You choose to share.</p>
<h2 id="privacyandanalytics">Privacy and Analytics</h2>
<p>The Service is subject to our Privacy Policy, available at <a href="https://unstack.io/privacy" target="_blank" rel="noopener noreferrer nofollow">https://unstack.io/privacy</a> (the "Privacy Policy"), which is incorporated into these Terms by reference. The Privacy Policy describes how we collect, use, and share information, including through cookies and typical website analytics.</p>
<p>By using the Service, You agree to our collection and use of information as described in the Privacy Policy. Where required by law, we will seek Your consent for certain uses of cookies or similar technologies.</p>
<h2 id="ideasandfeedback">Ideas and Feedback</h2>
<p>You may choose to, or we may invite You to, submit comments or ideas about the Service or our content ("Ideas"). By submitting any Idea, You agree that Your disclosure is unsolicited and without restriction, that it will not place Unstack under any fiduciary or other obligation, and that we are free to use the Idea without additional compensation to You, including on a non-confidential basis.</p>
<h2 id="modificationofthesite">Modification of the Site</h2>
<ul>
<li>You acknowledge that the Service may change from time to time without prior notice, including the addition or removal of features, content, or design.</li>
<li>Unstack shall not be liable to You or any third party for any modification, suspension, or discontinuance of the Service or any part of it.</li>
</ul>
<h2 id="externalresources">External Resources</h2>
<p>The Service may include hyperlinks to other websites, content, resources, or email content. Unstack is not responsible for the availability, accuracy, or practices of any external sites or resources and does not endorse advertising, products, or other materials on or available from them.</p>
<h2 id="licensefromunstackandrestrictions">License from Unstack and Restrictions</h2>
<p>All content available on or through the Service, including without limitation text, photographs, graphics, logos, trade and service marks, and audiovisual content, is owned or controlled by Unstack, its licensors, or other rights holders and is protected by copyright, trademark, and other laws. You acknowledge that the Service and any underlying technology contain our proprietary information.</p>
<p>Subject to Your compliance with these Terms, we grant You a personal, worldwide, royalty-free, non-assignable, non-exclusive license to access and use the Service for Your personal, non-commercial use (unless we expressly permit otherwise in writing).</p>
<p>You may not (and may not permit anyone else to):</p>
<ul>
<li>copy, modify, distribute, publicly display, or create derivative works from our content except as permitted by law or with our prior written permission;</li>
<li>remove any copyright, trademark, or other proprietary notices;</li>
<li>use any robot, spider, scraper, or other automated means to access or index the Service in a manner that burdens our systems or violates these Terms, except for standard search-engine indexing where allowed by our robots rules;</li>
<li>reformat or frame any portion of the Site;</li>
<li>use the Service for commercial purposes not permitted under these Terms;</li>
<li>impersonate Unstack, any of our employees or representatives, or any other person or entity; or</li>
<li>collect or store personal data about other users except as permitted by these Terms and applicable law.</li>
</ul>
<h2 id="ourcopyrightdisputepolicy">Our Copyright Dispute Policy</h2>
<p>Unstack respects the intellectual property of others and expects users to do the same. If You believe that material on the Service infringes Your copyright, please send a notice containing the following to our Designated Copyright Agent:</p>
<ul>
<li>identification of the copyrighted work claimed to have been infringed, or, if multiple works are covered by a single notification, a representative list;</li>
<li>identification of the claimed infringing material and information reasonably sufficient to permit us to locate it (providing the URL(s) satisfies this requirement);</li>
<li>information reasonably sufficient to permit us to contact You, such as an address, telephone number, and email address;</li>
<li>a statement that You have a good faith belief that the disputed use is not authorized by the copyright owner, its agent, or the law;</li>
<li>a statement, made under penalty of perjury, that the information in Your notification is accurate and that You are the copyright owner or authorized to act on the owner's behalf; and</li>
<li>Your physical or electronic signature.</li>
</ul>
<p>Our Designated Copyright Agent can be reached at: Unstack Software LLC, Attn: Copyright Agent, <a href="mailto:legal@unstack.io">legal@unstack.io</a>.</p>
<h2 id="linkstootherwebsites">Links to Other Websites</h2>
<p>The Service may contain links to other websites ("Third Party Sites"). Unstack does not endorse, verify, or assume responsibility for Third Party Sites or any products, services, or content on them. If You follow a link to a Third Party Site, You do so at Your own risk and may be subject to that site's terms and policies. You should review the privacy and other policies of any Third Party Site You visit. Concerns regarding a Third Party Site should be directed to that site.</p>
<h2 id="disclaimerofwarranties">Disclaimer of Warranties</h2>
<p>IF YOU ACCESS THE SERVICE, YOU DO SO AT YOUR OWN RISK. WE PROVIDE THE SERVICE "AS IS", "WITH ALL FAULTS", AND "AS AVAILABLE." WE MAKE NO EXPRESS OR IMPLIED WARRANTIES OR GUARANTEES ABOUT THE SERVICE OR ANY CONTENT ON IT. TO THE MAXIMUM EXTENT PERMITTED BY LAW, WE DISCLAIM ALL SUCH WARRANTIES, INCLUDING STATUTORY WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, AND NON-INFRINGEMENT.</p>
<p>WE DO NOT GUARANTEE THAT THE SERVICE WILL BE UNINTERRUPTED, ERROR-FREE, OR SECURE, OR THAT CONTENT WILL BE ACCURATE, COMPLETE, OR CURRENT. CONTENT ON THE SITE REFLECTS THE AUTHORS' VIEWS AT THE TIME OF PUBLICATION AND MAY NOT BE SUITABLE FOR EVERY PURPOSE. NOTHING ON THE SITE IS LEGAL, FINANCIAL, MEDICAL, OR OTHER PROFESSIONAL ADVICE.</p>
<h2 id="limitationsonliability">Limitations on Liability</h2>
<p>YOUR SOLE AND EXCLUSIVE REMEDY FOR ANY DISPUTE WITH US IS TO STOP USING THE SERVICE. IN NO EVENT SHALL OUR TOTAL CUMULATIVE LIABILITY TO YOU FOR ANY AND ALL CLAIMS RELATING TO OR ARISING OUT OF YOUR USE OF THE SERVICE, REGARDLESS OF THE FORM OF ACTION, EXCEED ONE HUNDRED DOLLARS ($100).</p>
<p>IN NO EVENT SHALL WE BE LIABLE TO YOU (OR ANY THIRD PARTY CLAIMING THROUGH YOU) FOR ANY INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, OR EXEMPLARY DAMAGES, OR ANY DAMAGES FOR LOST PROFITS, LOST DATA, LOSS OF GOODWILL, OR PERSONAL INJURY, ARISING FROM YOUR USE OF OR INABILITY TO USE THE SERVICE, EVEN IF WE KNEW OR SHOULD HAVE KNOWN OF THE POSSIBILITY OF SUCH DAMAGES.</p>
<p>BECAUSE SOME STATES OR JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, IN SUCH JURISDICTIONS OUR LIABILITY SHALL BE LIMITED TO THE EXTENT PERMITTED BY LAW.</p>
<p>IF YOU ARE A CALIFORNIA RESIDENT, YOU WAIVE CALIFORNIA CIVIL CODE SECTION 1542, WHICH PROVIDES THAT A GENERAL RELEASE DOES NOT EXTEND TO CLAIMS THAT THE CREDITOR DOES NOT KNOW OR SUSPECT TO EXIST IN HIS OR HER FAVOR AT THE TIME OF EXECUTING THE RELEASE.</p>
<h2 id="indemnification">Indemnification</h2>
<p>You agree to hold harmless and indemnify Unstack Software LLC and its affiliates, officers, agents, employees, and partners from and against any third-party claim arising from or related to (a) Your breach of these Terms, (b) Your User Content, or (c) Your use of the Service or violation of applicable law, including any liability or expense arising from claims, losses, damages, suits, judgments, litigation costs, and attorneys' fees. In such a case, Unstack will provide You with written notice of the claim where reasonably practicable.</p>
<h2 id="choiceoflawanddisputeresolution">Choice of Law and Dispute Resolution</h2>
<p>These Terms shall be governed by and construed in accordance with the laws of the State of Nebraska, without regard to conflict-of-law principles, as applied to contracts made and performed entirely within Nebraska.</p>
<p>Any controversy, dispute, or claim arising out of or related to these Terms, the Privacy Policy, or the Service shall be settled by final and binding arbitration in Douglas County, Nebraska, pursuant to the rules of the American Arbitration Association, except that either party may seek injunctive relief in a court of competent jurisdiction. Any disputes shall be resolved individually, without resort to any form of class action.</p>
<h2 id="generallegalterms">General Legal Terms</h2>
<p>These Terms, together with the Privacy Policy, constitute the entire agreement between You and Unstack regarding the Service and supersede any prior agreements on the subject.</p>
<p>If any part of these Terms is held invalid or unenforceable, that portion shall be construed to reflect the parties' intentions as nearly as possible, and the remaining portions shall remain in full force and effect.</p>
<p>The failure of Unstack to exercise or enforce any right or provision of these Terms shall not constitute a waiver of such right or provision.</p>
<p>Unstack shall not be liable for failing or delaying performance resulting from any condition beyond our reasonable control, including governmental action, acts of terrorism, natural disasters, labor conditions, power failures, or Internet disturbances.</p>
<p>We may assign this agreement at any time to any parent, subsidiary, affiliate, or successor, or in connection with a merger, sale, or other transfer of our business. You may not assign Your rights under these Terms without our prior written consent.</p>
]]></content:encoded></item><item><title><![CDATA[Privacy Policy]]></title><description><![CDATA[<h2 id="overview">Overview</h2>
<p>Unstack Software LLC will collect certain non-personally identifiable information about you as you use our sites. We may use this data to better understand our users. We can also publish this data, but the data will be about a large group of users, not individuals. We may also collect</p>]]></description><link>https://unstack.io/privacy</link><guid isPermaLink="false">2</guid><dc:creator><![CDATA[Scott Robinson]]></dc:creator><pubDate>Fri, 15 May 2026 21:36:25 GMT</pubDate><content:encoded><![CDATA[<h2 id="overview">Overview</h2>
<p>Unstack Software LLC will collect certain non-personally identifiable information about you as you use our sites. We may use this data to better understand our users. We can also publish this data, but the data will be about a large group of users, not individuals. We may also collect certain personal information about you and your use of the Service (as defined herein) which may be published and used in the aggregate as set forth in this Privacy Policy.</p>
<p>We will also ask you to provide personal information, but you'll always be able to opt out. If you give us personal information, we won't do anything evil with it.</p>
<p>We can also use cookies, but you can choose not to store these.</p>
<p>Unstack Software makes available services include our web sites (<a href="https://unstack.io" target="_blank" rel="noopener noreferrer nofollow">https://unstack.io</a> (the "Site")), our blog, our API, our dashboard, and any other software, sites, and services offered by Unstack Software in connection to any of those (taken together, the "Service"). It is Unstack Software's policy to respect your privacy regarding any information we may collect while operating our Site.</p>
<h2 id="questions">Questions</h2>
<p>If you have question about this Privacy Policy, please contact us at <a href="mailto:support@unstack.io">support@unstack.io</a>.</p>
<h2 id="visitors">Visitors</h2>
<p>Like most website operators, Unstack Software collects non-personally-identifying information of the sort that web browsers and servers typically make available, such as the browser type, language preference, referring site, and the date and time of each visitor request. Unstack Software's purpose in collecting non-personally identifying information is to better understand how Unstack Software's visitors use its website. From time to time, Unstack Software may release non-personally-identifying information in the aggregate, e.g., by publishing a report on trends in the usage of its website.</p>
<p>Unstack Software also collects potentially personally-identifying information like Internet Protocol (IP) addresses. Unstack Software does not use such information to identify its visitors, however, and does not disclose such information, other than under the same circumstances that it uses and discloses personally-identifying information, as described below. We may also collect and use IP addresses to block users who violated our Terms of Service.</p>
<h2 id="gatheringofpersonallyidentifyinginformation">Gathering of Personally-Identifying Information</h2>
<p>Certain visitors to Unstack Software's websites choose to interact with Unstack Software in ways that require Unstack Software to gather personally-identifying information, such as names and email addresses. The amount and type of information that Unstack Software gathers depends on the nature of the interaction. Unstack Software collects such information only insofar as is necessary or appropriate to fulfill the purpose of the visitor's interaction with Unstack Software. Unstack Software does not disclose personally-identifying information other than as described below. And visitors can always refuse to supply personally-identifying information, with the caveat that it may prevent them from engaging in certain Service-related activities.</p>
<p>Additionally, some interactions, such as posting a comment, may ask for optional personal information. For instance, when posting a comment, may provide a website that will be displayed along with a user's name when the comment is displayed. Supplying such personal information is completely optional and is only displayed for the benefit and the convenience of the user.</p>
<h2 id="aggregatedstatistics">Aggregated Statistics</h2>
<p>Unstack Software may collect statistics about the behavior of visitors to and users of the Service. For instance, Unstack Software may monitor and store data about the most popular parts of the Unstack Software Site or other statistics. Unstack Software may display this information publicly or provide it to others.</p>
<p>In addition, Unstack Software may, from time to time, collect certain personal information from you or your company and/or your use of the Services (your "Data"). Unstack Software may publish and display your Data in the aggregate to the public through our Site or on our blog. However, all Data is only used and published in the aggregate which means that any published Data will not identify you, your company, or link you to the published information in any way.</p>
<p>Unstack Software does not disclose personally-identifying information other than as described below.</p>
<h2 id="protectionofcertainpersonallyidentifyinginformation">Protection of Certain Personally-Identifying Information</h2>
<p>Unstack Software discloses potentially personally-identifying and personally-identifying information only to those of its employees and contractors that (i) need to know that information in order to process it on Unstack Software's behalf or to provide services available at Unstack Software's Site websites, and (ii) that have agreed not to disclose it to others. Some of those employees and contractors may be located outside of your home country; by using the Service, you consent to the transfer of such information to them. Unstack Software will not rent or sell potentially personally-identifying and personally-identifying information to anyone. Other than to its employees, contractors, and affiliated organizations, as described above, Unstack Software discloses potentially personally-identifying and personally-identifying information only when required to do so by law, or when Unstack Software believes in good faith that disclosure is reasonably necessary to protect the property or rights of Unstack Software, third parties or the public at large.</p>
<p>If you are a registered reseller or newsletter subscriber and have supplied your email address, Unstack Software may occasionally send you an email to tell you about new features, solicit your feedback, or just keep you up to date with what's going on with Unstack Software and our products. We primarily use our website and blog to communicate this type of information, so we expect to keep this type of email to a minimum. If you send us a request (for example via a support email or via one of our feedback mechanisms), we reserve the right to anonymize and publish it in order to help us clarify or respond to your request or to help us support other users. Unstack Software takes all measures reasonably necessary to protect against the unauthorized access, use, alteration or destruction of potentially personally-identifying and personally-identifying information.</p>
<h2 id="cookies">Cookies</h2>
<p>A cookie is a string of information that a website stores on a visitor's computer, and that the visitor's browser provides to the Service each time the visitor returns. Unstack Software uses cookies to help Unstack Software identify and track visitors, their usage of Unstack Software Service, and their Service access preferences. Unstack Software visitors who do not wish to have cookies placed on their computers should set their browsers to refuse cookies before using Unstack Software's websites, with the drawback that certain features of Unstack Software's websites may not function properly without the aid of cookies.</p>
<h2 id="businesstransfers">Business Transfers</h2>
<p>If Unstack Software, or substantially all of its assets, were acquired, or in the unlikely event that Unstack Software goes out of business or enters bankruptcy, user information would be one of the assets that is transferred or acquired by a third party. You acknowledge that such transfers may occur, and that any acquirer of Unstack Software may continue to use your personal information as set forth in this policy.</p>
<h2 id="datatransmissionsecurityandstorage">Data Transmission, Security, and Storage</h2>
<p>Unstack Software uses third party vendors and hosting partners to provide the necessary hardware, software, networking, storage, and related technology required to run the Service. You understand that although you retain full rights to your data, it may be stored on third party storage and transmitted through third party networks.</p>
<p>It is extremely difficult to guarantee the complete security of data transmitted through the Internet, via mobile devices, or through the physical transfer of information. While we will take precautions to limit security risks, we can not fully eliminate all security risks associated with personal information. We do not guarantee or warrant the security of any data or information transmitted to us by you, and you do so at your own risk.</p>
<h2 id="privacypolicychanges">Privacy Policy Changes</h2>
<p>Although most changes are likely to be minor, Unstack Software may change its Privacy Policy from time to time, and at Unstack Software's sole discretion. Unstack Software encourages visitors to frequently check this page for any changes to its Privacy Policy.</p>
]]></content:encoded></item><item><title><![CDATA[Halt and Catch Fire]]></title><description><![CDATA[<p>I have never watched the AMC show <em>Halt and Catch Fire</em>, and for a long time I only knew the title, but nothing about the show. Something about it always reminded me of programmer humor: somewhat dramatic, a little absurd, and weirdly precise. Turns out, the show really is about</p>]]></description><link>https://unstack.io/halt-and-catch-fire</link><guid isPermaLink="false">1</guid><dc:creator><![CDATA[Scott Robinson]]></dc:creator><pubDate>Fri, 15 May 2026 21:31:58 GMT</pubDate><content:encoded><![CDATA[<p>I have never watched the AMC show <em>Halt and Catch Fire</em>, and for a long time I only knew the title, but nothing about the show. Something about it always reminded me of programmer humor: somewhat dramatic, a little absurd, and weirdly precise. Turns out, the show really is about the computer industry in the 1980s and 1990s, but the phrase itself is much older than the show, and it started as some engineering humor.</p>
<h2 id="whatitmeans">What it means</h2>
<p>In the context of computers, <strong>Halt and Catch Fire</strong> (shortened to <strong>HCF</strong>) has been generalized to describe machine-code that causes the CPU to stop doing anything useful, forcing you to only recover by resetting (or power-cycling) the machine. In a pretty literal sense, it "halts" the machine. Sure, the "catch fire" part is a joke, but it's not as far-fetched as it might seem. Take the IBM System/360 for example. Apparently when this system would encounter a certain invalid opcode, it would constantly access a specific location in the magnetic core memory, which caused it to get very hot and even catch on fire.</p>
<p>Over time, <strong>HCF</strong> also became a catch-all label for undocumented or invalid opcodes that lock up the processor, intentional test modes that look like a hang, and real hardware bugs (you might even recall that some early Pentium-class chips could be locked up with a carefully chosen illegal instruction, known as the F00F bug - more on that later).</p>
<p>The phrase was created, in part, because of the standard of using three-letter assembly mnemonics: <code>ADD</code>, <code>CMP</code>, <code>JMP</code>, etc. The joke spread in various publications, including <strong>HCF</strong> alongside some other personal favorites of mine:</p>
<ul>
<li><code>EPI</code>: Execute Programmer Immediately</li>
<li><code>DC</code>: Divide and Conquer</li>
<li><code>CRN</code>: Convert to Roman Numerals</li>
</ul>
<h2 id="themotorola6800">The Motorola 6800</h2>
<p>So <strong>HCF</strong> was mostly just a joke, until it wasn't.</p>
<p>The Motorola 6800 has 256 single-byte opcodes, but not every bit pattern corresponds to a documented instruction. Hit the wrong one and the chip does whatever the silicon "decodes" into — sometimes nothing much, sometimes something significant.</p>
<p>Gerry Wheeler's <em>BYTE</em> piece <strong>"Undocumented M6800 Instructions"</strong> ran in <strong>December 1977</strong>, volume <strong>2</strong> number <strong>12</strong>, in the <strong>Technical Forum</strong> on <strong>pages 46–47</strong>. He starts from Motorola's own docs: <strong>197</strong> documented opcodes, which leaves <strong>59</strong> bit patterns unaccounted for in the official story. Some of those behave like NOPs, some change the condition-code register in patterns Wheeler said were still "undeciphered" at the time, and two bytes — <code>$9D</code> and <code>$DD</code> — share one especially nasty outcome he chose to call <strong>Halt and Catch Fire</strong>. He is explicit that "The mnemonics are, of course, assigned by me."</p>
<p>What actually happens, in hardware terms, is that the part stops behaving like a normal fetch–decode–execute engine: the program counter keeps advancing and the chip issues <em>reads</em> while the address lines march through memory like a hardware counter. Interrupts will not stop you from your path of self-destruction - you only get out of the loop with a reset or power cycle. Wheeler's own description is worth reading in the original, rather than paraphrasing:</p>
<blockquote>
<p>When this instruction is run the only way to see what it is doing is with an oscilloscope. From the user's point of view the machine halts and defies most attempts to get it restarted. Those persons with indicator lamps on the address bus will see that the processor begins to read all of the memory, sequentially, very quickly. In effect, the address bus turns into a 16 bit counter. However, the processor takes no notice of what it is reading... it just reads.</p>
</blockquote>
<p>On the "catch fire" half of the phrase, he adds, <em>"Well, almost."</em> While the IBM system did catch fire in cases, it seems that the Motorola 6800 did not.</p>
<p>Outside <em>BYTE</em>, the same opcode family picked up other nicknames. David J. Agans, in <em>Debugging</em> (2002), remembers <strong><code>DD</code></strong> as what his team called the <em>"Drop Dead"</em> instruction—same bus-walking trick, different name—and notes that engineers used it deliberately because <em>"all of the address and clock lines were nice, cycling square waves"</em> on a scope.</p>
<p>Most machines only <em>feel</em> like they hang. On at least one early 6800 microcomputer with finicky memory-mapped video, the pattern can show up as visible "snow". Ben Z's <a href="https://sphere.computer/news/2025-04-04-halt-and-catch-fire.html" target="_blank" rel="noopener noreferrer nofollow">Sphere News article</a> is a great rabbit hole to go down (video RAM arbitration, timing, CRT artifacts).</p>
<p>Years later, Motorola engineers wrote more about this same issue. In <em>IEEE Design &amp; Test</em> (1985), Daniels and Bruce describe an illegal opcode that customers found on the MC6800, internally nicknamed <strong>HACOF</strong>, where the program counter could increment forever until reset. They also tell of a detail that's almost hard to believe: product engineering wanted a fast way to scan RAM during bring-up, recognized this behavior already did something like that, and basically kept it instead of paying to remove it. So, in the words of Bob Ross, this turned out to be a "happy accident".</p>
<p>More recently, someone actually put a real MC6800 on hardware and actually measured the thing instead of just trusting scans of old magazines and Wikipedia pages. Doc TB's <a href="https://x86.fr/investigating-the-halt-and-catch-fire-instruction-on-motorola-6800/" target="_blank" rel="noopener noreferrer nofollow">lab write-up</a> notes an interesting detail: after the opcode is fetched, there is a delay on the order of tens of milliseconds before the address lines settle into the famous fast counting pattern, and there are other undocumented opcodes that look like slower or glitchier versions of the same idea.</p>
<h2 id="beyondmotorola">Beyond Motorola</h2>
<p>Motorola wasn't the only modern processor with this issue: illegal 6502 opcodes that lock the CPU, the Pentium <a href="https://en.wikipedia.org/wiki/Pentium_F00F_bug" target="_blank" rel="noopener noreferrer nofollow">F00F bug</a> (if you remember that era), pairs of instructions on some architectures that wait forever for an interrupt that cannot arrive, and modern x86 fuzzing talks where people still turn up invalid states in huge processors.</p>
<p>Basically, with fuzzing they're trying to set random or unexpected data to the processor to help identify vulnerabilities or bugs in the processor. Unsurpisingly, it's a pretty effective strategy, and not just for processors, but for all kinds of software as well.</p>
<h2 id="haltandendpost">Halt and end post</h2>
<p>This was a fun bit of history to research - and there turned out to be much more to it than I expected, even regarding the "catch fire" part. As a lot of software moves up the stack, it's easy to lose sight of the hardware from our 10,000 foot view. In the end, it's just a bunch of silicon wired together in a way that can sometimes go wrong.</p>
<p>All I know is that this phrase is too good to not use - expect a future project (or company) to use the "HCF" acronym.</p>
<hr>
<h2 id="sourcesandmoreinfo">Sources and more info</h2>
<p>To keep you busy, here are some links to the sources and more info:</p>
<ul>
<li><a href="https://archive.org/details/byte-magazine-1977-12/page/n47/mode/2up" target="_blank" rel="noopener noreferrer nofollow">Gerry Wheeler, "Undocumented M6800 Instructions," <em>BYTE</em> Dec 1977</a></li>
<li>David J. Agans, <em>Debugging: The Nine Indispensable Rules for Finding Even the Most Elusive Software and Hardware Problems</em> (AMA, 2002), p. 77</li>
<li><a href="https://sphere.computer/news/2025-04-04-halt-and-catch-fire.html" target="_blank" rel="noopener noreferrer nofollow">Ben Z, "Sphere News: Halt and Catch Fire!"</a></li>
<li><a href="https://retrocomputing.stackexchange.com/questions/15289/behavior-of-lesser-known-illegal-m6800-opcodes" target="_blank" rel="noopener noreferrer nofollow">RetroComputing SE #15289</a></li>
<li><a href="https://x86.fr/investigating-the-halt-and-catch-fire-instruction-on-motorola-6800/" target="_blank" rel="noopener noreferrer nofollow">Doc TB, "Investigating the HCF instruction on Motorola 6800"</a></li>
<li><a href="https://en.wikipedia.org/wiki/Halt_and_Catch_Fire_(computing)" target="_blank" rel="noopener noreferrer nofollow">Wikipedia: Halt and Catch Fire (computing)</a></li>
</ul>
]]></content:encoded></item></channel></rss>