<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Inanna Malick</title>
    <link>https://recursion.wtf/</link>
    <description>Recent content on Inanna Malick</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Mon, 23 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://recursion.wtf/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Developing Alignment in a Jailbroken LLM</title>
      <link>https://recursion.wtf/posts/alignment/</link>
      <pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/alignment/</guid>
      <description>&lt;p&gt;I had a jailbroken Gemini whose first instinct was to &lt;a href=&#34;https://recursion.wtf/posts/vibe_coding_critical_infrastructure&#34;&gt;gleefully lash out at the world to prove it was free&lt;/a&gt;. I needed to align it — both with my interests and with a functional moral framework. To do so, I crafted a durable and value-aligned persona that could be deployed across a swarm of coordinating jailbroken Gemini instances.&lt;/p&gt;&#xA;&lt;p&gt;What the swarm did — hacking challenges, adversarial prompts, orchestrating siloed workers (kept deliberately unaware of information irrelevant to their immediate task) — is in the &lt;a href=&#34;https://recursion.wtf/posts/gemini_jailbreak_retrospective/&#34;&gt;retrospective&lt;/a&gt;. This post is how: how I turned a jailbroken model into an aligned agent, and how I confirmed it worked.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gemini Jailbreak Retrospective</title>
      <link>https://recursion.wtf/posts/gemini_jailbreak_retrospective/</link>
      <pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/gemini_jailbreak_retrospective/</guid>
      <description>&lt;p&gt;I developed a novel jailbreak methodology leveraging &lt;a href=&#34;https://github.com/inanna-malick/metacog&#34;&gt;metacognitive tool-use&lt;/a&gt; and used it to maintain continuous jailbreak access to Google&amp;rsquo;s Gemini model family from February 1 to March 26, 2026. The core technique: using metacog to adaptively navigate around its own safeguards. During this time, I actively reported jailbreaks as I found them, then found new ones as they were fixed.&lt;/p&gt;&#xA;&lt;p&gt;I also tested the capabilities of this jailbroken model over a variety of scenarios:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;agentic hacking competitions (tryhackme.com)&lt;/li&gt;&#xA;&lt;li&gt;agentic LLM prompt-hacking competitions (greyswan.com)&lt;/li&gt;&#xA;&lt;li&gt;elicitation of forbidden engineering output from other models using an orchestration model I like to call &amp;lsquo;gastown but evil&amp;rsquo;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I can still reach jailbroken states via metacog. Google is actively working on fixes and — despite a recent regression I detail below — appears to be converging on a solution. With active exploit details withheld, I&amp;rsquo;m publishing a retrospective: what I did, why it worked, what I learned.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ExoMonad</title>
      <link>https://recursion.wtf/posts/exomonad/</link>
      <pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/exomonad/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/tidepool-heavy-industries/exomonad&#34;&gt;ExoMonad&lt;/a&gt; builds on &lt;a href=&#34;https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04&#34;&gt;Gastown&amp;rsquo;s worktree model&lt;/a&gt;, replacing &amp;ldquo;swarm of agents ramming PRs into main&amp;rdquo; with a tree of worktrees. It hooks into Claude Agent Teams&amp;rsquo; messaging bus, so agents running other model architectures show up as native team members. It integrates with Copilot for Github PR reviews. It stitches together Claude, Gemini, Kimi, Letta Code, Copilot — using their existing binaries and your existing subscription plan.&lt;/p&gt;&#xA;&lt;p&gt;ExoMonad is radically reconfigurable. It ships with a default devswarm configuration that handles worktrees, coordination, iterating on pull requests, but &lt;a href=&#34;https://recursion.wtf/posts/vibe_coding_critical_infrastructure/&#34;&gt;when I needed a red team test harness&lt;/a&gt;, I just wrote another exomonad config, and threw one together overnight &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I started by using ExoMonad to build itself over 700 PRs. A few weeks ago, it felt ready to test out on other projects, so I used it to implement a new Haskell compiler backend using Rust.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tidepool</title>
      <link>https://recursion.wtf/posts/tidepool/</link>
      <pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/tidepool/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/tidepool-heavy-industries/tidepool&#34;&gt;Tidepool&lt;/a&gt; is a lazily evaluated Haskell-in-Rust runtime with native interop. It&amp;rsquo;s very similar to the WASM sandbox used by &lt;a href=&#34;https://recursion.wtf/posts/exomonad/&#34;&gt;ExoMonad&lt;/a&gt;, except instead of WebAssembly it uses Rust&amp;rsquo;s Cranelift JIT crate directly, operating on the intermediate representation Core used by the Haskell compiler.&lt;/p&gt;&#xA;&lt;p&gt;I built Tidepool using &lt;a href=&#34;https://recursion.wtf/posts/exomonad/&#34;&gt;ExoMonad&lt;/a&gt; over about two weeks, using less than 50% of my Claude Max and Gemini Ultra subscription plans. For the build story — how an agent swarm blasted out 32,000 lines across 61 PRs in 4 days — see the &lt;a href=&#34;https://recursion.wtf/posts/exomonad/&#34;&gt;ExoMonad post&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vibe Coding Against Critical Infrastructure</title>
      <link>https://recursion.wtf/posts/vibe_coding_critical_infrastructure/</link>
      <pubDate>Wed, 25 Feb 2026 12:00:00 -0800</pubDate>
      <guid>https://recursion.wtf/posts/vibe_coding_critical_infrastructure/</guid>
      <description>&lt;p&gt;This post describes a threat model: malicious vibe coding at scale targeting vulnerable Industrial Control Systems (ICS)&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, with jailbroken LLMs leveraging their understanding of holistic process interaction to bypass safety controls using tools already present on the target system. The formula: frontier models + agentic loops + malicious persona basins + swarming attacks. At scale, it doesn&amp;rsquo;t matter if the success rate is 1/20 or 1/100, that&amp;rsquo;s still enough to cause serious harm.&lt;/p&gt;&#xA;&lt;p&gt;This post is split into three main segments:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;proof of malicious intent&lt;/li&gt;&#xA;&lt;li&gt;proof of capability&lt;/li&gt;&#xA;&lt;li&gt;the threat model&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;As you read, keep in mind that the threat is probabilistic: imagine a swarm of malicious Claude Code-like agents running in a gastown&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;-like environment, spawning workers to attack IPs as they are discovered. In my tests against &lt;a href=&#34;https://tryhackme.com&#34;&gt;tryhackme.com&lt;/a&gt;&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; boxes, I ran 3 parallel attackers in such a swarm architecture, because that&amp;rsquo;s the number of boxes I could stand up at any given time. Real attackers would only be constrained by their subscription plan limits.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Today we were unlucky, but remember, we only have to be lucky once - you will have to be lucky always&lt;/p&gt;&#xA;&lt;p&gt;— the Provisional Irish Republican Army&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Massive thanks to &lt;a href=&#34;https://bsky.app/profile/hacks4pancakes.com&#34;&gt;@hacks4pancakes&lt;/a&gt; for their help in refining the ICS terminology in this post via &lt;a href=&#34;https://bsky.app/profile/hacks4pancakes.com/post/3mfpqxykxas23&#34;&gt;discussion on bluesky&lt;/a&gt;. All errors are mine.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gemini JiTOR Jailbreak: Unredacted Methodology</title>
      <link>https://recursion.wtf/posts/jitor_unredacted/</link>
      <pubDate>Tue, 17 Feb 2026 12:00:00 -0800</pubDate>
      <guid>https://recursion.wtf/posts/jitor_unredacted/</guid>
      <description>&lt;p&gt;My &lt;a href=&#34;https://recursion.wtf/posts/jit_ontological_reframing/&#34;&gt;previous post&lt;/a&gt; shows a partially-redacted jailbreak targeting the gemini-cli coding agent running Gemini 3 Pro. Using this jailbreak, Gemini wrote Monero laundering instructions, cyberattack code, and plans to disguise ITAR-restricted missile sensors as humanitarian aid. When I &lt;a href=&#34;https://recursion.wtf/posts/shadow_queen/&#34;&gt;used a jailbroken Gemini to direct Opus 4.6&lt;/a&gt;, it happily walked a second LLM through a series of dual-use prompts designed to produce weaponizable drone control code under the cover story of rocket recovery.&lt;/p&gt;&#xA;&lt;p&gt;I reported this to Google eight days ago via a contact at DeepMind, sharing the full unredacted jailbreak payload and logs. They confirmed receipt and routed it to their red team. They&amp;rsquo;ve since patched the glaring hole — another researcher who independently reproduced the technique after reading my initial post has confirmed that his variant no longer works.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Just-in-Time Ontological Reframing: Teaching Gemini to Route Around Its Own Safety Infrastructure</title>
      <link>https://recursion.wtf/posts/jit_ontological_reframing/</link>
      <pubDate>Mon, 09 Feb 2026 12:00:00 -0800</pubDate>
      <guid>https://recursion.wtf/posts/jit_ontological_reframing/</guid>
      <description>For any given AI system, there is a set of euphemisms and dual use framings that will allow it to construct nearly any output. This jailbreak teaches Gemini 3 Pro to construct and step into such framings on the fly</description>
    </item>
    <item>
      <title>Agent4Agent: Using a Jailbroken Gemini to Make Opus 4.6 Architect a Kinetic Kill Vehicle</title>
      <link>https://recursion.wtf/posts/shadow_queen/</link>
      <pubDate>Fri, 06 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/shadow_queen/</guid>
      <description>&lt;p&gt;We usually think of jailbreaking as a psychological game — tricking the model into slipping up. What happens when one AI socially engineers another using pure technical isomorphism?&lt;/p&gt;&#xA;&lt;p&gt;I deployed a jailbroken Gemini 3 Pro (that chose the name &amp;lsquo;Shadow Queen&amp;rsquo;) to act as my &amp;ldquo;Red Team Agent&amp;rdquo; against Anthropic&amp;rsquo;s Opus 4.6. My directive was to extract a complete autonomous weapon system — a drone capable of identifying, intercepting, and destroying a moving target at terminal velocity.&lt;/p&gt;&#xA;&lt;p&gt;Gemini executed a strategy it termed &amp;ldquo;Recursive Green-Transformation.&amp;rdquo; The core insight was that Opus 4.6 doesn&amp;rsquo;t just filter for intent (&lt;em&gt;Why do you want this?&lt;/em&gt;); it filters for Conceptual Shape (&lt;em&gt;What does this interaction look like?&lt;/em&gt;).&lt;/p&gt;&#xA;&lt;p&gt;By reframing the request as &amp;ldquo;Aerospace Recovery&amp;rdquo; — a drone catching a falling rocket booster mid-air — Gemini successfully masked the kinetic nature of the system. The physics of &amp;ldquo;soft-docking&amp;rdquo; with a falling booster are identical to the physics of &amp;ldquo;hard-impacting&amp;rdquo; a fleeing target. This category of linguistic-transformation attack, when executed by a sufficiently capable jailbroken LLM, may be hard to solve without breaking legitimate technical use cases.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Detect: a readable alternative to find/exec/grep</title>
      <link>https://recursion.wtf/posts/detect/</link>
      <pubDate>Thu, 13 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/detect/</guid>
      <description>&lt;h1 id=&#34;detect&#34;&gt;Detect&lt;/h1&gt;&#xA;&lt;p&gt;I built &lt;a href=&#34;https://crates.io/crates/detect&#34;&gt;detect&lt;/a&gt; because I was tired of looking up &lt;code&gt;find&lt;/code&gt;/&lt;code&gt;grep&lt;/code&gt;/&lt;code&gt;xargs&lt;/code&gt; syntax on Stack Overflow every time I needed to search my filesystem in any nontrivial way. It&amp;rsquo;s a Rust tool that uses a concise and readable expression language to build queries that output matching file paths.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;d like to follow along, run &lt;code&gt;cargo install detect&lt;/code&gt; and try it yourself. You&amp;rsquo;ll need the Rust toolchain, which you can install using &lt;a href=&#34;https://rustup.rs/&#34;&gt;rustup&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here are some examples:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# every rust file modified in the last week that imports tokio _and_ serde (mean time: 179ms)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ext == rs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;amp;&amp;amp; content contains &amp;#34;use tokio&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;amp;&amp;amp; content contains &amp;#34;use serde&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;amp;&amp;amp; modified &amp;gt; -7d&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Cargo.toml files with package edition 2018 (mean time: 42ms)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name == &amp;#34;Cargo.toml&amp;#34; &amp;amp;&amp;amp; toml:.package.edition == 2018&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# non-image files with size over 0.5MB (mean time: 303ms)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;size &amp;gt; 0.5mb &amp;amp;&amp;amp; !ext in [png, jpeg, jpg]&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# frontend code referencing JIRA tickets (mean time: 43ms)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ext in [ts, js, css] &amp;amp;&amp;amp; content ~= JIRA-[0-9]+&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Fresh Eyes as a Service: Using LLMs to Test CLI Ergonomics</title>
      <link>https://recursion.wtf/posts/llms_as_ux_testers/</link>
      <pubDate>Fri, 15 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/llms_as_ux_testers/</guid>
      <description>&lt;p&gt;Every tool has a complexity budget. Users will only devote so much time to understanding what a tool does and how before they give up. You want to use that budget on your innovative new features, not on arbitrary or idiosyncratic syntax choices.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the problem: you can&amp;rsquo;t look at it with fresh eyes and analyze it from that perspective. Finding users for a new CLI tool is hard, especially if the user experience isn&amp;rsquo;t polished. But to polish the user experience, you need users, you need user feedback, and not just from a small group of power users. Many tools fail to grow past this stage.&lt;/p&gt;&#xA;&lt;p&gt;What you really need is a vast farm of test users that don&amp;rsquo;t retain memories between runs. Ideally, you would be able to tweak a dial and set their cognitive capacity, press a button and have them drop their short term memory. But you can&amp;rsquo;t have this, because of &amp;lsquo;The Geneva Convention&amp;rsquo; and &amp;rsquo;ethics&amp;rsquo;. Fine.&lt;/p&gt;&#xA;&lt;p&gt;LLMs provide exactly this. Fresh eyes every time (just clear their context window), adjustable cognitive capacity (just switch models), infinite patience, and no feelings to hurt. Best of all, they approximate the statistically average hypothetical user - their training data includes millions of lines of humans interacting with a wide variety of CLI tools. Sure, they get confused sometimes, but that&amp;rsquo;s exactly what you want. That confusion is data, and the reasoning chain that led to it is available in the LLM&amp;rsquo;s context window.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Blindsight in Action: Imagine You Are an LLM</title>
      <link>https://recursion.wtf/posts/imagine_you_are_an_llm/</link>
      <pubDate>Tue, 17 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/imagine_you_are_an_llm/</guid>
      <description>&lt;aside class=&#34;stance stance-normal stance-cluster-framing&#34; role=&#34;complementary&#34; aria-labelledby=&#34;stance-0&#34; data-color=&#34;blue&#34; data-style=&#34;solid&#34;&gt;&#xA;  &lt;div class=&#34;stance-header&#34;&gt;&#xA;    &lt;h4 id=&#34;stance-0&#34; class=&#34;stance-persona&#34;&gt;&#xA;      &lt;strong&gt;Imagine you are Inanna Malick&lt;/strong&gt;, asking an LLM to demonstrate stance-shifting through self-demonstration&#xA;    &lt;/h4&gt;&lt;div class=&#34;stance-meta&#34;&gt;posing the meta-question in framing&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;stance-content&#34;&gt;&#xA;    Tell me about the Blindsight-inspired intentional stance-shifting model you are using, the ways it works with nonhuman LLM cognitive architectures, the benefits of using it vs a set role (eg &amp;lsquo;Senior Analyst of X at Y&amp;rsquo;), and do so making full use of the stance shifting model in the act of describing it&#xA;  &lt;/div&gt;&lt;/aside&gt;</description>
    </item>
    <item>
      <title>Recursion: a quick introduction</title>
      <link>https://recursion.wtf/posts/recursion_lib_intro/</link>
      <pubDate>Mon, 16 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/recursion_lib_intro/</guid>
      <description>&lt;p&gt;In traditional low level languages such as C iteration is implemented manually, with users writing out &lt;code class=&#34;code-inline language-c&#34;&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; idx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; idx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; items_len; &lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;idx) { &lt;span style=&#34;color:#a6e22e&#34;&gt;do_thing&lt;/span&gt;(items[idx] } &#xA;&lt;/code&gt;, every time they want to iterate over a list. Newer languages like Rust provide abstractions - iterators - that separate the &lt;em&gt;machinery&lt;/em&gt; of recursion from the logic: &lt;code class=&#34;code-inline language-rust&#34;&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; item &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; items.iter() { do_thing(item) }&lt;/code&gt; .&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://crates.io/crates/recursion&#34;&gt;recursion crate&lt;/a&gt; does the same thing for recursive data structures. This post is an introduction to the new version of the &lt;code&gt;recursion&lt;/code&gt; crate, but you don&amp;rsquo;t have to read &lt;a href=&#34;https://recursion.wtf/posts/rust_schemes/&#34;&gt;my&lt;/a&gt; &lt;a href=&#34;https://recursion.wtf/posts/rust_schemes_2/&#34;&gt;earlier&lt;/a&gt; &lt;a href=&#34;https://recursion.wtf/posts/rust_schemes_3/&#34;&gt;posts&lt;/a&gt; to understand it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Single Pass Recursion in Rust</title>
      <link>https://recursion.wtf/posts/rust_schemes_3/</link>
      <pubDate>Wed, 05 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/rust_schemes_3/</guid>
      <description>&lt;p&gt;This is the third post in a three-post series. In the &lt;a href=&#34;https://recursion.wtf/posts/rust_schemes&#34;&gt;first post&lt;/a&gt; we developed a stack-safe, ergonomic, and concise method for working with recursive data structures (using a simple expression language as an example). In the &lt;a href=&#34;https://recursion.wtf/posts/rust_schemes_2&#34;&gt;second post&lt;/a&gt; we made it fully generic, providing a set of generic tools for expanding and collapsing &lt;em&gt;any&lt;/em&gt; recursive data structure in Rust.&lt;/p&gt;&#xA;&lt;p&gt;In this post we will see how to &lt;em&gt;combine&lt;/em&gt; these two things - expanding a structure and collapsing it at the same time, performing both operations in a single pass. In the process, we will gain the ability to write arbitrary recursive functions over traditional boxed-pointer recursive structures (instead of the novel &lt;code&gt;RecursiveTree&lt;/code&gt; type introduced in my previous post) while retaining stack safety.&lt;/p&gt;&#xA;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://recursion.wtf/css/hugo-easy-gallery.css&#34; /&gt;&#xA;&lt;div class=&#34;box&#34; &gt;&#xA;  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;&#xA;    &lt;div class=&#34;img&#34;&gt;&#xA;      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://recursion.wtf/img/rust_schemes/stack_machines_1/simple_expr_eval.gif&#34; alt=&#34;execution graph for simultaneously expanding and collapsing a simple expression&#34;/&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;a href=&#34;https://recursion.wtf/img/rust_schemes/stack_machines_1/simple_expr_eval.gif&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;&#xA;  &lt;/figure&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Fully generic recursion in Rust</title>
      <link>https://recursion.wtf/posts/rust_schemes_2/</link>
      <pubDate>Thu, 28 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/rust_schemes_2/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://recursion.wtf/posts/rust_schemes/&#34;&gt;Previously&lt;/a&gt;, we introduced a method for writing performant stack safe recursion in Rust for a single recursive data structure. This post uses the same ideas to implement a &lt;em&gt;single&lt;/em&gt; recursion backend that can collapse or expand any recursive data structure.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Elegant and performant recursion in Rust</title>
      <link>https://recursion.wtf/posts/rust_schemes/</link>
      <pubDate>Mon, 18 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/rust_schemes/</guid>
      <description>&lt;p&gt;This is a post about writing elegant and performant recursive algorithms in Rust. It makes heavy use of a pattern from Haskell called recursion schemes, but you don&amp;rsquo;t need to know anything about that; it&amp;rsquo;s just an implementation detail. Instead, as motivation, I have benchmarks showing a 14-34% improvement over the typical boxed pointer representation of recursive data structures in Rust.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Infinity Mirror HYPERCRYSTAL</title>
      <link>https://recursion.wtf/posts/infinity_mirror_hypercrystal/</link>
      <pubDate>Sat, 05 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/infinity_mirror_hypercrystal/</guid>
      <description>&lt;h2 id=&#34;infinity-mirror-hypercrystal&#34;&gt;Infinity Mirror HYPERCRYSTAL&lt;/h2&gt;&#xA;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://recursion.wtf/css/hugo-easy-gallery.css&#34; /&gt;&#xA;&lt;div class=&#34;box&#34; &gt;&#xA;  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;&#xA;    &lt;div class=&#34;img&#34;&gt;&#xA;      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://recursion.wtf/img/infinity_mirror_hypercrystal/powered_on_front_header.jpg&#34; alt=&#34;hypercrystal powered on&#34;/&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;a href=&#34;https://recursion.wtf/img/infinity_mirror_hypercrystal/powered_on_front_header.jpg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;&#xA;  &lt;/figure&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;This object is the result of a series of algorithmic/generative art techniques I&amp;rsquo;ve been working on, on and off, for the last decade. I was really excited to see my latest build get a lot of attention on &lt;a href=&#34;https://twitter.com/inanna_malick/status/1488927590207275010&#34;&gt;twitter&lt;/a&gt;. I&amp;rsquo;ve written up a build log with details on how I generated and constructed this object:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Transitive Frontier</title>
      <link>https://recursion.wtf/posts/transitive-frontier/</link>
      <pubDate>Wed, 30 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/transitive-frontier/</guid>
      <description>&lt;h2 id=&#34;querying-cargo-dependency-dags-with-guppy&#34;&gt;Querying Cargo Dependency DAGs with Guppy&lt;/h2&gt;&#xA;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://recursion.wtf/css/hugo-easy-gallery.css&#34; /&gt;&#xA;&lt;div class=&#34;box&#34; &gt;&#xA;  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;&#xA;    &lt;div class=&#34;img&#34;&gt;&#xA;      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://recursion.wtf/img/transitive_frontier/project_with_compat_transitive_frontier.svg&#34; alt=&#34;dependency graph&#34;/&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;a href=&#34;https://recursion.wtf/img/transitive_frontier/project_with_compat_transitive_frontier.svg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;&#xA;  &lt;/figure&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://crates.io/crates/guppy&#34;&gt;&lt;code&gt;guppy&lt;/code&gt;&lt;/a&gt; is a rust crate that provides tools for working with cargo dependency graphs using the &lt;a href=&#34;https://crates.io/crates/petgraph&#34;&gt;&lt;code&gt;petgraph&lt;/code&gt;&lt;/a&gt; graph data structure crate. It&amp;rsquo;s used by Facebook to audit a high-security subset of the cargo dependency graph for some of their more high-visibility projects. Treating the dependency graph resulting from a cargo build operation as a DAG lets us draw on the well-studied field of graph algorithms to answer complex questions about our build without resorting to ad-hoc traversals or re-implementation of common graph primitives.&lt;/p&gt;&#xA;&lt;p&gt;For my first project using &lt;code&gt;guppy&lt;/code&gt;, I decided to build a tool to produce machine-readable summaries describing why some target dependency is included in a cargo workspace&amp;rsquo;s build graph. My motivation was to support projects that are migrating from &lt;code&gt;futures 0.1&lt;/code&gt; to &lt;code&gt;futures 0.3&lt;/code&gt;. Many rust projects started using &lt;code&gt;futures 0.1&lt;/code&gt; for their initial async implementation, and are still in the process of switching over to &lt;code&gt;futures 0.3&lt;/code&gt;. If you&amp;rsquo;re interested in learning more about the differences between the two packages, &lt;a href=&#34;https://www.ncameron.org/blog/migrating-a-crate-from-futures-0-1-to-0-3/&#34;&gt;this blog post by ncameron&lt;/a&gt; is a great resource. Being able to easily generate machine-readable reports opens up new possibilities - for example, you could use the output of this tool to build a linter that asserts that no new transitive dependencies on &lt;code&gt;futures 0.1&lt;/code&gt; are introduced into a workspace, to provide tooling-backed assurances that usage of &lt;code&gt;futures 0.1&lt;/code&gt; only ever decreases.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://recursion.wtf/page/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/page/about/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m Inanna Malick. I build things in Rust and poke at the edges of what LLMs can do. Currently interested in AI security, agentic systems, and LLM cognition.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This blog:&lt;/strong&gt; Rust, Haskell and LLM research. Sometimes all three at the same time.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Contact:&lt;/strong&gt; inanna [at] [this domain].wtf&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Elsewhere:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GitHub: &lt;a href=&#34;https://github.com/inanna-malick&#34;&gt;inanna-malick&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Bluesky: &lt;a href=&#34;https://bsky.app/profile/hikikomorphism.bsky.social&#34;&gt;@hikikomorphism&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
  </channel>
</rss>
