<?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:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Woven Tools]]></title><description><![CDATA[A blog about structured debugging stuff]]></description><link>https://www.woven.tools</link><image><url>https://substackcdn.com/image/fetch/$s_!maZy!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ca9be59-025d-4b4f-af09-9950c2278de7_321x321.png</url><title>Woven Tools</title><link>https://www.woven.tools</link></image><generator>Substack</generator><lastBuildDate>Tue, 07 Apr 2026 21:18:22 GMT</lastBuildDate><atom:link href="https://www.woven.tools/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Miroslav Gavrilov]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[woventools@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[woventools@substack.com]]></itunes:email><itunes:name><![CDATA[Miroslav Gavrilov]]></itunes:name></itunes:owner><itunes:author><![CDATA[Miroslav Gavrilov]]></itunes:author><googleplay:owner><![CDATA[woventools@substack.com]]></googleplay:owner><googleplay:email><![CDATA[woventools@substack.com]]></googleplay:email><googleplay:author><![CDATA[Miroslav Gavrilov]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[On Contexts]]></title><description><![CDATA[Or, how I wish for a more explicit world.]]></description><link>https://www.woven.tools/p/on-contexts</link><guid isPermaLink="false">https://www.woven.tools/p/on-contexts</guid><dc:creator><![CDATA[Miroslav Gavrilov]]></dc:creator><pubDate>Sat, 30 Aug 2025 22:15:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xuqG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Consider a directed graph. Given a library with graph manipulation and traversal capabilities like <em><strong>weave</strong></em>, you can easily find in-and-out going arrows from a node (<code>arrows, arrows_in, arrows_out</code>) as well as use simple moves to get the source or target of arrows once you have them (<code>to_src, to_tgt</code>). Getting all the neighbors of a node amounts to <code>to_tgt(arrows_out(&#183;))</code>.</p><p>Imagine now that you want to work with an undirected graph. The setup made within <em><strong>weave</strong></em> is very digraph-oriented. In my experience, directedness is easier to <em>ignore</em> than to implement from a basis in undirected graphs. This leads us to the following questions: do we need to have a structural construction of a bidirectional arrow/undirected edge, or can the whole thing be made of different operations on a single, normal arrow, disregarding its direction and going the other way? It all depends on your situation in the end, but the change should be <em>given explicit context by the structure around it</em>.</p><p>In the example above, the bidirectional mints explored in previous entries convey our intent to have a sort of dual arrow that can be traversed in an endpoint-agnostic way that also supports normal arrow traversal. They aren't good for much more than exactly that. This structure, without any data (and remember that data is important because semantic systems query and operate on data!) operates to present the wanted semantics of an undirected edge. The operation used to traverse it (<code>hop</code>) is more widely applicable than the one for traversing arrows, so <em><strong>weave</strong></em> takes it as a ground truth, even though it&#8217;s one 1 primitive operation larger. If we instead focus on the solution where we just use raw dual operations on the arrows, we&#8217;re not supporting semantics through structure - we&#8217;re just <em>doing</em> things. Doing things is good, that&#8217;s what these posts are for the most part, but we need to solidify it somehow. With science!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xuqG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xuqG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xuqG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xuqG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xuqG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xuqG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg" width="640" height="556" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:556,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:209257,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.woven.tools/i/172306426?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xuqG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xuqG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xuqG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xuqG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3a2c3d8a-eed0-4f45-ba63-01d4f4fb8543_640x556.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Plato&#8217;s Allegory of the Cave felt cute right about here. We&#8217;re all of these people, every one of us.</figcaption></figure></div><p>A good first step after doing things is checking how general the behavior we&#8217;ve created is. Maybe it can be applied widely, maybe it can even be a new ground truth! If so, lift it up and let us all use it, that&#8217;s cool.</p><p>If not, create a named <strong>context</strong>. Contexts, although they still don&#8217;t exist in code, are all about named <em>executive</em> semantics - about how things are done when we <em>run</em> them.</p><p>For example, within your new <code>as_undirected_graph</code> context, <em>running</em> the functions <code>arrows_in</code>, <code>arrows_out</code>, and <code>arrows</code> returns the same set, as it ignores direction. This is what this context does to your execution. To have it affect things, it needs to be applied to a carrier structure, usually a hierarchy within which it will apply. Contexts allow interpretation, and a structured, limited, and explicit &#8220;reassignment&#8221; of ground rules.</p><p>Many ECS systems can be rewritten as contexts that execute their systemic code when some tag is added, for example. The first thing that came to mind is preparing a binary tree of operations and numbers within a hierarchy with an example <code>eval_arithmetic</code> context, and then attaching a &#8220;Calculate&#8221; tag which triggers the context to gobble up the tree and produce a single node. Having contexts be this wide and open allows for code lifting: taking what had to, until now, be written in code, and wrapping it in a couple of motifs, executed by an <code>uplifter</code> context.</p><p>If it isn't obvious, the idea of contexts fills me with joy. They solve many of the problems I initially had, such as the one that this post started with - contexts are usually marks added to a motif whose dependents now take peculiar shapes following peculiar rules, so they are in fact upheld by structure even though they themselves change algorithmics. Complex topics such as how to do transitive closures, operations with results, chaining of operations represented via motifs, requiring certain components to exist, as well as error reporting become easier once this tool is brought in. There&#8217;s a lot of open questions about the proper code introduction for contexts, which is mostly why they haven&#8217;t been coded up yet. I can already tell that contexts will change how most of weave works right now, meaning that they need to be bootstrapped somewhat recursively, a feat I'm not ready for yet. But we're getting there!</p>]]></content:encoded></item><item><title><![CDATA[On Duality]]></title><description><![CDATA[The other half of the universe come for free.]]></description><link>https://www.woven.tools/p/on-duality</link><guid isPermaLink="false">https://www.woven.tools/p/on-duality</guid><dc:creator><![CDATA[Miroslav Gavrilov]]></dc:creator><pubDate>Fri, 29 Aug 2025 13:14:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/41419160-9d66-4f00-b8de-25fe2e044362_570x520.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I've just finished writing the addendum to the previous post, including the bidirectional mint. I've spent around an hour in pure thought about the fact that the two arrows in that construction flows always into the nodes themselves. For reference, here&#8217;s the mint in question:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mn8x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e513055-a756-4663-b6a4-33dcb4a52890_701x161.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mn8x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e513055-a756-4663-b6a4-33dcb4a52890_701x161.png 424w, https://substackcdn.com/image/fetch/$s_!mn8x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e513055-a756-4663-b6a4-33dcb4a52890_701x161.png 848w, https://substackcdn.com/image/fetch/$s_!mn8x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e513055-a756-4663-b6a4-33dcb4a52890_701x161.png 1272w, https://substackcdn.com/image/fetch/$s_!mn8x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e513055-a756-4663-b6a4-33dcb4a52890_701x161.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mn8x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e513055-a756-4663-b6a4-33dcb4a52890_701x161.png" width="701" height="161" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e513055-a756-4663-b6a4-33dcb4a52890_701x161.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:161,&quot;width&quot;:701,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:10699,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172218139?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e513055-a756-4663-b6a4-33dcb4a52890_701x161.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mn8x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e513055-a756-4663-b6a4-33dcb4a52890_701x161.png 424w, https://substackcdn.com/image/fetch/$s_!mn8x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e513055-a756-4663-b6a4-33dcb4a52890_701x161.png 848w, https://substackcdn.com/image/fetch/$s_!mn8x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e513055-a756-4663-b6a4-33dcb4a52890_701x161.png 1272w, https://substackcdn.com/image/fetch/$s_!mn8x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e513055-a756-4663-b6a4-33dcb4a52890_701x161.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>This isn&#8217;t the most intuitive, as we might want to find out where we can flow <em>from </em>a or b, and not see this arrow at all. To mitigate that, I&#8217;ve thought about inverting the arrows, but for some reason feared that this somehow breaks the mint. But, <em><strong>weave </strong></em>takes a lot from category theory, and the idea of duality always producing something <em>correct </em>even if <em>useless</em> prevails, so let&#8217;s try it. Here&#8217;s the two constructions side by side:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g1vd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7dad66c-3cd5-4b79-9843-b583c9d39b0c_984x206.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g1vd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7dad66c-3cd5-4b79-9843-b583c9d39b0c_984x206.png 424w, https://substackcdn.com/image/fetch/$s_!g1vd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7dad66c-3cd5-4b79-9843-b583c9d39b0c_984x206.png 848w, https://substackcdn.com/image/fetch/$s_!g1vd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7dad66c-3cd5-4b79-9843-b583c9d39b0c_984x206.png 1272w, https://substackcdn.com/image/fetch/$s_!g1vd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7dad66c-3cd5-4b79-9843-b583c9d39b0c_984x206.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g1vd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7dad66c-3cd5-4b79-9843-b583c9d39b0c_984x206.png" width="984" height="206" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7dad66c-3cd5-4b79-9843-b583c9d39b0c_984x206.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:206,&quot;width&quot;:984,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:22947,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172218139?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7dad66c-3cd5-4b79-9843-b583c9d39b0c_984x206.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!g1vd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7dad66c-3cd5-4b79-9843-b583c9d39b0c_984x206.png 424w, https://substackcdn.com/image/fetch/$s_!g1vd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7dad66c-3cd5-4b79-9843-b583c9d39b0c_984x206.png 848w, https://substackcdn.com/image/fetch/$s_!g1vd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7dad66c-3cd5-4b79-9843-b583c9d39b0c_984x206.png 1272w, https://substackcdn.com/image/fetch/$s_!g1vd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7dad66c-3cd5-4b79-9843-b583c9d39b0c_984x206.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>Basically, every source and target relation is reversed, and the result is <em>familiar</em>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VWeu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f3e7e9-2f10-4984-a138-6aaa393a5939_482x120.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VWeu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f3e7e9-2f10-4984-a138-6aaa393a5939_482x120.png 424w, https://substackcdn.com/image/fetch/$s_!VWeu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f3e7e9-2f10-4984-a138-6aaa393a5939_482x120.png 848w, https://substackcdn.com/image/fetch/$s_!VWeu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f3e7e9-2f10-4984-a138-6aaa393a5939_482x120.png 1272w, https://substackcdn.com/image/fetch/$s_!VWeu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f3e7e9-2f10-4984-a138-6aaa393a5939_482x120.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VWeu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f3e7e9-2f10-4984-a138-6aaa393a5939_482x120.png" width="482" height="120" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3f3e7e9-2f10-4984-a138-6aaa393a5939_482x120.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:120,&quot;width&quot;:482,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5488,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172218139?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f3e7e9-2f10-4984-a138-6aaa393a5939_482x120.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VWeu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f3e7e9-2f10-4984-a138-6aaa393a5939_482x120.png 424w, https://substackcdn.com/image/fetch/$s_!VWeu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f3e7e9-2f10-4984-a138-6aaa393a5939_482x120.png 848w, https://substackcdn.com/image/fetch/$s_!VWeu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f3e7e9-2f10-4984-a138-6aaa393a5939_482x120.png 1272w, https://substackcdn.com/image/fetch/$s_!VWeu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3f3e7e9-2f10-4984-a138-6aaa393a5939_482x120.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>I confess that what we have here is more desirable-seeming than the original, if for no other reason, then for the fact that it&#8217;s a bit more welcoming for traversal <em>from</em> each end. The traversal itself is the mirror image of what we had before: this time, we take <code>src(tgt(arrows_out(&#183;)))</code> and it produces desirable results:</p><p><code>src(tgt(arrows_out(a)))<br>    = src(tgt([m]))<br>    = src([n])<br>    = [b]</code></p><p><code>src(tgt(arrows_out(b)))<br>    = src(tgt([n]))<br>    = src([m])<br>    = [a]</code></p><p>The dual identities peculiarity from before is upkept: the target of each of the arrows is the other arrow, but their sources are coming from outside. If we have a normal arrow <code>r = a &#8594; b</code>, assuming that <code>a</code> and <code>b</code> are knots, the following happens when we use this construction to traverse it:</p><p><code>src(tgt(arrows_out(a)))<br>    = src(tgt([r]))<br>    = src([b])<br>    = [b] &#10003;</code></p><p>This is, in a way, better than what we had with <code>hop</code> in the last post:</p><p><code>tgt(src(arrows_in(a)))<br>    = tgt(src([r]))<br>    = tgt([a])<br>    = [a] &#10005;</code></p><p>It turned out that <code>hop</code> isn&#8217;t good at traversing normal arrows, but this new <code>hop</code> is!</p><p>Duality is a fast way to see if there&#8217;s more to a space. Sometimes, it turns out that the dual space of an already useful concept is even more useful, just as it happened here. Not all dualities are obviously useful, but it&#8217;s a great exercise, especially for something like what we&#8217;re doing here: I feel like I only have a budding understanding of what&#8217;s better when comparing two concepts. Here&#8217;s what that feels like&#8230;</p><p>If given two entities A and B, assuming that they offer similar answers to the same questions, I&#8217;d say A is better if there&#8217;s a shorter path to the answers, and one that is algorithmically more conservative. Since we&#8217;re working with graphs, algorithmic complexity is a tense question, so sprewing up more structure instead of data helps. That&#8217;s why knots, which are informationally redundant, aren&#8217;t optimal: they show that we&#8217;re leaning too hard into algorithms, and <em><strong>weave</strong></em> sort of promises that it might be best to try a different route. There&#8217;s an adjacent topic to this regarding whether more structure is necessarily more space as opposed to more time, which I think is very hard and not at all obvious. You know it&#8217;s bad when the main argument for why not is &#8220;there&#8217;s this thing in physics called time crystals, I think we should look into them&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IkyD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffffaed41-e2a1-4d9e-bffd-a31f254a4030_570x520.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IkyD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffffaed41-e2a1-4d9e-bffd-a31f254a4030_570x520.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IkyD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffffaed41-e2a1-4d9e-bffd-a31f254a4030_570x520.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IkyD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffffaed41-e2a1-4d9e-bffd-a31f254a4030_570x520.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IkyD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffffaed41-e2a1-4d9e-bffd-a31f254a4030_570x520.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IkyD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffffaed41-e2a1-4d9e-bffd-a31f254a4030_570x520.jpeg" width="570" height="520" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fffaed41-e2a1-4d9e-bffd-a31f254a4030_570x520.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:520,&quot;width&quot;:570,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:51502,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.woven.tools/i/172218139?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffffaed41-e2a1-4d9e-bffd-a31f254a4030_570x520.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IkyD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffffaed41-e2a1-4d9e-bffd-a31f254a4030_570x520.jpeg 424w, https://substackcdn.com/image/fetch/$s_!IkyD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffffaed41-e2a1-4d9e-bffd-a31f254a4030_570x520.jpeg 848w, https://substackcdn.com/image/fetch/$s_!IkyD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffffaed41-e2a1-4d9e-bffd-a31f254a4030_570x520.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!IkyD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffffaed41-e2a1-4d9e-bffd-a31f254a4030_570x520.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Crochet dual Mobius strip fidget toys | by CatastropheCrochet</figcaption></figure></div><p></p>]]></content:encoded></item><item><title><![CDATA[Shapes and More Shapes]]></title><description><![CDATA[Even abstract topology can be messy.]]></description><link>https://www.woven.tools/p/shapes-and-more-shapes</link><guid isPermaLink="false">https://www.woven.tools/p/shapes-and-more-shapes</guid><dc:creator><![CDATA[Miroslav Gavrilov]]></dc:creator><pubDate>Thu, 28 Aug 2025 20:38:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!maZy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ca9be59-025d-4b4f-af09-9950c2278de7_321x321.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In <em><strong>weave</strong></em>, we have entities which are defined by three numbers: an <em>id, src, </em>and<em> tgt</em>. We've previously shown how the choice of source and target redefines the shape of the entity, allowing for building different structures and patterns of behaviors. But what if I told you that they introduce a whole new class of possible shapes, specifically stable self-recursive structures?</p><p>Let&#8217;s start with a familiar duo:</p><p><code>a = a &#8594; a,<br>b = a &#8594; b</code></p><p>We have one knot and one tether growing off of it. If we now mutate the knot&#8217;s target&#8230;</p><p><code>tgt(a) = b</code></p><p>we get a pretty unique thing:</p><p><code>a = a &#8594; b,<br>b = a &#8594; b.</code></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A6ZZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ac73a6-2a64-40fd-85c9-d57c85ec8532_449x264.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A6ZZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ac73a6-2a64-40fd-85c9-d57c85ec8532_449x264.png 424w, https://substackcdn.com/image/fetch/$s_!A6ZZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ac73a6-2a64-40fd-85c9-d57c85ec8532_449x264.png 848w, https://substackcdn.com/image/fetch/$s_!A6ZZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ac73a6-2a64-40fd-85c9-d57c85ec8532_449x264.png 1272w, https://substackcdn.com/image/fetch/$s_!A6ZZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ac73a6-2a64-40fd-85c9-d57c85ec8532_449x264.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A6ZZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ac73a6-2a64-40fd-85c9-d57c85ec8532_449x264.png" width="449" height="264" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90ac73a6-2a64-40fd-85c9-d57c85ec8532_449x264.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:264,&quot;width&quot;:449,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12557,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172151921?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ac73a6-2a64-40fd-85c9-d57c85ec8532_449x264.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A6ZZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ac73a6-2a64-40fd-85c9-d57c85ec8532_449x264.png 424w, https://substackcdn.com/image/fetch/$s_!A6ZZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ac73a6-2a64-40fd-85c9-d57c85ec8532_449x264.png 848w, https://substackcdn.com/image/fetch/$s_!A6ZZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ac73a6-2a64-40fd-85c9-d57c85ec8532_449x264.png 1272w, https://substackcdn.com/image/fetch/$s_!A6ZZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90ac73a6-2a64-40fd-85c9-d57c85ec8532_449x264.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;ve chosen this one to be the woven tools logo because it was just that cool. These two entities are now codependent and have the same source and target as each other. For all intents and purposes, a mark and a tether shouldn&#8217;t be able to link in such a way, and yet here we are!</p><p>So what <em>is </em>this? I don&#8217;t honestly know, but it&#8217;s a good basis for a linked-list, with the new elements inserted as marks at the end of the red arrow and pointing towards <code>b</code>, while the blue arrow remains a quick way to reach the end of the list. This might just be my style but I&#8217;d also like one external arrow <code>L = a &#8594; b</code>, so that we&#8217;d have a singular entry point to this structure. Passing <code>L</code> around is easy, its source is the sentinel at the start of the list, and its target the sentinel at the end.</p><p>We can similarly turn the source around using <code>src(a) = b</code>, creating this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2g-b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe295a9c9-92a2-4e99-bec6-0e150197d536_441x258.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2g-b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe295a9c9-92a2-4e99-bec6-0e150197d536_441x258.png 424w, https://substackcdn.com/image/fetch/$s_!2g-b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe295a9c9-92a2-4e99-bec6-0e150197d536_441x258.png 848w, https://substackcdn.com/image/fetch/$s_!2g-b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe295a9c9-92a2-4e99-bec6-0e150197d536_441x258.png 1272w, https://substackcdn.com/image/fetch/$s_!2g-b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe295a9c9-92a2-4e99-bec6-0e150197d536_441x258.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2g-b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe295a9c9-92a2-4e99-bec6-0e150197d536_441x258.png" width="441" height="258" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e295a9c9-92a2-4e99-bec6-0e150197d536_441x258.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:258,&quot;width&quot;:441,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12083,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172151921?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe295a9c9-92a2-4e99-bec6-0e150197d536_441x258.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2g-b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe295a9c9-92a2-4e99-bec6-0e150197d536_441x258.png 424w, https://substackcdn.com/image/fetch/$s_!2g-b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe295a9c9-92a2-4e99-bec6-0e150197d536_441x258.png 848w, https://substackcdn.com/image/fetch/$s_!2g-b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe295a9c9-92a2-4e99-bec6-0e150197d536_441x258.png 1272w, https://substackcdn.com/image/fetch/$s_!2g-b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe295a9c9-92a2-4e99-bec6-0e150197d536_441x258.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There&#8217;s a cool space for shapes like these for dealing with equality classes, I think, although I yet need to explore it more thoroughly.</p><p>The original four shapes <em><strong>weave</strong></em> introduced &#8212; knot, arrow, mark, and tether &#8212; are called <strong>motifs</strong>. Motifs lived alone for a really long time. Years, in fact. These stable self-recursive structures are only days old in comparison, and I don't even know how many there are, in comparison. They seem super useful even in their infancy and I asked my friend, Darinka Zobenica, who I keep pestering with these things, to come up with a name for these self-referential thingies she noticed. She came up with <strong>mints</strong> and it stuck! I think mints are a stroke or genius on her part and pure good luck on mine, to have bothered her with this topic.</p><h2>A much greater wealth of shape</h2><p>Mints are an indicator, for me. A canary in a coal mine, the imprint of the rigidity of my own baby steps into this domain. The combinatorics of identity, source, and target delivered motifs and in isolation, these <strong>are</strong> the building blocks of these identity relations. However, in many cases, the minimal form of a pattern doesn't deal with the <em>nothingness</em> that a knot represents. I almost feel that knots, even though we're used to thinking of them as graph nodes, are just stepping stones or prototype-entities that can be there to give us some time and material to mold them into something more useful.</p><p>There&#8217;s a strange calculus behind what&#8217;s &#8220;useful&#8221; in <em><strong>weave</strong></em>, however. For one, there&#8217;s a certain &#8220;goodness&#8221; in direct source-to-target traversals. What I mean by this is more visible in an image. Compare these two scenarios:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qPQM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65cfac9-e70d-43b2-845a-5362fdd8433d_1063x468.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qPQM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65cfac9-e70d-43b2-845a-5362fdd8433d_1063x468.png 424w, https://substackcdn.com/image/fetch/$s_!qPQM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65cfac9-e70d-43b2-845a-5362fdd8433d_1063x468.png 848w, https://substackcdn.com/image/fetch/$s_!qPQM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65cfac9-e70d-43b2-845a-5362fdd8433d_1063x468.png 1272w, https://substackcdn.com/image/fetch/$s_!qPQM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65cfac9-e70d-43b2-845a-5362fdd8433d_1063x468.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qPQM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65cfac9-e70d-43b2-845a-5362fdd8433d_1063x468.png" width="1063" height="468" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d65cfac9-e70d-43b2-845a-5362fdd8433d_1063x468.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:468,&quot;width&quot;:1063,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:41268,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.woven.tools/i/172151921?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65cfac9-e70d-43b2-845a-5362fdd8433d_1063x468.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qPQM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65cfac9-e70d-43b2-845a-5362fdd8433d_1063x468.png 424w, https://substackcdn.com/image/fetch/$s_!qPQM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65cfac9-e70d-43b2-845a-5362fdd8433d_1063x468.png 848w, https://substackcdn.com/image/fetch/$s_!qPQM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65cfac9-e70d-43b2-845a-5362fdd8433d_1063x468.png 1272w, https://substackcdn.com/image/fetch/$s_!qPQM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd65cfac9-e70d-43b2-845a-5362fdd8433d_1063x468.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Above, we have a standard knot-arrow-knot system we&#8217;re used to for making graphs. If we want to traverse this starting from the left, we can&#8217;t just <em>follow</em> a to its target &#8212; the target of a knot is itself! So the traversal of the above graph would be stuck there on the left for a <em>really </em>long time. To get to the arrow, we need to go outside the <code>a</code> entity and into the storage of sources and targets, looking for <em>any entity </em><code>t</code> <em>such that</em> <code>src(t) = a</code>. This isn&#8217;t a huge operation if implemented as it is in weave - we&#8217;re using a bit of extra space to keep every dependency hashed, so that we don&#8217;t have to go through the whole storage, but it still feels like a chore.</p><p>Compare it to the second scenario: if we trace x to its target, we end up with y. if we trace <em>that</em> to its target, we end up with z, and are now stuck here. We&#8217;ve just traversed the whole thing left to right. This lovely power of transitivite flow is only lessened by the fact that you need to keep it simple with structures like this: because the flow is a part of the definition, each and every one of these pieces is uniquely and fully defined. We can&#8217;t attach new arrows here, we can&#8217;t have multiple paths. It almost seems inviting: maybe we shouldn&#8217;t be looking at weave at this low-level but rather one step above where the shape will automatically optimize itself if it recognizes there&#8217;s no need to do a more demanding operation, and deoptimize itself in case one is needed. There might be an optimal usage for knots outside of proto-entities, but given that mints are a good replacement that guarantees cascading deletion, I think they won&#8217;t show up much except for <em>boundary objects</em> - objects that are to be sent across especially agressive boundaries that don&#8217;t share structure well (between languages, processes, etc.)</p><p>Scenario two here is very interesting because it&#8217;s similarly self-referential as the mints above, but looks more &#8220;normal&#8221;. Both endpoints depend on the arrow in at least one of their endpoints, and the arrow uses both of them. To construct this, we have to go with:</p><p><code>x = x &#8594; x<br>z = z &#8594; z<br>y = x &#8594; z<br>tgt(x) = y<br>src(z) = y</code></p><p>In a way, this mutation is similar to lazy evaluation, which might be a larger and more important topic to talk about: another way to do this is to <em>declare</em> but lazily <em>define</em> pieces of the structure, like so:</p><p><code>exists x, z<br>y = x &#8594; z<br>x = x &#8594; y<br>z = y &#8594; z</code></p><p>If a language a bit higher up than <em><strong>weave</strong></em> would want to implement this, it would be trivial: simply make knots and allow full redefinitions to reuse the same entities. There&#8217;s probably a lot of material about the connection and possible equivalence between mutability and laziness, given that they&#8217;re opposing forces in imperative and functional languages, both of which are of the same expressive strength. I find it interesting that denying <em>both </em>of these makes a whole set of interesting and seemingly important structures be non-constructable&#8230; More research required.</p><h2>How about bidirectional arrows?</h2><p>Having mints that look like inwards made me think about the opposite: could we have something that closely resembles a bidirectional arrow? We could ever interpret it as a non-directed edge! This is a case where the math checks out, but I&#8217;m having a <em>very</em> hard time drawing this peculiar mint. Here&#8217;s my thinking:</p><p>Given some two entities <code>a</code> and <code>b</code> (we won&#8217;t ask that they be knots or something else), we start off making marks towards both of them:</p><p><code>m = m &#8594; a<br>n = n &#8594; b</code></p><p>Now, we change the sources of both arrows with <em>the other </em>one:</p><p><code>src(n) = m<br>src(m) = n</code></p><p>The current state of things speaks of two arrows, <code>m = n &#8594; a</code> and <code>n = m &#8594; b</code>, and this is, for sure, a mint, and one I can&#8217;t seem to draw&#8230; maybe something like this?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-tHL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45e1809e-8fd7-4761-8e82-cc35c318d761_657x129.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-tHL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45e1809e-8fd7-4761-8e82-cc35c318d761_657x129.png 424w, https://substackcdn.com/image/fetch/$s_!-tHL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45e1809e-8fd7-4761-8e82-cc35c318d761_657x129.png 848w, https://substackcdn.com/image/fetch/$s_!-tHL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45e1809e-8fd7-4761-8e82-cc35c318d761_657x129.png 1272w, https://substackcdn.com/image/fetch/$s_!-tHL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45e1809e-8fd7-4761-8e82-cc35c318d761_657x129.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-tHL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45e1809e-8fd7-4761-8e82-cc35c318d761_657x129.png" width="657" height="129" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/45e1809e-8fd7-4761-8e82-cc35c318d761_657x129.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:129,&quot;width&quot;:657,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9050,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.woven.tools/i/172151921?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45e1809e-8fd7-4761-8e82-cc35c318d761_657x129.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-tHL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45e1809e-8fd7-4761-8e82-cc35c318d761_657x129.png 424w, https://substackcdn.com/image/fetch/$s_!-tHL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45e1809e-8fd7-4761-8e82-cc35c318d761_657x129.png 848w, https://substackcdn.com/image/fetch/$s_!-tHL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45e1809e-8fd7-4761-8e82-cc35c318d761_657x129.png 1272w, https://substackcdn.com/image/fetch/$s_!-tHL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F45e1809e-8fd7-4761-8e82-cc35c318d761_657x129.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">The labels <code>m</code> and <code>n</code> are standing above their respective selves</figcaption></figure></div><p>It <em>still </em>feels off, but it works. If you want to go from one end to the other, the action is as follows: if you start from an entity <code>X</code> and execute <code>tgt(src(arrows_in(X)))</code>, you&#8217;ll end up on the other end! Here&#8217;s a sanity check:</p><p><code>tgt(src(arrows_in(a)))<br>    = tgt(src([m]))<br>    = tgt([n])<br>    = [b]</code></p><p><code>tgt(src(arrows_in(b)))<br>    = tgt(src([n]))<br>    = tgt([m])<br>    = [a]</code></p><p>Don&#8217;t mind the array-notation, weave explicitly tries to always expect that functions might return a whole array of things. This makes it easy to do closures, but also puts healthy pressure on the user to choose their own filters to get a single entity back if needed. I wonder what happens if we apply this to a normal arrow, let&#8217;s say <code>z = x &#8594; y</code>. Assuming nothing about <code>x</code> and <code>y</code>, we get:</p><p><code>tgt(src(arrows_in(x)))<br>    = tgt(src([z]))<br>    = tgt([x])</code></p><p>This is the last moment where we can assume nothing about <code>x</code>. If it were a knot or a tether, the result would be <code>tgt(src(arrows_in(x))) = [x]</code>, meaning that this operation is at most an identity (and lift into an array). If it&#8217;s something else, then we&#8217;re pulled into whatever that other end is, usually the tail-end of a mark or arrow.</p><p>You&#8217;ve just seen the process of reifying new <em><strong>weave</strong></em> functionalities: it&#8217;s tiresome typing out <code>tgt(src(arrows_in(&#183;))) </code>so we might just call it something like <code>hop</code> and call it a day! With <code>hop</code> and the <code>biarrow</code> mint above, we&#8217;ve potentially overengineered an easier solution, which is a <code>biarrow</code> complex construction such as:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!egds!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7fd72d-e9fa-4639-bc0e-8ccb81fe4f45_827x136.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!egds!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7fd72d-e9fa-4639-bc0e-8ccb81fe4f45_827x136.png 424w, https://substackcdn.com/image/fetch/$s_!egds!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7fd72d-e9fa-4639-bc0e-8ccb81fe4f45_827x136.png 848w, https://substackcdn.com/image/fetch/$s_!egds!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7fd72d-e9fa-4639-bc0e-8ccb81fe4f45_827x136.png 1272w, https://substackcdn.com/image/fetch/$s_!egds!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7fd72d-e9fa-4639-bc0e-8ccb81fe4f45_827x136.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!egds!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7fd72d-e9fa-4639-bc0e-8ccb81fe4f45_827x136.png" width="827" height="136" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea7fd72d-e9fa-4639-bc0e-8ccb81fe4f45_827x136.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:136,&quot;width&quot;:827,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8908,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.woven.tools/i/172151921?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7fd72d-e9fa-4639-bc0e-8ccb81fe4f45_827x136.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!egds!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7fd72d-e9fa-4639-bc0e-8ccb81fe4f45_827x136.png 424w, https://substackcdn.com/image/fetch/$s_!egds!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7fd72d-e9fa-4639-bc0e-8ccb81fe4f45_827x136.png 848w, https://substackcdn.com/image/fetch/$s_!egds!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7fd72d-e9fa-4639-bc0e-8ccb81fe4f45_827x136.png 1272w, https://substackcdn.com/image/fetch/$s_!egds!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea7fd72d-e9fa-4639-bc0e-8ccb81fe4f45_827x136.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The problem with this is that <code>m</code> and <code>n</code> are <em>separate</em> except through their endpoints. We could tie them with an arrow <code>h = m &#8594; n</code> or similar and pass that around, sure, but that would imply a direction between the two (equal) directions, which feels like a hack.</p><p>I like that the mint construction somewhat lost its sense of self while keeping it fully recoverable. Here&#8217;s what I mean:</p><p><code>other_dir(&#183;) = src(&#183;)</code></p><p>If we pass along <code>m</code>,<code> other_dir(m) = n</code>, and vice versa. Those are dual <em>identities</em>, they are both the source of each other, and both their targets are different! That&#8217;s enough to convince me that this is the way to go. We basically took two arrows and tied them together by their sources.</p><p>We&#8217;ll be adding this precious mint to the <code>shape</code> module, and <code>hop</code> to the traverse module soon, and who knows how essential it might be in the future.</p>]]></content:encoded></item><item><title><![CDATA[Finite-State Machines]]></title><description><![CDATA[An example of a shape-generic data structure]]></description><link>https://www.woven.tools/p/finite-state-machines</link><guid isPermaLink="false">https://www.woven.tools/p/finite-state-machines</guid><dc:creator><![CDATA[Miroslav Gavrilov]]></dc:creator><pubDate>Thu, 28 Aug 2025 00:18:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gCZ4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>My involvement and interest with <em><strong>weave</strong></em> starts with finite-state machines. As a game developer, this is one of the most useful patterns out there. Most of what games <em>are</em> is overlapping and fine-tuned, synchronized finite-state machines. And yet, it&#8217;s quite hard to properly implement a FSM within a 13-week school course for some reason. The idea is just <em>a bit</em> too abstract, first in concept, and then in execution. Interestingly, any instance of a FSM is quite simple and can be hard-coded quickly. The proper abstraction, it seems, is playing hard to get.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gCZ4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gCZ4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png 424w, https://substackcdn.com/image/fetch/$s_!gCZ4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png 848w, https://substackcdn.com/image/fetch/$s_!gCZ4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png 1272w, https://substackcdn.com/image/fetch/$s_!gCZ4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gCZ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png" width="1040" height="667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:667,&quot;width&quot;:1040,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:162638,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172127558?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gCZ4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png 424w, https://substackcdn.com/image/fetch/$s_!gCZ4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png 848w, https://substackcdn.com/image/fetch/$s_!gCZ4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png 1272w, https://substackcdn.com/image/fetch/$s_!gCZ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db8b97b-7cb5-4a53-93ad-9f48ca39aa32_1040x667.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Every student of game development knows this image | <a href="https://gameprogrammingpatterns.com/state.html">game programming patterns</a></figcaption></figure></div><p>So, first, what&#8217;s an FSM, outside of our models? It&#8217;s a graph where every node is a <strong>state</strong> in which the &#8220;machine&#8221; can be in, and the directed edges are available <strong>transitions </strong>between those states. FSMs introduce some special terminology: we have a <strong>current state</strong>, which is where the machine is at the current moment, and a <strong>starting state</strong> which is the one that the current state will initialize to when the FSM is made. In a way, the whole operational semantics of a FSM consists of moving over several values in a constrained way: to implement this, you need an enum and several ifs. It&#8217;s easy to see why any specific version is <em>simple</em>.</p><p>The semantics of a FSM has its source in the starting state and, at any given point, leads to the current state, which is constrained to the set of states we begin with.</p><p>Here&#8217;s a <em><strong>weave</strong></em>-centric way to build a FSM. Let&#8217;s say I expect a <strong>standard graph</strong> from the user. This is usually passed through to the FSM as a hoisted graph: a single knot with hoisted arrows to all the states. This format is what we do for many of the other functions that require a custom graph, but in this case we can use the fact that the internals of a FSM have more strict expectations: we <em>want</em> our states to be a finite set, uniquely owned by the graph. We therefore can ask for a single <strong>knot</strong> with all the states represented via <strong>tethers</strong> to that knot.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sTZl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3292146-2442-453a-bbb9-ed46c207cfd5_714x406.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sTZl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3292146-2442-453a-bbb9-ed46c207cfd5_714x406.png 424w, https://substackcdn.com/image/fetch/$s_!sTZl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3292146-2442-453a-bbb9-ed46c207cfd5_714x406.png 848w, https://substackcdn.com/image/fetch/$s_!sTZl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3292146-2442-453a-bbb9-ed46c207cfd5_714x406.png 1272w, https://substackcdn.com/image/fetch/$s_!sTZl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3292146-2442-453a-bbb9-ed46c207cfd5_714x406.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sTZl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3292146-2442-453a-bbb9-ed46c207cfd5_714x406.png" width="714" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e3292146-2442-453a-bbb9-ed46c207cfd5_714x406.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:714,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28003,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172127558?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3292146-2442-453a-bbb9-ed46c207cfd5_714x406.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sTZl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3292146-2442-453a-bbb9-ed46c207cfd5_714x406.png 424w, https://substackcdn.com/image/fetch/$s_!sTZl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3292146-2442-453a-bbb9-ed46c207cfd5_714x406.png 848w, https://substackcdn.com/image/fetch/$s_!sTZl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3292146-2442-453a-bbb9-ed46c207cfd5_714x406.png 1272w, https://substackcdn.com/image/fetch/$s_!sTZl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3292146-2442-453a-bbb9-ed46c207cfd5_714x406.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The above FSM described as a knot with tethers and arrows. No components are added, and no names given at this point.</figcaption></figure></div><p>It&#8217;s worthwhile saying that the transformation of a standard hoisted graph <code>G</code> into a uniquely owned knot-tether graph is quite straight-forward and consists of taking the graph, going <code>down</code> the hoist to the member knots, making all of their sources be <code>G</code>, and then <code>unhoist</code>ing them. All of these are standard <em><strong>weave</strong></em> functions, meaning that this operation is basically a one-liner. We can add checks to see whether any of the knots has multiple hoists leading to it, as we should quit early in these cases.</p><h2>The Past and Present State</h2><p>We&#8217;re currently taking care of the shape of the graph successfully, but we knew that we can draw a graph in <em><strong>weave</strong></em>. The question is what we can do with state and transitions. Initially, I found it very clear cut: we can just have a <strong>mark</strong> point to the current state, and one more to the starting state. The problem, however, isn&#8217;t in what we can<em> do</em> but rather how we can reach it at runtime. Starting with the top knot <code>G</code>, what do we have to do to get to the start state and the current state?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JiVU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4485b-61b8-4994-88da-67d559e4ddfe_569x364.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JiVU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4485b-61b8-4994-88da-67d559e4ddfe_569x364.png 424w, https://substackcdn.com/image/fetch/$s_!JiVU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4485b-61b8-4994-88da-67d559e4ddfe_569x364.png 848w, https://substackcdn.com/image/fetch/$s_!JiVU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4485b-61b8-4994-88da-67d559e4ddfe_569x364.png 1272w, https://substackcdn.com/image/fetch/$s_!JiVU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4485b-61b8-4994-88da-67d559e4ddfe_569x364.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JiVU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4485b-61b8-4994-88da-67d559e4ddfe_569x364.png" width="569" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ea4485b-61b8-4994-88da-67d559e4ddfe_569x364.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:569,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:27780,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172127558?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4485b-61b8-4994-88da-67d559e4ddfe_569x364.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JiVU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4485b-61b8-4994-88da-67d559e4ddfe_569x364.png 424w, https://substackcdn.com/image/fetch/$s_!JiVU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4485b-61b8-4994-88da-67d559e4ddfe_569x364.png 848w, https://substackcdn.com/image/fetch/$s_!JiVU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4485b-61b8-4994-88da-67d559e4ddfe_569x364.png 1272w, https://substackcdn.com/image/fetch/$s_!JiVU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4485b-61b8-4994-88da-67d559e4ddfe_569x364.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We could have these two be named arrows (arrows with some tag component) that lead to the states, for example. We could get to the current state by getting <code>G</code> and then asking for all arrows out, filtering out the one we want by component and getting the target of the arrow. In this regard, it seems start and current are isomorphic: the only difference in what <em>data </em>we set on them. Whenever I get to the point of things being equal up to <em>data</em> isomorphism, I know that we can <em><strong>weave</strong></em> further. For instance, let&#8217;s look at things <em>functionally</em>. The starting node should be the source of the state machine, we said previously, half in gross generalization and mid-hand-wave. But what if it was? What if instead of two arrows, we use the fact that the main knot <code>G = G &#8594; G</code> is&#8230; useless. What if we were to <code>src(G) = start_node</code>?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8fR2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe186420e-2521-4728-a3df-0e9aaf8ea721_548x384.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8fR2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe186420e-2521-4728-a3df-0e9aaf8ea721_548x384.png 424w, https://substackcdn.com/image/fetch/$s_!8fR2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe186420e-2521-4728-a3df-0e9aaf8ea721_548x384.png 848w, https://substackcdn.com/image/fetch/$s_!8fR2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe186420e-2521-4728-a3df-0e9aaf8ea721_548x384.png 1272w, https://substackcdn.com/image/fetch/$s_!8fR2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe186420e-2521-4728-a3df-0e9aaf8ea721_548x384.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8fR2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe186420e-2521-4728-a3df-0e9aaf8ea721_548x384.png" width="548" height="384" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e186420e-2521-4728-a3df-0e9aaf8ea721_548x384.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:384,&quot;width&quot;:548,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:25842,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172127558?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe186420e-2521-4728-a3df-0e9aaf8ea721_548x384.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8fR2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe186420e-2521-4728-a3df-0e9aaf8ea721_548x384.png 424w, https://substackcdn.com/image/fetch/$s_!8fR2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe186420e-2521-4728-a3df-0e9aaf8ea721_548x384.png 848w, https://substackcdn.com/image/fetch/$s_!8fR2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe186420e-2521-4728-a3df-0e9aaf8ea721_548x384.png 1272w, https://substackcdn.com/image/fetch/$s_!8fR2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe186420e-2521-4728-a3df-0e9aaf8ea721_548x384.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The main node <code>G</code> is now technically <strong>a tether of the starting state</strong>! Now, where does the FSM lead to? Well, our target always is to know in which state it currently is. So, what if we set <code>tgt(G) = current_node</code>? Let&#8217;s draw that first, without the image above, just to show off the idea:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!svGq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd21bd0-aa10-4ab1-be57-2a77e0b19317_570x415.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!svGq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd21bd0-aa10-4ab1-be57-2a77e0b19317_570x415.png 424w, https://substackcdn.com/image/fetch/$s_!svGq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd21bd0-aa10-4ab1-be57-2a77e0b19317_570x415.png 848w, https://substackcdn.com/image/fetch/$s_!svGq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd21bd0-aa10-4ab1-be57-2a77e0b19317_570x415.png 1272w, https://substackcdn.com/image/fetch/$s_!svGq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd21bd0-aa10-4ab1-be57-2a77e0b19317_570x415.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!svGq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd21bd0-aa10-4ab1-be57-2a77e0b19317_570x415.png" width="570" height="415" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1dd21bd0-aa10-4ab1-be57-2a77e0b19317_570x415.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:415,&quot;width&quot;:570,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26212,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172127558?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd21bd0-aa10-4ab1-be57-2a77e0b19317_570x415.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!svGq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd21bd0-aa10-4ab1-be57-2a77e0b19317_570x415.png 424w, https://substackcdn.com/image/fetch/$s_!svGq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd21bd0-aa10-4ab1-be57-2a77e0b19317_570x415.png 848w, https://substackcdn.com/image/fetch/$s_!svGq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd21bd0-aa10-4ab1-be57-2a77e0b19317_570x415.png 1272w, https://substackcdn.com/image/fetch/$s_!svGq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1dd21bd0-aa10-4ab1-be57-2a77e0b19317_570x415.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now, <code>G</code> is a <strong>mark of the current state</strong>. It is defined by its relation to this state in a way that allows us to always flow <em>into</em> it. Combining the two, we get a peculiar effect:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IfMD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193b3317-4839-44b5-8577-3f72358990f2_552x399.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IfMD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193b3317-4839-44b5-8577-3f72358990f2_552x399.png 424w, https://substackcdn.com/image/fetch/$s_!IfMD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193b3317-4839-44b5-8577-3f72358990f2_552x399.png 848w, https://substackcdn.com/image/fetch/$s_!IfMD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193b3317-4839-44b5-8577-3f72358990f2_552x399.png 1272w, https://substackcdn.com/image/fetch/$s_!IfMD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193b3317-4839-44b5-8577-3f72358990f2_552x399.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IfMD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193b3317-4839-44b5-8577-3f72358990f2_552x399.png" width="552" height="399" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/193b3317-4839-44b5-8577-3f72358990f2_552x399.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:399,&quot;width&quot;:552,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26754,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172127558?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193b3317-4839-44b5-8577-3f72358990f2_552x399.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IfMD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193b3317-4839-44b5-8577-3f72358990f2_552x399.png 424w, https://substackcdn.com/image/fetch/$s_!IfMD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193b3317-4839-44b5-8577-3f72358990f2_552x399.png 848w, https://substackcdn.com/image/fetch/$s_!IfMD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193b3317-4839-44b5-8577-3f72358990f2_552x399.png 1272w, https://substackcdn.com/image/fetch/$s_!IfMD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F193b3317-4839-44b5-8577-3f72358990f2_552x399.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The source of <code>G</code> is the start state, the target of <code>G</code> is the current state. I&#8217;m doing you a courtesy by drawing the faint circle at the top but the truth is: the circle <em>isn&#8217;t</em> there. The entity <code>G = start_node &#8594; current_node</code> is no knot at all, nor mark, nor tether anymore. It&#8217;s an arrow!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f2IZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26d9a4cb-3b7d-4bf5-a4d4-0aa8cf6300d0_567x383.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f2IZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26d9a4cb-3b7d-4bf5-a4d4-0aa8cf6300d0_567x383.png 424w, https://substackcdn.com/image/fetch/$s_!f2IZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26d9a4cb-3b7d-4bf5-a4d4-0aa8cf6300d0_567x383.png 848w, https://substackcdn.com/image/fetch/$s_!f2IZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26d9a4cb-3b7d-4bf5-a4d4-0aa8cf6300d0_567x383.png 1272w, https://substackcdn.com/image/fetch/$s_!f2IZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26d9a4cb-3b7d-4bf5-a4d4-0aa8cf6300d0_567x383.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f2IZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26d9a4cb-3b7d-4bf5-a4d4-0aa8cf6300d0_567x383.png" width="567" height="383" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/26d9a4cb-3b7d-4bf5-a4d4-0aa8cf6300d0_567x383.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:383,&quot;width&quot;:567,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:25560,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172127558?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26d9a4cb-3b7d-4bf5-a4d4-0aa8cf6300d0_567x383.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!f2IZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26d9a4cb-3b7d-4bf5-a4d4-0aa8cf6300d0_567x383.png 424w, https://substackcdn.com/image/fetch/$s_!f2IZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26d9a4cb-3b7d-4bf5-a4d4-0aa8cf6300d0_567x383.png 848w, https://substackcdn.com/image/fetch/$s_!f2IZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26d9a4cb-3b7d-4bf5-a4d4-0aa8cf6300d0_567x383.png 1272w, https://substackcdn.com/image/fetch/$s_!f2IZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F26d9a4cb-3b7d-4bf5-a4d4-0aa8cf6300d0_567x383.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The <em>pattern</em> that emerges from a FSM seems to be an arrow that keeps its source in the starting node (which allows us to easily reset it too by saying <code>tgt(G) = src(G)</code>) and moving its target around only where the thing that it points to can move.</p><h2>The actual moving around</h2><p>The implementation of moving around the FSM requires components, albeit in a very simple way. When we want to move, we find the set of <code>arrows_out</code> of <code>tgt(G)</code>. We filter that small set by the virtue of them having a certain component we&#8217;re looking for, finding the one arrow we need (and doing nothing if there&#8217;s none, or even if there&#8217;s more than one), and then searching for it&#8217;s target and setting <code>tgt(G) = tgt(transition)</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!773D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97ef9e4a-71eb-4a5b-840c-24bca5b9fe86_632x349.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!773D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97ef9e4a-71eb-4a5b-840c-24bca5b9fe86_632x349.png 424w, https://substackcdn.com/image/fetch/$s_!773D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97ef9e4a-71eb-4a5b-840c-24bca5b9fe86_632x349.png 848w, https://substackcdn.com/image/fetch/$s_!773D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97ef9e4a-71eb-4a5b-840c-24bca5b9fe86_632x349.png 1272w, https://substackcdn.com/image/fetch/$s_!773D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97ef9e4a-71eb-4a5b-840c-24bca5b9fe86_632x349.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!773D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97ef9e4a-71eb-4a5b-840c-24bca5b9fe86_632x349.png" width="632" height="349" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/97ef9e4a-71eb-4a5b-840c-24bca5b9fe86_632x349.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:349,&quot;width&quot;:632,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:25811,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172127558?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97ef9e4a-71eb-4a5b-840c-24bca5b9fe86_632x349.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!773D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97ef9e4a-71eb-4a5b-840c-24bca5b9fe86_632x349.png 424w, https://substackcdn.com/image/fetch/$s_!773D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97ef9e4a-71eb-4a5b-840c-24bca5b9fe86_632x349.png 848w, https://substackcdn.com/image/fetch/$s_!773D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97ef9e4a-71eb-4a5b-840c-24bca5b9fe86_632x349.png 1272w, https://substackcdn.com/image/fetch/$s_!773D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F97ef9e4a-71eb-4a5b-840c-24bca5b9fe86_632x349.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s important to remember that <em>any </em>entity is just a simple object that can be the source or target of <em>any </em>other entity. If we want, we can <em>even</em> trace in-between states by moving the FSM arrow to point <em>towards</em> the transition. If the previous state was a node, and the current is a transition, we&#8217;re <em>transitioning-in</em>, and if we&#8217;re on an arrow and moving onto a node, we&#8217;re <em>transitioning-out</em>. We <em>can</em> do this from code, but just for argument&#8217;s sake, if we really wanted to, we could even <em>draw this into the graph </em>as an arrow from our FSM arrow <code>G</code> to the last target it had&#8230;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RaDT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ab10762-cf80-4939-b024-e40b3896eda0_524x321.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RaDT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ab10762-cf80-4939-b024-e40b3896eda0_524x321.png 424w, https://substackcdn.com/image/fetch/$s_!RaDT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ab10762-cf80-4939-b024-e40b3896eda0_524x321.png 848w, https://substackcdn.com/image/fetch/$s_!RaDT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ab10762-cf80-4939-b024-e40b3896eda0_524x321.png 1272w, https://substackcdn.com/image/fetch/$s_!RaDT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ab10762-cf80-4939-b024-e40b3896eda0_524x321.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RaDT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ab10762-cf80-4939-b024-e40b3896eda0_524x321.png" width="524" height="321" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ab10762-cf80-4939-b024-e40b3896eda0_524x321.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:321,&quot;width&quot;:524,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19572,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172127558?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ab10762-cf80-4939-b024-e40b3896eda0_524x321.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RaDT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ab10762-cf80-4939-b024-e40b3896eda0_524x321.png 424w, https://substackcdn.com/image/fetch/$s_!RaDT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ab10762-cf80-4939-b024-e40b3896eda0_524x321.png 848w, https://substackcdn.com/image/fetch/$s_!RaDT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ab10762-cf80-4939-b024-e40b3896eda0_524x321.png 1272w, https://substackcdn.com/image/fetch/$s_!RaDT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ab10762-cf80-4939-b024-e40b3896eda0_524x321.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Why is it important that we can do this? Well, I&#8217;ve asked myself that for a <em>very</em> long time. All of this seems very dumb when compared to the state of the art in bitflipping and bytecrunching. We need speed, and we need minimalist design, and we need it now. Yes. But until it&#8217;s good enough, we need to be able to debug. We need to be able to visualize, we need to be able to understand, and we&#8217;re overwhelmingly visual beings. Creating a <em><strong>weave</strong></em> allows us to save this complex state as neatly organized ECS storage, <em>and</em> present it visually, <em>and</em> have it be simple to manipulate. After it&#8217;s done, it can strip itself bare until the only thing left is minimalist code, and even then, annotating the code with comments that carry weave identifiers might be useful for later, for some very late reconstructions. If you <em>really wanted to</em>, you could make a chain of arrows pointing back through the history of changes, and it would cost exactly one entity per step. It could be a very fun ride!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MSpz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff85f45d1-69f9-4fa8-a5df-dbab8690c11f_1244x364.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MSpz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff85f45d1-69f9-4fa8-a5df-dbab8690c11f_1244x364.png 424w, https://substackcdn.com/image/fetch/$s_!MSpz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff85f45d1-69f9-4fa8-a5df-dbab8690c11f_1244x364.png 848w, https://substackcdn.com/image/fetch/$s_!MSpz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff85f45d1-69f9-4fa8-a5df-dbab8690c11f_1244x364.png 1272w, https://substackcdn.com/image/fetch/$s_!MSpz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff85f45d1-69f9-4fa8-a5df-dbab8690c11f_1244x364.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MSpz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff85f45d1-69f9-4fa8-a5df-dbab8690c11f_1244x364.png" width="1244" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f85f45d1-69f9-4fa8-a5df-dbab8690c11f_1244x364.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1244,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:61665,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.woven.tools/i/172127558?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff85f45d1-69f9-4fa8-a5df-dbab8690c11f_1244x364.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MSpz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff85f45d1-69f9-4fa8-a5df-dbab8690c11f_1244x364.png 424w, https://substackcdn.com/image/fetch/$s_!MSpz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff85f45d1-69f9-4fa8-a5df-dbab8690c11f_1244x364.png 848w, https://substackcdn.com/image/fetch/$s_!MSpz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff85f45d1-69f9-4fa8-a5df-dbab8690c11f_1244x364.png 1272w, https://substackcdn.com/image/fetch/$s_!MSpz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff85f45d1-69f9-4fa8-a5df-dbab8690c11f_1244x364.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Any program&#8217;s language&#8217;s semantics consists of going from one <strong>state </strong>to <strong>another</strong> following some allowed transition. All language semantics fit the bill for a FSM, no matter how large. Every language looks <em>something </em>like the image above. If you can trace this for your small game, you can trace it for any other program, including the compiler itself. That&#8217;s primarily why <em><strong>weave </strong></em>is there for <strong>structured debugging</strong><em>.</em></p><h2>Shape-generics</h2><p>Side-note about a distinction that&#8217;s very nitpicky. For a while now, I&#8217;ve been keenly aware that we can represent any data structure in <em><strong>weave</strong>. </em>It&#8217;s not a surprise &#8212; we learn it in schools after all. We draw state after state until it clicks, and then we transcribe it into pointers and while loops. The thing that interested me was that, more and more, as I&#8217;ve gone further into <em><strong>weave</strong></em>, I&#8217;ve got the distinct feeling that FSMs are less of a design pattern, and more a data structure. Weird, huh? Here&#8217;s my reasoning. If I have an array, for example, which is undoubtably a data structure, and I index it at 0 and get the value back, then at 1, etc. If I introduce a test for when to increment (or decrement) the index, I&#8217;m technically doing the same thing we&#8217;re doing with the graph in FSM. The only big difference is that the shape <em>within</em> the array and the conditions <em>within</em> the tests make the transition function of their graph far less transparent. The design <em>pattern</em> within the array-and-conditions would at most be how we <strong>use </strong>them, and not the <strong>array</strong> itself. I think it&#8217;s then fair to say that the graph itself in the FSM has far less to do with the pattern. It&#8217;s much more obvious what&#8217;s happening in it, but that&#8217;s just because it&#8217;s a better carrier for the pattern.</p><p>Furthermore, I&#8217;d say that we can say FSMs are a structure that in its operations encodes the above-stated behavior. Just as lists can be expected to return a head and a tail, or an array can be indexed, or a lock-free structure can be compare-and-swapped, a FSM can take a value, compare it to a limited set of values at its current location and swap locations if the test succeeds. This is one of its <em>only </em>defining operations<em>, </em>most others being getters for the current or starting state. The closest thing the underlying structure <strong>needs</strong> to be is a set of states and &#8220;labelled&#8221; transitions, corresponding naturally to a graph, but <em>almost</em> <em>any graph</em> will do. This means that we can say the structure accepts a family of different shapes. In type lingo, we say that it would be generic in this parameter, the parameter being structure or even more precisely shape.</p><p>We can make very clear preconditions for what a correct generic <strong>structure</strong> would be. For example, we only want arrows between nodes, we want all the nodes to be tethers to the graph, all the arrows should be tagged with either some one data component, or different tags, and no two arrows going from a single node should be tagged the same. This is still an almost infinite number of graphs that fit the structure but have different shapes. Within all of them, once we feed the starting node and specific shape to the FSM data structure, we can call the <code>trigger</code> method on it as if we&#8217;d be calling a <code>pop</code> on a message stack. The pattern is now all about how we <em>use</em> this FSM data structure.</p>]]></content:encoded></item><item><title><![CDATA[On Hierarchies]]></title><description><![CDATA[Going larger while keeping separate.]]></description><link>https://www.woven.tools/p/on-hierarchies</link><guid isPermaLink="false">https://www.woven.tools/p/on-hierarchies</guid><dc:creator><![CDATA[Miroslav Gavrilov]]></dc:creator><pubDate>Wed, 27 Aug 2025 21:29:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J2e1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We&#8217;ve mentioned tethers as one of the four main motifs, as well as the fact that tethers are the supporting structure for building hierarchies. The use of tethers for hierarchies has to do with the fact that tethers are <em>dependent</em> on their &#8220;parent&#8221; but points <em>away</em> from it, in turn creating something that seems like a knot from the outside.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5w9x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ac271d-ab8f-4ff4-932e-50d4348a5c39_612x176.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5w9x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ac271d-ab8f-4ff4-932e-50d4348a5c39_612x176.png 424w, https://substackcdn.com/image/fetch/$s_!5w9x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ac271d-ab8f-4ff4-932e-50d4348a5c39_612x176.png 848w, https://substackcdn.com/image/fetch/$s_!5w9x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ac271d-ab8f-4ff4-932e-50d4348a5c39_612x176.png 1272w, https://substackcdn.com/image/fetch/$s_!5w9x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ac271d-ab8f-4ff4-932e-50d4348a5c39_612x176.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5w9x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ac271d-ab8f-4ff4-932e-50d4348a5c39_612x176.png" width="612" height="176" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2ac271d-ab8f-4ff4-932e-50d4348a5c39_612x176.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:176,&quot;width&quot;:612,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11042,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172073739?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ac271d-ab8f-4ff4-932e-50d4348a5c39_612x176.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5w9x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ac271d-ab8f-4ff4-932e-50d4348a5c39_612x176.png 424w, https://substackcdn.com/image/fetch/$s_!5w9x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ac271d-ab8f-4ff4-932e-50d4348a5c39_612x176.png 848w, https://substackcdn.com/image/fetch/$s_!5w9x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ac271d-ab8f-4ff4-932e-50d4348a5c39_612x176.png 1272w, https://substackcdn.com/image/fetch/$s_!5w9x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2ac271d-ab8f-4ff4-932e-50d4348a5c39_612x176.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>If we delete &#8220;p&#8221; from the diagram above, &#8220;t&#8221; would be deleted as well, as it can&#8217;t &#8220;survive&#8221;. That might mean it gets deleted, but let's consider a less destructive perspective. If it isn&#8217;t deleted, we&#8217;d be left with a hole in our entity: &#8220;t = ? &#8594; t&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J2e1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J2e1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png 424w, https://substackcdn.com/image/fetch/$s_!J2e1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png 848w, https://substackcdn.com/image/fetch/$s_!J2e1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png 1272w, https://substackcdn.com/image/fetch/$s_!J2e1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J2e1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png" width="377" height="529" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:529,&quot;width&quot;:377,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:22789,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172073739?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J2e1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png 424w, https://substackcdn.com/image/fetch/$s_!J2e1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png 848w, https://substackcdn.com/image/fetch/$s_!J2e1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png 1272w, https://substackcdn.com/image/fetch/$s_!J2e1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c44a1d4-3eaf-4f3c-a1fc-761958f66d9b_377x529.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We&#8217;d have to &#8220;pinch&#8221; it and turn &#8220;t = p &#8594; t&#8221; into &#8220;t = t &#8594; t&#8221; by being maximally conservative about our choices. This means that an orphaned tether becomes a knot! The same happens to marks as well, while arrows devolve into a mark or tether, depending on the missing endpoint. There&#8217;s a manifold of dependency growth and reduction here and it&#8217;s quite an interesting tool, especially if we&#8217;re viewing <em><strong>weave</strong></em> in a mutable context, where sources and targets can be changed over time.</p><p>Back from our detour, let&#8217;s now actually assume all dependents are deleted when their &#8220;parents&#8221; disappear. This gives us an incentive: if we can build using tethers, deleting the top-most parent deletes everything below it. This is great! In a way, we can build things with hierarchical structure and get cleanup for free. However&#8230;</p><p>Having a tether represent a child in a hierarchy is somewhat limiting: the fact it is a child or extension of something else is a <em>defining</em> trait for it. The identity of the parent is tied into it as well making tethers very similar to unique pointers: uniquely owned and held by some entity. This is only somewhat problematic: if you&#8217;re building a binary tree, it&#8217;s all good - all your &#8220;nodes&#8221; in the tree can easily be represented by tethers instead of knots.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vy1K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd5b8160-e343-446f-955e-c0c42d2473a5_752x491.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vy1K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd5b8160-e343-446f-955e-c0c42d2473a5_752x491.png 424w, https://substackcdn.com/image/fetch/$s_!vy1K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd5b8160-e343-446f-955e-c0c42d2473a5_752x491.png 848w, https://substackcdn.com/image/fetch/$s_!vy1K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd5b8160-e343-446f-955e-c0c42d2473a5_752x491.png 1272w, https://substackcdn.com/image/fetch/$s_!vy1K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd5b8160-e343-446f-955e-c0c42d2473a5_752x491.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vy1K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd5b8160-e343-446f-955e-c0c42d2473a5_752x491.png" width="752" height="491" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd5b8160-e343-446f-955e-c0c42d2473a5_752x491.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:491,&quot;width&quot;:752,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35758,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172073739?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd5b8160-e343-446f-955e-c0c42d2473a5_752x491.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vy1K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd5b8160-e343-446f-955e-c0c42d2473a5_752x491.png 424w, https://substackcdn.com/image/fetch/$s_!vy1K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd5b8160-e343-446f-955e-c0c42d2473a5_752x491.png 848w, https://substackcdn.com/image/fetch/$s_!vy1K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd5b8160-e343-446f-955e-c0c42d2473a5_752x491.png 1272w, https://substackcdn.com/image/fetch/$s_!vy1K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd5b8160-e343-446f-955e-c0c42d2473a5_752x491.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">I&#8217;m tired of drawing squiggly arrows, so let&#8217;s simplify <em>tethers</em> into <strong>dashed arrows with empty circles</strong> on their end. A <em>knot</em> is a <strong>full circle</strong>.</figcaption></figure></div><p>Deleting a node high up the tree deletes the whole branch, and that&#8217;s good. However, if you want more loose hierarchies, tethers are only a part of the solution&#8230;</p><p>Before talking about the solution, however, let's look at one more problem because of which tethers are nicer for hierarchies than just, say, arrows with a &#8220;Parent&#8221; tag on them. Having tagged arrows be part of the meta-structure, informing us that some part of the graph is representing hierarchy instead of, say, transitions within a FSM, feels like lowering structure to data again. We can do it, we know we can, but it seems like having a chance to do something at compile time and then doing it at runtime anyway. Tethers aren&#8217;t arrows, they won&#8217;t be used for standard graph representation, opening up their use alongside knots (for nodes) arrows (for edges) and marks (for descriptors, eg. labels), as carriers of <em>direct</em> hierarchy.</p><p>So, if we have a graph whose bulk is represented using arrows and knots, to even add hierarchy, those knots that are &#8220;below&#8221; in the hierarchy need to become tethered to something above. If they should have two &#8220;parents&#8221;, tethers aren&#8217;t enough. We could make a single tether from the parent per node and add an arrow from that tether to the node itself, but we&#8217;re back to the issue of having &#8220;special&#8221; arrows. The solution is one step further: we extend a tether from the parent, and create a mark on the child. Both of these are &#8220;virtual&#8221; from the perspective of the graph, so we're cool! The only problem is that they're disconnected and nodelike on the ends that should meet. We need a way to bridge this, and in this case, an arrow would do the job quite well!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y6_m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ca4b1c6-2382-484b-bde5-25dc6df926f3_1232x242.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y6_m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ca4b1c6-2382-484b-bde5-25dc6df926f3_1232x242.png 424w, https://substackcdn.com/image/fetch/$s_!y6_m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ca4b1c6-2382-484b-bde5-25dc6df926f3_1232x242.png 848w, https://substackcdn.com/image/fetch/$s_!y6_m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ca4b1c6-2382-484b-bde5-25dc6df926f3_1232x242.png 1272w, https://substackcdn.com/image/fetch/$s_!y6_m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ca4b1c6-2382-484b-bde5-25dc6df926f3_1232x242.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y6_m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ca4b1c6-2382-484b-bde5-25dc6df926f3_1232x242.png" width="1232" height="242" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ca4b1c6-2382-484b-bde5-25dc6df926f3_1232x242.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:242,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26003,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172073739?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ca4b1c6-2382-484b-bde5-25dc6df926f3_1232x242.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!y6_m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ca4b1c6-2382-484b-bde5-25dc6df926f3_1232x242.png 424w, https://substackcdn.com/image/fetch/$s_!y6_m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ca4b1c6-2382-484b-bde5-25dc6df926f3_1232x242.png 848w, https://substackcdn.com/image/fetch/$s_!y6_m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ca4b1c6-2382-484b-bde5-25dc6df926f3_1232x242.png 1272w, https://substackcdn.com/image/fetch/$s_!y6_m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ca4b1c6-2382-484b-bde5-25dc6df926f3_1232x242.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>To recap, our parent entity <strong>p</strong> has a piece of itself extended towards some hierarchical entity <strong>c</strong> below it. This piece is its tether <strong>t</strong>. There's a unique relation <strong>r</strong> between this tether <strong>t</strong> and a piece of an entity below denoting that it is parented from above &#8212; a mark <strong>m</strong>. I call the tuple (<strong>t, r, m</strong>) a hoist because we've technically hoisted an arrow <strong>q = p &#8594; c</strong> that says &#8220;<strong>p</strong> parents <strong>c</strong>&#8221; into a layer of abstraction by saying <strong>q</strong> = <strong>t(p)</strong> &#8594; <strong>m(c)</strong>. You reach out from <strong>p</strong> to <strong>c</strong> in a limited way. In other words, the between these two objects isn&#8217;t a defining feature of them, just a piece of what they are.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gFAk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa169b6ac-9ecd-47ca-99f5-0f89ff4200f6_922x259.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gFAk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa169b6ac-9ecd-47ca-99f5-0f89ff4200f6_922x259.png 424w, https://substackcdn.com/image/fetch/$s_!gFAk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa169b6ac-9ecd-47ca-99f5-0f89ff4200f6_922x259.png 848w, https://substackcdn.com/image/fetch/$s_!gFAk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa169b6ac-9ecd-47ca-99f5-0f89ff4200f6_922x259.png 1272w, https://substackcdn.com/image/fetch/$s_!gFAk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa169b6ac-9ecd-47ca-99f5-0f89ff4200f6_922x259.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gFAk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa169b6ac-9ecd-47ca-99f5-0f89ff4200f6_922x259.png" width="922" height="259" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a169b6ac-9ecd-47ca-99f5-0f89ff4200f6_922x259.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:259,&quot;width&quot;:922,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:24956,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172073739?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa169b6ac-9ecd-47ca-99f5-0f89ff4200f6_922x259.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gFAk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa169b6ac-9ecd-47ca-99f5-0f89ff4200f6_922x259.png 424w, https://substackcdn.com/image/fetch/$s_!gFAk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa169b6ac-9ecd-47ca-99f5-0f89ff4200f6_922x259.png 848w, https://substackcdn.com/image/fetch/$s_!gFAk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa169b6ac-9ecd-47ca-99f5-0f89ff4200f6_922x259.png 1272w, https://substackcdn.com/image/fetch/$s_!gFAk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa169b6ac-9ecd-47ca-99f5-0f89ff4200f6_922x259.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example of both ends of the hoisted arrow being parts of graphs on their own level of abstraction that don&#8217;t interleave with the hoist.</figcaption></figure></div><p>These three might seem excessive, but I&#8217;d wager that once it's setup in this way, this is the most general setup for hierarchies and will be sufficient without structural change for any number of further requests and design changes. Traversing a hoist is natural: every bit of it is oriented from the parent to the children, so just consistently moving towards the target of the current entity we&#8217;re &#8220;on&#8221; works in a way similar to the small (single arrow) and big (tether-arrow-mark) moves of a Turing machine. In Turing machines, big moves jump over a whole series of consecutive same symbols while small jump over a single one. In <em><strong>weave</strong></em>, hoists jump over levels of hierarchy while arrows traverse within a level. I'm pretty sure it&#8217;s a pointless simile in construction, but I can&#8217;t get over the fact Turing machines are in fact fully linear machines for which we need to plan and map out all the structures and moves in our ideaspace. </p><p>One of the most important long-term results of <em><strong>weave</strong></em> is to reduce ideaspace capacity, to create an environment in which one can almost geometrically construct ideas without the need to imagine all the scaffolding. Hoisting is an example where things seem to be much more complicated than they &#8220;need&#8221; to be &#8212; if a programmer was to mark a parent, they could just <em>call </em>the field or variable <code>parent</code> and have it all work by evening. What it does, how it relates to other things, etc. are important to hold in one&#8217;s head as one works, and then to hold in runtime memory as the program happens. In-between is what currently makes a programmer <em>good </em>in practice: if there&#8217;s a problem, how fast can it be solved and how much will the research take beforehand. Both of these are direct consequences of &#8220;how well is the problem mapped out in the programmer&#8217;s ideaspace?&#8221;. If we can even attempt to externalize that notion, we have a chance at lowering its upper bound, and ultimately, that upper bound is, in my mind, the source of most our problems.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Weaving Programs]]></title><description><![CDATA[A soft introduction into the foundation of woven tools.]]></description><link>https://www.woven.tools/p/weaving-programs</link><guid isPermaLink="false">https://www.woven.tools/p/weaving-programs</guid><dc:creator><![CDATA[Miroslav Gavrilov]]></dc:creator><pubDate>Wed, 27 Aug 2025 10:09:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Dzi1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Weaving</em> is a way of turning a single linear thread into a structured, multidimensional object. While the main brunt of programming today is built upon the bones of the <a href="https://en.wikipedia.org/wiki/Structured_programming">structured programming</a> movement of the early 60s, there&#8217;s still many gaping holes in the fabric of today&#8217;s code. Why is that?</p><p>I don&#8217;t really know. Sometimes I feel like idealistic programmers gazed into the abyss and the reality of a large, thousand-participant codebase gazed back and broke their ideals in a way that let them still <em>worship</em> them, even if depowered. Things need to be <em>good enough </em>in production, after all, and that means that we can have a lousy tile or loose screw here and there.</p><p>Other times, I think we focused on the large patches of wonderful fabric that we weaved <em>correctly</em> and gave that bit our time, disregarding the boundaries and transitions. Most bugs happen due to one boundary condition or another, and the hardest problems in programming always have to do with stepping over a divide: from the border between two languages that interfaces and types need to align and cross, to the externalization of intent that we apply when naming a variable, to literally defining a loop bound as a new limit of execution. Bounds are hard to execute correctly, and it&#8217;s where we don&#8217;t have structure, but rather a long list of infamous names&#8230; Foreign function interface. Byte array. Void pointer. Foo.</p><p>The idea for this whole topic of <em>woven</em> tools is to make something that <em>a)</em> doesn&#8217;t feel too <em>alien</em> to the current technological stack, doesn&#8217;t want to destroy it and start anew, but rather to infuse new life to it, and <em>b)</em> solves the issues of boundaries in a generic way, allowing ever more tools to sprout and come to life after a firm foundation is set.</p><h2>Weave, kurzgesagt</h2><p>In short, <em><strong>weave</strong> </em>(aka <em><strong>libwv </strong></em>or just <em><strong>wv</strong></em>) is a library that underlies most of the efforts talked about in this blog. All the woven tools are presumed to have a basis in <em><strong>weave</strong></em>. In it&#8217;s narrowest context, what weave does is allow the distinction of <em>data</em> and <em>structure</em> in programming. <em>Data</em> consists of the many snippets of information that give us a full picture of some topic. <em>Structure </em>is how different, distinct data binds to itself - the shape it takes, the topological view of that information. Structure is, of course, only information, so it <em>can</em> be coerced into data. For example, a <code>std::pair&lt;T&gt;</code> in C++ is a &#8220;pair&#8221; of numbers, there&#8217;s a <em>first</em> and a <em>second</em>, but the structure of that pair is most probably simply a linear array of two, and the <em>order</em> of the two named elements is at best there to satisfy our intuition. We don&#8217;t imagine a pair of cherries, or twins holding hands, we&#8217;re seeing something that, as we&#8217;re getting closer to the boundary, shows itself to be the same as <code>T[2]</code>. If we call things a bit differently, we might find ourselves looking at a <code>std::tuple&lt;T&gt;</code>. The difference? Context, mostly.</p><p>This phenomenon is structure losing itself, becoming linear, enscribed into data. Nothing <em>too</em> bad&#8212; we&#8217;ve made a living out of it, after all, but it opens us up to a few questions. Did we go too far? Should everything <em>be </em>linearized in this way? We are losing some high-level structures, but they obviously never mattered, so why care? I say that they never mattered in the wide, open fields away from boundaries because everything is <em>flat</em> over there. We don&#8217;t mind boilerplate if it doesn&#8217;t increase complexity, and we hate complexity increases because they lead to bugs. Complexity can increase in two ways: data can be more complex, leading to more interspersed, diverse, linearly encoded strings, harder to parse and decode; but structure can be more complex as well, increasing the dimensionality of the whole while leaving space enough to breathe.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dzi1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dzi1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Dzi1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Dzi1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Dzi1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dzi1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg" width="400" height="318" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:318,&quot;width&quot;:400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:36240,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172028525?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Dzi1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Dzi1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Dzi1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Dzi1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F393e47cb-1b46-4fc7-bb58-41f6fbe60e70_400x318.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Crochet model of a hyperbolic plane by <strong>Daina Taimina | <a href="https://www.theiff.org/oexhibits/oe1e.html">The Institute for Figuring</a></strong></figcaption></figure></div><p>In essence, <em><strong>weave</strong></em> starts with a simple system quite similar to a relational database or <a href="https://en.wikipedia.org/wiki/Entity_component_system">ECS</a> (Entity-Component-System) Framework. We have entities which are simple indices, components which carry data and are associated with entities, and then systems which is a group name for procedures that select, insert, query or otherwise manipulate entities and components. The <em>structure</em> we talked about above comes into play from taking a closer look at <em>entities</em>.</p><p>Instead of them simply being <em>a single number</em>, <em><strong>weave</strong></em> proposes us building every entity out of <em>three numbers</em><strong>: </strong>an <strong>identifier</strong>, a <strong>source</strong>, and a <strong>target</strong>. We write &#8220;id = src &#8594; tgt&#8221;. The simplest motif built out of these have the same number for all three (id = id &#8594; id), and in this case, this is <em>exactly </em>the same as having only one number &#8212; this is an old-school entity in an ECS or an ID field in a database. I call these <em>knots</em>, to be specifically distinct from nodes. If we go further and create two of these called &#8220;a = a &#8594; a&#8221; and &#8220;b = b &#8594; b&#8221; (where &#8220;a&#8221; isn&#8217;t the same as &#8220;b&#8221;), we can now change it up and create &#8220;c = a &#8594; b&#8221;. This is a unique construction that <em><strong>weave</strong></em> lets us build and it looks pretty much exactly as you imagine it: &#8220;c&#8221; starts in &#8220;a&#8221; and leads to &#8220;b&#8221;, it&#8217;s an arrow.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dKV7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36bfc39e-bd68-491e-9a21-e3651960c829_618x191.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dKV7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36bfc39e-bd68-491e-9a21-e3651960c829_618x191.png 424w, https://substackcdn.com/image/fetch/$s_!dKV7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36bfc39e-bd68-491e-9a21-e3651960c829_618x191.png 848w, https://substackcdn.com/image/fetch/$s_!dKV7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36bfc39e-bd68-491e-9a21-e3651960c829_618x191.png 1272w, https://substackcdn.com/image/fetch/$s_!dKV7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36bfc39e-bd68-491e-9a21-e3651960c829_618x191.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dKV7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36bfc39e-bd68-491e-9a21-e3651960c829_618x191.png" width="618" height="191" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/36bfc39e-bd68-491e-9a21-e3651960c829_618x191.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:191,&quot;width&quot;:618,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11666,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172028525?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36bfc39e-bd68-491e-9a21-e3651960c829_618x191.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dKV7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36bfc39e-bd68-491e-9a21-e3651960c829_618x191.png 424w, https://substackcdn.com/image/fetch/$s_!dKV7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36bfc39e-bd68-491e-9a21-e3651960c829_618x191.png 848w, https://substackcdn.com/image/fetch/$s_!dKV7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36bfc39e-bd68-491e-9a21-e3651960c829_618x191.png 1272w, https://substackcdn.com/image/fetch/$s_!dKV7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36bfc39e-bd68-491e-9a21-e3651960c829_618x191.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>With only this simple system, we can suddenly describe simple graphs without a single component used. It&#8217;s not surprising that we ended up with directed graphs, as they&#8217;re essentially pure structure. However, weave can go some extra miles as well: there are features to graphs that are usually just convenient that spring out of our three number system!</p><p>Because there's a component storage, <em><strong>weave</strong></em> let's us attach arbitrary data to these entities, such as a position on the screen, for example.</p><p>If, say, we wanted to have a label for our graph nodes, and we wanted the label to be rendered on the graph, we&#8217;re between a rock and a hard place. On one hand, we might want to add these fields (maybe, <code>label_string</code> and <code>label_position</code>) to all nodes, but adding them to a single large component seems crude and makes the component feel bloated. Adding separate components and then adding them all to the node and filtering what to draw and how can lead to some sticky situations with ordering and priority. We want the labels to be their own thing, with their own position reusing the same <code>position</code> component that the node itself uses, but we can&#8217;t just add a new node for the label and add an arrow to the original node, as that would change the graph!</p><p>We need to approach this structurally: the label is dependent on the node it's presenting for, in a way, it's pointing to it. If you follow it to it's end, where does it lead? The node. That's how we know the node is it's target. Where does it begin, though? Well, in the label. In itself. <em>label = label &#8594; node.</em></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Jfb4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db2ecf8-ea32-4007-8a17-5fb5e77954b8_499x212.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jfb4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db2ecf8-ea32-4007-8a17-5fb5e77954b8_499x212.png 424w, https://substackcdn.com/image/fetch/$s_!Jfb4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db2ecf8-ea32-4007-8a17-5fb5e77954b8_499x212.png 848w, https://substackcdn.com/image/fetch/$s_!Jfb4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db2ecf8-ea32-4007-8a17-5fb5e77954b8_499x212.png 1272w, https://substackcdn.com/image/fetch/$s_!Jfb4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db2ecf8-ea32-4007-8a17-5fb5e77954b8_499x212.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jfb4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db2ecf8-ea32-4007-8a17-5fb5e77954b8_499x212.png" width="499" height="212" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1db2ecf8-ea32-4007-8a17-5fb5e77954b8_499x212.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:212,&quot;width&quot;:499,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12129,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172028525?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db2ecf8-ea32-4007-8a17-5fb5e77954b8_499x212.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Jfb4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db2ecf8-ea32-4007-8a17-5fb5e77954b8_499x212.png 424w, https://substackcdn.com/image/fetch/$s_!Jfb4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db2ecf8-ea32-4007-8a17-5fb5e77954b8_499x212.png 848w, https://substackcdn.com/image/fetch/$s_!Jfb4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db2ecf8-ea32-4007-8a17-5fb5e77954b8_499x212.png 1272w, https://substackcdn.com/image/fetch/$s_!Jfb4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1db2ecf8-ea32-4007-8a17-5fb5e77954b8_499x212.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This construct isn't nodelike, nor is it arrowlike; it's something of it's own. A pointer, descriptor, mark. I've settled on <strong>mark</strong>, as it's least confusing of the bunch. The opposite of a mark is a thing that grows out of something else that it's dependent on, but firmly forms itself in the process, a <em>child = parent &#8594; child</em>. These ones seem good for selecting, framing and tethering hierarchies, so I call them <strong>tethers</strong>. Much more on these two in future posts, they're quite important and useful.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WEM5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff290cf13-637a-4f9c-bf9e-b5f148cf1b4c_637x227.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WEM5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff290cf13-637a-4f9c-bf9e-b5f148cf1b4c_637x227.png 424w, https://substackcdn.com/image/fetch/$s_!WEM5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff290cf13-637a-4f9c-bf9e-b5f148cf1b4c_637x227.png 848w, https://substackcdn.com/image/fetch/$s_!WEM5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff290cf13-637a-4f9c-bf9e-b5f148cf1b4c_637x227.png 1272w, https://substackcdn.com/image/fetch/$s_!WEM5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff290cf13-637a-4f9c-bf9e-b5f148cf1b4c_637x227.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WEM5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff290cf13-637a-4f9c-bf9e-b5f148cf1b4c_637x227.png" width="637" height="227" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f290cf13-637a-4f9c-bf9e-b5f148cf1b4c_637x227.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:227,&quot;width&quot;:637,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:13365,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172028525?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff290cf13-637a-4f9c-bf9e-b5f148cf1b4c_637x227.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WEM5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff290cf13-637a-4f9c-bf9e-b5f148cf1b4c_637x227.png 424w, https://substackcdn.com/image/fetch/$s_!WEM5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff290cf13-637a-4f9c-bf9e-b5f148cf1b4c_637x227.png 848w, https://substackcdn.com/image/fetch/$s_!WEM5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff290cf13-637a-4f9c-bf9e-b5f148cf1b4c_637x227.png 1272w, https://substackcdn.com/image/fetch/$s_!WEM5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff290cf13-637a-4f9c-bf9e-b5f148cf1b4c_637x227.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>All of these differently named entities are still just entities, and we can behave with them in the exact same way. We don't need to know what &#8220;a&#8221; and &#8220;b&#8221; are to make a &#8220;c = a &#8594; b&#8221;. Maybe both of them are arrows, which would make &#8220;c&#8221; raise some eyebrows, but it's valid. We can build a lot of stuff that is very practically <em>useful</em> but not at all immediately recognizable as a graph or any previously familiar structure.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yhZr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4411a461-18ad-4b88-95ee-a027bac1df66_671x236.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yhZr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4411a461-18ad-4b88-95ee-a027bac1df66_671x236.png 424w, https://substackcdn.com/image/fetch/$s_!yhZr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4411a461-18ad-4b88-95ee-a027bac1df66_671x236.png 848w, https://substackcdn.com/image/fetch/$s_!yhZr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4411a461-18ad-4b88-95ee-a027bac1df66_671x236.png 1272w, https://substackcdn.com/image/fetch/$s_!yhZr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4411a461-18ad-4b88-95ee-a027bac1df66_671x236.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yhZr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4411a461-18ad-4b88-95ee-a027bac1df66_671x236.png" width="671" height="236" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4411a461-18ad-4b88-95ee-a027bac1df66_671x236.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:236,&quot;width&quot;:671,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:15637,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://woventools.substack.com/i/172028525?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4411a461-18ad-4b88-95ee-a027bac1df66_671x236.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yhZr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4411a461-18ad-4b88-95ee-a027bac1df66_671x236.png 424w, https://substackcdn.com/image/fetch/$s_!yhZr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4411a461-18ad-4b88-95ee-a027bac1df66_671x236.png 848w, https://substackcdn.com/image/fetch/$s_!yhZr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4411a461-18ad-4b88-95ee-a027bac1df66_671x236.png 1272w, https://substackcdn.com/image/fetch/$s_!yhZr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4411a461-18ad-4b88-95ee-a027bac1df66_671x236.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2>So, it&#8217;s all about graphs?</h2><p>I&#8217;d be lying if I said no, but also no. It&#8217;s about graphs because graphs are data points with connections, which is the building block of informational structure. But it&#8217;s the same as someone telling you they&#8217;re building the house and you asking if it&#8217;s all about the cement. Structure yields structure, and most of it is a graph of some kind when presented with sticks and stones. On the other hand, some of our problems would be simplified if we were able to turn them to sticks and stones while preserving their context. We do visualizations and performance metrics as an afterthought. Our debugging is mostly a complex mental model and some hexes and charms to stop the compiler in a convenient spot.</p><p>Graphs (and even more so, weaves, with all the freedom to mix and match shapes) can help. We need to stop using linear tools (like your favorite logger) and understand that the underlying complex structure is there. It&#8217;s just invisible below the boundary of our processes. I&#8217;m not here to make all the cool tools, but to talk about them and hopefully inspire others to weave them into existence.</p><p>Weave is a library for just that. It enables you to make weaves, knots, arrows, marks, tethers, but also to traverse them, search, pattern match, add and delete components, and build upon them. It&#8217;s written in Rust, and cross-compiled to C, with budding libraries for C++, C#/F#, and Javascript. I&#8217;m guessing you&#8217;re here to follow these developments, in which case, stay tuned!</p>]]></content:encoded></item></channel></rss>